Suppressions
The suppression list holds the addresses and domains that anymail never emails. The one-click unsubscribe link writes to the same list. The engine checks the list on every send attempt, without a cache.
| Method | Path | Action |
|---|---|---|
POST |
/api/v1/suppressions |
Exclude an address or a domain |
GET |
/api/v1/suppressions |
List the suppression list of the workspace |
DELETE |
/api/v1/suppressions/{id} |
Remove an entry |
Exclude an address or a domain#
The endpoint honours an Idempotency-Key.
Body (JSON, up to 4 KiB)
| Field | Type | Required | Notes |
|---|---|---|---|
target |
string | Yes | An email address such as jane@example.com, or a bare domain such as example.com. |
curl -X POST "https://app.anymail.watch/api/v1/suppressions" \
-H "Authorization: Bearer $ANYMAIL_TOKEN" \
-H "Content-Type: application/json" \
-d '{"target":"example.com"}'
Response 201
{ "id": "d5e6f7a8-0000-4000-8000-000000000001", "kind": "domain", "value": "example.com" }
kind is email or domain. value is the normalised target.
Errors
| Status | Message |
|---|---|
400 |
The body errors listed on Errors. |
400 |
`target` must be a non-empty string — an email address or a domain. |
400 |
`target` is not a valid email address or domain (e.g. acme.com). |
409 |
<value> is already excluded. The body has "code": "duplicate", kind and value. The target is already unreachable, so the goal is met. |
500 |
Couldn't exclude it: <message> |
List suppressions#
| Parameter | Type | Notes |
|---|---|---|
kind |
string | email or domain. |
limit |
integer | 1 to 100. Default 50. |
cursor |
string | See Pagination. |
curl "https://app.anymail.watch/api/v1/suppressions?kind=email" \
-H "Authorization: Bearer $ANYMAIL_TOKEN"
Response 200
{
"data": [
{
"id": "d5e6f7a8-0000-4000-8000-000000000002",
"kind": "email",
"value": "jane@example.com",
"reason": "Excluded via the API.",
"created_at": "2026-09-03T00:00:00.000+00:00"
}
],
"next_cursor": null
}
The list shows only the suppressions of the workspace. The global anymail list, which also applies when you send, is not visible through the API.
Remove a suppression#
DELETE /api/v1/suppressions/{id} does what Remove does in Settings, Suppressions. The response is 204 with no body.
curl -X DELETE "https://app.anymail.watch/api/v1/suppressions/d5e6f7a8-0000-4000-8000-000000000001" \
-H "Authorization: Bearer $ANYMAIL_TOKEN"
The engine reads the list on every send attempt, so the address is reachable from the next attempt. Enrolments that stopped earlier because of the suppression are not revived, as after a click in the app.
Errors: 404 with {"error":"Suppression not found."} for an unknown id, an id from another workspace, an id that is not a UUID and an id from the global list.