Endpoint overzicht voor SEO en integratie
Kies de endpoint op basis van je use-case. Voor adresvalidatie gebruik je meestal lookupzip,
voor autocomplete de suggestie-endpoints, voor GPS-locaties getaddressbylatlong en voor gebieden polygonsearch.
Snel Starten
De basis-URL van de API is:
https://api.postcodeconnect.nl
Een standaardrequest bestaat uit een endpoint, parameters en je API-key in een header.
curl "https://api.postcodeconnect.nl/lookupzip?postcode=2283GM&housenumber=2" \
-H "Accept: application/json" \
-H "Authorization: Bearer JOUW_API_KEY"
Gebruik altijd HTTPS. Responses zijn JSON met meestal een veld ok, plus items of item.
Authenticatie
Elke API-aanroep moet een API-key meesturen via de HTTP-header Authorization met het Bearer schema. Een API-key via de URL, zoals ?key=... of ?api_key=..., wordt niet gebruikt en kan op de server worden geblokkeerd. Zet je key dus nooit in het adres.
Authorization: Bearer JOUW_API_KEY
Bewaar API-keys alleen server-side. Zet ze niet rechtstreeks in browser-JavaScript, mobiele apps of openbare repositories.
Algemene Werking
HTTP-methodes
De meeste endpoints zijn GET. Alleen polygonsearch is bedoeld voor POST met een JSON body.
Postcodeformaat
Postcodes mogen met of zonder spatie worden gestuurd. De API normaliseert bijvoorbeeld 2283 GM en 2283GM.
Paginatie
Endpoints die meerdere resultaten teruggeven tonen maximaal 250 resultaten per request. Een request telt altijd als 1 call, ook als er geen resultaat wordt gevonden of als er meerdere resultaten in de response staan.
Als er meer resultaten beschikbaar zijn, laat de API dat zien met velden zoals total, has_more, next_offset of last. Je haalt extra resultaten op door een nieuwe request te doen met de volgende offset of cursor. Die vervolgrequest telt opnieuw als 1 call.
GET /lookupcity?city=Rijswijk&limit=250&offset=0
{
"ok": true,
"total": 6421,
"items": [ ... ],
"limit": 250,
"offset": 0,
"has_more": true,
"next_offset": 250
}
De volgende pagina vraag je daarna zo op:
GET /lookupcity?city=Rijswijk&limit=250&offset=250
Cacheheaders
Sommige endpoints sturen X-Cache: HIT of X-Cache: MISS. Dit is informatief: HIT betekent dat de response uit de servercache kwam.
Endpoint: lookupzip
Zoek adressen op basis van postcode. Met huisnummer krijg je een adres terug. Als er meerdere varianten bestaan voor hetzelfde huisnummer, bijvoorbeeld huisletter of toevoeging, bevat de response naast item ook items.
Zonder huisnummer krijg je een lijst met adressen binnen de postcode.
Bij 2 t/m 4 cijfers geeft de endpoint postcodegebied-suggesties terug voor autocomplete.
Bij 4 cijfers plus 1 letter, zoals 2283N, geeft de endpoint volledige postcode-suggesties terug.
GET /lookupzip?postcode={postcode}&housenumber={huisnummer}
Parameters
postcodeverplicht. Gebruik2283GM, 2 t/m 4 cijfers zoals22of2283voor postcodegebied-suggesties, of 4 cijfers plus 1 letter zoals2283Nvoor volledige postcode-suggesties. Alias:pc,zip.housenumberoptioneel. Alias:hn,number,nr. Mag ook compact worden gebruikt, zoals1Aof1A 2, wanneer je eigen backend dit zo doorstuurt.houseletteroptioneel.additionoptioneel. Gebruik dit voor de exacte toevoeging, bijvoorbeeld2in1A 2.includeWijkenoptioneel. Gebruik0offalseom wijk/buurtinformatie uit te zetten.limitbij lijsten en varianten. Maximaal250resultaten per request.offsetalleen bij postcode-zonder-huisnummer.
Adres of adresvarianten
curl "https://api.postcodeconnect.nl/lookupzip?postcode=2283GM&housenumber=2" \
-H "Authorization: Bearer JOUW_API_KEY"
Bij een unieke combinatie bevat de response vooral item. Als de combinatie meerdere adressen kan betekenen, bijvoorbeeld postcode=2517AA&housenumber=1&houseletter=A, dan bevat de response ook items, variant_count en has_variants. item blijft aanwezig als eerste/beste match voor backwards compatibility.
{
"ok": true,
"total": 1,
"item": {
"straatnaam": "Voorbeeldstraat",
"huisnummer": 2,
"huisletter": "",
"toevoeging": "",
"postcode": "2283GM",
"woonplaats": "Rijswijk",
"provincie": "Zuid-Holland",
"gemeente": "Rijswijk",
"buurt": "Voorbeeldbuurt",
"wijk": "Voorbeeldwijk",
"latitude": 52.000000,
"longitude": 4.000000
},
"query_ms": 4
}
Huisletter en toevoeging
GET /lookupzip?postcode=2517AA&housenumber=1&houseletter=A
{
"ok": true,
"total": 8,
"item": {
"straatnaam": "Laan van Meerdervoort",
"huisnummer": 1,
"huisletter": "A",
"toevoeging": "",
"postcode": "2517AA",
"woonplaats": "'s-Gravenhage"
},
"items": [
{ "huisnummer": 1, "huisletter": "A", "toevoeging": "" },
{ "huisnummer": 1, "huisletter": "A", "toevoeging": "1" },
{ "huisnummer": 1, "huisletter": "A", "toevoeging": "2" }
],
"variant_count": 8,
"has_variants": true
}
Wil je exact een toevoeging selecteren, geef dan ook addition mee:
GET /lookupzip?postcode=2517AA&housenumber=1&houseletter=A&addition=2
Alle adressen binnen een postcode
GET /lookupzip?postcode=2283GM&limit=25&offset=0
De response bevat dan items, total, has_more en next_offset.
Als has_more true is, gebruik je next_offset in een volgende request om de volgende pagina op te halen. Elke pagina is een nieuwe request en kost dus 1 call.
Postcodegebied autocomplete
GET /lookupzip?postcode=22&limit=10&autocomplete=1
{
"ok": true,
"type": "postcode_prefix",
"query": "22",
"items": [
{ "postcode": "2201", "woonplaats": "Noordwijk", "address_count": 7597 },
{ "postcode": "2202", "woonplaats": "Noordwijk", "address_count": 5668 }
]
}
Viercijferige postcode autocomplete
GET /lookupzip?postcode=7742&limit=6&autocomplete=1
{
"ok": true,
"type": "postcode_prefix",
"query": "7742",
"items": [
{ "postcode": "7742", "woonplaats": "Coevorden", "address_count": 3088 },
{ "postcode": "7742AB", "woonplaats": "Coevorden", "address_count": 9 },
{ "postcode": "7742AC", "woonplaats": "Coevorden", "address_count": 28 }
]
}
Volledige postcode autocomplete
GET /lookupzip?postcode=2283N&limit=10&autocomplete=1
{
"ok": true,
"type": "postcode_letter_prefix",
"query": "2283N",
"items": [
{ "postcode": "2283NA", "woonplaats": "Rijswijk", "address_count": 1 },
{ "postcode": "2283GM", "woonplaats": "Rijswijk", "address_count": 7 }
]
}
Huisnummer autocomplete binnen postcode
GET /lookupzip?postcode=2283GM&housenumber=2&limit=10&autocomplete=1
{
"ok": true,
"type": "postcode_housenumber_prefix",
"query": "2283GM",
"housenumber_prefix": "3",
"items": [
{ "straatnaam": "Generaal Spoorlaan", "huisnummer": 2, "postcode": "2283GM", "woonplaats": "Rijswijk" }
]
}
Endpoint: getaddressbylatlong
Zoek het dichtstbijzijnde adres bij een latitude/longitude-coordinaat.
GET /getaddressbylatlong?lat={latitude}&long={longitude}
Parameters
latverplicht. Latitude tussen-90en90.longverplicht. Aliassen:lon,lng. Longitude tussen-180en180.
curl "https://api.postcodeconnect.nl/getaddressbylatlong?lat=52.0481&long=4.3300" \
-H "Authorization: Bearer JOUW_API_KEY"
{
"ok": true,
"total": 1,
"item": {
"straatnaam": "Voorbeeldstraat",
"huisnummer": 2,
"postcode": "2283GM",
"woonplaats": "Rijswijk",
"provincie": "Zuid-Holland",
"distance_m": 12.34
}
}
Autocomplete Endpoints
getstreetsautocomplete
Zoek straatnamen en woonplaatsen op basis van een beginnende zoekterm. Bij meerdere woorden wordt het laatste woord ook als plaatsnaam gebruikt.
GET /getstreetsautocomplete?q={zoekterm}&limit={n}
qverplicht, minimaal 2 tekens.limitoptioneel, standaard50, maximaal250.
{
"ok": true,
"items": [
{ "straatnaam": "Generaal Spoorlaan", "woonplaats": "Rijswijk" }
]
}
gethousenumbers
Haal huisnummers op voor een straat en woonplaats. Handig na straat-autocomplete.
Gebruik voor een adres-autocomplete flow meestal deze volgorde:
getstreetsautocomplete voor straat + plaats,
daarna gethousenumbers met last-paginatie,
en tot slot getaddressbystreetnumber voor het gekozen huisnummer.
GET /gethousenumbers?straat={straatnaam}&plaats={woonplaats}&nr={prefix}&last={laatste}&limit={n}
straatverplicht.plaatsverplicht.nroptioneel, start/prefix voor huisnummer.lastoptioneel, voor vervolgpaginatie op huisnummer.limitoptioneel, standaard50, maximaal250.
{
"ok": true,
"items": ["1", "1A", "1A 1", "1A 2", "1B", "2", "2A", "4"],
"last": 4,
"has_more": false
}
Bij has_more: true gebruik je de waarde uit last als nieuwe last-parameter om de volgende reeks huisnummers op te halen. Die vervolgrequest telt als 1 extra call.
De response is natuurlijk gesorteerd op huisnummer, huisletter en toevoeging. Daardoor staan varianten zoals 1A 1, 1A 2 en 1A 3 direct onder 1A.
Let op: items zijn tekstwaarden. Sorteer ze in je frontend op huisnummer, huisletter en toevoeging wanneer je een nette autocomplete wilt tonen. Dan staat 1A 1 direct onder 1A in plaats van pas na 1Y.
getaddressbystreetnumber
Zoek een adres op met straatnaam, woonplaats en huisnummertekst. Net als bij lookupzip kan de response meerdere varianten bevatten wanneer de invoer nog niet volledig exact is.
GET /getaddressbystreetnumber?straat={straatnaam}&plaats={woonplaats}&nr={nummer}
nr mag bijvoorbeeld 12, 12A, 12A 2 of 12 bis zijn. Bij nr=12A krijg je ook toevoegingen onder 12A terug in items. Bij nr=12A 2 zoekt de API exact op toevoeging 2.
{
"ok": true,
"total": 3,
"item": { "huisnummer": 12, "huisletter": "A", "toevoeging": "" },
"items": [
{ "huisnummer": 12, "huisletter": "A", "toevoeging": "" },
{ "huisnummer": 12, "huisletter": "A", "toevoeging": "1" },
{ "huisnummer": 12, "huisletter": "A", "toevoeging": "2" }
],
"variant_count": 3,
"has_variants": true
}
Endpoint: getpostcodepolygon
Maakt een benaderde polygon op basis van adrespunten binnen een volledige postcode of viercijferig postcodegebied.
GET /getpostcodepolygon?postcode={postcode}&format=geojson
Alias: /postcodepolygon.
Parameters
postcodeverplicht. Gebruik2283GMof vier cijfers zoals2283.formatoptioneel:geojson,wktofboth. Standaardgeojson.bufferMetersoptioneel, minimaal5, maximaal100. Standaard8.clusterMetersoptioneel, minimaal1, maximaal250. Standaard50.includeAddressesoptioneel. Gebruik1oftrueom adrespunten mee terug te geven.
curl "https://api.postcodeconnect.nl/getpostcodepolygon?postcode=2283GM&format=both" \
-H "Authorization: Bearer JOUW_API_KEY"
De response bevat onder andere feature_collection, geometry_wkt, bounds, center en address_count, afhankelijk van format.
Endpoint: getdistance
Berekent de hemelsbrede afstand tussen twee adressen.
Dit endpoint is beschikbaar in de betaalde pakketten en zit niet in het gratis Starter pakket.
GET /getdistance?postcode_from=...&housenumber_from=...&postcode_to=...&housenumber_to=...
Alias: /distancebetweenaddresses.
Parameters
- Van-adres:
postcode_from,housenumber_from, optioneelhouseletter_from,addition_from. - Naar-adres:
postcode_to,housenumber_to, optioneelhouseletter_to,addition_to. - Aliassen zijn beschikbaar, zoals
pc1,hn1,pc2,hn2.
{
"ok": true,
"from": { "postcode": "2283GM", "huisnummer": 2 },
"to": { "postcode": "2511BT", "huisnummer": 1 },
"distance": {
"meters": 5123.45,
"kilometers": 5.123,
"type": "straight_line"
}
}
Plaats Endpoints
lookupcity
Geeft adressen terug binnen een woonplaats, eventueel gefilterd op buurt.
GET /lookupcity?city={woonplaats}&buurt={buurt}&limit=250&offset=0
Alias: /lookupwoonplaats.
cityverplicht. Alias:woonplaats.buurtoptioneel. Alias:neighborhood.limitoptioneel, maximaal250.offsetoptioneel.
Gebruik has_more en next_offset om extra pagina's op te halen. Elke pagina kost 1 call.
getcities
Geeft woonplaatsen terug, optioneel gefilterd op begin van de naam.
GET /getcities?q={zoekterm}&limit=250&offset=0
Alias: /getwoonplaatsen.
qoptioneel.limitoptioneel, maximaal250.offsetoptioneel.
Gebruik has_more en next_offset voor de volgende pagina.
Endpoint: lookupareas
Geeft buurten/wijken binnen een woonplaats terug, inclusief polygon in WKT.
GET /lookupareas?city={woonplaats}&buurt={buurt}&limit=250&offset=0
Alias: /lookupwijken.
cityverplicht. Alias:woonplaats.buurtoptioneel. Aliassen:neighborhood,bu_naam.limitoptioneel, maximaal250.offsetoptioneel.
Bij meerdere buurten/wijken geeft de response total, has_more en next_offset terug. Gebruik next_offset voor de volgende pagina.
{
"ok": true,
"total": 2,
"items": [
{
"id": 123,
"city": "Rijswijk",
"buurt": "Voorbeeldbuurt",
"wijk": "Voorbeeldwijk",
"geometry_wkt": "POLYGON((...))"
}
]
}
Endpoint: polygonsearch
Zoekt adressen binnen een GeoJSON Polygon. Dit endpoint gebruikt POST met JSON.
POST /polygonsearch
Content-Type: application/json
Authorization: Bearer JOUW_API_KEY
Belangrijke limieten
- Alleen
Polygonwordt ondersteund. - Maximaal
5000polygonpunten. - Maximale oppervlakte:
40 km². Lengte en breedte maken niet uit zolang de totale oppervlakte binnen deze limiet blijft. - Maximaal
250resultaten per call.
Body parameters
polygonverplicht. GeoJSON Geometry of Feature mettype: "Polygon".limitoptioneel, maximaal250.offsetoptioneel.after_idoptioneel voor vervolgpagina's zonder sortering.countOnlyoptioneel. Geeft alleen aantal terug.approxoptioneel. Snellere bounding-box modus.onlyPostcodesoptioneel. Geeft alleen postcodes terug.distinctoptioneel. Probeert dubbele rijen te voorkomen.sortoptioneel. Sorteert op postcode/straat/huisnummer.fieldsoptioneel. Geldige velden:postcode,straatnaam,huisnummer,huisletter,toevoeging,woonplaats,provincie,statnaam,gemeenteCode,buurt,wijk,latitude,longitude.
{
"polygon": {
"type": "Polygon",
"coordinates": [[
[4.3300, 52.0400],
[4.3500, 52.0400],
[4.3500, 52.0550],
[4.3300, 52.0550],
[4.3300, 52.0400]
]]
},
"limit": 100,
"fields": ["postcode", "straatnaam", "huisnummer", "woonplaats", "provincie", "latitude", "longitude"]
}
{
"ok": true,
"mode": "results",
"items": [],
"fields": ["postcode", "straatnaam", "huisnummer", "woonplaats", "provincie"],
"limit": 100,
"has_more": false,
"next_offset": null
}
Bij has_more: true kun je verder bladeren met next_offset. Zonder sortering kan ook next_after_id beschikbaar zijn; stuur die waarde dan als after_id mee voor de volgende pagina. Elke vervolgpagina kost 1 call.
Foutcodes
Bij fouten geeft de API JSON terug met ok: false en een error-code.
api_key_required- API-key ontbreekt in deAuthorization: Bearerheader.invalid_api_key- API-key is onbekend of niet actief.insufficient_scope- API-key heeft geen toegang tot dit endpoint.rate_or_quota_exceeded- RPS of maandquota overschreden.invalid_postcode- Postcodeformaat klopt niet.invalid_housenumber- Huisnummer ontbreekt of is ongeldig.invalid_coordinates- Latitude/longitude ontbreken of liggen buiten bereik.not_foundofaddress_not_found- Geen resultaat gevonden.missing_city- Woonplaats ontbreekt.missing_polygon- Polygon ontbreekt.polygon_too_large- Polygon is groter dan 40 km².only_polygon_supported- Alleen GeoJSON Polygon wordt ondersteund.
Codevoorbeelden
PHP cURL
<?php
$url = 'https://api.postcodeconnect.nl/lookupzip?postcode=2283GM&housenumber=2';
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Accept: application/json',
'Authorization: Bearer JOUW_API_KEY',
],
]);
$response = curl_exec($ch);
if ($response === false) {
throw new RuntimeException(curl_error($ch));
}
$data = json_decode($response, true);
var_dump($data);
JavaScript via je eigen backend
Gebruik de API-key niet rechtstreeks in frontend JavaScript. Maak een eigen server-endpoint dat de request doorstuurt.
async function lookupAddress(postcode, housenumber) {
const res = await fetch('/jouw-backend/lookup-address', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ postcode, housenumber })
});
if (!res.ok) {
throw new Error('Adres kon niet worden opgehaald');
}
const data = await res.json();
if (data.has_variants) {
// Toon data.items in je UI en laat de gebruiker de juiste toevoeging kiezen.
return data.items;
}
return data.item;
}
Code Generator
Kies een endpoint en taal. Vul de parameters in en kopieer direct een werkend voorbeeld. De API-key wordt altijd als Authorization: Bearer header gebruikt.