Skip to content

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.

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.

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.