Skip to main content

Errors

Every REST API error uses the same envelope. name is stable and meant for code; message is an English sentence for humans and may change.

{
"statusCode": 422,
"name": "validation_error",
"message": "to: Invalid email address"
}

As a rule, 4xx means fix the request before sending it again; 429 and 5xx are temporary, so retry with backoff (see Limits). See also the error handling guide.

REST API​

Code (name)HTTPMeaning and what to do
validation_error422The request body or a parameter is invalid; message names the field.
missing_required_field422A required field is missing.
missing_api_key401No Authorization: Bearer header.
invalid_api_key403The API key is unknown or revoked.
restricted_api_key401The key lacks the scope this endpoint needs, or is locked to other origins.
invalid_from_address403The from domain is not verified for this business (or not allowed for this key).
not_found404The resource does not exist or belongs to another business.
method_not_allowed405The HTTP method is not supported on this path.
invalid_idempotent_request400The Idempotency-Key was used before with a different body.
concurrent_idempotent_requests409Another request with the same Idempotency-Key is still running; retry shortly.
rate_limit_exceeded429Too many requests; wait for retry-after seconds.
daily_quota_exceeded429The plan's daily sending quota is used up.
invalid_attachment422An attachment is malformed, unreachable (path) or too large.
application_error500Something failed on our side; retry with backoff.
internal_server_error500Unexpected error; retry with backoff and contact support if it persists.
origin_not_allowed403The browser origin is not one of the site's domain or allowed origins.
invalid_visitor_token401The visitor token is missing, expired or for another site; bootstrap again.
invalid_agent_token401The agent token is missing or expired; sign in again.
site_disabled403The chat site is turned off.
invalid_app_key401The mobile app key (hak_…) is unknown or for another site.
app_key_revoked403The mobile app key was revoked; ship a build with a new key.
message_too_long422The message is longer than allowed (see Limits).
unsupported_file_type422This file type cannot be uploaded.
file_too_large413The file is larger than allowed (see Limits).
conversation_closed409The conversation is closed and takes no new messages.
product_not_enabled403The product is not available to this business.
product_disabled403The business switched this product off (Settings → Modules).
ai_budget_exhausted429
ai_not_configured503
ai_unavailable503
instructions_full409
forbidden403You are not allowed to do this.
last_owner409A business must keep at least one owner.
domain_taken409The domain is already used by another business.
host_missing422A host name is required.
host_mismatch422The host does not match the domain.
slug_taken409The slug is already in use.
slug_reserved422The slug is reserved.
environment_mismatch403The resource belongs to the other environment (development vs production).
no_bank_connection422Link a bank account before creating payments.
code_taken409The order or payment code is already used.
bank_link_failed422The bank refused the link; check the account details.
invalid_otp422The confirmation code is wrong.
otp_expired410The confirmation code expired; request a new one.
invalid_state409The resource is not in a state that allows this action.
provider_unavailable503The bank or invoice provider is not answering; retry later.
invoice_provider_error422The e-invoice provider rejected the request; message has its reason.

Realtime protocol​

error frames on the websocket carry one of these in d.code; codes shared with the REST API mean the same.

CodeMeaning
validation_errorThe request body or a parameter is invalid; message names the field.
rate_limit_exceededToo many requests; wait for retry-after seconds.
not_foundThe resource does not exist or belongs to another business.
unauthenticatedA frame arrived before auth succeeded.
invalid_visitor_tokenThe visitor token is missing, expired or for another site; bootstrap again.
origin_not_allowedThe browser origin is not one of the site's domain or allowed origins.
site_disabledThe chat site is turned off.
invalid_app_keyThe mobile app key (hak_…) is unknown or for another site.
app_key_revokedThe mobile app key was revoked; ship a build with a new key.
conversation_closedThe conversation is closed and takes no new messages.
file_too_largeThe file is larger than allowed (see Limits).
unsupported_file_typeThis file type cannot be uploaded.
bad_frameThe frame is not valid JSON or does not match the protocol schema.
errorAny other failure for one request.

SMTP relay​

ReplyMeaning
535 5.7.8invalid credentials (wrong API key)
530 5.7.0authentication required
550 5.7.1unauthorized or forbidden (for example an unverified From domain)
553 5.6.0invalid message (validation error)
452 5.5.3more than 50 recipients
421 4.7.0too many failed logins from this IP; try again later
451 4.3.0temporary failure; retry

View this page as Markdown