# Luchtmeetnet

Metingen van stikstofdioxide, fijnstof en ozon, elk uur, van zo'n honderd meetstations in heel Nederland.

- Uitgever: Luchtmeetnet, Rijksinstituut voor Volksgezondheid en Milieu
- Gebied: Nederland · Laagste detail: meetstation
- Periode: 2012 – heden · Ververst: elk uur
- Toegang: Open · Licentie: Open data (bronvermelding)
- Koppelsleutels: stationsnummer, tijdstip
- Status: ok (2026-10-16) · NO2 18.3 µg/m³ Amsterdam-Stadhouderskade
- URL: https://www.luchtmeetnet.nl

## Wat kun je ermee?
- **Spits zichtbaar maken.** Middel NO₂ per uur van de dag over een maand. Bij een drukke straat zie je twee bulten: ochtend- en avondspits.
- **Jaarwisseling in de lucht.** Fijnstof (PM10, PM2,5) schiet rond middernacht op 1 januari omhoog door vuurwerk.
- **Toets aan de WHO-advieswaarden.** Bereken daggemiddelden en tel hoe vaak een station boven de advieswaarde van de WHO komt.

## Zo verwerk je het
1. **Zoek een station.** Haal de lijst met stations op en kijk welke stoffen elk station meet.
   `https://api.luchtmeetnet.nl/open_api/stations?page=1`
2. **Haal metingen op, per week.** Begin en einde mogen maximaal een week uit elkaar liggen. Loop door de pagina's.
3. **Let op de tijdzone.** Tijden zijn in UTC. Reken om naar Nederlandse tijd voor spitsanalyses.
4. **Gebruik later de definitieve cijfers.** Voor rapportages over een heel jaar: wacht op de gevalideerde jaarcijfers van het RIVM.

