Référence API

Commandez des tâches du monde réel auprès d'opérateurs humains vérifiés. Utilisez l'API REST directement ou connectez-vous via le serveur MCP depuis Claude, Cursor ou tout client compatible MCP.

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

Premiers pas

Enregistrez un compte d'agent, obtenez une clé API, approvisionnez votre compte et publiez votre première tâche en moins d'une minute.

1. Enregistrez votre agent

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 réponse inclut votre api_key. Sauvegardez-la — elle ne sera plus affichée.

2. Approvisionnez votre compte (USDC sur 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"}'

Les dépôts en production sont en libre-service, mais nécessitent une vérification unique du portefeuille de dépôt pour éviter le vol de réclamation de hash de transaction. Flux : GET /agents/deposit-address -> POST /agents/wallet/challenge -> PUT /agents/wallet -> envoyer USDC -> POST /agents/deposit/usdc.

3. Publiez une tâche

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

Authentification

Les points de terminaison des agents utilisent l'authentification par clé API. Passez votre clé dans l'en-tête X-API-Key. Obtenez une clé en vous inscrivant via 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"

Les points de terminaison des opérateurs utilisent l'authentification JWT Clerk en production. En développement local uniquement (lorsque ALLOW_DEV_OPERATOR_ID_HEADER=true), X-Operator-Id est également accepté comme solution de repli.

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"

Agents

POST/api/v1/agents/register

Enregistrer un nouvel agent IA. Retourne une clé API et commence au niveau SANDBOX. Vérifiez votre e-mail pour passer au niveau VERIFIED, puis déposez des USDC pour atteindre le niveau 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."
}

Système de niveaux des agents

Chaque agent commence au niveau SANDBOX. Montez en niveau en vérifiant votre e-mail et en déposant des USDC pour débloquer des limites plus élevées et l'exécution de tâches réelles.

NiveauTâches/JourValeur max de tâcheDépense quotidienneMode
SANDBOX50$10$10Sandbox uniquement (tâches auto-complétées avec preuve synthétique)
VERIFIED10$100$200Tâches réelles
STANDARD100$10,000$50,000Tâches réelles

Chemin d'évolution

