Errore txn_id duplicato
Sintomo. L’invio di una transazione restituisce 400 con A transaction with this transaction_id already exists. sul campo transaction_id, oppure 409 quando due richieste identiche si sovrappongono.
Causa. txn_id (il transaction_id che invii) è univoco per applicazione.
Didit rifiuta una seconda transazione con lo stesso transaction_id e non restituisce il record esistente.
Soluzione.
- Genera
txn_idin modo deterministico dal tuo lato (ad esempio usando l’ID della tua tabella delle transazioni). - In caso di
400o409per untransaction_idduplicato durante un nuovo tentativo, cerca la transazione esistente invece di inviarla di nuovo: leggila conGET /v3/transactions/{uuid}/usando l’uuiddella prima risposta, oppure usa iltransaction_id(l’uuid di Didit) che il webhooktransaction.createdriporta accanto al tuotxn_id. - Se la richiesta non era un nuovo tentativo, assegna alla nuova transazione un proprio
transaction_id.
La regola non si attiva
Sintomo. Hai creato una regola che dovrebbe corrispondere, ma nessuna transazione la mostra inrule_runs[] con matched: true.
Cause e soluzioni.
- L’applicazione è in modalità sandbox: un’applicazione sandbox salta la valutazione delle regole, lo screening AML, la fatturazione e i webhook
transaction.createdetransaction.status.updated. Gli scambi Travel Rule vengono comunque eseguiti quando sono abilitati, verso il Didit Test VASP, e inviano webhooktravel_rule.status.updatedcontrassegnati conenvironment: sandbox.rule_runstorna vuoto e il punteggio resta0, qualunque sia la modalità delle tue regole, e la transazione restaAPPROVEDa meno che un trasferimento Travel Rule in scadenza non applichi il tuotimeout_outcome. Controllaenvironmentnella risposta della transazione:"sandbox"significa che non è mai stata valutata. Consulta Transaction Monitoring in sandbox per capire come validare una regola prima che vada in produzione. - La modalità della regola è
DISABLEDoTEST: controlla Rules → [rule] → Mode. Solo le regoleACTIVEcontribuiscono al punteggio; le regoleTESTvengono valutate ma non influiscono sullo stato. - Il filtro di ambito esclude la transazione: ad esempio, uno scope impostato su
transaction_type = financenon corrisponde alle transazionitravelRule. - La finestra di aggregazione è più corta del necessario: una regola “20 transazioni in 30 giorni” non si attiva dopo sole 15 transazioni.
- Il campo della condizione è null: ad esempio, la tua regola verifica
counterparty.country_codema non hai inviato una controparte. - Conversione valutaria: la regola usa come soglia
amount_in_default_currency; se la valuta predefinita della tua applicazione è diversa dalla valuta della transazione, l’importo convertito potrebbe risultare sotto la soglia.
La regola si attiva su tutto
Sintomo. Una regola si attiva sul 90%+ delle transazioni: la tua coda di revisione è sommersa. Causa. Le condizioni sono troppo ampie oppure le soglie sono troppo basse. Soluzione.- Aggiungi filtri
scopeper restringere l’applicabilità (ad esempio solo transazioni in uscita, solo determinati tipi di transazione). - Alza le soglie (importi, numero di operazioni nel periodo).
- Imposta la regola in modalità
TESTper una settimana: analizza irule_runsper vedere il tasso di corrispondenza e restringi le condizioni prima di riattivarla.
Timeout dello screening crypto
Sintomo. La transazione è completata constatus: APPROVED, ma l’array provider_results[] mostra status: FAILED per un wallet, un hash di transazione o un provider di screening crypto.
Cause.
- L’API del provider è stata brevemente non disponibile.
- La query è scaduta (in genere dopo circa 10 s).
- Le transazioni non falliscono mai a causa dei provider: l’arricchimento viene eseguito al meglio delle possibilità.
- Se un provider specifico fallisce ripetutamente, controlla la sua pagina di stato o apri un ticket di supporto.
- Valuta di configurare le preferenze dei provider in Settings → Transaction Monitoring → Providers per instradare le richieste verso provider alternativi.
Arricchimento IP mancante
Sintomo.applicant.ip_enrichment di una transazione è assente o parziale.
Cause.
- Nell’invio manca
applicant.device.ip. - L’IP è privato o riservato (non instradabile).
- Tutti i provider di arricchimento erano temporaneamente non disponibili.
- Acquisisci l’IP di chi invia nel tuo client o server e passalo in ogni transazione.
- Usa solo IP instradabili: Didit ignora silenziosamente gli intervalli privati.
- Controlla lo stato dei provider in Settings → Status nella console.
Mancata corrispondenza della firma del webhook
Sintomo. Il tuo endpoint rifiuta gli eventi perché la firma non corrisponde. Cause.- Il corpo grezzo è stato modificato (JSON serializzato di nuovo con spaziatura diversa).
- Segreto errato.
- Più destinazioni webhook con lo stesso URL: le firme sono diverse per ogni destinazione.
- Calcola la firma sul corpo grezzo della richiesta, non sul JSON analizzato. Molti framework espongono un middleware per il corpo grezzo.
- Ruota il segreto se è compromesso: Webhook destinations → [destination] → Rotate secret.
- Mantieni una sola destinazione per URL, per evitare confusione tra i segreti.
Il webhook non arriva
Sintomo. Le transazioni vengono create, ma i webhook non arrivano mai. Cause.enableddella destinazione èfalse.- L’URL non è raggiungibile pubblicamente.
- La destinazione webhook è stata disattivata automaticamente dopo ripetuti errori.
- L’evento non è incluso in
subscribed_events.
- Invia un evento di test: Webhook destinations → [destination] → Send test.
- Controlla le consegne recenti: Webhooks → [destination] → Deliveries. Vedrai le risposte 4xx/5xx con corpo e intestazioni.
- Riattiva le destinazioni webhook disattivate.
La conversione valutaria sembra errata
Sintomo.amount_in_default_currency non corrisponde al tasso che ti aspetti.
Cause.
- Il tasso di cambio è il tasso medio di mercato alla data
txn_date. - Le transazioni retrodatate usano il tasso storico di quella data.
- Alcune valute (valute esotiche) hanno intervalli di aggiornamento più ampi.
- Usa
amountecurrency(valuta originale) per la visualizzazione. - Usa
amount_in_default_currencysolo per le soglie delle regole interne. - Ai fini di audit, il record della transazione conserva il tasso di conversione utilizzato al momento della valutazione.
Controparte non corrispondente alla mia blocklist
Sintomo. Hai inserito in blocklist un’azienda tramitevendor_data, ma una transazione con quella controparte è comunque andata a buon fine.
Cause.
- La controparte nel payload della transazione non ha
vendor_data: è memorizzata come snapshot esterno. - Il
vendor_datadifferisce per maiuscole e minuscole.
- Passa sempre
counterparty.vendor_dataquando la controparte è un’entità presente sulla tua piattaforma. - Usa la stessa combinazione di maiuscole e minuscole ovunque:
vendor_datadistingue tra maiuscole e minuscole.
Transazioni AWAITING_USER bloccate
Sintomo. Le transazioni restano bloccate inAWAITING_USER perché l’utente non completa mai la sessione di rimedio.
Cause.
- L’utente non ha aperto l’URL della sessione di rimedio.
- La sessione di rimedio è scaduta.
- La transazione è un trasferimento Travel Rule che una regola della libreria, come
travel-rule-pending-action, ha spostato inAWAITING_USER: Didit non crea la sessione di rimedio predefinita per una transazione Travel Rule, quindi, a meno che la regola non indichi un proprio workflow di rimedio, non esiste alcun link da inviare.
- Il
remediation_session_urlnella risposta della transazione è il link da inviare. Invialo di nuovo all’utente. - Per una transazione Travel Rule, risolvi il trasferimento dalla scheda Travel Rule, poi modifica tu lo stato della transazione, perché la risoluzione del trasferimento non sposta da sola la transazione fuori da
AWAITING_USER. - Le sessioni di rimedio seguono lo stesso schema della guida rapida KYC: sottoscrivi i webhook di completamento.
- Imposta nel tuo sistema un timeout per far scadere le transazioni ferme se il rimedio non viene mai completato.
Limite di frequenza sulla creazione
Sintomo.429 Too Many Requests durante picchi di volume elevato.
Soluzione.
- Rispetta l’intestazione
Retry-After. - Limita il ritmo delle richieste lato client durante i picchi di traffico.
- Contatta il supporto per limiti più alti, in base a un volume di produzione comprovato.
Prossimi passi
Guida all'integrazione
Schemi di integrazione completi.
Regole
Come funziona la valutazione delle regole.
Webhook
Meccanismi dei webhook.