Skip to main content
Ce format est gelé. Il ne concerne que les webhooks créés avant la V1 (leur carte affiche Ancien format dans Paramètres → Intégrations → Webhooks). Tout nouveau webhook, et tout endpoint créé par l’API, utilise la V1. Les webhooks à l’ancien format ne reçoivent que les événements de réservation : les événements client n’ont pas de corps à l’ancien format.
La livraison, les reprises, le journal des livraisons et la liste des parcours émetteurs sont les mêmes pour les deux formats : voir la référence webhooks.

Passer à la V1

  1. Adaptez le récepteur pour vérifier EatNow-Signature (voir Vérifier la signature) et lire le corps V1 : type au lieu de event, data.object (la réservation de l’API partenaire : party_size, start_at…) au lieu de data.reservation, data.previous_attributes (les seuls champs modifiés) au lieu de previous_data. Le secret ne change pas.
  2. Dans Paramètres → Intégrations → Webhooks, cliquez sur Passer au V1 sur le webhook. Ce changement est définitif.
  3. Les livraisons déjà présentes dans le journal gardent leur corps et leur signature à l’ancien format, renvois compris ; tout ce qui est publié ensuite est en V1.

En-têtes

Les en-têtes personnalisés de la configuration sont appliqués en premier ; ceux ci-dessus le sont ensuite et l’emportent toujours (noms comparés sans tenir compte de la casse) : un en-tête personnalisé ne peut pas les remplacer. Tout en-tête personnalisé dont le nom commence par X-EatNow- est ignoré. La signature porte sur le corps brut uniquement, sans préfixer le timestamp de l’en-tête.

Payload

Exemple de création avec des identifiants et dates illustratifs :
La réservation contient toujours id, restaurantId, status, group_size, reservation_date, reservation_time, created_at, updated_at, source, tags et metadata (qui peut valoir null). Ce format diffère de l’API partenaire : group_size et date/heure séparées remplacent party_size et start_at. reservation_date représente le jour de service du restaurant, normalement sérialisé à minuit ISO. Conservez sa partie YYYY-MM-DD ; ne convertissez pas ce minuit UTC vers un autre fuseau pour en déduire le jour. reservation_time est une heure locale HH:mm. Ne traitez pas cette paire comme un instant UTC. created_at, updated_at et timestamp sont des instants UTC. Les champs facultatifs dépendent de la réservation :
  • customer : identifiant, external_id nullable, nom et coordonnées/langue disponibles.
  • tables : objets id et name, sans salle imbriquée.
  • room : id et name multilingue, pas une simple chaîne.
  • waiter : id et name.
  • payments : id, amount, currency, status, provider, provider_id facultatif et created_at.
  • custom_message, allergies et total_amount_paid : omis lorsqu’ils sont vides ou à zéro par le transformateur actuel. Une absence ne signifie pas « inchangé ».
Les montants sont en unités mineures : total_amount_paid et payments[].amount sont des entiers en centimes (5000 = 50,00 dans la devise du paiement). Divisez par 100 pour les afficher. previous_data accompagne la plupart des modifications. Pour une action d’une équipe, un appel partenaire ou un automatisme, c’est la réservation complète avant le changement. Pour un changement venu d’une caisse (NowOS), il porte les champs propres de la réservation avant le changement (statut, date, heure, couverts…) avec les relations actuelles (client, tables, salle).
  • shift : peut apparaître dans le test ; les événements ordinaires l’omettent actuellement. N’exigez pas ce champ.
Les messages peuvent contenir des données personnelles et de paiement, quels que soient les scopes d’une clé API. Limitez l’accès aux corps et aux secrets, et évitez la journalisation des payloads complets.

Vérifier la signature

Calculez HMAC-SHA256 sur les octets exacts reçus, avec le secret du webhook. Rejetez une signature absente ou malformée, puis comparez les condensats en temps constant. Décodez le JSON uniquement après vérification : le reconstruire peut modifier les espaces ou l’ordre des champs et invalider une signature légitime.

Exemple de récepteur Express

Enregistrez la fonction Node.js dans verify-signature.js. Déclarez la route avec corps brut avant tout middleware express.json(). Cet exemple vérifie et journalise uniquement les identifiants : remplacez ce traitement de démonstration par votre traitement métier avant d’acquitter un événement en production. Chargez le secret depuis un stockage serveur sécurisé, sans le committer.