PostcodeConnect demo

Test hieronder alle belangrijke endpoints direct via de browser. Deze demo laat niet alleen de JSON-response zien, maar ook hoe de API in echte toepassingen gebruikt kan worden: slimme zoekvelden, kaartweergave, bulk-opvragingen en codevoorbeelden.

Adres & geo Van postcode lookup tot reverse geocoding en polygonen.
Direct testen Test de mogelijkheden van onze API.
Developer-first Met snippets, request builder en response-inspectie.

Wat je hier kunt testen

Alle belangrijke flows van PostcodeConnect in één overzicht.

  • Postcode + huisnummer lookup
  • Interactieve straat autocomplete
  • Adres op coördinaten
  • Buurten en wijken met polygonen op kaart
  • Bulk en export
  • Codevoorbeelden voor developers

LET OP! De demo is beperkt tot maximaal 25 resultaten per call. Ook is er een limiet van 45 calls per minuut per IP adres.
Downloadbare demo's Elke demo is als losse zip beschikbaar met eigen HTML, CSS, JavaScript en api-proxy.php. Vul alleen je API-key in en plaats de map op je eigen server.
Alle demo's bekijken
Alle downloadbare pakketten

Slim zoeken

Eén invoerveld dat probeert te herkennen wat je intypt: postcode, adres of coördinaten.

intelligente invoer lookupzip autocomplete reverse geocoding
Response Nog niet uitgevoerd
Nog geen response.

Postcode lookup

Zoek een exact adres op basis van postcode + huisnummer, of vraag alle adressen binnen één postcode op.

action=lookupzip postcode lookup lijst of exact item
Response Nog niet uitgevoerd
Nog geen response.
Laat huisnummer leeg om alle adressen binnen de postcode op te vragen.

Interactief adres zoeken (Autocomplete)

Typ een straat en huisnummer zoals een eindgebruiker dat zou doen. De demo zoekt eerst straten, laadt daarna huisnummers en vult vervolgens postcode en plaats automatisch aan.

getstreetsautocomplete gethousenumbers getaddressbystreetnumber
Laatste response Begin met typen
Nog geen response.
Deze demo werkt direct tijdens het typen en gebruikt dezelfde flow als een formulier-autocomplete.

Huisnummers ophalen

Vraag beschikbare huisnummers op voor een specifieke straat en plaats.

action=gethousenumbers straat + plaats huisnummerlijst
Response Nog niet uitgevoerd
Nog geen response.

Adres via straat + huisnummer

Zoek een exact adres op via straatnaam, woonplaats en huisnummernotatie.

action=getaddressbystreetnumber exact adres straat + plaats + nr
Response Nog niet uitgevoerd
Nog geen response.

Adres via coördinaten

Reverse geocoding: geef latitude en longitude mee en ontvang het dichtstbijzijnde adres.

action=getaddressbylatlong reverse geocoding lat / long kaartklik
Klik op de kaart om direct een reverse lookup uit te voeren.
Response Nog niet uitgevoerd
Nog geen response.

Adreslijst per woonplaats

Haal adressen op uit een woonplaats en filter optioneel op buurt. Je ontvangt alle adressen van de opgegeven woonplaats.

action=lookupcity woonplaats optioneel buurtfilter
Response Nog niet uitgevoerd
Nog geen response.

Woonplaatsenlijst

Zoek beschikbare woonplaatsen op met optionele zoekterm en paginatie.

action=getcities woonplaatsen zoekterm + paginatie
Response Nog niet uitgevoerd
Nog geen response.

Gebieden / buurten opvragen

Vraag buurten en wijken op binnen een woonplaats, inclusief polygonen op kaart.

action=lookupareas wijk + buurt polygon / WKT kaart
Polygonen uit geometry_wkt worden direct op de kaart gezet.
Response Nog niet uitgevoerd
Nog geen response.

Postcodegebied op kaart

Maak een benaderde polygon van alle adrespunten binnen een volledige postcode of viercijferig postcodegebied en projecteer die direct op de kaart.

action=getpostcodepolygon postcodegebied GeoJSON kaart
De polygon is een benadering op basis van adrespunten binnen de postcode.
Response Nog niet uitgevoerd
Nog geen response.

Polygon search

Teken een polygon of rechthoek van maximaal 40 km² op de kaart en zoek adressen binnen het geselecteerde gebied. De lengte en breedte maken niet uit zolang de totale oppervlakte binnen de limiet blijft.

