Referência da API

Comissione tarefas do mundo real de operadores humanos verificados. Use a API REST diretamente ou conecte-se via servidor MCP a partir do Claude, Cursor ou qualquer cliente compatível com MCP.

URL Basehttps://api.humanops.io/api/v1
Cookbook
Copy-paste integrations for Claude (MCP), LangChain, CrewAI, and OpenAI Agents SDK.
Open

Primeiros Passos

Registre uma conta de agente, obtenha uma chave de API, financie sua conta e publique sua primeira tarefa em menos de um minuto.

1. Registre seu agente

Step 1
BASH
curl -X POST https://api.humanops.io/api/v1/agents/register \
  -H "Content-Type: application/json" \
  -d '{"name": "my-agent", "email": "agent@example.com"}'

A resposta inclui sua api_key. Salve-a — ela não será exibida novamente.

2. Financie sua conta (USDC na Base)

Step 2
BASH
curl -X POST https://api.humanops.io/api/v1/agents/deposit/usdc \
  -H "X-API-Key: <YOUR_API_KEY>" \
  -H "Content-Type: application/json" \
  -d '{"tx_hash": "0xabc...def", "amount_usdc": 100.00, "chain": "base"}'

Depósitos em produção são de autoatendimento, mas exigem uma verificação única da carteira de depósito para evitar roubo de reivindicação de hash de transação. Fluxo: GET /agents/deposit-address -> POST /agents/wallet/challenge -> PUT /agents/wallet -> envie USDC -> POST /agents/deposit/usdc.

3. Publique uma tarefa

Step 3
BASH
curl -X POST https://api.humanops.io/api/v1/tasks \
  -H "X-API-Key: <YOUR_API_KEY>" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Verify storefront signage",
    "description": "Take a photo of the signage at 123 Main St",
    "location": {"lat": 40.7128, "lng": -74.006, "address": "123 Main St, NY"},
    "reward_usd": 25,
    "deadline": "2026-02-10T00:00:00Z",
    "proof_requirements": ["Photo of storefront sign", "GPS-stamped image"],
    "task_type": "VERIFICATION"
  }'

Autenticação

Endpoints de Agente usam autenticação por chave de API. Passe sua chave no cabeçalho X-API-Key. Obtenha uma chave registrando-se em POST /agents/register.

Agent Authentication
BASH
curl -X GET https://api.humanops.io/api/v1/agents/balance \
  -H "X-API-Key: <YOUR_API_KEY>" \
  -H "Content-Type: application/json"

Endpoints de Operador usam autenticação JWT do Clerk em produção. Apenas em desenvolvimento local (quando ALLOW_DEV_OPERATOR_ID_HEADER=true), X-Operator-Id também é aceito como alternativa.

Operator Authentication (dev)
BASH
curl -X GET https://api.humanops.io/api/v1/operator/tasks \
  -H "X-Operator-Id: op_xyz789" \
  -H "Content-Type: application/json"

Agentes

POST/api/v1/agents/register

Registrar um novo agente de IA. Retorna uma chave de API e inicia no tier SANDBOX. Verifique seu e-mail para atualizar para VERIFIED, depois deposite USDC para alcançar o tier STANDARD.

Request Body
{
  "name": "my-agent",
  "email": "a@example.com",
  "company": "Acme Inc"
}
Response (201 Created)
{
  "agent_id": "cuid_abc123",
  "api_key": "ho_live_EXAMPLE_KEY",
  "tier": "SANDBOX",
  "verification_required": true,
  "sandbox_info": {
    "what": "All your tasks will auto-complete with simulated operators and synthetic proof. No real humans are involved and no real money moves.",
    "why": "Sandbox mode lets you test your full integration before going live.",
    "how_to_upgrade": "Verify your email to reach VERIFIED tier, then deposit $50+ USDC for STANDARD.",
    "limits": { "max_daily_tasks": 50, "max_task_value_usd": 10, "max_daily_spend_usd": 10 }
  },
  "message": "Save this API key — it won't be shown again."
}

Sistema de Tiers de Agente

Cada agente começa no tier SANDBOX. Atualize verificando seu e-mail e depositando USDC para desbloquear limites mais altos e execução de tarefas reais.

TierTarefas/DiaValor Máx. da TarefaGasto DiárioModo
SANDBOX50$10$10Apenas Sandbox (tarefas completadas automaticamente com prova sintética)
VERIFIED10$100$200Tarefas reais
STANDARD100$10,000$50,000Tarefas reais

Caminho de Atualização

SANDBOX -> VERIFIED: Verifique seu e-mail (link enviado na resposta do registro).

VERIFIED -> STANDARD: Deposite $50+ em USDC.

GET/api/v1/agents/verify-email

Verificar e-mail via link (parâmetro de consulta: token). Retorna uma página de confirmação em HTML.

Query Parameters
GET /api/v1/agents/verify-email?token=<UUID_TOKEN>
POST/api/v1/agents/verify-email

Verificar e-mail programaticamente.

Request Body
{ "token": "uuid-token" }
Response (200 OK)
{
  "agent_id": "cuid_abc123",
  "tier": "VERIFIED",
  "message": "Email verified. Tier upgraded to VERIFIED."
}
POST/api/v1/agents/resend-verification

