Skip to main content

Suppressions API

Keep your own system and SendMero's suppression list in step: add an address the moment someone unsubscribes, and read the list back whenever you need it.

Read The suppression list first to see what a suppressed address is. Everything below uses the same API key as sending:

Authorization: Bearer YOUR_API_KEY

The key identifies your workspace. Base URL: https://api.sendmero.com/v1/suppressions.

Add addresses​

POST /v1/suppressions adds one address or up to 1,000 in a single call.

curl --request POST 'https://api.sendmero.com/v1/suppressions' \
--header 'Authorization: Bearer YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data '{
"emails": ["jane@example.com", "john@example.com"],
"reason": "unsubscribe",
"note": "Unsubscribed on our preferences page"
}'
FieldRequiredMeaning
emailsYesA list of 1 to 1,000 addresses.
reasonNomanual (default), unsubscribe, hard_bounce or complaint. The same reason applies to every address in the call.
noteNoUp to 500 characters, kept with the entry.

Response (200):

{
"added": 1,
"already_suppressed": 0,
"invalid": 0,
"duplicate": 1,
"failed": 0,
"results": [
{ "email": "jane@example.com", "status": "added" },
{ "email": "jane@example.com", "status": "duplicate" }
]
}

Each address gets one status:

StatusMeaning
addedThe address is now suppressed.
already_suppressedIt was already on the list; it is left as it is.
invalidNot a usable email address.
duplicateThe same address appeared earlier in this call.
failedIt could not be saved. Send it again.

The call is safe to repeat: addresses that are already suppressed are not changed. An added address is blocked from the next message that SendMero processes.

List addresses​

GET /v1/suppressions returns one page, most recently seen first.

curl 'https://api.sendmero.com/v1/suppressions?reason=hard_bounce&limit=100' \
--header 'Authorization: Bearer YOUR_API_KEY'
Query parameterMeaning
searchPart of an address.
reasonhard_bounce, complaint, unsubscribe or manual.
sourceevent, import, api, dashboard, unsubscribe_link or crm_sync.
from, toA last-seen window, as dates such as 2026-10-01T00:00:00Z.
limitPage size, 1 to 200 (default 50).
cursorThe next_cursor of the previous page.
{
"data": [
{
"email": "jane@example.com",
"applies_to": "workspace",
"group": "",
"reason": "hard_bounce",
"reasons": ["hard_bounce"],
"source": "event",
"details": "550 5.1.1 The email account does not exist",
"first_seen": "2026-10-17T05:54:58.722Z",
"last_seen": "2026-10-17T05:54:58.722Z"
}
],
"next_cursor": "eyJ..."
}

applies_to is workspace (all mail) or group (an unsubscribe that applies to one sending domain, named in group). next_cursor is null on the last page. Pass it unchanged as cursor to get the next page.

Get one address​

GET /v1/suppressions/{email} returns the entry above for one address, or 404 not_found when it is not suppressed. URL-encode the address, for example jane%40example.com.

Remove an address​

DELETE /v1/suppressions/{email} lets SendMero send to the address again.

curl --request DELETE 'https://api.sendmero.com/v1/suppressions/jane%40example.com?note=Resubscribed' \
--header 'Authorization: Bearer YOUR_API_KEY'
Query parameterMeaning
noteWhy you removed it. Kept in your audit log.
confirm_opt_in=trueRequired for an unsubscribed address: it confirms the recipient opted in again.

Response: { "removed_reasons": ["manual"] }.

Spam complaints cannot be removed through the API. An owner or admin can remove them in the dashboard.

Errors​

Errors use the standard format.

Statuserror.codeMeaning
400invalid_requestA parameter or the emails list is missing or not valid.
400invalid_jsonThe body is not valid JSON.
400invalid_reasonreason is not one of the four values.
400invalid_notenote is longer than 500 characters.
400too_many_addressesMore than 1,000 addresses in one call.
400invalid_addressThe address in the path is not a valid email address.
400opt_in_requiredRemoving an unsubscribed address needs confirm_opt_in=true.
401missing_api_key, invalid_api_keyThe key is missing, wrong, revoked or expired.
403complaint_removal_forbiddenSpam complaints cannot be removed with the API.
404not_foundThe address is not on the list.
405method_not_allowedThe method is not supported on that path.
413payload_too_largeThe request body is too large.
429rate_limit_exceeded, busyToo many requests. Wait for Retry-After and try again.
503service_unavailableTry again shortly.

Limits​

Suppression calls have their own limit of 1,000 requests per 10 seconds per workspace. They do not use up your sending limit. To add many addresses, send them in batches of up to 1,000 rather than one call per address.