Como integrar dados jurídicos via REST API: tutorial completo com Python e Node.js

Do zero ao primeiro resultado: faça sua primeira consulta processual via código em menos de 15 minutos, com exemplos funcionais em Python e Node.js.

Como integrar dados jurídicos via REST API: tutorial completo com Python e Node.js
Público: Desenvolvedores e CTOs Leitura: ~15 min Nível: Iniciante a Intermediário SEO Focus: tutorial-api-consulta-processual

Se você chegou até aqui, provavelmente já sabe o que é uma API jurídica e quer saber o como. Este tutorial vai te levar do zero a uma integração funcional com a API da Judit, com exemplos completos em Python e Node.js que você pode copiar, adaptar e rodar agora mesmo.

📋 O que você vai aprender

Como obter sua API Key → Como autenticar nas requisições → Como fazer sua primeira consulta por CPF ou CNPJ → Como interpretar a resposta JSON → Como lidar com paginação e erros → Boas práticas para produção

Pré-requisitos

  • Uma conta na Judit com API Key — crie em produto.judit.io/api (tem camada gratuita)
  • Python 3.8+ ou Node.js 18+ instalado na sua máquina
  • Familiaridade básica com linha de comando e conceito de HTTP

Passo 1 — Obtendo sua API Key

Antes de qualquer código, você precisa de uma chave de autenticação. A API Key é como uma senha que identifica sua conta em cada requisição — sem ela, a API recusa qualquer acesso.

1

Acesse produto.judit.io/api

Crie sua conta (ou faça login) e navegue até a seção de API Keys. Gere uma nova chave e guarde em lugar seguro — ela não é exibida novamente depois de criada. Veja os planos disponíveis para escolher o que melhor atende sua necessidade.

⚠️ Segurança importante

Nunca coloque sua API Key diretamente no código que vai para um repositório público (GitHub, GitLab). Use variáveis de ambiente (JUDIT_API_KEY) para armazená-la de forma segura.

Passo 2 — Entendendo a estrutura básica de uma requisição

Toda requisição para a API da Judit segue o mesmo padrão: você envia um POST para o endpoint com um body JSON descrevendo o que quer consultar, e inclui sua API Key no header de autorização. Consulte a documentação completa para detalhes sobre todos os parâmetros disponíveis.

Endpoint base:

URL
POST https://requests.prod.judit.io/requests

# Header obrigatório:
Authorization: Bearer SUA_API_KEY_AQUI
Content-Type: application/json

Passo 3 — Sua primeira consulta por CPF ou CNPJ

O exemplo abaixo consulta todos os processos associados a um CPF específico. O campo search_type define o tipo de busca, e search_key é o valor a pesquisar.

consulta_processual.py
import requests
import os
import json

# Carrega a API Key da variável de ambiente
API_KEY = os.getenv("JUDIT_API_KEY")
ENDPOINT = "https://requests.prod.judit.io/requests"

def consultar_processos(cpf_ou_cnpj: str) -> dict:
    """Consulta processos judiciais por CPF ou CNPJ."""

    # Headers da requisição
    headers = {
        "Authorization": f"Bearer {API_KEY}",
        "Content-Type": "application/json"
    }

    # Body da requisição
    payload = {
        "search_type": "cpf_cnpj",   # tipo de busca
        "search_key": cpf_ou_cnpj,    # valor a pesquisar
        "response_type": "lawsuits"    # tipo de resposta desejada
    }

    try:
        response = requests.post(
            ENDPOINT,
            headers=headers,
            json=payload,
            timeout=30
        )
        response.raise_for_status()  # Lança exceção se status != 2xx
        return response.json()

    except requests.exceptions.HTTPError as e:
        print(f"Erro HTTP: {e.response.status_code} - {e.response.text}")
    except requests.exceptions.Timeout:
        print("Timeout: a requisição demorou mais de 30 segundos")
    except requests.exceptions.RequestException as e:
        print(f"Erro na requisição: {e}")

    return None


# Exemplo de uso
if __name__ == "__main__":
    resultado = consultar_processos("12345678901")  # CPF sem pontuação

    if resultado:
        print(f"Request ID: {resultado.get('request_id')}")
        print(json.dumps(resultado, indent=2, ensure_ascii=False))
consultaProcessual.js
// Usa a Fetch API nativa do Node.js 18+
const API_KEY = process.env.JUDIT_API_KEY;
const ENDPOINT = 'https://requests.prod.judit.io/requests';

async function consultarProcessos(cpfOuCnpj) {
  const payload = {
    search_type: 'cpf_cnpj',   // tipo de busca
    search_key: cpfOuCnpj,     // valor a pesquisar
    response_type: 'lawsuits'  // tipo de resposta desejada
  };

  try {
    const response = await fetch(ENDPOINT, {
      method: 'POST',
      headers: {
        'Authorization': `Bearer ${API_KEY}`,
        'Content-Type': 'application/json'
      },
      body: JSON.stringify(payload)
    });

    if (!response.ok) {
      const errorBody = await response.text();
      throw new Error(`HTTP ${response.status}: ${errorBody}`);
    }

    const data = await response.json();
    return data;

  } catch (error) {
    console.error('Erro na consulta:', error.message);
    return null;
  }
}

