Vai al contenuto principale
POST
curl

Wallet in autocustodia

Quando il wallet della controparte è stato dichiarato in autocustodia (counterparty.payment_method.method_type: "unhosted_wallet"), la transazione resta in UNCONFIRMED_OWNERSHIP. Chiamando questo endpoint con confirmed: true si registra che il tuo cliente ha verificato chi controlla quel wallet, e la transazione viene completata (COMPLETED), sia per i prelievi in uscita sia per i depositi in entrata. Un deposito in entrata il cui hash on-chain è già noto passa a FINISHED. Il wallet verificato è quello della controparte: la destinazione di un prelievo in uscita oppure la sorgente (il wallet dell’ordinante) di un deposito in entrata. Didit lo aggiunge alla rubrica degli indirizzi come wallet di cui è stata verificata la proprietà, a nome della controparte, quindi viene confrontato con il nome della controparte (dell’ordinante, nel caso di un deposito). Se nella rubrica degli indirizzi quel wallet è già associato a un nome del titolare diverso, la transazione passa invece a COUNTERPARTY_MISMATCHED_DATA. Se la transazione non indica alcun wallet della controparte, passa wallet_address nel corpo della richiesta. Quando né la transazione né la richiesta forniscono un indirizzo di wallet, la richiesta viene rifiutata con 400. confirmed: false rifiuta la transazione (COUNTERPARTY_VASP_GENERAL_DECLINE).

Autorizzazioni

x-api-key
string
header
obbligatorio

La chiave API della tua applicazione, da Developers -> API keys nella Business Console. La chiave primaria ha accesso completo. Una chiave con nome può avere un ambito definito: nessuno, lettura o scrittura per risorsa, limitata ad alcuni workflow o a sessioni approvate, a un elenco di indirizzi IP e a una data di scadenza. 401 indica che la chiave è errata, revocata o scaduta; 403 indica che non è stata inviata alcuna chiave, che la chiave non ha accesso a questa risorsa o azione, oppure che la richiesta proviene da un indirizzo non incluso nel suo elenco IP; 404 su una route di sessione indica che la sessione non rientra nei workflow o negli stati previsti dalla chiave. Una chiave senza accesso ai media riceve gli URL di immagini, video e PDF come null, e una chiave senza permessi di scrittura sulle sessioni riceve link e token di sessione come null. Consulta https://docs.didit.me/console/api-keys.

Parametri del percorso

transaction_id
string<uuid>
obbligatorio

UUID stabile di Didit della transazione che la tua applicazione detiene per questo trasferimento: la transazione lato beneficiario su un trasferimento su circuito INTERNAL, o la transazione che hai creato (in entrata o in uscita) quando il wallet della controparte è stato dichiarato in autocustodia.

Corpo

application/json
confirmed
boolean
obbligatorio

true per confermare l'assetto proprietario, false per negarlo.

wallet_address
string
predefinito:""

Trasferimenti TRP in entrata: l'indirizzo di pagamento restituito da Didit al VASP ordinante al momento dell'approvazione. Il valore predefinito corrisponde all'indirizzo della voce della rubrica corrispondente, quindi a beneficiary_data.wallet_address. Nel caso di un trasferimento dichiarato verso un wallet in autocustodia che non specifica un wallet di controparte, il wallet di cui hai verificato l'assetto proprietario; in sua assenza la richiesta viene rifiutata con 400. Ignorato per altri trasferimenti.

Risposta

Il trasferimento aggiornato. Per un trasferimento in entrata, i dati originator_data/beneficiary_data della controparte rimangono mascherati (data_masked: true) finché la titolarità non viene confermata; successivamente data_unmasked registra quando, perché e da chi.

