Government — entry 022 of 90

Data.parliament.uk

Verified Aug 2026

The Dataset Explorer's underlying Linked Data API, hosted at `lda.data.parliament.uk`, is still live: a keyless GET against `bills.json` returned real, paginated bill records (2,000+ results) with a wildcard `Access-Control-Allow-Origin` header, and `endpoints.json` lists dozens of other datasets (committees, attendance, members) served the same way. It's a legacy platform, though — Parliament now also runs newer per-domain REST APIs (`members-api.parliament.uk`, `bills-api.parliament.uk`) that cover the same ground with a modern interface and are worth checking first for new integrations.

The UK Parliament's legacy Linked Data API (lda.data.parliament.uk) is still fully live: a keyless GET this run against /bills.json?_pageSize=1 returned a genuine 200, 1,663 B JSON document with a wildcard access-control-allow-origin: * header, confirming the stored cors: yes. It exposes dozens of Parliamentary datasets (bills, committees, attendance, petitions) via /endpoints.json (200, 9,947 B this run), each following the same paged Linked-Data-API envelope. As the entry's own summary already notes, this is a legacy platform — Parliament now also runs newer per-domain REST APIs (members-api.parliament.uk, bills-api.parliament.uk) that cover the same ground with a modern shape and are worth checking first for new integrations.

government-dataukparliamentlinked-dataopen-data
AuthenticationNone requiredCall it straight away — no key, no signup.
HTTPSSupportedTraffic is encrypted in transit.
CORSEnabledCallable directly from browser JavaScript.
PricingFreeNo paid tier — free for the documented use case.
FormatsJSON, XML, RDF/XMLResponses can be requested as JSON or XML or RDF/XML.

GreatAPIs Score

Score94out of 100
Authentication25/25No authentication required
Pricing20/20Free to use
Docs14/20Documentation URL provided
Formats15/15Supports 3 response formats
Freshness20/20Verified within 6 months

Embed this badge

Scored 94 on greatapis.com
<a href="https://greatapis.com/api/data-parliament-uk/"><img src="https://greatapis.com/badge/data-parliament-uk.svg" alt="Scored 94 on greatapis.com"></a>

Auth quickstart

  1. No API key, signup, or credit card required — a live GET this run against /bills.json?_pageSize=1 returned a full result set on the first anonymous try. Category-scoped datasets like /commonsdivisions.json?_pageSize=1 (200, 1,212 B this run) work the same way with no extra auth.
Stored keyNo key stored

Your key is stored only in this browser (localStorage) and sent directly to the API — never to greatapis.

List bills, one result page

GEThttps://lda.data.parliament.uk/bills.json?_pageSize=1

200 application/json

{
  "format": "linked-data-api",
  "version": "0.2",
  "result": {
    "_about": "http://eldaddp.azurewebsites.net/bills.json?_pageSize=1",
    "definition": "http://eldaddp.azurewebsites.net/meta/bills.json",
    "first": "http://eldaddp.azurewebsites.net/bills.json?_page=0",
    "items": [
      {
        "_about": "http://data.parliament.uk/resources/754405",
        "billType": "Ballot",
        "date": { "_value": "2018-12-21", "_datatype": "dateTime" },
        "homePage": "http://services.parliament.uk/bills/2017-19/prisonsinterferencewithwirelesstelegraphy.html",
        "identifier": { "_value": "2060" },
        "label": { "_value": "Prisons (Interference with Wireless Telegraphy)" },
        "session": [
          { "_about": "http://data.parliament.uk/resources/730830", "displayName": "2017-2019" }
        ],
        "sponsors": [
          { "_about": "http://data.parliament.uk/resources/754405/sponsors/1", "sponsorPrinted": ["Baroness Pidding"] },
          { "_about": "http://data.parliament.uk/resources/754405/sponsors/2", "sponsorPrinted": ["Maria Caulfield"] }
        ],
        "title": "Prisons (Interference with Wireless Telegraphy) Bill"
      }
    ],
    "itemsPerPage": 1,
    "next": "http://eldaddp.azurewebsites.net/bills.json?_page=1",
    "page": 0,
    "startIndex": 1,
    "totalResults": 2122,
    "type": "http://purl.org/linked-data/api/vocab#Page"
  }
}

The full live response above is 1,663 B; totalResults reports 2,122 bills as of this run. Every URL inside the envelope (_about, definition, first, next) resolves through the internal eldaddp.azurewebsites.net host rather than the public one you called — see the first gotcha below.

Try it

Developer reference

Base URLhttps://lda.data.parliament.uk
Key endpoints
  • GET/bills.json
  • GET/endpoints.json
  • GET/commonsdivisions.json

Gotchas & limits

  • Every pagination/definition URL inside the response echoes a different, internal host over plain HTTP — http://eldaddp.azurewebsites.net/... — never the public https://lda.data.parliament.uk you actually called. Confirmed live above: _about, definition, first, and next in the /bills.json response are all http://eldaddp.azurewebsites.net/... links. Code that follows the returned next link literally leaves the public HTTPS host and drops to a different, unencrypted internal one.
  • A dataset path that doesn't exist returns a real HTML error page, not JSON — a live GET against /nosuchdataset.json this run returned 404, 1,112 B, content-type: text/html, whose inline stylesheet is literally body { background-color: pink }. Code that unconditionally calls JSON.parse on the response body will throw on this error path even though every success path is JSON.
  • _pageSize is honored in full, unlike the Gazette's silent 100-item cap — a live sweep this run at 100/500/1000/2000 against /bills.json returned exactly that many items each time (69,955 B / 345,162 B / 673,378 B / 1,310,772 B), and only flattens out at 2,122 items (the dataset's real total) once the requested size exceeds it. itemsPerPage in the envelope keeps echoing the requested number (confirmed at _pageSize=10000) even once items itself stops growing past 2,122 — don't treat that field as a live count of what came back.
  • _page is 0-indexed while the envelope's own startIndex is 1-indexed — confirmed live: _page=0 (the default) returns startIndex: 1, and _page=1 returns startIndex: 2, i.e. the second bill, not the start of a second batch. Code that treats _page and startIndex as the same counter will be off by one.
  • The same path answers in three formats by extension alone, live-confirmed this run: /bills.xml?_pageSize=1 returns 200, application/xml, and /bills.rdf?_pageSize=1 returns 200, application/rdf+xml — no Accept header or query param needed, just swap .json for .xml or .rdf.

Availability

Uptime100%
Median latency344 ms
Last checkUp · 200 · Sep 2026

3 checks since Aug 2026. A person runs this check by hand, not an automated monitor.