PDOK Locatieserver API
Free official Dutch geocoding API with no key: search addresses, streets, postcodes and place names from the BAG, with RD and WGS84 coordinates. Tested example included.
Endpoint tested and returned HTTP 200 on 2026-08-21
What is the PDOK Locatieserver API?
PDOK Locatieserver is the Dutch government's free, key-free geocoding service. It searches addresses, streets, postcodes, neighbourhoods and place names drawn from the BAG and NWB registers, returning both WGS84 and Rijksdriehoek coordinates for each match.
Locatieserver is a thin, well-behaved front end over Solr, and knowing that explains most of its quirks. Responses arrive wrapped in a `response` object with `numFound`, `start` and `docs`, exactly as Solr emits them, and the `score` on each document is a Lucene relevance score rather than a normalised confidence — comparable within one query, meaningless between two.
The dual coordinate output is the part worth planning around. Every document carries `centroide_ll` in WGS84 and `centroide_rd` in the Rijksdriehoek projection, both as WKT `POINT(x y)` strings rather than numbers. Dutch surveying, planning and utility systems overwhelmingly speak RD, so having both in one response saves a reprojection step — but you will have to parse the WKT yourself, and the `type` field tells you whether you matched an address, a street, a neighbourhood or a whole municipality.
Quick facts
- Base URL
https://api.pdok.nl/bzk/locatieserver/search/v3_1- Authentication
- No API key or registration. PDOK publishes Dutch open government geodata for free reuse, including commercial reuse.
- Rate limit
- No published per-IP quota, but PDOK applies fair-use throttling and asks bulk consumers to use its download services.
- Pricing
- Free.
- CORS
- Enabled — callable directly from browser JavaScript
- Official docs
- Read the docs
How to use the PDOK Locatieserver 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. Geocode a Dutch address with the free search endpoint
GET https://api.pdok.nl/bzk/locatieserver/search/v3_1/free?q=Dam%201%20Amsterdam&rows=1
curl 'https://api.pdok.nl/bzk/locatieserver/search/v3_1/free?q=Dam%201%20Amsterdam&rows=1'const res = await fetch("https://api.pdok.nl/bzk/locatieserver/search/v3_1/free?q=Dam%201%20Amsterdam&rows=1");
if (!res.ok) throw new Error(`Request failed: ${res.status}`);
const data = await res.json();
console.log(data);import requests
res = requests.get("https://api.pdok.nl/bzk/locatieserver/search/v3_1/free?q=Dam%201%20Amsterdam&rows=1", timeout=20)
res.raise_for_status()
print(res.json()){
"response": {
"numFound": 943446,
"start": 0,
"maxScore": 12.354595,
"numFoundExact": true,
"docs": [
{
"bron": "BAG/NWB",
"woonplaatscode": "3594",
"type": "weg",
"woonplaatsnaam": "Amsterdam",
"nwb_id": "031209",
"openbareruimtetype": "Weg",
"gemeentecode": "0363",
"rdf_seealso": "http://bag.basisregistraties.overheid.nl/bag/id/openbare-ruimte/0363300000003186",
"weergavenaam": "Dam, Amsterdam",
"straatnaam_verkort": "Dam",
"id": "weg-ab6df5babb15e466f3699b5d2c22e110",
"gemeentenaam": "Amsterdam",
"identificatie": "0363300000003186",
"openbareruimte_id": "0363300000003186",
"provinciecode": "PV27",
"provincienaam": "Noord-Holland",
"centroide_ll": "POINT(4.89304433 52.37297089)",
"provincieafkorting": "NH",
"centroide_rd": "POINT(121347.914 487347.519)",
"straatnaam": "Dam",
"score": 12.354595
}
]
}
}Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
q | query | Required | The search text: address, street, postcode, place or neighbourhood. Dam 1 Amsterdam |
rows | query | Optional | How many documents to return. Defaults to 10. 1 |
start | query | Optional | Offset for paging through `numFound` results. 10 |
fq | query | Optional | Solr filter query. `fq=type:adres` restricts results to addresses only. type:adres |
fl | query | Optional | Comma-separated field list, to trim the response to what you use. id,weergavenaam,centroide_ll |
(suggest) | path | Optional | `/suggest?q=` is the autocomplete sibling of `/free`, returning ranked short suggestions. |
(lookup) | path | Optional | `/lookup?id=` fetches one document by the id a suggest call returned. |
Response fields
response.numFoundinteger- Total matches across the whole index, not the number returned. It is routinely in the hundreds of thousands for a loose query.
response.docsarray- The matched documents, one object per result.
weergavenaamstring- Display name of the match, for example "Dam, Amsterdam". This is the string to show a user.
typestring- What was matched: `adres`, `weg`, `postcode`, `woonplaats`, `gemeente` and so on. Check it before treating a hit as an address.
centroide_llstring- WGS84 position as WKT, `POINT(lon lat)` — longitude first, and a string rather than a number pair.
centroide_rdstring- The same point in Rijksdriehoek metres, the projection Dutch professional systems use.
gemeentenaam / provincienaamstring- Municipality and province the match falls in.
idstring- Document identifier, which is what `/lookup` takes.
scorefloat- Lucene relevance. Comparable between results of the same query only.
What you can build with the PDOK Locatieserver API
- Geocode Dutch addresses to coordinates without a commercial provider
- Add address and place autocomplete to a Dutch web form
- Convert between WGS84 and Rijksdriehoek by reading both from one response
- Resolve a postcode plus house number to an official BAG identifier
- Enrich records with municipality and province for reporting
Common errors and how to fix them
Results are streets, not addresses
A loose query matches whatever ranks highest, which is often the street.
Fix: Add `fq=type:adres` to restrict to addresses, and inspect the `type` field before using a result as a building location.
Coordinates arrive as text
Not an error — `centroide_ll` is WKT, not a JSON array.
Fix: Parse the `POINT(x y)` string. Remember x is longitude and y is latitude, so a naive split gives you the pair in the opposite order to `lat, lon`.
numFound is enormous
It counts every document matching the analysed query, not the useful ones.
Fix: Ignore it as a quality signal. Use `rows` to bound the response and judge quality from `type` and `score` instead.
400 on a malformed fq
The filter query is passed through to Solr, which rejects bad syntax.
Fix: Use simple `field:value` filters. Escape colons and spaces inside values, or the parse fails.
PDOK Locatieserver API — frequently asked questions
Is PDOK Locatieserver free?
Yes, free with no key or account. It is Dutch open government geodata and reuse, including commercial reuse, is permitted.
What is the difference between the free, suggest and lookup endpoints?
`/free` is a general search returning full documents, `/suggest` is optimised for autocomplete and returns short ranked suggestions with ids, and `/lookup` retrieves the full document for one of those ids. The usual pattern is suggest while typing, then lookup on selection.
Why are the coordinates in a POINT() string?
Locatieserver stores geometry as WKT, so it hands it back that way. Both `centroide_ll` (WGS84) and `centroide_rd` (Rijksdriehoek) use the same format, and both list x before y — longitude before latitude in the WGS84 case.
Does it cover Belgium or German border towns?
No. Coverage is the Netherlands only, sourced from the BAG address register and the NWB road network. Cross-border searches return nothing.
Tools that pair with this API
Coordinate Converter
Convert GPS coordinates between decimal degrees, degrees-minutes-seconds and decimal minutes instantly. Paste any format like 40°26'46"N and copy the result.
JSON Formatter
Format, beautify and minify JSON online with 2-space, 4-space or tab indentation. Sort keys alphabetically and catch syntax errors instantly — free and private.
WKT to GeoJSON Converter
Convert WKT geometry to GeoJSON in your browser. Supports all seven geometry types, Z and M dimensions, EMPTY geometries and EWKT SRID prefixes.
PDOK Locatieserver 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.