
Traffic signs and accessibility map (NDW)
The National Road Traffic Data Portal keeps a national file of traffic signs: per sign the RVV code (A1 for a speed limit, C22a for a low-emission zone …), additional panels, side of the road, the NWB road section, municipality, traffic order and since when the sign has been seen. Amsterdam alone had 97,175 signs on 16 October 2026. The traffic sign API v4 returns the current state (updated daily) and all changes; the whole file can also be downloaded. Plus an accessibility map that computes per municipality which roads are open to a vehicle of given dimensions, still in beta.

C22a traffic signs (low-emission zone) per municipality: most Amsterdam (91 signs), then Rotterdam and Arnhem
C22a traffic signs (low-emission zone) per municipality, October 2026, in signs. Total: 615; the largest 12 of 64 categories are shown. Amsterdam is 15% of the total. All signs with RVV code C22a in the current state (status placed). This counts signs, not zones: a zone has a sign at every entrance. Municipality names as NDW gives them ('s-Gravenhage = The Hague).
What you can build with it1
What can you do with it?4 ideas
Where does the low-emission zone start?
There are 615 C22a signs (low-emission zone) in 64 municipalities; Amsterdam has 91, Rotterdam and Arnhem 73 each. Map them and you see the edge of every zone.
How many signs are in your municipality?
Request the current state with countyCode (e.g. GM0599 for Rotterdam) and count per RVV code.
From sign to traffic order
Some signs have a trafficOrderUrl such as gmb-2024-403036: the traffic order in the municipal gazette. That lets you check whether every sign has a decision behind it.
What changes on the street?
The events service returns every published change with a timestamp, including signs that were removed (status REMOVED). Use it to follow a municipality switching to 30 km per hour.
How to process it4 steps
Always filter
current-state without a filter returns the whole country. rvvCode=A1 alone is 97 MB, Amsterdam 56 MB. Filter on rvvCode, countyCode, roadAuthorityType (R, P, G, W, T), status or bbox. An unknown parameter is silently ignored.
https://wegkenmerken.ndw.nu/api/rest/static-road-data/traffic-signs/v4/current-state?rvvCode=C22a&countyCode=GM0363
Keep track of changes
events returns at most 100 changes at a time, oldest first. offset is a timestamp: pass the time of the last change you received to continue.
https://wegkenmerken.ndw.nu/api/rest/static-road-data/traffic-signs/v4/events?limit=100&countyCode=GM0363
The whole file
The current state as CSV (246 MB zipped) or GeoJSON in RD and in degrees, on opendata.ndw.nu.
https://opendata.ndw.nu/verkeersborden_actueel_beeld.csv.gz
Accessibility map (beta)
GET municipalities returns the 342 municipalities with their bounds; POST accessibility.geojson with vehicle characteristics and a municipality returns the accessible and inaccessible road sections. According to the description, intended for road authorities only.
https://data.ndw.nu/api/rest/static-road-data/accessibility-map/v2/municipalities
Interesting combinations


Which speed applies to which road section?
Join the A1 signs (speed limit) via roadSectionId to the NWB road sections and colour the network by limit.


Signs per resident
Count signs per municipality and divide by the population from the CBS figures. Large differences also say something about how completely a municipality has been surveyed.
Similar sources
OpenStreetMapOSM has speed limits and access rules as road attributes, entered by volunteers; NDW has the signs themselves, with photo and traffic order.
National Road Database (NWB) and road dataThe road network itself; WEGGEG only has speed limits for national roads. The traffic signs cover all roads.
NDW live traffic dataLive speeds and volumes from the same portal; this is the static side of the road.
What to watch out for
- Beta and without rights
The accessibility map is, by its own description, in beta, intended only for road authorities, and no rights can be derived from it. The situation on the road always takes precedence.
- Not validated
All 615 low-emission zone signs had validated = n. The signs come from surveys and reports; a sign can be missing or already gone.
- Old addresses no longer work
The old addresses data.ndw.nu/api/rest/static-road-data/traffic-signs/v1/… return 404. Use v4 on wegkenmerken.ndw.nu.
- Large responses
There is no paging in current-state: a municipality or a common code returns tens of MB. For the whole country the download file is better.
APIREST (GeoJSON, JSON, CSV) · read 16 Oct 2026
No key or account; all calls worked anonymously. tested
low-emission zone signs C22a in the current state, in 62 municipalities (16 Oct 2026); the whole file is 235 MB zipped tested
geojsonjsoncsv
Base URL
https://wegkenmerken.ndw.nu/api/rest/static-road-data/traffic-signs/v4
Endpoints 5
- GET
/current-stateThe current state: every sign as a GeoJSON feature (or CSV), updated daily. With a filter it is filtered live, including today's changes. Without a status filter only placed signs (PLACED). - GET
/eventsAll published changes, oldest first, at most 100 at a time; read on with offset (timestamp). - GET
/collectionsThe supported coordinate reference systems (CRS84 and RD, EPSG 28992). - GET
https://wegkenmerken.ndw.nu/api/images/{id}Photo of the sign (JPEG, ~14 kB); the address is in imageUrl. - GET
https://opendata.ndw.nu/verkeersborden_actueel_beeld.csv.gzThe whole current state as a file: CSV (235 MB zipped) or GeoJSON in RD (_rd.geojson.gz, 228 MB) and in degrees (_wgs84.geojson.gz, 236 MB). Once a day around 12:05.
The APIs of this source 1 · from the provider's documentation from the description
Bereikbaarheidskaart API (v2, bèta)
Computes per municipality or bounding box which road sections are accessible for a vehicle of given dimensions, weight, fuel and emission class, based on the NWB and the traffic signs. No key. By its own description only for road authorities and in beta. We made no calls: robots.txt of data.ndw.nu says Disallow: /.
https://data.ndw.nu/api/rest/static-road-data/accessibility-map/v2- POST
/accessibility.geojsonBereikbare en niet-bereikbare wegvakken als GeoJSON. Body: area (type municipality met id GM0344, of boundingBox), vehicle (type bus/car/light_commercial_vehicle/motorcycle/tractor/truck, width, height, weight, length, axleLoad, hasTrailer, emissionClass, fuelTypes), optioneel destination, exclusions en effectivelyAccessible - GET
/municipalitiesAlle gemeenten met hun begrenzing - GET
/road-operatorsAlle wegbeheerders
Filtering from the description
Each condition is its own query parameter; combinations act as AND. Exact match, no wildcards.
Parameters 11
countyCode | Municipality code, e.g. GM0363 (Amsterdam). Other format (GM363) returns 400 with the rule ^GM\d{4}$. Also on /events. | tested |
rvvCode | RVV code of the sign (A1, C22a …); several separated by commas (C22a,C22c). | tested |
roadSectionId | NWB road section ids; no limit on the number. | from the description |
status | Status of the sign. Without this parameter you got only PLACED; status=REMOVED returned 407 removed low-emission zone signs. | tested |
roadAuthorityType | Type of road authority as a letter from the specification (which does not explain the letters). With G, 72 of the 73 C22a signs in Rotterdam remained. | tested |
roadAuthorityCode | Code of a single road authority. | from the description |
bbox | Bounding box; 4.88,52.36,4.92,52.38 with rvvCode=C22a returned 2 signs. | tested |
bbox-crs / crs | CRS of the bbox and of the response: http://www.opengis.net/def/crs/OGC/1.3/CRS84 (default) or http://www.opengis.net/def/crs/EPSG/9.9.1/28992 (RD). | tested |
contentType | contentType=csv (or the Accept header text/csv) returns a flat CSV with 36 columns. | tested |
offset | Only /events: publication time to read from (yyyy-MM-ddTHH:mm:ss.SSSZ); default 1970. | from the description |
limit | Only /events: block size, default and maximum 100 (101 returns 400). | tested |
Fields per sign (current-state, GeoJSON properties) 15
| Name | Type | Meaning |
|---|---|---|
id | uuid | Vaste id van het bord |
rvvCode | tekst | Bordcode volgens het RVV 1990 (A1, C22a …) |
blackCode | tekst | De waarde op het bord, bv. 50 bij een A1 |
zoneCode | tekst | ZB, ZH, ZE, ZO of leeg (zonebord) |
status | tekst | PLANNED, PLACED of REMOVED |
validated | j/n | Gecontroleerd; alle 615 C22a-borden hadden n |
textSigns | lijst | Onderborden met type (VRIJ, EMIS, KEN, RICH, UIT, VOOR, TIJD), tekst en bij TIJD openingHours in OSM-notatie |
placement / side / bearing | tekst / graden | Plaatsing (L, B), kant (L, R, N, NO …) en kijkrichting 0–359 |
fraction | getal | Positie op het wegvak, 0 tot 1 |
drivingDirection | tekst | H of T: met of tegen de digitaliseerrichting van het NWB-wegvak |
roadName / roadNumber / roadSectionId / nwbVersion | tekst / getal / datum | Weg en NWB-wegvak waar het bord bij hoort, met de NWB-versie |
countyCode / countyName / townName | tekst | Gemeente (GM-code) en woonplaats |
Show all 15
| Name | Type | Meaning |
|---|---|---|
imageUrl | url | Foto van het bord |
firstSeenOn / lastSeenOn / placedOn / removedOn | datum | Wanneer het bord voor het eerst en laatst gezien, geplaatst of weggehaald is |
trafficOrderUrl | tekst | Kenmerk van het verkeersbesluit, bv. gmb-2024-272098 |
Limits and pitfalls
- current-state has no paging: without a filter you get the whole country. rvvCode=A1 alone is 97 MB, Amsterdam 56 MB. Always filter, or use the download file. experience
- events: at most 100 per call (limit=101 returns 400). tested
- No key and no documented rate limit; filtered requests answered within 0.1 seconds. tested
- The documentation still mentions data.ndw.nu and the parameter names rvv-code and road-section-ids. The OpenAPI specification and the working API use wegkenmerken.ndw.nu/api with rvvCode and roadSectionId. The old v1 addresses on data.ndw.nu return 404. tested
- An unknown parameter is silently ignored (foo=bar simply returned 73 signs). A typo in a filter name therefore quietly returns the unfiltered, much larger response. tested
- events has no publication timestamp in the response, even though offset works on it. Keep the time of your last call yourself and read on from there; an event may then arrive twice. tested
- In events the structure differs from current-state: location.wgs84.latitude, location.road.roadSectionId, location.county.code, details.imageUrl. current-state is flat. tested
- Join roadSectionId to the NWB (wvk_id), but mind nwbVersion: road sections change between NWB versions. experience
- wegkenmerken.ndw.nu has no robots.txt (the web app returns its start page for every path); data.ndw.nu redirects robots.txt to a page with Disallow: /. That is why we did not call the accessibility map. tested
Try it HTTP 200 · 386 ms · 16 Oct
https://wegkenmerken.ndw.nu/api/rest/static-road-data/traffic-signs/v4/current-state?rvvCode=C22a&countyCode=GM0363
{
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"id": "061dc8bb-f323-48d7-bc5b-a03e6fa9187c",
"geometry": {
"type": "Point",
"coordinates": "…"
},
"properties": {
"validated": "n",
"rvvCode": "C22a",
"zoneCode": "ZB",
"status": "PLACED",
"textSigns": [
{
"type": "EMIS",
"text": "[[c22a3]]"
},
{
"type": "EMIS",
"text": "[[c22a9]]"
}
],
"placement": "L",
"side": "W",
"bearing": 274,
"fraction": 0.9918174,
"drivingDirection": "T",
"roadName": "Jan Vroegopsingel",
"roadSectionId": 600980960,
"nwbVersion": "2026-05-01",
"countyName": "Amsterdam"
}
},
{
"type": "Feature",
"id": "087aa8eb-2990-498e-af72-e185d1dfd664",
"geometry": {Shortened response, saved at harvest time. Click the URL for the real, current response.
Read from NDW Docs: Traffic signs download API 4.0, with all fields, parameters and examples · OpenAPI 3 specification (version 4.0, server wegkenmerken.ndw.nu/api) · NDW Docs: Accessibility map API (beta) · Source code of the accessibility map, with a copy of the OpenAPI specification v2. Labels: from the description stated in what the api itself publishes. tested from our own small call. platform applies to every api on this platform, per its documentation. experience learned while building open data index.
How to fetch it
curl "https://wegkenmerken.ndw.nu/api/rest/static-road-data/traffic-signs/v4/current-state?rvvCode=C22a"
More from NDW in our index
4 datasets in data.overheid.nl, Nationaal Georegister. These changed most recently.
- RVV Verkeersborden2026-10-30
- Emissiezones (milieuzones en nul-emissiezones)2026-06-22
- NWB Buitenland2026-06-19
- Regionaal Verkeersmanagement Netwerk (RVM)2023-08-11
More in this topic
See how this page is built
bron: ndw-wegkenmerken blokken: [] secties: - ideeen - verwerken - koppelingen - vergelijkbaar - beperkingen - code cache: tag: bron:ndw-wegkenmerken ververs: na statuscheck, als de bron nieuwer is statuscheck: methode: Last-Modified van het downloadbestand verkeersborden_actueel_beeld.csv.gz verwacht: dagelijks
Source: content/bronnen/ndw-wegkenmerken.yaml · Markdown



