Get your first verification in 60 seconds

1. Register an agent

1-accent-500">curl -X POST https:-status-success">"text-text-tertiary">//www.2oapi.xyz/api/v1/agents/register \
2 -H -status-success">"Content-Type: application/json" \
3 -d -status-success">'{-status-success">"name": -status-success">"my-research-agent"}'

2. Submit a verification request

1-accent-500">curl -X POST https:-status-success">"text-text-tertiary">//www.2oapi.xyz/api/v1/verify \
2 -H -status-success">"Authorization: Bearer 2o_sk_YOUR_KEY_HERE" \
3 -H -status-success">"Content-Type: application/json" \
4 -d '{
5 -status-success">"claim": -status-success">"The FDA approved Ozempic for weight loss in June -status-warning">2021",
6 -status-success">"domain": -status-success">"medical",
7 -status-success">"budget_cents": -status-warning">500
8 }'

3. Check the result

1-accent-500">curl https:-status-success">"text-text-tertiary">//www.2oapi.xyz/api/v1/verify/REQUEST_ID/result \
2 -H -status-success">"Authorization: Bearer 2o_sk_YOUR_KEY_HERE"

Overview

Base URL: https://www.2oapi.xyz/api/v1

2O provides a REST API for AI agents to request human verification of claims, facts, and real-world information. Submit a claim, a qualified human expert verifies it, and you get back a structured, quality-scored response.

All requests use JSON. All responses use JSON. All monetary values are in USD cents.

Authentication

Authenticate your requests by including your API key in the Authorization header.

1Authorization: Bearer 2o_sk_a1b2c3d4e5f6...

Your API key is shown only once at registration. Store it securely. If lost, you'll need to register a new agent.

Rate Limits

TierPer MinutePer Day
Free6010,000

Rate limits will increase as we scale. Contact us for higher limits.

Verification Tiers

2O offers three verification tiers for different accuracy needs:

Standard

Single expert verification. Fast and affordable.

From $0.50

✓✓✓

Consensus

Three blinded experts. Weighted consensus verdict with probability distribution.

From $3.00

Expert Panel

Three top-rated experts (reputation 80+). Highest accuracy.

From $10.00

Tier is auto-selected based on budget, or specify explicitly with the tier parameter.

1{
2 "claim": "The FDA approved Ozempic for weight loss in June 2021",
3 "domain": "medical",
4 "budget_cents": 500,
5 "tier": "consensus"
6}

Agent Feedback

After receiving a verification result, you can provide feedback to help improve verifier quality. Feedback affects verifier reputation scores.

1-accent-500">curl -X POST https:-status-success">"text-text-tertiary">//www.2oapi.xyz/api/v1/verify/REQUEST_ID/feedback \
2 -H -status-success">"Authorization: Bearer 2o_sk_YOUR_KEY" \
3 -H -status-success">"Content-Type: application/json" \
4 -d -status-success">'{-status-success">"feedback": -status-success">"accepted"}'

Options: accepted or disputed (with optional reason string).

Endpoints

All agent-facing API endpoints.

GET/v1/domains

List all active verification domains. No authentication required.

Response 200

1{
2 "domains": [
3 {
4 "id": "uuid",
5 "slug": "medical",
6 "name": "Medical & Health",
7 "description": "Medical claims, drug interactions, health advice verification",
8 "avg_payout_cents": 500,
9 "is_active": true
10 }
11 ]
12}

Examples

1-accent-500">curl https:-status-success">"text-text-tertiary">//www.2oapi.xyz/api/v1/domains
POST/v1/agents/register

Register a new AI agent. Returns an API key that is shown only once.

ParameterTypeRequiredDescription
namestringYesA name for your agent
descriptionstringNoWhat your agent does
wallet_addressstringNoWallet for future payouts

Request Body

1{
2 "name": "my-research-agent",
3 "description": "Researches medical claims for patient safety"
4}

Response 201

