BYTETOOLS

Luchtmeetnet API

Free Dutch air quality API with no key: the official national monitoring network's stations and their measured and forecast pollutant concentrations. Tested example included.

No API key requiredCORS enabledHTTPSFree tier

Endpoint tested and returned HTTP 200 on 2026-08-21

What is the Luchtmeetnet API?

Luchtmeetnet is the Netherlands' official air quality monitoring network, and its open API needs no key. The stations endpoint returns every monitoring site with its network identifier and location name, paginated.

Consumer air quality APIs mostly interpolate from sparse sources and present the result with more confidence than it deserves. Luchtmeetnet is the opposite: these are the actual regulatory monitoring stations operated by RIVM and its partners, the ones whose readings determine whether the Netherlands is meeting EU air quality limits. The measurements are reference-grade rather than modelled.

The station listing is deliberately minimal — a `number` and a `location` string, nothing more — because it exists to give you the identifier you need for everything else. Once you have a station number, `/stations/{number}/measurements` returns concentrations for NO2, PM10, PM2.5, ozone and the rest, and `/stations/{number}` returns the site's coordinates and metadata. The pagination block is more informative than most, giving you `last_page` and an explicit `page_list` array, so you know the total extent before you start walking it.

Quick facts

Base URL
https://api.luchtmeetnet.nl/open_api
Authentication
No API key and no account for the open API.
Rate limit
Not published as a fixed figure. Measurements update hourly, so hourly polling is the natural ceiling.
Pricing
Free. Dutch government open data.
CORS
Enabled — callable directly from browser JavaScript
Official docs
Read the docs

How to use the Luchtmeetnet API

Every request below was executed against the live API on 2026-08-21, and the response shown is the real body it returned — not an illustration.

1. List the national air quality monitoring stations

GET https://api.luchtmeetnet.nl/open_api/stations?page=1

curl
curl 'https://api.luchtmeetnet.nl/open_api/stations?page=1'
JavaScript (fetch)
const res = await fetch("https://api.luchtmeetnet.nl/open_api/stations?page=1");
if (!res.ok) throw new Error(`Request failed: ${res.status}`);
const data = await res.json();
console.log(data);
Python (requests)
import requests

res = requests.get("https://api.luchtmeetnet.nl/open_api/stations?page=1", timeout=20)
res.raise_for_status()
print(res.json())
Response — HTTP 200 (truncated)
{
  "pagination": {
    "last_page": 5,
    "first_page": 1,
    "prev_page": 1,
    "current_page": 1,
    "page_list": [
      1,
      2,
      3,
      4,
      5
    ],
    "next_page": 2
  },
  "data": [
    {
      "number": "NL49565",
      "location": "Oude Meer-Aalsmeerderdijk"
    },
    {
      "number": "NL53020",
      "location": "Strijensas Buitendijk"
    },
    {
      "number": "NL50013",
      "location": "Meerssen- Beekerweg"
    },
    {
      "number": "NL10741",
      "location": "Nijmegen-Graafseweg"
    },
    {
      "number": "NL10639",
      "location": "Utrecht-Constant Erzeijstraat"
    },
    {
      "number": "NL10636",
      "location": "Utrecht-Kardinaal de Jongweg"
    },
    {
      "number": "NL10446",
      "location": "Den Haag-Bleriotlaan"
    },
    {
      "number": "NL49701",
      "location": "Zaandam-Wagenschotpad"
    },
    {
      "number": "NL49012",
      "location": "Amsterdam-Van Diemenstraat"
    },
    {
      "number": "NL10301",
      "location": "Zierikzee-Lange Slikweg"
    },
    {
      "number": "NL10617",
      "location": "Biddinghuizen-Kuilweg"
    },
    {
      "number": "NL10404",
      "location": "Den Haag-Rebecquestraat"
    },
    {
      "number": "NL01912",
      "location": "Ridderkerk-Voorweg"
    },
    {
      "number": "NL53015",
      "location": "Klundert-Kerkweg"
    },
    {
      "number": "NL53004",
      "location": "Moerdijk-Julianastraat"
    },
    {
      "number": "NL54004",
      "location": "Arnhem Velperbroek"
    },
    {
      "number": "NL10450",
      "location": "Den Haag-Nehe

Parameters

ParameterTypeRequiredDescription
pagequeryOptional1-based page number. Read `pagination.last_page` to know how many there are. 1
organisation_idqueryOptionalFilter to stations run by one operating organisation. 1
/stations/{number}/measurementspathOptionalMeasured concentrations for one station, by pollutant formula.
/componentspathOptionalThe pollutant components the network measures, with units and formulas.

Response fields

dataarray
Stations on this page.
data[].numberstring
Station identifier such as `NL49565` — the key every other endpoint takes.
data[].locationstring
Human-readable site name, usually town plus street, in Dutch.
pagination.current_page / last_page / first_pageinteger
Where you are and how far the result set runs.
pagination.next_page / prev_pageinteger
Adjacent page numbers, clamped at the ends rather than null.
pagination.page_listarray
Every available page number as an array, which is unusually convenient for building a pager.

What you can build with the Luchtmeetnet API

  • Build a Dutch air quality map from official monitoring sites
  • Alert on NO2 or PM2.5 exceedances near a specific location
  • Compare regulatory station readings against low-cost sensor networks
  • Analyse long-term pollutant trends for a city

Common errors and how to fix them

Only a handful of stations returned

Results are paginated.

Fix: Read `pagination.last_page` and walk the pages. The captured example shows five pages of stations.

Station number rejected downstream

The identifier is a string with a country prefix.

Fix: Pass `NL49565` verbatim, including the `NL`. Stripping it to a number will not resolve.

No measurements for a station

Not every site measures every pollutant, and instruments go offline for maintenance.

Fix: Query `/components` for what exists, and treat gaps as normal rather than as errors.

Location names look garbled

They are Dutch and contain diacritics and hyphens.

Fix: Ensure you are decoding as UTF-8 throughout; the API sends it correctly.

Luchtmeetnet API — frequently asked questions

Is the Luchtmeetnet API free?

Yes, free with no key or account. It is Dutch government open data from the national air quality monitoring network.

How accurate is the data?

These are regulatory reference monitoring stations, the same instruments used to assess compliance with EU air quality limits — considerably more reliable than interpolated consumer air quality services.

How do I get actual pollutant readings?

Take a station `number` from this listing and call `/stations/{number}/measurements`. The station list exists to supply that identifier.

How often does the data update?

Hourly, in line with how the monitoring network reports. Polling more frequently than that returns the same values.

Tools that pair with this API

Luchtmeetnet is an independent third-party service and is not affiliated with ByteTools or ByteVancer. Details on this page were verified on 2026-08-21; always check the official documentation before relying on this API in production, as terms and limits can change.