Error format
API endpoint errors follow this envelope:| Field | Description |
|---|---|
code | A machine-readable error code (see table below) |
message | A human-readable description of what went wrong |
details | An optional array of field-level errors (present on validation failures) |
Error codes
This table also includes OAuth token endpoint errors. Those happen before you have a bearer token and are returned by/oauth/token.
| Code | HTTP Status | Description |
|---|---|---|
invalid_client | 401 | Client ID or client secret is incorrect. Returned by the /oauth/token endpoint. |
invalid_scope | 401 | The requested OAuth scope is not enabled on the application. Returned by the /oauth/token endpoint. |
unauthorized | 401 | Bearer token is missing, expired, revoked, or invalid. OAuth access tokens expire after 2 hours. API token lifetimes depend on the expiration chosen when the token was created. |
insufficient_scope | 403 | Token does not have the required scope for this endpoint. See Scopes. |
not_found | 404 | The contact could not be found |
conflict | 409 | A contact with this email or phone number already exists |
validation_failed | 422 | One or more fields failed validation |
rate_limited | 429 | Rate limit exceeded — see Rate Limits |
Validation errors
A422 validation_failed response includes a details array with specific field errors. For example, creating a contact without an email or phone number returns:
| Field | Message |
|---|---|
email / phone_number | email or phone_number is required |
phone_number | must be a valid phone number in E.164 format |
email_consent | must be one of: subscribed, unsubscribed, never_subscribed, suppressed |
sms_consent | must be one of: subscribed, unsubscribed, never_subscribed, single_opt_in |
sms_consent | requires a phone number from a supported country |
custom_fields | must be a flat key-value object (no nested values) |
Conflict errors
A409 conflict is returned when you try to create a contact with an email or phone number that already belongs to an existing contact. The response includes the id of the existing contact so you can update it directly.
id.
Handling errors
- Check the HTTP status code first. The status code tells you the category of error.
- Parse the error body. Use the
codefield for programmatic handling and themessagefor logging. - Only retry on
429. Rate limit errors are temporary — wait forRetry-Afterseconds, then retry. Other errors require fixing the request.