- authentication
- Secret API key as a bearer token
- billing
- Free.
The account's phone suppression list, newest first, 100 entries per page. A fresh lookup that finds a geographic number in a block the regulator does not allocate adds it with source auto and its stored answer; the account's own SMS outcomes add a number with source feedback after an abuse report, one permanent failure, two failures about the number with no later delivery (reasons abuse and undelivered), or an opt-out (reason opted_out); imports arrive with source imported. Batch, bulk and monitor runs answer suppressed numbers free from the stored answer, or with reason suppressed where there is none; a single lookup always runs fresh. A valid answer, from any lookup, removes only an auto entry: an undelivered entry leaves when you report a delivery or a verification, and an abuse, opted_out or imported one only when you remove it, so nobody typing a number into your form can take it off the list. An abuse report or opt-out about a number you imported is recorded on that entry, which keeps source imported; an abuse or opt-out entry you removed comes back only with a new abuse report or opt-out. Imports, opt-outs and abuse entries never go stale: they are served for as long as they stand. An auto or undelivered entry untouched for 90 days is re-checked instead of trusted: the fresh answer removes a stale auto entry when it comes back valid, and a stale undelivered entry stays listed, renewed by a new failure report. A single lookup of a number held as opted_out answers blocked_by: opted_out under the default SMS policy (see block_opted_out).
Every filter is optional and they combine. value looks one number up: it is read to E.164 the way the list stores it, so 07911 012345 with country=GB finds the entry filed as +447911012345. A number that is not a valid subscriber number 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 number, in any notation. Read to E.164 before it is matched. At most 500 characters. |
| country | query | string | The region `value` is read against when it carries no calling code. 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: unassigned_block, undelivered, abuse, opted_out. |
| 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/phone/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": 311,
"phone": "+14152010142",
"reason": "unassigned_block",
"source": "auto",
"added_at": "2026-09-05T08:30:00+00:00"
},
{
"id": 310,
"phone": "+447911012345",
"reason": "undelivered",
"source": "feedback",
"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.