Aller au contenu

Aperçu des webhooks

Les webhooks envoient des événements vers votre serveur en temps réel, ce qui vous évite de sonder l’API. Lorsqu’un événement se produit dans un restaurant — une réservation est créée, un client est mis à jour, un avis arrive — nous envoyons une requête HTTP POST à une URL que vous contrôlez, accompagnée d’un événement JSON décrivant ce qui s’est passé.

L’API est en bêta. La gestion des points de terminaison en libre-service depuis le back-office (URL, sélection des événements, secret de signature, et un journal de livraison avec relecture manuelle) est prévue mais pas encore disponible. Pour l’instant, les points de terminaison de webhook sont fournis sur demande : l’équipe Service enregistre l’URL de votre point de terminaison et les événements que vous souhaitez, et renvoie un secret de signature (whsec_…) servant à vérifier les signatures.

Chaque point de terminaison est épinglé à une version de l’API à sa création, afin que la forme de la charge utile que vous recevez reste stable.

Chaque livraison est un objet JSON avec cette enveloppe :

{
"id": "evt_1K8xQ2m4Vd0pErJ7sN1aZ9bQ",
"object": "event",
"type": "reservation.updated",
"created": "2026-06-27T17:30:00Z",
"livemode": true,
"api_version": "2026-06-27",
"data": {
"object": { "object": "reservation", "id": "resv_…" },
"previous_attributes": { "party_size": 2 }
}
}
ChampDescription
idIdentifiant d’événement unique (evt_…). Utilisez-le pour dédupliquer (voir ci-dessous).
objectToujours "event".
typeLe type d’événement, par ex. reservation.updated. Voir le catalogue des événements.
createdLe moment où l’événement a été émis — ISO-8601 en UTC (un suffixe Z). Voir la note sur les fuseaux horaires ci-dessous.
livemodeToujours true pour les événements réels.
api_versionLa version dans laquelle la charge utile est rendue (la version épinglée du point de terminaison).
data.objectUn instantané complet de la ressource concernée, dans la même forme que l’API.
data.previous_attributesUniquement sur reservation.updated — une table des champs modifiés vers leurs valeurs précédentes. Omis sur tout autre type d’événement.

Renvoyez rapidement un code de statut 2xx (idéalement en quelques secondes) pour accuser réception. Effectuez le vrai travail de manière asynchrone. Toute réponse non 2xx, un délai d’expiration ou une erreur de connexion est traité comme une livraison échouée et fera l’objet d’une nouvelle tentative.

La livraison est au moins une fois. Le même événement peut être livré plus d’une fois (par exemple, si votre serveur est lent à accuser réception et que nous réessayons, ou après une erreur réseau transitoire). Dédupliquez sur l’id de l’événement (evt_…) : enregistrez les identifiants que vous avez traités et ignorez les répétitions. Rendez votre gestionnaire idempotent.

Les événements ne sont pas garantis d’arriver dans l’ordre où ils se sont produits. Par exemple, vous pourriez recevoir reservation.seated avant reservation.confirmed. Ne présumez pas de l’ordre. Lorsqu’une décision dépend de l’état actuel, traitez l’événement comme un indice et récupérez la dernière version de la ressource depuis l’API, ou réconciliez à l’aide du updated_at de chaque ressource.

Nouvelles tentatives et désactivation automatique

Section intitulée « Nouvelles tentatives et désactivation automatique »

Si une livraison échoue, nous réessayons avec un délai exponentiel sur environ 3 jours. Si toutes les tentatives échouent pendant toute cette fenêtre (le point de terminaison reste injoignable ou continue de renvoyer des erreurs), le point de terminaison est automatiquement désactivé et une alerte est levée. Vous devrez corriger le point de terminaison et le faire réactiver. Pour récupérer les événements manqués pendant qu’un point de terminaison était hors service, relisez les données avec updated_since.

Les réservations importées n’émettent pas de webhooks

Section intitulée « Les réservations importées n’émettent pas de webhooks »