Errors
Every error response is JSON. The shape depends on which framework layer generated
it, but every error has at least a message field.
The envelope
{
"message": "The given data was invalid.",
"errors": {
"email": [
"The email field is required."
]
}
}
Status code catalog
400 Bad Request
The body is malformed JSON, or the request includes a field that the endpoint does not recognize.
401 Unauthorized
The bearer token is missing, expired, or revoked. Refresh the token and retry.
{"message": "Unauthenticated."}
403 Forbidden
The token is valid but does not include the scope required for this endpoint, or the authenticated user does not have access to the requested resource.
404 Not Found
The resource does not exist, or it exists but belongs to a different organization (the API does not distinguish between the two).
405 Method Not Allowed
The HTTP verb is not supported by this path. Check the API reference.
409 Conflict
A handful of endpoints (for example, batch update of conversations) return 409 when the request makes sense but the underlying state machine rejects it (for example, trying to set a status that is not reachable from the current state).
412 Precondition Failed
Returned by POST /v1/inboxes/{inbox_id}/batch/update when no
update field is provided.
{"message": "Nothing to update"}
422 Unprocessable Entity
The request body failed validation. The errors object is
keyed by field name with an array of human-readable messages.
{
"message": "The given data was invalid.",
"errors": {
"email": [
"The email has already been taken."
],
"tags": [
"The tags field is required."
]
}
}
429 Too Many Requests
Rate limit exceeded. See Pagination & rate limits
for the rate-limit tiers (including the global 300 req/min limit) and the
Retry-After header semantics.
{"message": "Too Many Attempts."}
500 Server Error
Unexpected exception. The API does not return a stack trace in production. The incident is logged server-side with a UUID. Include the request ID when contacting support.
503 Service Unavailable
Returned by POST /v1/auth/registration/register when the signup pipeline
is temporarily unavailable.
{"message": "Registration Failed."}
Error codes on auth endpoints
Several auth endpoints return a machine-readable error code alongside
the human-readable message:
| Code | Where | Meaning |
|---|---|---|
ERROR_EMAIL_INVALID | validate-email, register | Address is malformed or in a blocked domain. |
ERROR_EMAIL_TAKEN | validate-email, register | Already a user with this address. |
ERROR_EMAIL_PENDING_APPROVAL | login, validate-email, register | Account exists but is awaiting approval. |
ERROR_EMAIL_FLAGGED | register | Address is on a block list. |
ERROR_SLUG_TAKEN | validate-subdomain | Subdomain is already in use. |