23 actieve meldingen 9 dieren terug thuis

API-documentatie · v1.0.0

API-documentatie

De API van Ik ben vermist geeft je per melding het soort dier, de gemeente, de datum en een vaste link naar de melding op ikbenvermist.be, zonder persoonsgegevens. Hieronder vind je alles om in een paar minuten je eerste verzoek te doen.

Wat we wel en niet delen

Wat we wel delen

  • Nummer (id) van de melding
  • Status: vermist, gevonden, gezien of terug thuis
  • Soort dier (kat, hond, vogel …)
  • Gemeente en provincie
  • Datum van de melding en van de laatste wijziging
  • Vaste link naar de melding op Ik ben vermist
  • Geaggregeerde cijfers en de barometer
  • Gemeenten met links naar hun pagina en de opvanglijst

Wat we nooit delen

  • Namen van baasjes, vinders of melders
  • E-mailadressen en telefoonnummers
  • Naam van het dier
  • Foto's
  • Beschrijvingen, kenmerken en vrije tekst
  • Chipnummers
  • Straat, adres of exacte locatie op de kaart
  • Berichten, waarnemingen en zoekacties

Snel starten

  1. Vraag een sleutel aan

    Via het formulier op de API-pagina. Na goedkeuring haal je je sleutel één keer op.

  2. Bewaar hem op je server

    Bijvoorbeeld als omgevingsvariabele IBV_API_KEY. Nooit in de browser of in een URL.

  3. Doe je eerste verzoek

    Vraag de vermiste dieren in je gemeente op:

    curl -s "https://ikbenvermist.be/wp-json/ibv/api/v1/listings?gemeente=hasselt&status=missing" \
      -H "Authorization: Bearer $IBV_API_KEY"

Nog geen sleutel? Probeer het met de sandbox-sleutel: die geeft altijd dezelfde voorbeelddata.

curl -s "https://ikbenvermist.be/wp-json/ibv/api/v1/listings" \
  -H "Authorization: Bearer ibv_sandbox_try_it_out_public_demo_key"

Authenticatie

  • Stuur je sleutel bij elk verzoek mee in de header Authorization: Bearer <sleutel>, of in X-API-Key: <sleutel>. Alleen via HTTPS.
  • Een sleutel in de URL (bv. ?api_key=) weigeren we altijd met 400 key_in_query: URL's komen in logbestanden terecht. Gebeurde dat toch? Vraag ons dan een nieuwe sleutel.
  • Na te veel verzoeken met een ontbrekende of ongeldige sleutel blokkeren we het IP-adres een kwartier (429 too_many_failures).
  • De API gebruikt geen cookies en staat geen verzoeken vanuit de browser van andere sites toe (geen CORS). Je server haalt de gegevens op; je website toont de links.
Authorization: Bearer ibv_live_<prefix>_<secret>
# or
X-API-Key: ibv_live_<prefix>_<secret>

Limieten en polling

  • Per sleutel standaard 60 verzoeken per minuut, 1000 per uur en 10000 per dag. Elk antwoord vertelt hoeveel je nog over hebt: X-RateLimit-Limit, X-RateLimit-Remaining en X-RateLimit-Reset.
  • Stuur de ETag van je vorige antwoord terug in If-None-Match (of Last-Modified in If-Modified-Since). Is er niets veranderd, dan krijg je 304 zonder inhoud. Dat telt wel als verzoek, maar kost ons en jou bijna niets.
  • Aanbevolen: meldingen om de 15 minuten (minimaal 60 seconden tussen identieke verzoeken), de deleted-feed minstens dagelijks, cijfers, barometer en gemeenten één keer per dag (minimaal een uur).
  • Een identiek verzoek binnen de minimale wachttijd krijgt het vorige antwoord uit de cache (header X-Cache: POLL). Alleen als er intussen iets veranderde, rekenen we opnieuw.
  • Bij 429 of 503: wacht het aantal seconden uit Retry-After en probeer dan opnieuw, liefst met een oplopende wachttijd. Sleutels die blijven hameren, zetten we automatisch op pauze.
  • Voor grote synchronisaties: per_page tot 100 en page tot 100. Daarna werk je met updated_since.
