Deux réflexes couvrent l’essentiel : indexer vos lectures sur
content_revision (vous évitez les téléchargements inutiles, image, PDF ou Carte unifiée) et préférer les webhooks au polling (vous préservez vos quotas de requêtes). Le reste de cette page détaille les points plus fins.Checklist rapide
Clé d’API utilisée uniquement côté serveur, jamais exposée au client.
Réponses mises en cache et indexées sur
content_revision.Clé de cache déclinée par locale (
fr / en).Champs
nullable gérés explicitement dans le code.Prix lus comme des chaînes de caractères, pas des nombres.
Webhooks rendus idempotents via
X-LeCommis-Delivery.Signature HMAC des webhooks vérifiée à temps constant.
Réponse
2xx rapide au webhook, traitement en asynchrone.Webhooks préférés au polling de l’API.
Backoff appliqué sur les réponses
429.Détails
Garder la clé d'API côté serveur
Garder la clé d'API côté serveur
La clé d’API est un secret serveur-à-serveur. Appelez toujours Le Commis depuis votre backend et stockez la clé dans une variable d’environnement ou un gestionnaire de secrets. Ne l’embarquez jamais dans du JavaScript de navigateur, une application distribuée ou un dépôt public.
Authentification
Détails sur la clé
X-Api-Key et sa rotation.Mettre en cache et indexer sur content_revision
Mettre en cache et indexer sur content_revision
Chaque ressource expose un entier monotone
content_revision, identique pour tout l’établissement. Stockez la dernière valeur connue ; ne re-téléchargez le contenu que lorsqu’elle augmente. C’est le mécanisme recommandé d’invalidation de cache.content_revision
Le compteur de révision pour détecter les changements.
Décliner la clé de cache par locale
Décliner la clé de cache par locale
content_revision est commun à toutes les langues : la même valeur couvre fr et en. En revanche, le contenu des menus diffère selon la locale. Intégrez donc la locale dans votre clé de cache, par exemple au-bistrot:menus:fr:rev67 et au-bistrot:menus:en:rev67. Une seule notification de changement invalide les deux langues.Comportement de fallback i18n
Traductions, fallback
en vers fr et portée des fichiers du menu (champ assets).Gérer les champs nullable
Gérer les champs nullable
De nombreux champs peuvent être
null : description, category, website_url, menu_url, l’email et le téléphone de contact, les coordonnées de localisation, logo_url, master_menu_url (l’URL de la Carte unifiée), reference_date, le price d’un item, etc. Prévoyez systématiquement une valeur de repli ou un affichage conditionnel plutôt que d’afficher null ou de planter.Traiter les prix comme des chaînes
Traiter les prix comme des chaînes
Le
price d’un item est sérialisé en chaîne décimale ("12.50") et vaut null hors des items à la carte. Ne le convertissez pas naïvement en flottant si vous devez préserver l’exactitude monétaire ; conservez-le tel quel pour l’affichage et utilisez un type décimal pour les calculs.Rendre les webhooks idempotents
Rendre les webhooks idempotents
Un même événement peut être livré plusieurs fois (retries après timeout réseau). Utilisez l’en-tête
X-LeCommis-Delivery (identifiant unique de livraison) comme clé d’idempotence : enregistrez les identifiants déjà traités et ignorez les doublons.Webhooks
Cycle de vie des livraisons et retries.
Vérifier la signature HMAC
Vérifier la signature HMAC
Chaque webhook est signé. Reconstituez
signed_payload = "{X-LeCommis-Timestamp}.{corps brut}", calculez HMAC_SHA256(signing_secret, signed_payload) en hexadécimal préfixé sha256=, et comparez à X-LeCommis-Signature à temps constant. Rejetez aussi les requêtes dont le timestamp s’écarte de plus de quelques minutes pour vous protéger du rejeu.Sécurité des webhooks
Vérification de signature et tolérance d’horloge.
Répondre vite, traiter en asynchrone
Répondre vite, traiter en asynchrone
Le succès d’une livraison est défini par une réponse
2xx. Répondez immédiatement (accusé de réception) puis effectuez le travail lourd (re-fetch de l’API, purge de cache, rebuild) en tâche de fond. Une réponse lente peut provoquer un timeout côté Le Commis et déclencher un retry inutile.Préférer les webhooks au polling
Préférer les webhooks au polling
N’interrogez pas l’API en boucle pour détecter un changement : vous épuiseriez vos quotas. Laissez le webhook
establishment.content_updated vous signaler quand re-lire l’API, et limitez-vous aux ressources listées dans changed_resources.Appliquer un backoff sur 429
Appliquer un backoff sur 429
En cas de
429 Rate limit exceeded, attendez avant de réessayer, avec un délai croissant (backoff exponentiel) et un peu de jitter. N’enchaînez pas les tentatives immédiates.Quotas de requêtes
Quotas et stratégie de backoff.