Skip to content

API reference/phone

List the phone suppression list

GET/api/v1/phone/suppressions

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
valuequerystringOne number, in any notation. Read to E.164 before it is matched. At most 500 characters.
countryquerystringThe region `value` is read against when it carries no calling code. 2 to 2 characters.
sourcequerystringOnly entries this source added. One of: auto, imported, feedback.
reasonquerystringOnly entries carrying this reason. One of: unassigned_block, undelivered, abuse, opted_out.
sincequerystringOnly entries added on or after this date.
untilquerystringOnly entries added on or before this date. A bare date means the whole of that day.
pagequeryintegerThe page to return. Default: 1.
per_pagequeryintegerEntries per page, up to 500. Default: 100.

Example request

curl https://spaw.co/api/v1/phone/suppressions \
  -H "Authorization: Bearer sk_live_…"
const response = await fetch('https://spaw.co/api/v1/phone/suppressions', {
  method: 'GET',
  headers: {
    'Authorization': 'Bearer sk_live_…',
  },
});
const result = await response.json();
import requests

response = requests.get(
    'https://spaw.co/api/v1/phone/suppressions',
    headers={'Authorization': 'Bearer sk_live_…'},
)
result = response.json()
$ch = curl_init('https://spaw.co/api/v1/phone/suppressions');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ['Authorization: Bearer sk_live_…'],
]);
$result = json_decode(curl_exec($ch), true);
from spaw import Client

client = Client('sk_live_…')
result = client.list_phone_suppressions()
import Spaw from 'spaw';

const spaw = new Spaw({ apiKey: 'sk_live_…' });
const result = await spaw.listPhoneSuppressions();
use Spaw\Client;

$spaw = new Client('sk_live_…');
$result = $spaw->listPhoneSuppressions();

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.

markdown version·openapi.json