The BGT, the Dutch large-scale base map, is available free of charge and without a key from PDOK. For a map window use the OGC API Features; for an area or the whole country use the Download API with CityGML, GML-light or StUF-Geo. The data is CC0 and also contains ended occurrences, which you must filter out yourself.

Last updated:

What is the BGT and who maintains it?

The Basisregistratie Grootschalige Topografie (BGT), the Dutch key register of large-scale topography, is a detailed digital map of the Netherlands with objects such as buildings, roads, water, railways and green space. A basisregistratie is a legally designated national register that is the authoritative source for one kind of data. The Kadaster, the Dutch land registry, builds and runs the national facility (LV-BGT). The source holders are municipalities, provinces, water boards, ProRail (the rail infrastructure manager) and three ministries. Each source holder is responsible for its own part of the map.

In de Basisregistratie Grootschalige Topografie (BGT|IMGeo) standaarden staat beschreven hoe overheidsorganisaties de inrichting van de buitenruimte - wegen, water, groen, bebouwing - in Nederland digitaal vastleggen.

Source: Geonovum, BGT | IMGeo (Dutch original; in English: the BGT|IMGeo standards describe how government organisations digitally record the layout of outdoor space in the Netherlands: roads, water, green space, buildings).

Properties of the BGT at PDOK (read on 11 October 2026)
PropertyValue
OwnerKadaster (LV-BGT); source holders supply the objects
LicenceCC0 1.0, according to the OGC API landing page
OGC API Featureshttps://api.pdok.nl/kadaster/bgt/ogc/v1, version 1.0.0, 49 collections
Download APIhttps://api.pdok.nl/kadaster/bgt/download/v1_0
Coordinate systems OGC APICRS84, RD (EPSG:28992, storage), Web Mercator, ETRS89 (EPSG:4258)
Download formatsCityGML, GML-light, StUF-Geo
Freshness of downloadsper object type; on 11 October 2026 the latest timestamp was 10 October 22:30 UTC

What is the difference between BGT and IMGeo?

The BGT contains the mandatory core; IMGeo is the extension. According to Geonovum, the Dutch geo-standards body, applying the BGT data catalogue is a legal obligation. IMGeo also lets source holders exchange more objects and more detail, for example litter bins and poles in public space.

In practice you see this in the PDOK collections. Besides pand (building), wegdeel (road section) and waterdeel (water section), the OGC API contains object types such as bak (bin), paal (pole), kast (cabinet), mast and bord (sign). Which of them you find filled depends on what the source holder supplied. Because IMGeo is supplementary, not every source holder has to deliver those objects. So do not count on collections such as paal or bak covering the whole country.

The download files refer to IMGeo schema version 2.1 (the XML namespace in our test download); the model and its documentation are at Geonovum. If you want to show the data in a municipal map viewer, also read about the GIS viewer for municipalities.

Which download route do you choose for the BGT?

Choose the OGC API for a map window and the Download API for an area or the whole country. PDOK also offers WMTS and vector tiles for display, but those deliver images or tiles, not objects for analysis.

BGT routes at PDOK
RouteSuited forNote
OGC API FeaturesObjects in a map window, a few collections at a timeAt most 1,000 per request; no attribute filter
Download API, predefinedWhole country, all object types, ready-made zip fileLarge file; also a variant without positioning points
Download API, customOwn area and own object types, asynchronousThe geofilter is not exact
Download API, deltaUpdating your own copy periodicallyFirst fetch an initial state, then only the changes
Vector tiles and WMTSDisplay in a mapNo full attributes to calculate with

The full procedure for the download variants is in the OpenAPI description of the Download API and in PDOK's step-by-step guide. Hosting and updating your own copy of the BGT is a maintenance task; see GIS management and hosting (in Dutch).

How do you request BGT objects in a map window with the OGC API?

The OGC API Features works without a key and returns GeoJSON. With bbox and bbox-crs you give a window in RD. By default the coordinates come back in WGS84 (CRS84); with crs you request RD. The example was run with Node 24 on 11 and 12 October 2026 with the same output.

const url = new URL('https://api.pdok.nl/kadaster/bgt/ogc/v1/collections/pand/items');
url.searchParams.set('f', 'json');
url.searchParams.set('bbox', '154150,462680,154250,462760');
url.searchParams.set('bbox-crs', 'http://www.opengis.net/def/crs/EPSG/0/28992');
url.searchParams.set('limit', '100');

const res = await fetch(url);
if (!res.ok) throw new Error('PDOK returned status ' + res.status);
const fc = await res.json();

const current = fc.features.filter((f) => f.properties.eind_registratie === null);
console.log(fc.numberReturned, 'occurrences,', current.length, 'current');
console.log(current.map((f) => f.properties.bag_pnd));

Output:

15 occurrences, 6 current
[ '0307100000311531', '0307100000347585', '0307100000338918',
  '0307100000341963', '0307100000308303', '0307100000595635' ]

The window is 100 by 80 metres at Amersfoort station. The service returned fifteen occurrences (voorkomens), of which six without an end date. A building can have several versions; the first feature in the response had an eind_registratie (end of registration) in 2017, while a newer version of the same BAG building (0307100000338918) was current. The property bag_pnd links the BGT building to the building in the BAG.

