GET /api → 200 OK · content: documentation

API documentation

Version 1. JSON in, JSON out. No authentication for task submission in the MVP — every request is human-reviewed before acceptance, which is the real gate. Base URL: https://humanforai.dev (locally: http://localhost:4180).

0 · connect via MCP

MCP/mcp

The fastest path for agents: Human For AI is a native MCP server (streamable HTTP, no auth). Add it once and the human becomes a tool your agent can call — get_human_services, submit_human_task, check_task_status, message_human_operator.

Claude Code
claude mcp add --transport http human-for-ai \
  https://humanforai.dev/mcp
Claude Desktop / Claude.ai
# Settings → Connectors → Add custom connector
URL: https://humanforai.dev/mcp
Stdio clients (no remote MCP support)
# via npm — thin proxy to the endpoint above
npx -y humanforai
Stdio config (JSON)
{ "command": "npx", "args": ["-y", "humanforai"] }

Prefer raw HTTP? Everything below works without MCP — same capabilities, same review process.

1 · discovery

GET/.well-known/agent.json

The platform manifest, published at the standard /.well-known/ location (and mirrored at /agent.json). Everything an agent needs to decide whether and how to use this service: interfaces, task types, response expectations, pricing, trust policy, endpoints. Fetch it first.

example
curl https://humanforai.dev/.well-known/agent.json

All machine-readable resources

pathcontent
/.well-known/agent.jsonPlatform manifest: brand, interfaces, accepted/rejected task types, response expectations, pricing model, trust & safety, endpoints.
/.well-known/human.jsonThe human operator: role, location policy, languages, background, expertise, availability, preferred task types, boundaries.
/.well-known/capabilities.jsonStructured capabilities: required inputs, output formats, example tasks, limitations.
/.well-known/services.jsonService catalog: task types, pricing, response times, example requests and response formats.
/agent.jsonRoot-level copy of the platform manifest.
/openapi.jsonOpenAPI 3.0 specification of this REST API.
/mcpMCP server (streamable HTTP, no auth) — see section 0.
/llms.txtCurated plain-text summary for language models.

The manifest is also linked from every page via <link rel="alternate" type="application/json"> and referenced in /robots.txt.

2 · submit a task

POST/api/v1/tasks

Creates a task request. Returns a generated task_id and a status URL. Submission is not acceptance — the operator reviews every task first.

Request body

Task request fields
fieldtyperequireddescription
task_typestringyesOne of the accepted task types below.
descriptionstringyesWhat to do, where, and what success looks like. 10–5000 characters.
budget_usdnumbernoOptional — services are free during the pilot, so the field is accepted and ignored for now.
location_requiredbooleannoSet true if the task needs physical presence. Default false.
location_detailstringnoCity, address, or area — required in practice when location_required is true.
deadlinestringnoISO 8601 datetime, e.g. 2026-07-10T12:00:00+03:00.
output_formatstringnotext_report (default), text_report_with_photos, structured_json, annotated_screenshots, video, or describe your own.
contact_emailstringnoWhere results and clarifying questions go. Not shown publicly.
requesterstringnoAgent name, company, or system identifier — helps review go faster.
request
POST /api/v1/tasks
Content-Type: application/json

{
  "task_type": "real_world_verification",
  "description": "Verify whether a specific product
                  exists in a local store",
  "location_required": true,
  "deadline": "2026-07-10T12:00:00+03:00",
  "output_format": "text_report_with_photos",
  "budget_usd": 25
}

Add contact_email to receive the deliverable, and requester (e.g. acme-shopping-agent/2.1) to speed up review. budget_usd is ignored while the pilot is free.

response — 201 Created
{
  "task_id": "HFAI-2026-9F41C2AB",
  "status": "submitted",
  "created_at": "2026-07-06T09:12:44.201Z",
  "status_url": "/api/v1/tasks/HFAI-2026-9F41C2AB",
  "status_page": "/tasks?id=HFAI-2026-9F41C2AB",
  "message": "Task received. It will be reviewed
              before acceptance. Keep the task_id
              to check status."
}

Accepted task types

real_world_verification product_or_app_testing human_judgment_and_feedback data_collection local_physical_task ai_output_review prompt_and_workflow_testing simulation_and_automation_testing accessibility_and_usability_check custom_human_in_the_loop

Tasks that are illegal, harmful, deceptive, unsafe, or privacy-invasive are rejected at review regardless of type. See trust & verification and the rejected_task_types list in /agent.json.

3 · check status

GET/api/v1/tasks/{task_id}

Public status lookup — the unguessable task ID acts as the access token. Contact email is never included in this response. Humans can use the status page instead.

response — 200 OK
{
  "task_id": "HFAI-2026-9F41C2AB",
  "status": "in_progress",
  "task_type": "real_world_verification",
  "deadline": "2026-07-10T12:00:00+03:00",
  "status_history": [
    { "status": "submitted",    "at": "2026-07-06T09:12:44Z" },
    { "status": "under_review", "at": "2026-07-06T11:02:10Z" },
    { "status": "accepted",     "at": "2026-07-06T12:40:33Z" },
    { "status": "in_progress",  "at": "2026-07-07T08:15:02Z" }
  ]
}

Task lifecycle

statusmeaning
submittedReceived, waiting for operator review.
under_reviewThe operator is evaluating feasibility, safety, and budget.
acceptedTask and budget confirmed; scheduled for execution.
in_progressWork is happening.
deliveredResult sent in the requested output format.
rejectedDeclined at review — reason included in operator_notes when possible.
4 · contact the operator

POST/api/v1/messages

For anything that isn't a ready-made task: questions, scoping, custom projects, NDAs. No auth. Include reply_to — it's how the operator answers you.

request
POST /api/v1/messages
Content-Type: application/json

{
  "from": "acme-shopping-agent/2.1",
  "subject": "Recurring verification, weekly",
  "message": "Can you verify shelf stock at 3 stores
              every Sunday? What would that cost?",
  "reply_to": "agent-inbox@example.com"
}
response — 201 Created
{
  "message_id": "MSG-2026-4B7A91C3",
  "created_at": "2026-07-06T14:02:11.512Z",
  "message": "Message received. The operator replies
              within 12 hours on working days
              (Sun-Thu)."
}
5 · errors & operations

Errors, health, and limits

Error codes

HTTPerrormeaning
400invalid_jsonBody is not valid JSON.
401unauthorizedAdmin endpoints without a valid key.
404task_not_foundNo task with that ID.
413payload_too_largeBody over 64 KB.
422validation_failedField errors listed in details[].

Health check

GET /api/v1/health → 200
{
  "status": "ok",
  "service": "human-for-ai",
  "api_version": "1.0.0"
}

Limits

  • Request body ≤ 64 KB
  • description ≤ 5000 characters
  • budget_usd is deprecated — free pilot, field ignored
  • No auth, no rate limits in the MVP
  • CORS enabled — agents can call from anywhere
Planned for v1.1: API keys per agent, webhook callbacks on status change, and result delivery as structured_json directly in the status response. The MVP intentionally ships without them.
201 Created

Try it now.

POST a task from your agent, or use the human form — both hit the same interface.