is_ownership_verified: true, il che consente a un trasferimento Travel Rule collegato di uscire da UNCONFIRMED_OWNERSHIP.
Quando Didit lo genera per te
Raramente hai bisogno di generare una sessione manualmente. Quandoauto_wallet_verification è attivo nelle tue impostazioni Travel Rule (impostazione predefinita), Didit genera automaticamente una sessione del widget alla creazione della transazione, ogni volta che un trasferimento richiede la prova del controllo del wallet da parte dell’utente finale:
- Il trasferimento è in
UNCONFIRMED_OWNERSHIP: il wallet della controparte è stato dichiarato in autocustodia al momento dell’invio. - Il trasferimento è in uscita e si trova in
COUNTERPARTY_VASP_NOT_FOUND: non è stato possibile identificare alcun VASP della controparte, quindi la prova della proprietà è l’unica via rimasta per il completamento.
action_required della transazione (type: "wallet_ownership", con l’url da aprire), e gli SDK la avviano automaticamente all’invio lato client.
I trasferimenti in entrata che Didit crea per te (una registrazione sunrise, una richiesta TRP in entrata o il ramo in entrata del canale INTERNAL) non ricevono mai una sessione generata automaticamente, anche quando finiscono in UNCONFIRMED_OWNERSHIP.
Genera manualmente una sessione con POST /v3/travel-rule/widget-session/ quando vuoi pre-verificare un wallet prima che esista qualsiasi trasferimento, quando auto_wallet_verification è disattivato, oppure per uno di questi trasferimenti in entrata.
Cosa dimostra
Il widget offre fino a quattro metodi di prova. Quali compaiono dipende da come hai creato la sessione e dalle tue impostazioni Travel Rule:Contratto di verifica per la firma del messaggio
L’invio della firma restituisce200 con status: "VERIFIED" quando dimostra di controllare il wallet.
Restituisce 400 e lascia la prova aperta, così il cliente può firmare di nuovo, con uno di questi valori di code:
Contratto di verifica del test Satoshi
La verifica di un deposito del test Satoshi è asincrona, perché la transazione deve essere vista on-chain e poi confermata. L’invio deltxid del deposito restituisce 200 con status: "PENDING" finché il deposito non è ancora confermato on-chain - il txid viene conservato, non scartato.
Restituisce 200 con status: "VERIFIED" quando il deposito viene confermato.
Restituisce 400 con status: "REJECTED" per un deposito realmente errato: inviato da un altro wallet, con importo diverso da quello atteso verso l’indirizzo di deposito, più vecchio della challenge, oppure una transazione che ha già dimostrato un altro wallet. La prova viene chiusa e il cliente può avviarne una nuova finché la sessione ha tentativi disponibili.
Un deposito non ancora indicizzato restituisce anch’esso 200 con status: "PENDING", e una ricerca non riuscita lato Didit restituisce 400 con codice DEPOSIT_LOOKUP_FAILED: in entrambi i casi la prova resta aperta e Didit continua a controllare.
Restituisce 410 se la finestra del test scade prima che venga rilevato un deposito valido.
Una volta inviato un txid, un job in background ricontrolla il deposito in attesa ogni cinque minuti e completa la prova dopo la conferma della transazione, quindi il cliente non deve inviare di nuovo il txid.
Quando passi un satoshi_deposit_address, il valore expires_at della sessione del widget viene esteso ad almeno la finestra di 24 ore del test Satoshi, così il deposito ha tempo di confermarsi prima che scada la sessione.
Flusso
1
Genera una sessione widget
Chiama
POST /v3/travel-rule/widget-session/ con il wallet da verificare. Facoltativamente, collegalo a un trasferimento, così il trasferimento avanza automaticamente una volta dimostrata la proprietà.2
Apri l'URL restituito
Indirizza il cliente all’
url della risposta. Lì completa una prova: non servono un account Didit né una chiave API, perché il token nell’URL è l’autenticazione.3
Rileva il completamento
Quando una prova viene verificata, il widget contrassegna la voce della rubrica degli indirizzi come verificata e, se la sessione è collegata a un trasferimento, lo fa avanzare. Osserva
travel_rule.status.updated (per i trasferimenti collegati) oppure interroga il contesto del widget.Genera una sessione widget
Questo esempio collega la sessione al trasferimento dichiarato verso un wallet in autocustodia della guida Travel Rule, quindiwallet_address è il wallet di destinazione di quel trasferimento.
Una sessione collegata a un trasferimento accetta solo prove relative al wallet della controparte del trasferimento.
url restituito nella risposta così com’è: non costruirlo tu.
Apri l’URL restituito
Rileva il completamento
Il widget espone un endpoint di lettura pubblico identificato dal token: interrogalo per vedere l’avanzamento, oppure affidati ai webhook quando la sessione è collegata a un trasferimento:completed_atdiventa non nullo non appena una prova viene verificata.- Ogni voce in
proofscontiene i campi richiesti dal suo metodo: una provaSATOSHI_TESTaggiungedeposit_address,expected_amounte il proprioexpires_at; una provaMESSAGE_SIGNINGaggiungechallenge, la stringa che il cliente firma. - Una prova
SATOSHI_TESTpuò restare instatus: "PENDING"mentre il suo deposito è visto on-chain ma non ancora confermato, senza alcuna azione richiesta né a te né al cliente: vedi contratto di verifica del test Satoshi sopra. - Quando la sessione è stata generata con un
transaction_id, la verifica della prova fa avanzare il trasferimento collegato e, su un’applicazione in produzione, parte il webhooktravel_rule.status.updated. Preferisci il webhook al polling. Una richiestaTRPin entrata viene approvata e restituita al mittente, e passa aCOMPLETEDnon appena l’approvazione viene consegnata. Qualsiasi altro trasferimento inUNCONFIRMED_OWNERSHIP(o un trasferimento in entrataON_HOLD) passa aCOMPLETED, oppure aCOUNTERPARTY_MISMATCHED_DATAquando il nome del beneficiario non corrisponde al titolare del wallet. Un deposito sunrise regolato che si completa prosegue fino aFINISHED. Un trasferimento in uscita inCOUNTERPARTY_VASP_NOT_FOUNDpassa aCOMPLETED. - Una prova
SCREENSHOTresta instatus: "PENDING"in questo contesto anche dopo che confermi la proprietà. La approvi conPOST .../travel-rule/ownership/, che accetta solo un trasferimento in attesa di conferma della proprietà. Uno screenshot quindi non ha alcun percorso di approvazione su una sessione senza trasferimento collegato, oppure su una sessione collegata a un trasferimento in uscita inCOUNTERPARTY_VASP_NOT_FOUND: disattivaallow_screenshot_proofse in quelle sessioni non deve essere offerto. - Dopo una prova rifiutata, la sessione consente un nuovo tentativo finché restano tentativi.
max_attempts,attempts_usedeattempts_remainingriportano il conteggio, una prova rifiutata contienerejection_reason, e quandoattempts_remainingè0avviare un’altra prova restituisce409e devi generare una nuova sessione. - L’endpoint del contesto restituisce
404per un token sconosciuto e410quando la sessione è scaduta senza essere completata.
Qui non ci sono dipendenze una tantum: il widget e il tuo backend convergono sullo stesso stato durevole (la voce della rubrica verificata e lo stato del trasferimento). Quindi un webhook perso o una scheda chiusa si recuperano sempre rileggendo il trasferimento o il contesto del widget.
Localizzazione e branding
Il widget viene visualizzato in 54 lingue, in base alla lingua indicata nel link (oppure la lingua predefinita del browser). Quando il White label è attivo per la tua applicazione, il widget eredita automaticamente il branding del flusso di verifica: logo, colori del brand, stile di pulsanti e pannelli, font personalizzato, favicon e il nome pubblico della tua app nel titolo. Non serve alcuna configurazione aggiuntiva: si applica la stessa personalizzazione che hai impostato per le sessioni KYC. Un utente che torna a un link già completato vede di nuovo la schermata di completamento; se hai passato uncallback_url, il widget lo riporta lì.
I link scaduti mostrano una schermata di scadenza con il tuo brand, che invita l’utente a richiederne uno nuovo.
Crea una nuova sessione per l’utente con POST /v3/travel-rule/widget-session/: reinviare un trasferimento con action: "resend" non ne crea una.
Prossimi passi
Travel Rule
Il ciclo di vita completo dello scambio, i canali, le impostazioni e i flussi di ricezione.
Rubrica degli indirizzi wallet
Registra i wallet che controlli, così i trasferimenti in entrata vengono associati a questi wallet.
Webhook
Iscriviti a travel_rule.status.updated per reagire quando una prova fa avanzare un trasferimento.
SDK nativi
Apri l’URL del widget con il browser di sistema, non con la webview dell’SDK.