InfraJus: API de Raspagem (v1)

Consulta programática de multas, pontuação e processos de suspensão/cassação de condutores no DETRAN-RJ.

Base URL de produção: https://api.infrajus.com.br/v1


Autenticação

Toda requisição precisa do header x-api-key com a chave fornecida pela InfraJus.

x-api-key: ijs_live_xxxxxxxxxxxxxxxxxxxxxxxx

A chave pertence ao seu escritório: tudo que você cadastra por ela fica isolado no seu tenant, e você só consegue ler o que cadastrou. A chave é exibida uma única vez, no momento da emissão. Se perder, peça a revogação e a emissão de outra.

A única rota sem autenticação é esta documentação (GET /v1/docs). Todas as demais exigem a chave.


Como funciona

A consulta ao DETRAN-RJ não é instantânea: o portal exige CAPTCHA, tem limite de ritmo e cai com frequência. Por isso o fluxo é em duas etapas.

  1. POST /v1/clientes cadastra o condutor e coloca a raspagem na fila. Responde na hora.
  2. GET /v1/clientes/{id} devolve o JSON completo quando a raspagem termina.

Uma consulta completa costuma levar de 1 a 5 minutos. Se o DETRAN estiver instável, o sistema re-tenta sozinho (3 tentativas com backoff, mais um job de catch-up de hora em hora). Não é preciso reenviar o POST.


POST /v1/clientes

Cadastra o condutor e enfileira a raspagem.

É idempotente por CPF. Reenviar o mesmo CPF devolve o mesmo cliente_id em vez de erro de duplicado. Use isso para recuperar o id a qualquer momento.

Corpo

Campo Tipo Obrigatório Observação
nome string sim mínimo 2 caracteres
cpf string sim com ou sem máscara
cnh_numero string não necessário para os processos
data_nascimento string não YYYY-MM-DD, necessário para os processos
data_primeira_cnh string não YYYY-MM-DD, necessário para os processos
cnh_uf string não 2 letras
cnh_categoria string não
cnh_renach string não
telefone string não
email string não

Campo desconhecido no corpo gera erro 400 em vez de ser ignorado. Isso é proposital, para que erro de digitação apareça na integração e não em produção.

Sobre os três campos marcados: o DETRAN-RJ só libera a consulta de processos de suspensão e de cassação com CNH + data de nascimento + data da primeira habilitação. Sem os três, você ainda recebe multas e pontuação, mas o JSON volta sem os processos administrativos. A resposta avisa quando isso acontece.

Exemplo

curl -X POST https://api.infrajus.com.br/v1/clientes \
  -H "x-api-key: $INFRAJUS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "nome": "Maria Souza",
    "cpf": "123.456.789-00",
    "cnh_numero": "01234567890",
    "cnh_uf": "RJ",
    "data_nascimento": "1985-03-12",
    "data_primeira_cnh": "2004-07-30"
  }'

Resposta: 201 quando o condutor foi criado agora, 200 quando já existia

{
  "success": true,
  "data": {
    "cliente_id": "8f1c...c2",
    "cpf": "12345678900",
    "nome": "Maria Souza",
    "criado": true,
    "raspagem": {
      "status": "em_fila",
      "consultado_em": null,
      "consulta_cobrada": true
    },
    "avisos": []
  }
}

consulta_cobrada indica se esse POST disparou uma raspagem nova. Quando o CPF já tinha uma consulta de menos de 12 horas, reaproveitamos o resultado, consulta_cobrada vem false e nada é debitado da sua cota.


GET /v1/clientes/{cliente_id}

Devolve o JSON completo da última raspagem.

curl https://api.infrajus.com.br/v1/clientes/8f1c...c2 -H "x-api-key: $INFRAJUS_API_KEY"

Enquanto a raspagem não terminou

{
  "success": true,
  "data": {
    "cliente_id": "8f1c...c2",
    "raspagem": { "status": "em_fila", "consultado_em": null },
    "dados": null,
    "avisos": ["A raspagem ainda está na fila do DETRAN-RJ. ..."]
  }
}

Faça polling neste endpoint. Sugestão: a cada 30 segundos, por até 15 minutos.

Só considere o resultado seu quando status for concluida. Duas situações fazem o status continuar em em_fila mesmo com dados preenchido, e nas duas o avisos explica o que houve:

Em nenhum caso devolvemos JSON vazio se existir um extrato bom para entregar. Um dados sem multas significa condutor sem multas, nunca falha de consulta.

Quando terminou