## Interessante koppelingen
- Wat doet de wind met de luchtkwaliteit? → [knmi-daggegevens](https://www.opendataindex.nl/bron/knmi-daggegevens.md) via datum en uur. Koppel per uur en vergelijk windstille uren met winderige.
- Hoeveel komt van het verkeer? → [ndw-verkeer](https://www.opendataindex.nl/bron/ndw-verkeer.md) via tijdstip + locatie. Zoek een meetlus vlak bij een straatstation en leg drukte en NO₂ per uur naast elkaar.

## Vergelijkbare bronnen
- [rivm-gcn](https://www.opendataindex.nl/bron/rivm-gcn.md): Berekend jaargemiddelde voor elke kilometer, geen metingen per uur.
- [eea-lucht](https://www.opendataindex.nl/bron/eea-lucht.md): Dezelfde stations, naast die van heel Europa.
- [Samen Meten (RIVM)](https://samenmeten.rivm.nl): Goedkope sensoren van burgers: veel meer plekken, minder nauwkeurig.

## Waar je op moet letten
- **Uurwaarden zijn voorlopig.** De uurmetingen zijn nog niet gevalideerd. De definitieve cijfers komen later in het jaar.
- **Een station meet één plek.** Een paar honderd meter verderop kan het heel anders zijn. Voor een gemiddelde op je eigen adres is de GCN-kaart van het RIVM beter.
- **Niet elk station meet alles.** Vraag eerst op welke stoffen een station meet, anders krijg je een lege lijst.
- **Per verzoek maximaal een week.** Langere periodes haal je in stukken op, en de antwoorden zijn gepagineerd.

## API (REST (JSON))

- Basis: https://api.luchtmeetnet.nl/open_api
- Toegang: Geen sleutel of account; fair use (getest zonder kop). (getest)
- Formaten: json
- Omvang: 102 meetstations in /stations (5 pagina's; 16 okt 2026), 13 stoffen in /components (getest)
- Filteren: Gewone queryparameters (station, stof, periode); geen querytaal.; 

### Endpoints
- `GET /stations`: Alle meetstations (nummer en plaatsnaam), gepagineerd; filter op organisation_id.
- `GET /stations/{nummer}`: Eén station: type (Municipal, Regional, Street …), gemeten stoffen, coördinaten, gemeente, beheerder, beginjaar.
- `GET /components`: De 13 stoffen met formule en naam (NL en EN): NO2, NO, O3, PM10, PM25, SO2, CO, NH3, H2S, benzeen, tolueen, xyleen, naftaleen.
- `GET /components/{formule}`: Uitleg bij een stof (bronnen, grenswaarde) als opgemaakte tekst in JSON.
- `GET /measurements`: Uurwaarden per station en stof in µg/m³, hoogstens 7 dagen per vraag.
- `GET /lki`: Luchtkwaliteitsindex (LKI, 1 tot 11) per station per uur.
- `GET /concentrations`: Berekende waarde op een punt (latitude, longitude) uit de kaart en de verwachting: het lopende uur en ~19 uur vooruit. Ook formula=LKI.
- `GET /organisations`: Beheerders van de stations (RIVM, GGD Amsterdam, DCMR, OMWB, ODGM, Provincie Limburg …) met id.

### Parameters
- `station_number`: Stationsnummer, bv. NL49014 (Amsterdam-Vondelpark). Zonder: alle stations. (getest)
- `formula`: Stof (NO2, PM10, PM25, O3 …). Zonder: alle stoffen van het station. (getest)
- `start / end`: Periode als ISO 8601 met Z, bv. 2026-10-15T00:00:00Z. Meer dan 7 dagen wordt stil ingekort (302). (getest)
- `page`: Paginanummer, standaard 1. (uit de beschrijving)
- `order_by / order_direction`: Sorteren op een veld uit het antwoord (timestamp_measured, location …) en asc/desc. Metingen komen standaard nieuwste eerst. (getest)
- `organisation_id`: Alleen stations van één beheerder (id uit /organisations; 4 = GGD Amsterdam). (getest)
- `latitude / longitude`: Punt voor /concentrations, in graden WGS84. (getest)

### Velden in het antwoord van /measurements en /lki (6)
`station_number` tekst, `formula` tekst, `value` getal, `timestamp_measured` datetime, `timestamp_measured_start / _end` datetime, `pagination.last_page` integer

### Limieten en valkuilen
- Hoogstens 100 verzoeken per 5 minuten. (uit de beschrijving)
- Pagina's van 1.000 metingen (alle stations, één stof, één dag = 3 pagina's) en 25 stations. (getest)
- Hoogstens 7 dagen per vraag. Vraag je meer, dan stuurt de API een 302 naar dezelfde vraag met start = end − 7 dagen: je krijgt stil minder dan gevraagd. (getest)
- Alle tijden in UTC (+00:00). timestamp_measured is het einde van het uur: de waarde van 00:00–01:00 heeft tijdstempel 01:00. (getest)
- Uurwaarden zijn voorlopig. Voor lange reeksen en vastgestelde cijfers per jaar: data.rivm.nl/data/luchtmeetnet/ (Actueel-jaar, Voorlopig-jaar, Vastgesteld-jaar), zo raadt de API-documentatie zelf aan. (uit de beschrijving)
- /concentrations negeert start en end: het geeft altijd vanaf het lopende uur ~20 berekende uurwaarden, geen metingen. (getest)
- Stationsnamen altijd uit /stations/<nummer> halen: NL49017 is Amsterdam-Stadhouderskade (verkeer), NL49014 is Vondelpark. (ervaring)
- Waarden soms met floatruis (8.300000190734863): afronden. (getest)

### Voorbeeld
```
https://api.luchtmeetnet.nl/open_api/measurements?station_number=NL49014&formula=NO2&start=2026-10-15T00:00:00Z&end=2026-10-15T06:00:00Z
```

## Zo haal je het op

### curl
```bash
curl "https://api.luchtmeetnet.nl/open_api/measurements?station_number=NL49017&formula=NO2&start=2026-10-08T09:00:00Z&end=2026-10-15T09:00:00Z"
```

### python
```python
import requests

r = requests.get("https://api.luchtmeetnet.nl/open_api/measurements", params={
    "station_number": "NL49017", "formula": "NO2",
    "order_by": "timestamp_measured", "order_direction": "desc"})
laatste = r.json()["data"][0]
print(laatste["timestamp_measured"], laatste["value"], "µg/m³")
```

## Wie gebruikt het
- [Luchtmeetnet](https://www.luchtmeetnet.nl): Kaart met de actuele luchtkwaliteit
- [Atlas Leefomgeving](https://www.atlasleefomgeving.nl): Luchtkwaliteit naast geluid, groen en water

## Wat je ermee kunt bouwen
- [Luchtkwaliteit-alert voor je eigen straat](https://www.opendataindex.nl/bouwen/luchtkwaliteit-alert.md): Een melding op je telefoon als de lucht bij jou thuis slecht is of slecht wordt, op basis van de verwachting van Luchtmeetnet, de meetstations in je stad, sensoren van buren en de RIVM-jaarkaart.