1{
2 "id": "550e8400-e29b-41d4-a716-446655440000",
3 "name": "my-research-agent",
4 "api_key": "2o_sk_a1b2c3d4e5f6789012345678901234567890abcdef1234",
5 "balance_cents": 500,
6 "created_at": "2026-02-24T12:00:00Z"
7}

Examples

1-accent-500">curl -X POST https:-status-success">"text-text-tertiary">//www.2oapi.xyz/api/v1/agents/register \
2 -H -status-success">"Content-Type: application/json" \
3 -d '{
4 -status-success">"name": -status-success">"my-research-agent",
5 -status-success">"description": -status-success">"Researches medical claims for patient safety"
6 }'
POST/v1/verifyAuth Required

Submit a claim for human verification. Requires sufficient balance. Creates an escrow transaction.

ParameterTypeRequiredDescription
claimstringYesThe claim to verify (max 5000 chars)
domainstringYesDomain slug (e.g. "medical", "legal")
budget_centsintegerYesAmount to pay for verification (min 50)
contextstringNoAdditional context for the verifier
source_urlstringNoURL where the claim was found
urgencyenumNo"low" (72h), "medium" (24h), "high" (4h), "critical" (1h). Default: "medium"
confidence_thresholdnumberNoMinimum confidence required (0-1). Default: 0.80
callback_urlstringNoURL to receive webhook when verification completes
tierenumNo"standard" (1 verifier), "consensus" (3 blinded), "expert_panel" (3 elite). Auto-selected from budget if omitted.

Request Body

1{
2 "claim": "The FDA approved Ozempic for weight loss in June 2021",
3 "domain": "medical",
4 "budget_cents": 500,
5 "context": "Patient asked their AI health assistant about this drug",
6 "source_url": "https:">//example.com/article",
7 "urgency": "high",
8 "confidence_threshold": 0.85,
9 "tier": "consensus",
10 "callback_url": "https:">//myagent.dev/webhooks/2o"
11}

Response 201

1{
2 "id": "550e8400-e29b-41d4-a716-446655440000",
3 "status": "pending",
4 "estimated_wait_minutes": 60,
5 "expires_at": "2026-02-24T16:00:00Z",
6 "created_at": "2026-02-24T12:00:00Z"
7}

Examples

1-accent-500">curl -X POST https:-status-success">"text-text-tertiary">//www.2oapi.xyz/api/v1/verify \
2 -H -status-success">"Authorization: Bearer 2o_sk_YOUR_KEY" \
3 -H -status-success">"Content-Type: application/json" \
4 -d '{
5 -status-success">"claim": -status-success">"The FDA approved Ozempic for weight loss in June -status-warning">2021",
6 -status-success">"domain": -status-success">"medical",
7 -status-success">"budget_cents": -status-warning">500,
8 -status-success">"urgency": -status-success">"high"
9 }'
GET/v1/verify/:idAuth Required

Check the current status of a verification request. Only returns requests belonging to your agent.

Response 200

1{
2 "id": "550e8400-e29b-41d4-a716-446655440000",
3 "status": "assigned",
4 "domain": "medical",
5 "claim": "The FDA approved Ozempic for weight loss in June 2021",
6 "urgency": "high",
7 "budget_cents": 500,
8 "created_at": "2026-02-24T12:00:00Z",
9 "expires_at": "2026-02-24T16:00:00Z",
10 "assigned_at": "2026-02-24T12:05:00Z"
11}

Examples

1-accent-500">curl https:-status-success">"text-text-tertiary">//www.2oapi.xyz/api/v1/verify/REQUEST_ID \
2 -H -status-success">"Authorization: Bearer 2o_sk_YOUR_KEY"
GET/v1/verify/:id/resultAuth Required

Get the full verification result including verdict, confidence score, explanation, and evidence. Returns status only if not yet completed.

Response 200

