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’objetdata 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) :
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
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
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 :Réessais et garanties de livraison
- En cas de
5xx, de404, 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 stockantevent_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.