
Election results from the Electoral Council
The official results of all elections: House of Representatives, municipal council, provincial, water board, European Parliament and referendums. The results database goes back to 1848 and has a CSV per municipality for each election. For recent elections data.overheid.nl also has the count files (EML) with votes per polling station and per candidate.

Everything that's in it176
All elections in the Kiesraad's election results database, by type and decade, fetched every night. Every election has its own page with the CSV per municipality and per polling station.
Tweede Kamer64
Eerste Kamer6
Europees Parlement10
Provinciale Staten23
Waterschap3
Gemeenteraad60
Eilandsraad5
Kiescollege2
Nationaal referendum3
Votes for D66, 2025 general election: highest in Heemstede (29.5%), lowest in Urk (0.7%)
Votes for D66, 2025 general election per municipality, October 2025, in percent of valid votes. Netherlands as a whole: 16.9. 342 municipalities with a figure.
Votes for the PVV, 2025 general election: highest in Rucphen (46.2%), lowest in Rozendaal (5.1%)
Votes for the PVV, 2025 general election per municipality, October 2025, in percent of valid votes. Netherlands as a whole: 16.7. 342 municipalities with a figure.
Votes per party in the 2025 House of Representatives election: most D66 (1,790,634 votes), then PVV (Partij voor de Vrijheid) and VVD
Votes per party in the 2025 House of Representatives election, October 2025, in votes. Total: 10,571,990; the largest 12 of 27 categories are shown. D66 is 17% of the total. 15 parties won seats (D66 and PVV (Partij voor de Vrijheid) 26 each): D66 26, PVV (Partij voor de Vrijheid) 26, VVD 22, GROENLINKS / Partij van de Arbeid (PvdA) 20, CDA 18, JA21 9, Forum voor Democratie 7, BBB 4, DENK 3, Staatkundig Gereformeerde Partij (SGP) 3, Partij voor de Dieren 3, ChristenUnie 3, SP (Socialistische Partij) 3, 50PLUS 2, Volt 1. Turnout 78.3%.
What you can build with it1
What can you do with it?4 ideas
Where did each party win?
Download the results per municipality of the 29 October 2025 general election and colour a map by largest party. Nationally D66 and PVV each won 26 seats.
Turnout over the years
The database has eligible voters and turnout per election. In 2025, 78.3% of the 13,589,128 eligible voters turned out. Put the general elections side by side.
Preference votes per candidate
The 2026 municipal election CSV shows per municipality how many votes each candidate received. Find candidates who overtook higher-placed names with preference votes.
Votes per polling station next to the neighbourhood
Take the votes per polling station from the EML count files, find where each polling station is, and compare with CBS neighbourhood figures. Note: voters may vote anywhere in their municipality.
How to process it4 steps
Pick the election in the database
Each election has a code: type plus date, for example TK20251029 or GR20260318. You find them on the database home page.
https://www.verkiezingsuitslagen.nl/verkiezingen
Download the results per municipality
A semicolon CSV: municipality, code, party, number of votes. The 2025 general election is 359 kB.
https://www.verkiezingsuitslagen.nl/uitslag/verkiezing/TK20251029/gemeenten
For polling stations and candidates, go to data.overheid.nl
There you find a dataset per election with EML files (XML) and often a CSV. Search for 'verkiezingsuitslag' with the Kiesraad as owner.
https://data.overheid.nl/data/api/3/action/package_search?q=verkiezingsuitslag&fq=authority:%22http://standaarden.overheid.nl/owms/terms/Kiesraad%22&rows=50
Read the long format
The 2026 municipal CSV has one value per row: the VeldType column says what it is (Kiesgerechtigden, Opkomst, KandidaatAantalStemmen …), the Waarde column holds the number. Pivot the table before calculating.
https://data.overheid.nl/sites/default/files/dataset/09cf04e7-11ac-4b53-a2cc-baccf95e82fd/resources/GR2026.csv
Interesting combinations


