Developers
Legis360 API
Programmatic access to the Legislative Intelligence Platform: bills and their progress through the National Assembly, legislators, and the state-by-state ratification of constitution amendments. JSON over HTTPS.
https://lip.legis360.org/api/X-API-Key: your_keyapplication/jsonGet an API key
Bills, legislators and bill documents need a key. Keys are issued by request.
- Create a free account at lip.legis360.org/signup.
- Email [email protected] with the subject API Access Request, from the email address you registered with.
- Tell us your name or organisation, what you plan to build, and your website or project if you have one.
- If approved, you receive a key and its usage quota.
Keep your key secret. It is tied to you. Do not publish it in client-side code or a public repository. If it leaks, email us and we will revoke it.
Base URL
https://lip.legis360.org/api/
All requests are GET. Responses are UTF-8 JSON unless noted (bill documents are PDF).
Authentication
Send your key in the X-API-Key header (header names are case-insensitive):
curl -H "X-API-Key: your_api_key" \
"https://lip.legis360.org/api/bills?limit=5"
A query parameter also works, which is handy for quick tests in a browser:
https://lip.legis360.org/api/bills?limit=5&api_key=your_api_key
Prefer the header. Query strings end up in server logs, browser history and referrer headers, so a key in a URL is easier to leak.
The amendments endpoint is public and needs no key.
Bills
/bills
API keyReturns bills ordered by first-reading date, newest first. Use search to filter and limit with page to paginate.
| Parameter | Type | Description |
|---|---|---|
search | string | Matches part of a bill title or bill number, for example HB10 or education. |
limit | integer | Bills per page. If you leave it out, every matching bill is returned in one response, which is large. Set a limit for normal use. |
page | integer | Page number, starting at 1. Only applies when limit is set. |
Request
GET /api/bills?search=education&limit=1&page=1
Response
{
"status": "success",
"page": 1,
"limit": 1,
"total": 42,
"bills": [
{
"id": "638",
"billNum": "HB10",
"title": "Federal Capital Territory Education Resource Centre (Establishment) Bill, 2023",
"billStatus": "Awaiting Cmtt Report",
"firstReading": "2023-07-05",
"secondReading": "2023-10-19",
"dateReportLaid": null,
"thirdReading": null,
"billAnalysis": null,
"sponsor_id": "9",
"sponsor_name": "BENJAMIN OKEZIE KALU",
"category_name": "Education",
"file_url": "https://lip.legis360.org/api/bill-file?id=638"
}
]
}
The values above are a real bill; total is illustrative and changes as bills are added.
| Field | Description |
|---|---|
total | Number of bills matching your search, across all pages. |
billStatus | Where the bill is in the process, for example Awaiting 2nd Reading or Awaiting Cmtt Report. |
firstReading, secondReading, dateReportLaid, thirdReading | Dates as YYYY-MM-DD, or null if that stage has not happened or is not recorded. |
billAnalysis | Plain-language analysis text when one has been written, otherwise null. |
sponsor_id, sponsor_name | The sponsoring legislator. Matches id in /mp. |
category_name | The bill's subject category. |
file_url | Link to the bill's PDF, or null if there is no document. See bill documents. |
Bill documents
/bill-file?id={bill_id}
API keyReturns the bill's PDF (Content-Type: application/pdf). Use the bill id from /bills. Your key is required here too, so add it to the request.
curl -H "X-API-Key: your_api_key" -o HB10.pdf \
"https://lip.legis360.org/api/bill-file?id=638"
If the bill has no document you get 404 with {"error":"File not found"}. That request does not use up your quota.
Legislators
/mp
API keyReturns every sitting legislator in the platform. It takes no parameters.
GET /api/mp
{
"status": "success",
"mp_data": [
{
"id": "470",
"name": "KALU ORJI UZOR",
"gender": "Male",
"position": "Member",
"state": "ABIA",
"constituency": "ABIA NORTH",
"party": "APC",
"biography": "Orji Uzor Kalu is a Nigerian politician and businessman...",
"image": "uploads/kalu.jpeg",
"chamber": "Senate"
}
]
}
image is a path relative to https://lip.legis360.org/, so the photo above is at https://lip.legis360.org/uploads/kalu.jpeg. chamber is Senate or House of Reps. Biographies are trimmed here for space.
Amendments
/amendments
Public, no keyConstitution alteration bills, and how each State House of Assembly has voted when a bill is sent to the states for ratification. It has three modes, chosen by the parameters you send.
List
No special parameter. Returns constitution alteration bills, with ratification progress for any that have gone to the states.
| Parameter | Type | Description |
|---|---|---|
page | integer | Page number, default 1. |
per_page | integer | Results per page, default 10, maximum 100. |
search | string | Matches part of a bill title or number. |
category | integer | Filter by category id. |
GET /api/amendments?per_page=1
{
"total": 173,
"page": 1,
"per_page": 1,
"data": [
{
"id": 3534,
"billNum": "SB1055",
"title": "Constitution of the Federal Republic of Nigeria, 1999 (Sixth Alteration) Bill, 2026 (Establishment of State Police Services)",
"category": "Constitution",
"transmitted": true,
"ratification": {
"label": "State Police",
"transmitted_date": "2026-09-16",
"counts": { "Yes": 5, "No": 0, "Deferred": 0, "Abstain": 0, "Pending": 31 },
"needed": 19,
"threshold": 24,
"outcome": "open"
}
}
]
}
ratification is null for bills that have not been sent to the states. Counts change as states vote, so treat the numbers here as a snapshot.
Ratification summary
Add summary=1 for the vote tally on one bill. Without bill, you get the currently featured ratification round.
| Parameter | Description |
|---|---|
summary=1 | Switches to summary mode. |
bill | Optional bill id. Returns 404 with {"error":"No ratification round found for this bill"} if that bill has not been sent to the states. |
GET /api/amendments?summary=1&bill=3534
{
"Yes": 5, "No": 0, "Abstain": 0, "Pending": 31, "Deferred": 0,
"bill_id": 3534,
"label": "State Police",
"transmitted_date": "2026-09-16",
"deadline_date": null,
"threshold": 24,
"total": 36,
"voted": 5,
"open": 31,
"needed": 19,
"blocking": 13,
"outcome": "open",
"zones": {
"South West": { "total": 6, "Yes": 2, "No": 0, "open": 4 }
}
}
threshold is the number of states needed to ratify, needed is how many more Yes votes are still required, and blocking is how many No votes would make ratification impossible. zones breaks the tally down by geopolitical zone; only one zone is shown above.
Votes by state
Add id to see how each State House of Assembly voted on one bill.
GET /api/amendments?id=3534
Returns an array with one object per state: state, vote (Yes, No, Abstain, Deferred or Pending), state_id, zone, vote_date, yes_count, no_count, source_url, notes and updated. The array is empty if the bill has not been sent to the states. An unknown bill id returns 404 with {"error":"Bill not found"}.
Errors & quotas
Errors are JSON in the form {"error":"message"}.
| Status | Meaning |
|---|---|
200 | Success. |
401 | API key missing. You did not send a key. |
403 | Invalid API key. The key is wrong, or it has been revoked. |
404 | The bill, document or ratification round you asked for does not exist. |
429 | Usage limit exceeded. Your key has used its quota. |
500 | Something went wrong on our side. Try again, and tell us if it keeps happening. |
Quotas
Each key has a request quota, set when the key is issued. Only successful requests count against it. Requests that return an error (for example a 404) do not. When a key reaches its quota it receives 429 until the quota is raised or reset, so email us if you need more headroom.
Try it
curl
curl -H "X-API-Key: your_api_key" \
"https://lip.legis360.org/api/bills?search=HB10&limit=1"
JavaScript
const res = await fetch("https://lip.legis360.org/api/bills?limit=10", {
headers: { "X-API-Key": process.env.LEGIS360_API_KEY }
});
const { bills, total } = await res.json();
Call the API from your server rather than from a web page, so the key stays private.
Postman
- Create a
GETrequest tohttps://lip.legis360.org/api/bills. - On the Headers tab add the key
X-API-Keywith your key as the value. - Send the request and check the response.
Help
Questions, bugs or a quota request: [email protected]. To request a key, write to [email protected].