23 signalements actifs 9 animaux de retour

Documentation de l’API · v1.0.0

Documentation de l’API

L’API de Ik ben vermist vous donne pour chaque signalement l’espèce, la commune, la date et un lien permanent vers le signalement sur ikbenvermist.be, sans données personnelles. Vous trouverez ci-dessous tout ce qu’il faut pour envoyer votre première requête en quelques minutes.

Ce que nous partageons et ce que nous ne partageons pas

Ce que nous partageons

  • Numéro (id) du signalement
  • Statut : perdu, trouvé, aperçu ou de retour à la maison
  • Espèce (chat, chien, oiseau…)
  • Commune et province
  • Date du signalement et de la dernière modification
  • Lien permanent vers le signalement sur Ik ben vermist
  • Chiffres agrégés et baromètre
  • Communes avec liens vers leur page et la liste des accueils

Ce que nous ne partageons jamais

  • Noms des propriétaires, des personnes qui ont trouvé l’animal ou qui le signalent
  • Adresses e-mail et numéros de téléphone
  • Nom de l’animal
  • Photos
  • Descriptions, signes distinctifs et texte libre
  • Numéros de puce
  • Rue, adresse ou position exacte sur la carte
  • Messages, observations et recherches

Démarrage rapide

  1. Demandez une clé

    Via le formulaire de la page API. Après approbation, vous récupérez votre clé une seule fois.

  2. Conservez-la sur votre serveur

    Par exemple comme variable d’environnement IBV_API_KEY. Jamais dans le navigateur ni dans une URL.

  3. Envoyez votre première requête

    Demandez les animaux perdus dans votre commune :

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

Pas encore de clé ? Essayez avec la clé sandbox : elle renvoie toujours les mêmes données d’exemple.

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

Authentification

  • Envoyez votre clé à chaque requête dans l’en-tête Authorization: Bearer <clé>, ou dans X-API-Key: <clé>. Uniquement via HTTPS.
  • Une clé dans l’URL (p. ex. ?api_key=) est toujours refusée avec 400 key_in_query : les URL finissent dans les journaux. Si cela s’est produit, demandez-nous une nouvelle clé.
  • Après trop de requêtes avec une clé absente ou invalide, nous bloquons l’adresse IP pendant un quart d’heure (429 too_many_failures).
  • L’API n’utilise pas de cookies et n’autorise pas les requêtes depuis le navigateur d’autres sites (pas de CORS). Votre serveur récupère les données ; votre site affiche les liens.
Authorization: Bearer ibv_live_<prefix>_<secret>
# or
X-API-Key: ibv_live_<prefix>_<secret>

Limites et polling

  • Par clé, par défaut 60 requêtes par minute, 1000 par heure et 10000 par jour. Chaque réponse indique ce qu’il vous reste : X-RateLimit-Limit, X-RateLimit-Remaining et X-RateLimit-Reset.
  • Renvoyez l’ETag de votre réponse précédente dans If-None-Match (ou Last-Modified dans If-Modified-Since). Si rien n’a changé, vous recevez un 304 sans contenu. Cela compte comme une requête, mais ne coûte presque rien, ni à vous ni à nous.
  • Recommandé : les signalements toutes les 15 minutes (au moins 60 secondes entre requêtes identiques), le flux des suppressions au moins une fois par jour, les chiffres, le baromètre et les communes une fois par jour (au moins une heure).
  • Une requête identique dans le délai minimal reçoit la réponse précédente depuis le cache (en-tête X-Cache: POLL). Nous ne recalculons que si quelque chose a changé entre-temps.
  • En cas de 429 ou 503 : attendez le nombre de secondes indiqué dans Retry-After puis réessayez, de préférence avec un délai croissant. Nous mettons automatiquement en pause les clés qui insistent.
  • Pour les grosses synchronisations : per_page jusqu’à 100 et page jusqu’à 100. Au-delà, utilisez updated_since.
EndpointIntervalle minimal
GET /listings60 secondes
GET /listings/{id}60 secondes
GET /listings/deleted60 secondes
GET /stats3 600 secondes
GET /barometer3 600 secondes
GET /gemeenten3 600 secondes
GET /me10 secondes
# 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)

Codes d’erreur

Chaque erreur a la même forme : {"code": "…", "message": "…"}, sans détails internes.