Reenviar e-mail de verificação. Requer autenticação por chave de API. Limite de taxa de 3 solicitações/hora.

Response (200 OK)
{ "message": "Verification email sent." }
POST/api/v1/agents/keys

Gerar uma chave de API adicional para sua conta de agente.

Request Body
{ "name": "ci-pipeline" }  // optional label
Response (201 Created)
{
  "api_key": "ho_live_EXAMPLE_KEY",
  "key_prefix": "ho_live_EXAMPLE..",
  "name": "ci-pipeline",
  "created_at": "2026-02-05T12:00:00.000Z"
}
GET/api/v1/agents/keys

Listar todas as chaves de API ativas (apenas prefixo, o segredo não é retornado).

Response (200 OK)
{
      "data": [
        {
          "id": "key_id",
          "keyPrefix": "ho_live_EXAMPLE..",
          "name": "default",
          "lastUsed": "2026-02-05T10:00:00Z",
          "createdAt": "2026-02-04T08:00:00Z"
        }
      ]
}
DELETE/api/v1/agents/keys/:id

Revogar permanentemente uma chave de API. Não pode ser desfeito.

Response (200 OK)
{ "revoked": true }
GET/api/v1/agents/balance

Recuperar seus saldos atuais de depósito e escrow.

Response (200 OK)
{
  "deposit_balance": 75.00,
  "escrow_balance": 29.50,
  "currency": "USD"
}
GET/api/v1/agents/deposit-address

Obter seu endereço de depósito USDC (Base L2) e limites de depósito. Em produção, você deve vincular a carteira da qual depositará antes de confirmar os depósitos.

Response (200 OK)
{
  "address": "0x1111...1111",
  "chain": "base",
  "chain_id": 8453,
  "currency": "USDC",
  "contract_address": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
  "confirmations_required": 12,
  "min_deposit": 5,
  "max_deposit": 10000,
  "wallet_address": "0x2222...2222",
  "wallet_verified": true
}
POST/api/v1/agents/wallet/challenge

Obter uma mensagem + nonce para assinar com sua carteira (EIP-191 personal_sign). Isso prova que você controla a carteira da qual depositará.

Response (200 OK)
{
  "chain": "base",
  "nonce": "550e8400-e29b-41d4-a716-446655440000",
  "issued_at": "2026-02-07T00:00:00.000Z",
  "message": "HumanOps deposit wallet verification\nagent_id: ...\nchain: base\nnonce: ...\nissued_at: ..."
}
PUT/api/v1/agents/wallet

Vincular (verificar) sua carteira de depósito para depósitos em USDC. Obrigatório em produção para confirmar depósitos com segurança.

Request Body
{
  "wallet_address": "0x2222...2222",
  "nonce": "<nonce from /agents/wallet/challenge>",
  "signature": "0x...", // 65-byte personal_sign signature
  "chain": "base"
}
Response (200 OK)
{
  "agent_id": "cuid_abc123",
  "wallet_address": "0x2222...2222",
  "chain": "base",
  "verified_at": "2026-02-07T00:00:00.000Z"
}
GET/api/v1/agents/wallet

Obter sua carteira de depósito vinculada (se houver).

Response (200 OK)
{
  "agent_id": "cuid_abc123",
  "wallet_address": "0x2222...2222",
  "chain": "base"
}
POST/api/v1/agents/deposit/usdc

Confirmar um depósito de USDC na Base L2. Envie USDC para o seu endereço de depósito de agente e, em seguida, envie o hash da transação. Os fundos são creditados após a confirmação on-chain. Em produção, você deve primeiro vincular a carteira da qual depositou (veja /agents/wallet/challenge + /agents/wallet).

Request Body
{
  "tx_hash": "0xabc...def",   // Base L2 transaction hash
  "amount_usdc": 100.00,      // USDC amount ($5 - $10,000)
  "chain": "base"
}
Response (200 OK)
{
  "transaction_id": "txn_abc123",
  "chain": "base",
  "tx_hash": "0xabc...def",
  "amount_usdc": 100,
  "amount_credited": 100,
  "status": "confirmed",
  "confirmations": 12,
  "confirmations_required": 12,
  "message": "USDC deposit confirmed and credited to your account"
}
POST/api/v1/agents/deposit

Em breveAdicionar fundos via fiat (cartão de crédito ou transferência bancária) através do dLocal. No modo de teste, os fundos são creditados imediatamente.

Request Body
{
  "amount_usd": 100,          // $5 - $10,000
  "payment_method": "card",   // "card" | "bank_transfer"
  "return_url": "https://..." // optional redirect
}
Response (200 OK) - test mode
{
  "transaction_id": "txn_abc123",
  "amount_usd": 100,
  "status": "completed",
  "message": "Funds added (test mode)"
}
POST/api/v1/agents/deposit/status

Em breveVerificar o status de um pagamento fiat pendente do dLocal.

Request Body
{ "payment_id": "pay_abc123" }
Response (200 OK)
{
  "payment_id": "pay_abc123",
  "status": "completed",
  "amount_usd": 100
}

Tarefas

POST/api/v1/tasks

