Skip to content
Docs / Errors Pages

Errors

Every error answers with the same shape (API › Errors). Branch on code; follow next_step.message; use next_step.url, next_step.api and next_step.cli when they are there. An error never holds on to an Idempotency-Key: after fixing the cause, retry the same request with the same key.

Code HTTP In short
invalid_request 400 the request is malformed or a value is wrong
authorization_pending 400 a CLI sign-in nobody has approved yet
access_denied 400 the person refused a CLI sign-in
expired_token 400 a CLI sign-in's code expired or was used
unauthorized 401 no key, or a key we don't know
insufficient_funds 402 the wallet or a cap cannot pay for this
forbidden 403 the key may not do this
not_found 404 no such thing in this workspace, or no such endpoint
idempotency_conflict 409 an Idempotency-Key was reused for another request
rate_limited 429 too many requests; wait Retry-After
internal_error 500 something failed on our side
capacity_full 503 cells are full and you asked not to queue
capacity_unavailable 503 no cell serves this class and residency at all

invalid_request

400. The body is not valid JSON, a field is missing or out of range (a class that does not exist, a size the class does not sell, a limit too large), Raw-Version names a version that does not exist, Idempotency-Key is not 1 to 255 characters, Raw-Workspace is not a workspace id, or a personal token names no workspace for a request that acts in one. message names the field and what it should be. Fix the request; sending it unchanged gets the same answer.

authorization_pending

400. The answer to polling POST /v1/device/token while nobody has approved the sign-in yet (RFC 8628). Keep polling, no faster than every interval seconds of the sign-in, until it is approved, refused or expired. The CLI does this for you.

access_denied

400. The person refused this sign-in on the console's page. The code is spent; start a new sign-in (raw login) if it was refused by mistake.

expired_token

400. The device code is unknown, past its ten minutes, or was used already (a sign-in gives its token once). Start a new sign-in: POST /v1/device/code, or raw login.

unauthorized

401. The Authorization header is missing or malformed, or holds a key or token that does not exist or was revoked. Send Authorization: Bearer with a live API key (rc_live_…; next_step.url is the console's API keys page) or the CLI's personal token (rc_pat_…; next_step.cli is raw login).

insufficient_funds

402. The org's wallet, or a budget cap, cannot pay for a new sandbox: the workspace's budget says can_start: false. next_step.url is the console's billing page and next_step.api the budget (GET /v1/workspaces/{id}/budget). Top up or raise the cap, then retry the same request with the same Idempotency-Key.

forbidden

403. The key is valid, but this needs more than it holds: a viewer key cannot create sandboxes or keys, and the wallet answers only keys of an org owner or billing member (any key can read its workspace's budget instead). A workspace's people, invitations, name and residency are its admins': a workspace key is never an admin, so it is told to sign in to the CLI as one (next_step.cli is raw login), and a personal token of a member below admin to ask one (raw members list). Keys act only in their own workspace (naming another with Raw-Workspace is refused), personal tokens only where their person holds a relation, and neither ever at org level: an org's owners, its name and its money are changed in the console, which next_step.url names (API › Only in the console). Use a key with the relation this needs, made by a person who holds it.

not_found

404. Nothing with that id exists in the workspace the request acts in, or no endpoint answers that method and path (then next_step.url is the OpenAPI document). Ids are typed (ws_, key_, sbx_, …); check that the id is complete and belongs to the workspace the request acts in.

idempotency_conflict

409. The Idempotency-Key was used in the last 24 hours, by the same API key, for a different request (another method, path or body). Send the original request to get its answer, or use a new key for new work. The same code answers a request whose key is still being answered by an earlier one; retry it in a moment.

rate_limited

429. Too many requests in a short time: more than an API key may send to /v1, or more sign-in, sign-up, password-reset, verification or CLI sign-in attempts than one address may make (Limits › Rate limits). Retry-After gives the seconds to wait and retry_at the time (RFC 3339), so nothing parses message. Retry the same request then, with the same Idempotency-Key.

internal_error

500. Something failed on our side, not in your request. Nothing was kept under the Idempotency-Key, so retry the same request with the same key; if it keeps failing, tell us.

capacity_full

503. Cells that serve the class and residency exist, but they are full, and the request said "on_full": "fail". Retry-After gives the seconds until room is expected and retry_at the time (RFC 3339), so nothing parses message. Retry then, or leave out on_full to wait in the queue instead (Concepts › The queue).

capacity_unavailable

503. No cell serves the requested class in the workspace's residency, so the request cannot be queued: nothing would ever drain it. There is no Retry-After. This is the answer to every sandbox create during early access, whatever on_full says; next_step.url is the early-access note.