Do higher-income municipalities vote differently?
Turn G0518 into the CBS code GM0518 and join to average income. Use the municipal boundaries of the election year.


Do parties in the House vote the way their voters in your municipality would expect?
Party names differ between the sources ('PVV (Partij voor de Vrijheid)' in the results). Build your own lookup table first.
Similar sources
Dutch House of Representatives open dataWhat happens after the election: parties with their seats, motions and votes in the House.
- Open Council Information
What elected municipal councils decide afterwards, from council information systems.
What to watch out for
- Every election has a different format
The 2025 general election CSV has one row per party per municipality; the 2026 municipal one is long (VeldType and Waarde) and includes candidates. Older datasets mix EML, Excel and other municipal files. Write a separate reader per election.
- Polling station CSV without municipality
Where the database has polling stations (some elections since 2012), the CSV lacks the municipality: code SB25 occurs in many municipalities. Use the EML files per municipality for polling stations. For the 2025 general election the polling station CSV is empty.
- EML is XML without support
The Electoral Council itself says it offers no support for the EML format. The files come in large zips, for the 2025 general election in three parts.
- Provisional or final
The 2026 municipal dataset calls its own data provisional. Re-votes (Gorinchem, 29 April 2026) and merger elections are listed separately. Read the notes of each dataset.
- Municipal boundaries shift
Because of mergers, municipalities from an old election may no longer exist. Next to the municipality code the database gives an 'AmsterdamseCode' (historical code). Compare series only on the same boundaries.
APIBestanden (CSV) + JSON van de website · read 16 Oct 2026
No key or account needed tested
elections in the database, 1848 to 2026 (list pages, 16 Oct 2026) experience
csvjsoneml/xml
Base URL
https://www.verkiezingsuitslagen.nl
Endpoints 5
- GET
/uitslag/verkiezing/{code}/gemeentenCSV with the result per municipality and party (semicolon, UTF-8 without BOM). TK2025: 359 kB, 8,150 lines, 343 codes, 27 parties. - GET
/uitslag/verkiezing/{code}/stembureausCSV per polling station and party. Only filled for some elections (GR2022: 8.7 MB); for TK2025, PS2023, EP2024 only the header line. - GET
/verkiezingen/detailJson/{code}JSON the site uses for the detail page: Info (name, date, remark), Stemregio (electorate, turnout, valid, blank and invalid votes), PieChart (votes and percentage per party), Regios (provinces, electoral districts). Undocumented. - GET
/verkiezingen/detail/{code}Detail page (HTML); the national result with seats is JSON inside <textarea id="UitslagData">. - GET
/Verkiezingen/index/{pagina}?v=1800&t=2027List of elections (HTML, 10 per page) with codes, turnout and votes cast. This is where you find the codes.
Filtering tested
No filters: one file per election. Filter yourself on the Code (municipality) or Partij column.
Parameters 1
code | Election code = type + date YYYYMMDD: TK (House of Representatives), EK, EP, PS, WS, GR (municipal council), ER, NR/RR (referendum). E.g. TK20251029, GR20220316. | tested |
Columns in the CSV per municipality (and per polling station) 7
| Name | Type | Meaning |
|---|---|---|
Gemeente | tekst | Gemeentenaam zoals in dat jaar ('s-Gravenhage); niet uniek (twee keer Bergen) |
Code | tekst | Kiesraad-gemeentecode G0518 (= CBS GM0518). G9010 NBSB = briefstemmers buitenland, geen gemeente |
AmsterdamseCode | tekst | Historische gemeentecode (Amsterdamse code, bv. 11434) |
Partij | tekst | Partijnaam zoals op het stembiljet |
AantalStemmen | getal | Stemmen op de partij in die gemeente; leeg = partij deed daar niet mee |
AantalZetels | getal | Alleen bij gemeenteraadsverkiezingen gevuld (zetels in de raad); leeg bij TK, PS, EP |
Stembureau | tekst | Alleen in de stembureau-CSV: nummer en naam ("000 - -"); Code is dan SB0, SB25 … zonder gemeente |
Limits and pitfalls
- No key and no documented limit. One file per election, usually a few hundred kB. tested
- The Azure firewall rejects the default Python requests User-Agent (HTTP 403). Always set your own User-Agent; curl and an honest UA work. tested
- An unknown election code returns HTTP 500 with an empty body, not 404. tested
- The polling-station CSV has no municipality column: codes like SB25 occur in many municipalities. For polling stations use the per-municipality EML files from data.overheid.nl. tested
- In detailJson, counts in Stemregio are Dutch-formatted text ("13.589.128", "78,3%"); in PieChart they are numbers. tested
- Skip codes from G9000 when counting municipalities; join on code, not name (Bergen NH G0373 and Bergen L G0893). experience
- Formats on data.overheid.nl differ per election (EML zips, wide or long CSV, Excel). Its CKAN API (/data/api/…) falls under Disallow: /data/ in robots.txt; the files themselves (/sites/default/files/…) do not. tested
Try it HTTP 200 · 385 ms · 16 Oct
https://www.verkiezingsuitslagen.nl/verkiezingen/detailJson/TK20251029
{
"Info": {
"KaartId": 67,
"Id": 1876,
"Code": "TK20251029",
"Name": "Tweede Kamer",
"Date": "29 oktober 2025",
"Opkomst": null,
"UitgebrachteStemmen": null,
"Opmerking": "<b>LET OP!</b> In de databank vindt u de uitslagen per partij per gemeente. Uitslagen van stembureaus en stemmen op k…",
"Voor1918": false,
"IsReferendum": false,
"StemmingId": 10926,
"DateStemming": "29-10-2025",
"HeeftZetelsBijGemeentes": false,
"HeeftGemeentes": true
},
"Stemregio": {
"OngeldigeStemmenPercentage": "0,27%",
"BlancoStemmenPercentage": "0,38%",
"StemmingId": 10926,
"StemregioId": 745610,
"Naam": "Nederland",
"Kiesgerechtigden": "13.589.128",
"OpkomstPercentage": "78,3%",
"AantalZetels": null,
"AantalGeldigeStemmen": "10.571.990",
"AantalBlancoStemmen": "40.128",
"AantalOngeldigeStemmen": "28.206",
"AantalGeldigeBlancoStemmen": null,
"AantalOngeldigeBlancoStemmen": null,
"AantalStembriefjes": null
},
"Json": null,
"Regios": {
"Regios": [
{
"Id": 2,
"Options": [
{Shortened response, saved at harvest time. Click the URL for the real, current response.
Read from Election results database: list of elections with their code and the download buttons · data.overheid.nl: EML files per election (polling stations, candidates). 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.
How to fetch it
curl -o tk2025-gemeenten.csv "https://www.verkiezingsuitslagen.nl/uitslag/verkiezing/TK20251029/gemeenten"
More from Kiesraad in our index
214 datasets in Kiesraad verkiezingsuitslagen, data.overheid.nl. These changed most recently.
- Gemeentelijke herindelingsverkiezingen 20182026-10-13
- Verkiezingsuitslag Tweede Kamer 20172026-10-13
- Verkiezingsuitslag Provinciale Staten 20192026-10-13
- Verkiezingsuitslag Waterschappen 20192026-10-13
- Gemeentelijke herindelingsverkiezingen 20142026-10-13
- Verkiezingsuitslag Provinciale Staten 20152026-10-07
More in this topic
See how this page is built
bron: kiesraad-verkiezingen blokken: [] secties: - ideeen - verwerken - koppelingen - vergelijkbaar - beperkingen - code cache: tag: bron:kiesraad-verkiezingen ververs: na statuscheck, als de bron nieuwer is statuscheck: methode: datum van de nieuwste verkiezing in de Databank Verkiezingsuitslagen verwacht: jaarlijks
Source: content/bronnen/kiesraad-verkiezingen.yaml · Markdown



