# CBS-cijfers per postcode en per vierkant

Het CBS publiceert zijn kerncijfers ook per postcodegebied (4 cijfers, en 6 tekens) en per vierkant van 100 en 500 meter, fijner dan de wijk- en buurtindeling. Per gebied staan zo'n 140 velden: inwoners naar leeftijd en herkomst, huishoudens, woningen naar bouwjaar en eigendom, WOZ-waarde, energieverbruik, inkomen, uitkeringen, stedelijkheid en de afstand tot voorzieningen als huisarts, supermarkt en station. Postcodecijfers lopen van 2015 tot en met 2024, de vierkanten van 2000 tot en met 2024. In 2024 waren er 4.071 postcodegebieden van vier cijfers en 464.964 van zes tekens. Via PDOK als OGC API, en per jaar als WFS en WMS; het CBS zelf biedt ook ZIP-bestanden aan, en daar staat 2025 (eerste versie) al.

- Uitgever: Centraal Bureau voor de Statistiek, Publieke Dienstverlening Op de Kaart
- Gebied: Nederland · Laagste detail: postcode (6 tekens) en vierkant van 100 meter
- Periode: 2015 tot en met 2024 (postcode via PDOK; 2025 als CBS-download), 2000 tot en met 2024 (vierkanten) · Ververst: jaarlijks
- Toegang: Open · Licentie: CC BY 4.0 (volgens de landing pages van de vier OGC API's)
- Koppelsleutels: postcode (pc4, pc6), crs28992res100m (vierkantcode, bv. E2054N6114), jaarcode
- Status: ok (2025-10-13) · 1 collectie · postcode4
- URL: https://www.cbs.nl/nl-nl/dossier/nederland-regionaal/geografische-data/gegevens-per-postcode

## Wat kun je ermee?
- **Cijfers bij elke adreslijst.** Bijna elke lijst heeft een postcode. Koppel op de vier cijfers en je hebt per adres het aantal inwoners, de gemiddelde WOZ-waarde en de afstand tot de huisarts in die buurt.
- **Stad of platteland?.** Elk postcodegebied heeft een stedelijkheidsklasse van 1 (zeer sterk stedelijk) tot 5 (niet stedelijk). In 2024 woonde 24% van de inwoners in een zeer sterk stedelijk gebied en 14% in een niet-stedelijk gebied.
- **Een heatmap van 100 bij 100 meter.** De vierkanten van 100 meter laten zien waar mensen wonen, los van gemeentegrenzen. Vergelijk 2000 met 2024 om nieuwbouwwijken te zien verschijnen.
- **Afstand tot voorzieningen.** Velden als dichtstbijzijnde_huisartsenpraktijk_afstand_in_km en treinstation geven per gebied de gemiddelde afstand over de weg. Maak een kaart van waar het station ver weg is.

## Zo verwerk je het
1. **Eén postcode, één jaar.** De OGC API filtert op postcode en jaarcode (en op ligging). Het antwoord heeft 143 velden plus de grens als geometrie.
   `https://api.pdok.nl/cbs/postcode4/ogc/v1/collections/postcode4/items?f=json&postcode=3511&jaarcode=2024`
2. **Eén veld voor heel Nederland, zonder grenzen.** De OGC API geeft altijd de geometrie mee. De WFS per jaar (service.pdok.nl/cbs/postcode4/<jaar>/wfs/v1_0, voor 2022, 2023 en 2024) geeft met GetPropertyValue alleen het veld: 1.000 waarden per verzoek, gesorteerd op postcode.
   `https://service.pdok.nl/cbs/postcode4/2024/wfs/v1_0?service=WFS&version=2.0.0&request=GetPropertyValue&typeNames=postcode4&valueReference=aantalInwoners&sortBy=postcode&count=1000&startIndex=0`
3. **Vierkanten van 100 meter.** Filter op jaarcode en een bbox (in graden). De vierkantcode staat in crs28992res100m: E2054N6114 is de linkeronderhoek op x 205.400, y 611.400 in RD.
   `https://api.pdok.nl/cbs/vierkantstatistieken100m/ogc/v1/collections/vierkant100/items?f=json&jaarcode=2024&bbox=5.11,52.08,5.13,52.10&limit=100`
4. **Codes eruit filteren.** Ontbrekende cijfers zijn codes als -99997 en -99995 (de betekenis staat in de producttoelichting van het CBS). Zet ze op leeg voordat je rekent; anders wordt een gemiddelde sterk negatief.

## Interessante koppelingen
- Hoeveel woningen per postcode zijn na 2015 gebouwd? → [pdok-bag](https://www.opendataindex.nl/bron/pdok-bag.md) via postcode (BAG-adressen hebben een postcode). Tel in de BAG de verblijfsobjecten per postcode en bouwjaar en vergelijk met aantal_woningen_bouwjaar_15_en_later uit de CBS-cijfers.
- Wonen er meer ouderen waar de leefbaarheid lager is? → [leefbaarometer](https://www.opendataindex.nl/bron/leefbaarometer.md) via coördinaten (vierkant van 100 meter). Beide werken met vierkanten van 100 meter. Koppel op het vierkant en vergelijk de leeftijdsopbouw met de score.

## Vergelijkbare bronnen
- [cbs-kwb](https://www.opendataindex.nl/bron/cbs-kwb.md): Kerncijfers per wijk en buurt, met meer variabelen en een vaste gebiedsindeling; per postcode en vierkant is fijner maar vaker afgeschermd.
- [pdok-wijkenbuurten](https://www.opendataindex.nl/bron/pdok-wijkenbuurten.md): De grenzen van wijken en buurten met dezelfde soort cijfers; per postcode gebruik je deze bron.
- [leefbaarometer](https://www.opendataindex.nl/bron/leefbaarometer.md): Een samengestelde score voor leefbaarheid op 100 meter; deze bron geeft de losse cijfers.

## Waar je op moet letten
- **Veel cijfers afgeschermd.** Volgens het CBS ontbreken cijfers voor inwoners, huishoudens en woningen als het totaal in een gebied kleiner is dan vijf; dan staat er een code zoals -99997. Bij pc6 en vierkanten van 100 meter is dat vaak: het eerste vierkant van 2024 heeft 5 inwoners en verder bijna alleen -99997.
- **Afgeronde aantallen.** Volgens het CBS worden aantallen voor 2023 tot en met 2025 doorgaans afgerond op vijftallen. Opgeteld over alle postcodes kom je in 2024 op 17,9 miljoen inwoners, iets minder dan de officiële bevolking.
- **Niet elk veld in elk jaar.** Volgens de beschrijving zijn 2022 en 2023 in 2025 uitgebreid met demografie, woningen, energie, inkomen en voorzieningen; oudere jaren hebben minder velden. Sommige velden van 2024 zijn een code (-99995), zoals de WOZ-waarde voor postcode 3511.
- **PDOK loopt een jaar achter.** Op 16 oktober 2026 had PDOK postcodecijfers tot en met 2024. Het CBS publiceert 2025 al als ZIP (pc4, pc5 en pc6, versie 1; erratum van 18 augustus 2026 voor pc5 en pc6) op www.cbs.nl. Nieuwe jaren en strengere geheimhouding vanaf 2025 maken vergelijken tussen jaren lastiger.
- **Postcodegrenzen zijn afgeleid.** Volgens het CBS leidt Esri Nederland de postcodevlakken af uit BAG-adressen, en heeft het CBS de grenzen vereenvoudigd. Vergelijk jaren op dezelfde postcode voorzichtig; vierkanten blijven wel gelijk.

## API (OGC WFS 2.0.0)

- Basis: https://service.pdok.nl/cbs/postcode4/2024/wfs/v1_0
- Toegang: Geen sleutel. Kosten: none; gebruiksvoorwaarden: https://creativecommons.org/licenses/by/4.0/deed.nl. (uit de beschrijving)
- Formaten: application/gml+xml; version=3.2, text/xml; subtype=gml/3.2.1, text/xml; subtype=gml/3.1.1, application/json; subtype=geojson, application/json
- Omvang: 4071 objecten in postcode4:postcode4 (getest)
- Filteren: OGC Filter Encoding (FES 2.0); PropertyIsEqualTo, PropertyIsNotEqualTo, PropertyIsLessThan, PropertyIsGreaterThan, PropertyIsLessThanOrEqualTo, PropertyIsGreaterThanOrEqualTo, PropertyIsLike, PropertyIsBetween, PropertyIsNull, Equals, Disjoint, Touches, Within, Overlaps, Crosses, Intersects, Contains, DWithin, Beyond, BBOX, During

### Endpoints
- `GET ?request=GetCapabilities`: beschrijving van de dienst
- `GET ?request=DescribeFeatureType`: velden van een laag (XSD)
- `GET ?request=GetFeature`: de objecten zelf, met geometrie
- `GET ?request=ListStoredQueries`: opgeslagen zoekvragen
- `GET ?request=DescribeStoredQueries`: uitleg bij opgeslagen zoekvragen

### Parameters
- `typeNames`: welke laag: postcode4:postcode4 (uit de beschrijving)
- `outputFormat`: bv. application/json voor GeoJSON (uit de beschrijving)
- `srsName`: projectie, bv. EPSG:4326 voor webkaarten (standaard EPSG:28992, RD) (uit de beschrijving)
- `count / startIndex`: pagineren (uit de beschrijving)
- `filter`: FES-XML-filter op velden of geometrie (uit de beschrijving)
- `bbox`: rechthoek in de gekozen projectie (platform)

### Velden (138)
`geom` geometrie, `postcode` integer, `aantalInwoners` integer, `aantalMannen` integer, `aantalVrouwen` integer, `aantalInwoners0Tot15Jaar` integer, `aantalInwoners15Tot25Jaar` integer, `aantalInwoners25Tot45Jaar` integer, `aantalInwoners45Tot65Jaar` integer, `aantalInwoners65JaarEnOuder` integer, `aantalGeboorten` integer, `percentageGebNederlandHerkomstNederland` integer, `percentageGebNederlandHerkomstOverigEuropa` integer, `percentageGebNederlandHerkomstBuitenEuropa` integer, `percentageGebBuitenNederlandHerkomstEuropa` integer, `percentageGebBuitenNederlandHerkmstBuitenEuropa` integer, `aantalPartHuishoudens` integer, `aantalEenpersoonshuishoudens` integer, `aantalMeerpersoonshuishoudensZonderKind` integer, `aantalEenouderhuishoudens` integer, `aantalTweeouderhuishoudens` integer, `gemiddeldeHuishoudensgrootte` double, `aantalWoningen` integer, `aantalWoningenBouwjaarVoor1945` integer, `aantalWoningenBouwjaar45Tot65` integer, `aantalWoningenBouwjaar65Tot75` integer, `aantalWoningenBouwjaar75Tot85` integer, `aantalWoningenBouwjaar85Tot95` integer, `aantalWoningenBouwjaar95Tot05` integer, `aantalWoningenBouwjaar05Tot15` integer, `aantalWoningenBouwjaar15EnLater` integer, `aantalMeergezinsWoningen` integer, `percentageKoopwoningen` integer, `percentageHuurwoningen` integer, `aantalHuurwoningenInBezitWoningcorporaties` integer, `aantalNietBewoondeWoningen` integer, `gemiddeldeWozWaardeWoning` integer, `gemiddeldGasverbruikWoning` integer, `gemiddeldElektriciteitsverbruikWoning` integer, `gemiddeldInkomenHuishouden` double, `percentageLaagInkomenHuishouden` double, `percentageHoogInkomenHuishouden` double, `aantalPersonenMetUitkeringOnderAowlft` integer, `dichtstbijzijndeGroteSupermarktAfstandInKm` double, `groteSupermarktAantalBinnen1Km` double, `groteSupermarktAantalBinnen3Km` double, `groteSupermarktAantalBinnen5Km` double, `dichtstbijzijndeWinkelsOvDagelLevensmAfstInKm` double, `winkelsOvDagelLevensmAantalBinnen1Km` double, `winkelsOvDagelLevensmAantalBinnen3Km` double, `winkelsOvDagelLevensmAantalBinnen5Km` double, `dichtstbijzijndeWarenhuisAfstandInKm` double, `warenhuisAantalBinnen5Km` double, `warenhuisAantalBinnen10Km` double, `warenhuisAantalBinnen20Km` double, `dichtstbijzijndeCafeAfstandInKm` double, `cafeAantalBinnen1Km` double, `cafeAantalBinnen3Km` double, `cafeAantalBinnen5Km` double, `dichtstbijzijndeCafetariaAfstandInKm` double, `cafetariaAantalBinnen1Km` double, `cafetariaAantalBinnen3Km` double, `cafetariaAantalBinnen5Km` double, `dichtstbijzijndeHotelAfstandInKm` double, `hotelAantalBinnen5Km` double, `hotelAantalBinnen10Km` double, `hotelAantalBinnen20Km` double, `dichtstbijzijndeRestaurantAfstandInKm` double, `restaurantAantalBinnen1Km` double, `restaurantAantalBinnen3Km` double, `restaurantAantalBinnen5Km` double, `dichtstbijzijndeBuitenschoolseOpvangAfstandInKm` double, `buitenschoolseOpvangAantalBinnen1Km` double, `buitenschoolseOpvangAantalBinnen3Km` double, `buitenschoolseOpvangAantalBinnen5Km` double, `dichtstbijzijndeKinderdagverblijfAfstandInKm` double, `kinderdagverblijfAantalBinnen1Km` double, `kinderdagverblijfAantalBinnen3Km` double, `kinderdagverblijfAantalBinnen5Km` double, `dichtstbijzijndeBrandweerkazerneAfstandInKm` double, `dichtstbijzijndeOpritHoofdverkeerswegAfstandInKm` double, `dichtstbijzijndeOverstapstationAfstandInKm` double, `dichtstbijzijndeTreinstationAfstandInKm` double, `dichtstbijzijndeAttractieparkAfstandInKm` double, `attractieparkAantalBinnen10Km` double, `attractieparkAantalBinnen20Km` double, `attractieparkAantalBinnen50Km` double, `dichtstbijzijndeBioscoopAfstandInKm` double, `bioscoopAantalBinnen5Km` double, `bioscoopAantalBinnen10Km` double, `bioscoopAantalBinnen20Km` double, `dichtstbijzijndeMuseumAfstandInKm` double, `museumAantalBinnen5Km` double, `museumAantalBinnen10Km` double, `museumAantalBinnen20Km` double, `dichtstbijzijndeTheaterAfstandInKm` double, `theaterAantalBinnen5Km` double, `theaterAantalBinnen10Km` double, `theaterAantalBinnen20Km` double, `dichtstbijzijndeBibliotheekAfstandInKm` double, `dichtstbijzijndeKunstijsbaanAfstandInKm` double, `dichtstbijzijndePoppodiumAfstandInKm` double, `dichtstbijzijndeSaunaAfstandInKm` double, `dichtstbijzijndeZonnebankAfstandInKm` double, `dichtstbijzijndeZwembadAfstandInKm` double, `dichtstbijzijndeBasisonderwijsAfstandInKm` double, `basisonderwijsAantalBinnen1Km` double, `basisonderwijsAantalBinnen3Km` double, `basisonderwijsAantalBinnen5Km` double, `dichtstbijzijndeHavoVwoAfstandInKm` double, `havoVwoAantalBinnen3Km` double, `havoVwoAantalBinnen5Km` double, `havoVwoAantalBinnen10Km` double, `dichtstbijzijndeVmboAfstandInKm` double, `vmboAantalBinnen3Km` double, `vmboAantalBinnen5Km` double, `vmboAantalBinnen10Km` double, `dichtstbijzijndeVoortgezetOnderwijsAfstandInKm` double, `voortgezetOnderwijsAantalBinnen3Km` double, `voortgezetOnderwijsAantalBinnen5Km` double, `voortgezetOnderwijsAantalBinnen10Km` double, `dichtstbijzijndeHuisartsenpraktijkAfstandInKm` double, `huisartsenpraktijkAantalBinnen1Km` double, `huisartsenpraktijkAantalBinnen3Km` double, `huisartsenpraktijkAantalBinnen5Km` double, `dichtstbijzijndeZiekenhExclBuitenpoliAfstInKm` double, `ziekenhuisExclBuitenpoliAantalBinnen5Km` double, `ziekenhuisExclBuitenpoliAantalBinnen10Km` double, `ziekenhuisExclBuitenpoliAantalBinnen20Km` double, `dichtstbijzijndeZiekenhInclBuitenpoliAfstInKm` double, `ziekenhuisInclBuitenpoliAantalBinnen5Km` double, `ziekenhuisInclBuitenpoliAantalBinnen10Km` double, `ziekenhuisInclBuitenpoliAantalBinnen20Km` double, `dichtstbijzijndeApotheekAfstandInKm` double, `dichtstbijzijndeHuisartsenpostAfstandInKm` double, `omgevingsadressendichtheid` integer, `stedelijkheid` integer, `fuuid` string

### Limieten en valkuilen
- Maximaal 1.000 objecten per verzoek (CountDefault). (uit de beschrijving)
- Pagineren kan: count en startIndex (ImplementsResultPaging). (uit de beschrijving)
- Elk jaar is een aparte WFS: …/cbs/postcode4/2022/…, 2023 en 2024 (2025 gaf 404 op 16 okt 2026). De OGC API https://api.pdok.nl/cbs/postcode4/ogc/v1 heeft alle jaren 2015 tot en met 2024 in één collectie. (getest)
- In de WFS zijn de veldnamen camelCase (aantalInwoners), in de OGC API snake_case (aantal_inwoners). (getest)

### Voorbeeld
```
https://service.pdok.nl/cbs/postcode4/2024/wfs/v1_0?request=GetFeature&service=WFS&version=2.0.0&typeNames=postcode4:postcode4&outputFormat=application/json&srsName=EPSG:4326&count=1&propertyName=postcode,aantalInwoners,stedelijkheid,gemiddeldeWozWaardeWoning
```

## Zo haal je het op

### curl
```bash
curl "https://api.pdok.nl/cbs/postcode4/ogc/v1/collections/postcode4/items?f=json&postcode=1011&jaarcode=2024"
```

### python
```python
import requests

url = "https://api.pdok.nl/cbs/postcode4/ogc/v1/collections/postcode4/items"
for pc in [1011, 3511, 9711]:
    f = requests.get(url, params={"f": "json", "postcode": pc, "jaarcode": 2024}).json()["features"][0]["properties"]
    print(pc, f["aantal_inwoners"], f["stedelijkheid"], f["dichtstbijzijnde_treinstation_afstand_in_km"])
```


## Voorbeelden met echte cijfers (1)

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

- **Inwoners naar stedelijkheid van hun postcodegebied: sterk stedelijk is het grootste deel, 28% in 2024** (2024). Tabel postcode4 2024. [Voorbeeld](https://www.opendataindex.nl/voorbeeld/cbs-postcode4-inwoners-stedelijkheid)
  - `https://service.pdok.nl/cbs/postcode4/2024/wfs/v1_0?service=WFS&version=2.0.0&request=GetPropertyValue&typeNames=postcode4&valueReference=aantalInwoners&sortBy=postcode&count=1000&startIndex=0`
  - `https://service.pdok.nl/cbs/postcode4/2024/wfs/v1_0?service=WFS&version=2.0.0&request=GetPropertyValue&typeNames=postcode4&valueReference=stedelijkheid&sortBy=postcode&count=1000&startIndex=0`
