
Bodemloket (soil information desk)
Where has the soil been surveyed, where is it contaminated and what is being done? The Bodemloket shows what provinces, environmental services and large municipalities supply about their sites: the stage of investigation, the verdict on the contamination and whether it was remediated. On 15 October 2026 it covered 241,945 sites.

Bodemloket sites by supplying authority: most Omgevingsdienst Haaglanden (34,157 sites), then Omgevingsdienst West-Holland and Provincie Limburg
Bodemloket sites by supplying authority, October 2026, in sites. Total: 242,214; the largest 12 of 68 categories are shown. Omgevingsdienst Haaglanden is 14% of the total. Each authority supplies its own data. 31 authorities, including the municipalities of Utrecht, Eindhoven and Groningen, only show their sites on their own website and are missing from this count. A low count says nothing about clean soil.
Bodemloket sites by next step: most sufficiently investigated (140,558 sites), then historical survey to do and exploratory survey to do
Bodemloket sites by next step, October 2026, in sites. Total: 242,214; the largest 12 of 23 categories are shown. Sufficiently investigated is 58% of the total. For 22,872 sites no next step is filled in; they are included in the total. The Bodemloket has no date per site.
What can you do with it?4 ideas
What lies beneath the new housing estate?
Request all sites within 250 metres of an address. For each site you see the stage of investigation and the verdict, for example 'Potentieel Ernstig' (potentially serious) or 'voldoende gesaneerd' (sufficiently remediated).
How much work is left?
Count per municipality or environmental service the sites where investigation or remediation is still needed (VERVOLG_WBB). On 15 October 2026, 41,143 sites were marked 'Uitvoeren historisch onderzoek' (historical investigation to do).
Mapping urgent sites
Filter on verdicts containing 'spoed' or 'urgent' and lay them over the neighbourhood boundaries. Do people live on or next to them?
Which municipalities show nothing?
The Bevoegd_gezag layer states per authority whether its data is in the Bodemloket or only on its own website. On 15 October 2026, 'only via own website' applied to 31 of the 41 authorities, including Utrecht, Groningen, Eindhoven and Nijmegen.
How to process it4 steps
Look at the layers and fields
The data sits in a Rijkswaterstaat ArcGIS service with three layers: WBB_locaties (the sites), Beschikbaarheid_gegevens and Bevoegd_gezag. At most 2,000 features per request, output as JSON, GeoJSON or PBF.
https://gis.gdngeoservices.nl/standalone/rest/services/blk_gdn/lks_blk_rd_v1/MapServer?f=json
Sites around a point
Give a point in RD coordinates and a radius. Around this point in Helmond (Brouwhuis-Oost neighbourhood) a 250 metre radius returned 29 sites.
https://gis.gdngeoservices.nl/standalone/rest/services/blk_gdn/lks_blk_rd_v1/MapServer/0/query?geometry=177060%2C386040&geometryType=esriGeometryPoint&inSR=28992&distance=250&units=esriSRUnit_Meter&spatialRel=esriSpatialRelIntersects&outFields=LOCATIECODE_BEVOEGD_GEZAG%2CVERVOLG_WBB%2CSTATUS_OORD&returnGeometry=false&f=json
Counting on the server
With outStatistics and groupByFieldsForStatistics the service counts for you, for example per administrator (ADMINISTRATOR_NM). That way you don't have to fetch 241,945 sites.
https://gis.gdngeoservices.nl/standalone/rest/services/blk_gdn/lks_blk_rd_v1/MapServer/0/query?where=1%3D1&outStatistics=%5B%7B%22statisticType%22%3A%22count%22%2C%22onStatisticField%22%3A%22WBB_DOSSIER_DBK%22%2C%22outStatisticFieldName%22%3A%22n%22%7D%5D&groupByFieldsForStatistics=ADMINISTRATOR_NM&f=json
Clean up the verdicts
STATUS_OORD is free text from different systems: 'Potentieel Ernstig', 'potentieel spoed', 'Urgent, start san voor 2015'. Build your own short classification before counting.
Interesting combinations


How many homes stand on a seriously contaminated site?
Intersect the BAG residential units with the site polygons and count per verdict. Both are in RD.


