Webhooks
Recevez des événements en temps réel par HTTP POST sur votre endpoint
Dernière mise à jour le
Les webhooks reçoivent des événements en temps réel par HTTP POST sur une URL que vous configurez. Les mêmes événements sont aussi disponibles via le SSE. Les webhooks sont configurés par organisation : chaque organisation a ses propres webhooks.
Gestion
Consultez la spécification OpenAPI pour les schémas complets de requête et de réponse.
| Méthode | Chemin | Description |
|---|---|---|
| GET | /api/orgs/:orgId/webhooks | Récupérer les webhooks |
| GET | /api/orgs/:orgId/webhooks/delivery-stats | Récupérer les statistiques de livraison |
| POST | /api/orgs/:orgId/webhooks/retry-deliveries | Réessayer des livraisons. Corps : mode (failed ou force) et, en option, id pour un seul webhook. failed : uniquement les livraisons définitivement échouées, immédiatement. force : les livraisons en attente et définitivement échouées, en arrière-plan, sans tenir compte des délais d'attente. |
| GET | /api/orgs/:orgId/webhooks/:id | Récupérer un webhook par ID |
| POST | /api/orgs/:orgId/webhooks | Créer un webhook |
| PATCH | /api/orgs/:orgId/webhooks/:id | Mettre à jour un webhook |
| DELETE | /api/orgs/:orgId/webhooks/:id | Supprimer un webhook |
Créer un webhook
POST /api/orgs/org_abc123/webhooks
Content-Type: application/json
x-api-key: tkn_xxx{
"url": "https://jouw-server.com/webhooks/tillor",
"subscribedEventKeys": ["invoice:created", "invoice:paid", "customer:updated"],
"enabled": true
}- url - endpoint HTTPS qui accepte les requêtes POST
- subscribedEventKeys - tableau de clés d'événements ou
["*"]pour tous les événements. La liste complète se trouve dans Tillor sous Menu du profil → Développeurs, à Ajouter un webhook → Événements abonnés.
Quelques événements sont si fréquents que vous ne pouvez pas les choisir et qu'ils n'arrivent pas non plus via *, comme l'état physique des barrières, la saisie dans la boîte de réception, les journaux du contrôleur et la présence de véhicules. Ils ne figurent pas dans la liste ci-dessous. Les événements que vous pouvez choisir dépendent aussi de vos permissions.
- enabled -
truepour activer la livraison
Vous ne pouvez choisir que les événements pour lesquels votre membre de l'organisation a la permission correspondante (par ex. les transactions bancaires pour bankAccountTransaction:*). Le joker * n'est disponible que pour les membres ayant un accès complet (*). En cas de combinaison invalide, l'API renvoie un message d'erreur. Un webhook transmet le payload complet, avec les données liées (comme le client d'une réservation). Vous devez donc aussi avoir le droit de lire ces domaines pour créer un webhook, modifier l'URL ou les événements, ou le réactiver.
Payload du webhook
Chaque livraison de webhook est un POST avec :
En-têtes :
Content-Type: application/jsonX-Webhook-Event-ID- ID unique et stable de cette livraison logique (même valeur lors des nouvelles tentatives)X-Webhook-Signature- signature HMAC-SHA256 du corps, au formatsha256=<hex>(voir Vérifier la signature)
Corps :
{
"event": "invoice:created",
"data": {},
"timestamp": 1735689600000,
"traceId": "4bf92f3577b34da6a3ce929d0e0e4736",
"spanId": "00f067aa0ba902b7",
"triggeredBy": {
"id": "usr_63x8jp68is",
"name": "Niels"
}
}| Champ | Type | Description |
|---|---|---|
event | string | Clé de l'événement (par ex. invoice:created) |
data | object | Payload propre à l'événement |
timestamp | number | Horodatage Unix (ms) de l'émission de l'événement |
traceId | string | ID de trace OpenTelemetry de l'action Tillor qui a provoqué cet événement. Transmettez-le au support ; ce n'est pas un secret. |
spanId | string (facultatif) | Span au sein de cette trace |
triggeredBy | object | null | Utilisateur qui a effectué l'action (id, name). null pour les actions système (cron, synchro bancaire, …) |
Consultez les exemples pour des payloads complets.
Vérifier la signature
Chaque webhook possède son propre secret de signature (64 caractères hexadécimaux, visible dans le tableau des webhooks via Afficher le secret de signature sur Menu du profil → Développeurs). Tillor signe chaque POST avec ce secret pour que vous puissiez vérifier que la requête vient bien de Tillor et que le corps n'a pas été modifié.
Comment Tillor signe :
- Calculez
HMAC-SHA256(signingSecret, raw_request_body)(hex en minuscules). - Envoyez-le sous la forme
X-Webhook-Signature: sha256=<hex>.
Comment vous vérifiez :
- Lisez le corps brut de la requête (avant l'analyse JSON, sinon le hash ne correspond pas).
- Calculez vous-même
HMAC-SHA256(signingSecret, raw_body)en hex. - Comparez avec la valeur après
sha256=de l'en-têteX-Webhook-Signatureà l'aide d'une comparaison en temps constant.
import crypto from "node:crypto";
function verifyTillorWebhook(rawBody, headerSignature, signingSecret) {
const expected = crypto.createHmac("sha256", signingSecret).update(rawBody).digest("hex");
const received = headerSignature.replace(/^sha256=/, "");
const a = Buffer.from(expected, "hex");
const b = Buffer.from(received, "hex");
return a.length === b.length && crypto.timingSafeEqual(a, b);
}Traitez le secret comme un mot de passe
Vous pouvez afficher le secret de signature dans Tillor via Afficher le secret de signature dans le tableau des webhooks. Conservez-le comme un secret (variable d'environnement, coffre-fort) et ne le journalisez jamais. Vous soupçonnez une fuite ? Supprimez le webhook et créez-en un nouveau ; vous obtenez ainsi un nouveau secret.
Comportement de livraison et nouvelles tentatives
- Répondez avec un statut 2xx pour confirmer la réussite.
- Si une livraison échoue (statut non 2xx, erreur réseau ou cible bloquée), Tillor réessaie automatiquement avec des intervalles de plus en plus longs. Chaque tentative réutilise le même payload, la même signature et le même ID d'événement (idempotent).
| Tentative | Délai depuis la tentative précédente |
|---|---|
| 1 | immédiat |
| 2 | 1 seconde |
| 3 | 2 secondes |
| 4 | 4 secondes |
| 5 | 8 secondes |
| 6 | 5 minutes |
| 7 | 30 minutes |
| 8 | 2 heures |
| 9 | 6 heures |
| 10 | 24 heures |
- Si l'une des tentatives réussit (2xx) → la livraison est terminée.
- Si la tentative 10 (après 24 h) échoue aussi → la livraison est définitivement marquée comme échouée et n'est plus réessayée.
- Si le webhook est entre-temps désactivé, Tillor arrête les nouvelles tentatives.
Idempotence
Chaque nouvelle tentative réutilise les mêmes X-Webhook-Event-ID et X-Webhook-Signature. Dédupliquez de votre côté sur cet en-tête afin qu'une nouvelle tentative réussie après un 200 tardif ne provoque pas de double traitement.
Notifications en cas d'échecs persistants
Si les livraisons vers un endpoint de webhook continuent d'échouer, Tillor envoie au maximum deux notifications par incident (par endpoint) :
- Après 5 minutes d'échecs persistants - e-mail à l'adresse e-mail de l'organisation (
supportEmail, sinonemail) et aux membres de l'organisation autorisés à modifier les paramètres de l'organisation, plus une notification push (si activée) pour ces membres. L'e-mail indique depuis quand les livraisons échouent. Les dates de l'e-mail utilisent le fuseau horaire défini sous Paramètres > Général (par défautEurope/Brussels). - En cas d'échec définitif - les mêmes destinataires reçoivent une notification lorsque le premier événement de cet incident est marqué comme définitivement échoué après toutes les tentatives.
Vous ne recevez pas de notification par événement échoué. Dès que toutes les livraisons échouées d'un endpoint sont résolues (livrées avec succès), un nouvel incident repart avec les mêmes règles.
Sur Menu du profil → Développeurs, le tableau des webhooks affiche pour chaque endpoint un état de livraison compact (nombre en attente de nouvelle tentative et définitivement échoués). Cliquez sur l'icône ℹ pour les détails, y compris le message d'erreur complet et le payload de la tentative la plus récente.
- Réessayer les livraisons échouées (↻) : uniquement les livraisons définitivement échouées de ce webhook.
- Forcer la nouvelle tentative (⚡) : toutes les livraisons en attente et définitivement échouées de ce webhook, quels que soient les délais planifiés. Tillor lance cela en arrière-plan afin que les grandes files d'attente (par ex. des milliers d'événements) soient traitées en toute sécurité.
- Forcer tout en haut à droite, à côté de Ajouter un webhook : la même chose pour tous les webhooks activés de l'organisation.
Types d'événements
Les clés d'événements utilisent le format entity:action ou entity:subresource:action. La liste complète, avec la permission par événement et un exemple de payload, se trouve dans l'index des événements. Cette page est générée à partir du code et est donc toujours complète. Les mêmes clés figurent dans Tillor sous Menu du profil → Développeurs, à Ajouter un webhook → Événements abonnés.
Webhooks ou SSE
| Cas d'usage | Recommandation |
|---|---|
| Intégration côté serveur | Webhooks - votre serveur reçoit des POST |
| Journalisation simple | Webhooks - configuration minimale |
| Tableau de bord en temps réel, mises à jour en direct dans l'application | SSE - une seule connexion, faible latence. |
| Nombreux types d'événements, filtrage côté client | SSE - utilisez le paramètre de requête events pour limiter le trafic. |
Voir aussi
- OpenAPI - spécification complète de l'API
- API HTTP - API REST et clés API
- SSE - mêmes événements via Server-Sent Events
- Automatisations - envoyer vos propres messages depuis une automatisation