Skip to main content
Every error response shares a single envelope. The HTTP status is derived from the error.type field — clients should branch on type, not on status code.

Envelope fields

Error types and status codes

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.
The id is a uuid v7, sortable by time, which makes log scans cheap. It is the single piece of context you should include in every support ticket. Do not include the request body; we can pull that ourselves from the request id.

Common error codes

A non-exhaustive list of error.code values you may encounter. Codes are stable; new ones are added without a version bump.
The evaluation id does not exist, or the caller has no permission. 404.
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.
An ak_live_* or OAuth principal lacks the scope this route demands. The message names the scope. 403.
The supplied Idempotency-Key matches a prior request, but the request body differs. 409. See Idempotency.
The route is gated to a higher pricing tier. Today this fires on webhook endpoints for Free / Team callers. 403.
Per-tier RPM cap hit. Read Retry-After. 429. See Rate limits.
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 on error.type first, error.code second. Never branch on the HTTP status — the mapping is stable but the field is the contract.

Reporting a bug

Email contact@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.