Errors
The API uses conventional HTTP status codes.
The API uses conventional HTTP status codes. Errors return a JSON body with error.code, error.message, and a request_id you can attach to support tickets.
| Status | Description |
|---|---|
400 | Bad request. Invalid parameters or missing required fields. The error.code tells you exactly what to fix: invalid_json (malformed body — the message pinpoints the offending snippet and reminds you every string, including email addresses, needs double quotes), validation_error with per-field messages (e.g. message content is required: html, text or template), template_not_found (the template id doesn't exist on your account), or an unregistered / unverified sender domain on a send. |
401 | Unauthorized. Missing or invalid API key, or a revoked key. |
402 | Payment required. Not enough verification credits for a live POST /v3/validate or POST /v3/validate/bulk (error.code: insufficient_credits). Buy a credit pack and retry; test keys are exempt. |
403 | Forbidden. Suspended or deleted account, a plan limit was reached (domains, API keys, webhook endpoints, dedicated-IP pools), a verify/delete on a domain shared from another workspace (owner-only), or a sandbox send to a recipient that isn't on the confirmed test allow-list. |
404 | Not found. The resource doesn't exist or belongs to another account. (A send referencing an unknown template id returns 400 template_not_found with instructions.) |
409 | Conflict. A request with the same Idempotency-Key is still being processed. Wait for the original to finish, then retry — you'll get the cached response. |
429 | Rate limited. Your per-account request rate, a route-level limit, or a sending / verification quota was exceeded. Back off and retry. |
500 | Server error. Retry with exponential backoff. Idempotency keys keep retries safe. |
503 | Sending paused. Live sending has been paused on the account by our team — check the Console or contact support. |