Documentação

Ambiente de teste

Os dez motoristas fictícios do sandbox e os CPFs mágicos que provocam 402, 429 e 422 de propósito. Nenhuma cobrança, nenhum dado real.

O ambiente de teste existe para você errar sem custo. Uma chave cnh_test_ responde com motoristas fictícios, nunca toca no seu saldo e percorre o mesmo contrato assíncrono da produção: 202 → transições de status → payload serializado → webhook assinado.

Onde está a sua chave de teste

Toda organização já tem uma chave cnh_test_, sem pedido nem espera. Ela fica em Configurações → API, na secção Ambiente de teste: clique em Mostrar chave para vê-la inteira ou copie-a direto. Ao contrário da chave de produção, ela continua visível ali sempre que você voltar, e não expira.

Se a chave vazar, use Gerar nova chave: a anterior para de funcionar na hora. Qualquer membro da organização vê a chave; gerar uma nova, configurar o webhook e reenviar entregas cabe aos proprietários e administradores.

Estes CPFs só funcionam com a chave de teste

Com uma chave cnh_live_, qualquer CPF desta página — os dez motoristas e os três mágicos — é recusado com 422 e data.reason: "sandbox_cpf_on_live_key", antes de qualquer consulta ou cobrança. Se você vir esse erro, o seu código está usando a chave errada para o ambiente.

É o mesmo contrato

O payload de teste passa pelo mesmo serializador da produção. Se o seu código funciona aqui, funciona lá — e o contrário também vale.

Uma exceção: nenhum motorista de teste simula pontos e multas não verificados (fines_unverified). Trate esse caso pela regra em Shape do Payload.

Os dez motoristas

Cada CPF abaixo corresponde a um caminho que o seu código precisa tratar. Todos são fictícios, com dígitos verificadores válidos, e não pertencem a ninguém.

CPFCenárioStatus esperadoEntrega
100.000.001-08Habilitação regular, sem nenhuma pendênciaVALIDimediata
100.000.002-80Vence em menos de 30 diasWARNINGimediata
100.000.003-61Habilitação já vencidaEXPIREDimediata
100.000.004-42Pontuação acima do limite legal, com o processo de suspensão que ela gerouBLOCKEDimediata
100.000.005-23Bloqueio ativo, sem problema de pontuaçãoBLOCKEDimediata
100.000.006-04Motorista profissional (EAR), categoria D — limite de 40 pontosVALIDimediata
100.000.007-95CPF sem CNH emitidaNO_LICENSEimediata
100.000.008-76Relatório que falha — dispara o webhook de erroFAILED~30 s
100.000.009-57Entrega lenta, para exercitar polling ou webhookVALID~3 min
100.000.010-90Cópia do caso feliz, para testar reenvio com externalRefVALIDimediata

O que cada um ensina

  • VALID / WARNING / EXPIRED são os três estados de validade. WARNING também aparece por outros motivos além do vencimento, então trate-o como "atenção", não como "vence logo".
  • Os dois BLOCKED chegam por caminhos diferentes. Um vem da pontuação: duas infrações gravíssimas em 12 meses derrubam o limite de 40 para 20 pontos, e o excesso abriu um processo de suspensão. O outro vem de um bloqueio ativo, com a validade da habilitação em dia. Se o seu código só olha para status, os dois são iguais; se ele explica o motivo ao usuário, não são.
  • O motorista com EAR usa outra aritmética. Quem exerce atividade remunerada tem sempre 40 pontos de limite, independentemente de gravíssimas. Este motorista acumula os mesmos 23 pontos do caso bloqueado e continua regular — é o teste de que o seu cálculo não é uma constante.
  • NO_LICENSE é uma resposta definitiva, não um erro. O CPF existe e não tem CNH. O relatório é entregue normalmente, com status: DELIVERED.
  • O relatório que falha termina em FAILED e dispara o webhook de erro. É a única forma de exercitar esse caminho sem esperar por uma falha real.
  • A entrega lenta leva cerca de três minutos. Se o sandbox respondesse sempre na hora, você escreveria um código que quebra em produção. PROCESSING é estado normal, nunca erro.
  • A cópia do caso feliz existe para reenvios: dois POST com o mesmo externalRef devem devolver o mesmo reportId, sem criar um segundo relatório.

Todos os motoristas entregues trazem o campo aiAnalysis preenchido, com um texto fixo por cenário — o formato é idêntico ao da produção.

CPFs mágicos

Estes CPFs nunca geram relatório. Cada um devolve sempre o mesmo erro, para você exercitar o tratamento de falhas de propósito — é o mesmo truque dos cartões de teste.

CPFHTTPcodeQuando usar
100.000.011-71402PAYMENT_REQUIREDSaldo/limite de crédito estourado. Não deve ser re-tentado.
100.000.012-52429TOO_MANY_REQUESTSLimite de uso excedido. Respeite o header Retry-After.
100.000.013-33422UNPROCESSABLE_CONTENTRequisição rejeitada, mesmo com CPF bem formado.

O 422 mágico tem dígitos válidos de propósito

Um CPF malformado já cai em 422, mas cai antes de chegar ao sandbox. Este aqui é bem formado e mesmo assim é rejeitado, então o erro chega pelo mesmo caminho dos outros dois.

O formato do envelope de erro e o catálogo completo de códigos estão em Erros.

Como reconhecer um relatório de teste

  • No corpo: todo relatório traz livemode. É false para os criados com cnh_test_ e true em produção — no GET /api/v1/reports/{reportId} e no webhook.
  • No webhook: as entregas de teste vão para a mesma URL, com o header X-MinhaCNH-Livemode: false, e são assinadas com um secret de teste derivado do seu secret de produção. Um verificador que só conhece o de produção as rejeita. O header fica fora da assinatura: decida o ambiente pelo livemode do corpo, depois de verificar. Veja Verificar Assinatura.
  • Isolamento: uma chave de teste não enxerga relatórios de produção e vice-versa (404), e o externalRef de um ambiente nunca devolve o relatório do outro.

Erros próprios do sandbox

data.reasonQuando
sandbox_cpf_not_in_corpusChave cnh_test_ com um CPF válido que não está nas tabelas acima
sandbox_magic_cpfO CPF mágico do 422
sandbox_cpf_on_live_keyChave cnh_live_ com um CPF desta página

Os três chegam como 422 UNPROCESSABLE_CONTENT; diferencie-os por data.reason. O ambiente de teste também tem limite de uso: os mesmos limites por minuto e por dia da sua chave de produção, contados só sobre as requisições de teste, com o 429 no mesmo formato. Enquanto a produção não estiver ativada, o limite diário do ambiente de teste é de no máximo 200 relatórios.

O que o ambiente de teste não faz

  • Não cobra. Nenhuma requisição de teste entra no seu extrato ou no seu saldo.
  • Não aceita outros CPFs. Qualquer CPF fora das duas tabelas acima é recusado com sandbox_cpf_not_in_corpus.
  • Não cria condutores na sua conta. O relatório de teste traz o condutor fictício no payload, mas ele não aparece na sua lista de condutores nem conta como assento.
  • Não chama o modelo de linguagem. O aiAnalysis é fixo por cenário, e ask_doutor_multas devolve uma resposta canônica com o mesmo formato da produção.

Para trocar de ambiente, basta trocar a chave: cnh_live_ fala com a produção, cnh_test_ fala com o sandbox. O restante do seu código não muda.