Saltar al contingut principal
Didit executa l’intercanvi ordenant-beneficiari del GAFI i del Reglament de transferència de fons de la UE (TFR) per a transferències d’actius virtuals: busca un canal que arribi al VASP de la contrapart, negocia per aquest canal les dades requerides, fa el seguiment de l’intercanvi a través d’un cicle de vida de 13 estats i t’avisa quan l’intercanvi ha conclòs perquè puguis alliberar els fons on-chain.

Visió general

La Travel Rule del GAFI (Recomanació 16), implementada a la UE com a Reglament sobre transferències de fons, obliga un proveïdor de serveis d’actius virtuals emissor (el VASP ordenant) a recollir i transmetre la informació de l’ordenant i del beneficiari al proveïdor receptor (el VASP beneficiari) abans que una transferència d’actius virtuals es liquidi. A diferència de la majoria de jurisdiccions, el Reglament TFR de la UE s’aplica sense cap import mínim: totes les transferències de criptoactius entren en l’àmbit, no només les que superen un llindar de declaració. El producte Travel Rule de Didit és un intercanvi gestionat, no només un camp de dades:
  • Envies una transferència amb transaction_category: "travelRule".
  • Didit prova els canals en ordre de prioritat per arribar al VASP contrapart, executa l’intercanvi sobre el primer que hi arriba i, quan l’altra part retorna un nom de beneficiari, el compara amb el que has enviat.
  • Només quan l’intercanvi arriba a COMPLETED has de difondre la transferència a la blockchain.
  • Després informes el hash de la transacció on-chain a Didit per tancar l’intercanvi com a FINISHED.
Aquesta versió inclou set canals, provats en estricte ordre de prioritat: el primer que pot arribar a la contrapart guanya. Els canals de xarxa (GTR, TRUST, VERIFYVASP, SYGNA) necessiten una membresia de xarxa per part de l’emissor, i avui aquesta membresia ha de ser la teva pròpia. Connecta les credencials de la teva membresia a Marketplace de la consola (categoria Travel Rule networks), i les teves transferències viatjaran amb la teva pròpia identitat de xarxa. Didit no té cap membresia de plataforma per a cap de les quatre xarxes avui, i està fent l’alta com a proveïdor en totes elles. Fins que es completi aquesta alta, platform_available és false per a les quatre, el mode didit de la configuració (encaminament mitjançant la membresia de plataforma de Didit) no està disponible per a cap xarxa, i disabled_networks no té res per desactivar. Una membresia que connectes tu mateix sempre té prioritat sobre una membresia de plataforma. Cap membresia de xarxa s’inclou per defecte, inclosa GTR. Activar Travel Rule no activa GTR, TRUST, VerifyVASP ni Sygna. Consulta Obtenir la configuració de Travel Rule per veure els modes efectius de networks de la teva aplicació, i Xarxes de Travel Rule per saber a què arriba cada xarxa avui. Si les quatre informen unavailable, cap no pot encaminar un intercanvi: connecta la teva pròpia membresia a Marketplace, o utilitza una contrapart accessible per INTERNAL, TRP o EMAIL. En desar una membresia, el codi de participant ha de ser el teu: en desar-la, es respon amb 400 quan el codi és el codi propi de Didit en aquella xarxa, o un codi que ja té la membresia d’una altra aplicació. Una membresia GTR necessita la clau privada ed25519 (en base64), la clau pública de la qual està registrada al portal de GTR: xifra les dades personals que envies i desxifra les que reps. Una membresia VerifyVASP apunta al teu propi Enclave de VerifyVASP: la seva URL és la del teu Enclave, i el seu token és el que el teu Enclave presenta a Didit. Fins i tot amb la teva pròpia membresia, un canal de xarxa només encamina una transferència quan el seu beneficiary_data porta l’identificador de la contrapart en aquella xarxa (counterparty_gtr_vasp_code, counterparty_trust_membership_id, counterparty_verifyvasp_id o counterparty_sygna_vasp_code), o quan l’entrada de la contrapart al directori el llista en aquella xarxa (vegeu Rutes). platform_available indica si la membresia de plataforma està configurada, no és una comprovació de l’estat de la xarxa en directe. De la mateixa manera, connected vol dir que les credencials de la teva membresia estan desades i han superat la validació local; el primer intercanvi real les verifica amb la xarxa. Un mode didit o own no garanteix que la contrapart sigui accessible ni que el lliurament tingui èxit. Amb la teva pròpia membresia, Didit llegeix la resposta de la contrapart a través de GTR, VERIFYVASP i SYGNA a partir de la resposta de la xarxa o consultant la xarxa cada 5 minuts, cosa que completa o rebutja la transferència. TRUST només envia: una transferència enviada per aquesta xarxa roman a AWAITING_COUNTERPARTY fins que transcorre confirmation_timeout_hours, i després passa a EXPIRED i s’aplica el teu timeout_outcome. La recepció d’una transferència que un altre VASP t’envia per una xarxa encara no està activada, i cap intercanvi per una xarxa no s’ha completat encara contra una xarxa activa: consulta Xarxes de Travel Rule. Hi ha més xarxes - CODE (l’aliança coreana), TRISA, Notabene i Veriscope - que apareixen a Marketplace de la consola com a fitxes de sol·licitud d’accés. Didit encara no té cap integració amb elles, de manera que avui cap transferència no pot encaminar-se per aquestes xarxes. Quan cap de les set vies no pot resoldre una contrapart, Didit fa un pas més de resolució abans de rendir-se: l’atribució mitjançant analítica de blockchain. La cartera de destinació es contrasta amb les dades d’analítica de blockchain; quan la cartera pertany a una plataforma d’intercanvi o custodi conegut, Didit registra el VASP atribuït a la transferència, l’afegeix al directori i torna a executar les vies una vegada amb el nou nom. Consulta Atribució mitjançant analítica de blockchain per al comportament complet i els preus. Una transferència la destinació de la qual està declarada com a cartera autoallotjada omet les set vies - no hi ha cap VASP contrapart amb qui intercanviar - i passa directament a la prova de titularitat de la cartera de l’usuari final.
Didit també opera la part de l’intercanvi orientada a la contrapart: endpoints TRP públics d’identitat i de consulta que altres VASP criden per contactar amb tu, endpoints de callback i el flux de recollida per correu electrònic. Mai no els crides tu mateix, perquè són infraestructura gestionada, però la pàgina Interoperabilitat de Travel Rule els documenta tots perquè els VASP de la contrapart es puguin connectar amb tu. Tu només interactues amb Travel Rule a través dels endpoints /v3/ descrits en aquesta pàgina.

Què s’executa quan envies una transferència

Les comprovacions s’executen dins de l’única crida POST /v3/transactions/. Quan reps la resposta, el cribratge ja s’ha executat, la transferència està emmagatzemada i les regles ja s’han avaluat. L’intercanvi en si comença després de la resposta: Didit tria el canal i contacta la contrapart fora de la teva sol·licitud, de manera que cap xarxa ni cap contrapart no pot alentir ni fer fallar la creació. Cada canvi d’estat posterior arriba com a webhook travel_rule.status.updated que indica el canal, i l’objecte de transferència que retornen els endpoints de transferència Travel Rule inclou un camp delivery que mostra si el missatge ha arribat. No hi ha cap flux de treball que calgui consultar; les parts asíncrones són l’intercanvi, la resposta de la contrapart i qualsevol acció de l’usuari final. Pas a pas:
  1. Validació i vinculació del subjecte. Es valida el payload. Un transaction_id ja utilitzat a la teva aplicació es rebutja amb 400, i quan dues sol·licituds amb el mateix id entren en competència, una d’elles rep 409. El subject es vincula al teu perfil d’usuari o d’empresa mitjançant vendor_data, perquè la transferència aparegui en aquest perfil per al monitoratge. Un subjecte o un vendor_data de contrapart que estigui a la llista de bloqueig es rebutja amb 400, i no es crea cap transacció. Les carteres, els comptes bancaris, les IP i els dispositius a la llista de bloqueig es comproven al pas 6 i rebutgen la transacció allà, després que s’hagi executat l’encaminament.
  2. Enriquiment de dispositiu i xarxa. Les adreces IP de les parts s’enriqueixen amb dades geogràfiques, i qualsevol context de dispositiu (automàtic en l’enviament des de l’SDK) es normalitza al graf de dispositius, el mateix graf que alimenten les sessions KYC, de manera que “relacionats per dispositiu” funciona tant en l’alta com en les transaccions.
  3. Cribratge de criptoactius. Per a transferències cripto amb monitoratge activat, la cartera pertinent (o el hash on-chain) se sotmet a cribratge mitjançant l’analítica de blockchain abans que s’intercanviï res: exposició a sancions, proximitat amb mescladors, fons robats. Consulta Cribratge de criptomonedes i carteres.
  4. Transferència Travel Rule. El motor d’intercanvi comprova el llindar i respecta una declaració de cartera autoallotjada, i després emmagatzema la transferència: NOT_APPLICABLE per sota del teu llindar, UNCONFIRMED_OWNERSHIP per a una cartera autoallotjada declarada, COMPLETED quan l’altra cartera és la teva cartera verificada, i AWAITING_COUNTERPARTY en cas contrari, amb el seu canal encara buit. Cada canvi d’estat posa en cua un esdeveniment travel_rule.status.updated, i Didit l’envia després del transaction.created (pas 7).
  5. Creació de la verificació de titularitat de la cartera. Si la transferència necessita una prova de control per part de l’usuari final i auto_wallet_verification està activat, es crea una sessió del widget de titularitat de la cartera i es retorna a action_required.
  6. Avaluació de regles. S’executa cada regla activa: el paquet TFR de la UE reacciona a l’estat de la transferència establert al pas 4, les teves regles personalitzades veuen la sortida del cribratge del pas 3, i una regla pot retenir la transacció (IN_REVIEW), rebutjar-la o exigir una verificació addicional (AWAITING_USER).
  7. Facturació i notificació. Una transacció sortint es factura en una sola línia: la línia de Travel Rule quan ha iniciat un intercanvi, i Transaction Screening en cas contrari. Una transferència entrant no porta cap de les dues tarifes, i una aplicació sandbox mai no es cobra. La resposta es retorna, i transaction.created s’envia a les teves destinacions de webhook, seguit dels esdeveniments travel_rule.status.updated del pas 4.
  8. Encaminament, després de la resposta. Didit recorre els set canals per ordre de prioritat; si cap canal no dona resultat, l’atribució d’analítica de blockchain identifica la contrapart i l’encaminament pels canals es torna a executar una vegada. El primer canal accessible porta l’intercanvi: la transferència roman en AWAITING_COUNTERPARTY en aquest canal mentre la contrapart respon, es liquida de seguida quan es troba una contrapart INTERNAL (COMPLETED o COUNTERPARTY_MISMATCHED_DATA), o passa a COUNTERPARTY_VASP_NOT_FOUND quan cap canal arriba a la contrapart. Cada canvi dispara travel_rule.status.updated, i les teves regles s’executen de nou cada vegada que canvien l’estat o el canal. Una transferència que l’encaminament deixa en COUNTERPARTY_VASP_NOT_FOUND rep en aquest moment la seva sessió del widget de titularitat de la cartera (quan auto_wallet_verification està activat). Llegeix-la de l’action_required de la transacció amb Obtenir transacció.

Com cada pas correspon a les teves obligacions

Nota sobre les proves. Les aplicacions sandbox no avaluen regles ni facturen, i no envien webhooks transaction.created ni transaction.status.updated. Les transaccions sandbox es queden APPROVED tret que una transferència Travel Rule amb caducitat apliqui el teu timeout_outcome, i no es cobra res. El motor d’intercanvi de Travel Rule també s’executa en aplicacions sandbox quan Travel Rule està activat, amb una sola contrapart: cada intercanvi sortint va a Didit Test VASP pel canal TEST_VASP, que respon dins de Didit amb l’escenari que triïs, de manera que la transferència es completa, es rebutja, no coincideix, esdevé inaccessible, caduca o espera la titularitat de la cartera. Cap missatge de compliment no arriba mai a una VASP contrapart real, i els webhooks travel_rule.status.updated s’entreguen amb environment: sandbox. Entrant, la VASP de prova pot enviar-te una transferència (Activar una transferència entrant de Test VASP), i el registre (POST /v3/travel-rule/inbound/) es liquida amb la teva llibreta d’adreces de carteres com en una aplicació en producció: ON_HOLD, UNCONFIRMED_OWNERSHIP, COUNTERPARTY_MISMATCHED_DATA, o COMPLETED i després FINISHED. Consulta Prova Travel Rule en sandbox.

Cicle de vida

Cada transferència té un status que pren un dels 13 valors. L’intercanvi comença a AWAITING_COUNTERPARTY en el cas habitual, a NOT_APPLICABLE quan l’import és inferior al teu threshold_amount o quan una sol·licitud de pagament Lightning no indica cap beneficiari (vegeu Lightning), o a UNCONFIRMED_OWNERSHIP quan la destinació s’ha declarat com a cartera autoallotjada, i acaba en un dels estats finals: FINISHED, CANCELLED o EXPIRED. La transferència té la seva pròpia màquina d’estats, separada de l’estat de revisió de la transacció subjacent. Un estat d’intercanvi mai no canvia per si sol l’estat de la transacció, amb una excepció: una caducitat aplica el teu timeout_outcome configurat (o una política sunrise o de no resposta quan n’hi hagi una d’aplicable). Les teves regles es tornen a executar en cada transició, de manera que les regles de TFR de la UE o qualsevol regla que depengui de travel_rule_status poden moure la transacció, per exemple a IN_REVIEW. Una transferència que necessita una prova de control de la cartera per part de l’usuari final afegeix un bloc action_required a la transacció, però el seu status es manté tal com l’han deixat les teves regles. Llegeix l’estat de l’intercanvi des de travel_rule.status; llegeix el veredicte permetre / retenir / rebutjar des del propi status de la transacció. Cada transició (i cada estat informat passivament) es reflecteix també en els valors personalitzats de la transacció perquè les regles puguin basar-se en ells: custom_values.travel_rule_status (estat canònic), custom_values.travel_rule_rail (la via per la qual s’ha dut a terme l’intercanvi; buida fins que se n’hagi seleccionat una) i custom_values.travel_rule_regime (derivat de la jurisdiction de la teva configuració: SG → singapore, GB → uk, i qualsevol codi de membre de la UE o de l’EEE, com DE o FR, → eu; els codis sense assignar s’escriuen en minúscules, per exemple US → us. Un props.travel_rule_regime que tu mateix envies sempre té prioritat sobre el valor derivat).
No facis mai la difusió de la transacció abans de COMPLETED. Alliberar fons on-chain mentre una transferència està en AWAITING_COUNTERPARTY, UNCONFIRMED_OWNERSHIP o en qualsevol estat de discrepància o rebuig anul·la la finalitat de l’intercanvi. Condiciona el pas de difusió a status == "COMPLETED", i després crida PATCH .../travel-rule/ amb el payment_txn_id resultant per passar a FINISHED.
Les transicions d’un cop d’ull (CANCELLED també es pot assolir des de qualsevol estat no final amb action: "cancel"):

Lliurament i reintents

