Endpoint

Autocomplete

Type-ahead op adres, straat of plaats. Gemaakt om rechtstreeks vanuit een checkout of zoekveld aangeroepen te worden.

Het verzoek

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 address, street of city. Standaard address.
limit integer nee Aantal suggesties, 1 tot 25. Standaard 10.

De response

Een geslaagde aanroep geeft 200 met Content-Type: application/json en Cache-Control: public, max-age=86400.

200 application/json
{
  "data": [
    {
      "label": "Hamerstraat 19, 1021 JT Amsterdam",
      "type": "address",
      "postcode": "1021JT",
      "number": 19,
      "street": "Hamerstraat",
      "city": "Amsterdam"
    }
  ]
}

Voorbeelden

curl -sS \
  -H "X-Api-Key: lat_test_demo_publiek_locatieapi_sandbox" \
  -H "Accept: application/json" \
  "https://api.locatieapi.nl/v1/autocomplete?q=hamerstr&type=address&limit=8"

Rechtstreeks vanuit de browser

Autocomplete is het endpoint waarbij een tussenlaag het meest in de weg zit: elke toetsaanslag zou dan twee keer over het netwerk moeten. Daarom kun je bij ons een sleutel met alleen leesrechten maken en daar de toegestane origins op zetten. De API stuurt dan de bijbehorende Access-Control-Allow-Origin mee en de aanroep werkt rechtstreeks vanuit je pagina.

Wel met een aparte sleutel

Zet nooit je gewone livesleutel in de browser. Maak een tweede sleutel, geef die alleen leesrechten, zet de toegestane origins erop en gebruik alleen die in frontend-code. Een sleutel zonder ingestelde origin werkt bewust alleen server-side.
autocomplete.js
/**
 * Autocomplete rechtstreeks vanuit de browser. Dat mag met LocatieAPI,
 * mits je de origin op de sleutel zet en een sleutel met alleen
 * leesrechten gebruikt.
 */
const KEY = 'lat_test_demo_publiek_locatieapi_sandbox';

async function suggest(term) {
  if (term.length < 2) return [];

  const url = new URL('https://api.locatieapi.nl/v1/autocomplete');
  url.searchParams.set('q', term);
  url.searchParams.set('type', 'address');
  url.searchParams.set('limit', '8');

  const response = await fetch(url, { headers: { 'X-Api-Key': KEY } });

  if (!response.ok) return [];

  const { data } = await response.json();

  return data.map((row) => row.label);
}

const input = document.querySelector('#adres');
let timer;

input.addEventListener('input', () => {
  clearTimeout(timer);
  timer = setTimeout(async () => {
    const options = await suggest(input.value);
    document.querySelector('#suggesties').replaceChildren(
      ...options.map((label) => Object.assign(document.createElement('option'), { value: label })),
    );
  }, 150);
});

Tips

  • Wacht 150 milliseconden na de laatste toetsaanslag voordat je aanroept. Dat scheelt gemiddeld twee derde van je calls.
  • Begin pas vanaf twee tekens. Bij minder is de lijst toch niet bruikbaar en kost het alleen bundel.
  • Breek een lopend verzoek af met een AbortController zodra de gebruiker verder typt.
  • Gebruik type=city voor een plaatsveld en type=street voor een straatveld; dat geeft veel kortere en relevantere lijsten.
  • Laat het adresveld altijd bewerkbaar. Een suggestielijst mag nooit de enige manier zijn om een adres in te vullen.