EndpointMinimaal interval
GET /listings60 seconden
GET /listings/{id}60 seconden
GET /listings/deleted60 seconden
GET /stats3.600 seconden
GET /barometer3.600 seconden
GET /gemeenten3.600 seconden
GET /me10 seconden
# 1st request
curl -si "https://ikbenvermist.be/wp-json/ibv/api/v1/listings?updated_since=2026-10-12T00:00:00Z&sort=updated_at" -H "Authorization: Bearer $IBV_API_KEY"
# → 200, ETag: W/"g42-…"

# 15 minutes later, nothing changed
curl -si "https://ikbenvermist.be/wp-json/ibv/api/v1/listings?updated_since=2026-10-12T00:00:00Z&sort=updated_at" \
  -H "Authorization: Bearer $IBV_API_KEY" -H 'If-None-Match: W/"g42-…"'
# → 304 Not Modified (no body)

Foutcodes

Elke fout heeft dezelfde vorm: {"code": "…", "message": "…"}, zonder interne details.

HTTPcodeBeschrijving
400unknown_parameter, invalid_parameterOnbekende of ongeldige parameter. We aanvaarden alleen de gedocumenteerde parameters.
400key_in_querySleutel in de URL. Stuur hem in een header en vraag een nieuwe sleutel.
400since_too_oldDe deleted-feed gaat 180 dagen terug: synchroniseer eerst alles opnieuw.
401missing_key, invalid_keyGeen of geen geldige sleutel.
403key_paused, key_expired, key_revokedDe sleutel werkt (tijdelijk) niet. Bij verlopen: gebruik de verlengingslink uit onze mail.
403insufficient_scope, ip_not_allowedDe sleutel mag dit endpoint niet gebruiken, of het IP-adres staat niet op de lijst.
403writes_disabledMeldingen insturen is nog niet beschikbaar.
404not_foundGeen publieke melding met dit id, of geen endpoint.
429rate_limited, too_many_failures, write_limitLimiet bereikt. Wacht Retry-After seconden.
503overloadedTijdelijk te druk. Wacht Retry-After seconden.
{
    "code": "rate_limited",
    "message": "Rate limit reached for this key. Try again later."
}

Endpoints

Base URL https://ikbenvermist.be/wp-json/ibv/api/v1

GET /listings

Meldingen opvragen

Publieke meldingen, nieuwste eerst. Filter op status, soort en plaats. Synchroniseer met updated_since en If-None-Match. Een identiek verzoek binnen 60 seconden krijgt het vorige antwoord uit de cache.

Scope
read:listings
Minimaal interval
60 seconden

Parameters

NaamWaarTypeBeschrijving
statusquerystringKomma-gescheiden: missing, found, seen, home.
speciesquerystringKomma-gescheiden: cat, dog, bird, small_mammal, reptile, horse, other.
provincequerystringProvincie-slug (zie /gemeenten). Niet samen met gemeente of near.
gemeentequerystringGemeente-slug of NIS-code (zie /gemeenten).
nearquerystringBelgische postcode: meldingen in gemeenten waarvan het centrum binnen radius km ligt (afstand tussen gemeentecentra, nooit exacte locaties).
radiusqueryinteger 1–25Straal in km (1–25, standaard 10), alleen met near.
updated_sincequerystringAlleen meldingen die sindsdien gewijzigd zijn (ISO 8601). Basis van de synchronisatie.
sortquerystring (-reported_at, reported_at, -updated_at, updated_at) = -reported_atSortering; een minteken betekent nieuwste eerst.
pagequeryinteger 1–100 = 1Pagina (max. 100). Voor een volledige synchronisatie gebruik je updated_since.
per_pagequeryinteger 1–100 = 25Resultaten per pagina (max. 100).
langquerystring (nl, fr, en, de) = nlTaal van de labels en links (de link opent de melding in die taal).
If-None-MatchheaderstringETag van je vorige antwoord: ongewijzigd → 304 zonder body.
If-Modified-SinceheaderstringLast-Modified van je vorige antwoord.

