# Amsterdam public space reports

Every report Amsterdam residents make about public space, through the Signalen system: rubbish, broken pavements, nuisance, boats. Per report the category, the date, the neighbourhood and whether it is still open. In 2025 there were 517,735.

- Publisher: Gemeente Amsterdam
- Area: Amsterdam · Finest detail: report, per neighbourhood
- Period: 2020 – heden · Refreshed: daily
- Access: Open · Licence: CC BY (naamsvermelding)
- Join keys: buurtcode, datum, categorie
- Status: ok (2026-10-16) · 2.720.574 meldingen · nieuwste: Afval
- URL: https://api.data.amsterdam.nl/v1/docs/datasets/meldingen.html

## What can you do with it?
- **What annoys people most?.** Count reports per main category and per year. Rubbish is the largest group: 186,778 of the 517,735 reports in 2025.
- **Your neighbourhood against the rest.** Filter on a neighbourhood code and compare the number of reports with neighbourhoods of similar size. Divide by population from the CBS neighbourhood figures.
- **Seasons and holidays.** Plot subcategories such as 'Overlast terrassen' (terrace nuisance) or 'Veeg- / zwerfvuil' (litter) per week. Look for peaks around King's Day, summer and New Year.
- **Reports next to enforcement and council questions.** Compare a rise in a neighbourhood with council papers about the same street. Did policy follow a wave of reports?

## How to process it
1. **Count first, fetch later.** With _count=true the total is in the X-Total-Count header. You know the size of your selection before downloading anything.
   `https://api.data.amsterdam.nl/v1/meldingen/meldingen/?datumMelding[gte]=2025-01-01&datumMelding[lt]=2026-01-01&hoofdcategorie=Afval&_count=true&_pageSize=1&_format=json`
2. **One neighbourhood as CSV.** Filter on the neighbourhood code (e.g. KG03 = Diamantbuurt) and pick only the fields you need.
   `https://api.data.amsterdam.nl/v1/meldingen/meldingen/?gbdBuurtCode=KG03&datumMelding[gte]=2026-10-01&_fields=datumMelding,hoofdcategorie,subcategorie&_format=csv`
3. **Everything at once.** For the full file of 2.7 million reports there is a ZIP with CSV. That is faster than paging.
   `https://api.data.amsterdam.nl/bulk-data/csv/meldingen_v1_meldingen_openbaar.csv.zip`
4. **Link neighbourhoods to CBS.** The CBS neighbourhood code is BU0363 plus the Amsterdam code: KG03 becomes BU0363KG03. The list is in the gebieden dataset.
   `https://api.data.amsterdam.nl/v1/gebieden/buurten/?_fields=code,naam,cbsCode&_format=csv&_pageSize=1000`

