Sendry Docs
API Reference

Suppression List

Manage addresses that should never receive email from your organization.

The suppression list prevents Sendry from delivering email to addresses that have hard-bounced, complained, or unsubscribed. Sendry automatically adds addresses on hard bounces and spam complaints. You can also add or remove addresses manually.

All endpoints require read_only scope to read, and full_access scope to write.


List suppressed addresses

GET /v1/suppression

Requires read_only scope.

Query parameters

ParameterTypeDefaultDescription
limitnumber50Results per page (1–100).
cursorstringPagination cursor from previous response's next_cursor.

Response

{
  "data": [
    {
      "email": "bounce@example.com",
      "reason": "hard_bounce",
      "created_at": "2025-03-12T09:00:00Z"
    },
    {
      "email": "complaint@example.com",
      "reason": "complaint",
      "created_at": "2025-03-11T14:30:00Z"
    }
  ],
  "has_more": false,
  "next_cursor": null
}

Reason values:

ValueCause
hard_bounceEmail permanently rejected by the receiving server
complaintRecipient marked the email as spam
unsubscribeRecipient clicked an unsubscribe link
manualManually added via the API or dashboard

Add to suppression list

POST /v1/suppression

Requires full_access scope. Use this to proactively suppress addresses — for example, when you learn out-of-band that an address is invalid.

Request body

FieldTypeRequiredDescription
emailstringYesEmail address to suppress. Must be a valid email format.
reasonstringNoOne of hard_bounce, complaint, unsubscribe, manual. Defaults to manual.

Example request

curl -X POST https://api.sendry.online/v1/suppression \
  -H "Authorization: Bearer $SENDRY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"email": "invalid@example.com", "reason": "hard_bounce"}'

Response

{
  "email": "invalid@example.com",
  "reason": "hard_bounce",
  "created_at": "2025-03-12T09:00:00Z"
}

Remove from suppression list

DELETE /v1/suppression/:email

Requires full_access scope. Removes an address from the suppression list, allowing future email delivery to it.

Use with caution. Only remove addresses when you have confirmed consent from the recipient. Re-sending to a previously bounced or complaining address damages deliverability reputation.

Example request

curl -X DELETE https://api.sendry.online/v1/suppression/user@example.com \
  -H "Authorization: Bearer $SENDRY_API_KEY"

Response

{
  "deleted": true
}

Automatic suppression

Sendry automatically adds addresses to the suppression list in these cases:

EventSuppression reasonNotes
Hard bouncehard_bouncePermanent delivery failures (5xx SMTP codes)
Spam complaintcomplaintTriggered when recipient clicks "Mark as spam"
Unsubscribe clickunsubscribeOnly when Sendry's unsubscribe tracking is enabled

Soft bounces (temporary failures like a full inbox) are not suppressed automatically — they trigger retries instead.


TypeScript SDK

import { Sendry } from "sendry-sdk";

const sendry = new Sendry(process.env.SENDRY_API_KEY!);

// List suppressed addresses
const { data, has_more, next_cursor } = await sendry.suppression.list({ limit: 50 });

// Add an address
await sendry.suppression.add({
  email: "invalid@example.com",
  reason: "hard_bounce",
});

// Remove an address
await sendry.suppression.remove("user@example.com");

Checking suppression before sending

You can check the suppression list before a send to avoid wasted quota:

async function sendIfNotSuppressed(email: string, payload: object) {
  const { data } = await sendry.suppression.list({ limit: 100 });
  const suppressed = new Set(data.map(s => s.email));

  if (suppressed.has(email)) {
    console.log(`Skipping suppressed address: ${email}`);
    return;
  }

  return sendry.emails.send({ to: email, ...payload });
}

For bulk sends, use Campaigns — they check the suppression list automatically before each send.

On this page