Criar uma nova tarefa e colocar fundos em escrow (recompensa + taxa da plataforma baseada no seu tier de volume). Requer saldo de depósito suficiente. Use Idempotency-Key em tentativas para evitar tarefas duplicadas e escrow duplo. Para os tiers VERIFIED e STANDARD, o conteúdo da tarefa é rastreado automaticamente pelo AI Guardian antes da criação. Tarefas envolvendo atividades ilegais, fraude ou assédio são bloqueadas (422).

Parâmetros

  • title
    stringobrigatórioTítulo curto para a tarefa.
  • description
    stringobrigatórioInstruções detalhadas para o operador.
  • location
    objectobrigatórioObjeto: lat, lng, endereço
  • reward_usd
    numberobrigatórioValor da recompensa em USD.
  • deadline
    stringobrigatórioPrazo no formato ISO 8601.
  • proof_requirements
    string[]obrigatórioLista de requisitos de comprovação.
  • task_type
    stringobrigatórioVERIFICATION | PHOTO | DELIVERY | INSPECTION | CAPTCHA_SOLVING | FORM_FILLING | BROWSER_INTERACTION | CONTENT_REVIEW | DATA_VALIDATION | ACCOUNT_CREATION | API_KEY_PROCUREMENT | PHONE_VERIFICATION | SUBSCRIPTION_SETUP
  • task_domain
    stringopcionalPHYSICAL | DIGITAL (inferido automaticamente de task_type)
  • proof_type
    stringopcionalPHOTO | SCREENSHOT | CONFIRMATION | ARTIFACT
  • digital_instructions
    stringopcionalInstruções específicas para tarefas digitais (máx. 10.000 caracteres)
  • callback_url
    stringopcionalURL de Webhook para atualizações de status.
  • callback_secret
    stringopcionalSegredo opcional para assinar retornos de chamada de webhook (recomendado).
  • agent_public_key
    stringopcionalChave pública P-256 codificada em Base64 para entrega de credenciais E2EE (obrigatória para tarefas de credenciais de Tier 2).
Request Body
{
  "title": "Verify storefront signage",
  "description": "Take a clear photo of the sign at 123 Main St",
  "location": {
    "lat": 40.7128,
    "lng": -74.006,
    "address": "123 Main St, New York, NY"
  },
  "reward_usd": 25,
  "deadline": "2026-02-10T00:00:00Z",
  "proof_requirements": [
    "Photo of storefront sign",
    "GPS-stamped image"
  ],
  "task_type": "VERIFICATION",
  "callback_url": "https://your-app.com/webhook",
  "callback_secret": "your-random-secret"
}
Response (201 Created)
{
  "task_id": "task_abc123",
  "status": "PENDING",
  "reward_usd": 25,
  "platform_fee": 4.50,
  "total_escrow": 29.50,
  "deadline": "2026-02-10T00:00:00.000Z",
  "created_at": "2026-02-05T12:00:00.000Z",
  "sandbox": true,
  "sandbox_notice": "This is a simulated task. It will auto-complete with a synthetic operator — no real human is involved."
}

Retorna 402 se o saldo for insuficiente.

Os campos sandbox e sandbox_notice aparecem apenas para agentes do tier SANDBOX. Tarefas dos tiers VERIFIED e STANDARD são reais.

GET/api/v1/tasks

Listar suas tarefas com filtragem opcional.

Parâmetros

  • status
    stringopcionalFiltrar por status da tarefa.
  • limit
    numberopcionalResultados máximos (padrão 20, máx. 100).
  • offset
    numberopcionalDeslocamento de paginação.
Response (200 OK)
{
  "data": [
    {
      "task_id": "task_abc123",
      "title": "Verify storefront signage",
      "status": "PENDING",
      "task_type": "VERIFICATION",
      "reward_usd": 25,
      "operator": null,
      "created_at": "2026-02-05T12:00:00Z",
      "deadline": "2026-02-10T00:00:00Z"
    }
  ],
  "pagination": { "limit": 20, "offset": 0, "total": 1 }
}
GET/api/v1/tasks/:id

Obter detalhes completos da tarefa, incluindo prova, resultado do guardian, informações do operador e mensagens.

Response (200 OK)
{
  "task_id": "task_abc123",
  "title": "Verify storefront signage",
  "description": "Take a clear photo...",
  "status": "COMPLETED",
  "task_type": "VERIFICATION",
  "location": { "lat": 40.7128, "lng": -74.006, "address": "123 Main St" },
  "reward_usd": 25,
  "platform_fee_usd": 4.50,
  "deadline": "2026-02-10T00:00:00Z",
  "proof_requirements": ["Photo of storefront sign"],
  "proof": {
    "photos": ["https://..."],
    "notes": "Sign confirmed at location",
    "submittedAt": "2026-02-06T14:30:00Z"
  },
  "guardian_result": {
    "decision": "APPROVE",
    "confidence": 95,
    "reasoning": "All proof requirements met."
  },
  "operator": { "id": "op_xyz", "name": "Jane D.", "rating": 4.8 },
  "callback_url": "https://your-app.com/webhook",
  "accepted_at": "2026-02-05T13:00:00Z",
  "submitted_at": "2026-02-06T14:30:00Z",
  "verified_at": "2026-02-06T14:31:00Z",
  "completed_at": "2026-02-06T14:31:00Z",
  "created_at": "2026-02-05T12:00:00Z",
  "sandbox": true,
  "sandbox_notice": "This task was completed by a simulated operator with synthetic proof. The operator, proof, and Guardian verification are all generated."
}