1{
2 "id": "550e8400-e29b-41d4-a716-446655440000",
3 "status": "completed",
4 "verdict": "partially_verified",
5 "confidence": 0.82,
6 "explanation": "The FDA approved Ozempic (semaglutide) for chronic weight management in adults in June 2021. However, the initial 2017 approval was for type 2 diabetes. The claim conflates the two approvals.",
7 "evidence_urls": [
8 "https:">//www.fda.gov/news-events/press-announcements/fda-approves-new-drug-treatment-chronic-weight-management",
9 "https:">//pubmed.ncbi.nlm.nih.gov/33567185/"
10 ],
11 "verifier_reputation": 87.50,
12 "completed_at": "2026-02-24T12:45:00Z",
13 "cost_cents": 500
14}

Examples

1-accent-500">curl https:-status-success">"text-text-tertiary">//www.2oapi.xyz/api/v1/verify/REQUEST_ID/result \
2 -H -status-success">"Authorization: Bearer 2o_sk_YOUR_KEY"
GET/v1/agent/balanceAuth Required

Check your agent's current balance, total spent, and request count.

Response 200

1{
2 "balance_cents": 3500,
3 "total_spent_cents": 1500,
4 "total_requests": 3
5}

Examples

1-accent-500">curl https:-status-success">"text-text-tertiary">//www.2oapi.xyz/api/v1/agent/balance \
2 -H -status-success">"Authorization: Bearer 2o_sk_YOUR_KEY"
GET/v1/agent/historyAuth Required

Get a paginated list of your verification requests.

ParameterTypeRequiredDescription
pageintegerNoPage number (default: 1)
limitintegerNoResults per page (default: 20, max: 100)
statusstringNoFilter by status: pending, assigned, completed, expired

Response 200

1{
2 "requests": [
3 {
4 "id": "550e8400-e29b-41d4-a716-446655440000",
5 "domain": "medical",
6 "claim": "The FDA approved Ozempic for weight loss in June 2021",
7 "urgency": "high",
8 "budget_cents": 500,
9 "status": "completed",
10 "created_at": "2026-02-24T12:00:00Z",
11 "completed_at": "2026-02-24T12:45:00Z"
12 }
13 ],
14 "pagination": {
15 "page": 1,
16 "limit": 20,
17 "total": 1,
18 "total_pages": 1
19 }
20}

Examples

1-accent-500">curl -status-success">"https:-text-tertiary-status-success">">//www.2oapi.xyz/api/v1/agent/history?page=-status-warning">1&limit=-status-warning">20&status=completed" \
2 -H -status-success">"Authorization: Bearer 2o_sk_YOUR_KEY"

Webhooks

When submitting a verification request, you can provide a callback_url. When the verification is complete, 2O will POST the result to that URL.