Voorbeeldverzoek

curl

curl -s "https://ikbenvermist.be/wp-json/ibv/api/v1/listings?status=missing&gemeente=hasselt&lang=nl" \
  -H "Authorization: Bearer $IBV_API_KEY" \
  -H 'If-None-Match: W/"…"'

JavaScript

// on your server (Node 18+), never in the browser
const res = await fetch('https://ikbenvermist.be/wp-json/ibv/api/v1/listings?status=missing&gemeente=hasselt&lang=nl', {
  headers: { Authorization: `Bearer ${process.env.IBV_API_KEY}` },
});
if (res.status === 429) { /* wait res.headers.get('Retry-After') seconds */ }
const body = await res.json();

PHP

$ch = curl_init('https://ikbenvermist.be/wp-json/ibv/api/v1/listings?status=missing&gemeente=hasselt&lang=nl');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . getenv('IBV_API_KEY')],
]);
$body = json_decode(curl_exec($ch), true);

Voorbeeldantwoord 200

{
    "data": [
        {
            "id": 900001,
            "status": "missing",
            "status_label": "Vermist",
            "species": "cat",
            "species_label": "Kat",
            "place": {
                "gemeente": "Hasselt",
                "gemeente_slug": "hasselt",
                "nis": "71022",
                "province": "Limburg",
                "province_slug": "limburg"
            },
            "reported_at": "2026-10-10T08:12:00Z",
            "updated_at": "2026-10-11T17:40:00Z",
            "url": "https://ikbenvermist.be/m/900001/?utm_source=jouw-organisatie&utm_medium=api&utm_campaign=api",
            "links": {
                "self": "https://ikbenvermist.be/wp-json/ibv/api/v1/listings/900001",
                "html": "https://ikbenvermist.be/m/900001/?utm_source=jouw-organisatie&utm_medium=api&utm_campaign=api",
                "gemeente": "https://ikbenvermist.be/?utm_source=jouw-organisatie&utm_medium=api&utm_campaign=api"
            }
        },
        {
            "id": 900002,
            "status": "found",
            "status_label": "Gevonden",
            "species": "dog",
            "species_label": "Hond",
            "place": {
                "gemeente": "Gent",
                "gemeente_slug": "gent",
                "nis": "44021",
                "province": "Oost-Vlaanderen",
                "province_slug": "oost-vlaanderen"
            },
            "reported_at": "2026-10-09T14:03:00Z",
            "updated_at": "2026-10-09T14:03:00Z",
            "url": "https://ikbenvermist.be/m/900002/?utm_source=jouw-organisatie&utm_medium=api&utm_campaign=api",
            "links": {
                "self": "https://ikbenvermist.be/wp-json/ibv/api/v1/listings/900002",
                "html": "https://ikbenvermist.be/m/900002/?utm_source=jouw-organisatie&utm_medium=api&utm_campaign=api",
                "gemeente": "https://ikbenvermist.be/?utm_source=jouw-organisatie&utm_medium=api&utm_campaign=api"
            }
        }
    ],
    "meta": {
        "page": 1,
        "per_page": 2,
        "total": 6,
        "total_pages": 3,
        "lang": "nl",
        "generated_at": "2026-10-15T00:13:44Z"
    },
    "links": {
        "self": "https://ikbenvermist.be/wp-json/ibv/api/v1/listings?lang=nl&per_page=2&page=1",
        "first": "https://ikbenvermist.be/wp-json/ibv/api/v1/listings?lang=nl&per_page=2&page=1",
        "last": "https://ikbenvermist.be/wp-json/ibv/api/v1/listings?lang=nl&per_page=2&page=3",
        "next": "https://ikbenvermist.be/wp-json/ibv/api/v1/listings?lang=nl&per_page=2&page=2",
        "docs": "https://ikbenvermist.be/en/api/documentation/"
    }
}

