# Registered nuisance by neighbourhood

Every month the police count how many nuisance reports came in, per neighbourhood and per type: from confused persons and youth to noise and drugs. Statistics Netherlands (CBS) publishes the figures as an open table, one month after the fact.

- Publisher: Politie, Centraal Bureau voor de Statistiek
- Area: Netherlands · Finest detail: neighbourhood
- Period: 2012 – 2026 · Refreshed: monthly
- Access: Open · Licence: CC BY 4.0
- Join keys: buurtcode (BU), wijkcode (WK), gemeentecode (GM)
- Status: ok (2026-10-15)
- URL: https://data.politie.nl

## What can you do with it?
- **Compare your neighbourhood with the rest of your municipality.** Divide reports by residents and put your neighbourhood next to others in the same municipality. That's fairer than a national ranking.
- **Find the seasonal rhythm.** Nuisance peaks in summer and around New Year. Plot each year as its own line and the pattern jumps out.
- **Fact-check: 'nuisance is rising'.** Compare the same months with last year, not the latest month with the previous one. Mind the March 2021 break if you look further back.
- **Confused persons and mental health care.** Put reports about confused persons next to mental health care use per neighbourhood. Correct for income and density, or you mostly measure urbanity.

## How to process it
1. **Choose your areas.** Look up codes in the boundary map. Codes have a fixed length: GM + 4 digits, WK + 6, BU + 8.
2. **Fetch the monthly figures.** Filter by area and type of nuisance. Pad keys with spaces to their fixed length and paginate per 10,000 rows.
   `https://dataderden.cbs.nl/ODataApi/OData/47024NED/TypedDataSet?$filter=WijkenEnBuurten eq 'BU03630000' &$skip=0`
3. **Tidy the table.** Convert Perioden to a date ('2026MM09' becomes 2026-09) and strip spaces from keys. Rows with no reports are missing: count them as zero.
4. **Divide by residents.** Join residents from the key figures on neighbourhood code. Leave out tiny neighbourhoods, where one report becomes an outlier.
5. **Reload everything monthly.** The police revise earlier months. A monthly refresh therefore reloads the full series, not just the newest month.

## Interesting combinations
- Do low-income neighbourhoods have more nuisance? → [cbs-kwb](https://www.opendataindex.nl/en/bron/cbs-kwb.md) via buurtcode (BU). Income and residents per neighbourhood are in the key figures. In Staat van the link between low income and nuisance was strong (ρ ≈ 0.58).
- Where in the city is the nuisance? → [pdok-wijkenbuurten](https://www.opendataindex.nl/en/bron/pdok-wijkenbuurten.md) via buurtcode (BU). The boundaries turn the table into a map. Use boundaries from the same year as the figures' classification.
- Does warm weather bring more nuisance? → [knmi-daggegevens](https://www.opendataindex.nl/en/bron/knmi-daggegevens.md) via datum (maand). Average temperature per month and compare with reports. Correct for season and New Year.

## Similar sources
- [politie-misdrijven](https://www.opendataindex.nl/en/bron/politie-misdrijven.md): Crimes instead of nuisance: reports and registrations of offences.
- [Veiligheidsmonitor (CBS)](https://www.veiligheidsmonitor.nl): A survey: how safe people feel and what they experienced, even if they didn't report it.
- [Meldingen openbare ruimte (gemeenten)](https://data.amsterdam.nl): Reports to the city about litter, noise and broken streets. Different desk, different people reporting.

## What to watch out for
- **A registration is not an incident.** What nobody reports isn't in the data. How often people call the police differs by neighbourhood and by type of nuisance.
- **Series break in March 2021.** The police changed how reports are recorded. 'Confused person' in particular jumped. Don't compare 2020 with 2022 at face value.
- **Figures are revised later.** Earlier months are revised retroactively. Reload the full series instead of appending only the newest month.
- **Always the latest neighbourhood boundaries.** CBS recalculates the whole series to the most recent boundaries. Codes from old files may no longer exist.
- **API pitfalls.** Keys are padded with spaces ('NL00      '); without them you get nothing back. At most 10,000 rows per request. The Feed endpoint applies only the first filter and silently ignores the rest.

## API (OData v3)

- Base: https://dataderden.cbs.nl/ODataApi/OData/47024NED
- Access: No key or account; the description and our call work anonymously. (tested)
- Formats: JSON, Atom/XML
- Size: 31798062 rows (cells) in TypedDataSet (tested)
- Filtering: OData expressions in $filter, keys in single quotes; eq, ne, gt, ge, lt, le, and, or, substringof(), startswith()

### Endpoints
- `GET /TableInfos`: title, summary, period and modification date of the table
- `GET /UntypedDataSet`: the figures, all values as text
- `GET /TypedDataSet`: the figures, with numbers as numbers
- `GET /DataProperties`: all columns: dimensions and topics with unit
- `GET /CategoryGroups`: grouping of categories
- `GET /Overlast`: codes and names of dimension Overlast
- `GET /WijkenEnBuurten`: codes and names of dimension WijkenEnBuurten
- `GET /Perioden`: codes and names of dimension Perioden

### Parameters
- `$filter`: select rows, e.g. WijkenEnBuurten eq 'GM0363    ' (platform)
- `$select`: only these columns (platform)
- `$top / $skip`: paging (platform)
- `$orderby`: sorting (platform)
- `$format`: json or atom (platform)
- `$count`: after a path: count only (platform)

### Dimensions
- `Overlast` (9 codes): '0.0.0 ' = Totaal registraties overlast; 'E33   ' = Overlast door verward persoon; 'E35   ' = Melding overlast jeugd
- `WijkenEnBuurten` (18498 codes): 'NL00      ' = Nederland; 'GM1680    ' = Aa en Hunze; 'WK168000  ' = Wijk 00 Annen
- `Perioden` (191 codes): '2012MM01' = 2012 januari; '2012MM02' = 2012 februari; '2012MM03' = 2012 maart

### Fields (3)
`GeregistreerdeOverlast_1` long, `Gemeentenaam_2` string, `SoortRegio_3` string

### Limits and pitfalls
- At most 10,000 rows per request; page with $skip. (experience)
- Keys are padded with spaces to a fixed length: 'GM0363    ', '0.0.0 ', 'E33   '. Without the spaces you get an empty list, not an error. (experience)
- The Feed endpoint applies only the first $filter predicate and silently ignores the rest. Use TypedDataSet. (experience)
- TableInfos.Modified changes almost daily (metadata). For freshness, look at the highest Perioden key. (experience)
- Past months are revised retroactively. Always reload the full series. (experience)
- Python urllib (LibreSSL on macOS) fails on cbs.nl's TLS; use curl or Node fetch. (experience)

### Example
```
https://dataderden.cbs.nl/ODataApi/OData/47024NED/TypedDataSet?$filter=WijkenEnBuurten%20eq%20'GM0363%20%20%20%20'%20and%20Overlast%20eq%20'0.0.0%20'&$top=3
```

## How to fetch it
```bash
curl "https://dataderden.cbs.nl/ODataApi/OData/47024NED/TypedDataSet?\$filter=WijkenEnBuurten%20eq%20'GM0363%20%20%20%20'%20and%20Overlast%20eq%20'0.0.0%20'"
```