Hansard Parliamentary Debates avatar

Hansard Parliamentary Debates

Pricing

from $0.60 / 1,000 contributions

Go to Apify Store
Hansard Parliamentary Debates

Hansard Parliamentary Debates

🏷️ From $0.60 / 1K | Every contribution from the House of Commons and Lords via the official Hansard API. Speaker, party, constituency, full text and timestamps, ideal for political research and AI training data.

Pricing

from $0.60 / 1,000 contributions

Rating

0.0

(0)

Developer

丂卩ㄖㄖҜㄚ

丂卩ㄖㄖҜㄚ

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

5 days ago

Last modified

Categories

Share

Extract full text UK parliamentary debates from the official Hansard record: one row per contribution, with the speaker, party, constituency, debate title, timestamp and the text itself.

🔍 What does UK Hansard Parliamentary Debates do?

It walks the official Hansard record for a date range and returns every contribution as a clean row of data, ready for a corpus, a RAG index, a database or your own product.

It covers:

  • House of Commons debates
  • House of Lords debates
  • Westminster Hall debates
  • Written ministerial statements

Weekends are skipped automatically, and days when the House did not sit return nothing.

📊 What data can I extract from Hansard?

One row per contribution:

FieldDescription
dateSitting date, YYYY-MM-DD
houseCommons or Lords
sectionDebate, WestHall or WMS
debateTitleTitle of the debate or question
debateIdHansard debate identifier
speakerMember name, null for unattributed text
roleMinisterial role or Chair, where the attribution carries one
constituencySeat, Commons members only
partyParty abbreviation, for example Lab or Con
memberIdParliament member id, useful for joining to other datasets
timeTimestamp of the contribution where Hansard records one
textFull contribution text, markup stripped
wordCountWord count
uinUnique identifying number for written questions
contributionIdHansard contribution identifier
urlLink to the debate on Hansard

💡 Why use Hansard data?

LLM training and fine-tuning. Millions of words of formal political discourse, already attributed to a named speaker and party.

RAG and search. Build a parliamentary knowledge base you can cite, with a source URL on every row.

Policy and legislative research. Track how a bill or a topic was argued over time, and by whom.

Fact checking and media. Verify a quote against the official record rather than a press report of it.

🚀 How do I use UK Hansard Parliamentary Debates?

  1. Click Try for free.
  2. Pick a chamber: commons, lords or both.
  3. Set startDate and endDate to bound the range, YYYY-MM-DD.
  4. Add a searchTerm to keep only contributions containing a word or phrase, and set maxSpeeches to cap the run.
  5. Click Start, then download the results as JSON, CSV or Excel, or pull them from the API.

⬇️ Input

{
"chamber": "commons",
"startDate": "2024-01-01",
"searchTerm": "housing",
"maxSpeeches": 5000
}
FieldTypeDefaultWhat it does
chamberstringcommonsWhich house to collect, commons, lords or both
startDatestring2024-01-01First sitting date to collect, YYYY-MM-DD
endDatestringLast sitting date, leave empty for today
searchTermstringOnly contributions containing this term
includeWrittenAnswersbooleantrueInclude written ministerial statements, the WMS section
includeWestminsterHallbooleantrueInclude Westminster Hall debates
maxSpeechesinteger5000Hard cap on the number of results

Two more options are worth knowing. maxDays limits the run to N weekday dates, where 0 means every weekday in the range. includeProcedural adds short non-speech entries such as Prayers and the sitting date, and it is off by default because each one is a billable result.

⬆️ Output

Table view

Results arrive as a Contributions table you can sort and filter in the Console, with the date, house, debate title, speaker and word count lined up for scanning.

JSON

A typical row:

{
"date": "2026-06-03",
"house": "Commons",
"section": "Debate",
"debateTitle": "Supreme Court Dillon Judgment: Policy Implications",
"debateId": "C66E1F5D-9FA8-409F-9D3B-87F3A026A61A",
"speaker": "Peter Swallow",
"role": null,
"constituency": "Bracknell",
"party": "Lab",
"memberId": 5182,
"time": "11:32:00",
"text": "What assessment he has made of the potential implications...",
"wordCount": 26,
"uin": null,
"contributionId": "26060368000025",
"url": "https://hansard.parliament.uk/commons/2026-06-03/debates/C66E1F5D-9FA8-409F-9D3B-87F3A026A61A"
}

Download it from the run as JSON, CSV or Excel, or read it straight from the API.

Dataset size examples

Typical volume per time period:

PeriodContributionsApproximate words
1 day50 to 20050,000 to 200,000
1 week200 to 800200k to 800k
1 month1,000 to 3,0001M to 3M
1 year12,000 to 35,00012M to 35M

And for larger corpora:

RangeContributionsApproximate words
Full 2024around 25,000around 25M
Last 5 yearsaround 125,000around 125M
Modern era, 2000 onwards600,000 plus600M plus

Three runs to size against: 30 days of Commons returns around 5,000 contributions; climate change across both houses since 2020 returns around 2,000; a full calendar year across both houses returns around 30,000.