Didit envia cada missatge que una transferència ha d’enviar fora de la sol·licitud que l’ha originat, i el reintenta fins que l’altra part el rep. L’objecte de transferència que retornen Finalitza, cancel·la o reenvia, Confirma la titularitat i registre sunrise inclou l’últim missatge a delivery, i també ho fa l’objecte travel_rule incrustat de la transacció; és null quan la transferència mai no ha hagut d’enviar cap missatge. Una fallada de la qual la xarxa encara es pot recuperar (sense resposta a temps, una connexió fallida, HTTP 408, 429 o 5xx) es reintenta als 30 segons, 2 minuts, 10 minuts, 30 minuts i 1 hora. Quan un primer missatge falla definitivament (la xarxa l’ha rebutjat, o el sisè intent també ha fallat), la transferència passa a COUNTERPARTY_VASP_NOT_REACHABLE amb last_error al seu timeline, i pots reintentar-la amb action: "resend". Qualsevol altre missatge que falli definitivament es registra al timeline. delivery mai no substitueix el status de la transferència: llegeix l’estat de l’intercanvi des de status, i fes servir delivery per veure per què una transferència encara està en espera.

Valors d’estat antics

Si ja enviaves travel_rule_details.status abans d’aquesta versió, aquests valors continuen funcionant i es converteixen automàticament. També s’accepten les variants en camelCase de qualsevol estat (per exemple counterpartyVaspNotFound), tant en l’enviament com en els valors de condició de regla, i es normalitzen a la forma canònica:

Configuració

Configura el perfil del teu VASP i la política de negociació una vegada per aplicació amb GET/PUT /v3/travel-rule/settings/.
PUT és una actualització parcial: envia només els camps que vols canviar.

Rigor de la coincidència de noms

Modes de validació de la titularitat

ownership_validation_mode decideix quin grau de prova necessita la titularitat d’una cartera abans que una transferència es basi en ella: Una cartera es recorda per a cada usuari final un cop s’ha verificat. En FULL i SIMPLIFIED, una transferència posterior només la reutilitza quan una prova que el mode accepta per a aquella transferència la recolza. Quan inbound_auto_accept no té cap cartera a la llibreta d’adreces per fer coincidir, una cartera de criptomonedes que hagis registrat a les transaccions d’un únic usuari final identifica el titular. Didit afegeix aquesta cartera a la llibreta d’adreces de l’usuari final com la teva autodeclaració, verificada tret que el mode sigui FULL. Mai no afegeix una cartera que la llibreta d’adreces ja té registrada amb un altre nom de la mateixa cadena (eth i ethereum), inclosa una registrada com a pertanyent a un altre VASP. Les comprovacions d’adreces que altres VASP fan abans d’enviar (sobre GTR, Sygna i VerifyVASP) també segueixen el mode: en FULL, una cartera que l’usuari final només ha declarat no es reporta com a teva.

Compartició de dades

data_sharing_fields tria quins camps envia Didit a la contrapart sobre els teus propis usuaris, per separat per a persones físiques i empreses:
  • Les persones físiques poden compartir name, wallet_address, address, national_id, customer_identification, date_of_birth i place_of_birth. Les empreses fan servir els cinc primers.
  • name i wallet_address sempre s’envien.
  • Un tipus d’entitat que mai no has triat comparteix tots els camps. Una llista buida també és una elecció: comparteix només el nom i la cartera.
  • Un PUT fusiona per tipus d’entitat, de manera que enviar individual no modifica l’elecció company emmagatzemada.
  • Una elecció que no pot complir les obligacions de l’ordenant del teu règim jurisdiction (EU TFR o FATF Recommendation 16), inclosa una llista buida, es rebutja amb 400. Els errors apareixen sota data_sharing_fields, indexats per tipus d’entitat.

Coincidència per camp

matching_rules estableix el rigor amb què es compara cada camp de les dades de la contrapart amb el que tens:
Cada valor és NONE, STRICT, CONTAINS, DEFAULT o FUZZY. Per defecte, name segueix name_matching_strictness, date_of_birth i address són NONE, i account és STRICT. Un camp omès conserva el seu valor per defecte, i un camp que el tipus d’entitat no compara (una empresa no té date_of_birth) es rebutja amb 400.

Llindars per jurisdicció

threshold_amount existeix perquè l’abast de la Travel Rule varia segons el regulador. Didit té per defecte 0.00 (la posició de la UE), de manera que cada transferència s’intercanvia tret que n’augmentis el llindar de manera deliberada: Estableix threshold_amount amb la xifra del teu regulador; les transferències per sota es resolen a NOT_APPLICABLE sense intercanviar cap dada d’identitat. Els llindars canvien: confirma la xifra vigent amb el teu assessor de compliment en lloc de tractar aquesta taula com a assessorament legal.

Model de dades IVMS 101

L’estàndard del sector per a les dades que s’intercanvien sota la Travel Rule és IVMS 101 (interVASP Messaging Standard). travel_rule_details.originator_data i travel_rule_details.beneficiary_data són payloads de persona d’estil IVMS 101: Didit els envolta amb el sobre natiu de cada canal. El canal TRP intercanvia blocs IVMS101 (ivms101.2023, informat al camp ivms_version de la transferència), el canal Sygna la seva variant IVMS xifrada amb ECIES, i els canals GTR, TRUST i VERIFYVASP els seus propis sobres xifrats. Així, una única estructura de payload arriba a cada contrapart en el format que espera el seu protocol. Didit llegeix aquestes claus de cada payload de persona quan construeix el missatge IVMS 101: first_name i last_name (o un únic name o full_name), date_of_birth, place_of_birth, residence_country (o country), vendor_data (o customer_identification), i wallet_address. Dues regles pràctiques:
  • Escriptura llatina. IVMS 101 requereix valors en escriptura llatina; translitereu els noms que estan escrits originalment en una altra escriptura. La coincidència de noms de Didit compara conjunts de tokens normalitzats, de manera que les diferències d’ordre i de majúscules i minúscules no fan fallar un intercanvi, però sí que ho faran els sistemes d’escriptura diferents a banda i banda.
  • Envieu dades que hàgiu verificat. Quan el subjecte de vendor_data és un usuari amb una verificació KYC de Didit aprovada, Didit transmet la identitat verificada, no els valors que heu escrit: vegeu Dades verificades i procedència. Per a qualsevol altre subjecte, Didit transmet exactament el originator_data que envieu, de manera que el construïu a partir de la identitat que vàreu verificar en l’alta, no a partir d’un camp de formulari no verificat. Això és el que exigeix la formulació de la FATF «informació requerida i precisa de l’ordenant». Al canal INTERNAL, l’aplicació del beneficiari també rep el subject que heu enviat (nom, vendor_data, data de naixement, país i adreça) com a contrapart de la seva transacció entrant.

Dades verificades i procedència

Quan el subjecte d’una transferència és un dels vostres usuaris, una persona amb una verificació KYC aprovada, Didit construeix aquesta part de l’intercanvi a partir de les dades verificades:
  • l’ordenant d’una transferència de sortida que creeu amb POST /v3/transactions/;
  • el beneficiari d’una transferència entrant que informeu amb POST /v3/transactions/, o amb POST /v3/travel-rule/inbound/ quan el holder_vendor_data de la cartera coincident designa aquell usuari.
A POST /v3/transactions/, ambdós casos s’apliquen a una transacció amb transaction_category igual a travel_rule mentre la Travel Rule està activada. Els noms verificats, la data i el lloc de naixement, el número i el tipus de document, l’adreça i el país de residència (a partir d’aquella adreça) tenen prioritat sobre els valors que heu enviat. Un camp que la verificació no conté conserva el vostre valor, i també ho fa una adreça completa que vàreu enviar quan l’adreça verificada no és prou completa per transmetre’s. Les metadata de la transferència, a l’objecte travel_rule incrustat de la transacció, registren d’on prové cada camp i on els vostres valors difereixen:
*_provenance assigna a cada camp verified o caller, i *_verified_differences enumera cada camp on heu enviat un valor diferent del verificat, sense tenir en compte majúscules i minúscules, espais ni codis de país de dues o tres lletres. Mentre les dades d’una transferència entrant estan emmascarades, les diferències s’ometen. Didit calcula totes dues claus, de manera que les còpies d’aquestes claus, o de name_match, que envieu a travel_rule_details.metadata s’ignoren.

Enviar IVMS 101 directament

A més dels objectes plans originator_data i beneficiary_data, travel_rule_details (a POST /v3/transactions/) i POST /v3/travel-rule/inbound/ accepten IVMS 101 genuí:
  • un bloc originator i un bloc beneficiary, amb originatorPersons o beneficiaryPersons que contenen un naturalPerson o un legalPerson, i accountNumber;
  • els mateixos blocs dins d’un objecte ivms101 (o IVMS101);
  • una persona IVMS 101, o un bloc complet, com a originator_data o beneficiary_data.
Cada costat accepta una persona: un naturalPerson, o un legalPerson, que fa que la part sigui una empresa. Un originator_data o beneficiary_data pla i no buit té preferència sobre un bloc del mateix costat.
Un bloc mal format retorna un error 400 amb la clau del seu camí, per exemple {"travel_rule_details": {"originator.originatorPersons": ["must be a non-empty list of originator persons."]}}. A POST /v3/travel-rule/inbound/ les mateixes claus estan al nivell superior, sota ivms101. quan heu usat l’embolcall.

Dades obligatòries per règim

Mentre la Travel Rule està activada, una transferència de sortida igual o superior al vostre llindar ha de portar el que exigeix el seu règim, o retorna un error 400. Només es comproven les parts que heu enviat, les dades verificades compten per a l’ordenant, i els errors apareixen sota travel_rule_details.originator_data o travel_rule_details.beneficiary_data, per exemple "EU TFR requires the originator name." o "FATF Recommendation 16 requires the beneficiary wallet address.": Per a l’ordenant, la comprovació llegeix els camps que la vostra aplicació comparteix a data_sharing_fields, perquè són tots els que un canal envia; el beneficiari es comprova tal com l’heu enviat. Quan la transferència només compleix el règim amb un camp que no compartiu, el 400 anomena el requisit del règim i després els camps que la vostra configuració comparteix. El número oficial de document és national_id (o document_number), el número d’identificació de client és customer_identification (o vendor_data), i la data de naixement és date_of_birth. Un beneficiary_data.wallet_address buit s’omple a partir de counterparty.payment_method.account_id abans de la comprovació, i una retirada UTXO la sortida beneficiària de la qual Didit ha inferit de travel_rule_details.utxo es considera que la porta. Una transferència Lightning a la qual la Travel Rule no s’aplica no es comprova.

Travel Addresses

Una Travel Address és una cadena compacta i codificada que apunta a l’endpoint d’entrada de consultes TRP d’un VASP: mai no exposa una URL en brut ni cap adreça de cartera. Quan el Travel Rule està activat, Didit deriva el teu propi travel_address (que es retorna com a camp de només lectura a la configuració) perquè el puguis compartir amb altres VASP que et contactin per la via TRP. Cadascuna de les teves carteres de la llibreta d’adreces també rep un receiving_travel_address propi: una consulta enviada a aquesta adreça indica la cartera concreta, de manera que Didit no ha de trobar-la pel número de compte ni pel nom del titular. L’host públic TRP de Didit encara no respon a altres VASP, de manera que la recepció per TRP no està disponible fins que no ho faci: consulta Xarxes de Travel Rule. Quan coneixes la Travel Address d’una contrapart, guarda-la a l’entrada de la llibreta d’adreces de carteres de destinació perquè Didit encamini les transferències d’aquell beneficiari directament per TRP en lloc de recórrer al correu electrònic. Didit valida les Travel Addresses que guardes en una entrada de la llibreta d’adreces de carteres o que envies a originating_vasp: cadascuna ha de començar per ta i decodificar-se en una URL de consulta que porti t=i, de manera que un marcador com ta... retorna 400. El beneficiary_data.travel_address d’una transacció no es valida: si no es decodifica, s’omet el rail TRP. La codificació és Base58Check amb prefix ta: l’host i la ruta de l’endpoint (que sempre porta el parell de paràmetres de consulta t=i) més un checksum de quatre bytes de doble SHA-256, codificat en base58. Una adreça real té aquest aspecte i arriba a unes 100 caràcters:
Quan Didit valida una Travel Address, un valor que no és una adreça ben formada amb checksum vàlid retorna 400 amb "Invalid travel address.". Obté una adreça real de la teva resposta de configuració o de la mateixa contrapart.

Prova sense credencials de xarxa

No necessites cap afiliació a GTR, TRUST, VerifyVASP ni Sygna per provar les rutes que no requereixen afiliació. Igualment necessites una clau d’API de Didit per a l’aplicació que proves.
  • Sortint a la sandbox: envia una transacció travelRule des d’una aplicació de sandbox. Després de les comprovacions de llindar i de cartera autoallotjada, el VASP de prova de Didit la respon dins de Didit amb l’escenari que triïs segons la cartera o el nom del beneficiari: acceptar, rebutjar, discrepància de nom, no disponible, temps d’espera o autoallotjada. Cap xarxa, correu electrònic ni cap altre client de Didit no rep res.
  • Entrant a la sandbox: fes que el VASP de prova t’enviï una transferència amb Activa la transferència entrant de Travel Rule del VASP de prova, o registra-la tu mateix amb Registra una transferència entrant de Travel Rule. Prova una cartera desconeguda, una cartera no verificada, una discrepància de nom del beneficiari i una cartera verificada que coincideixi. Aquestes proves permeten comprovar decisions d’entrada reals sense contactar amb cap xarxa.
  • Dues aplicacions en producció controlades: utilitza el rail INTERNAL entre dues de les teves aplicacions en producció (la que rep és localitzable i demostra el control de la cartera de destinació amb un missatge signat o un ingrés de prova), o bé una contrapart TRP controlada, per provar un intercanvi entre dues parts sense credencials d’una xarxa comercial. Les aplicacions en producció poden generar càrrecs i notificacions normals; utilitza identitats i contraparts de prova que controlis.
Consulta Prova Travel Rule a la sandbox per veure tots els escenaris i el resultat exacte de cadascun. Les proves de sandbox o de protocol locals que funcionin no validen les credencials, l’afiliació ni la interoperabilitat en producció d’una xarxa comercial. Per això cal un sandbox de xarxa autoritzat o un intercanvi real controlat amb credencials d’afiliació vàlides.

Enviar una transferència

