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).