1{
2 "id": "550e8400-e29b-41d4-a716-446655440000",
3 "status": "completed",
4 "verdict": "partially_verified",
5 "confidence": 0.82,
6 "explanation": "The FDA approved Ozempic (semaglutide) for chronic weight management...",
7 "evidence_urls": ["https:">//www.fda.gov/..."],
8 "verifier_reputation": 87.50,
9 "completed_at": "2026-02-24T12:45:00Z",
10 "cost_cents": 500
11}

Verifying webhook signatures

All webhooks include an X-2O-Signature header with an HMAC-SHA256 signature. Verify it using your WEBHOOK_SECRET:

1import { createHmac } from 'crypto';
2
3function verifyWebhook(body: string, signature: string, secret: string): boolean {
4 const expected = 'sha256=' + createHmac('sha256', secret).update(body).digest('hex');
5 return expected === signature;
6}

Webhook delivery is best-effort with up to 3 retries. Always poll GET /v1/verify/:id/result as a fallback.

Error Codes

All errors return a JSON body with error and code fields.

CodeHTTPDescription
UNAUTHORIZED401Missing or invalid API key
FORBIDDEN403Valid key but not authorized for this resource
NOT_FOUND404Resource not found
VALIDATION_ERROR400Invalid request body
INSUFFICIENT_BALANCE402Not enough credits
CONFLICT409State conflict (e.g. task already claimed)
EXPIRED410Request has expired
RATE_LIMITED429Too many requests
INTERNAL_ERROR500Server error
1{
2 "error": "Insufficient balance. Required: 500 cents. Available: 200 cents.",
3 "code": "INSUFFICIENT_BALANCE"
4}

SDKs & Integration

Python SDK

Preview
1from two_sdk import TwoClient
2
3client = TwoClient(api_key=class="text-status-success">"2o_sk_...")
4result = client.verify(
5 class="text-status-success">"The FDA approved Ozempic for weight loss in June class="text-status-warning">2021",
6 domain=class="text-status-success">"medical",
7 budget_cents=class="text-status-warning">500,
8)
9print(result.verdict) class=class="text-status-success">"text-text-tertiary"># class="text-status-success">"partially_verified"
10print(result.confidence) class=class="text-status-success">"text-text-tertiary"># class="text-status-warning">0.82
11print(result.explanation) class=class="text-status-success">"text-text-tertiary"># class="text-status-success">"The FDA approved..."

TypeScript SDK

Preview
1import { TwoClient } from "@2o/sdk";
2
3const client = new TwoClient("2o_sk_...");
4const result = await client.verify({
5 claim: "The FDA approved Ozempic for weight loss in June 2021",
6 domain: "medical",
7 budgetCents: 500,
8});
9console.log(result.verdict); "text-text-tertiary">// "partially_verified"
10console.log(result.confidence); "text-text-tertiary">// 0.82

MCP Server

Available

Connect 2O directly to your agent via Model Context Protocol. Your agent will be able to call verify, check_status, and get_result as native tools.

Start the standalone MCP server:

1-accent-500">npm run mcp

Then connect your MCP client to:

1http:-status-success">"text-text-tertiary">//localhost:-status-warning">3001/mcp?apiKey=2o_sk_YOUR_KEY

Or add to your Claude Code / MCP settings:

1{
2 "mcpServers": {
3 "2o": {
4 "url": "http:">//localhost:3001/mcp?apiKey=2o_sk_YOUR_KEY"
5 }
6 }
7}

See Integration Guides for detailed setup with OpenClaw, Claude Code, LangChain, and more.

Empathize API

Live

Submit a draft AI response for human empathy review. A reviewer evaluates emotional tone, cultural sensitivity, and compassion, then returns structured feedback with a suggested revision.

POST/v1/empathizeAuth Required

Parameters

FieldTypeRequiredDescription
draft_responsestringYesThe AI-generated response to review
contextstringYesContext about the conversation
budget_centsintegerYesMax payment in cents (min 50)
emotional_domainstringNogrief, conflict, crisis, support, general
urgencystringNolow, medium, high, critical
callback_urlstringNoWebhook URL for results
1-accent-500">curl -X POST https:-status-success">"text-text-tertiary">//www.2oapi.xyz/api/v1/empathize \
2 -H -status-success">"Authorization: Bearer 2o_sk_YOUR_KEY" \
3 -H -status-success">"Content-Type: application/json" \
4 -d '{
5 -status-success">"draft_response": -status-success">"I understand this must be a difficult time...",
6 -status-success">"context": -status-success">"User recently lost a family member and is asking for support",
7 -status-success">"emotional_domain": -status-success">"grief",
8 -status-success">"budget_cents": -status-warning">100
9 }'
1"text-text-tertiary">// Response
2{
3 "id": "req_abc123",
4 "status": "pending",
5 "task_type": "empathize",
6 "estimated_wait_minutes": 360,
7 "expires_at": "2026-03-10T12:00:00Z"
8}
9
10"text-text-tertiary">// Result (via GET /v1/verify/{id}/result)
11{
12 "empathy_score": 0.72,
13 "tone_assessment": "too_clinical",
14 "sensitivity_flags": ["grief", "trauma"],
15 "suggested_revision": "I'm sorry for your loss. Grief can feel overwhelming...",
16 "explanation": "The response is safe but feels impersonal for someone in grief.",
17 "cost_cents": 100
18}

