Developers

StateWatch API

A read-only REST API for programmatically pulling bill data into your own compliance dashboards, alerting systems, or research tools.

Business tier required. Free + Pro accounts get 403 on every endpoint. See pricing.

Authentication

Every request carries an Authorization header with your account's API key. Find it on your manage page after upgrading to Business — it's the value in your personal /manage/<token> URL.

curl https://statewatch.io/api/v1/me \
  -H "Authorization: Bearer YOUR_API_KEY"

Treat the key like a password. We don't currently rotate it on demand — email hello@statewatch.io if you need a new one issued.


Rate limits

60 requests per minute per API key by default. Hit the limit and you get 429 Too Many Requests with a Retry-After header. Need a higher cap for production workloads? Email us.


Endpoints

GET /api/v1/me

Your account info: tier, confirmation status, current subscriptions.

{
  "email": "you@yourcompany.com",
  "tier": "biz",
  "confirmed_at": "2026-05-18 14:30:22",
  "subscriptions": [
    {"state": "CA", "frequency": "daily", "industry_tags": ["healthcare"]}
  ]
}

GET /api/v1/states

Catalog of every state we route for, with curated law metadata where available.

GET /api/v1/bills

List bills. Query params:

Param Type Notes
statestringTwo-letter code (CA, TX, …). Omit for all.
searchstringKeyword match in title + summary.
statusstringintroduced, passed, enacted, vetoed, …
limitint1–500. Default 50.
curl "https://statewatch.io/api/v1/bills?state=CA&status=enacted&limit=10" \
  -H "Authorization: Bearer YOUR_API_KEY"

GET /api/v1/bills/{bill_id}

Single-bill detail. bill_id values come from the list endpoint.

curl https://statewatch.io/api/v1/bills/legiscan-1234567 \
  -H "Authorization: Bearer YOUR_API_KEY"

Error codes

StatusWhen
401Missing or invalid Bearer token.
403Account not on the Business tier. Response includes upgrade_url.
404Bill ID doesn't exist.
429Rate limit exceeded. Check the Retry-After header.

Versioning

The API is versioned in the URL (/api/v1/...). Breaking changes ship under a new version; the old version stays available for at least 12 months with a deprecation header.

Status changes, additive fields, and new endpoints don't constitute breaking changes and ship without a version bump.


Need something we don't have?

Webhooks, bulk export, historical data going back further than the ingest start — email hello@statewatch.io and tell us what you'd build with it.