Errors
Most error responses from the send endpoint share one body. Authentication and rate-limit failures are the exceptions, and this page describes them at the end.
The shared shape:
error is a stable machine-readable code, so branch on it. message is written for a human reading
your logs and can change at any time.
422 Unprocessable Entity
The API understood the request but cannot carry it out.
contact_conflict is deliberately strict. Reusing the contact that owns that email address would
deliver your message to that contact’s phone number, so the API refuses the request instead.
404 Not Found
The conversation_id, contact_id, or inbox_id does not exist in this account. Ids from another
account read as missing, never as forbidden.
401 Unauthorized
The token is missing, invalid, or valid but issued for a different account. There is no separate
forbidden response, and both cases return 401.
This response carries only the error field:
Authorization is account-level. An API key reaches every inbox, conversation and contact in the account that issued it, and a user’s token is not narrowed to the inboxes that user is assigned in the dashboard. Treat both as account-wide credentials and store them accordingly. Issue one key per integration so you can revoke it on its own.
429 Too Many Requests
The key went over 600 requests per minute. Back off and retry.
The rate limiter returns this response before the application sees the request, so the body is plain text rather than JSON:
Partial effects
The API resolves the target before it checks the messaging window. A rejection with
outside_messaging_window can therefore leave a newly created contact and conversation behind.
This is intentional and safe to retry: the follow-up template send reuses them rather than creating
duplicates.