Erro de txn_id duplicado
Sintoma. Ao submeter uma transação, a resposta é 400 com A transaction with this transaction_id already exists. no campo transaction_id, ou 409 quando dois pedidos idênticos chegam em simultâneo.
Causa. O txn_id (o transaction_id que envia) é único por aplicação. A Didit rejeita uma segunda transação com o mesmo transaction_id e não devolve o registo existente.
Solução.
- Gere o
txn_idde forma determinística do seu lado (por exemplo, use o ID da sua própria base de dados de transações). - Em caso de
400ou409portransaction_idduplicado durante uma nova tentativa, consulte a transação existente em vez de a reenviar: leia-a comGET /v3/transactions/{uuid}/usando ouuidda primeira resposta, ou use otransaction_id(o uuid da Didit) que o webhooktransaction.createdtraz junto do seutxn_id. - Se o pedido não for uma nova tentativa, atribua à nova transação um
transaction_idpróprio.
A regra não dispara
Sintoma. Criou uma regra que deveria corresponder, mas nenhuma transação aparece emrule_runs[] com matched: true.
Causas e soluções.
- A aplicação está em modo sandbox: uma aplicação sandbox não executa a avaliação de regras, a Triagem AML, a faturação nem os webhooks
transaction.createdetransaction.status.updated. As trocas da Travel Rule continuam a ser executadas quando estão ativadas, contra a Didit Test VASP, e enviam webhookstravel_rule.status.updatedmarcados comenvironment: sandbox.rule_runsvolta vazio e a pontuação fica em0, independentemente do modo das suas regras, e a transação permaneceAPPROVED, a menos que uma transferência Travel Rule com expiração aplique o seutimeout_outcome. Verifiqueenvironmentna resposta da transação:"sandbox"significa que nunca foi avaliada. Consulte Monitorização de transações em sandbox para saber como validar uma regra antes de a colocar em produção. - O modo da regra é
DISABLEDouTEST: verifique em Rules → [rule] → Mode. Apenas as regrasACTIVEcontribuem para a pontuação. As regrasTESTsão avaliadas, mas não afetam o estado. - O filtro de âmbito exclui a transação: por exemplo, se o âmbito estiver definido como
transaction_type = finance, não corresponde a transaçõestravelRule. - A janela de agregação é mais curta do que o necessário: uma regra de “20 transações em 30 dias” não dispara após apenas 15 transações.
- O campo da condição é nulo: por exemplo, a sua regra verifica
counterparty.country_code, mas não enviou uma contraparte. - Conversão de moeda: a regra aplica limites sobre
amount_in_default_currency. Se a moeda predefinida da sua aplicação for diferente da moeda da transação, o montante convertido pode ficar abaixo do limite.
A regra dispara em tudo
Sintoma. Uma regra dispara em 90%+ das transações: a sua fila de revisão fica inundada. Causa. As condições são demasiado amplas ou os limiares são demasiado baixos. Solução.- Adicione filtros de
scopepara restringir a aplicabilidade (por exemplo, apenas saídas ou apenas determinados tipos de transação). - Aumente os limiares (montantes e contagens de transações).
- Coloque a regra em modo
TESTdurante uma semana: analise osrule_runspara ver a taxa de correspondência e restrinja as condições antes de a reativar.
Expirou o tempo limite da triagem de criptoativos
Sintoma. A transação foi concluída comstatus: APPROVED, mas o array provider_results[] mostra status: FAILED para uma carteira, um hash de transação ou um fornecedor de triagem de criptoativos.
Causas.
- A API do fornecedor esteve brevemente indisponível.
- A consulta excedeu o tempo limite (normalmente ~10s).
- As transações nunca falham por causa de problemas dos fornecedores: o enriquecimento é realizado tanto quanto possível.
- Se um fornecedor específico falhar repetidamente, consulte a respetiva página de estado ou abra um pedido de suporte.
- Considere configurar as preferências de fornecedores em Settings → Transaction Monitoring → Providers para encaminhar para fornecedores alternativos.
Enriquecimento de IP em falta
Sintoma. Oapplicant.ip_enrichment de uma transação está ausente ou incompleto.
Causas.
- Não existe
applicant.device.ipno envio. - O IP é privado ou reservado (não é encaminhável na internet pública).
- Todos os fornecedores de enriquecimento estiveram temporariamente indisponíveis.
- Capture o IP do utilizador que submete o pedido no seu cliente ou servidor e envie-o em todas as transações.
- Use apenas IPs públicos: a Didit ignora silenciosamente os intervalos privados.
- Verifique a saúde dos fornecedores em Settings → Status na consola.
A assinatura do webhook não corresponde
Sintoma. O seu endpoint rejeita os eventos porque a assinatura não corresponde. Causas.- O corpo bruto foi alterado (JSON reserializado com espaços diferentes).
- Segredo errado.
- Vários destinos com o mesmo URL: as assinaturas diferem por destino.
- Assine o corpo bruto do pedido, e não o JSON analisado. Muitas frameworks disponibilizam um middleware de corpo bruto.
- Renove o segredo se tiver sido comprometido: Webhook destinations → [destination] → Rotate secret.
- Mantenha um único destino por URL para evitar confusão com os segredos.
O webhook não chega
Sintoma. As transações são criadas, mas os webhooks nunca chegam. Causas.- O
enableddo destino estáfalse. - O URL não está acessível publicamente.
- O destino foi desativado automaticamente após falhas repetidas.
- O evento não está em
subscribed_events.
- Envie um evento de teste: Webhook destinations → [destination] → Send test.
- Verifique as entregas recentes: Webhooks → [destination] → Deliveries. Consulte as respostas 4xx/5xx, com o corpo e os cabeçalhos.
- Reative os destinos desativados.
A conversão de moeda parece incorreta
Sintoma. Oamount_in_default_currency não corresponde à taxa que esperava.
Causas.
- A taxa de câmbio é a taxa intermédia de mercado em
txn_date. - As transações retroativas usam a taxa histórica dessa data.
- Algumas moedas (câmbio de moedas exóticas) têm intervalos de atualização mais espaçados.
- Use
amountecurrency(moeda original) para apresentação. - Use
amount_in_default_currencyapenas para a aplicação de limiares de regras internas. - Para auditoria, o registo da transação fixa a taxa de conversão usada no momento da avaliação.
A contraparte não corresponde à minha lista de bloqueio
Sintoma. Colocou na lista de bloqueio uma empresa pelovendor_data, mas uma transação com essa contraparte foi, ainda assim, aceite.
Causas.
- A contraparte no payload da transação não tem
vendor_data— está guardada como snapshot externo. - O
vendor_datatem maiúsculas e minúsculas diferentes.
- Passe sempre
counterparty.vendor_dataquando a contraparte for uma entidade na sua plataforma. - Use as mesmas maiúsculas e minúsculas em todo o lado —
vendor_datadiferencia maiúsculas de minúsculas.
Transações em AWAITING_USER presas
Sintoma. As transações ficam presas emAWAITING_USER porque o utilizador nunca conclui a sessão de remediação.
Causas.
- O utilizador não abriu o URL da sessão de remediação.
- A sessão de remediação expirou.
- A transação é uma transferência Travel Rule que uma regra da biblioteca, como
travel-rule-pending-action, moveu paraAWAITING_USER: a Didit não cria a sessão de remediação predefinida para uma transação Travel Rule, pelo que, a menos que a regra indique o seu próprio fluxo de remediação, não existe nenhuma ligação para enviar.
- O
remediation_session_urlda resposta da transação é a ligação a enviar. Reenvie-a ao utilizador. - Para uma transação Travel Rule, resolva a transferência no separador Travel Rule e, depois, altere manualmente o estado da transação, porque resolver a transferência não move, por si só, a transação para fora de
AWAITING_USER. - As sessões de remediação seguem o mesmo padrão do guia de início rápido do KYC — subscreva os webhooks de conclusão.
- Defina um tempo limite no seu sistema para expirar transações inativas caso a remediação nunca seja concluída.
Limite de pedidos ao criar
Sintoma.429 Too Many Requests durante picos de volume elevado.
Correção.
- Respeite o cabeçalho
Retry-After. - Limite a taxa de pedidos do lado do cliente em caso de tráfego em picos.
- Contacte o suporte para limites mais altos com base num volume de produção comprovado.
Próximos passos
Guia de integração
Padrões completos de integração.
Regras
Como funciona a avaliação de regras.
Webhooks
Funcionamento dos webhooks.