# Verkiezingsuitslagen van de Kiesraad

De officiële uitslagen van alle verkiezingen: Tweede Kamer, gemeenteraad, Provinciale Staten, waterschap, Europees Parlement en referenda. De Databank Verkiezingsuitslagen gaat terug tot 1848 en heeft per verkiezing een CSV per gemeente. Voor recente verkiezingen staan op data.overheid.nl ook de tellingsbestanden (EML) met stemmen per stembureau en per kandidaat.

- Uitgever: Kiesraad
- Gebied: Nederland · Laagste detail: stembureau
- Periode: 1848 – 2026 · Ververst: jaarlijks
- Toegang: Open · Licentie: CC0 1.0 (Kiesraad)
- Koppelsleutels: gemeentecode (G0518), partijnaam, kandidaatnummer
- Status: ok (2026-03-18) · nieuwste verkiezing in de databank: GR20260318
- URL: https://www.verkiezingsuitslagen.nl

## Wat kun je ermee?
- **Waar won welke partij?.** Download de uitslag per gemeente van de Tweede Kamerverkiezing van 29 oktober 2025 en kleur een kaart naar de grootste partij. Landelijk kregen D66 en PVV elk 26 zetels.
- **Opkomst door de jaren heen.** De databank heeft per verkiezing kiesgerechtigden en opkomst. In 2025 kwam 78,3% van de 13.589.128 kiesgerechtigden stemmen. Zet de Kamerverkiezingen naast elkaar.
- **Voorkeurstemmen per kandidaat.** In de CSV van de gemeenteraadsverkiezing 2026 staat per gemeente hoeveel stemmen elke kandidaat kreeg. Zoek kandidaten die met voorkeurstemmen een plek hoger op de lijst passeerden.
- **Stemmen per stembureau naast de buurt.** Haal uit de EML-tellingsbestanden de stemmen per stembureau, zoek op waar elk stembureau staat en leg dat naast buurtcijfers van het CBS. Let op: kiezers mogen overal in hun gemeente stemmen.

## Zo verwerk je het
1. **Kies de verkiezing in de databank.** Elke verkiezing heeft een code: soort plus datum, bijvoorbeeld TK20251029 of GR20260318. Je vindt ze op de beginpagina van de databank.
   `https://www.verkiezingsuitslagen.nl/verkiezingen`
2. **Download de uitslag per gemeente.** Een CSV met puntkomma's: gemeente, code, partij, aantal stemmen. De Tweede Kamer 2025 is 359 kB.
   `https://www.verkiezingsuitslagen.nl/uitslag/verkiezing/TK20251029/gemeenten`
3. **Voor stembureaus en kandidaten naar data.overheid.nl.** Daar staat per verkiezing een dataset met EML-bestanden (XML) en vaak een CSV. Zoek op 'verkiezingsuitslag' en de Kiesraad als eigenaar.
   `https://data.overheid.nl/data/api/3/action/package_search?q=verkiezingsuitslag&fq=authority:%22http://standaarden.overheid.nl/owms/terms/Kiesraad%22&rows=50`
4. **Lees het lange formaat.** De CSV van de gemeenteraad 2026 heeft één waarde per regel: kolom VeldType zegt wat het is (Kiesgerechtigden, Opkomst, KandidaatAantalStemmen …), kolom Waarde het getal. Draai de tabel om voor je rekent.
   `https://data.overheid.nl/sites/default/files/dataset/09cf04e7-11ac-4b53-a2cc-baccf95e82fd/resources/GR2026.csv`