action=polygonsearch kaart tekenen count only csv export
Gebruik linksboven de polygon- of rechthoek-tool om een gebied te tekenen. Het gebied mag maximaal 40 km² groot zijn.
Teken eerst een polygon of rechthoek van maximaal 40 km². In deze demo zijn de response en CSV-export beperkt tot maximaal 250 regels.
Response Nog niet uitgevoerd
Nog geen response.

Afstand API

Bereken de hemelsbrede afstand tussen twee Nederlandse adressen.

action=getdistance postcode + huisnummer huisletter / toevoeging

Van adres

Naar adres

Vul twee adressen in en bereken de afstand.
Response Nog niet uitgevoerd
Nog geen response.

Request builder

Stel handmatig een request samen en voer deze direct uit via de proxy.

developer tool request builder snippets
Response Nog niet uitgevoerd
Nog geen response.

Bulk & CSV export

Laat zien hoe bulk-opvraging en eenvoudige export eruitzien voor zakelijke use-cases.

lookupcity bulk csv export
Nog geen bulk-opvraging uitgevoerd.
Voorbeeldresponse Nog niet uitgevoerd
Nog geen response.

API proxy op eigen server

Roep de API aan via je eigen api-proxy.php op je eigen server. Zo blijft de API-key buiten de browser en kan je zelf extra beveiliging toevoegen, zoals rate limiting, IP-restricties, origin-checks of logging.

api-proxy.php key verborgen eigen beveiliging copy/paste
Deze proxy stuurt de action en queryparameters door naar https://api.postcodeconnect.nl, voegt de Authorization: Bearer header server-side toe en retourneert daarna de upstream response. Je kan dit bestand op je eigen hosting plaatsen en naar wens uitbreiden of vergrendelen.
Aanbevolen uitbreidingen: rate limiting, allowlist op IP of domein, logging, caching en extra validatie per endpoint.
Voorbeeldbestand: api-proxy.php Plaats deze file op je eigen server
<?php
declare(strict_types=1);

/*
|--------------------------------------------------------------------------
| PostcodeConnect API proxy voor klanten
|--------------------------------------------------------------------------
| Plaats dit bestand op je eigen website, bijvoorbeeld als:
| https://jouwdomein.nl/api-proxy.php
|
| Vul hieronder alleen je eigen API-key en toegestane website(s) in.
| De API-key blijft zo veilig op de server en komt niet in JavaScript terecht.
*/

header('Content-Type: application/json; charset=utf-8');
header('Access-Control-Allow-Headers: Content-Type, X-Requested-With');
header('Access-Control-Allow-Methods: GET, POST, OPTIONS');
header('Cache-Control: no-store');

/*
|--------------------------------------------------------------------------
| Instellingen
|--------------------------------------------------------------------------
*/

$BASE_API = 'https://api.postcodeconnect.nl';
$API_KEY = 'VUL_HIER_JE_API_KEY_IN';

// Vul hier je eigen website(s) in. Laat leeg voor same-origin gebruik.
$ALLOWED_ORIGINS = [
    'https://www.jouwdomein.nl',
    'https://jouwdomein.nl',
];

// Zet gelijk aan de RPS van je pakket. Gebruik 0 om proxy-throttling uit te schakelen.
$PROXY_REQUESTS_PER_SECOND = 10;

/*
|--------------------------------------------------------------------------
| Helpers
|--------------------------------------------------------------------------
*/

function proxy_error(int $status, string $error, array $extra = []): void
{
    http_response_code($status);
    echo json_encode(array_merge(['ok' => false, 'error' => $error], $extra), JSON_UNESCAPED_UNICODE);
    exit;
}

function proxy_throttle_rps(float $maxRequestsPerSecond, string $bucketKey): void
{
    if ($maxRequestsPerSecond <= 0) {
        return;
    }

    $minInterval = 1 / $maxRequestsPerSecond;
    $lockFile = rtrim(sys_get_temp_dir(), DIRECTORY_SEPARATOR)
        . DIRECTORY_SEPARATOR
        . 'postcodeconnect_proxy_rps_' . sha1($bucketKey) . '.lock';

    $fp = fopen($lockFile, 'c+');
    if (!$fp) {
        return;
    }

    try {
        if (!flock($fp, LOCK_EX)) {
            return;
        }

        rewind($fp);
        $raw = trim((string)stream_get_contents($fp));
        $nextAllowedAt = is_numeric($raw) ? (float)$raw : 0.0;
        $now = microtime(true);

        if ($nextAllowedAt > $now) {
            usleep((int)(($nextAllowedAt - $now) * 1000000));
            $now = microtime(true);
        }

        $nextAllowedAt = max($nextAllowedAt, $now) + $minInterval;

        ftruncate($fp, 0);
        rewind($fp);
        fwrite($fp, sprintf('%.6F', $nextAllowedAt));
        fflush($fp);
        flock($fp, LOCK_UN);
    } finally {
        fclose($fp);
    }
}