POST /listings

Melding insturen (nog niet beschikbaar) Nog niet beschikbaar

Voorbereid voor bv. dierenartsen of overheden, maar nog niet beschikbaar: antwoordt 403 writes_disabled. Eenmaal actief komt een melding nooit meteen online: de melder krijgt een mail om ze te bevestigen, daarna volgt de gewone controle.

Scope
write:listings / write:found

Voorbeeldverzoek

curl

curl -s -X POST "https://ikbenvermist.be/wp-json/ibv/api/v1/listings" \
  -H "Authorization: Bearer $IBV_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"type":"found","species":"cat","postcode":"3500","date":"2026-10-12","color":"rood","contact":{"email":"dierenarts@example.org"},"lang":"nl"}'

JavaScript

const res = await fetch('https://ikbenvermist.be/wp-json/ibv/api/v1/listings', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.IBV_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({"type":"found","species":"cat","postcode":"3500","date":"2026-10-12","color":"rood","contact":{"email":"dierenarts@example.org"},"lang":"nl"}),
});
console.log(res.status, await res.json());

PHP

$ch = curl_init('https://ikbenvermist.be/wp-json/ibv/api/v1/listings');
curl_setopt_array($ch, [
    CURLOPT_POST           => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . getenv('IBV_API_KEY'), 'Content-Type: application/json'],
    CURLOPT_POSTFIELDS     => '{"type":"found","species":"cat","postcode":"3500","date":"2026-10-12","color":"rood","contact":{"email":"dierenarts@example.org"},"lang":"nl"}',
]);
$result = json_decode(curl_exec($ch), true);

GET /listings/{id}

Eén melding

Eén publieke melding. Alles wat niet publiek is (verwijderd, afgesloten, niet bevestigd of door de eigenaar niet gedeeld) geeft hetzelfde 404-antwoord.

Scope
read:listings
Minimaal interval
60 seconden

Parameters

NaamWaarTypeBeschrijving
id verplichtpathintegerListing id.
langquerystring (nl, fr, en, de) = nlTaal van de labels en links (de link opent de melding in die taal).
If-None-MatchheaderstringETag van je vorige antwoord: ongewijzigd → 304 zonder body.
If-Modified-SinceheaderstringLast-Modified van je vorige antwoord.

Voorbeeldverzoek

curl

curl -s "https://ikbenvermist.be/wp-json/ibv/api/v1/listings/900001" \
  -H "Authorization: Bearer $IBV_API_KEY" \
  -H 'If-None-Match: W/"…"'

JavaScript

// on your server (Node 18+), never in the browser
const res = await fetch('https://ikbenvermist.be/wp-json/ibv/api/v1/listings/900001', {
  headers: { Authorization: `Bearer ${process.env.IBV_API_KEY}` },
});
if (res.status === 429) { /* wait res.headers.get('Retry-After') seconds */ }
const body = await res.json();

PHP

$ch = curl_init('https://ikbenvermist.be/wp-json/ibv/api/v1/listings/900001');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . getenv('IBV_API_KEY')],
]);
$body = json_decode(curl_exec($ch), true);

Voorbeeldantwoord 200

{
    "data": {
        "id": 900001,
        "status": "missing",
        "status_label": "Vermist",
        "species": "cat",
        "species_label": "Kat",
        "place": {
            "gemeente": "Hasselt",
            "gemeente_slug": "hasselt",
            "nis": "71022",
            "province": "Limburg",
            "province_slug": "limburg"
        },
        "reported_at": "2026-10-10T08:12:00Z",
        "updated_at": "2026-10-11T17:40:00Z",
        "url": "https://ikbenvermist.be/m/900001/?utm_source=jouw-organisatie&utm_medium=api&utm_campaign=api",
        "links": {
            "self": "https://ikbenvermist.be/wp-json/ibv/api/v1/listings/900001",
            "html": "https://ikbenvermist.be/m/900001/?utm_source=jouw-organisatie&utm_medium=api&utm_campaign=api",
            "gemeente": "https://ikbenvermist.be/?utm_source=jouw-organisatie&utm_medium=api&utm_campaign=api"
        }
    }
}

