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 [email protected] 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": "[email protected]",
"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 |
|---|---|---|
state | string | Two-letter code (CA, TX, …). Omit for all. |
search | string | Keyword match in title + summary. |
status | string | introduced, passed, enacted, vetoed, … |
limit | int | 1–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
| Status | When |
|---|---|
401 | Missing or invalid Bearer token. |
403 | Account not on the Business tier. Response includes upgrade_url. |
404 | Bill ID doesn't exist. |
429 | Rate 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 [email protected] and tell us what you'd build with it.