API
Read-only JSON and CSV under /api/v1/. Free
without a key; a subscription adds a key that raises
the limits and opens the CSV export.
Keys and limits
Send the key as Authorization: Bearer sw_…,
or as ?key= on a GET. A key that is not valid, or
whose subscription is not active, gets a 401 with a one-line JSON error;
no key at all is the free tier.
- Free: 60 requests an hour per address.
- With a key: 1,000 requests an hour per key.
- Over the limit: 429, with
Retry-Afterin seconds until the hour turns.
POST /api/v1/reconcile
Check a list of TTB IDs, as Check a list does.
Body: {"ids": [...], "since": "ISO-8601"},
since optional. Up to 1,000 ids
free, 5,000 with a key. Each id comes back with a
state — no_change_observed,
changed, not_in_coverage or
unreadable — its first_seen,
its last_status_read and its events, filtered to
those observed after since when given. Nothing
submitted is stored.
curl -X POST https://struckwire.com/api/v1/reconcile \
-H "Authorization: Bearer sw_EXAMPLE" \
-H "Content-Type: application/json" \
-d '{"ids": ["00067000000026","00095000000007","01046000000004"]}' GET /api/v1/export/transitions.csv
Key only. Every change recorded, withdrawn events excluded, as CSV.
since and until are
UTC days, YYYY-MM-DD, both included, at most 90 days apart;
without them, the last 90 days. Columns:
public_id, ttb_id, event_type, prior_state, new_state,
provenance, ttb_stated_date, observed_at, bounded_by_gap,
content_digest_before, content_digest_after, brand, class_type, origin,
permit, event_url, ttb_url. provenance is
stated when TTB stated the change and
computed when Struckwire inferred it from the
register.
curl -H "Authorization: Bearer sw_EXAMPLE" \ -o changes.csv "https://struckwire.com/api/v1/export/transitions.csv?since=2026-09-01&until=2026-11-01"
GET /api/v1/events.json
The wire as a list, newest first. since
(YYYY-MM-DD, default 30 days ago), types (comma
list) and limit: up to 250 rows free,
5,000 with a key.
curl "https://struckwire.com/api/v1/events.json?since=2026-10-01&limit=250"
curl -H "Authorization: Bearer sw_EXAMPLE" \ "https://struckwire.com/api/v1/events.json?since=2026-10-01&limit=5000"
GET /api/v1/events/<public_id>.json
One event, with its record and the source line it was read from. No parameters.
curl https://struckwire.com/api/v1/events/<public_id>.json
GET /api/v1/summary.json
Counts and the last complete read of the register. No parameters.
curl https://struckwire.com/api/v1/summary.json
Data freshness
Both plans read the same observations. The register’s listing is checked four times a day. Status is read from each certificate’s own page on a rolling schedule, so a status change can take more than seven days to appear. Paying does not make it faster.
Pricing · Terms · Methodology