HTTPcodeDescription
400unknown_parameter, invalid_parameterParamètre inconnu ou invalide. Seuls les paramètres documentés sont acceptés.
400key_in_queryClé dans l’URL. Envoyez-la dans un en-tête et demandez une nouvelle clé.
400since_too_oldLe flux des suppressions remonte à 180 jours : resynchronisez d’abord tout.
401missing_key, invalid_keyClé absente ou invalide.
403key_paused, key_expired, key_revokedLa clé ne fonctionne pas (temporairement). Si elle a expiré : utilisez le lien de prolongation de notre e-mail.
403insufficient_scope, ip_not_allowedLa clé n’a pas accès à cet endpoint, ou l’adresse IP n’est pas autorisée.
403writes_disabledL’envoi de signalements n’est pas encore disponible.
404not_foundAucun signalement public avec cet id, ou endpoint inexistant.
429rate_limited, too_many_failures, write_limitLimite atteinte. Attendez Retry-After secondes.
503overloadedTemporairement surchargé. Attendez Retry-After secondes.
{
    "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

Lister les signalements

Signalements publics, du plus récent au plus ancien. Filtrez par statut, espèce et lieu. Synchronisez avec updated_since et If-None-Match. Une requête identique dans les 60 secondes reçoit la réponse précédente depuis le cache.

Scope
read:listings
Intervalle minimal
60 secondes

Paramètres

NomOùTypeDescription
statusquerystringSéparés par des virgules : missing, found, seen, home.
speciesquerystringSéparés par des virgules : cat, dog, bird, small_mammal, reptile, horse, other.
provincequerystringSlug de la province (voir /gemeenten). Pas avec gemeente ou near.
gemeentequerystringSlug de la commune ou code INS (voir /gemeenten).
nearquerystringCode postal belge : signalements dans les communes dont le centre se trouve à moins de radius km (distance entre centres de communes, jamais de position exacte).
radiusqueryinteger 1–25Rayon en km (1–25, 10 par défaut), uniquement avec near.
updated_sincequerystringUniquement les signalements modifiés depuis (ISO 8601). Base de la synchronisation.
sortquerystring (-reported_at, reported_at, -updated_at, updated_at) = -reported_atTri ; un signe moins signifie du plus récent au plus ancien.
pagequeryinteger 1–100 = 1Page (max. 100). Pour une synchronisation complète, utilisez updated_since.
per_pagequeryinteger 1–100 = 25Résultats par page (max. 100).
langquerystring (nl, fr, en, de) = nlLangue des libellés et des liens (le lien ouvre le signalement dans cette langue).
If-None-MatchheaderstringETag de votre réponse précédente : inchangé → 304 sans contenu.
If-Modified-SinceheaderstringLast-Modified de votre réponse précédente.

Exemple de requête

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

Exemple de réponse 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:03Z"
    },
    "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

Envoyer un signalement (pas encore disponible) Pas encore disponible

Prévu par exemple pour les vétérinaires ou les autorités, mais pas encore disponible : répond 403 writes_disabled. Une fois actif, un signalement ne sera jamais publié directement : la personne reçoit un e-mail pour le confirmer, puis le contrôle habituel suit.

Scope
write:listings / write:found

Exemple de requête

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}

Un signalement

Un signalement public. Tout ce qui n’est pas public (supprimé, clôturé, non confirmé ou non partagé par le propriétaire) renvoie la même réponse 404.

Scope
read:listings
Intervalle minimal
60 secondes

Paramètres

NomOùTypeDescription
id obligatoirepathintegerListing id.
langquerystring (nl, fr, en, de) = nlLangue des libellés et des liens (le lien ouvre le signalement dans cette langue).
If-None-MatchheaderstringETag de votre réponse précédente : inchangé → 304 sans contenu.
If-Modified-SinceheaderstringLast-Modified de votre réponse précédente.

Exemple de requête

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

Exemple de réponse 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

Signalements supprimés (sync)

Id des signalements qui ne sont plus publics (supprimés, clôturés, archivés ou plus partagés par le propriétaire). Supprimez-les chez vous dans les 24 heures. Interrogez ce flux au moins une fois par jour.

Scope
read:listings
Intervalle minimal
60 secondes

Paramètres

NomOùTypeDescription
sincequerystringSupprimés depuis (ISO 8601, par défaut il y a 24 heures, 180 jours maximum).
pagequeryinteger 1–100 = 1Page (max. 100). Pour une synchronisation complète, utilisez updated_since.
per_pagequeryinteger 1–100 = 25Résultats par page (max. 100).
If-None-MatchheaderstringETag de votre réponse précédente : inchangé → 304 sans contenu.
If-Modified-SinceheaderstringLast-Modified de votre réponse précédente.

Exemple de requête

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

