Chaque changement sur vos numéros, signé et envoyé chez vous.
Dix événements couvrent les messages, les statuts, les réactions, les discussions, les groupes et les numéros eux-mêmes. Chacun arrive en POST JSON signé, relancé pendant 24 heures jusqu'à ce que votre endpoint réponde.
- Signature
- HMAC-SHA256
- Répondre sous
- 10 secondes
- Relances
- 24 heures, jusqu'à 10 tentatives
- Livraison
- Au moins une fois
Dix événements
Filtrez chaque endpoint par événement et par numéro. Un filtre vide reçoit tout, y compris les événements et les numéros ajoutés plus tard.
Messages
Discussions et groupes
Numéros
message.received
Un message est arrivé sur l'un de vos numéros, en discussion individuelle ou en groupe.
data est l'objet Message complet, le même que renvoie GET /v1/messages/{id}.
webhook.testn'est envoyé que parPOST /v1/webhooks/endpoints/{id}/testou par « Envoyer un test » dans le tableau de bord, jamais par un vrai changement.- Les événements décrivent l'activité en direct. Les messages importés de l'historique d'un numéro lors de sa liaison, ou récupérés après une coupure, se lisent via l'API mais ne sont pas envoyés en événements.
Vérifiez chaque requête
Vérifiez la signature sur le corps brut avant de l'analyser, et rejetez tout ce qui date de plus de cinq minutes.
En-têtes
Content-TypeToujours du JSON.application/jsonUser-AgentIdentifie notre émetteur.relay-webhooks/1X-Relay-EventLe nom de l'événement, identique à event dans le corps.message.receivedX-Relay-DeliveryL'identifiant de livraison, tel qu'il apparaît dans le journal des livraisons.dlv_01a1cf082f8a…X-Relay-TimestampSecondes Unix au moment où cette tentative a été signée.1794474782X-Relay-Signaturev1= suivi du HMAC-SHA256 en hexadécimal.v1=5f2b…Le schéma v1
- Lisez le corps brut en octets, avant toute analyse JSON.
- Concaténez
X-Relay-Timestamp, un point et le corps brut. - Calculez le HMAC-SHA256 avec le secret de l'endpoint (toute la chaîne
whsec_…), encodez-le en hexadécimal et préfixezv1=. - Comparez le résultat avec
X-Relay-Signatureen temps constant. - Rejetez un horodatage à plus de 300 secondes (5 minutes) de votre horloge.
Le secret (whsec_…) s'affiche à l'ajout de l'endpoint et à chaque rotation. Une rotation invalide l'ancien secret immédiatement : mettez à jour votre récepteur juste après.
Livraison
Au moins une fois, signée à chaque tentative, relancée avec un délai croissant pendant 24 heures.
Répondez par un 2xx en moins de 10 secondes, puis faites le travail. Les délais dépassés, les erreurs réseau, 408, 429 et 5xx sont relancés ; tout autre statut est définitif, et les redirections ne sont pas suivies.
Chaque tentative envoie le même corps. Seuls X-Relay-Timestamp et X-Relay-Signature changent.
- Tentative 109:12:44X-Relay-Timestamp: 1794474764Prochaine tentative dans 30 s
http_503Votre endpoint a répondu 503. - Tentative 209:13:14X-Relay-Timestamp: 1794474794Prochaine tentative dans 2 min
timeoutPas de réponse en 10 secondes. - Tentative 309:15:24X-Relay-Timestamp: 1794474924Livrée
200Votre endpoint a répondu 200.
evt_ à chaque tentative.Calendrier des relances
Chaque attente varie de 10 % au plus, dans un sens ou dans l'autre. Quand la tentative suivante tomberait plus de 24 heures après l'événement, la livraison se termine en échec.
Doublons
Les livraisons sont « au moins une fois ». L'id du corps (evt_…) et l'en-tête X-Relay-Delivery (dlv_…) restent identiques d'une relance ou d'une relivraison à l'autre : gardez les identifiants déjà traités et ignorez les répétitions. Deux endpoints qui reçoivent le même changement ont chacun leur livraison, avec son propre identifiant.
Désactivation automatique
Après 10 livraisons d'affilée terminées en échec, chacune après ses 24 heures de relances, l'endpoint est désactivé et vous recevez une notification dans l'application. Une coupure plus courte ne le déclenche jamais, et toute réussite remet le compteur à zéro.
Corrigez l'endpoint, puis réactivez-le depuis le tableau de bord ou avec enabled: true. Rien n'est envoyé tant qu'il est désactivé : relivrez les événements manqués depuis le journal des livraisons.
Relivrer et tester
Le journal des livraisons, dans le tableau de bord ou via GET /v1/webhooks/deliveries, montre chaque tentative et la réponse de votre endpoint. Relivrer une livraison terminée renvoie le même corps et le même identifiant, avec une nouvelle fenêtre de 24 heures ; la demande répond 409 webhook_delivery_pending tant que la livraison est encore en cours.
Un test envoie un événement webhook.test signé à un endpoint, même désactivé.
Règles de l'endpoint
Une URL https:// sur l'internet public. Les hôtes privés, de bouclage, link-local et internes au cluster sont refusés à l'enregistrement (422 invalid_webhook_url) et revérifiés avant chaque envoi (destination_not_public, sans relance). Nous ne nous connectons qu'à l'adresse vérifiée, et les redirections ne sont pas suivies.
Ordre
Un webhook vous dit que quelque chose a changé. L'ordre d'arrivée n'est pas garanti.
- Les événements peuvent arriver dans le désordre, surtout après des relances. Comparez
created_at, ou relisez la ressource, avant d'écraser un état plus récent. - Le statut d'un message ne fait qu'avancer :
pending → sent → delivered → read, oufailed. Ignorez un statut qui le ferait reculer. message.reactionetgroup.participantsportent la liste complète actuelle ;chat.updated,group.updatedetnumber.statusportent l'état après le changement. Gardez le plus récent seloncreated_at.
Envoyez-vous un événement de test.
Ajoutez votre endpoint dans Paramètres › Développeurs › Webhooks, envoyez un test et regardez-le arriver dans le journal des livraisons.