Documentation Index
Fetch the complete documentation index at: https://docs.awaithumans.dev/llms.txt
Use this file to discover all available pages before exploring further.
await_human() rather than calling this directly. Use this endpoint when:
- You’re building a non-SDK client
- You want to create a task without polling (e.g. fire-and-forget with
callback_url) - You’re testing the wire format
Request
| Field | Type | Required | Description |
|---|---|---|---|
task | string | yes | Human-readable description (shown in UIs). |
payload | object | yes | Data the human reviews. |
payload_schema | JSON Schema | yes | Schema for payload. The dashboard validates against it. |
response_schema | JSON Schema | yes | Schema for the response. Drives the form UI. |
form_definition | object | null | no | Channel-specific UI hints (the SDK extracts this from Pydantic / Zod). Optional — falls back to generic JSON Schema rendering. |
timeout_seconds | int | yes | 60 to 2,592,000. |
idempotency_key | string | yes | Application-controlled. See Idempotency. |
assign_to | object | null | no | Routing. See Routing. |
notify | string[] | null | no | Channel destinations. |
verifier_config | object | null | no | Server-side verification. See Verifier. |
redact_payload | bool | no | Default false. Skips audit logging of response keys + verifier prompt. |
callback_url | string | null | no | URL to POST to on terminal status (Temporal/LangGraph adapters use this). |
Response
Idempotency behavior
Strict Stripe-style: same key, same task, always. If any task withidempotency_key already exists — terminal or not — the response is 200 OK with the existing task. The client should treat this as success and proceed to poll. If the existing task is already terminal, the next poll returns immediately with the stored response (for completed) or the appropriate terminal status (for timed_out, cancelled, verification_exhausted), and the SDK translates those into typed errors.
This is what makes direct-mode await_human() resumable across agent restarts: a re-invocation with the same key after the human completed during your downtime returns the stored decision instead of creating a duplicate ticket.
To create a fresh task for the same logical event (e.g. a yesterday’s task timed out and you want a new review today), pass a distinct key — convention is to suffix with a retry counter:
Errors
| Status | error_code | Cause |
|---|---|---|
| 400 | (validation) | Body shape mismatch. |
| 401 | — | Missing or wrong Authorization header. |
| 403 | — | Caller is a logged-in non-operator. |
| 422 | (validation) | timeout_seconds out of range, etc. |
Notification side-effects
Channel notifications fire in aBackgroundTask AFTER the response is sent — a slow Slack API call won’t block your task creation, and a Slack outage won’t fail a successful task write. The dashboard sees the task immediately regardless.