Reference
Error Codes
All errors follow a consistent JSON format with a human-readable message and a machine-readable code.
All errors follow a consistent JSON format with a human-readable message and a machine-readable code.
{
"error": "Invalid API key",
"code": "UNAUTHORIZED"
}| Code | Status | Description |
|---|---|---|
UNAUTHORIZED | 401 | API key is missing, invalid, or revoked. |
FORBIDDEN | 403 | API key does not have permission for this action. |
NOT_FOUND | 404 | The requested resource does not exist. |
VALIDATION_ERROR | 400 | Request body failed validation. Check the error message for details. |
CONFLICT | 409 | Resource already exists (e.g. duplicate domain). |
RATE_LIMITED | 429 | Too many requests. Back off and retry. |
DAILY_LIMIT_EXCEEDED | 429 | Daily send ceiling reached; resets at midnight UTC. On the Free plan the cap is a flat 100/day and does not change with account age. On a paid plan the ceiling is derived from your own sending and lifts as soon as you have a clean delivery record. |
PLAN_LIMIT_EXCEEDED | 403 | Action not allowed on your current plan (e.g. domain or contact limit reached, or sending a broadcast to an audience on the free plan). |
DOMAIN_NOT_VERIFIED | 403 | A domain in the request is not verified for your organisation. Usually the sender domain. Also returned by POST /broadcasts/:id/test when a RECIPIENT is neither a team member's account email nor on one of your verified domains — a test send may only reach inboxes you control. |
ALL_SUPPRESSED | 422 | All recipient addresses are on the suppression list. |
RECIPIENT_DOMAIN_UNDELIVERABLE | 422 | A recipient's domain can never receive mail — it publishes no mail exchanger (no MX, an RFC 7505 null MX, and no A/AAAA to fall back on), or it is an RFC 2606 reserved name such as example.com or anything under .invalid/.test. Usually a typo or a documentation placeholder. Live sends only; test-mode keys are not checked. Nothing was sent and no quota was used. |
SENDING_SUSPENDED | 403 | Account suspended due to a high bounce or complaint rate in the last 7 days. Contact support@eusend.dev to reinstate. |
ACCOUNT_RESTRICTED | 403 | The account is held pending review because it resembles one we have previously had to stop. Not a verdict on anything you have sent — a restricted account is held before its first send. Shared office networks, VPNs and mobile carriers all produce false matches; email support@eusend.dev and a human reviews it the same day. |
SENDER_NOT_PERMITTED | 403 | The from header was refused for one of two reasons. Either the display name claims to be a brand your sending domain has no relationship to (for example Adobe Support <billing@yourdomain.com>) — send it again with a display name that matches the domain you have verified. Or the account is temporarily limited to sender identities it has already used, in which case the message names the from value that was refused; existing senders keep working and support@eusend.dev can add a new one. In both cases only this message was refused, not the account. |
MONTHLY_LIMIT_EXCEEDED | 429 | Monthly send budget reached. With metered billing off (the default) this is your monthly quota — enable it in billing settings to keep sending. With it on, this is the hard ceiling: the point at which the overage would have cost the price of the next volume up (twice your quota at the top volume, where there is no next one), which support must raise. |
LIST_SEND_HELD | 403 | This send goes past the 500-recipient allowance an unreviewed account has for list sending. Recipients within the allowance were delivered; the rest waits for a one-time review. Retrying will not clear it; contact support@eusend.dev. |
BROADCAST_HELD | 403 | Fan-out is paused. Either this broadcast used its unreviewed allowance and the remainder is waiting on a review — it resumes from where it stopped once cleared, and unlike a paused broadcast, sending again will not restart it — or fan-out is paused account-wide while we review recent sending, which clears on its own within a day. Transactional sends and test copies are unaffected in both cases. |
SERVICE_PAUSED | 503 | Sending is temporarily paused platform-wide. Retry after a short delay. |
ATTACHMENT_STORAGE_ERROR | 503 | An attachment could not be stored. The send did not happen — retry the request. |
BAD_REQUEST | 400 | The request was malformed and could not be processed. |
PAYLOAD_TOO_LARGE | 413 | The request body exceeds the 16 MB limit. Note that base64-encoded attachments are ~33% larger than the underlying files. |
INTERNAL_ERROR | 500 | An unexpected server error occurred. Retry after a short delay. |