recipient_suppressed (422) before any quota is consumed.
Reasons
Hard bounces and complaints also update the matched message (
status: "bounced" / "complained") and emit email.bounced / email.complained webhooks. Sustained bad reputation can pause sending workspace-wide — see Troubleshooting.
Send-time enforcement
EveryPOST /v1/messages/send checks all recipients (to, cc, bcc) against the list first:
Response (422)
Manage via API
suppressions:read; adding and removing require suppressions:write. Adding an already-suppressed address updates its reason instead of duplicating it. Removing a missing id returns suppression_not_found (404).
One-click unsubscribe
Outbound mail carries an RFC 8058List-Unsubscribe link pointing at POST /v1/unsubscribe?token=… (mail clients fire this automatically) plus a browser-friendly GET /v1/unsubscribe?token=… page that confirms visually. Both are public — no API key needed — and both record an unsubscribe suppression and emit an email.unsubscribed webhook.
cURL
Response
missing_token (400); an invalid or expired token returns invalid_or_expired_token (400). The GET variant renders the same outcomes as HTML pages for humans clicking the link.
Treat complaints and unsubscribes as permanent. Re-adding a
complaint or unsubscribe address manually risks provider-level reputation damage — only do so with the recipient’s explicit renewed consent.