
Dutch House of Representatives open data
Everything the House does, as an open API: motions and amendments, how each party voted, written questions, debates and committees, parliamentary papers, and the members themselves, with their side jobs, gifts and trips.

Amendments filed: 982 per year in 2025, 7% more than in 2009
Amendments filed, 2009 – 2025, per year. The highest point was 2016 (1,163).
Government letters to the House: 4,935 per year in 2025, 17% less than in 2009
Government letters to the House, 2009 – 2025, per year. The highest point was 2009 (5,958).
Gifts declared by members: 434 per year in 2025, 52% more than in 2010
Gifts declared by members, 2010 – 2025, per year. The highest point was 2018 (592).
Private members' bills: 13 per year in 2025, 2.2 times as much as in 2009
Private members' bills, 2009 – 2025, per year. The highest point was 2016 (28).
Written parliamentary questions: 1,993 per year in 2025, 34% less than in 2009
Written parliamentary questions, 2009 – 2025, per year. The highest point was 2019 (3,076).
Oral questions at question time: 76 per year in 2025, 44% less than in 2009
Oral questions at question time, 2009 – 2025, per year. That is the lowest point in the series.
Motions filed in the House: 4,440 per year in 2025, 70% more than in 2009
Motions filed in the House, 2009 – 2025, per year. The highest point was 2022 (5,010).
What the House worked on last year: brief regering is the largest part, 31% in 2025
Breakdown in 2025: brief regering 31%, motie 28%, schriftelijke vragen 12%, amendement 6.1%, brief commissie 5.3%, position paper 3.5%, other (26) 14%. Total: 15,992 cases.
What you can build with it2
What can you do with it?3 ideas
Which party files the most motions?
Count motions per sponsor and year. Also check how many were adopted.
Voting records side by side
Put all votes of two parties in a year side by side and calculate how often they agreed.
Side jobs and gifts
Per member there are side jobs, income from them, gifts received and trips. Link them to the committees they sit on.
How to process it2 steps
Use the new addresses (OData v5)
Since 12 June 2026 there is a new version of the OData API, with the same 38 entities but different field names. The date of a case is called Datum there (in v4: GestartOp). This example returns the latest motions.
https://gegevensmagazijn.tweedekamer.nl/OData/v5/Zaak?$filter=Soort%20eq%20'Motie'%20and%20Verwijderd%20eq%20false&$orderby=Datum%20desc&$top=3&$select=Nummer,Onderwerp,Datum
Count per year in one call
$apply also works in v5. This gives the number of motions per year without fetching everything (on 16 October 2026: 66,147 motions in total, the same in v4 and v5).
https://gegevensmagazijn.tweedekamer.nl/OData/v5/Zaak?$apply=filter(Soort%20eq%20'Motie'%20and%20Verwijderd%20eq%20false)/compute(year(Datum)%20as%20Jaar)/groupby((Jaar),aggregate($count%20as%20n))
Interesting combinations
Similar sources
- DDDebat Direct not in the index yet
The debates themselves, live and on demand, with speaker information. No data API; the meetings are in the Gegevensmagazijn as Activiteit and Vergadering.
- Open Council Information
The same kind of documents, but from municipal councils and provinces.
What to watch out for
- At most 250 per request
A higher $top returns an error. Page with $skip, or use the SyncFeed for bulk.
- Votes hang off decisions
A vote belongs to a Besluit (decision), which belongs to a Zaak (the motion). Use $expand or join on Besluit_Id.
- Version 4 is deprecated
On 29 May 2026 the House announced that the old address (/OData/v4/2.0) would stop returning results from 1 October 2026. On 16 October 2026 v4 still answered, with the same counts as v5. Build new code on /OData/v5. The SyncFeed does not change.
- Different field names in v5
An old field name in v5 returns an error. Examples: Zaak.GestartOp becomes Datum, Organisatie becomes Kamer, Volgnummer becomes Ondernummer; Document.DocumentNummer becomes Nummer; ActorNaam and ActorFractie become Naam and FractieNaam (Stemming, ZaakActor, DocumentActor, ActiviteitActor); Relatie becomes Rol. Zaak.Status, HuidigeBehandelstatus and GrootProject are dropped. The full list is in the House's news item: https://opendata.tweedekamer.nl/nieuws/nieuwe-versie-odata-api
APIOData v4 · read 16 Oct 2026
No key or account; the service document and counts work anonymously. tested
JSONXML (Atom)
Base URL
https://gegevensmagazijn.tweedekamer.nl/OData/v5
Endpoints 38
- GET
/Persoonmembers (and former members) - GET
/PersoonContactinformatiePersoonContactinformatie - GET
/PersoonGeschenkPersoonGeschenk - GET
/PersoonLoopbaanPersoonLoopbaan - GET
/PersoonNevenfunctiePersoonNevenfunctie - GET
/PersoonNevenfunctieInkomstenPersoonNevenfunctieInkomsten - GET
/PersoonOnderwijsPersoonOnderwijs - GET
/PersoonReisPersoonReis - GET
/CommissieCommissie - GET
/CommissieContactinformatieCommissieContactinformatie - GET
/CommissieZetelCommissieZetel - GET
/CommissieZetelVastPersoonCommissieZetelVastPersoon - GET
/CommissieZetelVastVacatureCommissieZetelVastVacature - GET
/CommissieZetelVervangerPersoonCommissieZetelVervangerPersoon - GET
/CommissieZetelVervangerVacatureCommissieZetelVervangerVacature - GET
/Fractieparties with number of seats - GET
/FractieZetelFractieZetel - GET
/FractieZetelPersoonFractieZetelPersoon - GET
/FractieZetelVacatureFractieZetelVacature - GET
/Activiteitdebates, committee meetings, hearings - GET
/ActiviteitActorActiviteitActor - GET
/AgendapuntAgendapunt - GET
/Besluitdecisions on a case, with the voting method - GET
/Stemmingvotes per party or member - GET
/Zaakcases: motions, amendments, bills, questions (field Soort) - GET
/ZaakActorZaakActor - GET
/ZaalZaal - GET
/ReserveringReservering - GET
/Documentdocuments: papers, letters, reports - GET
/DocumentActorDocumentActor - GET
/DocumentVersieDocumentVersie - GET
/DocumentPublicatieDocumentPublicatie - GET
/DocumentPublicatieMetadataDocumentPublicatieMetadata - GET
/KamerstukdossierKamerstukdossier - GET
/VergaderingVergadering - GET
/VerslagVerslag - GET
/ToezeggingToezegging - GET
/ToegezegdAanToegezegdAan
The APIs of this source 2 · from the provider's documentation from the description
OData API (v5)
Targeted search: with entities, attributes and filters you build your own query as a URL (the API on this page).
https://gegevensmagazijn.tweedekamer.nl/OData/v5- GET
/Zaak?$filter=Soort eq 'Motie'Moties, met $orderby, $select en $expand - GET
/Zaak?$apply=…groupby(…)Tellen en groeperen in de API zelf - GET
documentatiehttps://opendata.tweedekamer.nl/documentatie/odata-api
Open Data Index uses this API for the House blocks and the status check.
SyncFeed API
Synchronising: keep (part of) the Gegevensmagazijn in your own database, with a feed of all changes.
https://gegevensmagazijn.tweedekamer.nl/SyncFeed/2.0/Feed- GET
/FeedAtom-feed met wijzigingen, te volgen met een volgnummer - GET
documentatiehttps://opendata.tweedekamer.nl/documentatie/syncfeed-api
Filtering platform
OData v4 expressions in $filter
Parameters 7
$filter | select rows, e.g. Soort eq 'Motie' and Datum ge 2025-01-01T00:00:00Z | platform |
$select | only these fields | platform |
$expand | include related entities, e.g. Zaak with Besluit and Stemming | platform |
$orderby | sorting, e.g. Datum desc | platform |
$top / $skip | paging | platform |
$count | include total ($count=true) or count only (/$count) | platform |
$apply | group and count, e.g. groupby((Soort),aggregate($count as n)) | tested |
Dimensions · = space in the key
| Dimension | Codes | Examples |
|---|---|---|
Zaakzaken: moties, amendementen, wetsvoorstellen, Kamervragen (veld Soort) | 343,619 | |
Documentdocumenten: Kamerstukken, brieven, verslagen | 728,947 | |
Besluitbesluiten over een zaak, met de stemmingssoort | 740,618 | |
Stemmingstemmingen per fractie of Kamerlid | 1,030,560 | |
Activiteitdebatten, commissievergaderingen, gesprekken | 100,752 | |
VergaderingVergadering | 7,569 | |
PersoonKamerleden (en oud-Kamerleden) | 4,480 | |
Fractiefracties met aantal zetels | 160 | |
KamerstukdossierKamerstukdossier | 7,840 |
Fields of Zaak 18
| Name | Type | Meaning |
|---|---|---|
Id | guid | |
Nummer | string | |
Soort | string | |
Titel | string | |
Citeertitel | string | |
Alias | string | |
Onderwerp | string | |
Datum | datetimeoffset | |
Kamer | string | |
Voorhang | string | |
Termijn | datetimeoffset | |
Vergaderjaar | string |
Show all 18
| Name | Type | Meaning |
|---|---|---|
Ondernummer | int32 | |
Afgedaan | boolean | |
GewijzigdOp | datetimeoffset | |
ApiGewijzigdOp | datetimeoffset | |
Verwijderd | boolean | |
Kabinetsappreciatie | string |
Limits and pitfalls
- At most 250 rows per request ($top); higher returns an error. Follow @odata.nextLink or page with $skip. tested
- Not all data start at once: Parlis (activities, documents, votes) since 1 September 2008, VLOS (reports) since 25 June 2013, Sesam (members, parties, committees) since 1 September 2021, commitments since 1 September 2022. Series before those dates are incomplete. from the description
- Licence: CC0 1.0 unless stated otherwise (disclaimer: https://opendata.tweedekamer.nl/disclaimer). The House does not endorse the use and excludes liability. from the description
- For everything at once there is the SyncFeed (gegevensmagazijn.tweedekamer.nl/SyncFeed/2.0/Feed): an Atom feed with all changes. tested
- Counting and grouping work in the API itself: $apply=groupby((Soort),aggregate($count as n)). tested
- Records are not deleted but get Verwijderd = true; always filter on it. experience
Try it HTTP 200 · 320 ms · 16 Oct
https://gegevensmagazijn.tweedekamer.nl/OData/v5/Zaak?$filter=Soort eq 'Motie'&$orderby=Datum desc&$top=3&$select=Nummer,Onderwerp,Titel,Datum
{
"@odata.context": "https://gegevensmagazijn.tweedekamer.nl/OData/v5/$metadata#Zaak(Nummer,Onderwerp,Titel,Datum)",
"value": [
{
"Nummer": "2026Z22500",
"Titel": "Vaststelling van de begrotingsstaten van het Ministerie van Volksgezondheid, Welzijn en Sport (XVI) voor het jaar 2027",
"Onderwerp": "Motie van het lid Dobbe",
"Datum": "2026-10-15T00:00:00+02:00"
},
{
"Nummer": "2026Z22487",
"Titel": "Vaststelling van de begrotingsstaten van het Ministerie van Volksgezondheid, Welzijn en Sport (XVI) voor het jaar 2027",
"Onderwerp": "Motie van het lid Van Meijeren",
"Datum": "2026-10-15T00:00:00+02:00"
}
]
}Shortened response, saved at harvest time. Click the URL for the real, current response.
Read from service document: 38 entities · data model: 38 entity types with fields. Labels: from the description stated in what the api itself publishes. tested from our own small call. platform applies to every api on this platform, per its documentation. experience learned while building open data index.
More from Tweede Kamer in our index
3 datasets in Open Archieven, data.overheid.nl. These changed most recently.
More in this topic
See how this page is built
bron: tweedekamer-opendata blokken: [] secties: - ideeen - verwerken - koppelingen - vergelijkbaar - beperkingen cache: tag: bron:tweedekamer-opendata ververs: na statuscheck, als de bron nieuwer is statuscheck: methode: "OData v5: nieuwste motie (Datum)" verwacht: dagelijks
Source: content/bronnen/tweedekamer-opendata.yaml · Markdown




