The suppression list is a per-account blocklist. Any address on the list is silently skipped when you call POST /v1/email/send. Required for GDPR compliance and bounce handling at scale.
GET /api/email-api/suppressions
Returns all suppressed addresses for the authenticated account.
{
“suppressions”: [
{
“id”: 1,
“email”: “[email protected]”,
“reason”: “unsubscribed”,
“source”: “campaign”,
“createdAt”: “2026-07-01T12:00:00.000Z”
}
]
}
POST /api/email-api/suppressions
Add one or more addresses to the suppression list. Duplicates are ignored (idempotent).
Single address
{ “email”: “[email protected]”, “reason”: “unsubscribed” }
Bulk
{ “email”: [“[email protected]”, “[email protected]”], “reason”: “bounced” }
Response 201
{ “added”: 2, “skipped”: 1, “suppressions”: […] }
DELETE /api/email-api/suppressions/:email
Remove an address from the suppression list. URL-encode the email address.
curl -X DELETE “https://api.convertnow.co/api/email-api/suppressions/user%40example.com” \
-H “Authorization: Bearer YOUR_JWT_TOKEN”
How suppressions interact with sending
Suppressed addresses in a multi-recipient send are skipped transparently. If all recipients are suppressed, a 422 is returned and no email is sent.
Code example — sync unsubscribes
async function suppressAddress(email, reason = ‘unsubscribed’) {
const res = await fetch(‘https://api.convertnow.co/api/email-api/suppressions’, {
method: ‘POST’,
headers: {
‘Authorization’: `Bearer ${process.env.CONVERTNOW_JWT}`,
‘Content-Type’: ‘application/json’,
},
body: JSON.stringify({ email, reason }),
});
if (!res.ok) throw new Error(`Suppression failed: ${res.status}`);
return res.json();
}
async function unsuppressAddress(email) {
const encoded = encodeURIComponent(email);
await fetch(`https://api.convertnow.co/api/email-api/suppressions/${encoded}`, {
method: ‘DELETE’,
headers: { ‘Authorization’: `Bearer ${process.env.CONVERTNOW_JWT}` },
});
}