GET /listings/deleted

Verwijderde meldingen (sync)

Id's van meldingen die niet meer publiek zijn (verwijderd, afgesloten, gearchiveerd of door de eigenaar niet meer gedeeld). Verwijder ze binnen 24 uur bij jou. Vraag dit minstens één keer per dag op.

Scope
read:listings
Minimaal interval
60 seconden

Parameters

NaamWaarTypeBeschrijving
sincequerystringVerwijderd sinds (ISO 8601, standaard 24 uur geleden, max. 180 dagen terug).
pagequeryinteger 1–100 = 1Pagina (max. 100). Voor een volledige synchronisatie gebruik je updated_since.
per_pagequeryinteger 1–100 = 25Resultaten per pagina (max. 100).
If-None-MatchheaderstringETag van je vorige antwoord: ongewijzigd → 304 zonder body.
If-Modified-SinceheaderstringLast-Modified van je vorige antwoord.

Voorbeeldverzoek

curl

curl -s "https://ikbenvermist.be/wp-json/ibv/api/v1/listings/deleted?since=2026-10-12T00%3A00%3A00Z" \
  -H "Authorization: Bearer $IBV_API_KEY" \
  -H 'If-None-Match: W/"…"'

JavaScript

// on your server (Node 18+), never in the browser
const res = await fetch('https://ikbenvermist.be/wp-json/ibv/api/v1/listings/deleted?since=2026-10-12T00%3A00%3A00Z', {
  headers: { Authorization: `Bearer ${process.env.IBV_API_KEY}` },
});
if (res.status === 429) { /* wait res.headers.get('Retry-After') seconds */ }
const body = await res.json();

PHP

$ch = curl_init('https://ikbenvermist.be/wp-json/ibv/api/v1/listings/deleted?since=2026-10-12T00%3A00%3A00Z');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . getenv('IBV_API_KEY')],
]);
$body = json_decode(curl_exec($ch), true);

Voorbeeldantwoord 200

{
    "data": [
        {
            "id": 899990,
            "deleted_at": "2026-10-11T09:00:00Z"
        },
        {
            "id": 899991,
            "deleted_at": "2026-10-11T15:30:00Z"
        }
    ],
    "meta": {
        "page": 1,
        "per_page": 2,
        "total": 2,
        "total_pages": 1,
        "lang": "nl",
        "generated_at": "2026-10-15T00:13:44Z"
    },
    "links": {
        "self": "https://ikbenvermist.be/wp-json/ibv/api/v1/listings/deleted?since=2026-10-14T00%3A13%3A44Z&lang=nl&per_page=2&page=1",
        "first": "https://ikbenvermist.be/wp-json/ibv/api/v1/listings/deleted?since=2026-10-14T00%3A13%3A44Z&lang=nl&per_page=2&page=1",
        "last": "https://ikbenvermist.be/wp-json/ibv/api/v1/listings/deleted?since=2026-10-14T00%3A13%3A44Z&lang=nl&per_page=2&page=1",
        "docs": "https://ikbenvermist.be/en/api/documentation/"
    }
}

GET /stats

Cijfers

Geaggregeerde live cijfers (dezelfde als op /cijfers/). Eén keer per dag ophalen volstaat.

Scope
read:stats
Minimaal interval
3.600 seconden

Parameters

NaamWaarTypeBeschrijving
langquerystring (nl, fr, en, de) = nlTaal van de labels en links (de link opent de melding in die taal).
If-None-MatchheaderstringETag van je vorige antwoord: ongewijzigd → 304 zonder body.
If-Modified-SinceheaderstringLast-Modified van je vorige antwoord.

Voorbeeldverzoek

curl

curl -s "https://ikbenvermist.be/wp-json/ibv/api/v1/stats?lang=nl" \
  -H "Authorization: Bearer $IBV_API_KEY" \
  -H 'If-None-Match: W/"…"'