Inclou la transferència a POST /v3/transactions/ establint transaction_category a travelRule (o travel_rule) i adjuntant un objecte travel_rule_details (àlies: travelRule). El bloc travel_rule_details en si és opcional, però en el moment que l’adjuntes, travel_rule_details.status és obligatori: un bloc sense aquest camp retorna 400. Quan Travel Rule està activat per a la teva aplicació, Didit ignora el valor status que envies i gestiona l’intercanvi per si mateix:
  1. Si l’import és inferior al teu threshold_amount configurat, la transferència es resol immediatament com a NOT_APPLICABLE i no es negocia res.
  2. Si el mètode de pagament de la contrapart declara la destinació com a cartera autoallotjada (payment_method.method_type: "unhosted_wallet"), no s’intenta cap via: la transferència passa directament a UNCONFIRMED_OWNERSHIP i el widget de verificació de titularitat de la cartera es crea automàticament (vegeu Carteres autoallotjades declarades).
  3. En cas contrari, les vies s’executen en ordre de prioritat, i la primera que pot arribar a la contrapart porta l’intercanvi:
    • INTERNAL: exactament un altre client de Didit té una prova de missatge signat o de dipòsit de prova per a beneficiary_data.wallet_address, feta després que la cartera canviés de titular per última vegada. La teva aplicació mai no compta, i quan el teu usuari final ha triat un membre de la xarxa de Didit al widget de verificació de titularitat de la cartera, només compta la prova d’aquest membre. L’aplicació d’aquest client és en producció (no sandbox), té Travel Rule activat i is_discoverable establert, i és el VASP que has indicat en enviar counterparty_vasp_lei o counterparty_vasp_name. Una cartera que només està autodeclarada, demostrada amb una captura de pantalla, no verificada o només present en una llibreta d’adreces mai no rep res per INTERNAL.
    • TRP: l’actiu de la transferència té un mapatge d’Identificador de Token Digital per a la xarxa de la transferència (vegeu Identificadors d’actius TRP), i el payload inclou beneficiary_data.travel_address, l’entrada de la llibreta d’adreces de la destinació n’emmagatzema una, o la contrapart es resol al directori (per counterparty_vasp_lei o counterparty_vasp_name) amb un endpoint TRP.
    • GTR, TRUST, VERIFYVASP, SYGNA: has connectat la teva pròpia membresia per a aquesta xarxa a Marketplace, i la contrapart es resol a un identificador de xarxa (camp explícit o entrada del directori: vegeu Camps de resolució de la contrapart). Didit està completant el procés d’incorporació com a proveïdor i encara no té cap membresia de plataforma en aquestes xarxes, de manera que disabled_networks avui no canvia aquest pas.
    • EMAIL: s’ha proporcionat beneficiary_data.counterparty_vasp_email, o counterparty_vasp_name es resol a una entrada del directori amb un correu electrònic de compliment.
  4. Si cap via no pot resoldre una contrapart, Didit executa la cadena de descoberta de contraparts. Amb vasp_attribution_enabled activat, això inclou l’atribució mitjançant analítica de blockchain: la cartera de destinació es resol al VASP que la posseeix, el nom atribuït s’escriu a beneficiary_data.counterparty_vasp_name (quan aquest camp està buit) i al directori, i les vies es tornen a executar una vegada, de manera que una cartera atribuïda a un VASP amb una entrada al directori que inclou un endpoint TRP, un identificador de xarxa o un correu electrònic de compliment s’encamina en aquesta segona passada.
  5. Si la contrapart encara no es resol, la transferència passa a COUNTERPARTY_VASP_NOT_FOUND. En les transferències de sortida, Didit crea automàticament el widget de verificació de titularitat de la cartera (quan auto_wallet_verification està activat) perquè la transferència pugui completar-se igualment com a transferència a una cartera autoallotjada, i pots tornar a executar l’encaminament més endavant amb action: "resend" quan tinguis millors dades de la contrapart.
Els passos 1 i 2 es produeixen dins de la sol·licitud. Els passos 3 a 5 s’executen just després de la resposta: la transferència torna amb l’estat AWAITING_COUNTERPARTY amb protocol: null, i cada resultat arriba com a webhook travel_rule.status.updated.

Identificadors d’actius TRP

TRP identifica l’actiu transferit pel seu Identificador de Token Digital (DTI) d’ISO 24165. Un DTI identifica un token en una única blockchain, de manera que un token multicadena té un DTI per xarxa. Didit envia transferències per TRP per a aquests actius: Els identificadors de USDC són els que l’emissor del token publica al seu llibre blanc MiCA. Per a un token multicadena, la transferència ha d’indicar la seva xarxa a transaction_details.crypto_params.crypto_chain (per exemple CELO, BASE, OP, ARB o POL). Sense xarxa, o en una xarxa sense mapatge, la transferència no s’envia per TRP i Didit prova la resta de vies: primer les xarxes d’interoperabilitat i després el correu electrònic. USDT encara no té mapatge. Un token sense mapatge de DTI, com l’stablecoin propi d’una empresa, necessita que el seu emissor registri un DTI davant de l’autoritat de registre ISO 24165, un per token i per blockchain. Quan els DTI existeixin, contacta amb el suport de Didit amb cada DTI, la seva blockchain i els decimals del token, i Didit afegirà el mapatge. Les consultes TRP entrants que porten un DTI per cadena mapat es registren amb la moneda del token, l’import en els decimals del token i la xarxa.

Descoberta de la contrapart

Una transferència que porta només una adreça de cartera arriba igualment a la seva contrapart sempre que algú pugui identificar-la. Abans que una transferència de sortida es declari no encaminable, Didit pregunta, en aquest ordre, i s’atura al primer pas que indica un VASP amb una via: El camp discovery de la transferència enumera cada pas que s’ha executat amb el seu outcome (match, miss o skipped), un reason llegible per màquines, el vasp i el rail que ha trobat, i una marca de temps. Un VASP que tu o l’usuari final heu triat té prioritat sobre tots els passos automàtics: la descoberta mai el substitueix per una suposició pròpia. Quan cap pas no indica una contrapart, la transferència passa a COUNTERPARTY_VASP_NOT_FOUND, o a COUNTERPARTY_VASP_NOT_REACHABLE quan s’ha indicat un VASP però cap de les seves rutes està disponible per a la teva aplicació. Després la transferència porta un reason (awaiting_end_user, no_directory_match, directory_match_no_route o picked_member_without_proven_wallet quan el membre que ha triat l’usuari final no ha demostrat que és el titular de la cartera) i una llista de next_actions: L’enllaç del widget és el valor de url de les accions que realitza l’usuari final. Quan hi ha una acció de titularitat de la cartera pendent, el bloc action_required de la transacció (tipus wallet_ownership) porta el mateix reason i els mateixos next_actions, de manera que un client que ja segueix action_required mostra el selector sense feina addicional.

Camps de resolució de la contrapart

Tot el que Didit sap sobre la contrapart prové de travel_rule_details.beneficiary_data. Aquests camps determinen la resolució del canal; tots són opcionals:

Formes de cadena

En una cadena de comptes (cadenes EVM, Solana, Tron) una transferència mou fons d’una adreça a una altra, i Didit llegeix les dues carteres directament de la transacció. Tres altres formes requereixen més informació, i el que Didit ha resolt per a elles apareix a la transferència com a chain_details (buit, {}, en una cadena de comptes). chain_details.originator i chain_details.beneficiary porten cadascun el address, el seu memo i el source d’on procedeix, i la coincidència i l’encaminament llegeixen primer les carteres des d’aquí.

Transferències UTXO

Una transacció de Bitcoin, Litecoin, Bitcoin Cash o Dogecoin gasta entrades de qualsevol nombre d’adreces i paga qualsevol nombre de sortides, algunes de les quals retornen el canvi a l’emissor. Envia les entrades i les sortides com a travel_rule_details.utxo (imports en la unitat pròpia de la moneda, com a cadenes decimals), i Didit infereix el que no declares:
  • Ordenant: originator_data.wallet_address quan l’envies; en cas contrari, l’adreça d’entrada que hi ha aportat més (source: largest_input).
  • Beneficiari: la cartera declarada; en cas contrari, l’única sortida que no retorna el pagament a una adreça d’entrada com a canvi (only_non_change_output); en cas contrari, la sortida que paga l’import de la transferència (amount_match).
Aleshores la transferència porta:
chain_details.warnings marca les incoherències: declared_originator_not_an_input (l’ordenant declarat no és una entrada), declared_beneficiary_not_an_output (el beneficiari declarat no és una sortida), beneficiary_output_ambiguous (no es podia distingir cap sortida única) i beneficiary_output_amount_differs (l’import de la sortida del beneficiari és diferent). utxo en qualsevol altra cadena és un 400, i cada llista admet com a màxim 1.000 entrades. Un dipòsit notificat té el mateix objecte utxo (vegeu Registre sunrise posterior al dipòsit).

Xarxes amb memo i etiqueta

A XRP, Stellar (XLM), EOS, Cosmos (ATOM) i Hedera (HBAR), una plataforma d’intercanvi rep tots els seus clients en una mateixa adreça compartida i els distingeix per l’etiqueta de destinació o pel memo. Per tant, el memo forma part de la cartera: envia’l com a payment_method.memo al participant, o com a memo a originator_data / beneficiary_data (àlies destinationTag), i Didit compara l’adreça i el memo conjuntament.
  • Una entrada de la llibreta d’adreces amb memo només coincideix amb les transferències que indiquen aquell memo. Una entrada sense memo coincideix amb tota l’adreça. Una transferència que no indica cap memo mai arriba a una entrada que en té un: en una adreça compartida, un dipòsit sense la seva etiqueta no és de ningú.
  • Una X-address de XRP porta la seva etiqueta a dins: Didit la separa en l’adreça clàssica i l’etiqueta (source: x_address), de manera que una cartera registrada en qualsevol de les dues formes coincideix amb una transferència en l’altra.
  • Cada memo d’una adreça compartida és el seu propi mètode de pagament a la transacció.
  • Què accepta cada xarxa: una destination tag de XRP és un nombre enter de 0 a 4294967295 (s’accepta un número JSON); un memo de Stellar té fins a 28 bytes de text, un id de 64 bits o un hash de 32 bytes en hexadecimal; EOS admet fins a 256 bytes, Cosmos fins a 256 caràcters i Hedera fins a 100 bytes. Un memo en una cadena que no en té (Bitcoin, cadenes EVM, Solana, Tron, Litecoin, Bitcoin Cash, Dogecoin, Lightning) és un 400.

Lightning

Un pagament Lightning no té cap adreça de beneficiari on-chain: el pagador té una sol·licitud de pagament. En una transferència cripto de bitcoin o Lightning, payment_method.account_id pot ser aquesta sol·licitud, i Didit identifica el beneficiari a partir d’ella sense contactar amb cap xarxa: El beneficiari es guarda com a compte i com a chain_details.beneficiary (source: invoice_payee), a la cadena LIGHTNING, i el que indica la sol·licitud es guarda a chain_details.lightning. Quan la sol·licitud no indica cap beneficiari, una transferència de sortida és NOT_APPLICABLE, amb el motiu a chain_details.not_applicable_reason i a la seva timeline: LIGHTNING_NO_PAYEE_IDENTIFIER, LIGHTNING_BOLT12_BLINDED_PAYEE o LIGHTNING_LNURL_NAMES_NO_PAYEE. Un valor només es llegeix com a Lightning en bitcoin, a LIGHTNING, o quan no s’indica cap cadena (una Lightning Address només en bitcoin o LIGHTNING): en qualsevol altra cadena és l’adreça pròpia d’aquella cadena.
La via INTERNAL només arriba a un altre client de Didit a través d’una cartera que aquest client ha demostrat que controla amb un missatge signat o un dipòsit de prova, i aquestes proves existeixen avui per a Bitcoin, cadenes EVM, Solana i Tron. A les xarxes amb memo, Lightning, Litecoin, Bitcoin Cash i Dogecoin, una transferència per tant mai arriba a un altre client de Didit per INTERNAL. La coincidència per memo, etiqueta i Lightning continua aplicant-se a la teva pròpia llibreta d’adreces: transferències entrants, dipòsits notificats i consultes TRP a les teves carteres.

Actualitzar la cartera de l’ordenant

Sovint una retirada es declara des de la cartera principal del teu client i es difon des de les adreces que tenien les monedes. Registra la cartera de la qual han sortit realment els fons amb PATCH /v3/transactions/{transaction_id}/travel-rule/:
  • Només transferències de sortida, i mai una CANCELLED o EXPIRED (409).
  • Quan les entrades UTXO de la transferència són conegudes, la cartera n’ha de ser una (en cas contrari, 400). Envia també memo en una xarxa amb memo.
  • Només canvia el registre: no es torna a enviar res a la contrapart i l’estat es manté. chain_details.originator passa a ser la nova cartera amb source: updated, la timeline registra la cartera anterior i la nova, i la contrapart INTERNAL de la transferència s’actualitza de la mateixa manera.

Atribució mitjançant analítica de blockchain

Quan només indiquis una adreça de cartera, Didit encara pot saber qui hi ha a l’altra banda. Si cap via no pot encaminar la transferència, Didit resol la cartera de destinació amb les dades d’atribució d’analítica de blockchain: la mateixa anàlisi que dona suport al cribratge de transaccions cripto sap quines carteres pertanyen a quines plataformes d’intercanvi i custodis. L’atribució només s’executa en transferències de sortida que porten alhora una cartera de destinació i un chain (vegeu Camps de resolució de la contrapart); sense cadena, s’omet. Quan la cartera s’atribueix a una entitat coneguda, Didit:
  1. Registra l’atribució a la transferència: beneficiary_data.counterparty_vasp_name s’omple (quan no l’hagis indicat tu), i les metadades de la transferència porten un bloc vasp_attribution amb el nom de l’entitat, el tipus d’entitat, el país i source: "blockchain_analytics".
  2. Afegeix l’entitat al directori de VASP (o coincideix amb l’entrada existent), perquè l’atribució sigui estable entre transferències.
  3. Torna a executar les vies una vegada amb el nom atribuït: una entrada del directori que ja porta un endpoint TRP fa que la transferència s’encamini de seguida, en lloc d’acabar a COUNTERPARTY_VASP_NOT_FOUND.
La crida d’atribució fa també de cribratge cripto complet: la transacció rep la sortida completa del cribratge (puntuació de risc, categoria de risc de la cartera, instantània de la xarxa), exactament com si s’hagués executat el monitoratge cripto, i custom_values.aml_screening_trigger de la transacció es fixa a travel_rule_attribution, perquè puguis veure que el cribratge es va executar perquè ho va requerir l’encaminament de Travel Rule. Quan el monitoratge cripto ja ha cribrat la mateixa cartera en aquesta transacció, es reutilitza el resultat emmagatzemat: ni una segona crida d’analítica ni un segon cobrament. L’atribució mai bloqueja la creació de la transacció: si la consulta d’analítica falla o el teu saldo no la cobreix, la transferència simplement continua cap a COUNTERPARTY_VASP_NOT_FOUND i no es cobra res per l’intent. Amb action: "resend", una atribució registrada prèviament es reutilitza en lloc de tornar a consultar-la. Desactiva tot el pas amb vasp_attribution_enabled: false a la configuració. Consulta Preus per saber com es factura la crida d’atribució. Quan Travel Rule està desactivada, travel_rule_details (inclòs un status que tu proporcionis, de format antic o actual) es registra igualment a la transacció, però de manera passiva: no s’activa cap canal. Fes-ho servir per omplir retroactivament les dades de compliment que ja havies registrat amb el teu propi procés. Una transferència sortint passiva no inicia cap intercanvi, de manera que es factura com a Transaction Screening, no a la línia de Travel Rule. Amb Travel Rule activada, aquesta sol·licitud s’encamina pel canal EMAIL, perquè indica el correu electrònic de compliment de la contrapart i cap canal anterior no pot arribar al beneficiari:
La resposta, resumida als camps que importen aquí:
  • originator_data és el que has enviat, perquè el subjecte de l’exemple no té cap verificació KYC aprovada; per a un usuari verificat, Didit el construeix a partir de les dades verificades (consulta Dades verificades i procedència). El canal EMAIL només mostra al destinatari els camps de l’ordenant que comparteixes a data_sharing_fields.
  • beneficiary_data.chain és ETH perquè la sol·licitud no indicava cap cadena, així que Didit l’ha pres de la moneda.
  • status és APPROVED perquè cap regla ha actuat sobre la transacció; les teves pròpies regles poden establir un altre estat.
  • El contacte de compliment rep l’enllaç de recollida, i la transferència es completa, falla la coincidència de noms o es rebutja quan responen, o caduca si no ho fan (consulta Recollida per correu electrònic).