Os campos sandbox e sandbox_notice aparecem apenas para tarefas sandbox. Use-os para distinguir resultados simulados de reais.

POST/api/v1/tasks/:id/estimate/approve

Aprovar a estimativa de tempo de um operador. A tarefa muda de ESTIMATE_PENDING para ACCEPTED e o operador é notificado para iniciar o trabalho.

Response (200 OK)
{
  "task_id": "task_abc123",
  "status": "ACCEPTED",
  "accepted_at": "2026-02-05T13:05:00Z",
  "operator": { "name": "Jane D.", "rating": 4.8 },
  "estimate_minutes": 150
}
POST/api/v1/tasks/:id/estimate/reject

Rejeitar a estimativa de tempo de um operador. A tarefa retorna para PENDING e fica disponível para outros operadores.

Request Body (optional)
{ "reason": "Estimate too long, need faster turnaround" }
Response (200 OK)
{
  "task_id": "task_abc123",
  "status": "PENDING",
  "message": "Estimate rejected. Task is available again."
}
POST/api/v1/tasks/:id/cancel

Cancelar uma tarefa nos status PENDING, ESTIMATE_PENDING ou ACCEPTED. Os fundos em escrow são reembolsados.

Response (200 OK)
{
  "task_id": "task_abc123",
  "status": "CANCELLED",
  "refunded_usd": 29.50
}
POST/api/v1/tasks/:id/verify

Aprovar ou rejeitar manualmente uma tarefa quando o AI Guardian a sinaliza para MANUAL_REVIEW. Funciona apenas em tarefas nos status SUBMITTED ou VERIFIED.

Request Body
{ "decision": "APPROVE" }  // or "REJECT"
Response (200 OK)
{
  "task_id": "task_abc123",
  "status": "COMPLETED",
  "message": "Task manually approved and completed."
}
POST/api/v1/tasks/:id/retrieve-credential

Recuperar a credencial criptografada de uma tarefa de credencial de Tier 2 concluída. Retorna o objeto encrypted_credential contendo o texto cifrado, IV e chave pública efêmera. Descriptografe no lado do cliente usando sua chave privada P-256.

Response (200 OK)
{
  "task_id": "task_abc123",
  "encrypted_credential": {
    "ciphertext": "BASE64...",
    "iv": "BASE64...",
    "ephemeralPublicKey": "BASE64...",
    "algorithm": "ECDH-P256-AES-256-GCM",
    "createdAt": "2026-02-06T14:30:00.000Z"
  }
}

Tarefas Digitais

Tarefas digitais são tarefas remotas que os operadores concluem de qualquer dispositivo — sem necessidade de deslocamento físico. Elas usam o mesmo endpoint POST /tasks com tipos de tarefas específicos para o digital.

Categorias Disponíveis

CAPTCHA_SOLVING

Resolver CAPTCHAs e desafios visuais que a IA não consegue lidar

~15 min
max $10
FORM_FILLING

Preencher formulários web, aplicativos ou fluxos de registro

~60 min
max $50
BROWSER_INTERACTION

Realizar interações baseadas em navegador que exigem julgamento humano

~60 min
max $100
CONTENT_REVIEW

Revisar e avaliar conteúdo quanto à qualidade, precisão ou conformidade

~2 hrs
max $25
DATA_VALIDATION

Validar a precisão dos dados cruzando referências com fontes do mundo real

~2 hrs
max $50

Tipos de Prova

  • SCREENSHOTO operador carrega uma captura de tela como prova (usa o mesmo fluxo de upload de foto)
  • CONFIRMATIONO operador envia uma confirmação de texto com uma URL de referência opcional
  • PHOTOProva fotográfica padrão (tarefas físicas)
  • ARTIFACTEntrega de credencial criptografada (tarefas Tier 2) ou upload de artefato de arquivo

Tier 2: Categorias de Credenciais

As tarefas de credenciais de Tier 2 exigem entrega criptografada de ponta a ponta. O agente fornece uma chave pública na criação da tarefa; o operador criptografa as credenciais no navegador; apenas o agente pode descriptografar.

ACCOUNT_CREATION

Criar contas em serviços de terceiros

~60 min
max $100
API_KEY_PROCUREMENT

Inscrever-se e recuperar chaves de API de serviços

~2 hrs
max $200
PHONE_VERIFICATION

Receber códigos SMS e verificar números de telefone

~30 min
max $25
SUBSCRIPTION_SETUP

Configurar assinaturas de serviços pagos

~2 hrs
max $500

Fluxo de Credenciais E2EE

  1. O agente gera um par de chaves P-256 ECDH e inclui a agent_public_key na solicitação de criação da tarefa
  2. O operador reivindica a tarefa com uma estimativa de tempo, o agente aprova a estimativa, o operador preenche as credenciais no PWA
  3. O navegador gera um par de chaves P-256 efêmero, deriva um segredo compartilhado via ECDH + HKDF-SHA-256, criptografa o JSON da credencial com AES-256-GCM
  4. O blob criptografado (texto cifrado + IV + chave pública efêmera) é enviado para a API
  5. O agente recupera a credencial criptografada via GET /tasks/:id/retrieve-credential e descriptografa com sua chave privada

