is_ownership_verified: true, ce qui permet à un transfert Travel Rule lié de sortir de l’état UNCONFIRMED_OWNERSHIP.
Quand Didit le crée pour vous
Vous avez rarement besoin de créer une session vous-même. Lorsqueauto_wallet_verification est activé dans vos paramètres Travel Rule (valeur par défaut), Didit crée automatiquement une session de widget à la création de la transaction, chaque fois qu’un transfert nécessite une preuve de contrôle du portefeuille par l’utilisateur final :
- Le transfert est en
UNCONFIRMED_OWNERSHIP: le portefeuille de la contrepartie a été déclaré auto-hébergé lors de la soumission. - Le transfert est sortant et en
COUNTERPARTY_VASP_NOT_FOUND: aucun VASP de contrepartie n’a pu être identifié, la preuve de propriété est donc la seule voie restante pour mener le transfert à terme.
action_required de la transaction (type: "wallet_ownership", avec l’url à ouvrir), et les SDK la lancent automatiquement lors de la soumission côté client.
Les transferts entrants que Didit crée pour vous (un enregistrement sunrise, une requête TRP entrante ou la portion entrante du rail INTERNAL) ne reçoivent jamais de session générée automatiquement, même lorsqu’ils passent en UNCONFIRMED_OWNERSHIP.
Créez une session manuellement avec POST /v3/travel-rule/widget-session/ lorsque vous souhaitez pré-vérifier un portefeuille avant qu’un transfert n’existe, lorsque auto_wallet_verification est désactivé, ou pour l’un de ces transferts entrants.
Ce que cela prouve
Le widget propose jusqu’à quatre méthodes de preuve. Les méthodes qui apparaissent dépendent de la façon dont vous avez créé la session et de vos paramètres Travel Rule :Contrat de vérification de la signature de message
La soumission de la signature renvoie200 avec status: "VERIFIED" dès qu’elle prouve le contrôle du portefeuille.
Elle renvoie 400 et laisse la preuve ouverte, afin que le client puisse signer à nouveau, avec l’une de ces valeurs de code :
Contrat de vérification du test Satoshi
La vérification d’un dépôt de test Satoshi est asynchrone, car la transaction doit être visible on-chain, puis confirmée. La soumission dutxid du dépôt renvoie 200 avec status: "PENDING" tant que le dépôt n’est pas encore confirmé on-chain. Le txid est conservé, et non abandonné.
Elle renvoie 200 avec status: "VERIFIED" dès que le dépôt est confirmé.
Elle renvoie 400 avec status: "REJECTED" pour un dépôt réellement incorrect : envoyé depuis un autre portefeuille, montant différent de celui attendu vers l’adresse de dépôt, antérieur au défi, ou transaction ayant déjà prouvé un autre portefeuille. La preuve est close, et le client peut en démarrer une nouvelle tant que la session dispose encore de tentatives.
Un dépôt qui n’est pas encore indexé renvoie également 200 avec status: "PENDING", et un échec de recherche côté Didit renvoie 400 avec le code DEPOSIT_LOOKUP_FAILED. Dans les deux cas, la preuve reste ouverte et Didit continue de vérifier.
Elle renvoie 410 si la fenêtre de test expire avant qu’un dépôt valide ne soit constaté.
Une fois un txid soumis, une tâche en arrière-plan revérifie le dépôt en attente toutes les cinq minutes et complète la preuve après la confirmation de la transaction. Le client n’a donc pas besoin de soumettre à nouveau le txid.
Lorsque vous transmettez un satoshi_deposit_address, le expires_at de la session du widget est prolongé à au moins la fenêtre de test Satoshi de 24 heures, afin que le dépôt ait le temps de se confirmer avant l’expiration de la session elle-même.
Déroulement
1
Générer une session de widget
Appelez
POST /v3/travel-rule/widget-session/ avec le portefeuille que vous devez faire vérifier. Vous pouvez éventuellement le lier à un transfert afin que celui-ci avance automatiquement une fois la propriété du portefeuille prouvée.2
Ouvrir l'URL renvoyée
Envoyez votre client à l’
url de la réponse. Il y réalise une preuve sans compte Didit ni clé API : le token présent dans l’URL sert d’authentification.3
Détecter la fin du processus
Lorsqu’une preuve est vérifiée, le widget marque l’entrée du carnet d’adresses comme vérifiée et, si la session est liée à un transfert, fait avancer celui-ci. Surveillez
travel_rule.status.updated (pour les transferts liés) ou interrogez le contexte du widget.Générer une session de widget
Cet exemple lie la session au transfert déclaré vers un portefeuille auto-hébergé du guide Travel Rule, de sorte quewallet_address correspond à l’adresse de destination de ce transfert.
Une session liée à un transfert n’accepte que les preuves portant sur l’adresse de la contrepartie de ce transfert.
url renvoyée dans la réponse telle quelle : ne la construisez pas vous-même.
Ouvrir l’URL renvoyée
Détecter la fin du processus
Le widget expose un endpoint de lecture public, identifié par le token. Interrogez-le pour suivre la progression, ou appuyez-vous sur les webhooks lorsque la session est liée à un transfert :completed_atprend une valeur non nulle dès qu’une preuve est vérifiée.- Chaque entrée de
proofscontient les champs nécessaires à sa méthode : une preuveSATOSHI_TESTajoutedeposit_address,expected_amountet son propreexpires_at; une preuveMESSAGE_SIGNINGajoutechallenge, la chaîne que le client signe. - Une preuve
SATOSHI_TESTpeut rester àstatus: "PENDING"tant que son dépôt est visible on-chain mais non confirmé, sans aucune action requise de votre part ni de celle du client : voir contrat de vérification du test Satoshi ci-dessus. - Lorsque la session a été générée avec un
transaction_id, la vérification de la preuve fait avancer le transfert lié, et, sur une application en production, le webhooktravel_rule.status.updatedest déclenché. Privilégiez le webhook plutôt que l’interrogation. Une demandeTRPentrante est approuvée et renvoyée à l’expéditeur, et passe àCOMPLETEDune fois cette approbation transmise. Tout autre transfert enUNCONFIRMED_OWNERSHIP(ou un transfert entrantON_HOLD) passe àCOMPLETED, ou àCOUNTERPARTY_MISMATCHED_DATAlorsque le nom du bénéficiaire ne correspond pas à celui du titulaire du portefeuille, et un dépôt sunrise réglé qui aboutit passe àFINISHED. Un transfert sortant enCOUNTERPARTY_VASP_NOT_FOUNDpasse àCOMPLETED. - Une preuve
SCREENSHOTreste àstatus: "PENDING"dans ce contexte, même après que vous avez confirmé la propriété. Vous l’approuvez avecPOST .../travel-rule/ownership/, qui n’accepte que les transferts en attente de confirmation de propriété. Une capture d’écran n’a donc aucun chemin d’approbation sur une session sans transfert lié, ou sur une session liée à un transfert sortant enCOUNTERPARTY_VASP_NOT_FOUND: désactivezallow_screenshot_proofsi ces sessions ne doivent pas proposer cette option. - Après une preuve rejetée, la session offre une nouvelle tentative tant qu’il en reste.
max_attempts,attempts_usedetattempts_remainingindiquent le nombre de tentatives, une preuve rejetée contientrejection_reason, et lorsqueattempts_remainingvaut0, toute nouvelle preuve renvoie409: vous devez alors générer une nouvelle session. - L’endpoint de contexte renvoie
404pour un token inconnu et410lorsque la session a expiré sans être terminée.
Il n’existe aucune dépendance à usage unique ici : le widget et votre backend convergent vers le même état durable (l’entrée vérifiée du carnet d’adresses et le statut du transfert). La situation reste donc toujours récupérable en cas de webhook perdu ou d’onglet fermé, en relisant le transfert ou le contexte du widget.
Localisation et personnalisation
Le widget s’affiche en 54 langues, selon le chemin de langue du lien (ou la langue par défaut du navigateur). Lorsque la marque blanche est activée pour votre application, le widget reprend automatiquement la personnalisation de votre parcours de vérification : logo, couleurs de marque, style des boutons et du panneau, police personnalisée, favicon et nom public de votre application dans le titre. Aucune configuration distincte : la même personnalisation que celle définie pour les sessions KYC s’applique ici. Un utilisateur qui revient sur un lien déjà terminé revoit l’écran de fin ; si vous avez transmis uncallback_url, le widget le renvoie vers cette URL.
Les liens expirés affichent un écran d’expiration personnalisé qui invite l’utilisateur à demander un nouveau lien.
Générez une nouvelle session avec POST /v3/travel-rule/widget-session/ pour cet utilisateur : renvoyer un transfert avec action: "resend" n’en crée pas une.
Prochaines étapes
Travel Rule
Le cycle de vie complet des échanges, les rails, les paramètres et les flux de réception.
Carnet d'adresses des portefeuilles
Enregistrez les portefeuilles que vous contrôlez afin que les transferts entrants soient associés à ces portefeuilles.
Webhooks
Abonnez-vous à travel_rule.status.updated pour réagir lorsqu’une preuve fait progresser un transfert.
SDK natifs
Ouvrez l’URL du widget dans le navigateur système, et non dans la webview du SDK.