Journal des changements
Chaque modification du contrat public de l'API v1, datée, la plus récente en tête.
Documentation de l'APIJournal des changements
Une version publiée n'évolue que par ajout : le guide de versionnage détaille ce qui peut changer et ce qui ne change jamais.
27 octobre 2026
Empreinte de la description OpenAPI : sha256:a65a25a7b626
- Nouveau champ
externalIdsur les contacts : l'identifiant du contact dans votre CRM ou votre caisse, 128 caractères au plus et unique par établissement. Il se transmet àPOST /v1/contactset se modifie ou s'efface parPATCH /v1/contacts/{contactId}.POST /v1/contactsreconnaît d'abord un contact existant par cet identifiant, avant l'email et le téléphone. Il est renvoyé dans les objetsContactetEventContact, recherchable parGET /v1/contacts?externalId=et suivi parcontact.updated. Les réponses d'enquête (SurveyResponse, événementsurvey_response.completed) portent deux nouveaux champs,contactExternalIdetvisitExternalId(l'identifiant externe du passage qui a déclenché l'enquête), et leur champchannelprend deux nouvelles valeurs :qretnfc, pour les réponses arrivées par le QR code ou la puce NFC de l'enquête. Ces réponses sont anonymes : leurcontactIdvautnull.
Empreinte de la description OpenAPI : sha256:190efdd4e278
- Les événements de contact (
contact.created,contact.updated,contact.unsubscribed) ne portent plus le téléphone : leur objet suit la nouvelle formeEventContact, identique àContactsansphone. Le téléphone se lit parGET /v1/contacts/{contactId}avec le droitcontacts:read. Les charges utiles déjà conservées ont été expurgées. Par ailleurs, un avis (GET /v1/reviews,GET /v1/reviews/{reviewId}) porte un nouveau champdraft, le brouillon de réponse en cours (ReplyDraft) ounull, présent seulement pour une clé qui areplies:writeouai:generateet jamais dans les événements : un outil peut relire le brouillon qu'il vient de déposer ou de générer.
26 octobre 2026
Empreinte de la description OpenAPI : sha256:100319d11a31
- Nouvel événement
survey_response.completed(API/v1/eventset webhooks) : un client a terminé une enquête de satisfaction. L'objet porté est la réponse dans sa nouvelle forme publiqueSurveyResponse(enquête, contact, canal, langue, note de recommandation et catégorie NPS, réponses question par question). Les réponses partielles et les envois de test ne produisent aucun événement.
25 octobre 2026
Empreinte de la description OpenAPI : sha256:d8eb6b6fb75e
- Les événements de contact (
contact.created,contact.updated,contact.unsubscribed), qui portent des données personnelles, exigent désormais aussi le droitcontacts:read: sans ce droit,GET /v1/eventsles omet, etGET /v1/events?types=contact.…,GET /v1/events/{eventId}sur un événement de contact etPOST /v1/webhook-endpointsabonné à un typecontact.*répondent403 insufficient_scope. Une clé ne lit plus par les événements une base clients qu'elle ne peut pas lire parGET /v1/contacts.
Empreinte de la description OpenAPI : sha256:e186712a1523
- Les opérations de lecture des établissements, de leurs statistiques, des avis, des retours privés et des contacts passent en version stable (
x-stability: stable), commeGET /v1/health,GET /v1/openapi.jsonetGET /v1/me. Elles ne subiront plus aucun changement cassant en v1, et toute dépréciation sera annoncée 12 mois à l'avance. Le journal d'événements, les webhooks, les écritures et la publication sur Google restent en bêta.
Empreinte de la description OpenAPI : sha256:6137c9c2b9c0
- Publication sur Google, en version bêta :
POST /v1/reviews/{reviewId}/reply(scopereplies:publish) publie une réponse par le même chemin que l'application et renvoie l'avis répondu. L'établissement doit avoir autorisé la publication par l'API dans l'application (403 google_publishing_not_authorized), l'en-têteIdempotency-Keyest obligatoire (400 invalid_requestsans lui), une réponse sensible exigeacknowledgedSensitivity: true(422 unprocessable), les écritures Google d'un établissement sont limitées (429 rate_limited) et la publication par l'API peut être coupée pour tous les comptes (503 google_publishing_disabled). Les opérations de brouillon et de publication sont regroupées sous l'étiquette « Réponses aux avis ».
Empreinte de la description OpenAPI : sha256:2af79d83939e
- Écritures, en version bêta, toutes refusées en
403 tenant_read_onlysur un compte en lecture seule et rejouables avecIdempotency-Key:POST /v1/contacts(crée un contact dans la base clients d'un établissement,201, ou complète celui qui a le même email ou téléphone,200; scopecontacts:write),PATCH /v1/contacts/{contactId}(scopecontacts:write),POST /v1/visits(enregistre un passage, un seul parexternalIddans un établissement même sansIdempotency-Key:201puis200; scopevisits:write),POST /v1/promo-codes/redeem(valide un code promo comme au comptoir ;409 promo_code_already_redeemed,409 promo_code_expired,404 not_found, tentatives limitées par clé ; scopepromo_codes:redeem),POST /v1/reviews/{reviewId}/reply-drafts(brouillon IA, une unité du crédit IA mensuel,402 ai_credits_exhausted; scopeai:generate, coût de débit 5) etPUT /v1/reviews/{reviewId}/reply-draft(brouillon rédigé,201ou200; scopereplies:write). Tout consentement transmis exige sa preuve (collectedAt,proofText), sinon400 invalid_request; une désinscription prime toujours. Nouvelle origineapidans les sources de consentement des contacts et des passages, etcontact.createdd'origineapipour un contact créé par l'API.
24 octobre 2026
Empreinte de la description OpenAPI : sha256:c3243efa00eb
- Webhooks, en version bêta (scope
webhooks:manage) :GET /v1/webhook-endpoints,POST /v1/webhook-endpoints(renvoie une seule fois le secret de signaturewhsec_…),DELETE /v1/webhook-endpoints/{endpointId}etPOST /v1/webhook-endpoints/{endpointId}/test(envoie un événementwebhook.testet renvoie le résultat). Un point de réception reçoit les événements choisis de tous les établissements du compte, enPOSTHTTPS signé au format Standard Webhooks (webhook-id,webhook-timestamp,webhook-signature), au moins une fois et sans garantie d'ordre, relancé pendant 72 heures puis désactivé. Au plus 10 points de réception par compte (409 webhook_endpoint_limit_reached) ; une adresse non HTTPS, une IP, un nom interne ou une adresse privée sont refusés (422 unprocessable). Les événements sont désormais produits dès qu'une clé API ou un point de réception du compte est actif.
Empreinte de la description OpenAPI : sha256:d60253b81fe9
- Journal d'événements, en version bêta :
GET /v1/eventsetGET /v1/events/{eventId}(scopeevents:read). Chaque fait du compte (nouvel avis, avis modifié ou supprimé de la plateforme, réponse publiée, retour privé reçu, contact créé, modifié ou désinscrit) produit un seul événement, quel que soit le chemin qui l'a causé, avec son origine (sync,import,app,autopilot,api,system) et l'objet concerné dans sa forme publique. Les événements se lisent dans l'ordre de publication à partir de la positionafter;nextCursorn'est jamaisnullet se conserve d'une synchronisation à l'autre. FiltrestypesetestablishmentId, rétention de 30 jours. - Le champ
typedes erreurs pointe vers la documentation publiquehttps://mabellenote.com/developers/errors#<code>.
Empreinte de la description OpenAPI : sha256:91914f649b48
- Toute opération à clé peut répondre
503 service_unavailableavecRetry-Afterquand l'admission de la requête échoue de façon passagère, par exemple sous une forte rafale d'appels simultanés. La requête n'a eu aucun effet : la renvoyer après le délai indiqué. La limite de 120 appels par minute et par clé se compte désormais par minute calendaire (UTC) :RateLimit-Resetdonne le nombre de secondes jusqu'à la minute suivante.
Empreinte de la description OpenAPI : sha256:64146cc11f26
- Lecture des ressources du compte, en version bêta :
GET /v1/establishments,GET /v1/establishments/{establishmentId}etGET /v1/establishments/{establishmentId}/stats(scopeestablishments:read,stats:readpour les statistiques),GET /v1/reviewsetGET /v1/reviews/{reviewId}(reviews:read),GET /v1/feedbacksetGET /v1/feedbacks/{feedbackId}(feedbacks:read),GET /v1/contactsetGET /v1/contacts/{contactId}(contacts:read). Les listes sont paginées par curseur opaque (limitjusqu'à 100,nextCursor), les dates sont au format ISO 8601 en UTC, et un établissement déconnecté reste lisible jusqu'à sa date de purgescheduledPurgeAt.
Empreinte de la description OpenAPI : sha256:e00be79eda1d
- Authentification par clé API du compte (
Authorization: Bearer mbn_live_…) etGET /v1/me, qui décrit le compte, la clé et sa limite de débit. Limite de 120 appels par minute et par clé, annoncée par les en-têtesRateLimit-Limit,RateLimit-RemainingetRateLimit-Reset,Retry-Afteren cas de dépassement.
Empreinte de la description OpenAPI : sha256:1d7914e551eb
- Socle de l'API :
GET /v1/healthetGET /v1/openapi.json?lang=fr|en, erreurs au formatapplication/problem+json, identifiant de requêteX-Request-Idsur chaque réponse.

