Suppressions
Cowliss owns the SES account-level suppression list (hard bounces, complaints) and SES enforces it on every send, so a send to a listed address is accepted, then bounces back as a suppression event recorded as skipped_suppressed. Cowliss mirrors the list per address so the send gate skips cheaply and the dashboard can say why. Suppression is a separate fact from consent: a complaint revokes consent, a bounce only suppresses the address. Deleting a mirror row is admin-only and one step (the route clears the address in SES first), and because the list is account-wide, un-suppressing applies to every org on the deployment.
GET /v1/suppressions
Section titled “GET /v1/suppressions”List suppressed addresses
Auth: Clerk session token.
Query parameters
{ "cursor": "string", "limit": 50, "q": "string"}| Field | Type | Required | Constraints |
|---|---|---|---|
cursor |
string | no | |
limit |
integer | no | default 50; 1 ≤ x ≤ 100 |
q |
string | no | length 0–200 |
Response 200
{ "data": [ { "id": "string", "orgId": "string", "address": "string", "type": "bounce", "reason": "string", "source": "string", "suppressedAt": "2026-01-15T09:30:00.000Z", "createdAt": "2026-01-15T09:30:00.000Z", "updatedAt": "2026-01-15T09:30:00.000Z" } ], "meta": { "requestId": "string", "nextCursor": "string", "hasMore": true }}| Field | Type | Required | Constraints |
|---|---|---|---|
data |
object[] | yes | |
data[] |
object | yes | |
data[].id |
string | yes | |
data[].orgId |
string | yes | |
data[].address |
string | yes | |
data[].type |
“bounce” | “complaint” | “manual” | null | yes | |
data[].reason |
string | null | yes | |
data[].source |
string | null | yes | |
data[].suppressedAt |
string (date-time) | yes | |
data[].createdAt |
string (date-time) | yes | |
data[].updatedAt |
string (date-time) | yes | |
meta |
object | no | |
meta.requestId |
string | no | |
meta.nextCursor |
string | null | no | |
meta.hasMore |
boolean | no |
Errors follow the shared envelope and code table.
DELETE /v1/suppressions/{id}
Section titled “DELETE /v1/suppressions/{id}”Un-suppress an address
Auth: Clerk session token.
Response 200
{ "data": { "deleted": true }, "meta": { "requestId": "string", "nextCursor": "string", "hasMore": true }}| Field | Type | Required | Constraints |
|---|---|---|---|
data |
object | yes | |
data.deleted |
true | yes | |
meta |
object | no | |
meta.requestId |
string | no | |
meta.nextCursor |
string | null | no | |
meta.hasMore |
boolean | no |
Errors follow the shared envelope and code table.