Suppressions
A suppression is an address you have asked us never to mail again — bounced, complained, or added by hand. List with filters, look one up, add one, remove one. Removal is audited. An entry that exists because of an erasure is locked — removing it would let us mail an erased person again.
Authentication
Read paths require suppressions:read. Create and delete require suppressions:write.
Endpoints
reason on create is one of manual, bounce, complaint, unsubscribe. Email is lowercased. Re-adding an address already on the list returns 200 with already_suppressed: true, not a second row.
List
Keyset page of every live suppression on this account. Filter with ?email= or ?reason=. Same cursor shape as every other list.
{
"data": [
{
"id": 1,
"email": "[email protected]",
"reason": "manual",
"source": "api",
"detail": "support ticket 12",
"suppressed_at": "2026-08-06T08:11:01+00:00",
"expires_at": null,
"erasure_locked": false
}
],
"next_cursor": null
}Show
One row by id. Same body as lookup, but the key is the id, not the address. Cross-account is 404.
{
"data": {
"id": 1,
"email": "[email protected]",
"reason": "manual",
"source": "api",
"detail": "support ticket 12",
"suppressed_at": "2026-08-06T08:11:01+00:00",
"expires_at": null,
"erasure_locked": false
}
}Worked example
{
"data": {
"id": 1,
"email": "[email protected]",
"reason": "manual",
"source": "api",
"detail": "support ticket 12",
"suppressed_at": "2026-08-06T08:11:01+00:00",
"expires_at": null,
"erasure_locked": false
}
}{
"data": {
"id": 1,
"email": "[email protected]",
"reason": "manual",
"source": "api",
"detail": "support ticket 12",
"suppressed_at": "2026-08-06T08:11:01+00:00",
"expires_at": null,
"erasure_locked": false
}
}{
"data": {
"id": 1,
"email": "[email protected]",
"reason": "manual",
"source": "api",
"detail": "support ticket 12",
"suppressed_at": "2026-08-06T08:11:01+00:00",
"expires_at": null,
"erasure_locked": false
},
"already_suppressed": true
}{
"message": "[email protected] removed — sending to it is allowed again."
}Erasure lock
When a person is erased, their identity survives on the suppression list as an erased:… HMAC so the account can never mail them again. Those rows set erasure_locked: true. DELETE against one returns 409 with type: erasure_locked. Do not retry — the lock is the point.
{
"message": "This entry survives an erasure request. Removing it would defeat the erasure, so it is locked.",
"type": "erasure_locked"
}Responses & failures
{ "message": "Unauthenticated" }{ "message": "Forbidden" }{
"message": "Not suppressed"
}{
"message": "This entry survives an erasure request. Removing it would defeat the erasure, so it is locked.",
"type": "erasure_locked"
}