Generated from source at build time — this page cannot drift from the running service.
Error codes
Every error is one code, one status, one message:
{ "error": { "code": "insufficient_scope", "message": "…", "requestId": "…" } }
| Code | Status | Default message |
|---|---|---|
tenant_missing |
400 | Missing tenant (X-Axis-Tenant). |
idempotency_key_required |
400 | This write requires an Idempotency-Key header. |
missing_credentials |
401 | Missing or malformed credentials. |
invalid_api_key |
401 | API key not found or revoked. |
invalid_jwt |
401 | Realtime token is invalid or expired. |
reauth_required |
401 | This account needs to be reconnected — its authorization has expired. |
key_revoked |
403 | API key not found or revoked. |
insufficient_scope |
403 | The credential lacks the required scope. |
tenant_not_authorized |
403 | The credential is not authorized for this tenant. |
not_found |
404 | Resource not found. |
idempotency_conflict |
409 | Idempotency-Key was reused with a different request body. |
idempotency_in_progress |
409 | A request with this Idempotency-Key is still in progress. |
account_claimed_elsewhere |
409 | This account is connected natively in another workspace. Disconnect it there before connecting it here. |
conflict |
409 | That conflicts with the current state of the resource. |
validation_failed |
422 | Request validation failed. |
capability_unavailable |
422 | That capability is not available for this connection. |
messaging_window_expired |
422 | The messaging window for this conversation has expired. |
rate_limit_exceeded |
429 | Too many requests. |
internal |
500 | Something went wrong. Please try again. |
Codes never say which check failed
invalid_api_key covers "no such key", "revoked", "expired" and "grants no resolvable app". This
is deliberate — a precise message is a probing oracle. Debug with the requestId, which appears
on the response, in meta.requestId, and in the service logs.
For the same reason, an exception that is not an AxisError is coerced by HTTP status, so a raw
403 surfaces as insufficient_scope and a raw 409 as idempotency_conflict regardless of the
underlying cause.
Two that are easy to confuse
validation_failed (422) means the request is wrong. conflict (409) means the request is
fine but the world is not in a state that permits it — the one-open-ticket-per-thread rule is
enforced by a partial unique index, and its violation surfaces here rather than as a Prisma error.
idempotency_conflict (409) is narrower still: the same Idempotency-Key was replayed with a
different body.