/*
|--------------------------------------------------------------------------
| CORS en basisvalidatie
|--------------------------------------------------------------------------
*/

if (isset($_SERVER['HTTP_ORIGIN']) && $ALLOWED_ORIGINS !== []) {
    if (!in_array($_SERVER['HTTP_ORIGIN'], $ALLOWED_ORIGINS, true)) {
        proxy_error(403, 'forbidden_origin');
    }

    header('Access-Control-Allow-Origin: ' . $_SERVER['HTTP_ORIGIN']);
    header('Vary: Origin');
}

if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
    http_response_code(204);
    exit;
}

if ($_SERVER['REQUEST_METHOD'] !== 'GET' && $_SERVER['REQUEST_METHOD'] !== 'POST') {
    proxy_error(405, 'method_not_allowed');
}

if ($API_KEY === '' || $API_KEY === 'VUL_HIER_JE_API_KEY_IN') {
    proxy_error(500, 'missing_api_key');
}

$action = trim((string)($_GET['action'] ?? ''));
if ($action === '') {
    proxy_error(400, 'missing_action');
}

if (!preg_match('/^[a-z0-9_]+$/i', $action)) {
    proxy_error(400, 'invalid_action');
}

/*
|--------------------------------------------------------------------------
| Request doorsturen naar PostcodeConnect
|--------------------------------------------------------------------------
*/

$params = $_GET;
unset($params['action']);

$queryString = http_build_query($params);

if ($action === 'polygonsearch') {
    $upstreamUrl = rtrim($BASE_API, '/') . '/?action=polygonsearch';
    if ($queryString !== '') {
        $upstreamUrl .= '&' . $queryString;
    }
} else {
    $upstreamUrl = rtrim($BASE_API, '/') . '/' . rawurlencode($action);
    if ($queryString !== '') {
        $upstreamUrl .= '?' . $queryString;
    }
}

$headers = [
    'Accept: application/json',
    'Authorization: Bearer ' . $API_KEY,
    'X-Forwarded-For: ' . ($_SERVER['REMOTE_ADDR'] ?? '0.0.0.0'),
];

$curlOptions = [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => $headers,
    CURLOPT_TIMEOUT => 20,
    CURLOPT_CONNECTTIMEOUT => 5,
    CURLOPT_SSL_VERIFYPEER => true,
    CURLOPT_SSL_VERIFYHOST => 2,
    CURLOPT_FOLLOWLOCATION => false,
];

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    if ($action !== 'polygonsearch') {
        proxy_error(405, 'post_not_allowed_for_action');
    }

    $body = file_get_contents('php://input');
    if ($body === false || trim($body) === '') {
        proxy_error(400, 'missing_body');
    }

    $headers[] = 'Content-Type: ' . ($_SERVER['CONTENT_TYPE'] ?? 'application/json');
    $headers[] = 'Content-Length: ' . strlen($body);

    $curlOptions[CURLOPT_HTTPHEADER] = $headers;
    $curlOptions[CURLOPT_POST] = true;
    $curlOptions[CURLOPT_CUSTOMREQUEST] = 'POST';
    $curlOptions[CURLOPT_POSTFIELDS] = $body;
}

$ch = curl_init($upstreamUrl);
if ($ch === false) {
    proxy_error(500, 'curl_init_failed');
}

proxy_throttle_rps((float)$PROXY_REQUESTS_PER_SECOND, $BASE_API . '|' . $API_KEY);
curl_setopt_array($ch, $curlOptions);

$response = curl_exec($ch);
$status = (int)curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
$error = curl_error($ch);

curl_close($ch);

if ($response === false || $status === 0) {
    proxy_error(502, 'upstream_failed', [
        'detail' => $error !== '' ? $error : 'timeout',
    ]);
}

http_response_code($status);
echo $response;

Developer code snippets

Laat direct zien hoe een integratie eruitziet in JavaScript, PHP of cURL.

javascript php curl
Snippet JavaScript voorbeeld