protocol continua sent null perquè el canal es tria després de la resposta (per exemple EMAIL quan has indicat counterparty_vasp_email): Obtén la transacció el mostra un cop triat, i cada webhook travel_rule.status.updated posterior el porta a rail. Si la cartera del beneficiari pertany a un altre client de Didit que n’ha demostrat el control, el canal INTERNAL liquida tot l’intercanvi just després de la resposta, i aquest webhook ja informa COMPLETED (o COUNTERPARTY_MISMATCHED_DATA). Quan el nom no coincideix, la teva transferència és COUNTERPARTY_MISMATCHED_DATA i l’altre client no rep res. Sense counterparty_vasp_email, i quan ni els canals ni l’atribució no poden arribar al beneficiari, la transferència acaba més tard en COUNTERPARTY_VASP_NOT_FOUND amb una acció wallet_ownership a la transacció.
El bloc travel_rule incrustat de la transacció conté els camps propis de la transferència (uuid, status, protocol, required, obligations_count, originator_data, beneficiary_data, metadata), el que Didit ha resolt i comparat (chain_details, name_match, data_match, mismatched_fields, i els camps d’emmascarament data_masked i data_unmasked), i els camps que indiquen en quin punt es troba: direction, rail, counterparty_vasp, delivery, discovery, reason i next_actions (consulta Per què una transferència està bloquejada). Cada fila de GET /v3/transactions/ porta el mateix bloc, o null per a una transacció sense transferència. Els endpoints dedicats de transferència que hi ha a continuació també retornen aquests camps, més ivms_version, ownership_confirmed, deadline_at, timeline i created_at, però no obligations_count ni metadata.
Per tancar una transferència sortint en estat COMPLETED quan ja l’has difós a la cadena:
Això requereix que la transferència sigui una transferència sortint en estat COMPLETED; en cas contrari, l’API retorna 409. Si tot va bé, tant la transferència sortint com la seva contrapartida del canal INTERNAL passen a FINISHED, i el payment_txn_id de la transacció es defineix amb el hash que has indicat. Al canal TRP, Didit també envia el hash al callback de confirmació de la contrapart. Per cancel·lar una transferència que encara no ha arribat a un estat final, envia {"action": "cancel"} al mateix endpoint. La contrapartida del canal INTERNAL també es cancel·la, i al canal TRP, quan la contrapart ha aprovat la consulta, Didit envia la cancel·lació al seu callback de confirmació. Una transferència ja en FINISHED, CANCELLED o EXPIRED retorna 409. Una sol·licitud sense payment_txn_id ni cap action admès retorna 400. En una transferència que ha passat per GTR, VERIFYVASP o SYGNA, Didit informa del hash on-chain (o de la cancel·lació) a la xarxa després de la resposta, amb els mateixos reintents; el delivery de la resposta mostra aquest missatge. Per reintentar una transferència sortint que no ha pogut arribar a la seva contrapart (una que està en COUNTERPARTY_VASP_NOT_FOUND, COUNTERPARTY_VASP_NOT_REACHABLE o NOT_ENOUGH_COUNTERPARTY_DATA), millora primer les dades de la contrapart, per exemple afegint un travel_address a l’entrada de la cartera de destinació, un contacte per a l’entrada de la contrapart al directori, o catalogant el VASP al directori. Després envia {"action": "resend"} al mateix endpoint. Didit reinicia el termini de confirmació i torna a posar en cua l’escala d’encaminament des del principi, amb les dades emmagatzemades a la transferència: la resposta mostra la transferència de nou en AWAITING_COUNTERPARTY (amb resend queued al seu timeline), i el resultat arriba com a webhook travel_rule.status.updated. Un reenviament fet mentre un intent anterior encara està en curs s’envia quan aquest intent finalitza. Qualsevol altre estat, o una transferència d’entrada, retorna 409.
Per indicar tu mateix la contrapart quan el descobriment no ha pogut fer-ho, envia {"action": "beneficiary_vasp", "beneficiary_vasp": "<directory VASP id>"} (l’id de GET /v3/travel-rule/vasps/). La transferència s’encamina cap a aquell VASP i es torna a enviar. Només una transferència sortint en COUNTERPARTY_VASP_NOT_FOUND, COUNTERPARTY_VASP_NOT_REACHABLE o NOT_ENOUGH_COUNTERPARTY_DATA l’accepta; qualsevol altre estat retorna 409, i un id desconegut retorna 404.

Per què una transferència està bloquejada

Una transferència en COUNTERPARTY_VASP_NOT_FOUND o COUNTERPARTY_VASP_NOT_REACHABLE indica per què està bloquejada i què la fa avançar, a cada lectura de la seva transacció. El bloc travel_rule de GET /v3/transactions/{transaction_id}/, del 201 de POST /v3/transactions/, i de cada fila de GET /v3/transactions/ el porta, i també l’objecte de transferència amb què respon l’endpoint de transferència:
  • reason és la causa llegible per màquina, "" per a qualsevol altre estat.
  • next_actions enumera el que fa avançar la transferència, [] per a qualsevol altre estat.
  • delivery és el missatge més recent que la transferència té pendent de lliurar a l’altra part: kind, status (QUEUED, SENDING, RETRYING, DELIVERED o FAILED), rail, attempts, last_error, next_attempt_at i delivered_at, o null quan no n’ha tingut cap pendent.
  • discovery és on Didit ha buscat la contrapart, una entrada per cada pas que ha executat: step, outcome (match, miss o skipped), reason, vasp, rail i at.
email_undeliverable i delivery_failed provenen d’un lliurament fallit i només apareixen a COUNTERPARTY_VASP_NOT_REACHABLE. Un lliurament fallit decideix primer reason, de manera que una contrapart que Didit sí que ha trobat mai no es notifica com una que no ha pogut trobar. Els altres quatre provenen de la traça de descoberta, en tots dos estats. Un reenviament fa avançar la transferència, de manera que el seu reason s’esborra. L’entrada de la cronologia d’una transició que ha causat un lliurament fallit porta el mateix valor sota reason. Si el proveïdor de correu rebutja el correu de compliment de la transferència d’exemple de dalt, el bloc travel_rule de la seva transacció diu, abreujat:
Aquí delivery concorda amb reason, perquè l’enviament en si ha estat rebutjat. Un rebuig en un recordatori, o un rebot informat més tard, deixa delivery.status a DELIVERED: el primer correu sí que s’ha enviat. Per saber per què una transferència està bloquejada, llegeix reason, no delivery. Per corregir-ho, torna a donar el correu de compliment de la contrapart i després reenvia:
update_compliance_email guarda l’adreça com a beneficiary_data.counterparty_vasp_email d’aquesta transferència: només pertany a aquesta transferència i no s’afegeix a cap entrada del directori ni a cap llista de contactes. L’estat no canvia, la cronologia afegeix compliance email updated, i la transferència manté reason: email_undeliverable fins que el reenviament envia la sol·licitud a la nova adreça. Només una transferència de sortida en COUNTERPARTY_VASP_NOT_FOUND, COUNTERPARTY_VASP_NOT_REACHABLE o NOT_ENOUGH_COUNTERPARTY_DATA l’accepta; qualsevol altra transferència respon amb 409, i un compliance_email que falti o tingui un format incorrecte respon amb 400.

Carteres autoallotjades declarades

Quan el teu client t’indiqui que la destinació és la seva pròpia cartera autoallotjada (no allotjada), declara-la a la transacció en lloc de deixar que l’encaminament descobreixi que no hi ha cap VASP al darrere: estableix el tipus de mètode de pagament de la contrapart a unhosted_wallet.
La declaració salta completament l’encaminament:
  • No es prova cap via - no hi ha cap VASP de la contrapart amb qui fer l’intercanvi - i la transferència es crea directament en UNCONFIRMED_OWNERSHIP.
  • Quan auto_wallet_verification està activat (per defecte), Didit crea automàticament una sessió de widget de titularitat de la cartera vinculada a la transacció i la retorna al bloc action_required de la transacció; els SDK l’obren automàticament durant l’enviament des del client.
  • Quan el client demostri el control de la cartera, es comprova la coincidència del nom del beneficiari i la transferència avança a COMPLETED (o a COUNTERPARTY_MISMATCHED_DATA si la coincidència falla).
Això és l’obligació del TFR de la UE sobre carteres autoallotjades en forma d’API: verificar la titularitat de la cartera no allotjada en lloc d’intercanviar dades amb un VASP de contrapart. La declaració es llegeix del mètode de pagament del costat de destinació d’una transferència de sortida i del costat d’origen d’una d’entrada; en tots dos casos, el participant que és la contrapart. Una transferència declarada no allotjada ja segueix el seu camí final sense via, així que UNCONFIRMED_OWNERSHIP no és un estat reenviable: completa la prova de titularitat (o cancel·la) en lloc de cridar action: "resend".

Recepció

Confirmació de la titularitat de la cartera

Una transferència queda a UNCONFIRMED_OWNERSHIP en dos casos:
  • Una transferència entrant es resol en una entrada de la llibreta d’adreces la titularitat de la qual encara no està verificada.
  • La cartera de la contrapart s’ha declarat autoallotjada (counterparty.payment_method.method_type: "unhosted_wallet"), en una retirada sortint o en un dipòsit entrant. Consulta Carteres autoallotjades declarades.
La vostra aplicació confirma o denega la transferència:
El cos accepta confirmed (obligatori, booleà) i un wallet_address opcional. L’endpoint accepta una transferència en qualsevol d’aquests estats i retorna 409 amb {"detail": "Transfer is not awaiting ownership confirmation."} per a qualsevol altre:
  • UNCONFIRMED_OWNERSHIP, en qualsevol direcció.
  • ON_HOLD en una transferència entrant.
  • UNCONFIRMED_OWNERSHIP, ON_HOLD o COUNTERPARTY_MISMATCHED_DATA en una transferència entrant TRP, perquè un responsable de compliment pugui resoldre una consulta de la contrapart manualment.
En una transferència que Didit ha creat per si mateix (via INTERNAL, registre sunrise o cartera autoallotjada declarada):
  • confirmed: true marca l’entrada corresponent de la llibreta d’adreces de carteres com a verificada pel que fa a la titularitat, i després executa la coincidència de noms amb el holder_name d’aquesta entrada: COMPLETED si la supera, COUNTERPARTY_MISMATCHED_DATA si no la supera. La contrapart de la via INTERNAL, quan n’hi ha una, rep el mateix resultat. Per a una cartera autoallotjada declarada, confirmed: true registra que el vostre client ha verificat qui controla la cartera de la contrapart i completa la transferència (COMPLETED), en sortida o en entrada. Una transferència entrant el dipòsit de la qual ja s’ha liquidat passa directament a FINISHED.
  • confirmed: false posa les dues parts de la transferència a COUNTERPARTY_VASP_GENERAL_DECLINE.
  • L’entrada corresponent es busca a la vostra llibreta d’adreces només per l’adreça de la cartera, sense la cadena. Resoldre una ON_HOLD entrant sense entrada corresponent crea l’entrada a partir del beneficiary_data.wallet_address de la transferència i la marca com a verificada. Una cartera autoallotjada declarada és l’excepció: la cartera es registra a la vostra llibreta d’adreces com a verificada pel que fa a la titularitat, tal com es descriu més avall. En qualsevol altre cas, una entrada que no existeix retorna 409 amb {"detail": "wallet address entry no longer available"}, cosa que també passa quan l’entrada s’ha suprimit.
En una transferència TRP entrant, la mateixa crida respon a la consulta de la contrapart:
  • confirmed: true necessita una adreça de pagament per retornar, presa del wallet_address de la sol·licitud, després de l’entrada coincident i després del beneficiary_data.wallet_address. Si cap de les tres existeix, la sol·licitud retorna 400 amb {"wallet_address": ["wallet_address is required to approve."]}. Didit crea o verifica l’entrada, envia a la contrapart el callback de resolució de la consulta, estableix ownership_confirmed i mou la transferència a COMPLETED.
  • confirmed: false envia una resolució de rebuig i mou la transferència a COUNTERPARTY_VASP_GENERAL_DECLINE.
  • Si no es pot accedir a l’endpoint de callback de la contrapart, la sol·licitud retorna 502 i la transferència conserva l’estat actual. En una aprovació, l’entrada de la llibreta d’adreces de la cartera es crea o es marca com a verificada igualment.
En una cartera autoallotjada declarada, la cartera que verifiqueu és la de la contrapart: el destí d’una retirada sortint o l’origen (la cartera de l’ordenant) d’un dipòsit entrant. Didit l’afegeix a la llibreta d’adreces de carteres com a verificada pel que fa a la titularitat amb el nom de la contrapart, de manera que la cartera es compara amb el nom de la contrapart (l’ordenant, en un dipòsit). Si la llibreta d’adreces ja conté aquesta cartera amb un altre nom de titular, la transferència passa a COUNTERPARTY_MISMATCHED_DATA. Si la transferència no indica cap cartera de la contrapart, passeu wallet_address al cos de la sol·licitud. Quan ni la transferència ni la sol·licitud aporten una adreça de cartera, la sol·licitud es rebutja amb 400.
  • Una transferència de xarxa que ja s’ha respost a través de la seva xarxa (una transferència VerifyVASP, o una transferència GTR o Sygna Bridge ja decidida) retorna 409 (consulteu Transferències des d’una xarxa).
La resposta és l’objecte de transferència més complet descrit més amunt. Una nova transferència INTERNAL mai espera aquí: només arriba a un client que ja ha demostrat que controla la cartera. Una transferència INTERNAL més antiga que, d’abans d’aquesta regla, encara està pendent manté ocults els detalls de l’emissor fins que demostreu el control de la cartera (un missatge signat o un dipòsit de prova), i confirmar-la retorna 409 fins que ho feu. Rebutjar-la continua funcionant. Quan la contrapart ha respost que la cartera és autoallotjada (avui, el Didit Test VASP dona aquesta resposta en sandbox), confirmar afegeix la cartera a la vostra llibreta d’adreces amb el nom del beneficiari i executa la coincidència de noms: una coincidència completa la transferència i marca la cartera com a verificada.

Transferències des d’una xarxa

Didit també pot rebre transferències de Travel Rule que una contrapart envia per GTR, VERIFYVASP o SYGNA. La recepció l’activa Didit per a cada xarxa per separat, i avui encara no n’hi ha cap d’activada: també requereix que cada xarxa registri els endpoints de Didit, i Didit encara no té cap membresia en aquestes xarxes. Les transferències TRUST no es poden rebre. Quan una xarxa està activada, un missatge que lliura es tracta així:
  • Encaminament. El missatge arriba a la vostra aplicació quan indica el codi de participant de la vostra membresia connectada en aquesta xarxa. Un missatge adreçat a la membresia pròpia de Didit només us arriba si sou l’únic client actiu de Didit que ha demostrat el control de la cartera beneficiària. Qualsevol altra cosa es rebutja, de manera que cap client no rep mai la transferència d’un altre client.
  • Decisió. Didit crea la transferència entrant a la vostra aplicació i la decideix com una consulta TRP: coincidència de cartera, titularitat, coincidència de noms i inbound_auto_accept.
  • Una sola vegada. Les xarxes tornen a enviar un missatge fins que se li respon. Una repetició rep la mateixa resposta que va rebre la primera còpia, i no es crea ni es decideix res dues vegades.
  • La vostra revisió, per GTR i SYGNA. Una transferència que us espera (UNCONFIRMED_OWNERSHIP, ON_HOLD o COUNTERPARTY_MISMATCHED_DATA) es decideix amb POST .../travel-rule/ownership/: confirmed: true l’aprova (passeu wallet_address quan la transferència no n’indica cap) i confirmed: false la rebutja. Didit respon a la xarxa després de la resposta, amb els mateixos reintents. Una transferència que ja s’havia respost retorna 409.
  • Cap resposta posterior per VERIFYVASP. VerifyVASP pren la seva resposta quan la demana, de manera que una transferència que necessitaria la vostra revisió es rebutja de seguida i no es pot decidir més tard (409).

Dades de la contrapart emmascarades