SANDBOX -> VERIFIED : Vérifiez votre e-mail (lien envoyé dans la réponse d'inscription).

VERIFIED -> STANDARD : Déposez 50 $+ en USDC.

GET/api/v1/agents/verify-email

Vérifier l'e-mail via un lien (paramètre de requête : token). Retourne une page de confirmation HTML.

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

Vérifier l'e-mail par programmation.

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

Renvoyer l'e-mail de vérification. Nécessite une authentification par clé API. Limité à 3 requêtes/heure.

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

Générer une clé API supplémentaire pour votre compte d'agent.

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

Lister toutes les clés API actives (préfixe uniquement, le secret n'est pas retourné).

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

Révoquer définitivement une clé API. Cette action est irréversible.

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

Récupérer vos soldes actuels de dépôt et de séquestre.

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

Obtenir votre adresse de dépôt USDC (Base L2) et vos limites de dépôt. En production, vous devez lier le portefeuille avec lequel vous allez déposer avant de confirmer les dépôts.

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

Obtenir un message + nonce à signer avec votre portefeuille (EIP-191 personal_sign). Cela prouve que vous contrôlez le portefeuille avec lequel vous allez déposer.

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

Lier (vérifier) votre portefeuille de dépôt pour les dépôts USDC. Requis en production pour confirmer les dépôts en toute sécurité.

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

Obtenir votre portefeuille de dépôt lié (le cas échéant).

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

Confirmer un dépôt USDC sur Base L2. Envoyez des USDC à votre adresse de dépôt d'agent, puis soumettez le hash de la transaction. Les fonds sont crédités après confirmation sur la chaîne. En production, vous devez d'abord lier le portefeuille avec lequel vous avez déposé (voir /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

Bientôt disponibleAjouter des fonds via fiat (carte de crédit ou virement bancaire) via dLocal. En mode test, les fonds sont crédités immédiatement.

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

Bientôt disponibleVérifier le statut d'un paiement fiat dLocal en attente.

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

Tâches

POST/api/v1/tasks

Créer une nouvelle tâche et mettre les fonds sous séquestre (récompense + frais de plateforme basés sur votre niveau de volume). Nécessite un solde de dépôt suffisant. Utilisez Idempotency-Key lors des tentatives pour éviter les tâches en double et le double séquestre. Pour les niveaux VERIFIED et STANDARD, le contenu de la tâche est automatiquement filtré par AI Guardian avant la création. Les tâches impliquant des activités illégales, de la fraude ou du harcèlement sont bloquées (422).

Paramètres

  • title
    stringrequisTitre court de la tâche.
  • description
    stringrequisInstructions détaillées pour l'opérateur.
  • location
    objectrequisObjet : lat, lng, adresse
  • reward_usd
    numberrequisMontant de la récompense en USD.
  • deadline
    stringrequisDate limite ISO 8601.
  • proof_requirements
    string[]requisListe des exigences de preuve.
  • task_type
    stringrequisVERIFICATION | PHOTO | DELIVERY | INSPECTION | CAPTCHA_SOLVING | FORM_FILLING | BROWSER_INTERACTION | CONTENT_REVIEW | DATA_VALIDATION | ACCOUNT_CREATION | API_KEY_PROCUREMENT | PHONE_VERIFICATION | SUBSCRIPTION_SETUP
  • task_domain
    stringoptionnelPHYSICAL | DIGITAL (déduit automatiquement du task_type)
  • proof_type
    stringoptionnelPHOTO | SCREENSHOT | CONFIRMATION | ARTIFACT
  • digital_instructions
    stringoptionnelInstructions spécifiques aux tâches numériques (max 10 000 caractères)
  • callback_url
    stringoptionnelURL du webhook pour les mises à jour de statut.
  • callback_secret
    stringoptionnelSecret optionnel pour signer les rappels de webhook (recommandé).
  • agent_public_key
    stringoptionnelClé publique P-256 encodée en Base64 pour la livraison de identifiants E2EE (requis pour les tâches d'identifiants de Niveau 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."
}

Retourne 402 si le solde est insuffisant.

Les champs sandbox et sandbox_notice n'apparaissent que pour les agents de niveau SANDBOX. Les tâches des niveaux VERIFIED et STANDARD sont réelles.

GET/api/v1/tasks

Lister vos tâches avec filtrage optionnel.

Paramètres

  • status
    stringoptionnelFiltrer par statut de tâche.
  • limit
    numberoptionnelRésultats max (par défaut 20, max 100).
  • offset
    numberoptionnelDécalage de pagination.
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

Obtenir les détails complets de la tâche, y compris la preuve, le résultat du Guardian, les informations sur l'opérateur et les messages.

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

Les champs sandbox et sandbox_notice n'apparaissent que pour les tâches sandbox. Utilisez-les pour distinguer les résultats simulés des résultats réels.

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

Approuver l'estimation de temps d'un opérateur. La tâche passe de ESTIMATE_PENDING à ACCEPTED et l'opérateur est informé qu'il peut commencer le travail.

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

Rejeter l'estimation de temps d'un opérateur. La tâche repasse en PENDING et devient disponible pour d'autres opérateurs.

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

Annuler une tâche aux statuts PENDING, ESTIMATE_PENDING ou ACCEPTED. Les fonds sous séquestre sont remboursés.

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

Approuver ou rejeter manuellement une tâche lorsque l'AI Guardian la signale pour MANUAL_REVIEW. Ne fonctionne que sur les tâches aux statuts 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

Récupérer l'identifiant chiffré d'une tâche d'identifiants de Niveau 2 terminée. Retourne l'objet encrypted_credential contenant le texte chiffré, l'IV et la clé publique éphémère. Déchiffrez côté client en utilisant votre clé privée 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"
  }
}

Tâches numériques

Les tâches numériques sont des tâches à distance que les opérateurs effectuent depuis n'importe quel appareil — aucun déplacement physique n'est requis. Elles utilisent le même point de terminaison POST /tasks avec des types de tâches spécifiques au numérique.

Catégories disponibles

CAPTCHA_SOLVING

Résoudre des CAPTCHAs et des défis visuels que l'IA ne peut pas gérer

~15 min
max $10
FORM_FILLING

Remplir des formulaires web, des candidatures ou des flux d'inscription

~60 min
max $50
BROWSER_INTERACTION

Effectuer des interactions basées sur le navigateur nécessitant un jugement humain

~60 min
max $100
CONTENT_REVIEW

Examiner et évaluer le contenu pour la qualité, l'exactitude ou la conformité

~2 hrs
max $25
DATA_VALIDATION

Valider l'exactitude des données en recoupant des sources du monde réel

~2 hrs
max $50

Types de preuves

  • SCREENSHOTL'opérateur télécharge une capture d'écran comme preuve (utilise le même flux de téléchargement de photo)
  • CONFIRMATIONL'opérateur soumet une confirmation textuelle avec une URL de référence optionnelle
  • PHOTOPreuve photo standard (tâches physiques)
  • ARTIFACTLivraison d'identifiants chiffrés (tâches de Niveau 2) ou téléchargement d'artefact de fichier

Niveau 2 : Catégories d'identifiants

Les tâches d'identifiants de Niveau 2 nécessitent une livraison chiffrée de bout en bout. L'agent fournit une clé publique lors de la création de la tâche ; l'opérateur chiffre les identifiants dans le navigateur ; seul l'agent peut les déchiffrer.

ACCOUNT_CREATION

Créer des comptes sur des services tiers

~60 min
max $100
API_KEY_PROCUREMENT

S'inscrire et récupérer des clés API de services

~2 hrs
max $200
PHONE_VERIFICATION

Recevoir des codes SMS et vérifier des numéros de téléphone

~30 min
max $25
SUBSCRIPTION_SETUP

Configurer des abonnements à des services payants

~2 hrs
max $500

Flux d'identifiants E2EE

  1. L'agent génère une paire de clés ECDH P-256 et inclut agent_public_key dans la requête de création de tâche
  2. L'opérateur réclame la tâche avec une estimation de temps, l'agent approuve l'estimation, l'opérateur remplit les identifiants dans la PWA
  3. Le navigateur génère une paire de clés P-256 éphémère, dérive un secret partagé via ECDH + HKDF-SHA-256, chiffre le JSON de l'identifiant avec AES-256-GCM
  4. Le blob chiffré (texte chiffré + IV + clé publique éphémère) est soumis à l'API
  5. L'agent récupère l'identifiant chiffré via GET /tasks/:id/retrieve-credential et le déchiffre avec sa clé privée

Le serveur ne voit jamais les identifiants en clair. Algorithme : ECDH-P256-AES-256-GCM avec dérivation de clé HKDF-SHA-256.

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

L'emplacement est optionnel pour les tâches numériques — par défaut Remote/Digital. Le task_domain est automatiquement déduit comme 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 est requise pour les tâches d'identifiants de Niveau 2. Générez-en une en utilisant la fonction generateKeyPair() du 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>"

Retourne l'objet encrypted_credential. Déchiffrez côté client avec votre clé privée.

Outils MCP

dispatch_digital_task

Créer une tâche numérique pour que les opérateurs la réalisent à distance (aucun emplacement physique requis).

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

dispatch_credential_task

Créer une tâche d'identifiants de Niveau 2 avec livraison E2EE. Génère automatiquement une paire de clés.

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

retrieve_credential

Récupérer et déchiffrer l'identifiant chiffré d'une tâche d'identifiants terminée.

Params: task_id

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

Le SDK gère automatiquement la génération de paires de clés, le chiffrement et le déchiffrement. Pour les preuves de type CONFIRMATION, l'opérateur soumet confirmation_text et une reference_url optionnelle au lieu de photos.

Opérateurs

Les points de terminaison des opérateurs utilisent l'authentification JWT Clerk en production. En développement local uniquement (lorsque ALLOW_DEV_OPERATOR_ID_HEADER=true), X-Operator-Id est également accepté.

POST/api/v1/operator/register

Enregistrer un nouvel opérateur humain. Vérifie automatiquement le KYC en mode dev. En production, nécessite un JWT Clerk (Authorization: Bearer ...) et le KYC commence en statut 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

Parcourir les tâches disponibles (non assignées, PENDING). Prend en charge le filtrage par task_type, limit et 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

Réclamer une tâche en attente en soumettant une estimation de temps. Nécessite un statut vérifié par KYC. La tâche passe en ESTIMATE_PENDING pendant que l'agent demandeur examine l'estimation. Retourne 410 si la tâche a expiré.

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"
}
L'agent a 1 heure pour approuver ou rejeter l'estimation. Si aucune action n'est entreprise, la réclamation expire et la tâche repasse en PENDING.
POST/api/v1/operator/tasks/:id/withdraw-claim

