Errors carry an HTTP status and a body with a stable code and a human message. Match on code, never on the message.
"code": "downgrade_blocked",
"message": "You have 340 email addresses, which is more than Operator allows. Delete 90 first."
| Status |
Meaning |
Codes you may see |
| 400 |
Malformed request or invalid field |
invalid_json, invalid_field, invalid_id |
| 401 |
Missing, expired or revoked token |
unauthenticated, session_expired |
| 402 |
The plan does not allow it |
allocation_exhausted, worker_limit_reached, payment_required |
| 403 |
Not permitted for this token or plan |
plan_required, session_required, payment_required, device_paused, address_paused, not_your_address, account_suspended |
| 404 |
No such record, or not yours |
not_found |
| 409 |
Conflicts with the current state |
downgrade_blocked, already_assigned, address_taken, limit_reached, card_retrying, domain_in_use |
| 429 |
Rate limited |
rate_limited, with a Retry-After header |
| 5xx |
A failure on our side or at a provider |
internal, send_failed, provider_error. Retry with backoff. |
| Code |
What to do |
session_required |
The call needs a signed-in session. API keys cannot make it. |
plan_required |
The plan does not include this. The message names the plan that does. |
payment_required (403) |
The account is paused after a missed payment. See Missed payments. |
payment_required (402) |
A plan change needs a payment. Use checkout. |
rate_limited |
Wait for Retry-After seconds. |