A fonte da verdade desses dados é
serialize_catalog() no serviço de verificação, disponibilizada em tempo real no GET /v1/sandbox/scenarios/. Uma cópia testada contra divergências é gerada em docs/sandbox/SANDBOX_REFERENCE.md no repositório service-didit-verification por meio de pipenv run python scripts/generate_sandbox_reference.py. Esta página espelha essa referência. Se algo aqui parecer desatualizado, confie sempre no endpoint do catálogo em tempo real. O endpoint do catálogo é autenticado: envie sua chave de API (x-api-key) da mesma forma que em qualquer outra chamada, ou um token de sessão se você estiver lendo o catálogo de dentro de uma sessão em andamento.Modelo de ambientes
O sandbox é um modo por aplicação (ApplicationDetail.mode == SANDBOX), a mesma ideia do modo de teste da Stripe. Enquanto uma sessão é executada em uma aplicação sandbox:
- Todos os provedores externos (OCR, AML, correspondência facial, prova de vida, NFC, telefone, e-mail, IP, comprovante de endereço, validação de banco de dados, Document AI) são simulados: nenhum terceiro é chamado em momento algum.
- A prova de vida é executada exatamente como no ambiente de produção. Um fluxo com prova de vida ativa executa a captura ativa real no sandbox, tanto no fluxo hospedado quanto na redirecionamento para a web dos SDKs nativos, para que você possa testar a experiência que seus usuários terão. Apenas o resultado da prova de vida é simulado, pelo cenário ou pelo valor mágico, e o relatório registra o método configurado no seu fluxo.
- Domínios personalizados existem apenas no ambiente de produção. Uma aplicação sandbox não pode adicionar um domínio personalizado; as sessões sandbox sempre são executadas no domínio padrão de verificação hospedada.
- As sessões nunca são cobradas e a verificação de saldo é ignorada.
- É aplicada uma cota por aplicação de 500 criações de sessão / 24h.
- Os webhooks incluem
"environment": "sandbox"(as sessões de produção incluem"environment": "live"). - O fluxo hospedado expõe o ambiente da sessão para que a interface possa avisar os usuários a não enviar dados pessoais reais (PII).
- Os resultados nunca dependem dos pixels: os dados extraídos e os status vêm do cenário / valor mágico. A mídia capturada em si (documentos, selfie, vídeo, arquivos de comprovante de endereço) é armazenada de verdade, exatamente como em uma sessão de produção.
Monitoramento de transações no sandbox
O sandbox é orientado a sessões: ele simula os provedores que uma sessão de verificação chamaria. O Monitoramento de transações não tem provedor para simular, então uma aplicação de sandbox segue o outro caminho: a transação é armazenada, mas nada que toma decisões, faz triagem, notifica ou cobra é executado para ela. Uma transação criada em uma aplicação de sandbox é persistida e retornada normalmente, e nada do que segue acontece com ela:- Nenhuma avaliação de regras.
rule_runsfica vazio, seja qual for o modo das suas regras. Uma regraACTIVEem uma aplicação de sandbox nunca é acionada, então a transação permaneceAPPROVEDcom pontuação0e nenhum alerta ou caso é aberto. - Nenhuma triagem AML / de carteiras.
provider_resultsfica vazio mesmo para transações cripto em uma aplicação com monitoramento ativado. - Nenhum webhook. Nem
transaction.creatednemtransaction.status.updatedsão entregues para uma transação de sandbox. - Nenhum faturamento. Um evento de uso é registrado com preço
0.0000e seu saldo não é alterado.
environment ("live" ou "sandbox"),
para que um rule_runs vazio nunca seja ambíguo: "sandbox" significa que as regras não foram
avaliadas, e não que nenhuma delas teve correspondência. O Business Console diz a mesma coisa
no card Risk & decision da transação, em vez de um simples “No rules
evaluated”.
A Travel Rule é a única exceção ao “nada é executado”. Em uma aplicação com
a Travel Rule ativada, uma transação
travelRule de sandbox ainda executa o mecanismo de intercâmbio:
o registro da transferência é criado e passa pelos seus status.
O que o sandbox nunca faz é se comunicar com alguém fora da Didit.
Sua única contraparte é o Didit Test VASP, integrado à plataforma: nenhuma mensagem de conformidade chega a um VASP de contraparte real por nenhum canal (TRP, uma associação a rede que você conectou, e-mail ou INTERNAL), a triagem de atribuição do VASP de contraparte é ignorada e um cancelamento não envia nada a uma contraparte.
Os webhooks travel_rule.status.updated são entregues, marcados com "environment": "sandbox".Saída - uma transação travelRule que você envia.
A verificação de threshold_amount é executada primeiro e, no sandbox, só se aplica quando você envia transaction_details.amount_in_default_currency, porque o sandbox não converte moedas; sem esse campo, toda transferência de sandbox é considerada acima do limiar.
Uma transferência sem resposta expira após confirmation_timeout_hours, e então o seu timeout_outcome é aplicado à transação.
Acima do limiar, a verificação de carteira autocustodiada é aplicada normalmente: uma transferência para uma carteira autocustodiada declarada vai para UNCONFIRMED_OWNERSHIP sem nenhum envio, e você pode concluí-la no sandbox pelo widget de propriedade de carteira, ou por meio de confirmar propriedade quando a carteira de destino já estiver no seu catálogo de endereços de carteiras.
Qualquer outra transferência acima do limiar vai para o Didit Test VASP pelo canal TEST_VASP, que responde a ela dentro da Didit com o cenário que você escolhe pela carteira ou pelo nome do beneficiário: ela é concluída, é recusada, apresenta divergência, passa a COUNTERPARTY_VASP_NOT_REACHABLE, expira (e então o seu timeout_outcome é aplicado à transação) ou aguarda a propriedade da carteira.
Consulte Testar a Travel Rule no sandbox para ver todos os cenários.Entrada - POST /v3/travel-rule/inbound/. O registro nunca é enviado por um
canal, então nada nele é simulado: o sandbox confronta o depósito com o seu
catálogo de endereços de carteiras e liquida de forma síncrona, exatamente como no ambiente de produção. Ele resulta em
um desfecho real, e não em AWAITING_COUNTERPARTY - ON_HOLD (nenhuma correspondência
no catálogo de endereços), UNCONFIRMED_OWNERSHIP (a entrada correspondente não tem propriedade verificada),
COUNTERPARTY_MISMATCHED_DATA (o nome do beneficiário não corresponde ao titular da carteira)
ou COMPLETED e depois FINISHED (correspondeu a uma entrada verificada).
Para receber uma transferência do Didit Test VASP, use Disparar transferência de entrada do Test VASP com uma das carteiras do seu próprio catálogo de endereços.Cenários do Test VASP da Travel Rule
Otravel_rule.scenarios do catálogo lista estes cenários de saída. Defina o nome do beneficiário abaixo em uma transação travelRule de saída depois de ativar a Travel Rule na sua aplicação de sandbox. As verificações de limiar e de carteira autocustodiada declarada descritas acima são executadas primeiro.
Você também pode escolher um cenário pelo endereço da carteira do beneficiário em vez do nome (a carteira prevalece quando ambos são definidos), e uma transferência que não informa nenhum dos dois é concluída como
accept. Testar a Travel Rule no sandbox lista a carteira de cada cenário e o seu resultado exato.
O gatilho de entrada do Test VASP aceita apenas accept e name_mismatch no seu campo scenario.
Como testar uma regra antes de ela entrar em produção. Use o
Backtest: ele reexecuta
a regra sobre o seu histórico real de transações e informa
evaluated /
matched / affected_entities sem alterar o status de nenhuma transação. Combine-o
com o modo TEST na aplicação de produção - uma regra TEST é avaliada em cada nova
transação de produção e registra as correspondências que teria encontrado, sem alterar a
pontuação nem o status - e mude para ACTIVE quando a seletividade parecer adequada.Como alternar entre produção e sandbox
Produção e sandbox são aplicações separadas, então o tráfego de teste e os dados de produção nunca se misturam. Cada aplicação tem ummode igual a live ou sandbox:
- Use a chave de API de uma aplicação em modo sandbox para obter sessões simuladas, sem cobrança e passíveis de simulação.
- Use a chave de API de uma aplicação em modo de produção para verificações reais.
sandbox_scenario (na criação de sessão e na API de AML independente) e os endpoints de simulação só são aceitos em aplicações sandbox; eles são rejeitados em aplicações de produção.
Sandbox no fluxo de verificação hospedado
Sessões criadas em uma aplicação sandbox exibem elementos de interface extras no fluxo de verificação hospedado (aurl retornada por POST /v3/session/):
- Banner de sandbox no card. Todas as telas mostram um banner dentro do card, “Somente dados de teste, sem chamadas reais”, para deixar sempre claro que a sessão nunca faz chamadas a provedores reais e nunca afeta o seu saldo. As mídias capturadas são armazenadas como em qualquer sessão, então use os documentos de exemplo e os dados de teste em vez de documentos de identidade ou informações pessoais reais.
- Seletor de cenário antes do fluxo. Antes de a captura começar, um seletor no card guia o usuário na escolha de um resultado de teste: escolha um resultado e, em seguida, um gatilho para esse resultado. A confirmação chama
POST /v3/session/{session_id}/sandbox/arm/(veja Ativar (ou reativar) a sessão antes de o fluxo começar abaixo) e depois segue para o fluxo com os valores mágicos desse cenário já aplicados. - Faixa de documentos de exemplo. Uma única linha de documentos de exemplo do sandbox (até 3) fica logo abaixo do componente de envio/captura de documento. Toque em um deles para usá-lo no lugar de um upload real.
Cenários
Cada cenário é um conjunto nomeado de valores mágicos. Passe o slug dele comosandbox_scenario ao criar a sessão (ou ao endpoint de simulação) para reproduzir o resultado.
Os cenários
review_* existem para que você possa testar a experiência de revisão manual (a fila de revisão do console, os webhooks In Review, as ações de aprovar/recusar do revisor) sem precisar de uma entrada que leve a uma recusa. Os dois cenários kyb_* acima definem expected_details.registration_number em vez de expected_details.first_name: eles se aplicam apenas a sessões de Verificação de empresas (KYB).
Valores mágicos
Um valor mágico é uma entrada específica que faz um recurso simulado emitir um risco específico. Defina o campo de entrada com o valor mágico (diretamente ou por meio de um cenário) para acionar o risco.Consulta sem documento e carteiras de identidade
Aplicações de sandbox podem ativar todas as carteiras de identidade do catálogo de países, incluindo carteiras indisponíveis em aplicações de produção. O cenário padrãoapprove simula uma identidade verificada sem fazer login em uma carteira externa.
O resultado é armazenado na sessão e segue para a etapa seguinte normal do fluxo.
O sandbox não valida uma credencial real de carteira nem cobra pelas tentativas simuladas.
As requisições de consulta continuam validando os campos informados e usam o limite de tentativas configurado, que por padrão é um.
Use os cenários a seguir para testar novas tentativas e regras de fallback:
Falhas de carteira seguem a configuração do país para recorrer à captura de documento ou recusar.
As tentativas de consulta concluídas são registradas separadamente, então duas tentativas permitidas geram dois resultados antes do fallback.
Todo o uso de sandbox continua gratuito.
Verificação de conta na Verificação bancária
A Verificação bancária ainda não está habilitada em produção, então esta seção se aplica quando ela estiver: até lá, uma chave de sandbox recebe a mesma respostabank_verification_not_available que uma chave de produção.
Uma etapa de Verificação bancária em sandbox oferece os dois métodos em todos os países, na ordem definida pela etapa, em um serviço simulado, sem banco e sem custo.
Com a ordem padrão, a pessoa começa pelo login no banco e escolhe Informe os dados da sua conta para executar a verificação de conta; defina bank_method_order como ["account_lookup", "open_banking"] para começar por ela.
Os quatro últimos caracteres da conta digitada determinam a resposta; consulte Teste no sandbox para ver todas as terminações e uma conta válida para cada formato.
A API de verificação de conta retorna, para uma chave de sandbox, respostas com base nas mesmas terminações.
Documentos de exemplo
O fluxo hospedado oferece três documentos de exemplo, um para cada tipo de documento:
Toque em um exemplo na faixa para usá-lo no lugar de uma captura real. Os dados extraídos e o resultado da sessão sempre vêm do cenário ou do valor mágico selecionado, então qualquer exemplo funciona com qualquer cenário.
Identidade de exemplo: testando expected_details
Todo documento do sandbox é gerado a partir de uma única identidade fixa.
Os valores extraídos são os mesmos em todas as sessões e nunca são derivados da data atual, então você pode preencher expected_details com eles e verificar de ponta a ponta o tratamento das comparações de campos e dos avisos.
Envie os valores abaixo e as verificações de comparação passam; envie qualquer outro valor e o aviso *_MISMATCH_WITH_PROVIDED correspondente é disparado de propósito.
As datas são as mesmas em todos os documentos de exemplo:
O restante da identidade depende do documento que você usa:
first_name e last_name são a exceção: o sandbox replica no documento gerado os nomes que você envia em expected_details, então a correspondência de nome passa com qualquer nome.
Use o valor mágico SANDBOX_OCR_FULL_NAME_MISMATCH_WITH_PROVIDED para testar uma divergência de nome e SANDBOX_OCR_DOB_MISMATCH_WITH_PROVIDED para uma divergência de data de nascimento.
Se o seu fluxo restringir
documents_allowed a um país ou tipo de documento que exclua o passaporte eletrônico do Brasil, o sandbox gera um documento do primeiro país permitido, então nationality, id_country e o nome do documento seguem esse país. As datas acima continuam as mesmas.O que o documento gerado não contém
O documento gerado é o modelo genérico para o país e o tipo de documento permitidos, então os campos que só um documento real, emitido pelo governo, fornece ficam vazios. O que importa para o roteamento é a região / estado dos EUA (kyc.region): uma carteira de habilitação ou carteira de identidade dos EUA no sandbox não tem estado, então uma condição de ramificação como Region equals IL nunca é atendida no sandbox e, quando nenhuma outra ramificação desse nó também é atendida, o fluxo segue a ramificação de fallback do nó (a ramificação sem condições). Isso não é uma revisão nem uma falha da ramificação - a condição simplesmente não tem o que ler. Um campo ausente também não atende a not equals e not in; consulte como as condições de ramificação leem os dados da sessão para entender a diferença entre um campo ausente e uma string vazia.
Para testar no sandbox um fluxo que depende do estado, baseie a decisão em um valor que você controla na sessão, e não no documento:
- Envie o estado em
metadataao criar a sessão (por exemplo,"metadata": {"credential_state": "IL"}) e crie a ramificação com base emmetadata.credential_state. Os metadados são avaliados no sandbox exatamente como em produção. - Mantenha a condição
kyc.regionderivada do documento para o tráfego de produção se você também precisar que o documento comprove o estado; no modo de produção, a região é lida do documento real.
metadata e expected_details, os nós de ação e os nós de status são todos executados de verdade. O sandbox nunca coloca uma sessão em revisão por conta própria - uma sessão de sandbox termina em revisão somente quando o fluxo a direciona para lá (um cenário review_*, um valor mágico associado a uma ação de revisão ou um nó de status no grafo).
Códigos OTP e opt-in de e-mail
- OTP por telefone: a verificação de telefone no sandbox aceita qualquer código bem formado (4 a 8 dígitos;
123456incluído). Uma entrada malformada continua retornando400. - OTP por e-mail: a verificação de e-mail no sandbox aceita qualquer código bem formado (
123456incluído). Uma entrada malformada continua retornando400.
Controlar resultados: cenários, valores mágicos, armar a sessão e o endpoint de simulação
Há cinco formas de controlar o resultado no sandbox.1. sandbox_scenario na criação da sessão
Defina o slug do cenário ao criar a sessão (POST /v3/session/). O fluxo de criação expande os valores mágicos incluídos no cenário para os campos de entrada da sessão, de modo que os provedores simulados produzam o resultado pretendido por meio do pipeline real do fluxo de verificação (workflow).
2. Valores mágicos digitados manualmente
Defina você mesmo os campos de entrada individuais (por exemplo,expected_details.first_name = "SANDBOX_OCR_DOCUMENT_EXPIRED" ou user_email = "sandbox+aml_hit@didit.test"). Consulte a tabela de valores mágicos acima para ver o registro completo.
3. Armar (ou armar novamente) a sessão antes de o fluxo começar
Defina ou substitua o cenário armado em uma sessão que já existe, desde que ela não tenha passado do statusNot Started. Este é o endpoint que o seletor de cenários pré-fluxo chama, e você pode chamá-lo por conta própria para criar um seletor personalizado ou um ambiente de testes:
- Autentique com o próprio
Session-Tokenda sessão (retornado comosession_tokenna criação da sessão), e não com a chave de API da sua aplicação: este é um endpoint voltado ao cliente. - Retorna
400para um slug de cenário desconhecido e400quando a sessão já passou do statusNot Started("Scenario can only be armed before the verification starts."). - Retorna
404quando oSession-Tokenpertence a uma aplicação de produção (fora do sandbox) ou não corresponde aosession_idno caminho. - Armar novamente substitui o cenário anterior. Apenas os valores mágicos que o cenário anterior gravou são apagados, e tudo o que o usuário já digitou manualmente (e-mail, nome etc.) permanece intacto. Por exemplo: arme
decline_phone_high_riske, depois, armeapprove. O número de telefone volta a ficar sem valor, mas um e-mail inserido pelo cliente se mantém após as duas chamadas.
4. O endpoint de simulação
Force um status final posteriormente:- Console / chave de API (exige o privilégio
write:sessions; uma chave de API com escopo precisa de acesso de escrita a sessões):POST /v3/session/{session_id}/simulate/ - Fluxo hospedado (cabeçalho
Session-Token):POST /v3/session/{session_id}/sandbox/simulate/
404, assim como um Session-Token que não corresponde ao session_id no caminho.
Todos os campos do corpo são opcionais, mas pelo menos um entre new_status, scenario ou risk é obrigatório:
send_webhooks: true envia exatamente os webhooks que uma mudança de status real envia: status.updated, mais os eventos user.status.updated e user.data.updated (ou business.status.updated e business.data.updated para uma sessão de empresa) que a mudança gera, para os destinos inscritos neles.
Com send_webhooks: false, o status muda mesmo assim, mas nenhum webhook é registrado ou enviado.
A recuperação de webhooks perdidos nunca reenvia essa decisão, e o console continua sendo atualizado em tempo real.
A próxima mudança de status da sessão envia webhooks normalmente.
statusé o status definido pela simulação, eprevious_statusé o status que a sessão tinha antes.scenariorepete o seu slug eriské o caso de risco aplicado; cada um énullquando não há nenhum.send_webhooksrepete o valor aplicado.- Retorna
400para um cenário ou risco desconhecido, quando nenhumnew_statuspode ser derivado, para qualquer outro valor denew_statuse quando a sessão já está no status solicitado (["The new status is the same as the current status."]).
5. sandbox_scenario na API de AML independente
A análise AML feita pelo back-end não tem usuário final nem sessão para armar, então o slug vai na própria requisição de análise (POST /v3/aml/):
decline_aml_hitretorna uma ocorrência no mesmo formato de produção e conclui a análise comoDeclined;review_aml_possible_matcha conclui comoIn Review. Um cenário que não arma nenhum resultado de AML deixa a análise sem ocorrências.- Com
save_api_request: true(o padrão), a análise é armazenada exatamente como seria com uma chave de produção, de modo que orequest_idretornado pode ser consultado porGET /v3/session/{request_id}/decision/eGET /v3/session/{request_id}/generate-pdf/. - Retorna
400para um slug de cenário desconhecido e400quando a chave de API pertence a uma aplicação de produção.
Onde sandbox_scenario aparece
O slug do cenário armado (null se nenhum estiver armado) é retornado em alguns locais e intencionalmente omitido em outros:
Se a sua integração precisa executar lógica condicional no servidor com base no cenário ativado, leia-o no envelope do webhook ou em qualquer um dos endpoints de decisão (
v1 ou v3).
Uso e faturamento
O uso no sandbox é registrado, mas nunca cobrado:- Toda chamada simulada continua registrando um evento de uso (
is_sandbox: true, com preço0.0000), para que o volume do sandbox fique visível para depuração. Esse uso, porém, nunca é somado aos seus totais de uso, nunca é descontado do saldo e nunca aparece em uma fatura. - As telas de saldo, recarga e uso em produção do Business Console filtram o uso do sandbox por padrão. Os endpoints de uso de recarga aceitam um parâmetro
environment(live, o padrão, ousandbox) para que o volume do sandbox possa ser consultado separadamente, sempre com custo zero e sem consumir o plano gratuito. - A verificação de e-mail e a verificação de telefone são cobradas por requisição, e não pelo resultado da sessão, e o sandbox não tem como reproduzir isso totalmente na camada de webhook. As verificações de e-mail e telefone no sandbox continuam registrando um evento de uso por requisição com preço
0.0000, como todos os outros recursos simulados. Essa é uma divergência conhecida e aceita em relação ao faturamento em produção, e não um bug. - O formato da resposta da validação de banco de dados no sandbox diverge intencionalmente do formato de cada provedor em produção, já que não existe um provedor real para reproduzir. Trate os payloads de validação de banco de dados no sandbox como uma representação do resultado (status e código de aviso), e não como uma prévia byte a byte da resposta de um provedor em produção.