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.