List suppressions
/v1/suppressionsSecret key — sk_… or sk_test_… · Base URL https://api.volanea.com
The do-not-send list, newest first, cursor-paginated. Filter by reason to separate hard bounces from complaints, unsubscribes, and manual blocks.
Every send checks this list first, and a suppressed recipient comes back inside a 200 as { to, skipped: "suppressed" } rather than as an error — so a caller reading messages as "delivered" counts suppressions as successes.
To ask about a single address rather than page the whole list, use GET /v1/suppressions/check.
Query parameters
cursorstringPagination cursor — an OPAQUE token. Take the `nextCursor` from the previous page and send it back unchanged. Do not parse it, do not coerce it to a number, and do not construct one: the format is `<unixMs>.<objectId>` today and may change. A cursor that cannot be parsed is rejected with 422 `validation_error` rather than silently restarting at page one.
limitintegerPage size (1–200, default 50).
reasonstringhard_bouncecomplaintmanualunsubscribe
Response
A page of suppressions.
dataobject[]requiredsuppressionIdstringrequiredprojectIdstringemailemailrequiredreasonenumrequiredhard_bouncecomplaintmanualunsubscribesourcestring | nullcreatedAtdate-timerequired
nextCursorstring | nullrequiredOpaque token. Pass back as `cursor` verbatim to fetch the next page; `null` when there are no more rows.
Errors
Every failure returns the standard envelope — branch on `code`, never on the wording of `error`.
401Missing or invalid API key.422Request validation failed (code `validation_error`, 422).
Request
curl https://api.volanea.com/v1/suppressions?cursor=value&limit=50 \
-H "Authorization: Bearer sk_..."Response
200 · application/json
{
"success": true,
"data": {
"data": [
{
"suppressionId": "<suppressionId>",
"projectId": "<projectId>",
"email": "ada@example.com",
"reason": "hard_bounce",
"source": "<source>",
"createdAt": "2026-01-01T09:00:00.000Z"
}
],
"nextCursor": "<nextCursor>"
}
}92 endpoints · OpenAPI document