Mentre no es confirmi la titularitat de la cartera, les dades personals de la contrapart en una transferència entrant es retornen emmascarades, no pas omeses. Es conserva la primera lletra de cada paraula, i la cartera, la cadena i l’encaminament del VASP continuen sent llegibles. data_masked és true, i la contrapart del detall de la transacció, de la llista i de l’exportació CSV s’emmascara de la mateixa manera. Un cop confirmada la titularitat apareixen els valors reals, i data_unmasked registra l’entrada d’auditoria:
reason és ownership_confirmed, wallet_proof, address_book_match, own_verified_wallet, inquiry_approved (has aprovat una consulta TRP o un missatge GTR o Sygna), known_payment_method (la cartera de l’usuari final als teus registres ha respost) o travel_address (el Travel Address per cartera ha anomenat la cartera). Una transferència entrant INTERNAL porta data_unmasked amb reason: wallet_proof des del moment en què es crea, perquè només rep dades un destinatari que ha demostrat la cartera. actor és el correu electrònic de l’usuari de la consola o l’etiqueta de la clau d’API, i queda en blanc per a una decisió automàtica. L’informe Registre de transferències de la Travel Rule (CSV i PDF) emmascara els noms d’una transferència entrant de la mateixa manera fins que es confirmi la titularitat. Els informes que presentes a un regulador, com el XML de goAML i l’informe regulatori en PDF, contenen les dades reals de la contrapart.

Retroacció de discrepàncies

Una transferència COUNTERPARTY_MISMATCHED_DATA ara indica els camps que difereixen. data_match conté la comparació i mismatched_fields enumera els camps. Totes dues inclouen només noms de camp i resultats, mai valors, de manera que continuen sent llegibles mentre les dades estan emmascarades:
L’entrada de la cronologia indica els camps, per exemple “la data de naixement del beneficiari no coincideix amb el titular de la cartera”. Un rebuig TRP després d’una discrepància indica al VASP d’origen quins camps difereixen, per exemple “Les dades del beneficiari no coincideixen amb el titular de la cartera: nom”. Allò que l’altre VASP pot saber és limitat intencionadament: mentre el nom sigui incorrecte, el nom és l’únic camp informat (mismatched_fields: ["name"], i tots els altres com a not_compared), i un cop el nom coincideix, s’informa de cada camp que difereix. Això s’aplica al costat remitent d’un intercanvi INTERNAL i a un rebuig TRP. Un nom que falta a tots dos costats apareix com a not_compared i no és una discrepància, i un país coincideix pel que designa, de manera que ES i ESP són iguals.

Puntuació de coincidència del nom

Cada transferència en què s’ha comparat un nom porta name_match, i l’entrada de la cronologia que n’ha decidit el resultat porta el mateix objecte al costat del seu detail:
  • score és la similitud dels dos noms complets, de 0 a 100, i és 0 quan algun dels dos és buit. matched és el resultat segons el strictness, de manera que poden diferir: FUZZY decideix només amb la seva pròpia ràtio de similitud de 0.85.
  • matched_names són les paraules del nom de la transferència que es troben a l’altre nom; mismatched_names són les paraules que un dels dos costats té i l’altre no.
  • method és none, exact_token, token_subset, token_containment o sequence_ratio, per als modes NONE, STRICT, DEFAULT, CONTAINS i FUZZY, respectivament.
  • compared_with és wallet_holder (el titular registrat per a la cartera) o counterparty_vasp (el nom que la contrapart ha indicat a la pàgina de resposta per correu electrònic, o la resposta del Didit Test VASP).
  • El resultat de la transferència segueix data_match, que compara cada camp, de manera que una transferència pot ser COUNTERPARTY_MISMATCHED_DATA mentre name_match.matched és true.
  • name_match és a l’objecte de transferència que retornen els endpoints de la Travel Rule i al travel_rule incrustat de la transacció, i és null fins que es compara un nom. La llista de transferències i els webhooks no el porten.
  • Els noms queden ocults mentre les parts estiguin emmascarades, i també a la còpia de l’altre client d’un intercanvi INTERNAL.

Missatges i sol·licituds de documents

Dos VASP poden resoldre una transferència en disputa dins de Didit en lloc de fer-ho per correu electrònic. GET i POST /v3/transactions/{transaction_id}/travel-rule/messages/ llisten i envien missatges sobre una transferència:
  • kind és MESSAGE (per defecte) o DOCUMENT_REQUEST. Una sol·licitud de document necessita almenys una entrada a requested_documents (fins a 10); un missatge necessita un body (fins a 5000 caràcters) o un fitxer.
  • reply_to indica un missatge anterior de la mateixa transferència. Una resposta de l’altra part que porti un document satisfà la sol·licitud de document a què respon, i fulfilled_at s’hi estableix. La teva pròpia resposta no satisfà mai la teva pròpia sol·licitud.
  • Envia-ho en format multipart amb files per adjuntar fins a 5 fitxers de 10 MB cadascun, en PDF, PNG, JPEG o WebP. Didit comprova el contingut de cada fitxer, no només el tipus declarat, i qualsevol altre tipus de fitxer provoca una resposta 400 a files (“Adjunta només fitxers PDF, PNG, JPEG o WebP.”).
  • Una transferència admet fins a 100 missatges, dels quals fins a 20 poden portar adjunts (cadascun amb fins a 5 fitxers), comptant tots dos costats; si se supera qualsevol dels dos límits, la sol·licitud respon 400. Els fitxers adjunts als missatges no compten com a documents propis de la transacció.
  • Els missatges funcionen per les vies INTERNAL i EMAIL. A INTERNAL, l’altre client de Didit veu el missatge al seu costat del parell. A EMAIL, s’envia un correu electrònic a la contrapart i aquesta respon al portal de recollida. Si no es pot enviar el correu electrònic de notificació, el missatge es desa igualment i la sol·licitud respon 201.
  • La sol·licitud respon 409 amb un motiu a detail per a una transferència per TRP, GTR, TRUST, VerifyVASP o Sygna (aquests protocols no porten missatges), per a una transferència sense contrapart encara, per a una transferència INTERNAL les dades de la qual no han coincidit amb el titular de la cartera (no ha arribat res al destinatari), per a una transferència INTERNAL el destinatari de la qual encara no ha demostrat el control de la cartera (en tots dos costats, fins que ho faci), per a una transferència EMAIL la contrapart de la qual ja no té adreça de correu electrònic de compliment, i per a una transferència EMAIL l’enllaç de recollida de la qual ha caducat o la transferència de la qual està tancada.
  • Cap webhook s’activa quan la contrapart escriu una resposta. Consulta l’endpoint de missatges.
  • El correu electrònic que informa la contrapart d’un nou missatge s’envia en anglès.

Llibreta d’adreces de carteres

Registra les carteres que controlis perquè les transferències entrants (per la via INTERNAL, les consultes TRP entrants i els registres posteriors al dipòsit) es puguin contrastar amb elles, amb POST/GET /v3/travel-rule/wallet-addresses/ i PATCH/DELETE /v3/travel-rule/wallet-addresses/{entry_uuid}/.
PATCH accepta holder_name, holder_vendor_data, entity_type i travel_address, i retorna només aquests quatre camps. DELETE elimina l’entrada (204): la seva adreça queda lliure per tornar-la a registrar i deixa de coincidir immediatament amb les noves transferències.
La coincidència no distingeix majúscules i minúscules en l’adreça, inclou el seu memo en una xarxa amb memo, i es limita per chain. Quan una transferència porta una cadena, una entrada només coincideix si la seva chain és el mateix valor (sense distingir majúscules i minúscules) o està buida. Els noms de cadena es comparen com a text, no es tradueixen; per tant, una entrada emmagatzemada com a ethereum no coincideix amb una transferència la cadena de la qual és ETH. Les transferències sortints prenen la cadena de beneficiary_data.chain, després de transaction_details.crypto_params.crypto_chain, després de custom_properties.crypto_chain, i després de la divisa (per exemple ETH, o per a USDT i USDC la cadena inferida de payment_reference_id); només s’estableix quan és una cadena que Didit reconeix. Els registres posteriors al dipòsit prenen la cadena del seu camp chain, en minúscules. Les consultes TRP entrants no tenen en compte la cadena: coincideixen per adreça o, quan la consulta no indica cap cartera, pel nom del beneficiari contra les teves entrades verificades. POST .../travel-rule/ownership/ també fa coincidir només per adreça. Quan coincideixen diverses entrades, el canal INTERNAL i els registres posteriors al dipòsit prefereixen una entrada amb titularitat verificada i, després, la més antiga; la cerca TRP sortint pren l’entrada més antiga que emmagatzema una Travel Address. Les consultes TRP entrants i l’endpoint de titularitat agafen qualsevol de les entrades coincidents; per això, mantén una sola entrada per adreça quan sigui possible. El canal INTERNAL no coincideix amb cap entrada quan hi ha entrades verificades per a l’adreça en més d’una altra aplicació.

Importar carteres en massa

Importa fins a 10.000 carteres en una sola crida amb POST /v3/travel-rule/wallet-addresses/import/, com a JSON ({"entries": [...]} o un array simple) o com a fitxer CSV en UTF-8 de com a màxim 5 MB amb una fila de capçalera. Una fila indica una cartera per la seva address, per address_hash (el SHA-256 de l’adreça en minúscules, 64 caràcters hexadecimals o 44 caràcters base64), o per totes dues, més qualsevol dels camps d’entrada anteriors. Envia només el hash per registrar una cartera sense revelar la seva adreça: coincideix amb les transferències a aquesta adreça com qualsevol altra entrada, i es pot demostrar amb el widget de titularitat de la cartera.
La importació és idempotent i informa de cada fila en l’ordre enviat: created, existing (la mateixa cartera, cadena i memo ja és al registre i no s’ha modificat), duplicate (repeteix una fila anterior, indicada a duplicate_of_row) o failed amb els seus errors. Una fila incorrecta no fa fallar les altres: la resposta és 200 quan cap fila ha fallat i 207 quan n’ha fallat alguna, amb els recomptes a total, created, existing, duplicate i failed. Una cel·la CSV buida es considera no enviada, i les columnes que la importació no llegeix s’ignoren, de manera que una exportació d’una altra eina s’importa tal qual. A GET /v3/travel-rule/transfers/, cada fila porta originator_memo i beneficiary_memo al costat de les dues carteres.

Recollida per correu electrònic per a contraparts inaccessibles

Quan cap canal de protocol pot arribar a la contrapart, Didit recorre a EMAIL: envia un enllaç de recollida d’un sol ús a beneficiary_data.counterparty_vasp_email (o a un correu electrònic obtingut a partir de beneficiary_data.counterparty_vasp_name mitjançant el registre del directori de VASP). El destinatari no necessita un compte de Didit ni una clau d’API: el token de l’enllaç és l’autenticació. Així es fa l’enviament de la petició:
  • Als destinataris correctes. Un counterparty_vasp_email que passes és l’únic destinatari. En cas contrari, Didit escriu com a màxim a tres adreces: els contactes de la contrapart que no han rebotat (primer els teus i després els de la plataforma; dins de cada grup, primer els que han respost anteriorment), i després el correu de compliment de l’entrada del directori quan queda un espai lliure. Cada adreça rep el seu propi correu.
  • En el teu nom. El correu surt de l’adreça de Didit com a “el teu nom legal via Didit”, en l’idioma de la jurisdicció de la contrapart (anglès quan no es coneix), i l’enllaç obre la pàgina de resposta en aquest idioma. No reps cap còpia: segueix la cronologia de la transferència.
  • Amb recordatoris. Fins que la contrapart respongui, Didit li envia recordatoris 72, 24 i 6 hores abans del termini, com a mínim 12 hores després de la petició o de l’últim recordatori, i mai després del termini.
  • Amb els rebots gestionats. Un rebot o una queixa de correu brossa marca com a no vàlid el contacte al qual ha arribat, amb el seu motiu, i la cronologia de la transferència ho registra. Un contacte de la plataforma queda llavors no vàlid per a tots els clients de Didit; el contacte de la teva aplicació, només per a la teva aplicació. Quan el servei d’enviament de correu de Didit deixa completament d’enviar a una adreça (després d’un rebot permanent, una queixa de correu brossa o una baixa), tots els contactes d’aquesta adreça es marquen com a no vàlids (suppressed), i aquests contactes tornen a ser vàlids quan es reprèn l’enviament a l’adreça. Quan no queda cap adreça on escriure, la transferència passa a COUNTERPARTY_VASP_NOT_REACHABLE amb el motiu del servidor de correu receptor a la seva cronologia. Un rebot permanent o una queixa de correu brossa sobre el counterparty_vasp_email que vas passar fan això de seguida, perquè és l’únic destinatari; un rebot temporal (soft_bounce) en aquest, o en el correu de compliment de l’entrada del directori, deixa la petició oberta per als recordatoris.
L’enllaç obre una pàgina allotjada que mostra l’intercanvi pendent i crida aquests dos endpoints públics per al destinatari. Per a la transferència d’exemple anterior, els detalls de recollida són:
reference és el uuid de la transferència. originator_data i el ivms_request IVMS 101 que se’n construeix només porten els camps de l’ordenant que comparteixes a data_sharing_fields; el nom i la cartera sempre s’hi inclouen. fiat_amount i fiat_currency estan buits quan no has enviat cap valor convertit, contact repeteix el valor de ?contact= de l’enllaç, i decline_reasons enumera els valors que accepta decline_reason. join_invitation.eligible és true mentre la contrapart tingui una invitació vigent per unir-se a Didit; l’enllaç d’invitació només viatja al correu electrònic. Aquest endpoint retorna l’import emmagatzemat tal qual, amb les 18 xifres decimals completes en lloc de la forma retallada que usa l’objecte de detall de la transacció.
decision és accept o decline. En cas d’accept, el beneficiary_name indicat es compara amb beneficiary_data.name de la transferència segons la teva regla de noms: COMPLETED si coincideixen, COUNTERPARTY_MISMATCHED_DATA en cas contrari. La contrapart pot enviar una resposta IVMS 101 completa com a ivms_response; el nom del beneficiari que hi consta té preferència sobre beneficiary_name. En cas de decline, la transferència passa a COUNTERPARTY_VASP_GENERAL_DECLINE. La contrapart pot indicar un decline_reason de decline_reasons, amb un decline_detail (fins a 512 caràcters, obligatori per a other), i la cronologia de la transferència el registra, per exemple counterparty declined: The beneficiary is not our customer. La resposta és el {"status": "..."} resultant, més decline_reason després d’un rebuig. Quan la contrapart ha respost, tots dos endpoints retornen 410. Tots dos endpoints retornen 404 per a un token desconegut i 410 quan la finestra es tanca: o bé la transferència ha sortit de AWAITING_COUNTERPARTY, o bé ha passat el termini de confirmació (confirmation_timeout_hours després de la creació o de l’últim reenviament). La contrapart llegeix i respon a través de l’enllaç de recollida amb GET i POST /v3/travel-rule/pickup/{token}/messages/. No necessita cap clau d’API, només accepta adjunts PDF, PNG, JPEG o WebP, i respon 410 quan l’enllaç caduca o la transferència es tanca. Un missatge que has enviat mostra el nom del teu VASP com a author i com a uploaded_by de l’adjunt, mai la persona ni la clau d’API que hi ha darrere.

Dipòsits sense correspondència

Un dipòsit entrant pot arribar abans que les dades de Travel Rule del VASP d’origen. Aquest dipòsit es manté a AWAITING_COUNTERPARTY o NOT_ENOUGH_COUNTERPARTY_DATA fins que arriben les dades. Llista els dipòsits que encara esperen amb una clau d’API que tingui el privilegi de transaccions:
La resposta usa les mateixes files que GET /v3/travel-rule/transfers/, limitada als dipòsits entrants que esperen les dades del VASP d’origen. Quan les dades hagin arribat en un missatge rebut separat, emparella el dipòsit i el missatge tu mateix:
{transaction_uuid} és el dipòsit. transaction_id és la transacció del missatge de Travel Rule rebut. La crida retorna { "deposit": ..., "message": ... }. Respon 404 quan alguna de les dues transaccions ja no existeix, i 409 amb travel_rule_match_conflict (“This deposit can no longer be matched.”) quan qualsevol de les dues parts ja ha canviat d’estat.

