The record of federal label-approval change.

Theme

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.

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