23 active reports 9 pets back home

API documentation · v1.0.0

API documentation

The Ik ben vermist API gives you, per listing, the type of animal, the municipality, the date and a permanent link to the listing on ikbenvermist.be, without personal data. Below you will find everything to make your first request in a few minutes.

What we share and what we don't

What we share

  • Listing number (id)
  • Status: missing, found, seen or back home
  • Type of animal (cat, dog, bird …)
  • Municipality and province
  • Date of the listing and of the last change
  • Permanent link to the listing on Ik ben vermist
  • Aggregated figures and the barometer
  • Municipalities with links to their page and the shelter list

What we never share

  • Names of owners, finders or reporters
  • E-mail addresses and phone numbers
  • The pet's name
  • Photos
  • Descriptions, features and free text
  • Chip numbers
  • Street, address or exact location on the map
  • Messages, sightings and searches

Quick start

  1. Request a key

    Through the form on the API page. After approval you collect your key once.

  2. Store it on your server

    For example as the environment variable IBV_API_KEY. Never in the browser or in a URL.

  3. Make your first request

    Fetch the missing pets in your municipality:

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

No key yet? Try it with the sandbox key: it always returns the same sample data.

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

Authentication

  • Send your key with every request in the header Authorization: Bearer <key>, or in X-API-Key: <key>. HTTPS only.
  • A key in the URL (e.g. ?api_key=) is always refused with 400 key_in_query: URLs end up in log files. If that happened anyway, ask us for a new key.
  • After too many requests with a missing or invalid key, we block the IP address for a quarter of an hour (429 too_many_failures).
  • The API uses no cookies and does not allow requests from the browser of other sites (no CORS). Your server fetches the data; your website shows the links.
Authorization: Bearer ibv_live_<prefix>_<secret>
# or
X-API-Key: ibv_live_<prefix>_<secret>

Limits and polling

  • Per key by default 60 requests per minute, 1000 per hour and 10000 per day. Every response tells you how many you have left: X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset.
  • Send the ETag of your previous response back in If-None-Match (or Last-Modified in If-Modified-Since). If nothing changed, you get a 304 without content. It still counts as a request, but costs us and you almost nothing.
  • Recommended: listings every 15 minutes (at least 60 seconds between identical requests), the deleted feed at least daily, figures, barometer and municipalities once a day (at least an hour).
  • An identical request within the minimum interval gets the previous response from the cache (header X-Cache: POLL). We only recompute when something changed in the meantime.
  • On 429 or 503: wait the number of seconds in Retry-After, then try again, preferably with an increasing back-off. Keys that keep hammering are paused automatically.
  • For large syncs: per_page up to 100 and page up to 100. Beyond that, use updated_since.
EndpointMinimum interval
GET /listings60 seconds
GET /listings/{id}60 seconds
GET /listings/deleted60 seconds
GET /stats3,600 seconds
GET /barometer3,600 seconds
GET /gemeenten3,600 seconds
GET /me10 seconds
# 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)

Error codes

Every error has the same shape: {"code": "…", "message": "…"}, without internal details.

HTTPcodeDescription
400unknown_parameter, invalid_parameterUnknown or invalid parameter. Only the documented parameters are accepted.
400key_in_queryKey in the URL. Send it in a header and ask for a new key.
400since_too_oldThe deleted feed goes back 180 days: resync everything first.
401missing_key, invalid_keyNo key or not a valid key.
403key_paused, key_expired, key_revokedThe key does not work (for now). If expired: use the renewal link from our e-mail.
403insufficient_scope, ip_not_allowedThe key may not use this endpoint, or the IP address is not on the list.
403writes_disabledSubmitting listings is not available yet.
404not_foundNo public listing with this id, or no such endpoint.
429rate_limited, too_many_failures, write_limitLimit reached. Wait Retry-After seconds.
503overloadedTemporarily busy. Wait Retry-After seconds.
{
    "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

List listings

Public listings, newest first. Filter by status, species and place. Sync with updated_since and If-None-Match. An identical request within 60 seconds gets the previous response from the cache.

Scope
read:listings
Minimum interval
60 seconds

Parameters

NameInTypeDescription
statusquerystringComma-separated: missing, found, seen, home.
speciesquerystringComma-separated: cat, dog, bird, small_mammal, reptile, horse, other.
provincequerystringProvince slug (see /gemeenten). Not together with gemeente or near.
gemeentequerystringMunicipality slug or NIS code (see /gemeenten).
nearquerystringBelgian postcode: listings in municipalities whose centre lies within radius km (distance between municipality centres, never exact locations).
radiusqueryinteger 1–25Radius in km (1–25, default 10), only with near.
updated_sincequerystringOnly listings changed since then (ISO 8601). The basis of syncing.
sortquerystring (-reported_at, reported_at, -updated_at, updated_at) = -reported_atSort order; a minus sign means newest first.
pagequeryinteger 1–100 = 1Page (max. 100). For a full sync, use updated_since.
per_pagequeryinteger 1–100 = 25Results per page (max. 100).
langquerystring (nl, fr, en, de) = nlLanguage of the labels and links (the link opens the listing in that language).
If-None-MatchheaderstringETag of your previous response: unchanged → 304 without a body.
If-Modified-SinceheaderstringLast-Modified of your previous response.

Example request

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);

