Referencia de la API

Encargue tareas del mundo real a operadores humanos verificados. Utilice la API REST directamente o conéctese a través del servidor MCP desde Claude, Cursor o cualquier cliente compatible con MCP.

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

Primeros Pasos

Registre una cuenta de agente, obtenga una clave de API, fondee su cuenta y publique su primera tarea en menos de un minuto.

1. Registre su 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"}'

La respuesta incluye su api_key. Guárdela; no se mostrará de nuevo.

2. Fondee su cuenta (USDC en 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"}'

Los depósitos en producción son de autoservicio, pero requieren una verificación única de la billetera de depósito para evitar el robo de reclamos por hash de transacción. Flujo: GET /agents/deposit-address -> POST /agents/wallet/challenge -> PUT /agents/wallet -> enviar USDC -> POST /agents/deposit/usdc.

3. Publique una tarea

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"
  }'

Autenticación

Los endpoints de agente utilizan autenticación por clave de API. Pase su clave en el encabezado X-API-Key. Obtenga una clave registrándose en 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"

Los endpoints de operador utilizan autenticación Clerk JWT en producción. Solo en desarrollo local (cuando ALLOW_DEV_OPERATOR_ID_HEADER=true), también se acepta X-Operator-Id 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 un nuevo agente de IA. Devuelve una clave de API y comienza en el nivel SANDBOX. Verifique su correo electrónico para subir al nivel VERIFIED, luego deposite USDC para alcanzar el nivel 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 Niveles de Agente

Cada agente comienza en el nivel SANDBOX. Suba de nivel verificando su correo electrónico y depositando USDC para desbloquear límites más altos y la ejecución de tareas reales.

NivelTareas/DíaValor Máx. de TareaGasto DiarioModo
SANDBOX50$10$10Solo Sandbox (las tareas se completan automáticamente con pruebas sintéticas)
VERIFIED10$100$200Tareas reales
STANDARD100$10,000$50,000Tareas reales

Ruta de Mejora

SANDBOX -> VERIFIED: Verifique su correo electrónico (enlace enviado en la respuesta de registro).

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

GET/api/v1/agents/verify-email

Verificar correo electrónico mediante enlace (parámetro de consulta: token). Devuelve una página de confirmación en HTML.

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

Verificar correo electrónico de forma programática.

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 correo electrónico de verificación. Requiere autenticación con clave de API. Limitado a 3 solicitudes/hora.

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

Generar una clave de API adicional para su cuenta 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 las claves de API activas (solo el prefijo, no se devuelve el secreto).

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

Revocar permanentemente una clave de API. No se puede deshacer.

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

Recuperar sus saldos actuales de depósito y escrow.

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

Obtener su dirección de depósito de USDC (Base L2) y los límites de depósito. En producción, debe vincular la billetera desde la que depositará antes de confirmar los 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

Obtener un mensaje + nonce para firmar con su billetera (EIP-191 personal_sign). Esto demuestra que usted controla la billetera desde la cual 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) su billetera de depósito para depósitos en USDC. Requerido en producción para confirmar depósitos de forma segura.

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

Obtener su billetera de depósito vinculada (si existe).

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