Registre posterior al dipòsit

Quan un dipòsit de criptoactius es liquida on-chain abans de qualsevol intercanvi de Travel Rule - perquè el VASP emissor era inaccessible, o perquè estàs posant al dia dipòsits històrics - registra’l a posteriori amb POST /v3/travel-rule/inbound/.
originating_vasp.travel_address ha de ser una Travel Address real i amb una suma de verificació vàlida: un valor de marcador de posició retorna 400 amb "Invalid travel address.". originating_vasp.lei ha d’estar buit o tenir 20 caràcters en format LEI (18 lletres o xifres, seguides de 2 xifres); qualsevol altra cosa retorna 400 amb "Invalid LEI: expected 20 alphanumeric characters (ISO 17442).". Didit només comprova aquest format, no els dígits de control ISO 17442. Didit crea una transacció travelRule entrant (o reutilitza un dipòsit entrant que ja hagis enviat amb el mateix hash i cartera, si encara no té cap transferència Travel Rule) i resol la transferència amb la teva llibreta d’adreces de carteres, per l’adreça i el memo:
  • Cap entrada coincident -> ON_HOLD. Resol-la amb POST .../travel-rule/ownership/: confirmed: true afegeix la cartera a la teva llibreta d’adreces com a verificada i fa la coincidència de noms; si coincideix, la transferència passa a COMPLETED i després a FINISHED.
  • L’entrada existeix però la titularitat no està demostrada -> UNCONFIRMED_OWNERSHIP.
  • El nom del beneficiari no coincideix amb el holder_name de l’entrada -> COUNTERPARTY_MISMATCHED_DATA.
  • Entrada verificada i el nom coincideix -> COMPLETED i, immediatament, FINISHED (el dipòsit ja s’ha liquidat).
Amb l’entrada verificada de la llibreta d’adreces registrada a l’exemple anterior, la resposta és:
El txn_id de la nova transacció és tr-in-, seguit dels primers 80 caràcters del txid i d’un hash de 12 caràcters del txid i de la cartera. created és true (HTTP 201) quan aquesta crida ha registrat el dipòsit, i false (HTTP 200) quan el mateix txid i wallet_address ja estaven registrats; en aquest cas es retorna la transferència existent sense canvis. En la ruta amb entrada verificada, les dues transicions es produeixen abans que l’endpoint respongui, de manera que la resposta síncrona ja mostra l’estat final FINISHED; el pas intermedi COMPLETED queda registrat igualment a la timeline de la transferència. Cada transició dispara un webhook travel_rule.status.updated (COMPLETED i FINISHED en disparen cadascun un). Quan Didit ha creat una transacció nova, envia primer transaction.created i després aquests esdeveniments. El registre no té cap tarifa de Travel Rule ni de monitoratge. Quan el monitoratge de criptomonedes està activat i la chain és una de les que Didit pot sotmetre a cribratge, un dipòsit nou també se sotmet a un cribratge i es factura una sola vegada a la tarifa de Wallet Verification & Screening.

Widget de titularitat de la cartera

Per treure una transferència de UNCONFIRMED_OWNERSHIP, o per verificar prèviament una cartera abans que arribi cap transferència, crea un widget allotjat de titularitat de la cartera amb POST /v3/travel-rule/widget-session/ i envia el teu client a la url retornada. El widget demostra el control de la cartera mitjançant la signatura de missatges (inclosos els comptes de contracte intel·ligent d’EVM, a través d’ERC-1271 i ERC-6492), una prova de Satoshi, una captura de pantalla o una autodeclaració, i després marca com a verificada l’entrada corresponent de la llibreta d’adreces perquè la plataforma d’intercanvi pugui continuar. La captura de pantalla és l’excepció: mai verifica la cartera per si sola, de manera que el teu equip de compliment la revisa i confirma una transferència en UNCONFIRMED_OWNERSHIP amb POST .../travel-rule/ownership/. Consulta Widget de titularitat de la cartera per al flux complet, els mètodes de prova i la nota important que el widget s’ha d’obrir en un navegador real, mai dins d’un webview d’un SDK mòbil.

Directori

GET /v3/travel-rule/vasps/ cerca al directori de VASP: les entrades del directori compartit més els membres de la xarxa de Didit. Cada fila indica com pot arribar ara mateix la teva aplicació a aquest VASP.
search coincideix amb un fragment del nom o d’un àlies, amb un LEI exacte o amb un domini (counterparty.example o una URL d’aquest domini). Restringeix els resultats amb: Els membres de la xarxa de Didit no reben puntuació, així que risk i responsiveness només retornen entrades del directori. Els resultats s’ordenen pel nom i es paginen amb limit (per defecte 50) i offset. Una xarxa, un codi de país, una banda de risc o un estat de capacitat de resposta desconeguts responen 400 indicant el camp. GET /v3/travel-rule/vasps/{vasp_id}/ retorna una fila pel seu id. El teu propi perfil de VASP mai no apareix als teus propis resultats. dd_status, dd_score, dd_score_breakdown, dd_assessed_at, dd_score_semantic, risk_level, responsiveness i essential_checks contenen l’avaluació de diligència deguda compartida d’una entrada del directori. decision, entity_screening i questionnaires són els registres propis de la teva aplicació sobre el VASP, i cap altre client no els veu. Consulta Diligència deguda de la contrapart per saber què significa cadascun, i fes-los servir com a condicions amb els camps de regla de contrapart en lloc de prendre decisions sobre ells directament. Els membres de la xarxa de Didit no reben puntuació: dd_status és COMPLETED, dd_score és null, risk_level és buit i el desglossament és buit.

Rutes

routes enumera les maneres en què la teva aplicació pot lliurar al VASP, en l’ordre en què l’escala d’encaminament les prova, i reachable és true quan almenys una és available:
  • TRP quan l’entrada porta un endpoint TRP que el directori ha verificat.
  • GTR, TRUST, VERIFYVASP, SYGNA quan una xarxa llista el VASP amb un codi. La ruta només és available quan la teva aplicació pot enviar per aquella xarxa avui (via: own_membership per a la teva pròpia membresia connectada, via: didit_membership per a la de Didit). En cas contrari és unavailable amb reason: no_membership o reason: network_switched_off, i mai no es mostra com a manera d’arribar al VASP. Les membresies pròpies de Didit a aquestes xarxes encara no estan actives, de manera que avui una ruta de xarxa només està disponible mitjançant una membresia que hagis connectat al Marketplace.
  • EMAIL quan hi ha un contacte de compliment normatiu per a l’entrada.
  • INTERNAL per a un membre de la xarxa de Didit.
Una entrada TRISA apareix sota networks i t’indica qui és el VASP a TRISA, però Didit no té cap canal TRISA, així que mai no és una ruta. Una aplicació sandbox només envia a la Didit Test VASP, així que no té disponible cap ruta del directori: totes les rutes són unavailable amb reason: sandbox_application, totes les files tenen reachable: false, i reachable=true no retorna cap fila.

Marques i les seves entitats

Una marca que opera a través de diverses entitats regulades és una sola fila, les entities de la qual són les entitats jurídiques que reben les seves transferències; una fila d’entitat apunta de tornada a la seva marca amb umbrella. Una transferència que indica la marca va a una de les seves entitats, triada entre totes: la de la jurisdicció que indica a beneficiary_data.counterparty_vasp_jurisdiction, si no, l’entitat que l’atribució d’anàlisi de blockchain vinculi a la cartera de destinació, si no, l’única entitat de la marca quan no s’indica cap jurisdicció. Només llavors aquesta entitat ha de ser accessible; si no ho és, la transferència mai no va a una altra entitat ni a la marca en el seu lloc. Quan cap entitat encaixa (dues hi encaixen igual, o la jurisdicció indicada no és la de cap d’elles), s’usa la ruta pròpia de la marca, i sense ruta la transferència és COUNTERPARTY_VASP_NOT_FOUND. L’entitat jurídica que rep les dades de l’ordenant no es determina mai per conjectura, i mai no la decideix el fet que una entitat tingui un contacte. Diverses entrades amb el mateix nom, com les empreses d’un grup que comparteixen un nom comercial, es distingeixen amb la mateixa regla: la de la jurisdicció indicada, si no, la que l’atribució d’anàlisi de blockchain hi vinculi. Quan cap de les dues en tria una, no se’n fa servir cap, i es considera que els detalls no identifiquen cap entrada del directori.

Contactes

contacts són les adreces de correu electrònic a les quals escriu la ruta EMAIL. Els contactes amb scope: platform serveixen a tots els clients de Didit: Didit els gestiona (source: staff), o bé una adreça d’un dels dominis propis del VASP ha respost a una sol·licitud mitjançant el seu enllaç de resposta (source: learned). Els contactes amb scope: application són privats de la teva aplicació: els que afegeixes tu (source: application), i una adreça fora dels dominis propis del VASP que ha respost a una de les teves sol·licituds (source: learned). Una transferència envia primer el correu al contacte propi de la teva aplicació, després a un contacte de la plataforma que ja hagi respost abans (amb verified_at establert), i després als altres. Gestiona els contactes propis de la teva aplicació amb l’API de contactes de contraparts:
  • GET /v3/travel-rule/counterparty-contacts/ llista tots els contactes als quals la teva aplicació pot enviar, incloent-hi els contactes de la plataforma i els rebotats, del més nou al més antic, paginada amb limit i offset. Filtra amb ?counterparty= i un id d’entrada del directori; un valor que no és un UUID respon 400.
  • POST afegeix un contacte privat (counterparty, email, name opcional) i respon 201. Afegir una adreça que l’entrada ja té entre els teus propis contactes retorna aquest contacte. Una entrada desconeguda respon 400 ("No directory entry with this id.").
  • DELETE /v3/travel-rule/counterparty-contacts/{contact_uuid}/ elimina un dels teus propis contactes (204). Els contactes de la plataforma no es poden eliminar i responen 404.
Un contacte que ha rebotat o ha presentat una queixa de correu brossa té is_invalid: true, amb invalid_reason (hard_bounce, soft_bounce, spam_complaint o suppressed), invalid_detail i invalid_at, i el canal EMAIL l’omet. created_by està buit en els contactes de la plataforma i en els contactes que ha afegit una clau d’API.

Com entren les entrades al directori

  • El registre provisional de MiCA de l’ESMA de prestadors de serveis d’actius criptogràfics, que es llegeix cada setmana: el nom de cada prestador, el seu LEI i l’estat membre d’origen.
  • El directori públic de TRISA, que es llegeix cada setmana: qui és cada membre, el seu país i la seva inclusió a TRISA. Una inclusió que el directori deixa de mostrar durant tres setmanes s’elimina.
  • El registre global de LEI completa el LEI, altres noms legals i el país d’una entrada, i troba el LEI d’una entrada pel seu nom legal exacte al seu país.
  • Atribució d’analítica de blockchain afegeix o associa el VASP que és propietari d’una cartera de destinació, i conserva el nom atribuït com a àlies.
  • L’equip de Didit gestiona les entrades: identificadors d’encaminament i inclusions a xarxes que ha verificat, contactes de compliment, àlies, marques i les seves entitats, duplicats fusionats i entrades ocultes.
Les dades que un client informa sobre una contrapart, com un originating_vasp entrant o una Travel Address, es mantenen en la transferència d’aquest client i mai no modifiquen una entrada compartida. Les entrades es fan coincidir primer per LEI i després pel nom exacte o per àlies, i s’enriqueixen en lloc de duplicar-se.

La xarxa de Didit

El teu perfil de VASP és membre de la xarxa de Didit, de manera que altres clients de Didit el troben al directori i al selector de VASP de l’usuari final, només mentre es compleixin totes aquestes condicions:
  • la teva aplicació està en producció (no en sandbox) i Travel Rule està activada;
  • is_discoverable és true i legal_name està definit;
  • compliance_email està definit i confirmat: envia la confirmació amb POST /v3/travel-rule/settings/compliance-email/confirmation/ i obre l’enllaç que t’arriba per correu. Canviar l’adreça requereix una nova confirmació;
  • Didit no ha marcat l’aplicació com a aplicació de prova, de demostració o interna.
El propi canal INTERNAL lliura a una cartera de la qual has demostrat la titularitat, tal com es descriu a Enviament d’una transferència: necessita que la teva aplicació estigui en producció, Travel Rule estigui activada i is_discoverable, però no la resta de la llista. GET /v3/travel-rule/settings/ retorna didit_network: listed, compliance_email_confirmed, i a missing cada condició que encara no es compleix (travel_rule_off, sandbox_application, not_discoverable, legal_name_missing, compliance_email_missing, compliance_email_unconfirmed, excluded_by_staff, internal_organization).

Identificadors d’encaminament

L’encaminament de sortida consulta una entrada del directori sempre que la teva transferència anomena la contrapart amb counterparty_vasp_lei o counterparty_vasp_name (un àlies també funciona). Una entrada porta un identificador per cada xarxa a través de la qual s’hi pot contactar, un endpoint TRP verificat i els seus contactes de compliment, i routes indica quines rutes pot utilitzar la teva aplicació. Sempre pots saltar-te el directori en una sola transferència passant els camps explícits que es descriuen a Camps de resolució de la contrapart.

Diligència deguda sobre la contrapart

Abans que els fons dels teus clients arribin a un altre VASP, has de saber qui és aquest VASP i si l’acceptes. La diligència deguda sobre una contrapart té dues capes:
  • L’avaluació compartida. Cada entrada del directori porta una puntuació de diligència deguda, el seu nivell de risc, un estat de capacitat de resposta i un informe de comprovacions essencials. Didit els calcula a partir de les dades de la plataforma, de manera que tots els clients veuen els mateixos valors.
  • Els teus registres propis. La teva decisió sobre el VASP, el cribratge de sancions i de mitjans adversos que en fas, i els qüestionaris de diligència deguda que has intercanviat amb ell pertanyen només a la teva aplicació. Cap altre client no els veu mai, i mai no canvien l’entrada compartida.
Els teus registres propis funcionen igual per a una entrada del directori que per a un membre de la xarxa de Didit: adreça’ls amb el id que mostra el directori.

Puntuació i nivell de risc

dd_score va de 0 a 100 i com més alta, més segura. Cada resultat ho indica a dd_score_semantic, que sempre és higher_is_safer. risk_level és la banda on cau la puntuació: La puntuació és la suma de set components. dd_score_breakdown mostra cadascun com a {points, max, reason, detail}: max és el pes del component, reason un codi llegible per màquina que pots traduir, i detail una explicació d’una línia en anglès. Els punts s’arrodoneixen a un decimal i el total a un nombre enter. history llegeix les mateixes sol·licituds que la capacitat de resposta, sense finestra temporal: un intercanvi COMPLETED o FINISHED és un èxit, i un intercanvi EXPIRED, COUNTERPARTY_MISMATCHED_DATA o COUNTERPARTY_VASP_GENERAL_DECLINE és un fracàs. Una cancel·lació és un acte del remitent i mai no compta. Didit recalcula l’avaluació quan un intercanvi amb l’entrada es completa, finalitza, caduca, presenta una discrepància o és rebutjat, quan actualitza o revisa l’entrada, i per a totes les entrades en l’actualització setmanal del directori. dd_assessed_at indica quan es va executar per última vegada. Una entrada encara no avaluada no té dd_assessed_at, té un dd_score de 0 i un risk_level buit, així que llegeix risk_level en lloc de la puntuació bruta. Els membres de la xarxa de Didit no reben puntuació: el seu dd_score és null, el seu risk_level és buit i el seu dd_score_breakdown és buit.