JavaScript

// on your server (Node 18+), never in the browser
const res = await fetch('https://ikbenvermist.be/wp-json/ibv/api/v1/stats?lang=nl', {
  headers: { Authorization: `Bearer ${process.env.IBV_API_KEY}` },
});
if (res.status === 429) { /* wait res.headers.get('Retry-After') seconds */ }
const body = await res.json();

PHP

$ch = curl_init('https://ikbenvermist.be/wp-json/ibv/api/v1/stats?lang=nl');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . getenv('IBV_API_KEY')],
]);
$body = json_decode(curl_exec($ch), true);

Voorbeeldantwoord 200

{
    "data": {
        "updated_at": "2026-10-12T06:00:00Z",
        "since": 2019,
        "listings_total": 1234,
        "active_now": 210,
        "back_home": 480,
        "by_status": {
            "missing": 870,
            "found": 290,
            "seen": 74
        },
        "by_species": {
            "cat": 760,
            "dog": 390,
            "bird": 40,
            "small_mammal": 30,
            "reptile": 4,
            "horse": 2,
            "other": 8
        },
        "by_province": [
            {
                "province": "Limburg",
                "province_slug": "limburg",
                "count": 300
            }
        ],
        "chip_pct": 71,
        "median_days_home": 3,
        "summer_factor": 1.6,
        "source": "SAMPLE DATA — Ik ben vermist sandbox",
        "links": {
            "html": "https://ikbenvermist.be/?utm_source=jouw-organisatie&utm_medium=api&utm_campaign=api",
            "barometer": "https://ikbenvermist.be/?utm_source=jouw-organisatie&utm_medium=api&utm_campaign=api"
        }
    }
}

GET /barometer

Barometer per kwartaal

De edities van de barometer en de cijfers van één editie (standaard de laatste).

Scope
read:stats
Minimaal interval
3.600 seconden

Parameters

NaamWaarTypeBeschrijving
editionquerystringEditie van de barometer (standaard de laatste).
langquerystring (nl, fr, en, de) = nlTaal van de labels en links (de link opent de melding in die taal).
If-None-MatchheaderstringETag van je vorige antwoord: ongewijzigd → 304 zonder body.
If-Modified-SinceheaderstringLast-Modified van je vorige antwoord.

Voorbeeldverzoek

curl

curl -s "https://ikbenvermist.be/wp-json/ibv/api/v1/barometer?edition=2026-q3&lang=nl" \
  -H "Authorization: Bearer $IBV_API_KEY" \
  -H 'If-None-Match: W/"…"'

JavaScript

// on your server (Node 18+), never in the browser
const res = await fetch('https://ikbenvermist.be/wp-json/ibv/api/v1/barometer?edition=2026-q3&lang=nl', {
  headers: { Authorization: `Bearer ${process.env.IBV_API_KEY}` },
});
if (res.status === 429) { /* wait res.headers.get('Retry-After') seconds */ }
const body = await res.json();

PHP

$ch = curl_init('https://ikbenvermist.be/wp-json/ibv/api/v1/barometer?edition=2026-q3&lang=nl');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . getenv('IBV_API_KEY')],
]);
$body = json_decode(curl_exec($ch), true);

Voorbeeldantwoord 200

{
    "data": {
        "editions": [
            {
                "edition": "2026-q3",
                "url": "https://ikbenvermist.be/?utm_source=jouw-organisatie&utm_medium=api&utm_campaign=api"
            }
        ],
        "edition": {
            "edition": "2026-q3",
            "year": 2026,
            "quarter": 3,
            "listings": 321,
            "by_status": {
                "missing": 220,
                "found": 80,
                "seen": 21
            },
            "by_species": {
                "cat": 200,
                "dog": 101,
                "other": 20
            },
            "by_province": [
                {
                    "province": "Oost-Vlaanderen",
                    "province_slug": "oost-vlaanderen",
                    "count": 64
                }
            ],
            "back_home": 120,
            "home_rate_pct": 55,
            "median_days_home": 3,
            "change_vs_previous_pct": 12,
            "change_vs_last_year_pct": null,
            "referring_municipalities": 25,
            "frozen": true,
            "url": "https://ikbenvermist.be/?utm_source=jouw-organisatie&utm_medium=api&utm_campaign=api"
        }
    }
}