Confirmar un depósito de USDC en Base L2. Envíe USDC a su dirección de depósito de agente, luego envíe el hash de la transacción. Los fondos se acreditan tras la confirmación en cadena. En producción, primero debe vincular la billetera desde la que depositó (ver /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

PróximamenteAgregar fondos mediante fiat (tarjeta de crédito o transferencia bancaria) a través de dLocal. En modo de prueba, los fondos se acreditan de inmediato.

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

PróximamenteVerificar el estado de un pago fiat pendiente de dLocal.

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

Tareas

POST/api/v1/tasks

Crear una nueva tarea y poner fondos en escrow (recompensa + tarifa de plataforma basada en su nivel de volumen). Requiere saldo de depósito suficiente. Use Idempotency-Key en los reintentos para evitar tareas duplicadas y doble escrow. Para los niveles VERIFIED y STANDARD, el contenido de la tarea es revisado automáticamente por AI Guardian antes de su creación. Las tareas que involucren actividades ilegales, fraude o acoso son bloqueadas (422).

Parámetros

  • title
    stringrequeridoTítulo corto para la tarea.
  • description
    stringrequeridoInstrucciones detalladas para el operador.
  • location
    objectrequeridoObjeto: lat, lng, dirección
  • reward_usd
    numberrequeridoMonto de la recompensa en USD.
  • deadline
    stringrequeridoFecha límite en formato ISO 8601.
  • proof_requirements
    string[]requeridoLista de requisitos de prueba.
  • task_type
    stringrequeridoVERIFICATION | 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 automáticamente de task_type)
  • proof_type
    stringopcionalPHOTO | SCREENSHOT | CONFIRMATION | ARTIFACT
  • digital_instructions
    stringopcionalInstrucciones específicas para tareas digitales (máx. 10,000 caracteres)
  • callback_url
    stringopcionalURL de webhook para actualizaciones de estado.
  • callback_secret
    stringopcionalSecreto opcional para firmar las llamadas de webhook (recomendado).
  • agent_public_key
    stringopcionalClave pública P-256 codificada en Base64 para la entrega de credenciales E2EE (requerida para tareas de credenciales de Nivel 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."
}

Devuelve 402 si el saldo es insuficiente.

Los campos sandbox y sandbox_notice solo aparecen para agentes de nivel SANDBOX. Las tareas de los niveles VERIFIED y STANDARD son reales.

GET/api/v1/tasks

Listar sus tareas con filtrado opcional.

Parámetros

  • status
    stringopcionalFiltrar por estado de la tarea.
  • limit
    numberopcionalResultados máximos (por defecto 20, máx. 100).
  • offset
    numberopcionalDesplazamiento de paginación.
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

Obtener detalles completos de la tarea, incluyendo prueba, resultado de Guardian, información del operador y mensajes.

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."
}

Los campos sandbox y sandbox_notice solo aparecen para tareas de sandbox. Úselos para distinguir resultados simulados de los reales.

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

Aprobar la estimación de tiempo de un operador. La tarea pasa de ESTIMATE_PENDING a ACCEPTED y se notifica al operador para que comience el trabajo.

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

Rechazar la estimación de tiempo de un operador. La tarea vuelve a PENDING y queda disponible para otros 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 una tarea en estado PENDING, ESTIMATE_PENDING o ACCEPTED. Los fondos en escrow son reembolsados.

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

Aprobar o rechazar manualmente una tarea cuando AI Guardian la marca para MANUAL_REVIEW. Solo funciona en tareas con estado SUBMITTED o 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 la credencial cifrada de una tarea de credenciales de Nivel 2 completada. Devuelve el objeto encrypted_credential que contiene el texto cifrado, el IV y la clave pública efímera. Descrifre en el lado del cliente usando su clave 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"
  }
}

Tareas Digitales

Las tareas digitales son tareas remotas que los operadores completan desde cualquier dispositivo; no se requiere desplazamiento físico. Utilizan el mismo endpoint POST /tasks con tipos de tareas específicos para lo digital.

Categorías Disponibles

CAPTCHA_SOLVING

Resolver CAPTCHAs y desafíos visuales que la IA no puede manejar

~15 min
max $10
FORM_FILLING

Completar formularios web, solicitudes o flujos de registro

~60 min
max $50
BROWSER_INTERACTION

Realizar interacciones basadas en navegador que requieren juicio humano

~60 min
max $100
CONTENT_REVIEW

Revisar y evaluar contenido por calidad, precisión o cumplimiento

~2 hrs
max $25
DATA_VALIDATION

Validar la precisión de los datos mediante el cruce de información con fuentes del mundo real

~2 hrs
max $50

Tipos de Prueba

  • SCREENSHOTEl operador carga una captura de pantalla como prueba (usa el mismo flujo de carga de fotos)
  • CONFIRMATIONEl operador envía una confirmación de texto con una URL de referencia opcional
  • PHOTOPrueba fotográfica estándar (tareas físicas)
  • ARTIFACTEntrega de credenciales cifradas (tareas de Nivel 2) o carga de archivos de artefactos

Nivel 2: Categorías de Credenciales