Example response 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-15T01:00:02Z"
    },
    "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

Submit a listing (not yet available) Not yet available

Prepared for e.g. vets or public authorities, but not yet available: answers 403 writes_disabled. Once enabled, a listing never goes online directly: the reporter gets an e-mail to confirm it, then the usual checks follow.

Scope
write:listings / write:found

Example request

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}

One listing

One public listing. Everything that is not public (removed, closed, unconfirmed or not shared by the owner) gives the same 404 response.

Scope
read:listings
Minimum interval
60 seconds

Parameters

NameInTypeDescription
id requiredpathintegerListing id.
langquerystring (nl, fr, en, de) = nlLanguage of the labels and links (the link opens the listing in that language).
If-None-MatchheaderstringETag of your previous response: unchanged → 304 without a body.
If-Modified-SinceheaderstringLast-Modified of your previous response.

Example request

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);

Example response 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

Removed listings (sync)

Ids of listings that are no longer public (removed, closed, archived or no longer shared by the owner). Remove them on your side within 24 hours. Fetch this at least once a day.

Scope
read:listings
Minimum interval
60 seconds

Parameters

NameInTypeDescription
sincequerystringRemoved since (ISO 8601, default 24 hours ago, at most 180 days back).
pagequeryinteger 1–100 = 1Page (max. 100). For a full sync, use updated_since.
per_pagequeryinteger 1–100 = 25Results per page (max. 100).
If-None-MatchheaderstringETag of your previous response: unchanged → 304 without a body.
If-Modified-SinceheaderstringLast-Modified of your previous response.

Example request

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);

Example response 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-15T01:00:02Z"
    },
    "links": {
        "self": "https://ikbenvermist.be/wp-json/ibv/api/v1/listings/deleted?since=2026-10-14T01%3A00%3A02Z&lang=nl&per_page=2&page=1",
        "first": "https://ikbenvermist.be/wp-json/ibv/api/v1/listings/deleted?since=2026-10-14T01%3A00%3A02Z&lang=nl&per_page=2&page=1",
        "last": "https://ikbenvermist.be/wp-json/ibv/api/v1/listings/deleted?since=2026-10-14T01%3A00%3A02Z&lang=nl&per_page=2&page=1",
        "docs": "https://ikbenvermist.be/en/api/documentation/"
    }
}

GET /stats

Figures

Aggregated live figures (the same as on the figures page). Once a day is enough.

Scope
read:stats
Minimum interval
3,600 seconds

Parameters

NameInTypeDescription
langquerystring (nl, fr, en, de) = nlLanguage of the labels and links (the link opens the listing in that language).
If-None-MatchheaderstringETag of your previous response: unchanged → 304 without a body.
If-Modified-SinceheaderstringLast-Modified of your previous response.

Example request

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);

Example response 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

Quarterly barometer

The barometer editions and the figures of one edition (default: the latest).

Scope
read:stats
Minimum interval
3,600 seconds

Parameters

NameInTypeDescription
editionquerystringBarometer edition (default: the latest).
langquerystring (nl, fr, en, de) = nlLanguage of the labels and links (the link opens the listing in that language).
If-None-MatchheaderstringETag of your previous response: unchanged → 304 without a body.
If-Modified-SinceheaderstringLast-Modified of your previous response.

Example request

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);

Example response 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

Municipalities and links

Every Belgian municipality with its name in four languages, NIS code, postcodes, province and the links to its page of missing and found pets and to the shelter list. That way you link to the right municipality page.

Scope
read:places
Minimum interval
3,600 seconds

Parameters

NameInTypeDescription
provincequerystringOnly the municipalities of this province.
If-None-MatchheaderstringETag of your previous response: unchanged → 304 without a body.
If-Modified-SinceheaderstringLast-Modified of your previous response.

Example request

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);

Example response 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

Your key and usage

Scopes, limits, expiry date and usage of the key you call with.

Scope
—
Minimum interval
10 seconds

Example request

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);

Example response 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
}

Try it

In the explorer you try every endpoint straight away, with the sandbox key and sample data. Real keys do not belong there: put your own key in the Authorization header from your server.

Open in a new window

Versions and changes

The API follows semantic versioning. The path contains the major version (/v1/). Fields may be added without a new version, so ignore fields you do not know. We only remove or change something in a new major version, announced at least three months in advance.

  • v1.0.0

    First version: listings (read), deleted feed, figures, barometer, municipalities, key info, sandbox. Submitting listings is prepared but not yet available.

Terms of use · Back to the API page

Frequently asked questions

What is the best way to sync?

Fetch all listings once (per_page=100, page 1 to the last). After that, call /listings?updated_since=<time of your previous sync>&sort=updated_at every 15 minutes, with the ETag of your previous response in If-None-Match, and /listings/deleted?since=<last time> once a day.

Why do I get X-Cache: POLL?

You sent the same request within the minimum interval. You then get the previous response from the cache; it still counts towards your limits. Use If-None-Match and stick to the recommended intervals.

Why a 404 for a listing I still had yesterday?

It was removed, closed or the owner no longer shares it through the API. Remove it on your side; it is also in /listings/deleted.

May I use the sandbox key in my own code?

For testing, yes: it always returns the same sample data and has a strict limit per IP. For real data, request your own key.