{
  "success": true,
  "data": {
    "cliente_id": "8f1c...c2",
    "nome": "Maria Souza",
    "cpf": "12345678900",
    "raspagem": { "status": "concluida", "consultado_em": "2026-08-01T14:32:10.221Z" },
    "resumo": {
      "pontos_detran": 17,
      "pontuacao_atual": 17,
      "total_suspensoes": 1,
      "total_cassacoes": 0,
      "valor_total_multas": 4382.51
    },
    "dados": {
      "provider": "detran-rj",
      "multas": [ ... ],
      "pontuacao": { ... },
      "cnh": null,
      "recurso_suspensao": { "processos": [ ... ], "consultado_em": "..." },
      "recurso_cassacao": { "processos": [ ... ], "consultado_em": "..." },
      "erros": { "multas": null, "pontuacao": null, "cnh": "Endpoint indisponível no DETRAN-RJ", "recurso_suspensao": null, "recurso_cassacao": null },
      "consultado_em": "2026-08-01T14:32:10.221Z"
    },
    "avisos": []
  }
}

dados.multas[]

Campo Descrição
numero_ait número do auto de infração
data_infracao, local_infracao
enquadramento, artigo_ctb, descricao, codigo_infracao
classificacao leve | media | grave | gravissima
pontos, valor, valor_com_desconto, vencimento
orgao_autuador, status
placa, proprietario, responsavel_pontos
processo, processo_suspensao vínculo com processo administrativo

dados.pontuacao

Campo Descrição
pontos_total
detalhes[] { infracao, pontos, data }
possui_suspensao_ativa, possui_cassacao_ativa booleanos globais
processos_suspensao[] números dos processos
processos_suspensao_detalhado[] { numero, status }, status por processo
processos_cassacao[], processos_cassacao_detalhado[] idem para cassação
sem_registro_detran ver abaixo

Use sempre o *_detalhado[] para exibir status. O booleano global só diz que existe pelo menos um processo ativo. Um condutor pode ter 1 ativo e 2 cancelados ao mesmo tempo.

dados.recurso_suspensao.processos[] e dados.recurso_cassacao.processos[]

Tabela rica dos endpoints de acompanhamento, com processos em qualquer fase (defesa prévia, arquivado, deferido, suspenso, bloqueada):

numero, data_processo, situacao_atual, prazo_suspensao, total_multas, total_pontos.

Resultado vazio legítimo

Quando o DETRAN responde de forma terminal, pontuacao.sem_registro_detran vem preenchido e avisos explica em português o que fazer:

Valor Significado
sem_autos Não há autos para esses dados. Condutor limpo no RJ, ou CNH de outra UF.
cnh_nao_cadastrada O DETRAN não reconheceu a CNH. Confira o número e reenvie.
uf_incorreta A UF da CNH não bate com o registro. Corrija cnh_uf e reenvie.

Isso não é falha: é resposta oficial do portal.

dados.cnh

Sempre null. O endpoint de consulta de CNH do DETRAN-RJ está fora do ar (404) e não faz parte da entrega.

dados.erros

Uma entrada por subconsulta, dizendo se ela completou. null significa que aquela subconsulta foi bem. Quando não, o valor é uma frase fixa ("Consulta indisponível no DETRAN-RJ nesta tentativa"). Serve para você saber o que faltou naquele extrato, e o retry automático já está em curso.


Limites

Limite Valor
Rajada 60 requisições por minuto por chave
Cota diária definida em contrato por chave (padrão 200 raspagens/dia, renova à meia-noite UTC)
Reaproveitamento POST repetido do mesmo CPF em menos de 12h não gera raspagem nova nem consome cota

A cota conta raspagens disparadas, não requisições HTTP. GET nunca consome cota.


Erros

Todos no mesmo formato:

{ "success": false, "error": { "code": "QUOTA_EXCEEDED", "message": "..." } }
HTTP code Quando
400 VALIDATION_ERROR corpo inválido ou campo desconhecido (veja error.details)
401 AUTHENTICATION_ERROR chave ausente, inválida ou revogada
403 FORBIDDEN a chave não tem o escopo raspagem
404 NOT_FOUND cliente_id não existe no seu escritório
429 RATE_LIMIT mais de 60 req/min
429 QUOTA_EXCEEDED cota diária atingida (error.details traz cota e uso)
500 INTERNAL_ERROR falha nossa, pode repetir a requisição

Proteção de dados

Os CPFs enviados são dados pessoais de terceiros. O escritório que envia é o controlador e declara ter base legal (procuração do titular) para a consulta; a InfraJus atua como operador, tratando os dados apenas para executar a raspagem contratada. O uso da chave está condicionado ao contrato assinado com essa cláusula.

InfraJus, API de Raspagem v1. Dúvidas de integração ou pedido de ampliação de cota: fale com o seu contato na InfraJus.