BYTETOOLS

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.

No API key requiredCORS enabledHTTPSFree tier

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
curl 'https://api.pdok.nl/bzk/locatieserver/search/v3_1/free?q=Dam%201%20Amsterdam&rows=1'
JavaScript (fetch)
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);
Python (requests)
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 — HTTP 200
{
  "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

ParameterTypeRequiredDescription
qqueryRequiredThe search text: address, street, postcode, place or neighbourhood. Dam 1 Amsterdam
rowsqueryOptionalHow many documents to return. Defaults to 10. 1
startqueryOptionalOffset for paging through `numFound` results. 10
fqqueryOptionalSolr filter query. `fq=type:adres` restricts results to addresses only. type:adres
flqueryOptionalComma-separated field list, to trim the response to what you use. id,weergavenaam,centroide_ll
(suggest)pathOptional`/suggest?q=` is the autocomplete sibling of `/free`, returning ranked short suggestions.
(lookup)pathOptional`/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

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.