Passer au contenu principal
Transaction Monitoring émet trois événements webhook qui couvrent ensemble tout le cycle de vie d’une transaction, ainsi qu’un quatrième optionnel qui annonce de nouvelles suggestions de règles. Tous reposent sur l’infrastructure webhook standard de Didit, avec une signature HMAC-SHA256 : consultez la référence des webhooks pour les destinations, la signature et les tests.

Catalogue des événements

Les événements au niveau des entités (user.status.updated, business.status.updated) peuvent aussi se déclencher en conséquence d’une activité de transaction : voir webhooks d’entités.
Les applications sandbox n’émettent pas de webhooks transaction.created ni transaction.status.updated. Pour tester ces événements, utilisez une application en environnement de production ou API & Webhooks → Try Webhook dans la console. Les échanges Travel Rule en sandbox émettent bien des webhooks travel_rule.status.updated avec environment: sandbox ; utilisez le Didit Test VASP pour tester un échange avant la mise en production.

Enveloppe

Les webhooks Didit utilisent un corps plat : les champs de l’événement se trouvent au premier niveau, à côté des champs d’enveloppe, et il n’existe pas d’objet data imbriqué. Chaque livraison contient :

Structure des payloads

transaction.created et transaction.status.updated

Les deux événements partagent un même payload : un résumé compact, ainsi que le bloc action_required (ou null) :
Le payload est volontairement léger : à réception, récupérez l’enregistrement complet avec GET /v3/transactions/{transaction_id}/. Il renvoie le détail complet (parties, rule_runs, provider_results, travel_rule, cost_breakdown, decision_reason_code), y compris pourquoi le statut a changé.

transaction_rule_suggestions.created

Cet événement concerne votre ensemble de règles et non une transaction unique : il ne contient donc aucun identifiant de transaction. Il ne contient jamais de données personnelles : uniquement des identifiants de suggestion, des types, des titres et des compteurs.
Les champs d’enveloppe habituels (event_id, timestamp, application_id, environment) sont ajoutés au corps.

travel_rule.status.updated

Un événement est envoyé à chaque transition, y compris le passage à FINISHED, CANCELLED ou EXPIRED ; une fois qu’un transfert atteint l’un de ces états, aucun autre événement Travel Rule n’est envoyé pour lui. Un événement peut répéter le statut de l’événement précédent, par exemple lorsqu’un renvoi ne trouve de nouveau aucun rail et que le transfert reste en COUNTERPARTY_VASP_NOT_FOUND. rail vaut INTERNAL, TRP, GTR, TRUST, VERIFYVASP, SYGNA, EMAIL, TEST_VASP (un transfert sandbox auquel le Didit Test VASP a répondu, qui porte aussi test_vasp: true et test_vasp_scenario), ou "" tant qu’aucun rail n’est sélectionné (toujours "" pour les enregistrements sunrise). À la création d’une transaction, lors d’un enregistrement sunrise, d’une demande TRP entrante ou de la branche entrante sur le rail INTERNAL, Didit envoie d’abord transaction.created, puis les événements travel_rule.status.updated de la transaction. Une règle qui modifie le statut de la transaction pendant cette étape peut aussi envoyer transaction.status.updated avant transaction.created. Un enregistrement sunrise rattaché à une transaction de dépôt que vous avez déjà créée n’envoie aucun transaction.created. Chaque webhook est livré et réessayé indépendamment : un événement réessayé peut donc arriver après un événement plus récent. Utilisez transaction_id comme clé de votre gestionnaire et relisez la transaction lorsque vous avez besoin de son état actuel.

Exemples de parcours de statut

Approbation simple

Examen puis approbation

Vérification renforcée

Transfert Travel Rule

Les deux premiers événements proviennent de la même requête, et transaction.created est mis en file d’attente en premier. Chaque webhook est livré indépendamment : ne vous fiez donc pas à l’ordre d’arrivée. Un transfert envoyé via TRUST ne reçoit jamais d’événement COMPLETED, car TRUST ne renvoie rien que Didit puisse lire : il reste en AWAITING_COUNTERPARTY jusqu’à l’échéance de confirmation, puis passe à EXPIRED. Via GTR, VerifyVASP et Sygna Bridge, Didit lit la réponse de la contrepartie sur le réseau, et l’événement suit cette réponse.

Vérification de la signature

Chaque livraison est signée en HMAC-SHA256 avec le secret partagé de la destination et contient trois en-têtes de signature ainsi qu’un horodatage :
Consultez la référence des webhooks pour le code de vérification complet, y compris le contrôle de fraîcheur de l’horodatage.

Réessais et garanties de livraison

  • En cas de 5xx, de 404, de délai d’attente dépassé ou d’échec de connexion, Didit réessaie jusqu’à 2 fois : environ 1 minute après l’échec initial, puis environ 4 minutes supplémentaires.
  • Les livraisons réessayées réutilisent le même event_id : effectuez la déduplication à l’aide de ce champ dans votre gestionnaire.
  • Après le dernier échec, la livraison de cet événement s’arrête et votre organisation en est informée ; les destinations ne sont jamais désactivées silencieusement.
  • Renvoyez rapidement un 2xx (mise en file d’attente, puis traitement) : des accusés de réception tardifs risquent de provoquer des délais d’attente dépassés et des livraisons en double.

Idempotence

Traitez chaque webhook une seule fois en stockant event_id dans votre propre système de déduplication. Une nouvelle livraison du même événement est possible lorsque votre endpoint accuse réception tardivement ou se déconnecte en cours de requête.

Abonnement

Étapes suivantes

Référence des webhooks

Destinations, signature, réessais.

Statuts

Machine à états complète.

Guide d'intégration

Gérer les webhooks en production.
Dernière modification le 7 novembre 2026