Skip to content

API reference/address

List the address suppression list

GET/api/v1/address/suppressions

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
valuequerystringOne written address, in any spelling of it. Folded before it is matched; requires `country`. At most 500 characters.
countryquerystringThe ISO 3166-1 alpha-2 country `value` is read against. Required with `value`. 2 to 2 characters.
sourcequerystringOnly entries this source added. One of: auto, imported, feedback.
reasonquerystringOnly entries carrying this reason. One of: returned, moved, refused, imported.
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/address/suppressions \
  -H "Authorization: Bearer sk_live_…"
const response = await fetch('https://spaw.co/api/v1/address/suppressions', {
  method: 'GET',
  headers: {
    'Authorization': 'Bearer sk_live_…',
  },
});
const result = await response.json();
import requests

response = requests.get(
    'https://spaw.co/api/v1/address/suppressions',
    headers={'Authorization': 'Bearer sk_live_…'},
)
result = response.json()
$ch = curl_init('https://spaw.co/api/v1/address/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_address_suppressions()
import Spaw from 'spaw';

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

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

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.

markdown version·openapi.json