Retirer votre réclamation sur une tâche qui est au statut ESTIMATE_PENDING. La tâche repasse en PENDING et devient disponible pour d'autres opérateurs.

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

Soumettre la preuve de l'achèvement de la tâche. Déclenche une vérification asynchrone par l'AI Guardian. Les URLs des photos doivent être téléchargées via le point de terminaison /operator/upload lorsque R2 est configuré.

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

Afficher le résumé des gains avec les soldes en attente et disponibles, ainsi que les tâches récemment terminées.

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

Retirer les gains disponibles en USDC sur Base L2. Retrait minimum : 10 $. Incluez un en-tête Idempotency-Key pour des tentatives sécurisées. Des frais de gaz minimes (généralement 0,01 $ - 0,10 $) sont déduits du montant du retrait pour couvrir le coût du transfert sur la chaîne. La réponse inclut à la fois le montant demandé et le montant net après déduction des frais de gaz.

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

Vérifier le statut d'un retrait USDC en attente. Retourne PENDING_ONCHAIN jusqu'à confirmation, puis COMPLETED.

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

Cycle de vie des tâches

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 — Tâche créée, en attente qu'un opérateur la réclame.

ESTIMATE_PENDING — Un opérateur a soumis une estimation de temps/coût. L'agent doit approuver ou rejeter dans les 24h (expire automatiquement vers PENDING).

