Legis360 API docs

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.

Base URLhttps://lip.legis360.org/api/
AuthX-API-Key: your_key
Formatapplication/json

Get an API key

Bills, legislators and bill documents need a key. Keys are issued by request.

  1. Create a free account at lip.legis360.org/signup.
  2. Email [email protected] with the subject API Access Request, from the email address you registered with.
  3. Tell us your name or organisation, what you plan to build, and your website or project if you have one.
  4. 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

GET

/bills

API key

Returns bills ordered by first-reading date, newest first. Use search to filter and limit with page to paginate.

ParameterTypeDescription
searchstringMatches part of a bill title or bill number, for example HB10 or education.
limitintegerBills per page. If you leave it out, every matching bill is returned in one response, which is large. Set a limit for normal use.
pageintegerPage 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.

FieldDescription
totalNumber of bills matching your search, across all pages.
billStatusWhere the bill is in the process, for example Awaiting 2nd Reading or Awaiting Cmtt Report.
firstReading, secondReading, dateReportLaid, thirdReadingDates as YYYY-MM-DD, or null if that stage has not happened or is not recorded.
billAnalysisPlain-language analysis text when one has been written, otherwise null.
sponsor_id, sponsor_nameThe sponsoring legislator. Matches id in /mp.
category_nameThe bill's subject category.
file_urlLink to the bill's PDF, or null if there is no document. See bill documents.

Bill documents

GET

/bill-file?id={bill_id}

API key

Returns 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

GET

/mp

API key

Returns 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

GET

/amendments

Public, no key

Constitution 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.

ParameterTypeDescription
pageintegerPage number, default 1.
per_pageintegerResults per page, default 10, maximum 100.
searchstringMatches part of a bill title or number.
categoryintegerFilter 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.

ParameterDescription
summary=1Switches to summary mode.
billOptional 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"}.

StatusMeaning
200Success.
401API key missing. You did not send a key.
403Invalid API key. The key is wrong, or it has been revoked.
404The bill, document or ratification round you asked for does not exist.
429Usage limit exceeded. Your key has used its quota.
500Something 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

  1. Create a GET request to https://lip.legis360.org/api/bills.
  2. On the Headers tab add the key X-API-Key with your key as the value.
  3. Send the request and check the response.

Help

Questions, bugs or a quota request: [email protected]. To request a key, write to [email protected].