Skip to main content
All errors share one envelope. details appears only on errors that carry structured context (validation, suppression, scope):
Raw provider, database, and driver errors are never serialized — you only ever see a stable code plus a plain-language message.

Authentication & authorization

Inboxes

Sending

Drafts & scheduling

Webhooks, keys, domains, threads, attachments, suppressions

Debugging guidance

  • invalid_api_key right after creating a key: you are sending the prefix, not the raw key. Only the one-time apiKey value authenticates.
  • insufficient_scope: read requiredScope in the response and mint a key that includes it — do not downgrade the endpoint call.
  • recipient_suppressed: query GET /v1/suppressions?reason=… for the address; details.source tells you whether a provider event or a human added it.
  • limit_reached vs spend_cap_reached: both are 402, but the fix differs — overage/upgrade for the former, Billing → Spend protection for the latter.
  • sending_not_approved: check reason/action in the response for the tripwire that fired before contacting support.
  • email_delivery_failed: safe to retry — quota was refunded automatically.