NL Tweede Kamer Open Data Monitor
Pricing
from $3.00 / 1,000 kamerstuk results
NL Tweede Kamer Open Data Monitor
Fetch Dutch parliament (Tweede Kamer) kamerstukken, motions, amendments and votes from the official OData Open Data API, filtered by topic keyword, date range and document type, with voting results per party in one call. From $0.003/result, PPE.
NL Tweede Kamer Open Data Monitor 🇳🇱
Fetch Dutch parliament (Tweede Kamer) open data — kamerstukken, motions, amendments and voting results — filtered by topic keyword, date range and document type, straight from the official OData Open Data API.
The Tweede Kamer publishes an enormous amount of parliamentary data (tens of thousands of cases,
documents and votes) through gegevensmagazijn.tweedekamer.nl, a public OData v4 endpoint that requires
no API key or registration. But it's a raw, generic query interface with no topic search and OData-specific
query syntax ($filter, $expand, $skiptoken paging) — this actor turns it into a simple, filtered,
structured feed so you don't have to learn OData or the Kamer's own portal search.
Who is this for?
- Lobbyists & public affairs professionals tracking parliamentary developments on a specific dossier
- Policy advisors & government relations teams monitoring motions and amendments on their topic
- Journalists following how a bill or motion moves through parliament, including the vote outcome
- Legal/compliance teams tracking legislative status (e.g. related to a law they already classify against, such as this developer's other Cluster A actors)
- Researchers building datasets of Dutch parliamentary activity
- AI agents — flat JSON output, MCP-ready, ideal for legislative-research or policy-monitoring workflows
When should an AI agent use this?
- "Find all motions about climate policy submitted this year and how each party voted."
- "Track the legislative dossier for [bill topic] — what documents and votes have happened?"
- "Which amendments on [topic] were adopted (aangenomen) versus rejected (verworpen)?"
- "Show me recent parliamentary activity (motions, bills, letters) since last month."
- "Get the voting result per party for motion [number]."
- "List all written questions (Schriftelijke vragen) about [topic] this quarter."
What this Actor does
- Topic search — free-text match against the case title and subject (
Titel/Onderwerp), since the source API itself has no full-text search index; this actor uses OData'scontains()filter as the closest structural equivalent - Document type filter — restrict to motions, amendments, bills, written questions, EU proposals, etc.
- Date range filter — only cases last updated within a given period
- Voting results in one call — when enabled, each case is expanded with its linked decisions
(
Besluit) and, per decision, the actual per-party vote (Stemming) — a single$expandchain, no extra round-trips per result - Server-side pagination — follows the API's own
@odata.nextLink(skip-token based), so runs with hundreds of results don't hit the API's 250-per-page limit - Flat, structured output — one JSON object per parliamentary case, ready for datasets, webhooks or MCP tools
Input options
| Field | Description | Example |
|---|---|---|
zoekterm | Free text matched against the case title and subject | "klimaat" |
documentTypes | Filter by case type. Leave empty for all types. | ["Motie", "Amendement"] |
periodeVanaf | Only cases last updated on/after this date (YYYY-MM-DD) | "2026-01-01" |
periodeTot | Only cases last updated on/before this date (YYYY-MM-DD) | "2026-06-30" |
includeStemmingen | Include linked decisions and per-party voting results | true |
maxResults | Maximum number of cases to return (1-500) | 100 |
Output
Each result is one parliamentary case (Zaak — a kamerstuk, motion, amendment or other document type):
{"zaakId": "e0976e6c-54d9-4711-8eb9-e94525974654","nummer": "2026Z07976","titel": "Wijziging van Boek 7 van het Burgerlijk Wetboek in verband met het invoeren van een rechtsvermoeden van arbeidsovereenkomst op basis van een uurtarief","onderwerp": "Motie van de leden Patijn en Westerveld over de Dienst Toeslagen de naheffingen en boetes bij schijnzelfstandigen laten vergoeden","type": "Motie","status": "Vrijgegeven","datum": "2026-04-15T00:00:00+02:00","gewijzigdOp": "2026-07-24T12:09:40.02+02:00","vergaderjaar": "2025-2026","afgedaan": true,"kabinetsappreciatie": "Ontijdig","documenten": [{"documentId": "feb59372-6898-4dc1-9f52-9e7cf6d0e699","documentNummer": "2026D17989","soort": "Motie","titel": "Wijziging van Boek 7 van het Burgerlijk Wetboek...","datum": "2026-04-15T00:00:00+02:00"}],"stemuitslagen": [{"besluitId": "994e2590-c7db-46cc-9a8c-ac7be34517f4","uitslag": "Stemmen - verworpen","stemmingsSoort": "Hoofdelijk","stemmingen": [{ "fractie": "GroenLinks-PvdA", "stem": "Voor", "zetels": 25 },{ "fractie": "VVD", "stem": "Tegen", "zetels": 24 }]}],"bronUrl": "https://www.tweedekamer.nl/zoeken?qry=2026Z07976"}
typeis the source API'sZaak.Soort— one of ~37 possible values (Motie, Amendement, Wetgeving, Brief regering, Schriftelijke vragen, etc.); thedocumentTypesinput filters on this fieldkabinetsappreciatieis the cabinet's response to a motion/amendment where applicable (e.g. "Ontraden", "Overgenomen"),nullfor case types where it doesn't applystemuitslagenis only populated for decisions that actually recorded a per-party vote — manyBesluitrecords (e.g. "Ingediend", "Aangehouden") have noStemmingand are excluded automaticallybronUrllinks to the Tweede Kamer's own search page for this case number. The site uses a different detail-page URL structure per case type, which isn't derivable from the API response without guessing — the search page is a verified, working link for every case type
Use cases
Track motions on a specific topic, with voting results:
{"zoekterm": "klimaat","documentTypes": ["Motie"],"includeStemmingen": true,"maxResults": 100}
Follow a legislative dossier (bills + amendments) over a period, without voting detail:
{"zoekterm": "","documentTypes": ["Wetgeving", "Initiatiefwetgeving", "Amendement"],"periodeVanaf": "2026-01-01","includeStemmingen": false,"maxResults": 200}
Recent parliamentary activity across all case types:
{"zoekterm": "","documentTypes": [],"periodeVanaf": "2026-08-01","maxResults": 100}
Scheduling & integrations
- Schedules — run daily or weekly to catch new activity on a dossier (combine with
periodeVanaf) - Integrations — push results to Google Sheets, Slack, Zapier, Make, or any webhook
- API — fetch the dataset as JSON, CSV or Excel from your own code
- MCP — expose this actor as a tool for AI agents (Claude, Cursor, and other MCP clients)
Data source & legality
This actor uses the official Tweede Kamer Open Data API (gegevensmagazijn.tweedekamer.nl, OData v4),
the same data source behind the Kamer's own open-data portal (opendata.tweedekamer.nl).
- ✅ No scraping — public, auth-free JSON API, explicitly published as open data for reuse
- ✅ Parliamentary cases, motions and votes concern public-role activity of politicians in their official capacity (how a Member of Parliament voted), not private personal data
- ⚠️ This actor is a data-monitoring tool, not legal or political advice. Always consult the Tweede
Kamer's own site (
bronUrl) orofficielebekendmakingen.nlfor the authoritative, legally binding version of any document.
Pricing
Pay-per-event: you only pay for cases actually delivered, plus a small extra charge when a case comes with an actual recorded vote.
| Event | Price | Description |
|---|---|---|
apify-actor-start | $0.00005 | Apify default |
kamerstuk-result | $0.003 | Each parliamentary case delivered to your dataset |
stemuitslag-result | $0.006 | Each delivered case that includes an actual recorded vote (only with includeStemmingen enabled) |
FAQ
Why doesn't zoekterm search the full text of documents?
The source API has no full-text search index. zoekterm matches against the case title (Titel) and
subject (Onderwerp) fields using the API's own contains() filter — the closest structural equivalent
available without downloading and indexing every document body yourself.
Why is maxResults capped at 500?
The API itself caps a single page at 250 results ($top above 250 returns an error); the actor follows
the API's own pagination link (@odata.nextLink) to go beyond that, but keeps a sane run-size ceiling.
Why do some cases have an empty stemuitslagen array even with includeStemmingen: true?
Not every parliamentary decision (Besluit) involves an actual vote — many are procedural (e.g.
"Ingediend"/submitted, "Aangehouden"/postponed). Only decisions where the API records per-party votes
produce a stemuitslagen entry.
Does this actor cover the Eerste Kamer (Senate)? No — the underlying API and this actor cover the Tweede Kamer (House of Representatives) only, the chamber where kamerstukken, motions and amendments in the input scope of this actor originate.
What does kabinetsappreciatie mean?
It's the cabinet's (government's) formal response to a motion or amendment — e.g. "Ontraden" (advised
against), "Overgenomen" (adopted by the cabinet), "Overlaten aan het oordeel van de Kamer" (left to
parliament's judgment). null for case types where this doesn't apply (e.g. written questions).
Related Actors
Also by this developer — Dutch public-data actors with a similar official-open-data → structured-feed pattern:
- NL Jurisprudentie Monitor per Rechtsgebied — same pattern applied to Dutch court rulings, for legal teams tracking case law alongside legislative developments.
- NL Wetgeving Sectortracker — tracks Dutch legislation relevant to a business sector; pairs well with tracking a bill's parliamentary progress here.
Zoekwoorden: tweede kamer monitor, kamerstukken volgen, moties zoeken, stemuitslagen tweede kamer, wetgeving volgen, parlementaire data, open data tweede kamer, dossier tracker, amendementen, politiek monitoring, lobbyist tool.
Keywords
tweede kamer, kamerstukken, moties, stemmingen, wetgeving, parlement, politiek, open data, netherlands, dutch parliament, government, legal monitoring, amendementen, dossier, lobbying, public affairs
Changelog
0.1.0 - Initial release
- Topic/period/type-filtered fetch of Tweede Kamer
Zaak(kamerstuk/motion/amendment/etc.) records via the official OData v4 API - Linked documents and per-party voting results in one
$expandcall (no N+1 queries) - Server-side pagination via
@odata.nextLink - PPE pricing:
kamerstuk-result@ $0.003,stemuitslag-result@ $0.006