For an ongoing corpus, run daily at 2am UTC to capture the previous day's debates. Hansard publishes the next working day after a sitting.

For a historical corpus, run once across the full date range and store the output in your own pipeline rather than re-fetching it.

Proxies and reliability

The Actor uses Apify's residential proxy service to avoid rate limiting and keep access to Hansard reliable. Proxy cost is included in the per-result price, so there is nothing to configure.

⏱️ How long does a run take?

Measured on real runs, so you know what normal looks like and can tell it apart from a run that has stalled.

Contributions returnedTypical run time
205 to 6 seconds
200about 20 seconds
500, roughly one sitting dayabout 25 seconds
1,000, roughly five sitting days90 to 100 seconds

What makes a run long is the number of sitting days in the date range, not the number of contributions that come back, because every debate on every day in range has to be opened before it can be filtered. A searchTerm over a whole month is the slow case: a June search for "artificial intelligence" returned 34 matching contributions and took 3 to 6 minutes, because it read the month and kept almost none of it. Narrow the date range first and the search term second. The first few seconds of any run are the container starting rather than the work.

A run is never silently stuck. Each sitting day is logged as it is opened, and contributions are written to the dataset as they are parsed rather than held back to the end, so a run that hits its time limit still leaves everything it had already collected. A range with no sittings in it ends successfully with an empty dataset and the reason in its status message.

Set the run timeout to suit the size of the ask. This Actor's default is 3600 seconds, which is comfortably more than the largest run in the table above (30 sitting days takes about 6 minutes). You are charged per delivered result rather than per minute, so a generous timeout costs you nothing and a tight one risks losing the run's work. Lower it only if you want a hard ceiling on how long a scheduled run may sit.

💰 How much does it cost?

You pay per contribution returned. Set maxSpeeches to cap what a run can cost, which matters most when a wide date range would otherwise produce far more rows than you expected.

Days when the House did not sit return nothing and are not charged. Leaving includeProcedural off keeps short procedural entries such as Prayers out of the bill. Paid Apify plans get a lower rate per contribution.

🔌 Integrations

Send results straight to Google Sheets, Slack, Airtable, Zapier, Make or your own webhook using Apify integrations. You can also trigger a run whenever something happens in another tool, and the Actor is callable from AI agents and MCP clients through the standard Apify API.

🔗 Using UK Hansard Parliamentary Debates with the Apify API

curl -X POST "https://api.apify.com/v2/acts/spookyweb~uk-hansard-parliamentary-debates/run-sync-get-dataset-items?token=YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"chamber": "commons", "startDate": "2024-01-01", "searchTerm": "housing", "maxSpeeches": 5000}'

Or with the Apify client:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_TOKEN' });
const run = await client.actor('spookyweb/uk-hansard-parliamentary-debates').call({
chamber: 'commons',
startDate: '2024-01-01',
searchTerm: 'housing',
maxSpeeches: 5000,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();

Full detail is in the Apify API reference, and every run is also callable from the Python and JavaScript clients.

❓ FAQ

Does it cover the Lords as well as the Commons?

Yes. Set chamber to lords for the upper house only, or both to collect the two together. The house field on every row tells you which one a contribution came from, so a both run is easy to split afterwards.

Does it include written questions and Westminster Hall?

Yes, and both are on by default. includeWrittenAnswers covers written ministerial statements, includeWestminsterHall covers Westminster Hall debates. The section field labels each row as Debate, WestHall or WMS, so you can filter them apart later. Written parliamentary questions and answers live in a separate Parliament API and are not part of the Hansard debate record.

How far back does it go?

The official Hansard record runs back to 1803, and structured coverage through the Hansard API is reliable from 2005 onwards. Set startDate to whatever you need and the Actor walks forward from there, skipping weekends and non-sitting days.

Can I search for a term across debates?

Yes, searchTerm keeps only contributions containing that term. It is the cheapest way to build a topic corpus, because contributions that do not match are never returned and never charged.

What counts as one item?

One contribution, meaning a single speech, intervention or written statement, exactly as Hansard segments it. That is also the billing unit. Procedural entries such as Prayers are contributions too, which is why includeProcedural is off by default.

Do I need a Hansard API key?

No. There is nothing to register for and no quota to manage. Give the Actor a date range and it handles pagination, non-sitting days and rate limiting for you.

Hansard is the official report of proceedings in Parliament, published under the Open Parliament Licence, which expressly permits reuse, including commercial reuse, subject to acknowledgement. Contributions are made by members in their public role. This Actor uses the official Hansard API.

Source: hansard.parliament.uk. Apify's ethical scraping guide covers the wider picture.

👍 Your feedback

Found a bug, or want a field that is not here yet? Open an issue on the Actor's Issues tab. Requests that make the data more useful get built, and problems get fixed quickly.

🔎 You might also like

ActorWhat it does
UK Case Law Search and MonitorCourt judgments and tribunal decisions from Find Case Law, with full text and change monitoring
UK ICO Enforcement ActionsICO fines, reprimands, enforcement notices and prosecutions with fine amounts and sectors
UK Planning ApplicationsPlanning applications from every UK council, tagged by the type of work proposed