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
| Parameter | Type | Default | Description |
|---|---|---|---|
limit | number | 50 | Results per page (1–100). |
cursor | string | Pagination 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:
| Value | Cause |
|---|---|
hard_bounce | Email permanently rejected by the receiving server |
complaint | Recipient marked the email as spam |
unsubscribe | Recipient clicked an unsubscribe link |
manual | Manually 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
| Field | Type | Required | Description |
|---|---|---|---|
email | string | Yes | Email address to suppress. Must be a valid email format. |
reason | string | No | One 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:
| Event | Suppression reason | Notes |
|---|---|---|
| Hard bounce | hard_bounce | Permanent delivery failures (5xx SMTP codes) |
| Spam complaint | complaint | Triggered when recipient clicks "Mark as spam" |
| Unsubscribe click | unsubscribe | Only 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.