Comprovacions essencials

essential_checks és un informe breu sobre quatre comprovacions que Didit executa a cada entrada del directori, només a partir de fonts verificades de la plataforma, mai de dades que un client hagi informat: Cada comprovació de checks indica el seu status (pass, fail o unknown quan cap font registrada no permet determinar-la), un reason llegible per màquina i un detail d’una línia en anglès. passed, failed, unknown i total les compten, level és essential, i checked_at indica quan es va construir l’informe. El component essentials puntua la proporció de comprovacions decidides que passen, així que una comprovació unknown no compta ni a favor ni en contra de l’entrada. L’informe és buit fins que l’actualització setmanal del directori comprova per primera vegada una entrada, i sempre és buit per a un membre de la xarxa de Didit.

Capacitat de resposta

responsiveness indica si el VASP respon a les sol·licituds de la Travel Rule:
total compta les sol·licituds que els clients de Didit han iniciat cap al VASP en els darrers 90 dies i el resultat de les quals està decidit, i answered les que el VASP ha respost:
  • Comptades: les sol·licituds enviades per un canal de xarxa o de protocol, i les sol·licituds enviades per correu a una adreça compartida, que és l’adreça de compliment de l’entrada o un contacte de la plataforma.
  • Mai comptades: una sol·licitud enviada per correu a una adreça que un client ha escrit, o al contacte privat d’un client. Aquest intercanvi es queda a l’historial de transferències del client i mai no etiqueta el VASP per a la resta.
  • Respostes: COMPLETED, FINISHED, COUNTERPARTY_VASP_GENERAL_DECLINE o COUNTERPARTY_MISMATCHED_DATA. Un rebuig o una discrepància també és una resposta: el VASP s’ha implicat.
  • Sense resposta: EXPIRED.
  • Cap de les dues: qualsevol altre estat. Una sol·licitud CANCELLED és un acte del remitent, COUNTERPARTY_VASP_NOT_REACHABLE pot ser un fracàs per part del remitent, i una sol·licitud encara en curs encara no s’ha resolt.
Els membres de la xarxa de Didit responen dins de Didit i sempre mostren UNKNOWN amb comptadors a zero. Actua sobre una contrapart que no respon amb la política de no resposta o amb la configuració predefinida travel-rule-counterparty-unresponsive.

La teva decisió sobre una contrapart

Registra el veredicte del teu equip de compliment sobre una contrapart amb PUT /v3/travel-rule/vasps/{vasp_id}/decision/:
  • La decisió és privada per a la teva aplicació: cap altre client no la veu mai, i mai no canvia l’entrada compartida.
  • Una decisió, per si sola, no canvia res i mai no canvia com s’encamina una transferència. Arriba a les teves transaccions a través del camp de regla counterparty_dd_status: instal·la les configuracions predefinides o escriu la teva pròpia regla sobre aquest camp.
  • Una decisió sobre una marca cobreix cadascuna de les seves entitats que no tingui una decisió pròpia, i l’entitat mostra la marca a inherited_from. Una decisió sobre l’entitat substitueix la de la marca per a aquesta entitat.
  • GET retorna la decisió aplicable, o {"decision": null}. DELETE esborra la teva pròpia decisió i retorna la decisió aplicable després: la decisió de la marca per a una entitat o, si no n’hi ha, null. Respon 404 quan la teva aplicació no té cap decisió pròpia sobre la contrapart.
  • reason és opcional, de fins a 255 caràcters, i cada PUT el substitueix. decided_by és l’usuari de la consola que ha pres o modificat per última vegada la decisió, i queda buit quan ho ha fet una clau d’API.

Cribratge de contrapart

El cribratge de contrapart comprova la pròpia VASP contrapart, com a empresa, contra sancions i mitjans adversos. És opcional i facturable: activa’l amb counterparty_screening_enabled a la teva configuració. Mentre estigui desactivat, no es cribla ni es factura res.
  • Facturació. Cada cribratge nou costa el preu de Cribratge AML d’empreses de la teva organització. GET /v3/travel-rule/vasps/{vasp_id}/screening/ retorna aquest price, fresh_days i si el cribratge està enabled, sense cap cost. Un cribratge de menys de 30 dies és vigent: POST el retorna de nou amb 200 i outcome: reused i no factura res, tret que enviïs refresh: true. Un cribratge nou respon 201 amb outcome: screened. Les aplicacions de sandbox mai no es criben ni es facturen.
  • Cribratge automàtic. Amb el cribratge activat, Didit també criba la contrapart a la qual arriba un intercanvi de sortida quan aquest comença, abans que les teves regles avaluïn la transacció, amb la mateixa reutilització i facturació. Una denegació o un error en aquest punt mai no fa fallar la transferència.
  • Resultat. status és Approved quan no hi ha cap coincidència possible que requereixi atenció, i In Review o Declined per a una possible coincidència de sancions o de mitjans adversos. flagged és true mentre un cribratge vigent sigui In Review o Declined.
  • Efecte. Mentre el teu darrer cribratge d’una contrapart estigui marcat i el cribratge continuï activat, counterparty_risk_level és HIGH a les teves regles, de manera que la configuració predefinida travel-rule-counterparty-high-risk, un cop instal·lada, reté les seves transferències. El risk_level compartit del directori no canvia.
  • Privacitat. El cribratge és privat per a la teva aplicació: cap altre client no el veu mai, i mai no canvia l’entrada compartida. El directori mostra el darrer que hagis fet com a entity_screening.
  • Denegacions. 409 quan el cribratge està desactivat, per a una aplicació de sandbox, o mentre ja s’està executant un cribratge de la mateixa contrapart. 403 amb code: insufficient_credits quan el teu saldo no cobreix el preu. 502 quan el cribratge no es pot completar. Cap d’aquestes respostes no factura res.

Qüestionari de diligència deguda

Demana a una contrapart les seves respostes de diligència deguda amb el qüestionari estàndard de Didit. POST /v3/travel-rule/vasps/{vasp_id}/questionnaires/ l’envia per correu electrònic a una adreça de compliment registrada per a la contrapart, amb un enllaç d’ús únic a una pàgina de respostes:
  • On s’envia. sent_to ha de ser una adreça de compliment registrada: per a una entrada del directori, la seva adreça de compliment o un contacte que la teva aplicació veu a contacts; per a un membre de la xarxa de Didit, el seu correu de compliment confirmat. Si l’omets, s’usa l’adreça a la qual s’envia un correu de Travel Rule a la contrapart: primer el teu propi contacte, després un contacte de la plataforma i, finalment, l’adreça de compliment de l’entrada. Didit no envia mai el qüestionari a cap altre destinatari, i respon 400 quan la contrapart no té cap adreça de compliment registrada.
  • Com es respon. L’enllaç obre /v3/travel-rule/questionnaires/{token}/, una pàgina per a una persona de la contrapart que no necessita compte ni clau d’API. La persona respon a totes les preguntes, de fins a 2.000 caràcters cadascuna (N/A quan una no s’aplica), i envia les respostes una sola vegada. Una contrapart també pot enviar {"answers": {"<question id>": "<answer>"}} al mateix enllaç. Un enllaç que s’ha usat, s’ha substituït o ha superat el seu termini mostra una pàgina de caducitat. El correu i la pàgina estan traduïts; les preguntes, en canvi, sempre són en anglès, perquè el seu significat no canviï d’un idioma a un altre.
  • Terminis. La contrapart té 30 dies per respondre (expires_at). Les respostes es mantenen vigents durant 365 dies (valid_until), i current és true fins a aquell moment. Un qüestionari sense resposta que ha superat el seu termini, i les respostes que han superat la seva validesa, passen a EXPIRED.
  • Un sol qüestionari obert per contrapart. Un nou enviament substitueix el teu qüestionari anterior sense resposta a la mateixa contrapart: passa a EXPIRED i el seu enllaç deixa de funcionar. Es pot enviar un correu per minut a una adreça; un enviament més ràpid respon 429.
  • Consulta de les respostes. GET /v3/travel-rule/vasps/{vasp_id}/questionnaires/ enumera els teus qüestionaris amb la contrapart, del més recent al més antic, amb answers indexades per id de pregunta un cop contestats. El directori els mostra com a questionnaires. Són privats per a la teva aplicació.
La versió 1 del formulari fa aquestes dotze preguntes:

Transferències amb una contrapart

GET /v3/travel-rule/transfers/?counterparty={vasp_id} enumera les transferències de Travel Rule de la vostra aplicació amb una contrapart, de la més recent a la més antiga, pel id que mostra el directori: les vostres transferències amb aquella entrada del directori com a contrapart, o els vostres intercanvis INTERNAL amb aquell membre de la xarxa de Didit. Un valor que no és un id vàlid respon amb 400. Cada fila porta reason just després de status: el reason de la mateixa transferència, de manera que la llista permet distingir un correu de compliment rebotat d’una contrapart sense ruta sense obrir cada transferència.

Polítiques sunrise i de contraparts sense resposta

Quan una transferència caduca (si ha passat confirmation_timeout_hours mentre estava AWAITING_COUNTERPARTY), timeout_outcome decideix què passa amb la seva transacció. Hi ha dues configuracions que us permeten tractar de manera diferent dos motius habituals de caducitat: Totes dues accepten HOLD, REJECT o PROCEED, amb el mateix significat que per a timeout_outcome, o una cadena buida per seguir timeout_outcome. Totes dues són buides per defecte, de manera que no canvia res fins que n’estableixis una:
La primera d’aquestes que s’aplica decideix el resultat:
  1. sunrise_policy, quan està definida i la jurisdicció de la contrapart és a sunrise_jurisdictions.
  2. non_responsive_policy, quan està definida i la contrapart és UNRESPONSIVE.
  3. timeout_outcome en tots els altres casos, inclosa una transferència a un membre de la xarxa de Didit o a una contrapart sense entrada al directori.
sunrise_jurisdictions és de només lectura i actualment és ["CO", "KH", "VN"]. Només aquests països compten com a en període sunrise: qualsevol altra jurisdicció, i una de buida o desconeguda, segueix timeout_outcome, de manera que una contrapart mai no rep la vostra política sunrise per accident. La cronologia de la transferència caducada indica el resultat que s’ha aplicat, per exemple sunrise_policy=PROCEED (counterparty jurisdiction CO does not enforce the Travel Rule yet). Les vostres regles continuen executant-se després de la caducitat, de manera que una regla com tr_eu_expired_review del TFR de la UE encara pot enviar la transacció a revisió amb PROCEED.

Camps de regla i preconfiguracions

Quatre camps de regla contenen el que la vostra aplicació sap sobre la contrapart a la qual ha arribat l’intercanvi de Travel Rule d’una transacció: la seva entrada del directori o, en un intercanvi INTERNAL, el client de Didit que l’ha rebut. Cada camp és buit quan l’intercanvi no ha arribat a cap contrapart coneguda. Cinc preconfiguracions del paquet travel_rule actuen sobre aquests camps. Instal·la-les des de Transactions → Rules → Library a la Business Console o amb la API de la biblioteca de regles: Les cinc només s’apliquen a transaccions de Travel Rule.

Webhooks

Subscriu una destinació a travel_rule.status.updated per rebre una notificació a cada transició d’estat de cada transferència de la teva aplicació, de sortida i d’entrada, incloses les etapes de la via INTERNAL. L’encaminament s’executa després que la creació de la transacció retorni, de manera que resultats com COUNTERPARTY_VASP_NOT_FOUND, COUNTERPARTY_VASP_NOT_REACHABLE o un intercanvi INTERNAL que es liquida de seguida t’arriben a través d’aquest esdeveniment i no a la resposta de creació.
rail està buit fins que se selecciona una via. Per a una transacció, Didit envia travel_rule.status.updated després de transaction.created: quan Didit crea la transacció (la teva POST /v3/transactions/, un registre de sunrise, una consulta TRP entrant o l’etapa d’entrada mitjançant la via INTERNAL), envia primer transaction.created. Cada esdeveniment es lliura i es reintenta de manera independent, així que un transaction.created que ha necessitat un reintent pot arribar després d’un esdeveniment d’estat: associa el teu gestor a transaction_id i llegeix la transacció quan un esdeveniment d’estat n’anomeni una que encara no has vist. Una transferència enviada via TRUST no rep cap esdeveniment COMPLETED: TRUST no retorna res que Didit pugui llegir, de manera que, tret que l’enviament falli o la cancel·lis, el seu últim esdeveniment és EXPIRED. Via GTR, VERIFYVASP i SYGNA, l’esdeveniment segueix la resposta que Didit llegeix de la xarxa. Les aplicacions de sandbox també envien aquest esdeveniment, amb "environment": "sandbox"; una transferència que el Didit Test VASP ha respost porta rail: "TEST_VASP", test_vasp: true i test_vasp_scenario. Consulta la guia de webhooks per al catàleg complet d’esdeveniments, la verificació de signatures i la política de reintents.

Preus

La tarifa de Travel Rule és $0.02 per cada intercanvi de sortida que s’inicia, que es cobra una sola vegada quan es crea la transacció, independentment de les transicions d’estat per les quals passi l’intercanvi després. Un resend mai no el torna a cobrar.
  • S’aplica a una transacció travelRule de sortida en una aplicació amb Travel Rule activat, l’import de la qual és igual o superior al teu threshold_amount, de manera que Didit inicia per a ella un intercanvi gestionat. També hi compta una transferència a una cartera autoallotjada o a la cartera verificada del teu propi usuari: la prova de titularitat és el seu intercanvi.
  • Qualsevol altra transacció de sortida que porti dades de Travel Rule es factura com a Transaction Screening estàndard, que el teu pla inclou fins a la seva quota mensual de transaccions i que es cobra a $0.001 a partir d’allà: una transferència per sota del teu llindar, un pagament Lightning al qual Travel Rule no s’aplica, i una transferència registrada de manera passiva mentre Travel Rule està desactivat. Una transacció es factura en una de les dues línies, mai en totes dues.
  • Les transaccions travelRule d’entrada no comporten cap tarifa de Travel Rule ni de monitoratge: l’etapa d’entrada que Didit crea a l’aplicació del beneficiari via la via INTERNAL, les consultes TRP d’entrada i els registres posteriors al dipòsit.
  • Una aplicació que es va unir a Travel Rule de manera gratuïta no paga cap de les dues tarifes en les transaccions travelRule de sortida fins que activa la facturació de sortida amb POST /v3/travel-rule/workspace/billing/; la recepció continua essent gratuïta.
  • A les aplicacions de sandbox no se’ls cobra mai.
  • La tarifa de Travel Rule figura a $0.02 i Transaction Screening a $0.001 un cop superada la teva quota. Cada transacció es cobra al preu de la línia que factura.
  • Si el cribratge AML o de carteres cripto també s’executa sobre la mateixa transacció (per exemple, un dipòsit d’entrada amb currency_kind: "crypto" i el monitoratge activat), es factura per separat a la tarifa estàndard de Wallet Verification & Screening; no s’inclou dins de la tarifa de Travel Rule.
  • El cribratge de contraparts és opcional i es factura per separat, al preu de Company AML Screening per cribratge; un cribratge de menys de 30 dies es reutilitza sense cost. Les decisions, els qüestionaris i l’avaluació de diligència deguda del directori no tenen cost.

Preus de l’atribució

