Skip to content

API reference/suppressions

List the suppression list

GET/api/v1/email/suppressions

authentication
Secret API key as a bearer token
billing
Free.

The account's suppression list, newest first, 100 entries per page. Every undeliverable verdict adds the address in normalized form (lowercased, plus-tag stripped, Gmail dots folded) with source auto; imports arrive with source imported; bounces and complaints reported through the feedback endpoints arrive with source feedback. Batch, bulk and monitor runs answer suppressed addresses from the stored verdict at no cost; a single lookup always re-verifies, and a verdict other than undeliverable removes only an entry with source auto; a bounce you reported leaves when you report a delivery to that address, and an import or a complaint only when you remove it. A complaint about an address you imported is recorded on that entry (reason complained), which stays an import. Imports and complaints never go stale: they are served for as long as they stand. Any other entry untouched for 90 days is re-verified instead of trusted.

Every filter is optional and they combine. value looks one address up: it is normalized the same way the list stores it, so [email protected] finds the entry filed as [email protected]. An address that does not parse 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 address, in any spelling of it. Normalized before it is matched. At most 500 characters.
sourcequerystringOnly entries this source added. One of: auto, imported, feedback.
reasonquerystringOnly entries carrying this verdict reason. At most 64 characters.
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/email/suppressions \
  -H "Authorization: Bearer sk_live_…"
const response = await fetch('https://spaw.co/api/v1/email/suppressions', {
  method: 'GET',
  headers: {
    'Authorization': 'Bearer sk_live_…',
  },
});
const result = await response.json();
import requests

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

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

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

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": 9041,
                "email": "[email protected]",
                "reason": "mailbox_not_found",
                "source": "auto",
                "added_at": "2026-09-02T08:30:00+00:00"
            },
            {
                "id": 9040,
                "email": "[email protected]",
                "reason": null,
                "source": "imported",
                "added_at": "2026-09-01T17: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