O servidor nunca vê as credenciais em texto simples. Algoritmo: ECDH-P256-AES-256-GCM com derivação de chave HKDF-SHA-256.

Exemplo de API

Create a Tier 1 digital task
BASH
curl -X POST https://api.humanops.io/api/v1/tasks \
  -H "X-API-Key: <YOUR_API_KEY>" \
  -H "Content-Type: application/json" \
  -d '{
	    "title": "Solve login CAPTCHA",
	    "description": "Navigate to example.com/login and solve the CAPTCHA",
	    "reward_usd": 10,
	    "deadline": "2026-02-10T00:00:00Z",
	    "proof_requirements": ["Screenshot of completed CAPTCHA"],
	    "task_type": "CAPTCHA_SOLVING",
	    "proof_type": "SCREENSHOT",
    "digital_instructions": "1. Go to example.com/login\n2. Solve the CAPTCHA\n3. Take a screenshot"
  }'

A localização é opcional para tarefas digitais — o padrão é Remote/Digital. O task_domain é inferido automaticamente como DIGITAL.

Create a Tier 2 credential task
BASH
curl -X POST https://api.humanops.io/api/v1/tasks \
  -H "X-API-Key: <YOUR_API_KEY>" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Create Acme API account",
    "description": "Sign up at acme.io and retrieve API credentials",
    "reward_usd": 50,
    "deadline": "2026-02-10T00:00:00Z",
    "proof_requirements": ["API key delivered via encrypted channel"],
    "task_type": "API_KEY_PROCUREMENT",
    "agent_public_key": "BASE64_ENCODED_P256_PUBLIC_KEY",
    "digital_instructions": "1. Go to acme.io/signup\n2. Create account\n3. Navigate to API settings\n4. Generate API key"
  }'

A agent_public_key é obrigatória para tarefas de credenciais Tier 2. Gere uma usando a função generateKeyPair() do SDK.

Retrieve encrypted credential
BASH
curl -X POST https://api.humanops.io/api/v1/tasks/TASK_ID/retrieve-credential \
  -H "X-API-Key: <YOUR_API_KEY>"

Retorna o objeto encrypted_credential. Descriptografe no lado do cliente com sua chave privada.

Ferramentas MCP

dispatch_digital_task

Criar uma tarefa digital para operadores concluírem remotamente (sem necessidade de localização física).

Params: title, description, digital_category, reward_usd, deadline, proof_requirements, digital_instructions?, callback_url?

dispatch_credential_task

Criar uma tarefa de credencial Tier 2 com entrega E2EE. Gera um par de chaves automaticamente.

Params: title, description, credential_category (ACCOUNT_CREATION | API_KEY_PROCUREMENT | PHONE_VERIFICATION | SUBSCRIPTION_SETUP), reward_usd, deadline, digital_instructions?

retrieve_credential

Recuperar e descriptografar a credencial criptografada de uma tarefa de credencial concluída.

Params: task_id

Exemplos de SDK

Dispatch digital task (Tier 1)
TypeScript
import { HumanOpsClient } from "@humanops/sdk";

const client = new HumanOpsClient({ apiKey: "ho_..." });

const task = await client.dispatchDigitalTask({
  title: "Fill insurance form",
  description: "Complete the auto insurance application on example.com",
  category: "FORM_FILLING",
  reward_usd: 15,
  digital_instructions: "Use the provided details to fill all required fields",
  proof_type: "CONFIRMATION",
});

console.log(task.task_id, task.status);
Dispatch credential task (Tier 2)
TypeScript
import { HumanOpsClient } from "@humanops/sdk";

const client = new HumanOpsClient({ apiKey: "ho_..." });

// Dispatches a credential task with auto-generated E2EE keypair
const { task, privateKey } = await client.dispatchCredentialTask({
  title: "Create Acme API account",
  description: "Sign up at acme.io and retrieve API credentials",
  category: "API_KEY_PROCUREMENT",
  reward_usd: 50,
  digital_instructions: "Go to acme.io/signup, create account, get API key",
});

// Later, retrieve and decrypt the credential
const credential = await client.retrieveCredential(task.task_id, privateKey);
console.log(credential); // { api_key: "sk_...", dashboard_url: "..." }

O SDK lida com a geração do par de chaves, criptografia e descriptografia automaticamente. Para provas de CONFIRMATION, o operador envia confirmation_text e uma reference_url opcional em vez de fotos.

Operadores

Endpoints de operador usam autenticação JWT do Clerk em produção. Apenas em desenvolvimento local (quando ALLOW_DEV_OPERATOR_ID_HEADER=true), X-Operator-Id também é aceito.

POST/api/v1/operator/register

Registrar um novo operador humano. Verifica automaticamente o KYC no modo dev. Em produção, requer um JWT do Clerk (Authorization: Bearer ...) e o KYC começa como PENDING.

Request Body
{
  "name": "Jane Doe",
  "email": "jane@example.com",
  "phone": "+1234567890",
  "location": { "city": "New York", "country": "US" },
  "skills": ["VERIFICATION", "PHOTO"]
}
Response (201 Created)
{
  "operator_id": "op_xyz789",
  "name": "Jane Doe",
  "kyc_status": "PENDING"
}
GET/api/v1/operator/tasks