Which neighbourhoods have the most open cases?
Count per neighbourhood the sites where VERVOLG_WBB still names an action. Note that big cities are missing.
Similar sources
- DDINOloket (TNO) not in the index yet
The deeper subsurface (boreholes, groundwater, geology), not contamination per plot.
- ALAtlas Leefomgeving not in the index yet
Shows soil quality next to air, noise and greenery, for residents. Less suitable for calculations.
data.overheid.nlSome municipalities publish their own soil database there, such as The Hague (Historisch bodembestand).
What to watch out for
- Big cities are missing
Amsterdam and Rotterdam had zero sites in the service on 15 October 2026, and 31 of the 41 authorities show their data only on their own website. An empty map therefore does not mean the soil is clean.
- No date
Sites have no date of investigation or last change. How often an authority supplies data varies and is not stated in the service.
- Many empty verdicts
For 99,633 of the 241,945 sites STATUS_OORD is empty. Count them separately and say so.
- Licence not stated
Site and service state no open licence, only a disclaimer. For large-scale reuse, check what is allowed and always credit the source.
- Map outages
Around 20 and 21 August 2026 the map, and then the soil quality map layers, did not work for a while (news items on the site). Build in a retry.
APIArcGIS REST · read 16 Oct 2026
No key or token: the directory and all calls below worked anonymously. tested
locations in layer 0 WBB_locaties (returnCountOnly, 16 Oct 2026) tested
jsongeojsonpbfpng (export, WMS)
Base URL
https://gis.gdngeoservices.nl/standalone/rest/services/blk_gdn
Endpoints 7
- GET
?f=jsonFolder blk_gdn: one service, lks_blk_rd_v1 (MapServer, ArcGIS 11.5). - GET
/lks_blk_rd_v1/MapServer?f=jsonThe service: layer 0 WBB_locaties, 1 Beschikbaarheid_gegevens (31), 2 Bevoegd_gezag (41); maxRecordCount 2,000; WMSServer extension. - GET
/lks_blk_rd_v1/MapServer/{laag}?f=jsonFields and capabilities of one layer. - GET
/lks_blk_rd_v1/MapServer/0/queryQuery soil locations: at a point with a radius, per competent authority, per status; count and group. - GET
/lks_blk_rd_v1/MapServer/export?bbox=120000,480000,125000,485000&bboxSR=28992&size=400,400&layers=show:0&format=png&f=jsonMap image of a rectangle (link to a PNG; with f=image the image itself). - GET
/lks_blk_rd_v1/MapServer/legend?f=jsonLegend per layer. - GET
https://gis.gdngeoservices.nl/standalone/services/blk_gdn/lks_blk_rd_v1/MapServer/WMSServer?request=GetCapabilities&service=WMSWMS 1.3.0 of the same service (path without /rest/).
Filtering platform
SQL-like where clause on the layer's fields, plus an optional spatial filter (geometry). Group and count with outStatistics.
Parameters 13
where | Condition in SQL-92 style: 1=1 for everything, text in single quotes (GEMEENTE='Zwolle'), LIKE with %, AND/OR, dates as DATE 'YYYY-MM-DD'. Required when there is no other filter. | tested |
outFields | Fields in the response, comma-separated, or * for all fields. | tested |
returnGeometry | false = attributes only (much smaller response). | tested |
outSR | Projection of the geometry in the response; 4326 = degrees (WGS84). Default is the layer's projection, here RD (28992). | tested |
f | Format: json (Esri JSON), geojson, pbf (protobuf), pjson (indented) or html (browse in the browser). | tested |
resultOffset | Pagination: number of features to skip (from 0). Use together with orderByFields for a stable order. | tested |
resultRecordCount | Maximum number of features in this response (capped at the layer's maxRecordCount). | tested |
orderByFields | Sort order, e.g. 'OBJECTID' or 'n DESC' (also on a statistics field). | tested |
returnCountOnly | true = only the number of features matching where: {"count": …}. | tested |
outStatistics | Server-side statistics: list of {statisticType, onStatisticField, outStatisticFieldName}; statisticType count, sum, min, max, avg, stddev or var. URL-encode it. | tested |
groupByFieldsForStatistics | Fields to group by with outStatistics (like GROUP BY). | tested |
returnDistinctValues | true with outFields and returnGeometry=false: the unique values of those fields. | tested |
geometry | Spatial filter: a point 'x,y' or envelope 'xmin,ymin,xmax,ymax', with geometryType (esriGeometryPoint, esriGeometryEnvelope), inSR (input projection), spatialRel (esriSpatialRelIntersects) and optionally distance + units (esriSRUnit_Meter) for a radius. | tested |
Fields of the example layer 9 · lks_blk_rd_v1/MapServer/0 (WBB_locaties)
| Name | Type | Meaning |
|---|---|---|
WBB_DOSSIER_DBK | OID | Objectsleutel (dit is het OBJECTID-veld van deze laag; gebruik het voor paginering en tellen) |
SIKB_ID | String | Landelijke SIKB-identificatie van de locatie |
LOCATIECODE_BEVOEGD_GEZAG | String | Locatiecode bij het bevoegd gezag (bv. FR008800079) |
BIS_LOCCODE | String | Oude BIS-locatiecode |
TYPE_CD | String | Code van de vervolgstap (1 op 1 met VERVOLG_WBB) |
VERVOLG_WBB | String | Vervolg volgens de Wet bodembescherming: voldoende onderzocht, uitvoeren historisch onderzoek, voldoende gesaneerd … |
STATUS_OORD | String | Oordeel over de verontreiniging, vrije tekst (oude en nieuwe termen door elkaar) |
ADMINISTRATOR_NM | String | Bevoegd gezag dat de gegevens beheert (gemeente, provincie, omgevingsdienst) |
NEN3610_ID_SOIL_LOCATION | String | NEN3610-id van de locatie |
Limits and pitfalls
- At most 2.000 features per response (the layer's maxRecordCount; varies per layer, see /{layer}?f=json). If there are more, the response has exceededTransferLimit: true: fetch the rest with resultOffset and resultRecordCount. tested
- No key and no documented rate limit. Take it easy (a few requests per second) and prefer statistics or counts over fetching all features. experience
- The outStatistics field comes back in upper case: if you ask for outStatisticFieldName 'n', the response calls it 'N'. Sorting with orderByFields=n DESC still works. tested
- The object key field is WBB_DOSSIER_DBK, not OBJECTID: orderByFields=OBJECTID returns 'Invalid or missing input parameters'. tested
- Errors come back with HTTP 200 and a JSON object {"error": {"code": 400, …}} ('Failed to execute query.' for an unknown field in where). Always check for an error field, not just the status code. tested
- 22,869 locations have no VERVOLG_WBB and no TYPE_CD. Amsterdam and Rotterdam supply nothing; 31 of the 41 competent authorities (layer 1) only show their data on their own website. tested
- No date field and no editingInfo: the API does not say when a location was updated. The total fluctuates (15 Oct 241,945, earlier on 16 Oct 242,206, in the evening 241,945 again). tested
- Layer 0 has polygons in RD (EPSG:28992). A query at a point with a radius: geometry=x,y&geometryType=esriGeometryPoint&inSR=28992&distance=250&units=esriSRUnit_Meter. tested
Try it HTTP 200 · 1,625 ms · 16 Oct
https://gis.gdngeoservices.nl/standalone/rest/services/blk_gdn/lks_blk_rd_v1/MapServer/0/query?where=1%3D1&outStatistics=[{"statisticType"%3A"count"%2C"onStatisticField"%3A"WBB_DOSSIER_DBK"%2C"outStatisticFieldName"%3A"n"}]&groupByFieldsForStatistics=VERVOLG_WBB&orderByFields=n DESC&f=json
{
"displayFieldName": "",
"fieldAliases": {
"VERVOLG_WBB": "VERVOLG_WBB",
"N": "N"
},
"fields": [
{
"name": "VERVOLG_WBB",
"type": "esriFieldTypeString",
"alias": "VERVOLG_WBB",
"length": 50
},
{
"name": "N",
"type": "esriFieldTypeBigInteger",
"alias": "N"
}
],
"features": [
{
"attributes": {
"VERVOLG_WBB": "voldoende onderzocht",
"N": 140554
}
},
{
"attributes": {
"VERVOLG_WBB": "Uitvoeren historisch onderzoek",
"N": 41143
}
}
]
}Shortened response, saved at harvest time. Click the URL for the real, current response.
Read from Service description: three layers, limits, WMS extension · Layer WBB_locaties: fields and capabilities · Esri: query operation (all parameters). 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://gis.gdngeoservices.nl/standalone/rest/services/blk_gdn/lks_blk_rd_v1/MapServer/0/query?geometry=177060%2C386040&geometryType=esriGeometryPoint&inSR=28992&distance=250&units=esriSRUnit_Meter&spatialRel=esriSpatialRelIntersects&outFields=LOCATIECODE_BEVOEGD_GEZAG%2CVERVOLG_WBB%2CSTATUS_OORD&returnGeometry=false&f=json"
More from Rijkswaterstaat in our index
6,621 datasets in Nationaal Georegister, data.overheid.nl, ArcGIS Online Rijkswaterstaat, 4TU.ResearchData (via DataCite). These changed most recently.
- FIS_VNDS - Touristharbour - lijnen2026-10-30
- sluiskolk2026-10-30
- Maatregelen KRW RWS Oost Nederland punten2026-10-30
- meldpunt2026-10-30
- Vaarwegmarkeringen Nederland2026-10-30
- FIS_VNDS - Headoffice - punten2026-10-30
More in this topic
See how this page is built
bron: bodemloket blokken: [] secties: - ideeen - verwerken - koppelingen - vergelijkbaar - beperkingen - code cache: tag: bron:bodemloket ververs: na statuscheck, als de bron nieuwer is statuscheck: methode: aantal locaties in de laag WBB_locaties (ArcGIS REST, returnCountOnly) verwacht: maandelijks
Source: content/bronnen/bodemloket.yaml · Markdown


