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

- Publisher: Tweede Kamer der Staten-Generaal
- Area: Netherlands · Finest detail: motion, vote, member
- Period: 2008 – 2026 · Refreshed: daily
- Access: Open · Licence: CC0 1.0 (disclaimer Tweede Kamer)
- Join keys: zaaknummer, Kamerstuknummer, fractie
- Status: ok (2026-10-14) · nieuwste motie 2026Z22500
- URL: https://opendata.tweedekamer.nl/documentatie/introductie#heading-93

## What can you do with it?
- **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 it
1. **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`
2. **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
- Which FOI decisions relate to a parliamentary debate? → [open-overheid-woo](https://www.opendataindex.nl/en/bron/open-overheid-woo.md) via Kamerstuknummer. Search the ministry's FOI documents by dossier or paper number.

## Similar sources
- [Debat Direct](https://debatdirect.tweedekamer.nl): The debates themselves, live and on demand, with speaker information. No data API; the meetings are in the Gegevensmagazijn as Activiteit and Vergadering.
- [openraadsinformatie](https://www.opendataindex.nl/en/bron/openraadsinformatie.md): 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

## API (OData v4)

- Base: https://gegevensmagazijn.tweedekamer.nl/OData/v5
- Access: No key or account; the service document and counts work anonymously. (tested)
- Formats: JSON, XML (Atom)
- Filtering: OData v4 expressions in $filter; eq, ne, gt, ge, lt, le, and, or, not, contains(), startswith(), any(), year()

### Endpoints
- `GET /Persoon`: members (and former members)
- `GET /PersoonContactinformatie`: PersoonContactinformatie
- `GET /PersoonGeschenk`: PersoonGeschenk
- `GET /PersoonLoopbaan`: PersoonLoopbaan
- `GET /PersoonNevenfunctie`: PersoonNevenfunctie
- `GET /PersoonNevenfunctieInkomsten`: PersoonNevenfunctieInkomsten
- `GET /PersoonOnderwijs`: PersoonOnderwijs
- `GET /PersoonReis`: PersoonReis
- `GET /Commissie`: Commissie
- `GET /CommissieContactinformatie`: CommissieContactinformatie
- `GET /CommissieZetel`: CommissieZetel
- `GET /CommissieZetelVastPersoon`: CommissieZetelVastPersoon
- `GET /CommissieZetelVastVacature`: CommissieZetelVastVacature
- `GET /CommissieZetelVervangerPersoon`: CommissieZetelVervangerPersoon
- `GET /CommissieZetelVervangerVacature`: CommissieZetelVervangerVacature
- `GET /Fractie`: parties with number of seats
- `GET /FractieZetel`: FractieZetel
- `GET /FractieZetelPersoon`: FractieZetelPersoon
- `GET /FractieZetelVacature`: FractieZetelVacature
- `GET /Activiteit`: debates, committee meetings, hearings
- `GET /ActiviteitActor`: ActiviteitActor
- `GET /Agendapunt`: Agendapunt
- `GET /Besluit`: decisions on a case, with the voting method
- `GET /Stemming`: votes per party or member
- `GET /Zaak`: cases: motions, amendments, bills, questions (field Soort)
- `GET /ZaakActor`: ZaakActor
- `GET /Zaal`: Zaal
- `GET /Reservering`: Reservering
- `GET /Document`: documents: papers, letters, reports
- `GET /DocumentActor`: DocumentActor
- `GET /DocumentVersie`: DocumentVersie
- `GET /DocumentPublicatie`: DocumentPublicatie
- `GET /DocumentPublicatieMetadata`: DocumentPublicatieMetadata
- `GET /Kamerstukdossier`: Kamerstukdossier
- `GET /Vergadering`: Vergadering
- `GET /Verslag`: Verslag
- `GET /Toezegging`: Toezegging
- `GET /ToegezegdAan`: ToegezegdAan

### Parameters
- `$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
- `Zaak` (343619 codes): 
- `Document` (728947 codes): 
- `Besluit` (740618 codes): 
- `Stemming` (1030560 codes): 
- `Activiteit` (100752 codes): 
- `Vergadering` (7569 codes): 
- `Persoon` (4480 codes): 
- `Fractie` (160 codes): 
- `Kamerstukdossier` (7840 codes): 

