303,525 datasets indexed1,419 publishers
Open Data IndexThe index of open data about the Netherlands
Sources›Housing and land
Rijkswaterstaat
Dutch source

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.

Housing and landClimate and environmentOpenMap layerAPINetherlands · site (plot or polygon)
Reachable · checked 17:23
bodemloket.nl
Screenshot of bodemloket.nl

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.

Source: Bodemloket (Rijkswaterstaat), ArcGIS-dienst lks_blk_rd_v1, laag WBB_locaties · opgehaald 25 oktober 2026Open the table Single block

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.

Source: Bodemloket (Rijkswaterstaat), ArcGIS-dienst lks_blk_rd_v1, laag WBB_locaties · opgehaald 25 oktober 2026Open the table Single block

What can you do with it?4 ideas

Getting started

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).

Getting started

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).

Advanced

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?

Advanced

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

  1. 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
  2. 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
  3. 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
  4. 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

Similar sources

  • DINOloket (TNO) not in the index yet

    The deeper subsurface (boreholes, groundwater, geology), not contamination per plot.

  • Atlas Leefomgeving not in the index yet

    Shows soil quality next to air, noise and greenery, for residents. Less suitable for calculations.

  • data.overheid.nl

    Some 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

StandardArcGIS RESTdocs
Access no key

No key or token: the directory and all calls below worked anonymously. tested

Size241,945

locations in layer 0 WBB_locaties (returnCountOnly, 16 Oct 2026) tested

Formats

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.
  • GEThttps://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.

=<>>>=<<=LIKEINIS NULLBETWEENANDORNOT

Parameters 13

whereCondition 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
outFieldsFields in the response, comma-separated, or * for all fields.tested
returnGeometryfalse = attributes only (much smaller response).tested
outSRProjection of the geometry in the response; 4326 = degrees (WGS84). Default is the layer's projection, here RD (28992).tested
fFormat: json (Esri JSON), geojson, pbf (protobuf), pjson (indented) or html (browse in the browser).tested
resultOffsetPagination: number of features to skip (from 0). Use together with orderByFields for a stable order.tested
resultRecordCountMaximum number of features in this response (capped at the layer's maxRecordCount).tested
orderByFieldsSort order, e.g. 'OBJECTID' or 'n DESC' (also on a statistics field).tested
returnCountOnlytrue = only the number of features matching where: {"count": …}.tested
outStatisticsServer-side statistics: list of {statisticType, onStatisticField, outStatisticFieldName}; statisticType count, sum, min, max, avg, stddev or var. URL-encode it.tested
groupByFieldsForStatisticsFields to group by with outStatistics (like GROUP BY).tested
returnDistinctValuestrue with outFields and returnGeometry=false: the unique values of those fields.tested
geometrySpatial 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)

NameTypeMeaning
WBB_DOSSIER_DBKOIDObjectsleutel (dit is het OBJECTID-veld van deze laag; gebruik het voor paginering en tellen)
SIKB_IDStringLandelijke SIKB-identificatie van de locatie
LOCATIECODE_BEVOEGD_GEZAGStringLocatiecode bij het bevoegd gezag (bv. FR008800079)
BIS_LOCCODEStringOude BIS-locatiecode
TYPE_CDStringCode van de vervolgstap (1 op 1 met VERVOLG_WBB)
VERVOLG_WBBStringVervolg volgens de Wet bodembescherming: voldoende onderzocht, uitvoeren historisch onderzoek, voldoende gesaneerd …
STATUS_OORDStringOordeel over de verontreiniging, vrije tekst (oude en nieuwe termen door elkaar)
ADMINISTRATOR_NMStringBevoegd gezag dat de gegevens beheert (gemeente, provincie, omgevingsdienst)
NEN3610_ID_SOIL_LOCATIONStringNEN3610-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.

All about Rijkswaterstaat

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