Avant de commencer
- Utilisez la clé API d’une application sandbox. Les applications de production n’atteignent jamais le VASP de test.
- Activez Travel Rule avec un nom légal :
- Vous pouvez éventuellement abonner une destination de webhook à
travel_rule.status.updated. Le sandbox l’envoie, marqué"environment": "sandbox".
Le Didit Test VASP
GET /v1/sandbox/scenarios/ renvoie le profil du VASP de test et chaque scénario de son objet travel_rule. Vos tests peuvent ainsi lire les valeurs de déclenchement au lieu de les coder en dur.
Toutes les valeurs sont des données de test. Le VASP de test n’est membre d’aucun réseau Travel Rule, et aucun résultat en sandbox ne montre qu’une contrepartie ou un réseau réel peut être atteint.
Scénarios sortants
Chaque transactiontravelRule sortante d’une application sandbox qui nécessite un échange est envoyée au VASP de test. Choisissez l’issue avec l’adresse du portefeuille du bénéficiaire (la casse n’a pas d’importance) ou avec un nom de bénéficiaire de la forme Didit Test VASP <suffix>. Si les deux sont renseignés, le portefeuille prime. Si aucun des deux n’est renseigné, ou si le suffixe ne figure pas dans le tableau, le transfert se termine avec accept.
Un transfert qui ne nécessite aucun échange n’atteint jamais le VASP de test : c’est le cas d’un montant inférieur à votre threshold_amount, d’un transfert vers le propre portefeuille vérifié de votre utilisateur, ou d’un transfert vers un portefeuille de contrepartie que vous avez déclaré auto-hébergé. Un VASP de contrepartie choisi manuellement dans l’annuaire par vous ou par votre utilisateur final est jugé selon les routes qu’une application de production utiliserait. Si son entrée en comporte une (un endpoint TRP vérifié, un réseau sur lequel votre application envoie, ou un contact de conformité), le transfert est envoyé au VASP de test. Si elle n’en comporte aucune, le transfert se termine avec COUNTERPARTY_VASP_NOT_FOUND, comme il le ferait sur une application de production.
rail de la transaction est TEST_VASP, et la liste des transferts indique Didit Test VASP comme VASP bénéficiaire. Suivez cette transaction dans les webhooks travel_rule.status.updated, ou lisez GET /v3/transactions/{transaction_id}/.
name_mismatchcompare le nom du bénéficiaire que vous avez envoyé avec le nom du titulaire que le VASP de test renvoie, selon votre règle de nom pour le type d’entité du bénéficiaire (matching_rules.individual.nameoumatching_rules.company.name, qui suiventname_matching_strictnesstant que vous ne les définissez pas). Le transfert et l’entrée de chronologie qui l’a décidé portentname_match(aveccompared_with: "counterparty_vasp") etdata_matchavecmismatched_fields: ["name"].not_reachablemaintient la transaction enAWAITING_COUNTERPARTYpendant les nouvelles tentatives, avecdelivery.statusàRETRYINGetlast_erroràtest VASP is not answering, puis la passe enCOUNTERPARTY_VASP_NOT_REACHABLE. Envoyez ensuite{"action": "resend"}pour la relancer.self_hostedfait répondre au VASP de test que le portefeuille est auto-hébergé. Enregistrez la preuve avec le widget de vérification de propriété du portefeuille (généré pour vous lorsqueauto_wallet_verificationest activé) ou avecPOST .../travel-rule/ownership/et{"confirmed": true}: le portefeuille est ajouté à votre carnet d’adresses sous le nom du bénéficiaire, et la correspondance des noms décide de la transaction. Une correspondance la complète et marque le portefeuille comme vérifié.{"confirmed": false}la refuse.
Transferts entrants depuis le VASP de test
Pour tester le côté réception, demandez au VASP de test de vous envoyer un transfert avecPOST /v3/travel-rule/test-vasp/inbound/. Indiquez l’un des portefeuilles du carnet d’adresses de votre propre application : le transfert est traité par le même chemin entrant que pour un transfert réel, avec votre carnet d’adresses, votre mode d’actionnariat et vos règles de nom.
La réponse
201 contient transaction_id, txn_id, scenario, travel_rule_status, detail, test_vasp: true et le transfert travel_rule. Une application en production reçoit 400 ("The Didit Test VASP is only available on sandbox applications."), une autre valeur de scenario renvoie 400, et une application dont Travel Rule est désactivée reçoit 409.
Prenez une décision concernant un transfert en attente avec
POST .../travel-rule/ownership/, comme pour un transfert réel : {"confirmed": true} le finalise et {"confirmed": false} le refuse.
Un dépôt que vous signalez vous-même avec POST /v3/transactions/ n’est pas un transfert envoyé par le VASP de test : il reste AWAITING_COUNTERPARTY dans l’attente de son VASP d’origine, et sa chronologie cite l’endpoint indiqué plus haut. Il ne déclenche aucun webhook avant son expiration, après confirmation_timeout_hours. POST /v3/travel-rule/inbound/ finalise toujours un enregistrement post-dépôt par rapport à votre carnet d’adresses, comme sur une application en production.
Webhooks en sandbox
travel_rule.status.updated se déclenche pour les applications sandbox à chaque changement de statut, avec "environment": "sandbox". Un transfert auquel le VASP de test a répondu porte aussi rail: "TEST_VASP", test_vasp: true et test_vasp_scenario. Le reste de la sandbox se comporte comme décrit dans Surveillance des transactions en sandbox : les règles ne sont pas évaluées, transaction.created et transaction.status.updated ne sont pas envoyés, et rien n’est facturé.
Ce que le sandbox ne prouve pas
- Qu’une contrepartie réelle, une adhésion à un réseau ou l’hôte TRP public de Didit fonctionne. Aucun d’entre eux n’est contacté.
- Que vos identifiants réseau sont valides. Une adhésion connectée est confirmée par son premier échange en production.
- Les routes de l’annuaire des VASP réels : sur une application sandbox, chaque route affiche
unavailableavecreason: sandbox_application, et chaque ligne affichereachable: false.