Skip to main content
An error means the request could not be evaluated at all. Every error is an RFC 9457 problem detail, sent as application/problem+json, with a stable code you can branch on.
A decision is never an error. deny and escalate are 200 responses that carry a decision, reasons and sometimes a remedy. Their codes are listed in Reason codes.

The problem format

The OAuth endpoints are the exception: their 400 and 401 responses use the format their RFCs define, such as {"error": "invalid_grant", "error_description": "…"}, so OAuth libraries can read them. Each endpoint lists its error values. Their 429 and 5xx responses are problem details.

Handling errors

  • Branch on code, then on status. Treat an unknown code by its status.
  • Retry only the codes marked below, and always with the same Idempotency-Key. A new key on an unknown outcome can run the request twice. See Idempotency.
  • When an error stops a check, do not generate a named talent. When it stops a generation, do not deliver the output. See Failure modes.

Error codes

400 Bad request

401 Unauthorized

403 Forbidden

platform_not_permitted applies only when you name a license. Without one, the check is decided instead: when no license the licensee holds covers the talent on your platform, the result is a 200 with decision: "deny" and the reason code platform_not_licensed.

404 Not found

409 Conflict

413 Payload too large

422 Unprocessable

429 Too many requests

5xx Server errors

A 503 or a timeout on a check is not permission. Without an allow and an unexpired authorization, do not generate a named talent. See Caching and outages.

Reason codes

Why a use was denied or escalated, and what to show.

Idempotency

Retry safely with the same key.