A fonte de verdade para estes dados é
serialize_catalog() no serviço de verificação, disponibilizada em tempo real em GET /v1/sandbox/scenarios/. Uma cópia testada quanto a desvios é gerada em docs/sandbox/SANDBOX_REFERENCE.md no repositório service-didit-verification, com pipenv run python scripts/generate_sandbox_reference.py. Esta página reproduz essa referência: se algo aqui parecer desatualizado, confie sempre no endpoint do catálogo em tempo real. O endpoint do catálogo exige autenticação: envie a sua chave de API (x-api-key) como em qualquer outro pedido, ou um token de sessão se o estiver a consultar a partir de uma sessão em execução.Modelo de ambientes
O sandbox é um modo por aplicação (ApplicationDetail.mode == SANDBOX), à semelhança do modo de teste da Stripe. Enquanto uma sessão corre numa aplicação em sandbox:
- Todos os fornecedores externos (OCR, AML, correspondência facial, prova de vida, NFC, telefone, e-mail, IP, comprovativo de morada, validação de base de dados e Document AI) são simulados. Nenhum terceiro é chamado.
- A prova de vida funciona exatamente como em produção. Um fluxo de prova de vida ativa executa a captura ativa real no sandbox, tanto no fluxo alojado como na transferência para a web a partir dos SDKs nativos, para que possa testar a experiência que os seus utilizadores terão. Só o resultado da prova de vida é simulado, pelo cenário ou pelo valor mágico, e o relatório regista o método que o seu fluxo configura.
- Os domínios personalizados existem apenas em produção. Uma aplicação em sandbox não pode adicionar um domínio personalizado; as sessões em sandbox usam sempre o domínio de verificação alojado por defeito.
- As sessões nunca são cobradas e a verificação de saldo é ignorada.
- É aplicada uma quota de 500 criações de sessão / 24 h por aplicação.
- Os webhooks incluem
"environment": "sandbox"(as sessões em produção incluem"environment": "live"). - O fluxo alojado expõe o ambiente da sessão para que a interface possa avisar os utilizadores para não carregarem dados pessoais reais.
- Os resultados nunca dependem dos pixels: os dados extraídos e os estados vêm do cenário ou do valor mágico. Os próprios ficheiros capturados (documentos, selfie, vídeo, ficheiros de comprovativo de morada) são guardados de facto, exatamente como numa sessão em produção.
Monitorização de transações no sandbox
O sandbox tem a forma de uma sessão: simula os fornecedores que uma sessão de verificação chamaria. A Monitorização de transações não tem fornecedor para simular, por isso uma aplicação sandbox segue o outro caminho: a transação é guardada, mas nada que decida, faça triagem, notifique ou fature é executado sobre ela. Uma transação criada numa aplicação sandbox é guardada e devolvida como habitualmente, e nada do seguinte acontece com ela:- Sem avaliação de regras.
rule_runsfica vazio, independentemente do modo em que estejam as suas regras. Uma regraACTIVEnuma aplicação sandbox nunca dispara, por isso a transação mantém-seAPPROVEDcom pontuação0e não é aberto qualquer alerta nem caso. - Sem triagem AML nem de carteiras.
provider_resultsfica vazio, mesmo em transações de cripto numa aplicação com monitorização ativada. - Sem webhooks. Nem
transaction.creatednemtransaction.status.updatedsão enviados para uma transação sandbox. - Sem faturação. É registado um evento de utilização com preço
0.0000, e o 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 correspondeu. A Business Console diz o mesmo no cartão Risk & decision da transação, em vez de apresentar apenas “No rules evaluated”.
A Travel Rule é a única exceção a “nada é executado”. Numa aplicação com a Travel Rule ativada, uma transação
travelRule sandbox continua a executar o motor de exchange: o registo da transferência é criado e avança pelos seus estados.
O que o sandbox nunca faz é comunicar com alguém fora da Didit.
A sua única contraparte é o Didit Test VASP, integrado na plataforma: nenhuma mensagem de conformidade chega a um VASP contraparte real por nenhum canal (TRP, uma rede à qual se tenha ligado, e-mail ou INTERNAL), a atribuição de VASP contraparte na triagem é ignorada, e um cancelamento não envia nada à contraparte.
Os webhooks travel_rule.status.updated são enviados, marcados com "environment": "sandbox".Saída - uma transação travelRule que submete.
A verificação de threshold_amount é feita primeiro e, no sandbox, só se aplica quando envia transaction_details.amount_in_default_currency, porque o sandbox não converte moedas; sem este campo, cada transferência sandbox conta como acima do limiar.
Uma transferência sem resposta expira após confirmation_timeout_hours, e o seu timeout_outcome aplica-se então à transação.
Acima do limiar, a verificação de carteira autocustodiada aplica-se como habitualmente: uma transferência para uma carteira autocustodiada declarada passa para UNCONFIRMED_OWNERSHIP sem nada ser enviado, e pode concluí-la no sandbox através do widget de verificação de propriedade da carteira, ou através de confirmar propriedade quando a carteira de destino já está na sua lista de endereços de carteiras.
Qualquer outra transferência acima do limiar é enviada para o Didit Test VASP no canal TEST_VASP, que lhe responde dentro da Didit com o cenário que escolher pela carteira ou pelo nome do beneficiário: é concluída, é recusada, não coincide, passa para COUNTERPARTY_VASP_NOT_REACHABLE, expira (e o seu timeout_outcome aplica-se então à transação) ou fica a aguardar a propriedade da carteira.
Veja Testar a Travel Rule no sandbox para todos os cenários.Entrada - POST /v3/travel-rule/inbound/. O registo nunca é enviado por um canal, por isso nada nele é simulado: o sandbox resolve o depósito contra a sua lista de endereços de carteiras e liquida de forma síncrona, exatamente como em produção. Resulta num resultado real e não em AWAITING_COUNTERPARTY: ON_HOLD (sem correspondência na lista de endereços), UNCONFIRMED_OWNERSHIP (a propriedade da entrada correspondente não foi 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 Acionar transferência de entrada do Test VASP com uma das carteiras da sua lista 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 numa transação travelRule de saída depois de ativar a Travel Rule na sua aplicação sandbox. As verificações de limiar e de carteira autocustodiada declarada descritas acima são executadas primeiro.
Também pode escolher um cenário com o endereço da carteira do beneficiário em vez do nome (a carteira prevalece quando ambos estão definidos), e uma transferência que não indique nenhum dos dois é concluída como
accept. Testar a Travel Rule no sandbox lista o endereço de carteira de cada cenário e o seu resultado exato.
O acionador de entrada do Test VASP aceita apenas accept e name_mismatch no seu campo scenario.
Como testar uma regra antes de a colocar em produção. Utilize o Backtest: reexecuta a regra sobre o seu histórico real de transações e apresenta
evaluated / matched / affected_entities sem alterar o estado 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 real e regista aquilo a que teria correspondido, sem alterar a pontuação nem o estado - e passe para ACTIVE quando a seletividade estiver adequada.Como alternar entre produção e sandbox
A produção e o sandbox são aplicações separadas, pelo que o tráfego de teste e os dados de produção nunca se misturam. Cada aplicação tem ummode de live ou sandbox:
- Use a chave de API de uma aplicação em modo sandbox para obter sessões simuladas, não faturadas 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ões e na API AML autónoma) e os endpoints de simulação só são aceites em aplicações sandbox; são rejeitados em aplicações de produção.
Sandbox no fluxo de verificação alojado
As sessões criadas numa aplicação sandbox apresentam elementos de interface adicionais no fluxo de verificação alojado (ourl devolvido por POST /v3/session/):
- Banner sandbox no cartão. Todos os ecrãs apresentam um banner dentro do cartão - “Apenas dados de teste - sem chamadas reais” - para que fique sempre evidente que a sessão nunca chama fornecedores reais nem afeta o seu saldo. Os conteúdos multimédia capturados são conservados como em qualquer sessão, por isso use os documentos de exemplo e os dados de teste em vez de documentos de identidade reais ou informações pessoais.
- Seletor de cenários antes do fluxo. Antes de a captura começar, um seletor no cartão guia o utilizador na escolha de um resultado de teste: escolher um resultado e, em seguida, um acionador para esse resultado. A confirmação chama
POST /v3/session/{session_id}/sandbox/arm/(ver Preparar (ou preparar novamente) a sessão antes de o fluxo começar abaixo) e continua 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 diretamente abaixo do componente de carregamento e captura de documentos. Toque num deles para o usar em vez de um carregamento real.
Cenários
Cada cenário é um conjunto nomeado de valores mágicos. Passe o respetivo slug comosandbox_scenario ao criar a sessão (ou ao endpoint de simulação) para reproduzir o resultado.
Os cenários
review_* existem para poder testar a experiência de revisão manual (a fila de revisão na consola, webhooks de In Review, ações de aprovação e recusa do revisor) sem precisar de uma entrada que provoque uma recusa. Os dois cenários kyb_* acima definem expected_details.registration_number em vez de expected_details.first_name: aplicam-se apenas a sessões de Verificação de empresas (KYB).
Valores mágicos
Um valor mágico é uma entrada específica que faz uma funcionalidade simulada gerar um risco específico. Defina o campo de entrada com o valor mágico (diretamente ou através de um cenário) para acionar esse risco.Consulta sem documento e carteiras de identidade
As aplicações sandbox podem ativar todas as carteiras de identidade do catálogo do país, incluindo carteiras indisponíveis em aplicações de produção. O cenário predefinidoapprove simula uma identidade verificada sem iniciar sessão numa carteira externa.
O resultado fica guardado na sessão e segue o próximo passo normal do fluxo.
O sandbox não valida uma credencial de carteira real nem cobra pelas tentativas simuladas.
Os pedidos de consulta continuam a validar os campos introduzidos e a usar o limite de tentativas configurado, que por predefinição é de um.
Use os cenários seguintes para testar novas tentativas e as regras de recurso:
As falhas da carteira seguem a definição do país: recorrer à captura do documento ou recusar.
As tentativas de consulta concluídas são registadas separadamente; assim, duas tentativas permitidas produzem dois resultados antes do recurso.
Toda a utilização do sandbox continua gratuita.
Verificação bancária e verificação de conta
Um passo de Verificação bancária no sandbox oferece ambos os métodos em todos os países, pela ordem definida pelo passo, num serviço simulado, sem banco real e sem custos. Com a ordem predefinida, a pessoa começa no início de sessão no banco e seleciona Introduza os dados da sua conta para executar a verificação de conta; definabank_method_order como ["account_lookup", "open_banking"] para começar por esta opção.
Os últimos quatro caracteres da conta introduzida determinam a resposta; consulte Testar no sandbox para ver todas as terminações e uma conta válida por formato.
A API de verificação de conta devolve uma chave de sandbox com base nas mesmas terminações.
Os documentos de exemplo
O fluxo alojado oferece três documentos de exemplo, um por tipo de documento:
Toque num exemplo na faixa para o usar em vez de uma captura real. Os dados extraídos e o resultado da sessão vêm sempre do cenário ou do valor mágico selecionado, pelo que qualquer exemplo funciona com qualquer cenário.
Identidade de exemplo: testar expected_details
Todos os documentos de sandbox são fabricados a partir de uma única identidade fixa.
Os valores extraídos são iguais em todas as sessões e nunca são derivados da data atual, pelo que pode pré-preencher expected_details com eles e verificar de ponta a ponta a comparação de campos e o tratamento de avisos.
Se passar os valores abaixo, as verificações de comparação passam; se passar outros valores, o aviso *_MISMATCH_WITH_PROVIDED correspondente é disparado de propósito.
As datas são partilhadas por todos os documentos de exemplo:
O restante da identidade depende do documento utilizado:
first_name e last_name são a exceção: o sandbox repete no documento fabricado os nomes que envia em expected_details, pelo que a correspondência de nomes 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 na 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 fabrica, em vez disso, um documento a partir do primeiro país permitido, pelo que nationality, id_country e o nome do documento acompanham esse país. As datas acima mantêm-se.O que o documento fabricado não contém
O documento fabricado é o modelo genérico do país e do tipo de documento permitidos, pelo que os campos que só um documento real emitido por um estado fornece ficam vazios. O que mais importa para o encaminhamento é a região / estado dos EUA (kyc.region): uma carta de condução ou um cartão de identificação dos EUA de sandbox não tem estado, pelo que uma condição de ramificação como Region equals IL nunca é satisfeita no sandbox e, quando também nenhuma outra ramificação do nó corresponde, o fluxo segue a ramificação de fallback do nó (a ramificação sem condições). Isto não é uma revisão nem uma falha da ramificação - a condição simplesmente não tem o que ler. Um campo em falta também faz falhar not equals e not in; veja como as condições de ramificação leem os dados da sessão para a diferença entre um campo em falta e uma string vazia.
Para testar um fluxo que depende do estado no sandbox, baseie a decisão num valor que 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.region, baseada no documento, para o tráfego real, se também precisar que o documento comprove o estado; em produção, a região é lida do documento real.
metadata e expected_details, os nós de ação e os nós de estado são todos executados a sério. O sandbox nunca força uma sessão para revisão por iniciativa própria - uma sessão do sandbox só passa para Em análise quando o fluxo a encaminha para lá (um cenário review_*, um valor mágico mapeado para uma ação de revisão ou um nó de estado no grafo).
Códigos OTP e adesão ao envio de e-mails
- OTP por telefone: a verificação de telefone do sandbox aceita qualquer código bem formado (de 4 a 8 dígitos; inclui
123456). Uma entrada mal formada continua a devolver400. - OTP por e-mail: a verificação de e-mail do sandbox aceita qualquer código bem formado (inclui
123456). Uma entrada mal formada continua a devolver400.
Condução dos resultados: cenários, valores mágicos, armação e o endpoint de simulação
Existem cinco formas de controlar um resultado 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 agrupados no cenário para os campos de entrada da sessão, de modo que os fornecedores simulados emitam o resultado pretendido através do pipeline real do fluxo.
2. Valores mágicos introduzidos manualmente
Defina os campos de entrada individualmente (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 o registo completo.
3. Armar (ou voltar a armar) a sessão antes de o fluxo começar
Defina ou substitua o cenário armado numa sessão já existente, desde que esta não tenha avançado para além deNot Started. Este é o endpoint que o seletor de cenário anterior ao fluxo chama, e pode chamá-lo diretamente para criar um seletor personalizado ou um ambiente de teste:
- Autentique-se com o
Session-Tokenda própria sessão (devolvido comosession_tokenna criação da sessão), e não com a chave de API da aplicação: trata-se de um endpoint voltado para o cliente. - Devolve
400para um slug de cenário desconhecido, e400quando a sessão já avançou para além deNot Started("Scenario can only be armed before the verification starts."). - Devolve
404quando oSession-Tokenpertence a uma aplicação de produção (não sandbox), ou quando não corresponde aosession_iddo caminho. - Voltar a armar substitui o cenário anterior. Limpa apenas os valores mágicos que o cenário anterior escreveu e deixa intacto tudo o que o utilizador já tenha introduzido manualmente (e-mail, nome próprio, etc.). Por exemplo: arme
decline_phone_high_riske depois armeapprove. O número de telefone volta a ficar por definir, mas um e-mail introduzido pelo cliente sobrevive às duas chamadas.
4. O endpoint de simulação
Force um estado final a posteriori:- Consola / chave de API (requer o privilégio
write:sessions; uma chave de API com âmbito limitado precisa de acesso de escrita às sessões):POST /v3/session/{session_id}/simulate/ - Fluxo alojado (cabeçalho
Session-Token):POST /v3/session/{session_id}/sandbox/simulate/
404, e o mesmo acontece com um Session-Token que não corresponda ao session_id do caminho.
Todos os campos do corpo são opcionais, mas é obrigatório pelo menos um de new_status, scenario ou risk:
Com
send_webhooks: true, são enviados exatamente os webhooks que uma alteração de estado real envia: status.updated, além dos eventos user.status.updated e user.data.updated (ou business.status.updated e business.data.updated numa sessão de empresa) que a alteração provoca, para os destinos que subscreveram esses eventos.
Com send_webhooks: false, o estado continua a mudar, mas nenhum webhook é registado nem enviado.
A recuperação de webhooks perdidos nunca reenvia essa decisão, e a consola continua a atualizar-se em tempo real.
A próxima alteração de estado da sessão envia webhooks como habitualmente.
statusé o estado que a simulação definiu, eprevious_statuso estado que a sessão tinha antes.scenariorepete o slug enviado eriské o caso de risco aplicado; cada um énullquando não existe.send_webhooksrepete o valor aplicado.- Devolve
400para um cenário ou risco desconhecido, quando não é possível derivar nenhumnew_status, para qualquer outronew_status, e quando a sessão já tem o estado pedido (["The new status is the same as the current status."]).
5. sandbox_scenario na API AML autónoma
A triagem AML em back-end não tem utilizador final nem sessão para armar, por isso o slug vai no próprio pedido de triagem (POST /v3/aml/):
decline_aml_hitdevolve uma correspondência com o formato de produção e fecha a triagem comoDeclined;review_aml_possible_matchfecha-a comoIn Review. Um cenário que não arma nenhum resultado AML deixa a triagem limpa.- Com
save_api_request: true(valor predefinido), a triagem é guardada exatamente como numa chave de produção, pelo que orequest_iddevolvido é resolvido através deGET /v3/session/{request_id}/decision/eGET /v3/session/{request_id}/generate-pdf/. - Devolve
400para um slug de cenário desconhecido, e400quando a chave de API pertence a uma aplicação de produção.
Onde aparece sandbox_scenario
O slug do cenário armado (null se nenhum estiver armado) é devolvido em algumas superfícies e intencionalmente omitido noutras:
Se a sua integração precisar de ramificar com base no cenário armado do lado do servidor, leia-o do envelope do webhook ou de qualquer um dos endpoints de decisão (
v1 ou v3).
Utilização e faturação
A utilização de sandbox é registada, mas nunca faturada:- Cada chamada simulada continua a registar um evento de utilização (
is_sandbox: true, com preço0.0000), para que o volume de sandbox fique visível para depuração. No entanto, esse evento nunca é somado aos seus totais de utilização, nunca é descontado do saldo e nunca aparece numa fatura. - O saldo, o carregamento de saldo e as vistas de utilização em produção da Business Console excluem a utilização de sandbox por defeito. Os endpoints de utilização de carregamento de saldo aceitam um parâmetro
environment(live, o valor por defeito, ousandbox) para que o volume de sandbox possa ser consultado separadamente, sempre a custo zero e sem consumo do plano gratuito. - A verificação de e-mail e de telefone é faturada por pedido e não por resultado de sessão, e o sandbox não consegue replicar totalmente este comportamento ao nível do webhook. As verificações de e-mail e de telefone em sandbox continuam a registar um evento de utilização por pedido, ao preço
0.0000, tal como qualquer outra funcionalidade simulada. Trata-se de uma divergência aceite e conhecida em relação ao comportamento de faturação em produção, e não de um erro. - A estrutura da resposta da validação de base de dados em sandbox diverge intencionalmente da estrutura específica de cada fornecedor em produção, uma vez que não existe um fornecedor real a replicar. Trate os payloads de validação de base de dados em sandbox como um substituto do resultado (estado e código de aviso), e não como uma pré-visualização, byte a byte, de uma resposta real de um fornecedor.