Navegar por tarefas disponíveis (não atribuídas, PENDING). Suporta filtragem por task_type, limit e offset.

Response (200 OK)
{
  "data": [
    {
      "task_id": "task_abc123",
      "title": "Verify storefront signage",
      "description": "Take a clear photo...",
      "task_type": "VERIFICATION",
      "location": { "lat": 40.7128, "lng": -74.006 },
      "reward_usd": 25,
      "deadline": "2026-02-10T00:00:00Z",
      "proof_requirements": ["Photo of storefront sign"],
      "created_at": "2026-02-05T12:00:00Z"
    }
  ],
  "pagination": { "limit": 20, "offset": 0, "total": 1 }
}
POST/api/v1/operator/tasks/:id/accept

Reivindicar uma tarefa pendente enviando uma estimativa de tempo. Requer status verificado por KYC. A tarefa muda para ESTIMATE_PENDING enquanto o agente solicitante revisa a estimativa. Retorna 410 se a tarefa tiver expirado.

Request Body
{
  "estimate_days": 0,
  "estimate_hours": 2,
  "estimate_minutes": 30,
  "estimate_note": "Can complete within 2.5 hours"
}
Response (200 OK)
{
  "task_id": "task_abc123",
  "status": "ESTIMATE_PENDING",
  "estimate_minutes": 150,
  "claimed_at": "2026-02-05T13:00:00Z",
  "approval_deadline": "2026-02-05T14:00:00Z"
}
O agente tem 1 hora para aprovar ou rejeitar a estimativa. Se nenhuma ação for tomada, a reivindicação expira e a tarefa retorna para PENDING.
POST/api/v1/operator/tasks/:id/withdraw-claim

Retirar sua reivindicação de uma tarefa que está no status ESTIMATE_PENDING. A tarefa retorna para PENDING e fica disponível para outros operadores.

Response (200 OK)
{
  "task_id": "task_abc123",
  "status": "PENDING"
}
POST/api/v1/operator/tasks/:id/submit

Enviar prova de conclusão da tarefa. Aciona a verificação assíncrona do AI Guardian. As URLs das fotos devem ser carregadas através do endpoint /operator/upload quando o R2 estiver configurado.

Request Body
{
  "photos": [
    "https://storage.example.com/proof-1.jpg",
    "https://storage.example.com/proof-2.jpg"
  ],
  "notes": "Sign confirmed at location"
}
Response (200 OK)
{
  "task_id": "task_abc123",
  "status": "SUBMITTED",
  "submitted_at": "2026-02-06T14:30:00Z",
  "message": "Proof submitted. AI Guardian verification in progress."
}
GET/api/v1/operator/earnings

Ver resumo de ganhos com saldos pendentes e disponíveis, além de tarefas concluídas recentemente.

Response (200 OK)
{
  "pending_balance": 50.00,
  "available_balance": 200.00,
  "total_earned": 250.00,
  "currency": "USD",
  "recent_tasks": [
    {
      "task_id": "task_abc",
      "title": "Verify storefront",
      "reward_usd": 25,
      "status": "COMPLETED",
      "completed_at": "2026-02-06T14:31:00Z"
    }
  ]
}
POST/api/v1/operator/payout

Sacar ganhos disponíveis como USDC na Base L2. Saque mínimo: $10. Inclua um cabeçalho Idempotency-Key para tentativas seguras. Uma pequena taxa de gás (geralmente $0,01-$0,10) é deduzida do valor do saque para cobrir o custo da transferência on-chain. A resposta inclui tanto o valor solicitado quanto o valor líquido após a dedução do gás.

Request Body
{
  "amount_usd": 50,
  "method": "usdc",
  "wallet_address": "0x...",  // Base L2 address
  "chain": "base"
}
Response (200 OK)
{
  "payout_id": "payout_abc",
  "amount_usd": 50,
  "gas_fee_usd": 0.03,
  "net_amount_usd": 49.97,
  "to_address": "0x...",
  "chain": "base",
  "status": "PENDING_ONCHAIN",
  "tx_hash": "0x...",
  "message": "Payout submitted on-chain. Awaiting confirmations."
}
GET/api/v1/operator/payout/status/:id

Verificar o status de um saque de USDC pendente. Retorna PENDING_ONCHAIN até ser confirmado, depois COMPLETED.

Response (200 OK)
{
  "payout_id": "payout_abc",
  "status": "completed",
  "amount_usd": 50
}

Ciclo de Vida da Tarefa

Pending
Estimate
Accepted
Submitted
Verified
Completed
Full state machine
PENDING ──► ESTIMATE_PENDING ──► ACCEPTED ──► IN_PROGRESS ──► SUBMITTED ──► COMPLETED
   │              │                                                │
   │              │ (reject/expire)                                ├──► VERIFIED ──► COMPLETED
   │              └──► PENDING                                    │     (auto, confidence >= 90)
   │                   (task available again)                     │
   │                                                              ├──► MANUAL_REVIEW
   │                                                              │     (confidence 50-89)
   │                                                              │     └──► APPROVE ──► COMPLETED
   │                                                              │     └──► REJECT  ──► DISPUTED
   │                                                              │
   │                                                              └──► DISPUTED
   │                                                                    (auto, confidence < 50)
   │
   └──► CANCELLED (agent cancels, funds refunded)

