Reference

Errors

Every error code the API returns, its HTTP status, what it means, and what to do.

The error shape

{
  "error": {
    "code": "idempotency_conflict",
    "message": "Idempotency key was used for a different email",
    "transient": false
  }
}

code is stable and meant for programs. message is for people and may change. transient: true means the same request may succeed if you retry later; false means retrying without a change will fail the same way.

The CLI prints the same object on stderr and exits 1. The MCP server returns it as the tool result with isError: true.

Codes

Authentication and access

CodeStatusMeaningWhat to do
unauthorized401Missing, malformed, expired, or revoked keyCreate or rotate the key in the dashboard
invalid_token401The bearer value is not a recognized keyCheck the environment variable
forbidden403The key lacks the operation's scope, or a mailbox key reached for another inboxUse a key with the right scope
access_denied403The account is disabledContact the operator
quarantine_review_required403An API key tried to add or remove quarantinedRelease from the dashboard
message_quarantined403Reply to, or read the body of, a quarantined messageRelease from the dashboard first
malware_blocked403The message's attachments failed scanningCannot be released

Requests

CodeStatusMeaningWhat to do
invalid_request400, 415, 422Malformed JSON, wrong content type, or a bad pathFix the request
invalid_argument422A field failed validation; the message names itFix the field
not_found404Inbox, message, thread, attachment, or route does not exist, or is not visible to this keyCheck the identifier and encoding
inbox_retired410The inbox was deletedCreate a new inbox with a different username

Inboxes and domains

CodeStatusMeaningWhat to do
inbox_conflict409The address exists under a different ownerChoose another username
inbox_limit422The account's operator-set inbox quota is reachedDelete an inbox or ask for a higher quota
billing_limit402The plan's inbox, send, or triage allowance is spentA person upgrades or adds capacity in the dashboard; then retry (sends with the same idempotencyKey)
key_limit422The account already has 20 active API keysRevoke one
routing_conflict409The address already has a delivery rule that is not oursChoose another username
domain_not_configured422The domain is not set up on this deploymentAdd it in the dashboard
domain_not_ready422The domain's DNS records are not verifiedPublish the records and verify
domain_conflict409The domain is claimed by another accountUse a different domain
customer_exists409An account with that identity already existsSign in instead

Sending

CodeStatusMeaningWhat to do
idempotency_conflict409The key was used with different contentsUse a new key for the new message
send_pending409A send with this key is still in progressWait, then retry with the same key
rate_limited429The inbox reached its rolling 24-hour send limitWait, then retry with the same key
delivery_uncertain502The outbound path did not confirm; the send may or may not have goneRetry with the same key; the server resolves it
delivery_busy503Outbound capacity is saturatedRetry with the same key later
message_pending503The message is still being processedRetry shortly
attachment_storage_error503Attachment storage was unavailableRetry with the same key

Service

CodeStatusMeaningWhat to do
not_configured503A feature is not enabled on this deploymentOperator action
billing_unavailable503The billing provider did not answer, so a metered operation was refusedRetry; sends keep the same idempotencyKey
dns_unavailable503DNS lookups failed during verificationRetry
scanner_unavailable, scan_required503Inbound scanning is unavailable or incompleteRetry
provider_error, provider_response, provider_unavailable, gateway_error502An upstream provider failed or answered unexpectedlyRetry; report if it persists
internal_error500Unexpected failureRetry; report if it persists

Client-side (CLI and stdio MCP server)

CodeMeaning
network_errorThe request did not complete. The outcome is unknown; retry a send with the same idempotencyKey. transient: true.

Retrying