Every error response shares a single envelope. The HTTP status is derived from theDocumentation Index
Fetch the complete documentation index at: https://docs.autousers.ai/llms.txt
Use this file to discover all available pages before exploring further.
error.type field — clients should branch on type,
not on status code.
Envelope fields
| Field | Type | Always set | Notes |
|---|---|---|---|
message | string | yes | Human-readable. Self-sufficient for surfacing to end users. |
type | enum | yes | One of six values, see below. |
code | string | no | Machine-readable sub-classifier (e.g. evaluation_not_found). |
param | string | no | The offending request field, when applicable (type: invalid_request_error). |
doc_url | string | no | Link to the relevant doc page. |
request_id | string | yes | uuid v7. Same value as the X-Request-Id response header. |
details | object | no | Structured context. Today only set for cross-team authorization_error (code: evaluation_no_access). Treat as additive — message always tells the full story. |
Error types and status codes
error.type | HTTP status | When |
|---|---|---|
authentication_error | 401 | Missing, malformed, expired, or revoked credentials. |
authorization_error | 403 | Authenticated, but lacks the required scope or team permission. |
invalid_request_error | 400 | Malformed JSON, validation failure, missing required field. |
not_found_error | 404 | Resource does not exist, or the caller has no permission to see it. |
rate_limit_error | 429 | Per-tier RPM or monthly quota exceeded. Carries Retry-After. |
api_error | 500 | Unexpected server error. Quote the request_id to support. |
We conflate “not found” and “no permission” by design. A 404 from
/v1/evaluations/{id} means either “no such row” or “you lack membership on
its team” — we don’t disclose which, to avoid leaking the existence of
resources to outsiders.X-Request-Id
Every response — success or error — carries an X-Request-Id header.
Error responses also embed the same value in error.request_id so it
survives a copy-paste from a screenshot.
Common error codes
A non-exhaustive list oferror.code values you may encounter. Codes
are stable; new ones are added without a version bump.
evaluation_not_found
evaluation_not_found
The evaluation id does not exist, or the caller has no permission. 404.
evaluation_no_access
evaluation_no_access
Cross-team request — the resource exists but lives on a team the caller is not
a member of. The
details field carries the resource team name and the
caller’s email so the UI can render a “switch account” empty state. 403.missing_required_scope
missing_required_scope
An
ak_live_* or OAuth principal lacks the scope this route demands. The
message names the scope. 403.idempotency_key_reused
idempotency_key_reused
The supplied
Idempotency-Key matches a prior request, but the request body
differs. 409. See Idempotency.plan_upgrade_required
plan_upgrade_required
The route is gated to a higher pricing tier. Today this fires on webhook
endpoints for Free / Team callers. 403.
rate_limit_exceeded
rate_limit_exceeded
Per-tier RPM cap hit. Read
Retry-After. 429. See Rate
limits.quota_exceeded
quota_exceeded
Monthly quota for autouser ratings, human ratings, or evaluations exhausted.
429. Carries no
Retry-After — the quota resets at the start of the next
billing period.Handling errors
Branch onerror.type first, error.code second. Never branch on the
HTTP status — the mapping is stable but the field is the contract.
Reporting a bug
Emailcontact@autousers.ai with the request_id, the route, and the
local time of the request. Do not paste the request body — we can pull
it. Do not paste the API key — we cannot help if you do, and will
revoke the key on receipt.