### Fields of Zaak (18)
`Id` guid, `Nummer` string, `Soort` string, `Titel` string, `Citeertitel` string, `Alias` string, `Onderwerp` string, `Datum` datetimeoffset, `Kamer` string, `Voorhang` string, `Termijn` datetimeoffset, `Vergaderjaar` string, `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)

### Example
```
https://gegevensmagazijn.tweedekamer.nl/OData/v5/Zaak?$filter=Soort%20eq%20'Motie'&$orderby=Datum%20desc&$top=3&$select=Nummer,Onderwerp,Titel,Datum
```

## What you can build with it
- [National budget tracker: budgeted against spent](https://www.opendataindex.nl/en/bouwen/rijksbegroting-tracker.md): Track per ministry and per budget article what central government planned to spend and what it actually spent, year after year, with the motions and amendments the House filed on it.
- [Voting tracker: how did each party vote?](https://www.opendataindex.nl/en/bouwen/stemgedrag-tracker.md): Search a topic and see how each party in the House of Representatives voted on the motions about it: how often for, how often against, and which motions passed.


## Examples with real figures (9)

For each example the finding, the reference date and the call that fetches exactly these figures.

- **Amendments filed: 982 per year in 2025, 7% more than in 2009** (2025). Table Zaak. [Example](https://www.opendataindex.nl/en/voorbeeld/tk-amendementen)
  - `https://gegevensmagazijn.tweedekamer.nl/OData/v5/Zaak?$apply=filter((Soort%20eq%20'Amendement')%20and%20Verwijderd%20eq%20false)%2Fcompute(year(Datum)%20as%20Jaar)%2Fgroupby((Jaar)%2Caggregate(%24count%20as%20n))`
- **Government letters to the House: 4,935 per year in 2025, 17% less than in 2009** (2025). Table Zaak. [Example](https://www.opendataindex.nl/en/voorbeeld/tk-brieven-regering)
  - `https://gegevensmagazijn.tweedekamer.nl/OData/v5/Zaak?$apply=filter((Soort%20eq%20'Brief%20regering')%20and%20Verwijderd%20eq%20false)%2Fcompute(year(Datum)%20as%20Jaar)%2Fgroupby((Jaar)%2Caggregate(%24count%20as%20n))`
- **Gifts declared by members: 434 per year in 2025, 52% more than in 2010** (2025). Table PersoonGeschenk. [Example](https://www.opendataindex.nl/en/voorbeeld/tk-geschenken)
  - `https://gegevensmagazijn.tweedekamer.nl/OData/v5/PersoonGeschenk?$apply=filter((true)%20and%20Verwijderd%20eq%20false)%2Fcompute(year(Datum)%20as%20Jaar)%2Fgroupby((Jaar)%2Caggregate(%24count%20as%20n))`
- **Private members' bills: 13 per year in 2025, 2.2 times as much as in 2009** (2025). Table Zaak. [Example](https://www.opendataindex.nl/en/voorbeeld/tk-initiatiefwetten)
  - `https://gegevensmagazijn.tweedekamer.nl/OData/v5/Zaak?$apply=filter((Soort%20eq%20'Initiatiefwetgeving')%20and%20Verwijderd%20eq%20false)%2Fcompute(year(Datum)%20as%20Jaar)%2Fgroupby((Jaar)%2Caggregate(%24count%20as%20n))`
- **Written parliamentary questions: 1,993 per year in 2025, 34% less than in 2009** (2025). Table Zaak. [Example](https://www.opendataindex.nl/en/voorbeeld/tk-kamervragen)
  - `https://gegevensmagazijn.tweedekamer.nl/OData/v5/Zaak?$apply=filter((Soort%20eq%20'Schriftelijke%20vragen')%20and%20Verwijderd%20eq%20false)%2Fcompute(year(Datum)%20as%20Jaar)%2Fgroupby((Jaar)%2Caggregate(%24count%20as%20n))`
- **Oral questions at question time: 76 per year in 2025, 44% less than in 2009** (2025). Table Zaak. [Example](https://www.opendataindex.nl/en/voorbeeld/tk-mondelinge-vragen)
  - `https://gegevensmagazijn.tweedekamer.nl/OData/v5/Zaak?$apply=filter((Soort%20eq%20'Mondelinge%20vragen')%20and%20Verwijderd%20eq%20false)%2Fcompute(year(Datum)%20as%20Jaar)%2Fgroupby((Jaar)%2Caggregate(%24count%20as%20n))`
- **Motions filed in the House: 4,440 per year in 2025, 70% more than in 2009** (2025). Table Zaak. [Example](https://www.opendataindex.nl/en/voorbeeld/tk-moties)
  - `https://gegevensmagazijn.tweedekamer.nl/OData/v5/Zaak?$apply=filter((Soort%20eq%20'Motie')%20and%20Verwijderd%20eq%20false)%2Fcompute(year(Datum)%20as%20Jaar)%2Fgroupby((Jaar)%2Caggregate(%24count%20as%20n))`
- **What the House worked on last year: brief regering is the largest part, 31% in 2025** (2025). Table Zaak. [Example](https://www.opendataindex.nl/en/voorbeeld/tk-zaken-soort)
  - `https://gegevensmagazijn.tweedekamer.nl/OData/v5/Zaak?$apply=filter((true)%20and%20Verwijderd%20eq%20false%20and%20year(Datum)%20eq%202025)%2Fgroupby((Soort)%2Caggregate(%24count%20as%20n))`
- **Seats in the House: D66 is the largest part, 17% in november 2026** (november 2026). Table Fractie. [Example](https://www.opendataindex.nl/en/voorbeeld/tk-zetels)
  - `https://gegevensmagazijn.tweedekamer.nl/OData/v5/Fractie?$filter=(DatumInactief%20eq%20null)%20and%20Verwijderd%20eq%20false&$select=Afkorting,AantalZetels&$orderby=AantalZetels%20desc`
