Skip to content

Suppressions & delivery feedback

The suppression list is a per-(org, env) blocklist of email addresses that Notavia will not deliver to. Addresses are added automatically when SES reports a permanent bounce or a spam complaint, and can also be added or removed manually via the API or dashboard.

All four endpoints require a full-access API key (nsk_live_... or nsk_test_... with full_access scope).


{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"address": "alice@example.com",
"reason": "hard_bounce",
"source": "provider",
"diagnostic_detail": "550 5.1.1 The email account does not exist.",
"triggering_notification_id": "8d3a1c2e-4f5b-6789-abcd-ef0123456789",
"suppressed_at": "2026-05-30T14:22:00Z"
}
FieldTypeNotes
idUUIDUnique identifier for this suppression entry.
addressstringThe suppressed email address.
reasonstring enumOne of hard_bounce, complaint, manual_add.
sourcestring enumprovider — added by the SES feedback pipeline; manual — added via the API or dashboard.
diagnostic_detailstring | nullThe raw bounce or complaint diagnostic string from SES, if available. Null for manually added entries.
triggering_notification_idUUID | nullThe ID of the notification that caused the suppression, if applicable. Null for manually added entries.
suppressed_atISO 8601UTC timestamp of when the address was suppressed.

Returns a cursor-paginated list of suppressed addresses for the authenticated environment.

ParameterTypeDefaultNotes
addressstringFilter to entries whose address contains this value (case-insensitive substring match).
reasonstringFilter by reason. Accepted values: HardBounce, Complaint, ManualAdd (case-insensitive).
limitinteger25Maximum number of results per page.
cursorstringOpaque pagination cursor from the previous page’s next_cursor field.
{
"data": [
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"address": "alice@example.com",
"reason": "hard_bounce",
"source": "provider",
"diagnostic_detail": "550 5.1.1 The email account does not exist.",
"triggering_notification_id": "8d3a1c2e-4f5b-6789-abcd-ef0123456789",
"suppressed_at": "2026-05-30T14:22:00Z"
}
],
"next_cursor": "eyJpZCI6IjNmYTg1ZjY0In0",
"has_more": true
}
Terminal window
curl https://api.notavia.saas-infrastructure.com/v1/suppressions?reason=HardBounce&limit=50 \
-H "Authorization: Bearer nsk_live_..."

Returns the suppression entry for a specific address.

ParameterNotes
addressThe email address to look up. URL-encode the value if it contains special characters.

Returns the suppression object.

{
"error": {
"type": "not_found",
"code": "suppression_not_found",
"message": "No suppression found for address 'alice@example.com'.",
"param": null
}
}
Terminal window
curl https://api.notavia.saas-infrastructure.com/v1/suppressions/alice%40example.com \
-H "Authorization: Bearer nsk_live_..."

Manually adds an address to the suppression list. If the address is already suppressed, the existing entry is returned unchanged.

{
"address": "alice@example.com"
}
FieldRequiredNotes
addressyesThe email address to suppress.

Returned when the address was not previously suppressed. The Location header is set to /v1/suppressions/{address}.

Returns the suppression object with reason: "manual_add" and source: "manual".

Returned when the address was already suppressed. Returns the existing suppression object unchanged.

Terminal window
curl -X POST https://api.notavia.saas-infrastructure.com/v1/suppressions \
-H "Authorization: Bearer nsk_live_..." \
-H "Content-Type: application/json" \
-d '{ "address": "alice@example.com" }'

Removes an address from the suppression list. Subsequent sends to this address will no longer be blocked by the suppression gate (though preference opt-outs are evaluated separately).

ParameterNotes
addressThe email address to remove. URL-encode the value if it contains special characters.

The address was removed from the suppression list.

{
"error": {
"type": "not_found",
"code": "suppression_not_found",
"message": "No suppression found for address 'alice@example.com'.",
"param": null
}
}
Terminal window
curl -X DELETE https://api.notavia.saas-infrastructure.com/v1/suppressions/alice%40example.com \
-H "Authorization: Bearer nsk_live_..."

using NotifyService.Sdk.Suppressions;
// List with optional filters
PageResult<SuppressionResponse> page = await notify.Suppressions.ListAsync(
reason: SuppressionReason.HardBounce,
limit: 50);
// Look up a single address
SuppressionResponse? entry = await notify.Suppressions.GetAsync("alice@example.com");
// Manually suppress
SuppressionResponse added = await notify.Suppressions.AddAsync("alice@example.com");
// Remove
await notify.Suppressions.RemoveAsync("alice@example.com");
import { createNotifyClient } from "notavia-sdk";
const notify = createNotifyClient({ apiKey: process.env.NOTIFY_API_KEY! });
// List
const { items, nextCursor } = await notify.suppressions.list({ reason: "HardBounce", limit: 50 });
// Get
const entry = await notify.suppressions.get("alice@example.com");
// Add
const added = await notify.suppressions.add("alice@example.com");
// Remove
await notify.suppressions.remove("alice@example.com");

Notavia fires outbound webhooks to your configured endpoint when SES reports the final delivery status of a managed email send. These are standard outbound delivery webhooks signed with HMAC-SHA256 (same scheme as all other Notavia webhooks — see the Webhooks guide for signature verification).

The data field in every delivery feedback event payload is the notification object for the send that triggered the event.

Fired when SES confirms successful delivery to the recipient’s mail server.

{
"id": "evt_01j2k3m4n5p6q7r8s9t0u1v2w",
"type": "notification.delivered",
"created_at": "2026-05-30T14:22:10Z",
"data": { ... }
}

Fired when SES reports a permanent (hard) bounce. The recipient’s address is automatically added to the suppression list before this webhook fires.

{
"id": "evt_01j2k3m4n5p6q7r8s9t0u1v2w",
"type": "notification.bounced",
"created_at": "2026-05-30T14:22:10Z",
"data": { ... }
}

Fired when SES reports a spam complaint. The recipient’s address is automatically added to the suppression list before this webhook fires.

{
"id": "evt_01j2k3m4n5p6q7r8s9t0u1v2w",
"type": "notification.complained",
"created_at": "2026-05-30T14:22:10Z",
"data": { ... }
}

All four suppression endpoints require a full-access API key. The send_only scope is not sufficient.

Deliver feedback webhook events are sent from Notavia to your endpoint and do not require API-key auth on your side — verify them using the NotifyService-Signature header instead.