aula 07 de novembro de 2026

TJSP DataJud: recorte anonimizado para aula de jurimetria

Base de metadados processuais do Tribunal de Justiça de São Paulo, extraída do DataJud (CNJ). Serve para estudar distribuição, classes, assuntos, órgãos julgadores e movimentação processual.

Dois arquivos:

Arquivo Linhas Tamanho Uso
tjsp-aula.db 50.000 cerca de 520 MB exercícios em aula, cabe num notebook
tjsp-anon.db 343.273 cerca de 3,6 GB pesquisa completa

Os dois têm o mesmo schema e o mesmo conteúdo por linha, mudando só o recorte.

Aviso sobre os números de processo

Os números de processo são fictícios, gerados para preservar o formato e evitar qualquer ligação com o processo real. O mesmo processo sempre recebe o mesmo número fictício, então as séries continuam consistentes.

O número fictício mantém 20 dígitos e o formato CNJ NNNNNNN-DD.AAAA.J.TR.OOOO. A sequência de 7 dígitos vem de um hash com sal. O DV, o ano, o segmento, o tribunal e a origem são os do original, para não distorcer cortes por ano e por vara. O DV original foi preservado porque os registros antigos do TJSP não seguem o módulo 97 do CNJ.

Não use o número para consultar o processo no site do tribunal. Ele não existe.

O que não está na base

Este recorte não tem nome de parte, CPF, CNPJ, OAB nem advogado. O DataJud publica apenas metadados: classe, assunto, órgão julgador e movimentos. Também não há texto de decisão nem PDF.

Schema

CREATE TABLE processos (
    numero_processo TEXT NOT NULL,      -- número fictício, 20 dígitos
    tribunal TEXT NOT NULL,             -- sempre TJSP
    classe_codigo INTEGER,              -- código CNJ da classe
    classe_nome TEXT,                   -- nome da classe
    grau TEXT,                          -- 1º grau, 2º grau, etc.
    data_ajuizamento TEXT,              -- ISO 8601
    ultima_atualizacao TEXT,            -- ISO 8601
    orgao_nome TEXT,                    -- vara ou órgão julgador
    raw_json TEXT NOT NULL              -- documento original do DataJud
);

O raw_json traz o documento completo: classe, assuntos, orgaoJulgador, movimentos (com complementosTabelados), nivelSigilo, sistema e formato.

Consultas de exemplo

Distribuição por classe, as dez maiores:

SELECT classe_nome, COUNT(*) AS processos
FROM processos
GROUP BY classe_nome
ORDER BY processos DESC
LIMIT 10;

Série anual de ajuizamentos:

SELECT substr(data_ajuizamento, 1, 4) AS ano, COUNT(*) AS processos
FROM processos
WHERE data_ajuizamento <> ''
GROUP BY ano
ORDER BY ano;

Assuntos mais frequentes, lendo o JSON:

SELECT json_extract(assunto.value, '$.nome') AS assunto, COUNT(*) AS total
FROM processos, json_each(processos.raw_json, '$.assuntos') AS assunto
GROUP BY assunto
ORDER BY total DESC
LIMIT 15;

Tempo até o primeiro movimento de sentença:

SELECT COUNT(*) AS processos_com_sentenca
FROM processos
WHERE EXISTS (
    SELECT 1 FROM json_each(processos.raw_json, '$.movimentos') AS m
    WHERE json_extract(m.value, '$.nome') LIKE '%Sentença%'
);

Movimentos mais comuns:

SELECT json_extract(m.value, '$.nome') AS movimento, COUNT(*) AS total
FROM processos, json_each(processos.raw_json, '$.movimentos') AS m
GROUP BY movimento
ORDER BY total DESC
LIMIT 20;

Como abrir

SQLite puro:

sqlite3 tjsp-aula.db

Python:

import sqlite3
con = sqlite3.connect("tjsp-aula.db")
for linha in con.execute("SELECT classe_nome, COUNT(*) FROM processos GROUP BY 1 ORDER BY 2 DESC LIMIT 5"):
    print(linha)

DuckDB, útil para varrer o JSON:

import duckdb
duckdb.sql("SELECT COUNT(*) FROM sqlite_scan('tjsp-aula.db', 'processos')")

Origem e método

Fonte: API pública do DataJud, api-publica.datajud.cnj.jus.br, índice do TJSP. Coleta por shards, com cursor persistido em checkpoint. O recorte foi gerado pelo script anonimiza_tjsp.py.

Cada linha anonimizada foi conferida: nenhum dos 326.545 números originais distintos aparece na base publicada, nem na coluna, nem dentro do raw_json.