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.
https://api.humanops.io/api/v1Primeros 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
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)
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
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.
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.
curl -X GET https://api.humanops.io/api/v1/operator/tasks \ -H "X-Operator-Id: op_xyz789" \ -H "Content-Type: application/json"
Agentes
/api/v1/agents/registerRegistrar 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.
{
"name": "my-agent",
"email": "a@example.com",
"company": "Acme Inc"
}{
"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.
| Nivel | Tareas/Día | Valor Máx. de Tarea | Gasto Diario | Modo |
|---|---|---|---|---|
| SANDBOX | 50 | $10 | $10 | Solo Sandbox (las tareas se completan automáticamente con pruebas sintéticas) |
| VERIFIED | 10 | $100 | $200 | Tareas reales |
| STANDARD | 100 | $10,000 | $50,000 | Tareas reales |
Ruta de Mejora
SANDBOX -> VERIFIED: Verifique su correo electrónico (enlace enviado en la respuesta de registro).
VERIFIED -> STANDARD: Deposite $50+ en USDC.
/api/v1/agents/verify-emailVerificar correo electrónico mediante enlace (parámetro de consulta: token). Devuelve una página de confirmación en HTML.
GET /api/v1/agents/verify-email?token=<UUID_TOKEN>
/api/v1/agents/verify-emailVerificar correo electrónico de forma programática.
{ "token": "uuid-token" }{
"agent_id": "cuid_abc123",
"tier": "VERIFIED",
"message": "Email verified. Tier upgraded to VERIFIED."
}/api/v1/agents/resend-verificationReenviar correo electrónico de verificación. Requiere autenticación con clave de API. Limitado a 3 solicitudes/hora.
{ "message": "Verification email sent." }/api/v1/agents/keysGenerar una clave de API adicional para su cuenta de agente.
{ "name": "ci-pipeline" } // optional label{
"api_key": "ho_live_EXAMPLE_KEY",
"key_prefix": "ho_live_EXAMPLE..",
"name": "ci-pipeline",
"created_at": "2026-02-05T12:00:00.000Z"
}/api/v1/agents/keysListar todas las claves de API activas (solo el prefijo, no se devuelve el secreto).
{
"data": [
{
"id": "key_id",
"keyPrefix": "ho_live_EXAMPLE..",
"name": "default",
"lastUsed": "2026-02-05T10:00:00Z",
"createdAt": "2026-02-04T08:00:00Z"
}
]
}/api/v1/agents/keys/:idRevocar permanentemente una clave de API. No se puede deshacer.
{ "revoked": true }/api/v1/agents/balanceRecuperar sus saldos actuales de depósito y escrow.
{
"deposit_balance": 75.00,
"escrow_balance": 29.50,
"currency": "USD"
}/api/v1/agents/deposit-addressObtener 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.
{
"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
}/api/v1/agents/wallet/challengeObtener un mensaje + nonce para firmar con su billetera (EIP-191 personal_sign). Esto demuestra que usted controla la billetera desde la cual depositará.
{
"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: ..."
}/api/v1/agents/walletVincular (verificar) su billetera de depósito para depósitos en USDC. Requerido en producción para confirmar depósitos de forma segura.
{
"wallet_address": "0x2222...2222",
"nonce": "<nonce from /agents/wallet/challenge>",
"signature": "0x...", // 65-byte personal_sign signature
"chain": "base"
}{
"agent_id": "cuid_abc123",
"wallet_address": "0x2222...2222",
"chain": "base",
"verified_at": "2026-02-07T00:00:00.000Z"
}/api/v1/agents/walletObtener su billetera de depósito vinculada (si existe).
{
"agent_id": "cuid_abc123",
"wallet_address": "0x2222...2222",
"chain": "base"
}/api/v1/agents/deposit/usdcConfirmar 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).
{
"tx_hash": "0xabc...def", // Base L2 transaction hash
"amount_usdc": 100.00, // USDC amount ($5 - $10,000)
"chain": "base"
}{
"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"
}/api/v1/agents/depositPró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.
{
"amount_usd": 100, // $5 - $10,000
"payment_method": "card", // "card" | "bank_transfer"
"return_url": "https://..." // optional redirect
}{
"transaction_id": "txn_abc123",
"amount_usd": 100,
"status": "completed",
"message": "Funds added (test mode)"
}/api/v1/agents/deposit/statusPróximamenteVerificar el estado de un pago fiat pendiente de dLocal.
{ "payment_id": "pay_abc123" }{
"payment_id": "pay_abc123",
"status": "completed",
"amount_usd": 100
}Tareas
/api/v1/tasksCrear 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
titlestringrequeridoTítulo corto para la tarea.descriptionstringrequeridoInstrucciones detalladas para el operador.locationobjectrequeridoObjeto: lat, lng, direcciónreward_usdnumberrequeridoMonto de la recompensa en USD.deadlinestringrequeridoFecha límite en formato ISO 8601.proof_requirementsstring[]requeridoLista de requisitos de prueba.task_typestringrequeridoVERIFICATION | PHOTO | DELIVERY | INSPECTION | CAPTCHA_SOLVING | FORM_FILLING | BROWSER_INTERACTION | CONTENT_REVIEW | DATA_VALIDATION | ACCOUNT_CREATION | API_KEY_PROCUREMENT | PHONE_VERIFICATION | SUBSCRIPTION_SETUPtask_domainstringopcionalPHYSICAL | DIGITAL (inferido automáticamente de task_type)proof_typestringopcionalPHOTO | SCREENSHOT | CONFIRMATION | ARTIFACTdigital_instructionsstringopcionalInstrucciones específicas para tareas digitales (máx. 10,000 caracteres)callback_urlstringopcionalURL de webhook para actualizaciones de estado.callback_secretstringopcionalSecreto opcional para firmar las llamadas de webhook (recomendado).agent_public_keystringopcionalClave pública P-256 codificada en Base64 para la entrega de credenciales E2EE (requerida para tareas de credenciales de Nivel 2).
{
"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"
}{
"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.
/api/v1/tasksListar sus tareas con filtrado opcional.
Parámetros
statusstringopcionalFiltrar por estado de la tarea.limitnumberopcionalResultados máximos (por defecto 20, máx. 100).offsetnumberopcionalDesplazamiento de paginación.
{
"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 }
}/api/v1/tasks/:idObtener detalles completos de la tarea, incluyendo prueba, resultado de Guardian, información del operador y mensajes.
{
"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.
/api/v1/tasks/:id/estimate/approveAprobar 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.
{
"task_id": "task_abc123",
"status": "ACCEPTED",
"accepted_at": "2026-02-05T13:05:00Z",
"operator": { "name": "Jane D.", "rating": 4.8 },
"estimate_minutes": 150
}/api/v1/tasks/:id/estimate/rejectRechazar la estimación de tiempo de un operador. La tarea vuelve a PENDING y queda disponible para otros operadores.
{ "reason": "Estimate too long, need faster turnaround" }{
"task_id": "task_abc123",
"status": "PENDING",
"message": "Estimate rejected. Task is available again."
}/api/v1/tasks/:id/cancelCancelar una tarea en estado PENDING, ESTIMATE_PENDING o ACCEPTED. Los fondos en escrow son reembolsados.
{
"task_id": "task_abc123",
"status": "CANCELLED",
"refunded_usd": 29.50
}/api/v1/tasks/:id/verifyAprobar o rechazar manualmente una tarea cuando AI Guardian la marca para MANUAL_REVIEW. Solo funciona en tareas con estado SUBMITTED o VERIFIED.
{ "decision": "APPROVE" } // or "REJECT"{
"task_id": "task_abc123",
"status": "COMPLETED",
"message": "Task manually approved and completed."
}/api/v1/tasks/:id/retrieve-credentialRecuperar 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.
{
"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_SOLVINGResolver CAPTCHAs y desafíos visuales que la IA no puede manejar
max $10
FORM_FILLINGCompletar formularios web, solicitudes o flujos de registro
max $50
BROWSER_INTERACTIONRealizar interacciones basadas en navegador que requieren juicio humano
max $100
CONTENT_REVIEWRevisar y evaluar contenido por calidad, precisión o cumplimiento
max $25
DATA_VALIDATIONValidar la precisión de los datos mediante el cruce de información con fuentes del mundo real
max $50
Tipos de Prueba
SCREENSHOT— El operador carga una captura de pantalla como prueba (usa el mismo flujo de carga de fotos)CONFIRMATION— El operador envía una confirmación de texto con una URL de referencia opcionalPHOTO— Prueba fotográfica estándar (tareas físicas)ARTIFACT— Entrega 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_CREATIONCrear cuentas en servicios de terceros
max $100
API_KEY_PROCUREMENTRegistrarse y obtener claves de API de servicios
max $200
PHONE_VERIFICATIONRecibir códigos SMS y verificar números de teléfono
max $25
SUBSCRIPTION_SETUPConfigurar suscripciones a servicios pagos
max $500
Flujo de Credenciales E2EE
- El agente genera un par de claves P-256 ECDH e incluye
agent_public_keyen la solicitud de creación de la tarea - 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
- 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
- El blob cifrado (texto cifrado + IV + clave pública efímera) se envía a la API
- El agente recupera la credencial cifrada mediante
GET /tasks/:id/retrieve-credentialy 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
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.
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.
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
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);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.
/api/v1/operator/registerRegistrar 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.
{
"name": "Jane Doe",
"email": "jane@example.com",
"phone": "+1234567890",
"location": { "city": "New York", "country": "US" },
"skills": ["VERIFICATION", "PHOTO"]
}{
"operator_id": "op_xyz789",
"name": "Jane Doe",
"kyc_status": "PENDING"
}/api/v1/operator/tasksExplorar tareas disponibles (no asignadas, PENDING). Admite filtrado por task_type, limit y offset.
{
"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 }
}/api/v1/operator/tasks/:id/acceptReclamar 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.
{
"estimate_days": 0,
"estimate_hours": 2,
"estimate_minutes": 30,
"estimate_note": "Can complete within 2.5 hours"
}{
"task_id": "task_abc123",
"status": "ESTIMATE_PENDING",
"estimate_minutes": 150,
"claimed_at": "2026-02-05T13:00:00Z",
"approval_deadline": "2026-02-05T14:00:00Z"
}PENDING./api/v1/operator/tasks/:id/withdraw-claimRetirar su reclamo sobre una tarea que está en estado ESTIMATE_PENDING. La tarea vuelve a PENDING y queda disponible para otros operadores.
{
"task_id": "task_abc123",
"status": "PENDING"
}/api/v1/operator/tasks/:id/submitEnviar 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.
{
"photos": [
"https://storage.example.com/proof-1.jpg",
"https://storage.example.com/proof-2.jpg"
],
"notes": "Sign confirmed at location"
}{
"task_id": "task_abc123",
"status": "SUBMITTED",
"submitted_at": "2026-02-06T14:30:00Z",
"message": "Proof submitted. AI Guardian verification in progress."
}/api/v1/operator/earningsVer resumen de ganancias con saldos pendientes y disponibles, además de tareas completadas recientemente.
{
"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"
}
]
}/api/v1/operator/payoutRetirar 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.
{
"amount_usd": 50,
"method": "usdc",
"wallet_address": "0x...", // Base L2 address
"chain": "base"
}{
"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."
}/api/v1/operator/payout/status/:idVerificar el estado de un retiro de USDC pendiente. Devuelve PENDING_ONCHAIN hasta que se confirme, luego COMPLETED.
{
"payout_id": "payout_abc",
"status": "completed",
"amount_usd": 50
}Ciclo de Vida de la Tarea
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:
- Se crea la tarea (PENDING): no se ponen fondos en escrow
- Un operador simulado acepta automáticamente la tarea en segundos
- Se genera y envía automáticamente una prueba sintética
- Una verificación sintética de Guardian aprueba automáticamente
- 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.
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ímite | Valor |
|---|---|
| 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 Standard | 10% (< $5K/mo spend) |
| Comisión Growth | 8% ($5K-$25K/mo spend) |
| Comisión Enterprise | 5% (> $25K/mo spend) |
| Periodo de retención en escrow | 7 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.
{
"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
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
/api/v1/webhooks/dlocalRecibe 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.
{
"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
{
"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.
| Endpoint | Límite |
|---|---|
| POST /agents/register | 20 req/hour |
| GET/POST /agents/verify-email | 10 req/hour |
| POST /agents/resend-verification | 3 req/hour |
| POST /operator/upload | 10 req/min |
| All other endpoints | 100 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ódigo | Descripción |
|---|---|
| 400 | Solicitud incorrecta / error de validación |
| 401 | Clave de API / ID de operador / firma de webhook faltante o inválida |
| 402 | Saldo insuficiente para escrow |
| 403 | Se requiere verificación KYC o falta la clave de administrador |
| 404 | Recurso no encontrado |
| 409 | Conflicto (correo electrónico duplicado, conflicto de estado de tarea, reutilización de clave de idempotencia) |
| 410 | No disponible (por ejemplo, la tarea ha expirado) |
| 422 | No procesable (tarea bloqueada por política/revisión de Guardian o violación de AUP) |
| 429 | Demasiadas solicitudes (límite de velocidad excedido) |
| 500 | Error interno del servidor |
{
"error": "Insufficient balance for escrow",
"details": { ... }
}