TRF3 — Tribunal Regional Federal da 3ª Região

Public process consultation (cpopg) for the federal courts under the third region (SP and MS), via the PJe ConsultaPublica system at pje1g.trf3.jus.br/pje/.

Feature Available
cpopg Yes
cposg No
cjsg No
cjpg No

Looking up a single process

import juscraper as jus

trf3 = jus.scraper("trf3")
df = trf3.cpopg("5005946-09.2025.4.03.6324")
print(df.shape)
df[["id_cnj", "processo", "classe", "data_distribuicao"]]
TRF3 cpopg: 100%|██████████| 1/1 [00:01<00:00,  1.08s/it]
(1, 12)
id_cnj processo classe data_distribuicao
0 50059460920254036324 5005946-09.2025.4.03.6324 PROCEDIMENTO DO JUIZADO ESPECIAL CÍVEL (436) 29/09/2025

Available columns

df.columns.tolist()
['processo',
 'data_distribuicao',
 'classe',
 'assunto',
 'jurisdicao',
 'orgao_julgador',
 'endereco_orgao',
 'polo_ativo',
 'polo_passivo',
 'movimentacoes',
 'documentos',
 'id_cnj']

The first three columns are the canonical scalars; the trailing four are list-typed and carry the nested arrays (parties, movements, attached documents).

Inspecting movements

movs = df.iloc[0]["movimentacoes"]
print(f"{len(movs)} events recorded")
for m in movs[:3]:
    print(f"  {m['data']} - {m['descricao']}")
11 events recorded
  29/04/2026 12:51:15 - Remetidos os Autos ao CEJUSC ou Centros de Conciliação/Mediação da Subseção Judiciária
  29/04/2026 12:37:09 - Expedida/certificada a intimação eletrônica
  29/04/2026 12:37:08 - Proferido despacho de mero expediente

Inspecting parties

print("Polo ativo:")
for p in df.iloc[0]["polo_ativo"]:
    print(f"  - {p['participante']}")

print()
print("Polo passivo:")
for p in df.iloc[0]["polo_passivo"]:
    print(f"  - {p['participante']}")
Polo ativo:
  - JOAO PAULO NASCIMENTO DA SILVA - CPF: 003.XXX.XXX-XX (AUTOR)

Polo passivo:
  - CAIXA ECONOMICA FEDERAL - CEF - CNPJ: 00.3XX.XXX/XXXX-XX (REU) Departamento Jurídico - Caixa Econômica Federal

Looking up multiple processes at once

cnjs = [
    "50059460920254036324",
    "50061271020254036324",
    "50035362120254036342",
]
df_batch = trf3.cpopg(cnjs)
df_batch[["id_cnj", "processo", "classe"]]

TRF3 cpopg:   0%|          | 0/3 [00:00<?, ?it/s]
TRF3 cpopg:  33%|███▎      | 1/3 [00:01<00:02,  1.42s/it]
TRF3 cpopg:  67%|██████▋   | 2/3 [00:03<00:01,  1.63s/it]
TRF3 cpopg: 100%|██████████| 3/3 [00:04<00:00,  1.30s/it]
TRF3 cpopg: 100%|██████████| 3/3 [00:04<00:00,  1.37s/it]
id_cnj processo classe
0 50059460920254036324 5005946-09.2025.4.03.6324 PROCEDIMENTO DO JUIZADO ESPECIAL CÍVEL (436)
1 50061271020254036324 5006127-10.2025.4.03.6324 PROCEDIMENTO DO JUIZADO ESPECIAL CÍVEL (436)
2 50035362120254036342 5003536-21.2025.4.03.6342 PROCEDIMENTO DO JUIZADO ESPECIAL CÍVEL (436)

Handling processes the public portal cannot return

When a CNJ does not surface in the public consultation (sigilo, archived, or simply not found), the row carries only id_cnj. The other columns come back as None/NaN, so callers can still distinguish “looked up but missing” from “never tried”.

import pandas as pd

df_missing = trf3.cpopg("00000000020994030000")
print("processo:", df_missing.iloc[0].get("processo"))
print("classe:", df_missing.iloc[0].get("classe"))

TRF3 cpopg:   0%|          | 0/1 [00:00<?, ?it/s]
TRF3 cpopg: 100%|██████████| 1/1 [00:00<00:00,  8.34it/s]
TRF3 cpopg: 100%|██████████| 1/1 [00:00<00:00,  8.19it/s]
processo: None
classe: None

Splitting download from parse

cpopg is a thin wrapper over cpopg_download (raw HTML) + cpopg_parse (HTML → DataFrame). Splitting them is useful when you want to cache the raw HTMLs to disk before processing.

htmls = trf3.cpopg_download("5005946-09.2025.4.03.6324")
print(f"got {len(htmls)} HTML(s), {len(htmls[0])} chars")

df_again = trf3.cpopg_parse(htmls, ["50059460920254036324"])
df_again[["id_cnj", "processo", "data_distribuicao"]]

TRF3 cpopg:   0%|          | 0/1 [00:00<?, ?it/s]
TRF3 cpopg: 100%|██████████| 1/1 [00:00<00:00,  2.43it/s]
TRF3 cpopg: 100%|██████████| 1/1 [00:00<00:00,  2.43it/s]
got 1 HTML(s), 85297 chars
id_cnj processo data_distribuicao
0 50059460920254036324 5005946-09.2025.4.03.6324 29/09/2025