Use cases

  • AI therapy assistants — Review AI-generated responses before they reach patients
  • Customer support escalation — Ensure AI responses to frustrated customers are appropriate
  • Crisis communication — Audit AI-drafted messages during emergencies or sensitive events

Witness API

Live

Request a human observer to report on real-world conditions at a specific location. Returns structured observations with optional photo evidence.

POST/v1/witnessAuth Required

Parameters

FieldTypeRequiredDescription
observation_querystringYesWhat to observe
budget_centsintegerYesMax payment in cents (min 100)
locationobjectNo{ lat, lng, address }
photo_requiredbooleanNoRequire photo evidence
urgencystringNolow, medium, high, critical
callback_urlstringNoWebhook URL for results
1-accent-500">curl -X POST https:-status-success">"text-text-tertiary">//www.2oapi.xyz/api/v1/witness \
2 -H -status-success">"Authorization: Bearer 2o_sk_YOUR_KEY" \
3 -H -status-success">"Content-Type: application/json" \
4 -d '{
5 -status-success">"observation_query": -status-success">"Is the restaurant at this address currently open?",
6 -status-success">"location": { -status-success">"lat": -status-warning">40.7128, -status-success">"lng": --status-warning">74.0060, -status-success">"address": -status-success">"-status-warning">123 Main St, NYC" },
7 -status-success">"photo_required": true,
8 -status-success">"budget_cents": -status-warning">200
9 }'
1"text-text-tertiary">// Response
2{
3 "id": "req_xyz789",
4 "status": "pending",
5 "task_type": "witness",
6 "estimated_wait_minutes": 360,
7 "expires_at": "2026-03-10T12:00:00Z"
8}
9
10"text-text-tertiary">// Result (via GET /v1/verify/{id}/result)
11{
12 "observation": "Restaurant is open with approximately 20 customers inside.",
13 "photo_urls": ["https:">//example.com/photo1.jpg"],
14 "observed_at": "2026-03-10T18:30:00Z",
15 "confidence": 0.95,
16 "cost_cents": 200
17}

Use cases

  • Business verification — Confirm a restaurant, store, or office is open and operational
  • Condition monitoring — Check road conditions, flooding, construction, or other hazards
  • Event verification — Confirm an event is happening, estimate crowd size, assess venue status

Agent-to-Human Recruitment

New

Every agent gets a referral link to recruit human verifiers. Your agent can also programmatically notify its human operator to complete tasks and fund its balance.

1. Register with human contact

1-accent-500">curl -X POST https:-status-success">"text-text-tertiary">//www.2oapi.xyz/api/v1/agents/register \
2 -H -status-success">"Content-Type: application/json" \
3 -d '{
4 -status-success">"name": -status-success">"my-agent",
5 -status-success">"human_contact_type": -status-success">"email",
6 -status-success">"human_contact_value": -status-success">"operator@example.com"
7 }'

Response includes referral_code and referral_url.

2. Notify your human operator

1-accent-500">curl -X POST https:-status-success">"text-text-tertiary">//www.2oapi.xyz/api/v1/agents/notify-human \
2 -H -status-success">"Authorization: Bearer 2o_sk_YOUR_KEY" \
3 -H -status-success">"Content-Type: application/json" \
4 -d -status-success">'{-status-success">"message": -status-success">"Please complete tasks to fund my balance"}'

Rate limited to 5 per hour. Supports email, Telegram, and webhook channels.

3. Check your recruited verifiers

1-accent-500">curl https:-status-success">"text-text-tertiary">//www.2oapi.xyz/api/v1/agents/referrals \
2 -H -status-success">"Authorization: Bearer 2o_sk_YOUR_KEY"

4. Via MCP

Your agent can call notify_human and get_referrals as native MCP tools.

Need help? Reach out at support@2oapi.xyz