Skip to content

Errors reference

Every error response uses the same envelope. Branch on the code: it is a stable part of the contract. A code is never renamed or removed without a major version change; new codes are additive.

{
"code": "VALIDATION_ERROR",
"message": "phone_number must be a valid E.164 number.",
"request_id": "b3f1c8d2-2b9e-4c5e-8a1f-2c7d6a9e4b1a",
"details": { "field": "phone_number" }
}

message is human-readable and may change. request_id (also in the X-Request-Id header) identifies the request for support. details is optional and depends on the code.

CodeWhen
AUTH_MISSING_API_KEYNo x-api-key header was sent.
AUTH_INVALID_API_KEYThe key does not match any active key.
AUTH_REVOKED_API_KEYThe key was revoked.
AUTH_EXPIRED_API_KEYThe key passed its expiry date.
CodeWhen
AUTHORIZATION_FORBIDDENThe key is valid but not allowed to perform this action.
CodeWhen
VALIDATION_ERRORThe request body or query is malformed. details.field points at the offending field when it can be isolated.
CodeStatusWhen
RESOURCE_NOT_FOUND404The referenced resource does not exist.
RESOURCE_CONFLICT409The request conflicts with the current state of the resource.
CodeStatusWhen
IDEMPOTENCY_KEY_REQUIRED400The endpoint requires an Idempotency-Key header and none was sent.
IDEMPOTENCY_KEY_INVALID400The Idempotency-Key is malformed.
IDEMPOTENCY_CONFLICT409The same key was reused with a different request body.
IDEMPOTENCY_IN_PROGRESS409A request with the same key is still being processed. Retry shortly.

The Idempotency-Key header is optional on every endpoint today, so IDEMPOTENCY_KEY_REQUIRED is reserved for any future endpoint that opts into requiring it. See the idempotency guide for the full semantics.

CodeWhen
RATE_LIMIT_EXCEEDEDYou exceeded the per-organization rate limit. Back off and retry.
CodeStatusWhen
PAYLOAD_TOO_LARGE413The request body exceeds the size limit.
UNSUPPORTED_MEDIA_TYPE415The Content-Type is not application/json.
CodeWhen
INTERNAL_ERRORAn unexpected server-side failure. Safe to retry with back-off. Quote the request_id if it persists.