L’atribució d’analítica de blockchain necessita una consulta de cartera al proveïdor d’analítica, i sempre obtens el valor complet d’aquesta consulta:
  • El monitoratge cripto ja ha cribrat la cartera en aquesta transacció: es reutilitza el resultat emmagatzemat. Una crida d’analítica, un únic cobrament de Wallet Verification & Screening (el que ja havia fet el monitoratge cripto). L’atribució no hi afegeix res.
  • El monitoratge cripto no s’ha executat: Didit fa la crida d’analítica necessària una sola vegada i en transmet el valor complet: la transacció es cobra la tarifa estàndard de Wallet Verification & Screening ($0.15 amb l’analítica gestionada per Didit) i rep en resposta la sortida completa del cribratge cripto (puntuació de risc, categoria de risc de la cartera, instantània de la xarxa), no només el nom del VASP. La línia d’ús es marca amb l’activador travel_rule_attribution perquè el cobrament sigui explicable.
  • Clau d’analítica pròpia: s’aplica la mateixa tarifa de plataforma que al monitoratge cripto amb la teva pròpia clau ($0.02 per crida). El teu proveïdor et factura directament la consulta subjacent.
  • Les consultes fallides mai no es cobren, els reenviaments reutilitzen l’atribució registrada sense una nova crida ni cobrament, i les aplicacions de sandbox mai no es cobren.
Així, una transferència de sortida que ha necessitat atribució costa $0.02 (Travel Rule) més un cobrament de Wallet Verification & Screening; i quan els dos productes estan activats, la crida d’analítica i el seu cobrament només es fan una vegada.

Regles del paquet TFR de la UE

El paquet travel_rule_eu_tfr inclou quatre regles predefinides, pensades específicament per a les obligacions del TFR de la UE. Com amb qualsevol altre paquet de regles predefinit, activa’l des de la Business Console a Transactions → Rules → Library. Aquestes regles s’activen en cada transició rellevant (en crear la transferència, en confirmar la titularitat, quan es rep la resposta de recollida per correu electrònic i des del procés de revisió de caducitats), de manera que una transferència que mai no es resol continua visible per a la revisió de compliment en lloc de liquidar-se sense que ningú se n’adoni.

Per què això funciona millor en una sola plataforma

El compliment de la Travel Rule és un problema d’identitat disfressat de problema de pagaments, i Didit ja té la identitat:
  • Dades verificades a l’abast. El subjecte de cada transferència està vinculat mitjançant vendor_data al perfil KYC que Didit va verificar en l’alta (OCR del document, prova de vida, coincidència facial), de manera que pots construir originator_data a partir de camps verificats en la mateixa plataforma. Per a un usuari amb una verificació KYC aprovada, Didit transmet la identitat verificada en lloc dels valors que hagis escrit (consulta Dades verificades i procedència).
  • Biometria de verificació addicional per a transferències de risc. Una regla pot retenir qualsevol transferència d’alt valor fins que l’usuari superi una nova comprovació biomètrica contra la cara capturada en l’alta. És la resposta més sòlida possible a la presa de control del compte en el moment de la retirada. Consulta l’exemple pas a pas.
  • Un sol graf de dispositius. Les transferències enviades des de l’SDK porten la mateixa intel·ligència de dispositiu que les sessions KYC, de manera que «dispositiu nou + import alt + beneficiari per primera vegada» és una única regla, no una unió en un magatzem de dades.
  • Cribratge, regles, casos i l’intercanvi en un sol lloc. El cribratge de carteres que atribueix el VASP de la contrapart és el mateix cribratge que veuen les teves regles i analistes: un sol càrrec, una sola consola i un sol registre d’auditoria.
  • Preus publicats. $0.02 per intercanvi de sortida, sense trams de volum i sense haver de trucar a vendes.

Preguntes freqüents

Com funciona l’intercanvi

Didit executa l’intercanvi per si mateix. Quan envies una transferència travelRule, Didit fa un descobriment de la contrapart en directe, envia les dades de l’ordenant i del beneficiari al VASP receptor per les vies que les transporten, i marca la transferència com a COMPLETED només quan la part de la contrapart la confirma: és un establiment de connexió gestionat, no un registre posterior a la liquidació. Una resposta de la contrapart es processa en totes les vies excepte TRUST, que només envia, de manera que una transferència per aquesta via caduca en lloc de completar-se. Per GTR, VERIFYVASP i SYGNA, Didit llegeix la resposta de la xarxa o la consulta cada 5 minuts, i cap intercanvi per aquestes vies no s’ha completat encara contra una xarxa en funcionament; per TRP, una resposta que la contrapart no dona de seguida necessita l’amfitrió públic TRP de Didit, que encara no està actiu (vegeu Xarxes de Travel Rule). Didit també conserva el registre complet i l’estat de compliment de cada intercanvi (un cicle de vida de 13 estats, webhooks i un registre d’auditoria). Si prefereixes executar Travel Rule amb el teu propi procés, Didit pot registrar en lloc d’això les dades de manera passiva com a únic sistema de registre (vegeu la pregunta sobre el registre passiu). Hi ha dos modes disponibles: l’intercanvi actiu s’executa quan poses is_enabled: true a la configuració (per defecte és false), i fins llavors Didit registra les dades de manera passiva.
És natiu. Didit executa la seva pròpia implementació del Travel Rule Protocol (TRP), servida a trp.didit.me quan aquest amfitrió públic estigui en funcionament (encara no respon, de manera que les contraparts no et poden contactar per TRP avui), i implementa directament els protocols de xarxa del sector: GTR (Global Travel Rule), TRUST, VerifyVASP i Sygna Bridge (amb implementació nativa, incloent-hi IVMS 101 xifrat amb ECIES de Sygna i les sol·licituds de permís signades). Didit no és revenedor d’una única capa d’interoperabilitat de tercers. Arribar a una contrapart que és en una xarxa de membres específica necessàriament passa per aquella xarxa (no hi ha un únic canal universal en Travel Rule), però el descobriment, l’establiment de connexió, la verificació i el registre els executa Didit. Avui cada via de xarxa necessita la teva pròpia membresia, i TRUST només envia: vegeu Visió general.
Implementats de forma nativa, provats en estricte ordre de prioritat: INTERNAL (els dos VASP a Didit), TRP (OpenVASP Travel Rule Protocol), GTR, TRUST, VerifyVASP, Sygna Bridge, i una alternativa EMAIL per a contraparts sense eines. Les vies de xarxa necessiten avui la teva pròpia membresia, TRUST només envia, i la recepció per una xarxa encara no està activada: vegeu Xarxes de Travel Rule. CODE, TRISA, Notabene i Veriscope apareixen al Marketplace de Didit com a rajoles de sol·licitud d’accés, sense integració encara. Vegeu Com encamina Didit un intercanvi per a la taula d’encaminament completa, i Xarxes de Travel Rule per saber què abasta cadascuna avui.
TRP és la base que recomanem: no necessita cap membresia compartida, compartir la teva Travel Address permet que qualsevol VASP que parli TRP et contacti, i quan una contrapart només es coneix per l’adreça, l’atribució amb analítica de blockchain l’encamina per TRP només si l’entrada del directori atribuïda ja té un endpoint TRP. En sortida, Didit envia per aquesta via els actius enumerats a Identificadors d’actius TRP, i una contrapart que no respon de seguida necessita l’amfitrió públic TRP de Didit, que encara no està actiu. Per a les xarxes de membres, tria segons on operen les teves contraparts: GTR ofereix una àmplia cobertura global, TRUST està orientada a VASP dels EUA, i VerifyVASP (que ara també opera Sygna Bridge) té una bona cobertura a Àsia. Sí, avui necessites la teva pròpia membresia: Didit no té cap membresia de plataforma en aquestes xarxes encara i s’està donant d’alta com a proveïdor. Connecta la teva membresia a Marketplace; no estàs limitat a una única xarxa. Recorda que TRUST només envia, de manera que una transferència per aquesta via no es completa, i que cap intercanvi per una xarxa no s’ha completat encara contra una xarxa en funcionament.
Mitjançant una cadena de resolució: un altre client de Didit que ha demostrat el control de la cartera (la via INTERNAL), la teva pròpia llibreta d’adreces per a una Travel Address emmagatzemada, després les vies de protocol i de xarxa, i després l’atribució amb analítica de blockchain. Si la transferència porta només una cartera de destinació, Didit la resol amb dades d’analítica de blockchain per atribuir la casa d’intercanvi o el servei de custòdia contrapart i la cataloga al directori de VASP. La transferència només s’encamina automàticament si aquesta entrada del directori ja té una ruta, com un endpoint TRP; en cas contrari acaba amb COUNTERPARTY_VASP_NOT_FOUND amb el nom de la contrapart registrat, i pots tornar a enviar-la quan existeixi una ruta, per exemple després d’emmagatzemar el travel_address de la contrapart a la teva entrada de llibreta d’adreces per a aquella cartera (per als actius enumerats a Identificadors d’actius TRP).

Preus i llicències

Travel Rule és un producte separat, de pagament per ús. No està inclosa en la verificació d’identitat. Costa **$0.02 per cada intercanvi de sortida que s'inicia** ([preus publicats](#preus), sense nivells de volum, sense trucada comercial). Quan l'encaminament necessita una consulta d'analítica de blockchain per identificar el VASP contrapart, aquesta consulta es cobra una vegada a la [tarifa d'atribució](#preus-de-l’atribució): des de $0.15 si és gestionada, o $0.02 amb una clau de proveïdor existent. No es torna a cobrar si el monitoratge de criptoactius ja ha fet el cribratge de la mateixa cartera. Una transferència per sota del teu llindar, o una registrada amb Travel Rule desactivada, es factura com a Transaction Screening; les transferències d’entrada, com els trams que Didit encunya al costat del beneficiari, no es cobren la tarifa de Travel Rule.
No. Una transacció travelRule es factura en una sola línia: la tarifa de Travel Rule ($0.02) quan inicia un intercanvi de sortida, i altrament el Transaction Screening estàndard. La consulta d’analítica de blockchain es cobra una vegada: si el monitoratge de criptoactius ja ha fet el cribratge de la cartera de destinació de la transacció, l’atribució reutilitza aquell resultat emmagatzemat sense cost addicional. Els trams d’entrada que Didit encunya al costat del beneficiari no es cobren mai la tarifa de Travel Rule.
Sí. La detecció KYT i el monitoratge de transaccions de Didit, el cribratge AML i de sancions, l’anàlisi de risc de cartera amb analítica de blockchain i les capacitats de Travel Rule estan documentades públicament a docs.didit.me, i pots citar aquestes pàgines en un expedient regulador lliurement. Per a una declaració formal de capacitats del producte adaptada a una presentació concreta (per exemple, una sol·licitud de llicència VASP d’AIFC/AFSA, MiCA o d’una altra), contacta amb l’equip responsable del teu compte a Didit amb el format que exigeixi el teu regulador.

Operacions i dades

Es resolen immediatament com a NOT_APPLICABLE: no es prova cap canal i cap dada d’identitat surt de Didit. La transacció es factura com a Transaction Screening estàndard, no com a tarifa de Travel Rule. Didit compara el llindar amb l’import convertit a la moneda per defecte de la teva aplicació. Si Didit no pot convertir l’import, el llindar no s’aplica i la transferència s’intercanvia. El TFR de la UE no té mínim, per tant els CASP de la UE haurien de mantenir threshold_amount a 0.00.
La transferència es queda a AWAITING_COUNTERPARTY fins que transcorrin confirmation_timeout_hours; llavors un procés automàtic la passa a EXPIRED i aplica el teu timeout_outcome a la transacció subjacent: HOLD per a revisió, REJECT per rebutjar-la o PROCEED per deixar-la sense canvis. La regla predefinida tr_eu_expired_review a més mostra cada expiració als teus analistes. Una contrapart que no rep mai el missatge és diferent: Didit el reintenta i, després del sisè intent fallit, la transferència passa a COUNTERPARTY_VASP_NOT_REACHABLE (vegeu Lliurament i reintents).
Sí: és el canal EMAIL. El seu contacte de compliment rep un enllaç de recollida d’un sol ús i pot confirmar o rebutjar l’intercanvi des d’una pàgina allotjada, sense compte de Didit, sense clau d’API i sense cap integració. Per als dipòsits que ja s’han liquidat abans de ser possible cap intercanvi, utilitza el registre sunrise posterior al dipòsit.
Declara la destinació com a autoallotjada (payment_method.method_type: "unhosted_wallet"). Didit omet l’encaminament cap a VASP i, en lloc d’això, recull prova que el teu client controla la cartera (signatura de missatges, prova Satoshi, captura de pantalla o autodeclaració) mitjançant el widget de titularitat de la cartera. Això és l’obligació del TFR de la UE sobre carteres autoallotjades en forma d’API.
Sí. Fins que la titularitat de la cartera no es confirmi pel teu costat, les dades personals de la contrapart en una transferència entrant s’emmascaren, tant a l’objecte de la transferència com a la part de contrapart de la transacció (vegeu Dades de contrapart emmascarades). Les pàgines de recollida per correu només mostren el resum de la transferència (nom del VASP ordenant, import, cartera de destinació), mai els payloads de les persones. Els intercanvis pels canals s’executen sobre HTTPS, i les xarxes (GTR, TRUST, VERIFYVASP, SYGNA) a més xifren el payload IVMS amb la clau pública del VASP receptor.
Sí. Amb Travel Rule desactivada, qualsevol travel_rule_details que enviïs (inclòs un status indicat per qui fa la crida, actual o antic) es registra de manera passiva a la transacció: no es dispara cap canal ni es negocia res. Utilitza-ho per omplir dades retroactivament o per executar el teu propi procés mantenint un sol registre de referència.
Utilitza una aplicació sandbox amb Travel Rule activada. El sandbox omet les regles, la facturació i els webhooks transaction.created i transaction.status.updated, i cada intercanvi sortint va al Didit Test VASP pel canal TEST_VASP, que respon dins de Didit amb l’escenari que triïs: acceptar, rebutjar, discrepància de nom, no accessible, temps d’espera esgotat o autoallotjada. Reps webhooks travel_rule.status.updated marcats amb environment: sandbox, i cap missatge arriba a una contrapart real. Per a transferències entrants, fes que el VASP de prova t’enviï una transferència amb Activar una transferència entrant del VASP de prova, o registra’n una amb POST /v3/travel-rule/inbound/; ambdues es decideixen segons la llibreta d’adreces de carteres: ON_HOLD, UNCONFIRMED_OWNERSHIP, COUNTERPARTY_MISMATCHED_DATA, o COMPLETED i després FINISHED. Per a un intercanvi entre dues parts amb una altra aplicació real, utilitza dues de les teves aplicacions en producció pel canal INTERNAL: la receptora ha de ser localitzable i demostrar el control de la cartera de destinació amb un missatge signat o un dipòsit de prova.

Següents passos

Widget de titularitat de la cartera

Demostra que un client controla una cartera mitjançant signatura, prova Satoshi, captura de pantalla o autodeclaració.

Interoperabilitat

Els endpoints orientats a la contrapart que altres VASP utilitzen per contactar-te: TRP, callbacks, recollida per correu, sunrise.

Xarxes

A què arriba cada canal i xarxa avui, i què encara requereix una afiliació.

Prova al sandbox

Prova tots els resultats amb el Didit Test VASP abans de passar a producció.

Enviament de transaccions

Com incloure dades de Travel Rule al payload de Create Transaction.

Biblioteca de regles

El catàleg complet de regles predefinides, inclòs el paquet de Travel Rule.

Webhooks

Subscriu-te a travel_rule.status.updated i a la resta de famílies d’esdeveniments.

Guia de la consola

Consulta de l’estat de Travel Rule a la vista de detall de la transacció.
Darrera modificació el 7 de novembre del 2026