Monitoramento··4 min de leitura

API DataJud — guia completo para integrar com 61 tribunais brasileiros

Tudo o que importa sobre a API pública do DataJud do CNJ: autenticação, query DSL, endpoints, rate limit, gotchas de produção e exemplos de código prontos.

Tela de monitoramentos da Lupa.law mostrando alvos por CNPJ acompanhados via API DataJud, com último estado e badge de eventos não-lidos.
Camada de produto rodando em cima da API DataJud — fan-out paralelo aos 61 tribunais.

TL;DR

- API pública do CNJ, autenticada por chave gratuita, com query DSL no formato Elasticsearch.

- Um índice por tribunal (61 no total). Use o slug api_publica_tjsp, api_publica_trf3, etc.

- Paginação cursor-based (search_after), rate limit por chave, e sem inteiro teor de peças — só metadados.

O que é o DataJud

O DataJud é a base nacional de dados do Poder Judiciário, mantida pelo Conselho Nacional de Justiça (CNJ). Reúne metadados de processos de 61 tribunais brasileiros — superiores, federais, trabalhistas, eleitorais e estaduais.

O CNJ expõe os dados em duas camadas: o portal de visualização, para humanos, e a API pública, para máquinas. Este guia foca na segunda.

Autenticação e onboarding

O acesso requer uma chave de API gratuita emitida pelo CNJ.

  1. Acessar o Wiki DataJud e seguir o link de cadastro.
  2. Preencher o formulário com nome, instituição, finalidade de uso e aceite de boas práticas.
  3. Aguardar 1 a 5 dias úteis.
  4. Usar a chave no header Authorization: APIKey SUA_CHAVE.

Estrutura: um índice por tribunal

Cada tribunal tem seu próprio índice nomeado api_publica_<sigla>. Exemplos:

  • api_publica_tjsp — Tribunal de Justiça de SP
  • api_publica_trf3 — Tribunal Regional Federal da 3ª Região
  • api_publica_trt2 — TRT da 2ª Região
  • api_publica_stj — Superior Tribunal de Justiça

Para consultas multi-tribunal, faça fan-out paralelo aos índices relevantes.

Query DSL — sintaxe Elasticsearch

A API aceita match, term, bool, range, multi_match e agregações simples.

~~~bash curl -X POST \ "https://api-publica.datajud.cnj.jus.br/api_publica_tjsp/_search" \ -H "Authorization: APIKey SUA_CHAVE_AQUI" \ -H "Content-Type: application/json" \ -d '{ "query": { "match": { "numeroProcesso": "10000000020258260100" } } }' ~~~

| Campo | Descrição | Tipo | |---|---|---| | numeroProcesso | Número CNJ (20 dígitos) | keyword | | classe.codigo | Código da classe processual TPU | integer | | assuntos.codigo | Código do assunto TPU | integer | | orgaoJulgador.nome | Nome da vara/órgão julgador | text | | movimentos.codigo | Código de movimentação TPU | integer | | partes.documento | CPF/CNPJ da parte | keyword | | dataAjuizamento | Data de ajuizamento | date | | @timestamp | Última atualização do documento | date |

Exemplo: busca por CNPJ em TypeScript

~~~ts const API_KEY = process.env.DATAJUD_API_KEY!; const TRIBUNAL = "tjsp";

async function searchByCnpj(cnpj: string) { const url = "https://api-publica.datajud.cnj.jus.br/api_publica_" + TRIBUNAL + "/_search"; const res = await fetch(url, { method: "POST", headers: { Authorization: "APIKey " + API_KEY, "Content-Type": "application/json", }, body: JSON.stringify({ size: 100, query: { bool: { should: [ { match: { "partes.documento": cnpj } }, { match: { "partes.nome": cnpj } }, ], }, }, sort: [{ "@timestamp": { order: "desc" } }], }), }); if (!res.ok) throw new Error("DataJud " + res.status + ": " + await res.text()); return res.json(); } ~~~

Paginação correta: search_after

O parâmetro from tradicional funciona até a página 10 000. Para volumes maiores, use search_after com sort estável.

~~~ts const firstPage = await fetch(URL, { method: "POST", headers, body: JSON.stringify({ size: 100, query: { match_all: {} }, sort: [{ "@timestamp": "desc" }, { _id: "asc" }], }), }).then((r) => r.json());

const lastHit = firstPage.hits.hits.at(-1); ~~~

Rate limit e estratégia de cache

O rate limit oficial não é publicado de forma estável, mas em produção fica em torno de 50 a 120 requisições por minuto por chave. Use cache agressivo, cache curto para movimentações, backoff exponencial, distribuição entre tribunais e janela noturna.

Gotchas comuns em produção

  1. Tribunais com cobertura desigual.
  2. Códigos TPU mudam.
  3. Partes em segredo de justiça aparecem como SIGILOSO.
  4. O índice api_publica_tjxx nem sempre cobre processos eletrônicos antigos.
  5. Datas em fuso UTC precisam ser convertidas para America/Sao_Paulo.
  6. Encoding pode variar em retornos antigos.

Quando vale abstrair com a Lupa.law

Para um único tribunal e um caso de uso pontual, integrar diretamente é razoável. O custo cresce quando você precisa cobrir 10+ tribunais, fazer monitoramento contínuo, cruzar processos com sanções e manter audit log para LGPD.

O monitoramento da Lupa.law implementa fan-out paralelo aos 61 tribunais, cache por tribunal, diff engine baseado em hash SHA-256 e severidade automática. Para due diligence pontual, a due diligence de CNPJ consulta DataJud junto com Receita, sanções e TCU.

Perguntas frequentes


Aplicar isso na prática

Lupa.law cruza CEIS, CNEP, CEPIM, TCU e DataJud em uma busca

Cada relatório consulta as fontes oficiais em paralelo, classifica risco e cita a fonte por linha. Teste Solo Founder por 7 dias, sem cartão.

#datajud#cnj#api#integracao#monitoramento