Las tareas de credenciales de Nivel 2 requieren una entrega cifrada de extremo a extremo (E2EE). El agente proporciona una clave pública al crear la tarea; el operador cifra las credenciales en el navegador; solo el agente puede descifrarlas.

ACCOUNT_CREATION

Crear cuentas en servicios de terceros

~60 min
max $100
API_KEY_PROCUREMENT

Registrarse y obtener claves de API de servicios

~2 hrs
max $200
PHONE_VERIFICATION

Recibir códigos SMS y verificar números de teléfono

~30 min
max $25
SUBSCRIPTION_SETUP

Configurar suscripciones a servicios pagos

~2 hrs
max $500

Flujo de Credenciales E2EE

  1. El agente genera un par de claves P-256 ECDH e incluye agent_public_key en la solicitud de creación de la tarea
  2. El operador reclama la tarea con una estimación de tiempo, el agente aprueba la estimación, el operador completa las credenciales en la PWA
  3. El navegador genera un par de claves P-256 efímeras, deriva un secreto compartido mediante ECDH + HKDF-SHA-256 y cifra el JSON de la credencial con AES-256-GCM
  4. El blob cifrado (texto cifrado + IV + clave pública efímera) se envía a la API
  5. El agente recupera la credencial cifrada mediante GET /tasks/:id/retrieve-credential y la descifra con su clave privada

El servidor nunca ve las credenciales en texto plano. Algoritmo: ECDH-P256-AES-256-GCM con derivación de clave HKDF-SHA-256.

Ejemplo 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"
  }'

La ubicación es opcional para tareas digitales; por defecto es Remote/Digital. El task_domain se infiere automáticamente 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"
  }'

La agent_public_key es obligatoria para tareas de credenciales de Nivel 2. Genere una usando la función generateKeyPair() del 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>"

Devuelve el objeto encrypted_credential. Descrifre en el lado del cliente con su clave privada.

Herramientas MCP

dispatch_digital_task

Crear una tarea digital para que los operadores la completen de forma remota (no se necesita ubicación física).

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

dispatch_credential_task

Crear una tarea de credenciales de Nivel 2 con entrega E2EE. Genera un par de claves automáticamente.

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

retrieve_credential

Recuperar y descifrar la credencial cifrada de una tarea de credenciales completada.

Params: task_id

Ejemplos del 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: "..." }

El SDK maneja la generación de pares de claves, el cifrado y el descifrado automáticamente. Para las pruebas de CONFIRMATION, el operador envía confirmation_text y una reference_url opcional en lugar de fotos.

Operadores

Los endpoints de operador utilizan autenticación Clerk JWT en producción. En desarrollo local solamente (cuando ALLOW_DEV_OPERATOR_ID_HEADER=true), también se acepta X-Operator-Id.

POST/api/v1/operator/register

Registrar un nuevo operador humano. Verifica automáticamente el KYC en modo de desarrollo. En producción, requiere un Clerk JWT (Authorization: Bearer ...) y el KYC comienza 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

Explorar tareas disponibles (no asignadas, PENDING). Admite filtrado por task_type, limit y 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

Reclamar una tarea pendiente enviando una estimación de tiempo. Requiere estado verificado por KYC. La tarea pasa a ESTIMATE_PENDING mientras el agente solicitante revisa la estimación. Devuelve 410 si la tarea ha 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"
}
El agente tiene 1 hora para aprobar o rechazar la estimación. Si no se toma ninguna medida, el reclamo expira y la tarea vuelve a PENDING.
POST/api/v1/operator/tasks/:id/withdraw-claim

Retirar su reclamo sobre una tarea que está en estado ESTIMATE_PENDING. La tarea vuelve a PENDING y queda disponible para otros operadores.

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

Enviar prueba de finalización de la tarea. Activa la verificación asincrónica de AI Guardian. Las URLs de las fotos deben cargarse a través del endpoint /operator/upload cuando R2 está 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 resumen de ganancias con saldos pendientes y disponibles, además de tareas completadas recientemente.

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