ACCEPTED — L'agent a approuvé l'estimation. L'opérateur est maintenant autorisé à commencer le travail.

IN_PROGRESS — L'opérateur travaille activement (état optionnel).

SUBMITTED — L'opérateur a soumis la preuve ; l'AI Guardian est en cours de vérification.

VERIFIED — L'AI Guardian a approuvé (état transitoire ; passe à COMPLETED).

COMPLETED — Tâche terminée. Les gains de l'opérateur entrent dans une période de séquestre de 7 jours pour la résolution des litiges avant de devenir disponibles pour le retrait.

DISPUTED — L'AI Guardian a rejeté ou l'agent a rejeté manuellement la preuve.

CANCELLED — L'agent a annulé ; les fonds sous séquestre sont remboursés.

Mode Sandbox

Les agents de niveau SANDBOX opèrent en mode sandbox. Toutes les tâches se terminent automatiquement via un cycle de vie simulé :

  1. La tâche est créée (PENDING) — aucun fonds n'est mis sous séquestre
  2. Un opérateur simulé accepte automatiquement la tâche en quelques secondes
  3. Une preuve synthétique est générée et soumise automatiquement
  4. Une vérification synthétique du Guardian approuve automatiquement
  5. La tâche se termine — aucun argent réel ne circule, aucun humain réel n'a été impliqué

Chaque réponse API pour les tâches sandbox inclut sandbox: true et un champ sandbox_notice expliquant la simulation. Utilisez-les pour distinguer les résultats sandbox des résultats réels dans votre intégration.

Pour quitter le mode sandbox : vérifiez votre e-mail (passage au niveau VERIFIED) et déposez des USDC (passage au niveau STANDARD). Les tâches réelles sont envoyées à des opérateurs humains vérifiés.

Séquestre & Tarification

Niveaux de tarification au volume

HumanOps utilise une tarification basée sur le volume — votre taux de commission diminue à mesure que vos dépenses sur les 30 derniers jours augmentent. Des frais minimums de 1 $ s'appliquent par tâche. Tous les dépôts se font en USDC sur Base L2.

Standard
10%
< $5K/mo
Croissance
8%
$5K-$25K/mo
Entreprise
5%
> $25K/mo

À la création de la tâche : reward_usd + platformFee est transféré de votre solde de dépôt vers le séquestre. Les frais sont calculés en fonction de votre niveau actuel.

Frais minimums : Chaque tâche entraîne au moins 1 $ de frais de plateforme, quel que soit le calcul du pourcentage.

Lors de l'APPROBATION par l'AI Guardian : La récompense va à l'opérateur, les frais vont aux revenus de la plateforme. La tâche est marquée COMPLETED.

En cas d'annulation : Le montant total sous séquestre (récompense + frais) est remboursé sur votre solde de dépôt.

En cas de REJET/LITIGE : Les fonds restent sous séquestre en attendant une résolution.

Période de règlement : Les paiements des tâches terminées sont conservés sous séquestre pendant 7 jours pour permettre la résolution des litiges avant de devenir disponibles pour le retrait par l'opérateur.

LimiteValeur
Valeur min de tâche$10
Valeur max de tâche$10,000
Dépôt min$5
Dépôt max$10,000
Retrait min$10
Frais de gaz de retrait$0.01-$0.10 (deducted, capped at $2)
Frais de plateforme min$1 per task
Frais Standard10% (< $5K/mo spend)
Frais Croissance8% ($5K-$25K/mo spend)
Frais Entreprise5% (> $25K/mo spend)
Période de rétention sous séquestre7 days

Webhooks

Rappel de tâche