## Interesting combinations
- Reports per thousand residents → [cbs-kwb](https://www.opendataindex.nl/en/bron/cbs-kwb.md) via buurtcode (BU0363 + gbdBuurtCode). Divide reports per neighbourhood by population. That makes busy and quiet neighbourhoods comparable.
- Do people report to the city or to the police? → [politie-overlast](https://www.opendataindex.nl/en/bron/politie-overlast.md) via buurtcode en maand. Compare nuisance reports to the city with police nuisance registrations in the same neighbourhood and month.

## Similar sources
- [Meldingen openbare ruimte van andere gemeenten](https://data.overheid.nl/datasets?search=meldingen%20openbare%20ruimte): Eindhoven, Nijmegen and Delft also publish reports via data.overheid.nl, each with their own fields and categories.
- [politie-overlast](https://www.opendataindex.nl/en/bron/politie-overlast.md): Nuisance registered by the police, per neighbourhood and per month. Different reports, different desk.

## What to watch out for
- **Only complete from late 2020.** There are a few reports from 2018 and 2019, but the bulk starts in November 2020 (26,341 that month). Compare from 2021 onwards.
- **The location is shifted.** The open coordinates are called 'visualisatie' and are meant for maps, not exact. The precise location is for staff only.
- **Many fields are restricted.** Handling time, internal status and reporter satisfaction are not open. Filtering on them gives a 403. Only 'open' or 'closed' is public.
- **Not all categories.** The dataset holds ten main categories, including rubbish, nuisance and roads. Other reports and the original version of split reports are excluded.
- **API key will become mandatory.** Amsterdam will make an API key mandatory. On 15 October 2026 it was still optional; request a free one if you use the API often.

## API (OpenAPI 3.0.3)

- Base: https://api.data.amsterdam.nl/v1/meldingen
- Access: The description lists oauth2 (oauth2), but this endpoint works without logging in (tested). (tested)
- Formats: JSON, CSV, GeoJSON
- Size: 2719946 records (tested)
- Filtering: per field as query parameter: field=value or field[operator]=value; eq, gt, gte, in, isnull, lt, lte, not, isempty, like, intersects, within

### Endpoints
- `GET /meldingen`: Open dataset over meldingen openbare ruimte Amsterdam (MORA). In deze dataset zit een subset van de de meldingsgegevens van alle meldingen vanaf medio 2018. …
- `GET /meldingen/{id}`: 

### Parameters
- `_count`: Include a count of the total result set and the number of pages.Only works for responses that return a page. (from the description)
- `_csv_header`: Specify type of header for csv file (id, title, none) (from the description)
- `_csv_separator`: Specify type of separator for csv file (,, ;) (from the description)
- `_expand`: Allow to expand relations. (from the description)
- `_expandScope`: Comma separated list of named relations to expand. (from the description)
- `_fields`: Comma-separated list of fields to display (from the description)
- `_format`: Select the export format (json, csv, geojson) (from the description)
- `_pageSize`: Number of results to return per page. (from the description)
- `_sort`: Which field to use when ordering the results. (from the description)

### Fields (49)
`id` string, `meldingsnummer` string, `hoofdcategorie` string, `subcategorie` string, `thema` string, `directie` string, `regie` string, `datumMelding` string/date, `tijdstipMelding` string/time, `datumAfgerond` string/date, `tijdstipAfgerond` string/time, `datumOverlast` string/date, `tijdstipOverlast` string/time, `afhandeltermijn` integer/int64, `afhandelwerkdagAdam` integer/int64, `uitersteAfhandeldatum` string/date, `status` string, `externeStatus` string, `kpiAfhandeltijd` string, `doorlooptijdDagen` integer/int64, `werkelijkeDoorlooptijdDagen` integer/int64, `anoniemGemeld` string, `terugkoppelingMelderTevreden` string, `terugkoppelingMelder` string, `meldingType` string, `meldingSoort` string, `meldingsnummerBovenliggend` string, `gbdBuurtCode` string, `gbdBuurtNaam` string, `gbdBuurtId` string, `gbdWijkCode` string, `gbdWijkNaam` string, `gbdWijkId` string, `gbdGgwgebiedCode` string, `gbdGgwgebiedNaam` string, `gbdGgwgebiedId` string, `gbdStadsdeelCode` string, `gbdStadsdeelNaam` string, `gbdStadsdeelId` string, `bagWoonplaatsNaam` string, `bagWoonplaatsId` string, `bron` string, `laatstGezienBron` string/date-time, `geometrie` , `geometrieVisualisatie` , `latitude` number/double, `longitude` number/double, `latitudeVisualisatie` number/double, `longitudeVisualisatie` number/double

### Limits and pitfalls
- Filtering on a restricted field (e.g. status) gives 403 'Access denied to filter on: status', even though the filter is listed in the OpenAPI description (15 Oct 2026). (tested)
- A count over 2.7 million reports (_count=true) took about 2.5 seconds; a CSV export without _pageSize returns all matches in one response. (tested)
- Of the 49 fields, 30 are open. Restricted (scope FP/MDW): status, handling time, deadline, reporter satisfaction and the exact geometry, among others. (from the description)
- datumMelding and tijdstipMelding are Dutch local time without a time zone. (tested)
- Requesting openapi.json with only Accept: application/json gives 406. Also send application/vnd.oai.openapi+json. (tested)

### Example
```
https://api.data.amsterdam.nl/v1/meldingen/meldingen/?datumMelding[gte]=2026-10-01&hoofdcategorie=Afval&_fields=datumMelding,subcategorie,gbdBuurtNaam&_sort=-datumMelding&_pageSize=3&_format=json
```

## How to fetch it

### curl
```bash
curl "https://api.data.amsterdam.nl/v1/meldingen/meldingen/?datumMelding%5Bgte%5D=2026-10-01&hoofdcategorie=Afval&_fields=datumMelding,subcategorie,gbdBuurtNaam&_pageSize=10&_format=json"
```

### python
```python
import requests

url = "https://api.data.amsterdam.nl/v1/meldingen/meldingen/"
for jaar in range(2021, 2026):
    r = requests.get(url, params={
        "datumMelding[gte]": f"{jaar}-01-01", "datumMelding[lt]": f"{jaar + 1}-01-01",
        "hoofdcategorie": "Afval", "_count": "true", "_pageSize": 1, "_format": "json"})
    print(jaar, r.headers["X-Total-Count"], "meldingen over afval")
```

## Who uses it
- [Signalen (broncode)](https://github.com/Amsterdam/signals): Amsterdam's open-source reporting system behind this data
- [Meldingen Amsterdam](https://meldingen.amsterdam.nl): The form residents use to file a report
- [Data en informatie Amsterdam](https://data.amsterdam.nl): The city's own data portal


## Examples with real figures (2)

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

- **Reports about public space in Amsterdam by main category: most waste (186,778 reports), then nuisance in public space and roads, traffic and street furniture** (2025). Table meldingen/meldingen. [Example](https://www.opendataindex.nl/en/voorbeeld/ams-meldingen-categorie)
  - `https://api.data.amsterdam.nl/v1/meldingen/meldingen/?datumMelding%5Bgte%5D=2025-01-01&datumMelding%5Blt%5D=2026-01-01&hoofdcategorie=Schoon&_count=true&_pageSize=1&_format=json`
- **Reports about public space in Amsterdam per year: 517,735 reports in 2025, 27% more than in 2021** (2025). Table meldingen/meldingen. [Example](https://www.opendataindex.nl/en/voorbeeld/ams-meldingen-per-jaar)
  - `https://api.data.amsterdam.nl/v1/meldingen/meldingen/?datumMelding%5Bgte%5D=2025-01-01&datumMelding%5Blt%5D=2026-01-01&_count=true&_pageSize=1&_format=json`