There is no attribute filter. A CQL filter returned status 400 with the message "CQL support is not enabled for this API", and an unknown query parameter (bag_pnd=…) also gave 400. So select spatially and filter in your own code. If you link to the BAG, you can then combine the 2D building with the 3D BAG for height.

How do you download a BGT extract with the Download API?

A custom download is asynchronous. You send a POST with the object types, the format and an optional geofilter, wait until the status is COMPLETED and then fetch the zip file. The geofilter is a WKT polygon in RD; only Polygon and MultiPolygon are allowed and holes (inner rings) are not supported. The API expects format and featuretypes, and the format values are citygml, gmllight and stufgeo.

BASE=https://api.pdok.nl/kadaster/bgt/download/v1_0

# 1. request: buildings only, area as a WKT polygon in RD (EPSG:28992)
RESP=$(curl -s -X POST "$BASE/full/custom" \
  -H "Content-Type: application/json" \
  -d '{"featuretypes":["pand"],"format":"citygml","geofilter":"POLYGON((154150 462680,154250 462680,154250 462760,154150 462760,154150 462680))"}')
ID=$(echo "$RESP" | grep -o '"downloadRequestId":"[^"]*"' | cut -d'"' -f4)

# 2. wait until the status is COMPLETED
until curl -s "$BASE/full/custom/$ID/status" | grep -q COMPLETED; do sleep 2; done

# 3. take the download link from the status and fetch the zip file
LINK=$(curl -s "$BASE/full/custom/$ID/status" | grep -o '"href":"[^"]*extract.zip"' | cut -d'"' -f4)
curl -s -o bgt-pand.zip "https://api.pdok.nl$LINK"
unzip -l bgt-pand.zip

The POST returned status 202 with a downloadRequestId. The whole script took between about 20 and 41 seconds in tests on 11 and 12 October 2026. Both times the zip file was 4,402,285 bytes and contained one file, bgt_pand.gml, of 67,690,421 bytes.

Why is my download much larger than the area?

The geofilter is not exact. The OpenAPI description says that the filter limits the area, but that the download may contain an overshoot of objects outside the selection. In our test of 100 by 80 metres the overshoot was large. The GML file contained 25,385 BuildingPart elements. The first coordinate of the elements without an end date lay between x 153,953 and 156,010 and between y 461,967 and 464,023, so spread over roughly two by two kilometres.

The file also contains ended occurrences. Of those 25,385 elements, 12,467 had no eindRegistratie; the rest is history. So always check the file size and the number of objects, clip the area exactly yourself with your GIS package and filter on eindRegistratie before you count or display. If you use this for a report on one neighbourhood, build those two steps into your script.

The spread was determined on the first point of each element. Treat it as an indication of the size of the overshoot, not as a measure for an analysis.

What other pitfalls does the BGT have?

  • Lines, points and areas are separate collections. An object such as kunstwerkdeel (structure part) is in the OGC API as kunstwerkdeel_lijn, kunstwerkdeel_punt and kunstwerkdeel_vlak. In the Download API it is one object type.
  • History in all routes. Both the OGC API and the download deliver occurrences with an end date. Filter on eind_registratie (OGC API) or eindRegistratie (GML).
  • WGS84 by default. Without crs the OGC API returns longitude and latitude, while the Download API's geofilter expects RD. Set both explicitly.
  • Slow large requests. A request with limit=1000 took about eleven seconds in our test. Ask for small windows and cache the responses, as described under PDOK fair use and caching (in Dutch).
  • Errors in the map. For corrections PDOK refers to the service Verbeter de kaart (Improve the map); see reporting errors to key registers (in Dutch).

When is the BGT not the right source?

The BGT describes the physical outdoor space, not who lives where or who owns it. For addresses use the BAG, for parcels and ownership the BRK and cadastral map. A background map for a website you build with WMTS or vector tiles, not with feature downloads. Height comes from the AHN (the national height model, in Dutch) or the 3D BAG.

If you want to convert BGT data into a format your systems read, GDAL (in Dutch) is the usual tool. For a viewer with the BGT as a base layer, see GIS and digital map solutions. The overview of other sources is on the hub Dutch open data.

Frequently asked questions

Is the BGT free to use?

Yes. PDOK states CC0 1.0 for the BGT OGC API; that is the Creative Commons dedication by which the rights holder waives its rights. The Kadaster writes that anyone can use the information from the BGT freely. For government bodies and other statutory users, using the BGT is in fact mandatory.

Which format should I choose, CityGML, GML-light or StUF-Geo?

Choose the format your software can read. PDOK offers GML (CityGML), GML-light and StUF-Geo; the description of the download formats is at Geonovum. We only tested CityGML. According to Geonovum, StUF-Geo belongs to the exchange between source holder and national facility.

How do I fetch the BGT for one municipality?

The Download API has no filter on municipality code. Draw the municipal boundary as WKT in RD, send it as the geofilter and clip the result exactly afterwards. The OGC API does have collections such as buurt and wijk (neighbourhood and district), but no filter on municipality.

How do I keep my own copy of the BGT current?

Use the delta endpoint: first fetch an initial state and then the changes periodically. PDOK describes this in three steps in the OpenAPI description: initial state, request delta ids, and for each new delta id fetch the mutations. PDOK prefers daily updating.

Sources

More about TechinFlow

A new company in Haarlem building custom software, GIS and data platforms on open standards.

023 230 21 42Get in touch

A question or project?

Tell us briefly what is going on and for which organisation. We reply by email.

Send a message