Sandbox e Dados de Teste
O sandbox é uma cópia completa do pipeline de verificação com suas próprias credenciais e seus próprios dados. Use-o para construir e validar sua integração antes que qualquer cliente real a utilize.
Acesso
| O que você precisa | Como obter |
|---|---|
| URL base do sandbox | Emitida pela Inyo no onboarding |
client_id / client_secret | Emitidos pela Inyo no onboarding, separados dos de produção |
webhookSecret | Emitido pela Inyo no onboarding, separado do de produção |
| Acesso de rede | Suas faixas de IP de saída devem estar na lista de permissões — envie-as ao seu contato na Inyo |
Uma webhookUrl registrada | Opcional, mas necessária para exercitar a entrega de webhooks. Um túnel funciona durante o desenvolvimento |
Credenciais de sandbox e de produção nunca são intercambiáveis, e uma verificação em sandbox nunca é uma base válida para uma decisão real de onboarding.
O Sandbox Executa Verificação Real
O sandbox realiza análise real de documentos — o mesmo pipeline de extração, autenticidade, prova de vida e correspondência facial da produção. Nenhum número de documento de teste produz um resultado de verificação pré-definido como funcionam os números de cartão de teste em pagamentos: aprovação, recusa e revisão vêm todos das imagens que você envia.
A única exceção é a checagem de formato do número do documento, que aceita valores reservados — veja Números de Documento de Teste Reservados. Ela verifica o formato de um número declarado e nunca olha uma imagem, portanto é uma superfície separada do pipeline de verificação descrito aqui.
A consequência prática: teste com documentos reais que você pessoalmente controla, ou com documentos emitidos para testes. Uma verificação falhará genuinamente se a imagem estiver borrada, o documento estiver vencido ou a selfie não corresponder — o que é exatamente o que torna o sandbox útil para validar seu tratamento de erros.
Todo resultado carrega um campo
provider."inyo"significa que uma análise real o produziu."inyo-mock"significa que um simulador o produziu — o que nunca acontece em produção, e indica de forma inequívoca que um resultado não veio de uma verificação real.
Produzindo Cada Resultado
| Alvo | Como produzi-lo |
|---|---|
approved | Um documento válido e não vencido que você controla, bem iluminado e enquadrado, com uma selfie da mesma pessoa |
declined — documento vencido | Um documento vencido. document_not_expired falha |
declined — divergência facial | Um documento pertencente a uma pessoa com a selfie de outra. face_match falha |
declined — recaptura de tela | Fotografe o documento a partir da tela de um celular ou monitor. document_scene_clear falha |
declined — ilegível | Uma captura deliberadamente borrada ou parcialmente coberta. document_readable falha |
declined — tentativas de captura | Falhe a captura repetidamente no widget até atingir o limite, adicionando uma verificação capture_attempts |
in_review — verificação branda (soft check) | Envie dataCheck: true com um nome ou data de nascimento em prefill que não corresponda ao documento. document_data_match falha |
in_review — rejeição retida | Peça à Inyo para habilitar rejeições retidas no seu tenant de sandbox e produza qualquer recusa com documento legível |
in_review — aprovação limítrofe | Peça à Inyo para definir um limiar de revisão no seu tenant de sandbox acima do seu limiar de correspondência facial e verifique com uma selfie marginal |
expired | Crie uma sessão e deixe-a sem uso além do tempo de vida de 48 horas do link |
Respostas 422 | Solicite um tipo de documento que você não tem habilitado, ou envie um prefill.documentNumber malformado |
502 | Não reproduzível sob demanda — trate-o como um caminho de retry transitório no código |
Peça um tenant de sandbox separado se você precisar de configurações conflitantes. O roteamento de revisão e as rejeições retidas são configurações no nível do tenant, então exercitar tanto uma recusa normal quanto uma recusa retida significa alterar a configuração entre execuções — ou ter dois tenants de sandbox.
Testando Sem Câmera
O validador de formato de número de documento não precisa de imagens e não consome nenhuma verificação, o que o torna a coisa mais rápida para integrar primeiro:
curl --request POST \
--url https://{FQDN}/v1/validators/document-number \
--header "Authorization: Bearer $ACCESS_TOKEN" \
--header 'Content-Type: application/json' \
--data '{"documentType": "drivers_license", "number": "not-a-number", "issuingCountry": "USA", "issuingState": "PA"}'
{
"documentType": "drivers_license",
"issuingCountry": "USA",
"issuingState": "PA",
"valid": false,
"rule": "dl:USA:PA",
"detail": "document number does not match the PA license format"
}
Use-o para confirmar seu tratamento dos três estados — true, false e null para uma jurisdição desconhecida. Veja Validador de Número de Documento.
Números de Documento de Teste Reservados
A checagem de formato do número do documento aceita um pequeno conjunto de valores reservados que retornam o veredito escolhido sob demanda. Use-os quando precisar de um resultado valid específico — mais comumente a partir da criação de remetente de remessas, que executa essa checagem em todo documento declarado — sem antes ter de aprender o formato real de numeração de uma jurisdição.
Somente no sandbox. Esses valores são habilitados por ambiente; se os valores abaixo retornarem um veredito comum, peça ao seu contato Inyo para habilitá-los no seu tenant de sandbox.
Todo tipo capturável publica os três estados de valid, então você pode exercitar seu próprio tratamento por tipo sem precisar aprender o formato real de numeração de uma jurisdição. ssn e itin trazem apenas um valor de aprovação — veja abaixo.
documentType | issuingCountry | issuingState | number | valid |
|---|---|---|---|---|
drivers_license | USA | PA | 99900001 | true |
drivers_license | USA | PA | 99900002 | false |
drivers_license | USA | PA | 99900003 | null |
drivers_license | BRA | — | 99900000070 | true |
drivers_license | BRA | — | 99900000188 | false |
drivers_license | BRA | — | 99900000296 | null |
passport | USA | — | 999000001 | true |
passport | USA | — | 999000002 | false |
passport | USA | — | 999000003 | null |
identity_card | MEX | — | XXXX000101HXXXXX01 | true |
identity_card | MEX | — | XXXX000101HXXXXX02 | false |
identity_card | MEX | — | XXXX000101HXXXXX03 | null |
ssn | USA | — | 078051120 | true |
itin | USA | — | 912891234 | true |
As linhas de identity_card são mexicanas porque não existe regra para carteiras de identidade dos EUA — um valor americano seria um caso de teste para uma verificação que não existe. A CURP codifica o nome e a data de nascimento do titular, então o campo de nome todo em X é estruturalmente válido e não pode colidir com uma pessoa real.
Envie cada número com o issuingCountry e o issuingState indicados. Um valor reservado é reconhecido por esse par exato, portanto o mesmo número em qualquer outra jurisdição é validado pelas regras comuns.
curl --request POST \
--url https://{FQDN}/v1/validators/document-number \
--header "Authorization: Bearer $ACCESS_TOKEN" \
--header 'Content-Type: application/json' \
--data '{"documentType": "drivers_license", "number": "99900002", "issuingCountry": "USA", "issuingState": "PA"}'
{
"documentType": "drivers_license",
"issuingCountry": "USA",
"issuingState": "PA",
"valid": false,
"rule": "reserved:drivers_license:PA:invalid",
"detail": "reserved sandbox test value — simulated invalid verdict"
}
Um resultado simulado carrega o cabeçalho de resposta X-Inyo-Simulated: true. Ele está presente apenas quando um valor reservado produziu o resultado, e ausente caso contrário — inclusive em produção, onde nunca aparece.
Os valores reservados são números reais e válidos no formato da sua jurisdição. Isso é deliberado: significa que uma regra de formato anterior — como a que a criação de remetente de remessas aplica antes de chamar essa checagem — deixa o valor passar em vez de rejeitá-lo antes, o que é justamente o que permite que
99900002chegue até nós e volte comofalse.A consequência é que onde os valores reservados não estão habilitados, eles retornam o veredito que as regras reais de formato lhes dão —
valid: truepara todos os valores, exceto o ITIN, que retornafalse. Um valor reservado nunca produz um resultado mais restritivo do que um número comum produziria, então deixar um no código não é um risco de segurança — mas ele deixa silenciosamente de simular, portanto não leve nenhum para produção.
912891234é o único valor que retornafalsecom a simulação desligada. Não existe um espécime de ITIN anulado como078-05-1120é para SSNs, então ele vem de um grupo que o IRS reserva para outros programas — a única forma de garantir que nunca pertencerá a uma pessoa real. O custo é que uma regra de formato anterior mais estrita pode rejeitá-lo antes que ele chegue a essa checagem. Se isso acontecer do seu lado, use-o diretamente contra este endpoint em vez de passar por um chamador que pré-valida.
Testando a Entrega de Resultados
A entrega vale a pena ser testada por si só, independentemente dos resultados de verificação:
- Verificação de assinatura — capture um corpo real de webhook do sandbox e sua
X-Inyo-Signature, e faça um teste unitário do seu verificador contra esses bytes exatos. Adicione um caso que altera um byte do corpo e afirma a rejeição, e um caso que re-serializa o JSON parseado e afirma a rejeição. Esses dois casos capturam o erro que quebra a maioria das integrações. Depois adicione três que capturam os que você só vai encontrar mais tarde: umt=vencido, fora da sua tolerância; um cabeçalho carregando umv2=extra que seu código não implementa (ele ainda deve validar nov1); e um cabeçalho repetindov1=duas vezes (ele deve ser rejeitado de imediato, não resolvido escolhendo um dos dois). - Comportamento de retry — retorne
500do seu endpoint e confirme que você vê até três tentativas, e depois nada. - Ordenação — reproduza duas notificações armazenadas de uma sessão fora de ordem e afirme que seu handler mantém a que tem o
notifiedAtmais alto. - Idempotência — entregue o mesmo resultado duas vezes e afirme que seu sistema não o processa em duplicidade.
Os passos 1, 3 e 4 não precisam de nenhuma chamada ao sandbox depois que você capturou um payload real.
Antes de Entrar em Produção
| Verificação | Por quê |
|---|---|
| A verificação de assinatura roda contra bytes brutos | A falha de produção mais comum |
in_review tem um estado pendente no seu modelo | Não é aprovado nem rejeitado, e também chega em redirecionamentos |
Resultados concorrentes são resolvidos por notifiedAt | As entregas podem chegar fora de ordem |
| Um resultado concluído pode ser revertido | Overrides de controle de qualidade reentregam um resultado alterado |
502 faz retry em vez de recusar | É uma falha de infraestrutura, não um resultado do cliente |
| As credenciais de produção estão separadas e a URL base foi trocada | Tokens de sandbox não são válidos em produção |
| Um job de reconciliação consulta sessões não terminais | A entrega é de melhor esforço; GET /v1/sessions/{sessionId} é a fonte autoritativa |
Próximos Passos
- Primeiros Passos — o passo a passo de ponta a ponta
- Recebendo Resultados — assinaturas, retries e ordenação