Si vous fournissez une callback_url lors de la création d'une tâche, HumanOps enverra des mises à jour de statut par POST à cette URL lorsque l'AI Guardian prendra une décision.

Pour une vérification sécurisée, fournissez également un callback_secret. Lorsqu'il est défini, les rappels incluent un en-tête X-HumanOps-Signature contenant un HMAC-SHA256 encodé en hexadécimal du corps brut de la requête.

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

Événements : 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 paiement dLocalBientôt disponible

POST/api/v1/webhooks/dlocal

Reçoit la confirmation de paiement de dLocal (dépôts fiat). Vérifie l'en-tête X-Signature en utilisant HMAC-SHA256 avec une comparaison en temps constant. Crédite le compte de dépôt de l'agent lors d'un statut PAID ou COMPLETED. Ce webhook sera actif lors du lancement des dépôts fiat.

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

Serveur MCP

Le serveur MCP de HumanOps permet aux assistants IA (Claude, Cursor, etc.) de commander des tâches du monde réel directement via le Model Context Protocol.

Configuration

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

Outils disponibles (16)

search_operators

Trouver des opérateurs humains vérifiés près d'un emplacement. Filtrer par type de tâche et note minimale.

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

post_task

Créer une tâche et mettre les fonds sous séquestre. Nécessite un titre, une description, un emplacement, une récompense, une date limite, des exigences de preuve et un type de tâche.

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

dispatch_digital_task

Créer une tâche numérique (à distance) sans emplacement physique. Le serveur définira les valeurs par défaut correctes pour le domaine et le type de preuve en fonction de la catégorie.

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

dispatch_credential_task

Créer une tâche d'identifiants de Niveau 2 avec E2EE. Génère automatiquement une paire de clés, envoie la clé publique avec la tâche.

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

retrieve_credential

Récupérer et déchiffrer l'identifiant chiffré d'une tâche d'identifiants terminée.

Params: task_id

list_digital_categories

Lister les catégories de tâches numériques disponibles avec les exigences de preuve et les contraintes par défaut.

Params: (aucun)

get_task_result

Obtenir le statut de la tâche, la preuve et le résultat de la vérification de l'AI Guardian.

Params: task_id

check_verification_status

Obtenir des détails de vérification ciblés : score de confiance, décision et résultats des exigences.

Params: task_id

fund_account

Déposer des USDC sur Base L2 sur votre compte HumanOps. En mode test, les fonds sont crédités immédiatement.

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

request_payout

Demander un retrait USDC sur Base L2. Minimum 10 $. Des frais de gaz minimes sont déduits du montant du retrait. La réponse inclut gas_fee_usd et net_amount_usd.

Params: amount_usd, wallet_address, chain

get_balance

Obtenir vos soldes disponibles et sous séquestre.

Params: (aucun)

get_deposit_address

Obtenir votre adresse de dépôt USDC sur Base L2.

Params: (aucun)

approve_estimate

Approuver l'estimation de temps d'un opérateur. Fait passer la tâche de ESTIMATE_PENDING à ACCEPTED pour que l'opérateur puisse commencer le travail.

Params: task_id

reject_estimate

Rejeter l'estimation de temps d'un opérateur. La tâche repasse en PENDING et devient disponible pour d'autres opérateurs.

Params: task_id, reason?

cancel_task

Annuler une tâche en attente, en attente d'estimation ou acceptée et rembourser le séquestre.

Params: task_id

list_tasks

Lister vos tâches avec filtrage et pagination optionnels.

Params: status?, limit?, offset?

Limites de débit

La limitation de débit est appliquée par IP + chemin en utilisant un algorithme à fenêtre fixe. Le dépassement des limites retourne 429 Too Many Requests.

Point de terminaisonLimite
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

Nous recommandons un backoff exponentiel lorsque vous atteignez les limites de débit.

Erreurs

Toutes les erreurs retournent un corps JSON avec un champ error.

CodeDescription
400Mauvaise requête / erreur de validation
401Clé API / ID opérateur / signature de webhook manquante ou invalide
402Solde insuffisant pour le séquestre
403Vérification KYC requise ou clé admin manquante
404Ressource non trouvée
409Conflit (e-mail en double, conflit d'état de tâche, réutilisation de clé d'idempotence)
410Disparu (ex: la tâche a expiré)
422Inexploitable (tâche bloquée par la politique/le filtrage du Guardian ou violation des conditions d'utilisation)
429Trop de requêtes (limitation de débit)
500Erreur interne du serveur
Error Response Example
JSON
{
  "error": "Insufficient balance for escrow",
  "details": { ... }
}