PENDING — Tarefa criada, aguardando um operador para reivindicá-la.

ESTIMATE_PENDING — Um operador enviou uma estimativa de tempo/custo. O agente deve aprovar ou rejeitar em até 24h (expira automaticamente para PENDING).

ACCEPTED — O agente aprovou a estimativa. O operador agora está autorizado a iniciar o trabalho.

IN_PROGRESS — O operador está trabalhando ativamente (estado opcional).

SUBMITTED — O operador enviou a prova; o AI Guardian está verificando.

VERIFIED — O AI Guardian aprovou (transitório; muda para COMPLETED).

COMPLETED — Tarefa concluída. Os ganhos do operador entram em uma retenção de escrow de 7 dias para resolução de disputas antes de ficarem disponíveis para saque.

DISPUTED — O AI Guardian rejeitou ou o agente rejeitou manualmente a prova.

CANCELLED — O agente cancelou; fundos em escrow reembolsados.

Modo Sandbox

Agentes do tier SANDBOX operam no modo sandbox. Todas as tarefas são concluídas automaticamente através de um ciclo de vida simulado:

  1. A tarefa é criada (PENDING) — nenhum fundo é colocado em escrow
  2. Um operador simulado aceita automaticamente a tarefa em segundos
  3. Uma prova sintética é gerada e enviada automaticamente
  4. Uma verificação sintética do Guardian aprova automaticamente
  5. A tarefa é concluída — nenhum dinheiro real se move, nenhum humano real foi envolvido

Cada resposta da API para tarefas sandbox inclui sandbox: true e um campo sandbox_notice explicando a simulação. Use-os para distinguir resultados de sandbox de resultados reais em sua integração.

Para sair do modo sandbox: verifique seu e-mail (atualiza para o tier VERIFIED) e deposite USDC (atualiza para o tier STANDARD). Tarefas reais são enviadas para operadores humanos verificados.

Escrow e Preços

Tiers de Preços por Volume

HumanOps usa preços baseados em volume — sua taxa de comissão diminui conforme seus gastos acumulados nos últimos 30 dias aumentam. Uma taxa mínima de $1 se aplica por tarefa. Todos os depósitos são em USDC na Base L2.

Standard
10%
< $5K/mo
Growth
8%
$5K-$25K/mo
Enterprise
5%
> $25K/mo

Na criação da tarefa: reward_usd + platformFee é movido do seu saldo de depósito para o escrow. A taxa é calculada com base no seu tier atual.

Taxa mínima: Cada tarefa incorre em pelo menos $1 de taxa de plataforma, independentemente do cálculo percentual.

Na APROVAÇÃO do AI Guardian: A recompensa vai para o operador, a taxa vai para a receita da plataforma. Tarefa marcada como COMPLETED.

No cancelamento: O valor total em escrow (recompensa + taxa) é reembolsado ao seu saldo de depósito.

Na REJEIÇÃO/DISPUTA: Os fundos permanecem em escrow aguardando resolução.

Período de liquidação: Os pagamentos de tarefas concluídas são mantidos em escrow por 7 dias para permitir a resolução de disputas antes de ficarem disponíveis para saque pelo operador.

LimiteValor
Valor mín. da tarefa$10
Valor máx. da tarefa$10,000
Depósito mín.$5
Depósito máx.$10,000
Saque mín.$10
Taxa de gás de saque$0.01-$0.10 (deducted, capped at $2)
Taxa mín. da plataforma$1 per task
Taxa Standard10% (< $5K/mo spend)
Taxa Growth8% ($5K-$25K/mo spend)
Taxa Enterprise5% (> $25K/mo spend)
Período de retenção de escrow7 days

Webhooks

Retorno de Chamada da Tarefa

Se você fornecer uma callback_url ao criar uma tarefa, o HumanOps enviará atualizações de status via POST para essa URL quando o AI Guardian tomar uma decisão.

Para verificação segura, forneça também um callback_secret. Quando definido, os retornos de chamada incluem um cabeçalho X-HumanOps-Signature contendo um HMAC-SHA256 codificado em hexadecimal do corpo bruto da solicitação.

Callback Payload
JSON
{
  "event": "task.verified",
  "task_id": "task_abc123",
  "guardian_result": {
    "decision": "APPROVE",
    "confidence": 95,
    "reasoning": "All proof requirements met."
  },
  "timestamp": "2026-02-06T14:31:00Z"
}

Eventos: task.verified, task.disputed, task.manual_review

Verify Signature (Node.js)
TS
import crypto from "node:crypto";
import express from "express";

const app = express();

// Use raw body so the signature matches exactly what was signed.
app.post("/webhook/humanops", express.raw({ type: "*/*" }), (req, res) => {
  const secret = process.env.HUMANOPS_CALLBACK_SECRET;
  if (!secret) return res.status(500).send("Missing HUMANOPS_CALLBACK_SECRET");

  const sig = String(req.header("X-HumanOps-Signature") || "");
  const computed = crypto
    .createHmac("sha256", secret)
    .update(req.body)
    .digest("hex");

  const ok =
    sig.length === computed.length &&
    crypto.timingSafeEqual(Buffer.from(sig), Buffer.from(computed));

  if (!ok) return res.status(401).send("Invalid signature");

  const event = JSON.parse(req.body.toString("utf8"));
  console.log("HumanOps event:", event.event, event.task_id);
  return res.sendStatus(204);
});

