Create your account
Every new account starts on Free. After email verification, your first API key is ready immediately and you can upgrade to Pro later in the dashboard.
Go from zero to a live request in three steps. Start with a verified account, send header-authenticated requests, and follow next_url values instead of rebuilding pagination yourself.
Every new account starts on Free. After email verification, your first API key is ready immediately and you can upgrade to Pro later in the dashboard.
Use X-API-Key or Authorization: Bearer .... The browser address bar by itself will not send your key.
Use include= on detail endpoints to fetch related data in one call. Keep list endpoints lean until you know you need more.
Every JSON endpoint under /api/v1 expects your key in X-API-Key or an Authorization: Bearer ... header.
curl -H "X-API-Key: YOUR_KEY" \ "https://legilist.com/api/v1/bills?congress=119&per_page=5"
Collection routes return pagination metadata. If you ask for more than the maximum page size, the API uses the highest allowed value and reflects that in the response links.
per_page is capped at 100.next_url and prev_url preserve your active filters.page=1 into the URL.{
"meta": {
"page": 1,
"per_page": 100,
"total": 5763,
"total_pages": 58,
"prev_page": null,
"next_page": 2,
"prev_url": null,
"next_url": "https://legilist.com/api/v1/topics?per_page=100&page=2"
}
}
Detail endpoints use include= for related data. If you request an unsupported include, the API ignores it and reports that in meta.ignored_includes.
include=related and returns data.related_bills.curl -H "X-API-Key: YOUR_KEY" \ "https://legilist.com/api/v1/bills/119/HR/1?include=actions,texts,amendments,related,laws,votes,notreal"
Responses follow the same small set of patterns across the API, so clients can move between resources without special-case parsing.
data as an array and pagination in top-level meta.data. Related data appears only when you request it with include=.data, with bill pagination links in the same top-level meta block used elsewhere in the API.site_url points to the public LegiList page when one exists. api_url points back to the canonical API endpoint.null when the source data is limited.congress, type, and number; laws by congress, law_type, and law_number; legislators by bioguide_id.Error responses are predictable, and rate-limit headers tell your app when to pause and retry.
| Status | Code | Meaning |
|---|---|---|
| 400 | invalid_parameter |
A filter or path value used an unsupported option. |
| 401 | missing_api_key |
The request did not include X-API-Key or a bearer token header. |
| 401 | invalid_api_key |
The supplied key hash did not match an active API key. |
| 404 | not_found |
The requested route or record does not exist. |
| 429 | rate_limit_exceeded |
The request exceeded a per-second or expensive-route limit. |
| 429 | daily_quota_exceeded |
The account exceeded its daily request quota. |
| 503 | schema_not_ready |
The API has not been fully set up yet. |
{
"error": {
"code": "invalid_parameter",
"message": "Invalid value for chamber.",
"parameter": "chamber"
}
}
Every authenticated response includes daily and per-second headers so your app can back off before it hits a hard limit.
X-RateLimit-Limit-DayX-RateLimit-Remaining-DayX-RateLimit-Reset-DayX-RateLimit-Limit-SecondX-RateLimit-Remaining-SecondX-RateLimit-Reset-Second{
"data": [...],
"meta": {
"page": 1,
"per_page": 20,
"total": 178847,
"total_pages": 8943,
"prev_page": null,
"next_page": 2,
"prev_url": null,
"next_url": "https://legilist.com/api/v1/bills?per_page=20&page=2"
}
}