Oggetto di trasferimento completo restituito dagli endpoint di conferma della titolarità e di completamento/annullamento. Finché la titolarità del wallet di un trasferimento in entrata non è confermata, i campi originator_data e beneficiary_data della controparte vengono restituiti mascherati (viene mantenuta la prima lettera di ogni parola; il wallet, la chain e l'instradamento VASP rimangono leggibili) e data_masked è true.

uuid
string<uuid>
status
enum<string>
Opzioni disponibili:
AWAITING_COUNTERPARTY,
ON_HOLD,
COMPLETED,
FINISHED,
CANCELLED,
EXPIRED,
COUNTERPARTY_MISMATCHED_DATA,
COUNTERPARTY_VASP_NOT_FOUND,
COUNTERPARTY_VASP_NOT_REACHABLE,
UNCONFIRMED_OWNERSHIP,
COUNTERPARTY_VASP_GENERAL_DECLINE,
NOT_ENOUGH_COUNTERPARTY_DATA,
NOT_APPLICABLE
direction
enum<string>
Opzioni disponibili:
INBOUND,
OUTBOUND
rail
enum<string> | null

Il canale (rail) su cui è stato instradato il trasferimento, o null quando non è stato selezionato alcun canale (ad esempio sotto la soglia, un wallet della controparte in autocustodia, una registrazione post-deposito o nessuna controparte raggiungibile). INTERNAL indica che entrambe le parti sono applicazioni Didit; EMAIL indica che la controparte è stata raggiunta tramite un link di ritiro inviato via email. TEST_VASP indica che il Didit Test VASP ha risposto al trasferimento sandbox. Tramite GTR, VERIFYVASP e SYGNA, Didit legge la risposta della controparte dalla risposta della rete o effettuando un polling ogni 5 minuti. TRUST invia soltanto, quindi un trasferimento TRUST rimane AWAITING_COUNTERPARTY fino alla scadenza. Un canale di rete viene utilizzato solo dopo aver collegato la propria iscrizione per tale rete. Viene scelto dopo che la creazione della transazione ha restituito risposta, quindi è null in tale risposta.

Opzioni disponibili:
INTERNAL,
TRP,
GTR,
TRUST,
VERIFYVASP,
SYGNA,
EMAIL,
TEST_VASP,
null
protocol
string | null
ivms_version
string
Esempio:

"ivms101.2023"

required
boolean
ownership_confirmed
boolean | null
deadline_at
string<date-time> | null
timeline
object[]
counterparty_vasp
object | null
originator_data
object

Soggetto ordinante. Per un trasferimento in entrata, i valori della controparte sono oscurati fino alla conferma dell'assetto proprietario.

beneficiary_data
object

Parte beneficiaria. Per un trasferimento in entrata i valori della controparte sono mascherati fino a quando non viene confermato l'assetto proprietario.

name_match
object · null · null

Il confronto dei nomi che ha determinato il trasferimento, o null fino all'esecuzione. Mentre le parti sono oscurate, e sulla copia dell'altro cliente di uno scambio INTERNAL, transfer_name, compared_name, matched_names e mismatched_names rimangono nascosti. score e matched possono discordare: matched segue il livello di rigore, score è la somiglianza dei due nomi completi.

data_match
object | null

Confronto campo per campo tra i dati della parte del trasferimento e ciò che l'altra parte sa sul titolare del wallet. Riporta i nomi dei campi e i risultati, mai i valori, in modo che rimanga leggibile mentre i dati della controparte sono oscurati. Null finché non viene eseguito un confronto.

mismatched_fields
string[]

Scorciatoia per data_match.mismatched_fields. Vuoto quando non ci sono differenze.

data_unmasked
object | null

Registro di audit del momento in cui i dati della controparte sono stati smascherati. Null finché i dati sono ancora mascherati e per i trasferimenti in uscita.

data_masked
boolean

True mentre i dati personali della controparte sono mascherati in questa risposta.

created_at
string<date-time>
delivery
object | null

Lo stato dell'ultimo messaggio dovuto da questo trasferimento alla controparte. Null quando il trasferimento non ha mai dovuto inviarne uno (ad esempio al di sotto di threshold_amount, un wallet in autocustodia dichiarato o una registrazione sunrise).

discovery
object[]

Modalità con cui Didit ha cercato la controparte, una voce per ogni passaggio eseguito. Vuoto se non è stata eseguita alcuna ricerca, ad esempio per un trasferimento in entrata.

reason
string

Il motivo per cui un trasferimento COUNTERPARTY_VASP_NOT_FOUND o COUNTERPARTY_VASP_NOT_REACHABLE è bloccato; "" per qualsiasi altro stato. Una consegna non riuscita lo determina per prima, solo su COUNTERPARTY_VASP_NOT_REACHABLE: email_undeliverable (il provider di posta ha rifiutato l'email di compliance e non è rimasto alcun indirizzo da provare: quando è stata inviata, in un promemoria o come bounce permanente segnalato successivamente) o delivery_failed (il canale che effettuava la consegna è fallito definitivamente: un canale di rete ha rifiutato il messaggio o ha esaurito i tentativi, un host di identità TRP non ha risposto o l'host TRP della controparte non ha accettato la richiesta). Altrimenti lo determina la traccia di discovery: awaiting_end_user (nessun passaggio ha indicato una controparte raggiungibile da Didit), directory_match_no_route (un passaggio ha indicato un VASP della directory privo di rotta), picked_member_without_proven_wallet (l'utente finale ha scelto un cliente Didit che non ha dimostrato il controllo del wallet) o no_directory_match quando la traccia non fornisce altri motivi. Un nuovo invio fa avanzare il trasferimento, quindi il motivo viene azzerato. Consulta Perché un trasferimento è bloccato.

next_actions
object[]

Cosa fa procedere il trasferimento; [] per qualsiasi stato tranne COUNTERPARTY_VASP_NOT_FOUND o COUNTERPARTY_VASP_NOT_REACHABLE. email_undeliverable propone update_compliance_email, poi resend. delivery_failed propone resend. Un motivo di discovery propone select_counterparty_vasp, declare_self_hosted, add_vasp_hint e resend.

chain_details
object

In che modo la blockchain del trasferimento identifica i suoi due wallet, quando si tratta di più di un indirizzo che ne paga un altro. Vuoto ({}) per un trasferimento su blockchain basata su account (EVM, Solana, Tron), dove i due indirizzi corrispondono ai wallet. La corrispondenza, l'instradamento e la rubrica leggono innanzitutto i wallet da qui.

Ultima modifica il 7 novembre 2026