Skip to content
Sendtier Docs

Suppressions

Protect recipients from further sends after a bounce, complaint or manual block.

Suppressions are account-wide. Reasons are bounce, complaint and manual. The API accepts only manual additions; provider events add bounce and complaint entries. Recipient addresses are stored in lowercase, without a display name. These routes need a full key.

Add a manual suppression

POST /suppressions requires email. reason accepts only manual, which is the default. A new entry returns 201. An existing account entry returns 200 and is left unchanged, including a bounce or complaint reason. Idempotency-Key is optional.

curl https://api.sendtier.com/suppressions \
  -H "Authorization: Bearer $SENDTIER_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: block-user" \
  -d '{"email":"user@example.com","reason":"manual"}'

List, retrieve and delete

GET /suppressions returns data ordered by email. limit is 1 to 100 and defaults to 50. Pass next_cursor as after. That value is an email address. Filter with reason set to bounce, complaint or manual. Global suppressions are not included.

GET /suppressions/{email} returns one account entry, or 404. DELETE /suppressions/{email} returns 204, or 404 when the account has no entry. A global suppression cannot be deleted here.

Sending to any suppressed recipient returns 422 recipient_suppressed before the email is stored. The check includes global suppressions. The worker checks again before provider delivery in case a suppression was added after acceptance.

Removing an entry permits future sends; it does not repair the recipient's mailbox. Confirm the address is safe to send to before removing a bounce or complaint suppression.

Sources: suppression handlers (internal/api/suppressions.go), recipient rejection (internal/api/emails.go), suppression queries (internal/store/queries/tenant/suppressions.sql), worker (internal/worker/worker.go), provider event ingestion (internal/ingest/apply.go).

On this page