L'API
Six routes de lecture sur vos propres chiffres. Elles donnent exactement ce que vous voyez dans votre tableau de bord, en JSON. Il n'y a pas de route d'écriture: lancer une mesure coûte de l'argent et cela n'a pas sa place derrière une clé qui traîne dans un script.
Introduction
Croissance et Bureau. Vous créez une clé dans votre tableau de bord, sous Gestion, dans API. La clé s'affiche une seule fois. Nous n'en conservons qu'une empreinte chiffrée, donc nous ne pouvons pas la réafficher plus tard.
Chaque route se trouve sous une seule adresse de base. Tout passe par HTTPS et chaque route est un GET.
https://www.vermeld.be/api/v1Démarrage rapide
- 1Créez une clé dans votre tableau de bord, dans API. Copiez-la tout de suite: elle ne s'affiche qu'une fois.
- 2Faites votre première requête. Remplacez vm_live_... par votre propre clé.
- 3Vous recevez vos sites. L'identifiant de cette liste sert dans chaque autre route.
curl https://www.vermeld.be/api/v1/projecten \
-H "Authorization: Bearer vm_live_..." \
-H "Accept-Language: fr"{
"gegevens": [
{
"id": "6f2c1d4e-8b3a-4c55-9e21-0d7a4b9c3e18",
"domein": "bakkerijjan.be",
"merknaam": "Bakkerij Jan",
"aangemaakt_op": "2026-03-04T09:11:22.000Z"
}
],
"gemeten_op": null
}Authentification
Envoyez votre clé dans un en-tête. Jamais dans l'adresse: celle-ci se retrouve dans les journaux du serveur.
Une clé commence par vm_live_ suivi de 32 caractères. Une clé d'une autre forme reçoit aussitôt geen_sleutel.
Authorization: Bearer vm_live_...Forme des réponses
Une forme en cas de succès et une en cas d'erreur. Votre code n'a ainsi pas à deviner par route où se trouve la réponse.
gemeten_op vaut null tant que rien n'a été mesuré. Cela vaut partout: null veut dire pas mesuré, zéro veut dire mesuré et absent. Confondre les deux fait plonger un score à cause d'une panne chez nous.
L'explication suit votre Accept-Language: néerlandais ou français. Le code dans fout ne change jamais. Branchez dessus et pas sur la phrase.
{
"gegevens": ...,
"gemeten_op": "2026-08-26T04:12:07.331Z"
}{
"fout": "onbekende_sleutel",
"uitleg": "Cette clé n'existe pas ou a été révoquée. Créez-en une nouvelle dans votre tableau de bord."
}Limites
60 requêtes par minute et par clé. Chaque réponse porte deux en-têtes: X-Vermeld-Limiet et X-Vermeld-Resterend. Vous n'avez donc pas besoin d'attendre un 429 pour savoir qu'il faut ralentir.
Si vous dépassez, vous recevez un statut 429 avec te_veel_verzoeken. Le compteur est par minute, donc attendre aide toujours.
HTTP/2 200
content-type: application/json
x-vermeld-limiet: 60
x-vermeld-resterend: 59
cache-control: no-storeErreurs
Une erreur a toujours un statut HTTP et un code fixe. Les voici tous.
| Code | Description |
|---|---|
geen_sleutelHTTP 401 | Aucun en-tête Authorization valable n'était joint. |
onbekende_sleutelHTTP 401 | La clé n'existe pas ou a été révoquée. |
pakket_zonder_apiHTTP 403 | Votre formule n'inclut pas l'API. Elle fait partie de Croissance et Bureau. |
onbekend_projectHTTP 404 | Ce projet n'existe pas. Ou il n'appartient pas à cette clé. Nous ne faisons volontairement pas la différence: sinon l'API révélerait quels identifiants existent. |
te_veel_verzoekenHTTP 429 | Plus de 60 requêtes dans cette minute avec cette clé. Attendez la minute suivante. |
curl https://www.vermeld.be/api/v1/projecten \
-H "Accept-Language: fr"{
"fout": "geen_sleutel",
"uitleg": "Envoyez votre clé dans Authorization: Bearer vm_live_..."
}Sites
GET /api/v1/projecten
Vos sites. Commencez ici: les identifiants de cette liste servent dans les autres routes.
Paramètres
Aucun. La clé détermine quels sites vous recevez.
Champs
gegevens est une liste. Chaque élément a ces champs.
| Champ | Description |
|---|---|
idstring | L'identifiant fixe du site. Il va dans le chemin de chaque autre route. |
domeinstring | Le domaine du site. |
merknaamstring | null | Le nom de marque que nous cherchons. Null s'il n'est pas renseigné. |
aangemaakt_opstring | Quand le site a été ajouté. ISO 8601 en UTC. |
Erreurs possibles
curl https://www.vermeld.be/api/v1/projecten \
-H "Authorization: Bearer vm_live_..." \
-H "Accept-Language: fr"{
"gegevens": [
{
"id": "6f2c1d4e-8b3a-4c55-9e21-0d7a4b9c3e18",
"domein": "bakkerijjan.be",
"merknaam": "Bakkerij Jan",
"aangemaakt_op": "2026-03-04T09:11:22.000Z"
}
],
"gemeten_op": null
}Score Vermeld
GET /api/v1/projecten/{id}/score
Le score Vermeld et les quatre volets, avec leur poids.
Paramètres
| Paramètre | Description |
|---|---|
idstring · obligatoire · dans le chemin | L'identifiant d'un site. Vous l'obtenez avec la route projecten. |
Champs
gegevens est un seul objet avec ces champs.
| Champ | Description |
|---|---|
domeinstring | Le domaine du site. |
scoreinteger | null | Le score Vermeld, de 0 à 100. Null tant qu'aucune analyse n'est terminée. |
onderdelenarray | Les quatre volets du score. Toujours les quatre. |
onderdelen[].string | aanwezigheid, citeerbaarheid, entiteit ou agent. Branchez là-dessus. |
onderdelen[].string | Le nom du volet. Toujours en néerlandais. |
onderdelen[].integer | Le poids dans le score. Ensemble ils font 100. |
onderdelen[].integer | null | De 0 à 100. Null si ce volet n'a pas été mesuré. |
Erreurs possibles
curl https://www.vermeld.be/api/v1/projecten/6f2c1d4e-8b3a-4c55-9e21-0d7a4b9c3e18/score \
-H "Authorization: Bearer vm_live_..." \
-H "Accept-Language: fr"{
"gegevens": {
"domein": "bakkerijjan.be",
"score": 61,
"onderdelen": [
{
"sleutel": "aanwezigheid",
"naam": "Aanwezigheid",
"gewicht": 40,
"score": 45
},
{
"sleutel": "citeerbaarheid",
"naam": "Citeerbaarheid",
"gewicht": 25,
"score": 72
},
{
"sleutel": "entiteit",
"naam": "Entiteit",
"gewicht": 20,
"score": 80
},
{
"sleutel": "agent",
"naam": "Agent-klaar",
"gewicht": 15,
"score": null
}
]
},
"gemeten_op": "2026-08-26T04:12:07.331Z"
}Visibilité
GET /api/v1/projecten/{id}/zichtbaarheid
Les quatre mesures, au total et par canal. Seule la mesure la plus récente par question et par canal compte: sinon vous mesurez votre propre rythme de mesure.
Paramètres
| Paramètre | Description |
|---|---|
idstring · obligatoire · dans le chemin | L'identifiant d'un site. Vous l'obtenez avec la route projecten. |
Champs
gegevens est un seul objet avec ces champs.
| Champ | Description |
|---|---|
domeinstring | Le domaine du site. |
vermeldingsgraadinteger | null | Dans quel pourcentage des mesures réussies votre nom figure dans la réponse. Null sans mesure réussie. |
citatiegraadinteger | null | Dans quel pourcentage des mesures réussies une de vos pages figure comme source sous la réponse. Jamais plus haut que le taux de mention. |
gemiddelde_positieinteger | null | Où tombe votre nom en moyenne: 0 tout au début, 100 à la fin. Uniquement sur les réponses qui vous citent. |
toonverdelingobject | Combien de fois chaque ton est apparu: positief, neutraal ou negatief. |
aandeel_in_de_stemobject | Qui prend quelle part de toutes les mentions. En pourcentage. Vous-même figurez sous jij. Total 100. Vide tant que personne n'a été cité. |
per_kanaalarray | Les mêmes chiffres par canal. |
per_kanaal[].string | Le canal, comme chatgpt ou perplexity. |
per_kanaal[].integer | Le nombre de mesures réussies sur ce canal. |
per_kanaal[].integer | null | Comme ci-dessus, pour ce canal. |
per_kanaal[].integer | null | Comme ci-dessus, pour ce canal. |
per_kanaal[].integer | null | Comme ci-dessus, pour ce canal. |
Erreurs possibles
curl https://www.vermeld.be/api/v1/projecten/6f2c1d4e-8b3a-4c55-9e21-0d7a4b9c3e18/zichtbaarheid \
-H "Authorization: Bearer vm_live_..." \
-H "Accept-Language: fr"{
"gegevens": {
"domein": "bakkerijjan.be",
"vermeldingsgraad": 38,
"citatiegraad": 12,
"gemiddelde_positie": 64,
"toonverdeling": {
"positief": 7,
"neutraal": 4
},
"aandeel_in_de_stem": {
"jij": 22,
"Bakkerij Peeters": 41,
"Bakkerij Wouters": 37
},
"per_kanaal": [
{
"kanaal": "chatgpt",
"gemeten": 25,
"vermeldingsgraad": 44,
"citatiegraad": 16,
"gemiddelde_positie": 58
}
]
},
"gemeten_op": "2026-08-26T04:12:07.331Z"
}Questions
GET /api/v1/projecten/{id}/vragen
Les questions que nous posons, avec leur dernier résultat par canal. La réponse brute n'y figure pas: c'est du texte d'un tiers et cela rend la réponse dix fois plus lourde.
Paramètres
| Paramètre | Description |
|---|---|
idstring · obligatoire · dans le chemin | L'identifiant d'un site. Vous l'obtenez avec la route projecten. |
Champs
gegevens est une liste. Chaque élément a ces champs.
| Champ | Description |
|---|---|
idstring | L'identifiant fixe de la question. |
vraagstring | La question telle que nous la posons aux assistants. |
labelstring | null | Le type de question: keuzehulp, lokaal, prijs, probleem ou merk. Null s'il n'y en a pas. |
laatst_gemeten_opstring | null | Quand cette question a été mesurée pour la dernière fois. Null si ce n'est pas encore fait. |
kanalenarray | La mesure la plus récente par canal. |
kanalen[].string | Le canal, comme chatgpt ou perplexity. |
kanalen[].boolean | null | Si votre nom figure dans la réponse. Null si la mesure n'a pas réussi. |
kanalen[].boolean | null | Si une de vos pages figure comme source sous la réponse. Null si la mesure n'a pas réussi. |
kanalen[].integer | null | Où tombe votre nom, de 0 à 100. Null si votre nom n'est pas dans le texte. |
kanalen[].string | null | positief, neutraal ou negatief. Null sans jugement. |
kanalen[].string | gelukt, mislukt, overgeslagen ou geen_antwoord. Avec geen_antwoord, le canal n'a affiché aucune réponse IA pour cette question. |
kanalen[].string | Quand cette mesure a eu lieu. |
Erreurs possibles
curl https://www.vermeld.be/api/v1/projecten/6f2c1d4e-8b3a-4c55-9e21-0d7a4b9c3e18/vragen \
-H "Authorization: Bearer vm_live_..." \
-H "Accept-Language: fr"{
"gegevens": [
{
"id": "9a41c0b2-5d7e-4f18-a3c6-2b8e1f0d9c47",
"vraag": "beste bakker in Leuven",
"label": "lokaal",
"laatst_gemeten_op": "2026-08-26T04:09:55.000Z",
"kanalen": [
{
"kanaal": "chatgpt",
"genoemd": true,
"geciteerd": false,
"positie": 41,
"toon": "positief",
"status": "gelukt",
"gemeten_op": "2026-08-26T04:09:55.000Z"
}
]
}
],
"gemeten_op": "2026-08-26T04:09:55.000Z"
}Concurrents
GET /api/v1/projecten/{id}/concurrenten
Qui est cité à côté de vous. Uniquement des noms que nous avons vus nous-mêmes dans une réponse.
Paramètres
| Paramètre | Description |
|---|---|
idstring · obligatoire · dans le chemin | L'identifiant d'un site. Vous l'obtenez avec la route projecten. |
Champs
gegevens est une liste. Chaque élément a ces champs.
| Champ | Description |
|---|---|
naamstring | Le nom du concurrent. |
domeinstring | null | Son domaine. Null si nous ne le connaissons pas. |
vermeldingeninteger | Combien de fois nous l'avons vu dans une réponse. |
eerst_gezien_opstring | Quand nous l'avons vu pour la première fois. |
laatst_gezien_opstring | Quand nous l'avons vu pour la dernière fois. |
bronstring | gevonden si nous l'avons vu nous-mêmes dans une réponse. handmatig si vous l'avez ajouté. |
Erreurs possibles
curl https://www.vermeld.be/api/v1/projecten/6f2c1d4e-8b3a-4c55-9e21-0d7a4b9c3e18/concurrenten \
-H "Authorization: Bearer vm_live_..." \
-H "Accept-Language: fr"{
"gegevens": [
{
"naam": "Bakkerij Peeters",
"domein": "bakkerijpeeters.be",
"vermeldingen": 34,
"eerst_gezien_op": "2026-04-02T00:00:00.000Z",
"laatst_gezien_op": "2026-08-26T04:09:55.000Z",
"bron": "gevonden"
}
],
"gemeten_op": "2026-08-26T04:09:55.000Z"
}Points à corriger
GET /api/v1/projecten/{id}/werkpunten
Les constatations ouvertes de votre dernière analyse. Avec leur origine: ce champ dit quelle règle prescrit cette constatation.
Paramètres
| Paramètre | Description |
|---|---|
idstring · obligatoire · dans le chemin | L'identifiant d'un site. Vous l'obtenez avec la route projecten. |
Champs
gegevens est une liste. Chaque élément a ces champs.
| Champ | Description |
|---|---|
idstring | L'identifiant fixe du point à corriger. |
onderdeelstring | null | Le volet du score auquel il appartient: aanwezigheid, citeerbaarheid, entiteit ou agent. Null s'il n'appartient à aucun volet. |
categoriestring | Le groupe du contrôle, comme ai. |
ernststring | kritiek, hoog, gemiddeld, laag ou info. |
titelstring | Ce qui ne va pas en une phrase. Suit votre Accept-Language. |
bewijsstring | null | Ce que nous avons vu. Null s'il n'y a rien à montrer. |
adviesstring | null | Ce que vous pouvez y faire. Null s'il n'y a pas de conseil. |
paginastring | null | L'adresse de la source sur laquelle ce conseil s'appuie. Null s'il n'y en a pas. |
herkomststring | null | Quelle règle prescrit ce seuil. Null si le seuil vient de nous. |
Erreurs possibles
curl https://www.vermeld.be/api/v1/projecten/6f2c1d4e-8b3a-4c55-9e21-0d7a4b9c3e18/werkpunten \
-H "Authorization: Bearer vm_live_..." \
-H "Accept-Language: fr"{
"gegevens": [
{
"id": "3c88a9e2-1f4b-4d6a-8c07-5e9b2d1a7f30",
"onderdeel": "agent",
"categorie": "ai",
"ernst": "kritiek",
"titel": "GPTBot est refusé dans robots.txt",
"bewijs": "User-agent: GPTBot / Disallow: /",
"advies": "Supprimez la règle ou limitez-la à /admin.",
"pagina": "https://platform.openai.com/docs/bots",
"herkomst": null
}
],
"gemeten_op": "2026-08-26T04:12:07.331Z"
}Serveur MCP
Les six mêmes routes existent aussi sous forme de serveur MCP. Votre assistant IA lit alors vos chiffres lui-même. La même clé, les mêmes limites et la même réponse que ci-dessus. Chaque message envoyé au serveur compte dans la limite.
Dans Claude Code, vous l'ajoutez avec une seule commande. Un autre client, comme Cursor, reçoit l'adresse et l'en-tête dans ses réglages.
Un client qui ne se connecte qu'avec OAuth et ne laisse pas définir d'en-tête ne fonctionne pas encore. Nous n'avons pas d'OAuth.
Les outils portent le nom des routes. Tous sauf projecten demandent un project_id.
| Outil | Description |
|---|---|
projecten | Sites |
scoreproject_id: string · obligatoire | Score Vermeld |
zichtbaarheidproject_id: string · obligatoire | Visibilité |
vragenproject_id: string · obligatoire | Questions |
concurrentenproject_id: string · obligatoire | Concurrents |
werkpuntenproject_id: string · obligatoire | Points à corriger |
claude mcp add --transport http vermeld https://www.vermeld.be/api/mcp \
--header "Authorization: Bearer vm_live_..."{
"mcpServers": {
"vermeld": {
"url": "https://www.vermeld.be/api/mcp",
"headers": {
"Authorization": "Bearer vm_live_..."
}
}
}
}