// Exemplo de uso
consultarProcessos('12345678901')
  .then(resultado => {
    if (resultado) {
      console.log('Request ID:', resultado.request_id);
      console.log(JSON.stringify(resultado, null, 2));
    }
  });
terminal
curl -X POST https://requests.prod.judit.io/requests \
  -H "Authorization: Bearer SUA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "search_type": "cpf_cnpj",
    "search_key": "12345678901",
    "response_type": "lawsuits"
  }'

Passo 4 — Entendendo a resposta da API

A Judit usa um modelo assíncrono: quando você faz a requisição, recebe imediatamente um request_id. Os resultados ficam disponíveis para consulta assim que o processamento for concluído — você pode usar webhooks para ser notificado automaticamente (veremos isso no próximo artigo). Veja mais detalhes sobre o modelo de resposta na documentação oficial.

📥 Estrutura da resposta — campos principais
request_id“req_abc123xyz”
statuspending | processing | completed
search_type“cpf_cnpj”
search_key“12345678901”
lawsuits[ array de processos ]
lawsuits[].lawsuit_id“ID único do processo”
lawsuits[].cnj_number“0001234-56.2023.8.26.0100”
lawsuits[].subject“Cobrança”
lawsuits[].court“TJSP”
lawsuits[].parties[ autores e réus ]
lawsuits[].last_movement{ data, descrição }

Passo 5 — Tipos de consulta disponíveis

O campo response_type controla que tipo de dado a API retorna. Confira todos os tipos suportados na documentação da Judit. Os principais valores são:

// response_type: "lawsuits"
// → Todos os processos judiciais (cíveis, trabalhistas, criminais, federais)

// response_type: "entity"
// → Dados cadastrais (Receita Federal, situação, sócios)

// response_type: "warrant"
// → Mandados de prisão (consulta ao BNMP)

// response_type: "criminal_execution"
// → Execuções criminais (para compliance e background check)

Passo 6 — Consulta por número CNJ

Além de CPF/CNPJ, você pode consultar um processo diretamente pelo número CNJ (o número padrão de todos os processos brasileiros no formato NNNNNNN-DD.AAAA.J.TT.OOOO):

consulta_por_numero.py
# Consulta por número CNJ
payload = {
    "search_type": "lawsuit_cnj",
    "search_key": "0001234-56.2023.8.26.0100",
    "response_type": "lawsuit"
}

# Consulta por número OAB (monitora carteira de advogado)
payload_oab = {
    "search_type": "oab",
    "search_key": "SP123456",
    "response_type": "lawsuits"
}
consultaPorNumero.js
// Consulta por número CNJ
const payloadCNJ = {
  search_type: 'lawsuit_cnj',
  search_key: '0001234-56.2023.8.26.0100',
  response_type: 'lawsuit'
};

// Consulta por OAB
const payloadOAB = {
  search_type: 'oab',
  search_key: 'SP123456',
  response_type: 'lawsuits'
};

Passo 7 — Tratamento de erros e boas práticas para produção

Uma integração de produção precisa ser resiliente. Aqui estão as práticas mais importantes:

producao.py
import time
from functools import wraps

def retry_with_backoff(max_retries=3, base_delay=1.0):
    """Decorator para retry automático com backoff exponencial."""
    def decorator(func):
        @wraps(func)
        def wrapper(*args, **kwargs):
            for attempt in range(max_retries):
                try:
                    return func(*args, **kwargs)
                except requests.exceptions.HTTPError as e:
                    # 429 = rate limit → espera antes de tentar novamente
                    if e.response.status_code == 429:
                        delay = base_delay * (2 ** attempt)
                        print(f"Rate limit atingido. Aguardando {delay}s...")
                        time.sleep(delay)
                    else:
                        raise
            raise Exception("Máximo de tentativas atingido")
        return wrapper
    return decorator

# Aplique o decorator na sua função de consulta:
@retry_with_backoff(max_retries=3)
def consultar_com_retry(cpf_cnpj):
    return consultar_processos(cpf_cnpj)
✅ Checklist de boas práticas para produção

1. Variáveis de ambiente para API Keys — nunca no código.

2. Timeout explícito em todas as requisições (30s recomendado).

3. Retry com backoff exponencial para erros 429 (rate limit) e 503 (indisponibilidade temporária).

4. Logging estruturado de todas as requisições (request_id, status, tempo de resposta).

5. Webhooks em vez de polling para monitoramento contínuo — muito mais eficiente.

Próximo passo: Webhooks para monitoramento em tempo real

Com as consultas funcionando, o próximo nível é configurar webhooks — assim você não precisa ficar “perguntando” para a API se houve alguma atualização. A API da Judit avisa você automaticamente quando um processo tem uma movimentação nova.

Isso é o que transforma uma consulta pontual em um sistema de monitoramento contínuo. E é exatamente o que abordamos no próximo artigo desta série. Enquanto isso, explore a documentação completa para se familiarizar com todos os recursos disponíveis.

Explore a API da Judit na prática

Crie sua conta gratuita, pegue sua API Key e faça sua primeira consulta em menos de 5 minutos.

Quer saber como a Judit pode ajudar seu negócio?

Compartilhe o artigo

Veja outros artigos