GET /gemeenten

Gemeenten en links

Alle Belgische gemeenten met hun naam in vier talen, NIS-code, postcodes, provincie en de links naar hun pagina met vermiste en gevonden dieren en naar de opvanglijst. Zo link je naar de juiste gemeentepagina.

Scope
read:places
Minimaal interval
3.600 seconden

Parameters

NaamWaarTypeBeschrijving
provincequerystringAlleen de gemeenten van deze provincie.
If-None-MatchheaderstringETag van je vorige antwoord: ongewijzigd → 304 zonder body.
If-Modified-SinceheaderstringLast-Modified van je vorige antwoord.

Voorbeeldverzoek

curl

curl -s "https://ikbenvermist.be/wp-json/ibv/api/v1/gemeenten?province=limburg" \
  -H "Authorization: Bearer $IBV_API_KEY" \
  -H 'If-None-Match: W/"…"'

JavaScript

// on your server (Node 18+), never in the browser
const res = await fetch('https://ikbenvermist.be/wp-json/ibv/api/v1/gemeenten?province=limburg', {
  headers: { Authorization: `Bearer ${process.env.IBV_API_KEY}` },
});
if (res.status === 429) { /* wait res.headers.get('Retry-After') seconds */ }
const body = await res.json();

PHP

$ch = curl_init('https://ikbenvermist.be/wp-json/ibv/api/v1/gemeenten?province=limburg');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . getenv('IBV_API_KEY')],
]);
$body = json_decode(curl_exec($ch), true);

Voorbeeldantwoord 200

{
    "data": [
        {
            "slug": "hasselt",
            "nis": "71022",
            "names": {
                "nl": "Hasselt",
                "fr": "Hasselt",
                "en": "Hasselt",
                "de": "Hasselt"
            },
            "postcodes": [
                "3500",
                "3501",
                "3510",
                "3511",
                "3512"
            ],
            "province": {
                "slug": "limburg",
                "names": {
                    "nl": "Limburg",
                    "fr": "Limbourg",
                    "en": "Limburg",
                    "de": "Limburg"
                }
            },
            "links": {
                "missing": {
                    "nl": "https://ikbenvermist.be/?utm_source=jouw-organisatie&utm_medium=api&utm_campaign=api",
                    "fr": "https://ikbenvermist.be/fr/?utm_source=jouw-organisatie&utm_medium=api&utm_campaign=api",
                    "en": "https://ikbenvermist.be/en/?utm_source=jouw-organisatie&utm_medium=api&utm_campaign=api",
                    "de": "https://ikbenvermist.be/de/?utm_source=jouw-organisatie&utm_medium=api&utm_campaign=api"
                },
                "found": {
                    "nl": "https://ikbenvermist.be/?utm_source=jouw-organisatie&utm_medium=api&utm_campaign=api",
                    "fr": "https://ikbenvermist.be/fr/?utm_source=jouw-organisatie&utm_medium=api&utm_campaign=api",
                    "en": "https://ikbenvermist.be/en/?utm_source=jouw-organisatie&utm_medium=api&utm_campaign=api",
                    "de": "https://ikbenvermist.be/de/?utm_source=jouw-organisatie&utm_medium=api&utm_campaign=api"
                },
                "opvang": {
                    "nl": "https://ikbenvermist.be/?utm_source=jouw-organisatie&utm_medium=api&utm_campaign=api",
                    "fr": "https://ikbenvermist.be/fr/?utm_source=jouw-organisatie&utm_medium=api&utm_campaign=api",
                    "en": "https://ikbenvermist.be/en/?utm_source=jouw-organisatie&utm_medium=api&utm_campaign=api",
                    "de": "https://ikbenvermist.be/de/?utm_source=jouw-organisatie&utm_medium=api&utm_campaign=api"
                }
            }
        }
    ],
    "meta": {
        "total": 1,
        "generated_at": "2026-10-12T06:00:00Z"
    }
}

