Errors
Every error has the same body:
Only code and message are required by the schema. Rasen sends details, request_id and
retry on every error, but parse an error that lacks them rather than failing on it.
details never contains a request fingerprint, a hash of a request, secret material or another
workspace’s data. Messages never carry a provider’s payload or a secret you submitted.
Refusals at the edge
Refusals made before an operation runs use the same envelope, with request_id and retry: a
missing or unknown key (401), an unavailable key check (503), a NUL character in a JSON string
(400 invalid_request) and a body over 1 MiB (413 payload_too_large). Their details are only
field, spelled with dots for nesting and list positions (a.0.b), or bytes and limit_bytes.
A request that no operation serves is refused the same way, with retry: "no":
A request with no key still gets the public 401 first. An unexpected fault outside an operation
also answers in the public envelope.
method_not_allowed is edge-only: it is a registered code, but no operation declares a 405, so
it is not in the contract’s error catalog or on Error codes. Treat it as a
bug in the request’s method or path, not as something to retry.
How to handle an error
- Branch on
error.code. Forconflict, branch onerror.details.reasontoo. - Follow
retry:
retry is an open vocabulary: preserve a value you do not know, and never read it as success.
For an operation that takes an Idempotency-Key, retrying internal_error, provider_unavailable,
unavailable, at_capacity or call_orchestrator_unavailable with the same key is safe: if the
first attempt took effect, the server replays its stored outcome; if it had no effect, the retry
performs the operation once. Never retry with a new key.
Conflicts
409 answers are not retryable, with one exception: idempotency_in_progress carries
Retry-After, after which you resend the identical request with the same key. For every other
409, read the current state, fix the request and send a new request.
409 conflict names its cause in details.reason. Reasons are an open list; each operation
documents the ones it can return in the API reference (x-conflict-reasons):
Common codes
The complete list of the codes this API returns, with their status, retry class and details, is on Error codes.