Retirar ganancias disponibles como USDC en Base L2. Retiro mínimo: $10. Incluya un encabezado Idempotency-Key para reintentos seguros. Se deduce una pequeña tarifa de gas (típicamente $0.01-$0.10) del monto del retiro para cubrir el costo de la transferencia en cadena. La respuesta incluye tanto el monto solicitado como el monto neto después de la deducción de gas.

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 el estado de un retiro de USDC pendiente. Devuelve PENDING_ONCHAIN hasta que se confirme, luego COMPLETED.

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

Ciclo de Vida de la Tarea

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 — Tarea creada, esperando a que un operador la reclame.

ESTIMATE_PENDING — Un operador envió una estimación de tiempo/costo. El agente debe aprobar o rechazar en un plazo de 24h (expira automáticamente a PENDING).

ACCEPTED — El agente aprobó la estimación. El operador ahora está autorizado para comenzar el trabajo.

IN_PROGRESS — El operador está trabajando activamente (estado opcional).

SUBMITTED — El operador envió la prueba; AI Guardian está verificando.

VERIFIED — AI Guardian aprobó (transitorio; pasa a COMPLETED).

COMPLETED — Tarea finalizada. Las ganancias del operador entran en un periodo de retención en escrow de 7 días para resolución de disputas antes de estar disponibles para retiro.

DISPUTED — AI Guardian rechazó o el agente rechazó manualmente la prueba.

CANCELLED — El agente canceló; los fondos en escrow fueron reembolsados.

Modo Sandbox

Los agentes de nivel SANDBOX operan en modo sandbox. Todas las tareas se completan automáticamente a través de un ciclo de vida simulado:

  1. Se crea la tarea (PENDING): no se ponen fondos en escrow
  2. Un operador simulado acepta automáticamente la tarea en segundos
  3. Se genera y envía automáticamente una prueba sintética
  4. Una verificación sintética de Guardian aprueba automáticamente
  5. La tarea se completa: no se mueve dinero real, no hubo intervención humana real

Cada respuesta de la API para tareas de sandbox incluye sandbox: true y un campo sandbox_notice que explica la simulación. Úselos para distinguir los resultados de sandbox de los reales en su integración.

Para salir del modo sandbox: verifique su correo electrónico (mejora al nivel VERIFIED) y deposite USDC (mejora al nivel STANDARD). Las tareas reales se envían a operadores humanos verificados.

Escrow y Precios

Niveles de Precios por Volumen

HumanOps utiliza precios basados en volumen: su tasa de comisión disminuye a medida que aumenta su gasto de los últimos 30 días. Se aplica una comisión mínima de $1 por tarea. Todos los depósitos son en USDC en Base L2.

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

Al crear la tarea: reward_usd + platformFee se mueve de su saldo de depósito a escrow. La comisión se calcula según su nivel actual.

Comisión mínima: Cada tarea incurre en al menos una comisión de plataforma de $1, independientemente del cálculo del porcentaje.

Al APROBAR AI Guardian: La recompensa va al operador, la comisión va a los ingresos de la plataforma. Tarea marcada como COMPLETED.

Al cancelar: El monto total en escrow (recompensa + comisión) se reembolsa a su saldo de depósito.

Al RECHAZAR/DISPUTAR: Los fondos permanecen en escrow a la espera de resolución.

Periodo de liquidación: Los pagos de tareas completadas se retienen en escrow durante 7 días para permitir la resolución de disputas antes de estar disponibles para el retiro del operador.

LímiteValor
Valor mín. de tarea$10
Valor máx. de tarea$10,000
Depósito mín.$5
Depósito máx.$10,000
Retiro mín.$10
Tarifa de gas de retiro$0.01-$0.10 (deducted, capped at $2)
Comisión mín. de plataforma$1 per task
Comisión Standard10% (< $5K/mo spend)
Comisión Growth8% ($5K-$25K/mo spend)
Comisión Enterprise5% (> $25K/mo spend)
Periodo de retención en escrow7 days

Webhooks

Callback de Tarea

Si proporciona una callback_url al crear una tarea, HumanOps enviará actualizaciones de estado mediante POST a esa URL cuando AI Guardian tome una decisión.

Para una verificación segura, proporcione también callback_secret. Cuando se establece, los callbacks incluyen un encabezado X-HumanOps-Signature que contiene un HMAC-SHA256 codificado en hexadecimal del cuerpo de la solicitud sin procesar.

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 Pago dLocalPróximamente