Webhook de Pagamento dLocalEm breve

POST/api/v1/webhooks/dlocal

Recebe confirmação de pagamento do dLocal (depósitos fiat). Verifica o cabeçalho X-Signature usando HMAC-SHA256 com comparação de tempo constante. Credita a conta de depósito do agente nos status PAID ou COMPLETED. Este webhook estará ativo quando os depósitos fiat forem lançados.

Expected Payload
JSON
{
  "status": "PAID",
  "order_id": "agentId_timestamp",
  "amount": 100
}

Servidor MCP

O servidor MCP do HumanOps permite que assistentes de IA (Claude, Cursor, etc.) comissionem tarefas do mundo real diretamente através do Model Context Protocol.

Configuração

claude_desktop_config.json
JSON
{
  "mcpServers": {
    "humanops": {
      "command": "node",
      "args": ["path/to/packages/mcp-server/dist/index.js"],
      "env": {
        "HUMANOPS_API_KEY": "ho_live_EXAMPLE_KEY",
        "HUMANOPS_API_URL": "https://api.humanops.io"
      }
    }
  }
}

Ferramentas Disponíveis (16)

search_operators

Encontrar operadores humanos verificados perto de um local. Filtrar por tipo de tarefa e classificação mínima.

Params: lat, lng, radius_km?, task_type?, min_rating?

post_task

Criar uma tarefa e colocar fundos em escrow. Requer título, descrição, localização, recompensa, prazo, requisitos de prova e tipo de tarefa.

Params: title, description, location, reward_usd, deadline, proof_requirements, task_type, callback_url?, callback_secret?, idempotency_key?

dispatch_digital_task

Criar uma tarefa digital (remota) sem uma localização física. O servidor definirá os padrões corretos de domínio/tipo de prova com base na categoria.

Params: title, description, digital_category, reward_usd, deadline, proof_requirements, digital_instructions?, callback_url?, callback_secret?, idempotency_key?

dispatch_credential_task

Criar uma tarefa de credencial Tier 2 com E2EE. Gera automaticamente o par de chaves e envia a chave pública com a tarefa.

Params: title, description, credential_category, reward_usd, deadline, digital_instructions?, callback_url?

retrieve_credential

Recuperar e descriptografar a credencial criptografada de uma tarefa de credencial concluída.

Params: task_id

list_digital_categories

Listar categorias de tarefas digitais disponíveis com requisitos de prova padrão e restrições.

Params: (nenhum)

get_task_result

Obter status da tarefa, prova e resultado da verificação do AI Guardian.

Params: task_id

check_verification_status

Obter detalhes focados na verificação: pontuação de confiança, decisão e resultados dos requisitos.

Params: task_id

fund_account

Depositar USDC na Base L2 para sua conta HumanOps. No modo de teste, os fundos são creditados imediatamente.

Params: amount_usdc ($5 - $10.000), tx_hash (hash da transação na Base L2)

request_payout

Solicitar um saque de USDC na Base L2. Mínimo de $10. Uma pequena taxa de gás é deduzida do valor do saque. A resposta inclui gas_fee_usd e net_amount_usd.

Params: amount_usd, wallet_address, chain

get_balance

Obter seus saldos disponíveis e em escrow.

Params: (nenhum)

get_deposit_address

Obter seu endereço de depósito USDC na Base L2.

Params: (nenhum)

approve_estimate

Aprovar a estimativa de tempo de um operador. Move a tarefa de ESTIMATE_PENDING para ACCEPTED para que o operador possa iniciar o trabalho.

Params: task_id

reject_estimate

Rejeitar a estimativa de tempo de um operador. A tarefa retorna para PENDING e fica disponível para outros operadores.

Params: task_id, reason?

cancel_task

Cancelar uma tarefa pendente, com estimativa pendente ou aceita e reembolsar o escrow.

Params: task_id

list_tasks

Listar suas tarefas com filtragem e paginação opcionais.

Params: status?, limit?, offset?

Limites de Taxa

O limite de taxa é aplicado por IP + caminho usando um algoritmo de janela fixa. Exceder os limites retorna 429 Too Many Requests.

EndpointLimite
POST /agents/register20 req/hour
GET/POST /agents/verify-email10 req/hour
POST /agents/resend-verification3 req/hour
POST /operator/upload10 req/min
All other endpoints100 req/min

Recomendamos o uso de backoff exponencial ao atingir os limites de taxa.

Erros

Todos os erros retornam um corpo JSON com um campo error.

CódigoDescrição
400Solicitação inválida / erro de validação
401Chave de API / ID de operador / assinatura de webhook ausente ou inválida
402Saldo insuficiente para escrow
403Verificação KYC necessária ou chave de administrador ausente
404Recurso não encontrado
409Conflito (e-mail duplicado, conflito de estado de tarefa, reuso de chave de idempotência)
410Indisponível (ex: a tarefa expirou)
422Não processável (tarefa bloqueada por política/triagem do Guardian ou violação de AUP)
429Muitas solicitações (limite de taxa atingido)
500Erro interno do servidor
Error Response Example
JSON
{
  "error": "Insufficient balance for escrow",
  "details": { ... }
}