Alle endpoints op één pagina, plus de OpenAPI-beschrijving. Zoek je uitleg met voorbeelden per
taal, ga dan naar de documentatie.
# LocatieAPI, API-referentie
Bron: https://locatieapi.nl/api-reference
## Basis
- Live: `https://api.locatieapi.nl`
- Sandbox: `https://sandbox.locatieapi.nl`, gratis, vaste testset, telt niet mee voor de bundel
- Altijd werkende terugval op hetzelfde pad: `https://locatieapi.nl/api`
- Authenticatie: stuur de header `X-Api-Key: lat_test_demo_publiek_locatieapi_sandbox`. Er is geen andere methode, geen OAuth en geen sleutel in de querystring.
- Alle responses zijn JSON. Foutresponses van v3 hebben `Content-Type: application/problem+json`.
## Endpoints
### GET /v3/lookup/{postcode}/{number}
Eén adres op postcode en huisnummer. Response-compatibel met een bestaande postcode-API, zodat alleen de basis-URL wijzigt.
| Parameter | Type | Verplicht | Omschrijving |
|---|---|---|---|
| `postcode` | string | ja | P6 zonder spatie, hoofdletters of kleine letters. Patroon `^[0-9]{4}[a-zA-Z]{2}$`. |
| `number` | integer | ja | Huisnummer als geheel getal. Een toevoeging in het pad geeft `400`, geen `404`. |
Voorbeeldresponse:
```json
{
"postcode": "1021JT",
"number": 19,
"street": "Hamerstraat",
"city": "Amsterdam",
"municipality": "Amsterdam",
"province": "Noord-Holland",
"location": {
"type": "Point",
"coordinates": [4.92204151, 52.38488658]
}
}
```
### GET /v1/addresses
Alle treffers op een postcode en huisnummer, inclusief letters en toevoegingen.
| Parameter | Type | Verplicht | Omschrijving |
|---|---|---|---|
| `postcode` | string | ja | P6 zonder spatie. |
| `number` | integer | nee | Huisnummer. Zonder nummer krijg je de hele postcode terug. |
| `letter` | string | nee | Huisletter, één teken. |
| `addition` | string | nee | Huisnummertoevoeging. |
Voorbeeldresponse:
```json
{
"data": [
{
"id": "0363200012101386",
"postcode": "1021JT",
"number": 19,
"letter": null,
"addition": null,
"street": "Hamerstraat",
"city": "Amsterdam",
"municipality": "Amsterdam",
"province": "Noord-Holland",
"location": { "type": "Point", "coordinates": [4.92204151, 52.38488658] },
"purposes": ["woonfunctie"],
"surface": 98,
"constructionYear": 1930,
"type": "verblijfsobject"
}
],
"meta": { "count": 1 }
}
```
### GET /v1/postcodes/{postcode}
Samenvatting per P6: straat, plaats, gemeente, provincie, zwaartepunt en aantal adressen.
| Parameter | Type | Verplicht | Omschrijving |
|---|---|---|---|
| `postcode` | string | ja | P6 zonder spatie. |
Voorbeeldresponse:
```json
{
"data": {
"postcode": "1021JT",
"street": "Hamerstraat",
"city": "Amsterdam",
"municipality": "Amsterdam",
"province": "Noord-Holland",
"location": { "type": "Point", "coordinates": [4.92204151, 52.38488658] },
"addressCount": 64,
"numberRange": { "min": 1, "max": 121 },
"isPoBox": false
}
}
```
### GET /v1/autocomplete
Type-ahead op adres, straat of plaats. Bedoeld voor een checkout of zoekveld.
| Parameter | Type | Verplicht | Omschrijving |
|---|---|---|---|
| `q` | string | ja | Zoekterm, minimaal twee tekens. |
| `type` | string | nee | `all`, `address`, `street` of `city`. Standaard `all`. |
| `limit` | integer | nee | Aantal suggesties. Wordt afgekapt op het maximum van de API. |
Voorbeeldresponse:
```json
{
"data": [
{
"type": "address",
"label": "1021 JT 19, Hamerstraat, Amsterdam",
"value": "1021 JT 19",
"postcode": "1021JT",
"street": "Hamerstraat",
"city": "Amsterdam",
"id": "0363200012101386"
}
],
"meta": { "count": 1, "query": "hamerstr", "type": "all", "limit": 10 }
}
```
### POST /v1/bulk/lookup
Meerdere combinaties in één verzoek. Elke regel telt als één call.
| Parameter | Type | Verplicht | Omschrijving |
|---|---|---|---|
| `addresses` | array | ja | Lijst van objecten met `postcode` en `number`, eventueel `letter` en `addition`. |
Voorbeeldresponse:
```json
{
"data": [
{
"index": 0,
"postcode": "1021JT",
"number": 19,
"found": true,
"error": null,
"address": {
"id": "0363200012101386",
"postcode": "1021JT",
"number": 19,
"street": "Hamerstraat",
"city": "Amsterdam",
"municipality": "Amsterdam",
"province": "Noord-Holland",
"location": { "type": "Point", "coordinates": [4.92204151, 52.38488658] }
}
},
{
"index": 1,
"postcode": "6545CA",
"number": 299,
"found": false,
"error": "not_found",
"address": null
}
],
"meta": { "requested": 2, "found": 1, "billableCalls": 2 }
}
```
### POST /v1/validate
Controleert een ingevoerd adres en geeft een correctievoorstel terug.
| Parameter | Type | Verplicht | Omschrijving |
|---|---|---|---|
| `postcode` | string | ja | Postcode zoals ingevoerd, met of zonder spatie. |
| `number` | integer | ja | Huisnummer als geheel getal. |
| `letter` | string | nee | Huisletter zoals ingevoerd. |
| `addition` | string | nee | Toevoeging zoals ingevoerd. |
| `street` | string | nee | Straatnaam zoals ingevoerd, voor de vergelijking. |
| `city` | string | nee | Plaats zoals ingevoerd, voor de vergelijking. |
Voorbeeldresponse:
```json
{
"data": {
"valid": false,
"reason": "field_mismatch",
"address": {
"id": "0363200012101386",
"postcode": "1021JT",
"number": 19,
"street": "Hamerstraat",
"city": "Amsterdam",
"municipality": "Amsterdam",
"province": "Noord-Holland",
"location": { "type": "Point", "coordinates": [4.92204151, 52.38488658] }
},
"corrections": { "city": "Amsterdam" },
"suggestion": {
"postcode": "1021JT",
"number": 19,
"street": "Hamerstraat",
"city": "Amsterdam"
}
}
}
```
### GET /v1/reverse
De dichtstbijzijnde adressen bij een coördinaat, met afstand in meters.
| Parameter | Type | Verplicht | Omschrijving |
|---|---|---|---|
| `lat` | number | ja | Breedtegraad in WGS84, tussen -90 en 90. |
| `lon` | number | ja | Lengtegraad in WGS84, tussen -180 en 180. |
| `radius` | integer | nee | Zoekstraal in meters. Wordt afgekapt op het maximum van de API. |
| `limit` | integer | nee | Aantal treffers. Standaard 10. |
Voorbeeldresponse:
```json
{
"data": [
{
"id": "0363200012101386",
"postcode": "1021JT",
"number": 19,
"street": "Hamerstraat",
"city": "Amsterdam",
"municipality": "Amsterdam",
"province": "Noord-Holland",
"location": { "type": "Point", "coordinates": [4.92204151, 52.38488658] },
"distance": 12
}
],
"meta": { "count": 1, "lat": 52.38488658, "lon": 4.92204151, "radius": 100, "unit": "meters" }
}
```
## Foutcodes
### v3, application/problem+json
| Status | Titel | Wanneer | Body |
|---|---|---|---|
| 400 | Request validation failed | De postcode voldoet niet aan het patroon, of het huisnummer is geen geheel getal. | `{"title":"Request validation failed","invalidParams":[{"name":"number","reason":"should be integer"}]}` |
| 401 | Invalid API key | De header X-Api-Key ontbreekt, is onbekend of is ingetrokken. | `{"title":"Invalid API key"}` |
| 404 | Resource not found | De combinatie bestaat niet. | `{"title":"Resource not found"}` |
| 429 | Rate limit exceeded | Je zit boven je calls per seconde of boven je maandbundel. | `{"title":"Rate limit exceeded"}` |
### v1, application/json
Vorm: `{"error":{"code":"...","message":"..."}}`. Controleer op `error.code`, niet op de melding.
| Code | Status | Waar | Voorbeeldmelding |
|---|---|---|---|
| `invalid_postcode` | 400 | /v1/addresses, /v1/postcodes, /v1/bulk/lookup | Geef een geldige postcode op, bijvoorbeeld 6545CA. |
| `invalid_number` | 400 | /v1/addresses, /v1/validate, /v1/bulk/lookup | Het huisnummer moet een geheel getal zijn. |
| `invalid_query` | 400 | /v1/autocomplete | Geef minimaal twee tekens op in q. |
| `invalid_type` | 400 | /v1/autocomplete | type moet een van deze waarden zijn: all, address, street, city. |
| `invalid_coordinates` | 400 | /v1/reverse | Geef lat en lon op als decimale graden. |
| `invalid_payload` | 400 | /v1/bulk/lookup | Stuur een lijst addresses met paren van postcode en number. |
| `invalid_api_key` | 401 | alle endpoints | Invalid API key |
| `plan_upgrade_required` | 403 | /v1/bulk/lookup en andere endpoints buiten je plan | Bulk zit niet in dit plan. |
| `not_found` | 404 | /v1/postcodes, onbekende paden, en per regel in /v1/bulk/lookup | Deze postcode is niet bekend. |
| `too_many_items` | 422 | /v1/bulk/lookup | Een bulkverzoek bevat maximaal 250 regels, dit verzoek heeft er 400. |
| `rate_limit_exceeded` | 429 | alle endpoints | Je gaat over je calls per seconde. |
| `quota_exceeded` | 429 | alle endpoints | Je maandbundel is op. |
## Responseheaders op elke call
- `X-RateLimit-Limit`: Het aantal calls per seconde dat bij je plan hoort.
- `X-RateLimit-Remaining`: Wat er in het huidige venster van dat aantal over is.
- `X-RateLimit-Reset`: Aantal seconden tot het venster opnieuw begint.
- `X-Quota-Limit`: De maandbundel van je plan in aantal calls.
- `X-Quota-Remaining`: Wat er van die bundel over is in de lopende factuurperiode.
- `X-Quota-Reset`: Unix-tijdstip waarop de volgende factuurperiode begint.
- `X-Request-Id`: Uniek nummer per verzoek. Noem dit bij een supportvraag.
- `Cache-Control`: Bij een 200: `public, max-age=86400`. Adressen veranderen zelden.
## Valkuilen
- **Postcode zonder spatie** De API accepteert `1021JT`, niet `1021 JT`. Haal de spatie er in je eigen code uit voordat je de URL bouwt.
- **Huisnummer als geheel getal** In `/v3/lookup` hoort alleen het cijferdeel. `29a` geeft een `400` en geen `404`.
- **Toevoegingen horen bij /v1/addresses** Wil je huisletters en toevoegingen, gebruik dan `/v1/addresses` met `letter` en `addition`.
- **location is [longitude, latitude]** GeoJSON zet de lengtegraad eerst. Dat is de omgekeerde volgorde van wat de meeste kaartbibliotheken als "lat, lng" tonen.
- **location kan null zijn** Bij een postbus is er geen coördinaat en is `street` letterlijk `Postbus`.
- **v1 zit in een envelope** De v1-endpoints geven `{"data": ...}` terug, met daarnaast een `meta`-object. v3 geeft het adres kaal terug, zonder envelope.
- **Twee foutvormen** v3 geeft `application/problem+json` met een veld `title`. v1 geeft gewone JSON met `{"error":{"code","message"}}`; controleer daar op `error.code`, niet op de melding.
## Sandbox
De sandbox draait op `https://sandbox.locatieapi.nl` en kent precies deze gevallen:
| Postcode | Huisnummer | Status | Resultaat |
|---|---|---|---|
| 6545CA | 29 | 200 | Waldeck Pyrmontsingel, Nijmegen, Gelderland |
| 1021JT | 19 | 200 | Hamerstraat, Amsterdam, Noord-Holland |
| 5038EA | 17 | 200 | Stationsstraat, Tilburg, Noord-Brabant |
| 3030AC | 100 | 200 | Postbus, Leusden, Utrecht. location is null |
| 6545CA | 29a | 400 | number should be integer |
| 6545C | 29 | 400 | postcode voldoet niet aan het patroon |
| 6545CA | 299 | 404 | Resource not found |
Genereer er een client mee, importeer hem in Postman of Insomnia, of laat je editor er
typedefinities uit maken. Het bestand staat op
https://locatieapi.nl/docs/openapi.yaml.
{"title":"Request validation failed","invalidParams":[{"name":"number","reason":"should be integer"}]}
401
Invalid API key
{"title":"Invalid API key"}
404
Resource not found
{"title":"Resource not found"}
429
Rate limit exceeded
{"title":"Rate limit exceeded"}
Responseheaders
Header
Betekenis
X-RateLimit-Limit
Het aantal calls per seconde dat bij je plan hoort.
X-RateLimit-Remaining
Wat er in het huidige venster van dat aantal over is.
X-RateLimit-Reset
Aantal seconden tot het venster opnieuw begint.
X-Quota-Limit
De maandbundel van je plan in aantal calls.
X-Quota-Remaining
Wat er van die bundel over is in de lopende factuurperiode.
X-Quota-Reset
Unix-tijdstip waarop de volgende factuurperiode begint.
X-Request-Id
Uniek nummer per verzoek. Noem dit bij een supportvraag.
Cache-Control
Bij een 200: public, max-age=86400. Adressen veranderen zelden.
Voor Google Analytics en het meten van onze advertenties vragen we je toestemming.
Zeg je nee, dan laden we die scripts niet en zetten we geen cookie.
Bezoekersaantallen tellen we los daarvan, zonder cookies en zonder je te volgen.
Wat we meten