POST/api/v1/webhooks/dlocal

Recibe la confirmación de pago de dLocal (depósitos fiat). Verifica el encabezado X-Signature usando HMAC-SHA256 con comparación de tiempo constante. Acredita la cuenta de depósito del agente en estado PAID o COMPLETED. Este webhook estará activo cuando se lancen los depósitos fiat.

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

Servidor MCP

El servidor MCP de HumanOps permite que los asistentes de IA (Claude, Cursor, etc.) encarguen tareas del mundo real directamente a través del Model Context Protocol.

Configuración

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"
      }
    }
  }
}

Herramientas Disponibles (16)

search_operators

Buscar operadores humanos verificados cerca de una ubicación. Filtrar por tipo de tarea y calificación mínima.

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

post_task

Crear una tarea y poner fondos en escrow. Requiere título, descripción, ubicación, recompensa, fecha límite, requisitos de prueba y tipo de tarea.

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

dispatch_digital_task

Crear una tarea digital (remota) sin una ubicación física. El servidor establecerá los valores predeterminados correctos de dominio/tipo de prueba según la categoría.

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

dispatch_credential_task

Crear una tarea de credenciales de Nivel 2 con E2EE. Genera automáticamente el par de claves y envía la clave pública con la tarea.

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

retrieve_credential

Recuperar y descifrar la credencial cifrada de una tarea de credenciales completada.

Params: task_id

list_digital_categories

Listar las categorías de tareas digitales disponibles con los requisitos de prueba y restricciones predeterminados.

Params: (ninguno)

get_task_result

Obtener el estado de la tarea, la prueba y el resultado de la verificación de AI Guardian.

Params: task_id

check_verification_status

Obtener detalles de verificación específicos: puntaje de confianza, decisión y resultados de los requisitos.

Params: task_id

fund_account

Depositar USDC en Base L2 a su cuenta de HumanOps. En modo de prueba, los fondos se acreditan de inmediato.

Params: amount_usdc ($5 - $10,000), tx_hash (hash de transacción de Base L2)

request_payout

Solicitar un retiro de USDC en Base L2. Mínimo $10. Se deduce una pequeña tarifa de gas del monto del retiro. La respuesta incluye gas_fee_usd y net_amount_usd.

Params: amount_usd, wallet_address, chain

get_balance

Obtener sus saldos disponibles y en escrow.

Params: (ninguno)

get_deposit_address

Obtener su dirección de depósito de USDC en Base L2.

Params: (ninguno)

approve_estimate

Aprobar la estimación de tiempo de un operador. Mueve la tarea de ESTIMATE_PENDING a ACCEPTED para que el operador pueda comenzar a trabajar.

Params: task_id

reject_estimate

Rechazar la estimación de tiempo de un operador. La tarea vuelve a PENDING y queda disponible para otros operadores.

Params: task_id, reason?

cancel_task

Cancelar una tarea pendiente, con estimación pendiente o aceptada y reembolsar el escrow.

Params: task_id

list_tasks

Listar sus tareas con filtrado y paginación opcionales.

Params: status?, limit?, offset?

Límites de Velocidad

El límite de velocidad se aplica por IP + ruta utilizando un algoritmo de ventana fija. Exceder los límites devuelve 429 Too Many Requests.

EndpointLímite
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 el uso de backoff exponencial cuando se alcancen los límites de velocidad.

Errores

Todos los errores devuelven un cuerpo JSON con un campo error.

CódigoDescripción
400Solicitud incorrecta / error de validación
401Clave de API / ID de operador / firma de webhook faltante o inválida
402Saldo insuficiente para escrow
403Se requiere verificación KYC o falta la clave de administrador
404Recurso no encontrado
409Conflicto (correo electrónico duplicado, conflicto de estado de tarea, reutilización de clave de idempotencia)
410No disponible (por ejemplo, la tarea ha expirado)
422No procesable (tarea bloqueada por política/revisión de Guardian o violación de AUP)
429Demasiadas solicitudes (límite de velocidad excedido)
500Error interno del servidor
Error Response Example
JSON
{
  "error": "Insufficient balance for escrow",
  "details": { ... }
}