## Interessante koppelingen
- Stemmen gemeenten met een hoger inkomen anders? → [cbs-kwb](https://www.opendataindex.nl/bron/cbs-kwb.md) via gemeentecode (GM). Maak van G0518 de CBS-code GM0518 en koppel aan het gemiddelde inkomen. Gebruik de gemeentelijke indeling van het verkiezingsjaar.
- Stemmen fracties in de Kamer zoals hun kiezers in jouw gemeente? → [tweedekamer-opendata](https://www.opendataindex.nl/bron/tweedekamer-opendata.md) via partijnaam en fractie. Partijnamen verschillen tussen de bronnen ('PVV (Partij voor de Vrijheid)' in de uitslag). Maak eerst een eigen vertaaltabel.

## Vergelijkbare bronnen
- [tweedekamer-opendata](https://www.opendataindex.nl/bron/tweedekamer-opendata.md): Wat er na de verkiezing gebeurt: fracties met hun zetels, moties en stemmingen in de Kamer.
- [openraadsinformatie](https://www.opendataindex.nl/bron/openraadsinformatie.md): Wat gekozen gemeenteraden daarna besluiten, uit de raadsinformatiesystemen.

## Waar je op moet letten
- **Elke verkiezing heeft een ander formaat.** De CSV van de Tweede Kamer 2025 heeft per gemeente één regel per partij; die van de gemeenteraad 2026 is lang (VeldType en Waarde) en bevat kandidaten. Oudere datasets mengen EML, Excel en andere bestanden van gemeenten. Schrijf per verkiezing een eigen inleesstap.
- **Stembureau-CSV zonder gemeente.** Waar de databank stembureaus heeft (een deel van de verkiezingen sinds 2012), mist in de CSV de gemeente: code SB25 komt in veel gemeenten voor. Gebruik voor stembureaus de EML-bestanden per gemeente. Voor de Tweede Kamer 2025 is de stembureau-CSV leeg.
- **EML is XML zonder hulp.** De Kiesraad zegt zelf geen ondersteuning te bieden bij het EML-formaat. De bestanden staan in grote zips, voor de Tweede Kamer 2025 in drie delen.
- **Voorlopig of definitief.** De dataset van de gemeenteraad 2026 noemt zijn eigen gegevens voorlopig. Herstemmingen (Gorinchem, 29 april 2026) en herindelingsverkiezingen staan apart. Kijk bij elke dataset naar de toelichting.
- **Gemeentegrenzen schuiven.** Door herindelingen bestaan gemeenten van een oude verkiezing soms niet meer. De databank geeft naast de gemeentecode een 'AmsterdamseCode' (historische code). Vergelijk reeksen alleen op dezelfde indeling.

## API (Bestanden (CSV) + JSON van de website)

- Basis: https://www.verkiezingsuitslagen.nl
- Toegang: Geen sleutel of account nodig (getest)
- Formaten: csv, json, eml/xml
- Omvang: 176 verkiezingen in de databank, 1848 tot 2026 (lijstpagina's, 16 okt 2026) (ervaring)
- Filteren: Geen filters: één bestand per verkiezing. Filter zelf op de kolom Code (gemeente) of Partij.; 

### Endpoints
- `GET /uitslag/verkiezing/{code}/gemeenten`: CSV met de uitslag per gemeente en partij (puntkomma, UTF-8 zonder BOM). TK2025: 359 kB, 8.150 regels, 343 codes, 27 partijen.
- `GET /uitslag/verkiezing/{code}/stembureaus`: CSV per stembureau en partij. Alleen gevuld bij een deel van de verkiezingen (GR2022: 8,7 MB); bij TK2025, PS2023, EP2024 alleen de kopregel.
- `GET /verkiezingen/detailJson/{code}`: JSON waarmee de site de detailpagina vult: Info (naam, datum, opmerking), Stemregio (kiesgerechtigden, opkomst, geldige, blanco en ongeldige stemmen), PieChart (stemmen en percentage per partij), Regios (provincies, kieskringen). Niet gedocumenteerd.
- `GET /verkiezingen/detail/{code}`: Detailpagina (HTML); de landelijke uitslag met zetels staat als JSON in <textarea id="UitslagData">.
- `GET /Verkiezingen/index/{pagina}?v=1800&t=2027`: Lijst van verkiezingen (HTML, 10 per pagina) met codes, opkomst en uitgebrachte stemmen. Hier vind je de codes.

### Parameters
- `code`: Verkiezingscode = soort + datum JJJJMMDD: TK (Tweede Kamer), EK, EP, PS, WS, GR (gemeenteraad), ER, NR/RR (referendum). Bv. TK20251029, GR20220316. (getest)

### Kolommen in de CSV per gemeente (en per stembureau) (7)
`Gemeente` tekst, `Code` tekst, `AmsterdamseCode` tekst, `Partij` tekst, `AantalStemmen` getal, `AantalZetels` getal, `Stembureau` tekst

### Limieten en valkuilen
- Geen sleutel en geen gedocumenteerde limiet. Eén bestand per verkiezing, meestal enkele honderden kB. (getest)
- De Azure-firewall weigert de standaard-User-Agent van Python requests (HTTP 403). Zet altijd een eigen User-Agent; curl en een eerlijke UA werken. (getest)
- Een onbekende verkiezingscode geeft HTTP 500 met een leeg antwoord, geen 404. (getest)
- De stembureau-CSV heeft geen gemeentekolom: codes als SB25 komen in veel gemeenten voor. Voor stembureaus de EML-bestanden per gemeente van data.overheid.nl gebruiken. (getest)
- In detailJson staan aantallen in Stemregio als Nederlandse tekst ("13.589.128", "78,3%"); in PieChart als getal. (getest)
- Codes vanaf G9000 overslaan als je gemeenten telt; koppel op code, niet op naam (Bergen NH G0373 en Bergen L G0893). (ervaring)
- Formaten op data.overheid.nl verschillen per verkiezing (EML-zips, brede of lange CSV, Excel). De CKAN-API daar (/data/api/…) valt onder Disallow: /data/ in robots.txt; de bestanden zelf (/sites/default/files/…) niet. (getest)

### Voorbeeld
```
https://www.verkiezingsuitslagen.nl/verkiezingen/detailJson/TK20251029
```

## Zo haal je het op

### curl
```bash
curl -o tk2025-gemeenten.csv "https://www.verkiezingsuitslagen.nl/uitslag/verkiezing/TK20251029/gemeenten"
```

### python
```python
import csv, io, requests

# Zonder eigen User-Agent geeft de site 403 (de standaard van requests wordt geweigerd).
kop = {"User-Agent": "mijn-onderzoek/1.0 (+jij@voorbeeld.nl)"}
r = requests.get("https://www.verkiezingsuitslagen.nl/uitslag/verkiezing/TK20251029/gemeenten", headers=kop)
rijen = csv.DictReader(io.StringIO(r.content.decode("utf-8-sig")), delimiter=";")
utrecht = [x for x in rijen if x["Code"] == "G0344"]
for x in sorted(utrecht, key=lambda x: -int(x["AantalStemmen"]))[:5]:
    print(x["Partij"], x["AantalStemmen"])
```

## Wat je ermee kunt bouwen
- [Verkiezingskaart: uitslag, verschuiving en opkomst per gemeente](https://www.opendataindex.nl/bouwen/verkiezingskaart.md): Een kaart van alle 342 gemeenten met de grootste partij, de winst of het verlies sinds de vorige verkiezing en de opkomst, naast het inkomen per inwoner.


## Wat er allemaal in zit: 176 verkiezingen

Alle verkiezingen in de Databank Verkiezingsuitslagen van de Kiesraad, per soort en decennium, elke nacht opgehaald. Elke verkiezing heeft een eigen pagina met de CSV per gemeente en per stembureau.

- Soorten: verkiezing 176
- Met een API-aanroep op de datasetpagina: 176
- Zoeken: https://www.opendataindex.nl/api/catalogus/kiesraad?q=… of de MCP-functie zoek_datasets met herkomst=kiesraad
- Elke rij heeft een eigen pagina: https://www.opendataindex.nl/dataset/kiesraad/<sleutel>

### Mappen
- Tweede Kamer (64): 2020–2029 (3), 2010–2019 (3), 2000–2009 (3), 1990–1999 (2), 1980–1989 (4), 1970–1979 (3), 1960–1969 (2), 1950–1959 (3) …
- Eerste Kamer (6): 2020–2029 (1), 2010–2019 (3), 2000–2009 (2)
- Europees Parlement (10): 2020–2029 (1), 2010–2019 (2), 2000–2009 (2), 1990–1999 (2), 1980–1989 (2), 1970–1979 (1)
- Provinciale Staten (23): 2020–2029 (1), 2010–2019 (3), 2000–2009 (2), 1990–1999 (3), 1980–1989 (2), 1970–1979 (3), 1960–1969 (2), 1950–1959 (3) …
- Waterschap (3): 2020–2029 (1), 2010–2019 (2)
- Gemeenteraad (60): 2020–2029 (5), 2010–2019 (12), 2000–2009 (3), 1990–1999 (3), 1980–1989 (8), 1970–1979 (8), 1960–1969 (6), 1950–1959 (10) …
- Eilandsraad (5): 2020–2029 (2), 2010–2019 (3)
- Kiescollege (2): 2020–2029 (1), 2010–2019 (1)
- Nationaal referendum (3): 2010–2019 (2), 2000–2009 (1)

## Voorbeelden met echte cijfers (3)

Per voorbeeld de bevinding, de peildatum en de aanroep die precies deze cijfers ophaalt.

- **Stemmen op D66, Tweede Kamerverkiezing 2025: het hoogst in Heemstede (29,5%), het laagst in Urk (0,7%)** (oktober 2025). Tabel TK20251029. [Voorbeeld](https://www.opendataindex.nl/voorbeeld/kiesraad-tk2025-d66-gemeente)
  - `https://www.verkiezingsuitslagen.nl/uitslag/verkiezing/TK20251029/gemeenten`
  - `https://www.verkiezingsuitslagen.nl/verkiezingen/detail/TK20251029`
- **Stemmen op de PVV, Tweede Kamerverkiezing 2025: het hoogst in Rucphen (46,2%), het laagst in Rozendaal (5,1%)** (oktober 2025). Tabel TK20251029. [Voorbeeld](https://www.opendataindex.nl/voorbeeld/kiesraad-tk2025-pvv-gemeente)
  - `https://www.verkiezingsuitslagen.nl/uitslag/verkiezing/TK20251029/gemeenten`
  - `https://www.verkiezingsuitslagen.nl/verkiezingen/detail/TK20251029`
- **Stemmen per partij bij de Tweede Kamerverkiezing van 2025: het meest D66 (1.790.634 stemmen), dan PVV (Partij voor de Vrijheid) en VVD** (oktober 2025). Tabel TK20251029. [Voorbeeld](https://www.opendataindex.nl/voorbeeld/kiesraad-tk2025-stemmen)
  - `https://www.verkiezingsuitslagen.nl/verkiezingen/detail/TK20251029`
  - `https://www.verkiezingsuitslagen.nl/uitslag/verkiezing/TK20251029/gemeenten`