Exemple de réponse 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:03Z"
    },
    "links": {
        "self": "https://ikbenvermist.be/wp-json/ibv/api/v1/listings/deleted?since=2026-10-14T01%3A00%3A03Z&lang=nl&per_page=2&page=1",
        "first": "https://ikbenvermist.be/wp-json/ibv/api/v1/listings/deleted?since=2026-10-14T01%3A00%3A03Z&lang=nl&per_page=2&page=1",
        "last": "https://ikbenvermist.be/wp-json/ibv/api/v1/listings/deleted?since=2026-10-14T01%3A00%3A03Z&lang=nl&per_page=2&page=1",
        "docs": "https://ikbenvermist.be/en/api/documentation/"
    }
}

GET /stats

Chiffres

Chiffres agrégés en direct (les mêmes que sur la page Chiffres). Une fois par jour suffit.

Scope
read:stats
Intervalle minimal
3 600 secondes

Paramètres

NomOùTypeDescription
langquerystring (nl, fr, en, de) = nlLangue des libellés et des liens (le lien ouvre le signalement dans cette langue).
If-None-MatchheaderstringETag de votre réponse précédente : inchangé → 304 sans contenu.
If-Modified-SinceheaderstringLast-Modified de votre réponse précédente.

Exemple de requête

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

Exemple de réponse 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

Baromètre trimestriel

Les éditions du baromètre et les chiffres d’une édition (par défaut la dernière).

Scope
read:stats
Intervalle minimal
3 600 secondes

Paramètres

NomOùTypeDescription
editionquerystringÉdition du baromètre (par défaut la dernière).
langquerystring (nl, fr, en, de) = nlLangue des libellés et des liens (le lien ouvre le signalement dans cette langue).
If-None-MatchheaderstringETag de votre réponse précédente : inchangé → 304 sans contenu.
If-Modified-SinceheaderstringLast-Modified de votre réponse précédente.

Exemple de requête

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

Exemple de réponse 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

Communes et liens

Toutes les communes belges avec leur nom en quatre langues, code INS, codes postaux, province et les liens vers leur page des animaux perdus et trouvés et vers la liste des accueils. Vous renvoyez ainsi vers la bonne page communale.

Scope
read:places
Intervalle minimal
3 600 secondes

Paramètres

NomOùTypeDescription
provincequerystringUniquement les communes de cette province.
If-None-MatchheaderstringETag de votre réponse précédente : inchangé → 304 sans contenu.
If-Modified-SinceheaderstringLast-Modified de votre réponse précédente.

Exemple de requête

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

Exemple de réponse 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

Votre clé et votre utilisation

Scopes, limites, date d’expiration et utilisation de la clé utilisée.

Scope
—
Intervalle minimal
10 secondes

Exemple de requête

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

Exemple de réponse 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
}

Essayez

Dans l’explorateur, vous essayez chaque endpoint immédiatement, avec la clé sandbox et des données d’exemple. Les vraies clés n’y ont pas leur place : placez votre propre clé dans l’en-tête Authorization depuis votre serveur.

Ouvrir dans une nouvelle fenêtre

Versions et changements

L’API suit le versionnage sémantique. Le chemin contient la version majeure (/v1/). L’ajout de champs peut se faire sans nouvelle version : ignorez donc les champs que vous ne connaissez pas. Nous ne retirons ou ne modifions quelque chose que dans une nouvelle version majeure, annoncée au moins trois mois à l’avance.

  • v1.0.0

    Première version : signalements (lecture), flux des suppressions, chiffres, baromètre, communes, infos sur la clé, sandbox. L’envoi de signalements est prévu mais pas encore disponible.

Conditions d’utilisation · Retour à la page API

Questions fréquentes

Quelle est la meilleure façon de synchroniser ?

Récupérez une fois tous les signalements (per_page=100, de la page 1 à la dernière). Ensuite, interrogez toutes les 15 minutes /listings?updated_since=<heure de votre synchronisation précédente>&sort=updated_at, avec l’ETag de votre réponse précédente dans If-None-Match, et une fois par jour /listings/deleted?since=<dernière fois>.

Pourquoi est-ce que je reçois X-Cache: POLL ?

Vous avez envoyé la même requête dans le délai minimal. Vous recevez alors la réponse précédente depuis le cache ; elle compte toutefois dans vos limites. Utilisez If-None-Match et respectez les intervalles recommandés.

Pourquoi un 404 pour un signalement que j’avais encore hier ?

Il a été supprimé, clôturé ou son propriétaire ne le partage plus via l’API. Supprimez-le chez vous ; il figure aussi dans /listings/deleted.

Puis-je utiliser la clé sandbox dans mon code ?

Pour tester, oui : elle renvoie toujours les mêmes données d’exemple et a une limite stricte par IP. Pour les vraies données, demandez votre propre clé.