- authentication
- Secret API key as a bearer token
- billing
- Free.
The account's postal suppression list, newest first, 100 entries per page. Your own delivery reports add an address with source feedback: moved or refused at once, returned on the second report with no later delivery. Imports arrive with source imported. Batch, bulk and monitor runs answer a suppressed address free, with valid false, reason suppressed and meta.suppressed true; a single lookup always runs fresh. An import never goes stale. An entry your reports added is re-checked rather than trusted once it is untouched for 90 days: the lookup keeps it while the reports still stand behind it, and drops it once they do not; a new moved, refused or returned report renews it.
The list is per account and is never read for anybody else.
Every filter is optional and they combine. value looks one address up: it is folded against its country's postal format the way the list stores it, so 10 downing st, london sw1a2aa finds the entry filed as 10 Downing Street, London, SW1A 2AA. country is required whenever value is sent — an address folds to a building against one country's format, and without it the search would answer "no such entry" for a row you are looking at. An address that names no building matches nothing. An unparseable date or an out-of-range per_page is a 422, not a silently unfiltered page.
Parameters
| name | in | type | description |
|---|---|---|---|
| value | query | string | One written address, in any spelling of it. Folded before it is matched; requires `country`. At most 500 characters. |
| country | query | string | The ISO 3166-1 alpha-2 country `value` is read against. Required with `value`. 2 to 2 characters. |
| source | query | string | Only entries this source added. One of: auto, imported, feedback. |
| reason | query | string | Only entries carrying this reason. One of: returned, moved, refused, imported. |
| since | query | string | Only entries added on or after this date. |
| until | query | string | Only entries added on or before this date. A bare date means the whole of that day. |
| page | query | integer | The page to return. Default: 1. |
| per_page | query | integer | Entries per page, up to 500. Default: 100. |
Example request
curl https://spaw.co/api/v1/address/suppressions \ -H "Authorization: Bearer sk_live_…"
This endpoint has no console on its page. It answers with records from your own account, often by an id only you have, rather than about a value you can type here. The dashboard lists the same rows.
Responses
200One page of entries.
{
"success": true,
"data": {
"suppressions": [
{
"id": 412,
"address": "221B Baker Street, London NW1 6XE",
"reason": "returned",
"source": "feedback",
"added_at": "2026-09-05T08:30:00+00:00"
},
{
"id": 411,
"address": "10 Downing Street, London, SW1A 2AA",
"reason": "imported",
"source": "imported",
"added_at": "2026-09-04T17:02:11+00:00"
}
]
},
"meta": {
"page": 1,
"per_page": 100,
"total": 2
}
}401The key is missing, malformed, or revoked.
{
"success": false,
"error": {
"code": "UNAUTHENTICATED",
"message": "Provide a valid API key as a bearer token.",
"request_id": "req_01m1kgdm4xngzmbmff68g94w0c"
}
}429Over 5 requests per second for the key. Retry after the limit resets.
{
"success": false,
"error": {
"code": "RATE_LIMITED",
"message": "Too many requests. Retry after the limit resets.",
"request_id": "req_01m1kgdm4xngzmbmff68g94w0c"
}
}Error codes
Failures answer { success: false, error: { code, message, request_id } }. Each code has its own page.