GET /me

Je sleutel en verbruik

Scopes, limieten, vervaldatum en verbruik van de sleutel waarmee je vraagt.

Scope
—
Minimaal interval
10 seconden

Voorbeeldverzoek

curl

curl -s "https://ikbenvermist.be/wp-json/ibv/api/v1/me" \
  -H "Authorization: Bearer $IBV_API_KEY" \
  -H 'If-None-Match: W/"…"'

JavaScript

// on your server (Node 18+), never in the browser
const res = await fetch('https://ikbenvermist.be/wp-json/ibv/api/v1/me', {
  headers: { Authorization: `Bearer ${process.env.IBV_API_KEY}` },
});
if (res.status === 429) { /* wait res.headers.get('Retry-After') seconds */ }
const body = await res.json();

PHP

$ch = curl_init('https://ikbenvermist.be/wp-json/ibv/api/v1/me');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . getenv('IBV_API_KEY')],
]);
$body = json_decode(curl_exec($ch), true);

Voorbeeldantwoord 200

{
    "organisation": "Sandbox",
    "key_prefix": "sandbox",
    "status": "active",
    "scopes": [
        "read:listings",
        "read:stats",
        "read:places"
    ],
    "writes": {
        "enabled_globally": false,
        "enabled_for_key": false
    },
    "limits": {
        "per_minute": 20,
        "per_hour": 0,
        "per_day": 0,
        "min_poll_seconds": {
            "listings": 60,
            "listing": 60,
            "deleted": 60,
            "stats": 3600,
            "barometer": 3600,
            "gemeenten": 3600,
            "me": 10
        }
    },
    "expires_at": null,
    "usage": {
        "last_24h": 0,
        "last_30_days": 0
    },
    "utm_source": "sandbox",
    "ip_allowlist": false
}

Probeer het

In de verkenner probeer je elk endpoint meteen uit, met de sandbox-sleutel en voorbeelddata. Echte sleutels horen daar niet: zet je eigen sleutel in de Authorization-header vanaf je server.

Openen in een nieuw venster

Versies en wijzigingen

De API volgt semantische versies. Het pad bevat de hoofdversie (/v1/). Velden toevoegen kan zonder nieuwe versie, dus negeer velden die je niet kent. Iets weghalen of veranderen doen we alleen in een nieuwe hoofdversie, die we minstens drie maanden vooraf aankondigen.

  • v1.0.0

    Eerste versie: meldingen (lezen), deleted-feed, cijfers, barometer, gemeenten, sleutelinfo, sandbox. Insturen van meldingen voorbereid maar nog niet beschikbaar.

Gebruiksvoorwaarden · Terug naar de API-pagina

Veelgestelde vragen

Hoe synchroniseer ik het best?

Haal één keer alle meldingen op (per_page=100, page 1 tot de laatste). Vraag daarna om de 15 minuten /listings?updated_since=<tijdstip van je vorige sync>&sort=updated_at op, met de ETag van je vorige antwoord in If-None-Match, en één keer per dag /listings/deleted?since=<vorige keer>.

Waarom krijg ik X-Cache: POLL?

Je stuurde hetzelfde verzoek binnen de minimale wachttijd. Dan krijg je het vorige antwoord uit de cache; het telt wel mee voor je limieten. Gebruik If-None-Match en houd je aan de aanbevolen intervallen.

Waarom krijg ik 404 voor een melding die ik gisteren nog had?

Ze is verwijderd, afgesloten of de eigenaar deelt ze niet meer via de API. Verwijder ze bij jou; ze staat ook in /listings/deleted.

Mag ik de sandbox-sleutel in mijn eigen code gebruiken?

Om te testen wel: hij geeft altijd dezelfde voorbeelddata en heeft een strenge limiet per IP. Voor echte gegevens vraag je een eigen sleutel aan.