Acesse os dados de gastos públicos do governo federal brasileiro sem chave de API. Skill pronta para Claude Code (e scripts Python que funcionam sozinhos) para consultar o Portal da Transparência da CGU: despesas, licitações, contratos, convênios, cartão corporativo, salários de servidores, notas fiscais, viagens, emendas parlamentares, benefícios sociais e sanções.
# quanto cada órgão gastou no cartão corporativo em maio/2026
python3 scripts/pt.py baixar cpgf 202605 --dir dados
python3 scripts/pt.py agregar dados/202605_CPGF.csv --por "NOME ÓRGÃO" --valor "VALOR TRANSAÇÃO"
# contratos federais assinados no 1º trimestre de 2026
python3 scripts/site.py consulta contratos --p assinaturaDe=01/01/2026 \
--p assinaturaAte=31/03/2026 --tam 500 --paginas 4 --csv --out contratos.csv- Por que isso existe
- Instalação
- Modo massa: dados abertos em CSV
- Modo consulta: APIs internas do site
- Conjuntos de dados disponíveis
- API REST oficial (opcional)
- Armadilhas que vão te morder
- Perguntas frequentes
- Uso responsável
- English summary
Consultar o Portal da Transparência por código é mais chato do que deveria:
- A API REST oficial exige chave — cadastro com conta gov.br nível prata/ouro. Barreira real para script rápido, notebook de análise ou agente autônomo.
- O site é blindado por AWS WAF.
curle bibliotecas HTTP recebem202/405comx-amzn-waf-action: challengee uma página "Human Verification". - Os dados abertos em massa não são documentados de forma utilizável — o nome do arquivo, a periodicidade e o formato do período mudam de conjunto para conjunto, e não há listagem pública do bucket.
Este repositório resolve os três. Tudo aqui foi verificado empiricamente contra a fonte, não deduzido da documentação.
Descoberta 1 — o bucket de dados abertos é público e não tem WAF.
https://dadosabertos-download.cgu.gov.br/PortalDaTransparencia/saida/ serve os
zips direto, sem chave, sem cookie, sem captcha. O que faltava era o mapa: qual
slug, qual periodicidade (diária, mensal, anual, snapshot) e qual template de
nome de arquivo. Estão em references/datasets.json,
com 27 conjuntos validados um a um por HEAD.
Descoberta 2 — o desafio do WAF é JS, não captcha visual. Um browser com
fingerprint convincente passa em silêncio, e o cookie aws-waf-token resultante
vale em requests HTTP normais depois. Resultado dos testes:
| cliente | resultado |
|---|---|
curl, requests, WebFetch |
202, página "Human Verification" |
curl_cffi com impersonate de TLS |
202 challenge — TLS sozinho não basta |
| Playwright Chromium headless | desafio interativo ("Iniciar") |
| Playwright Chrome headed | desafio interativo — CDP é detectado |
| Camoufox headless | passa no 1º ciclo |
Com o token em mãos, as APIs JSON internas do site ficam acessíveis
(/<tema>/consulta/resultado): filtros arbitrários, 500 registros por página,
sem chave. É o único caminho para contratos e convênios, que não têm zip
publicado no bucket.
O modo massa (pt.py) usa só a biblioteca padrão do Python — clone e rode.
git clone https://github.com/artificialguybr/portal-da-transparencia-skill.git
cd portal-da-transparencia-skill
python3 scripts/pt.py datasetsO modo consulta (site.py) precisa de duas dependências:
pip install -r requirements.txt
camoufox fetch # baixa o browser stealth (~80 MB, uma vez)git clone https://github.com/artificialguybr/portal-da-transparencia-skill.git \
~/.claude/skills/portal-transparenciaPronto — o agente carrega a skill sozinho quando você perguntar algo como "quanto
o Ministério da Saúde gastou no cartão corporativo em maio?" ou "essa empresa
está inidônea?". Para deixar disponível só em um projeto, clone em
.claude/skills/ dentro dele.
Para série histórica, análise agregada, "tudo de um mês".
S=scripts/pt.py
python3 $S datasets # lista os 27 conjuntos (aceita filtro: datasets cartao)
python3 $S descobrir cpgf # período mais recente publicado + tamanho do zip
python3 $S resolver cpgf 202605 # URL real no bucket, sem baixar
python3 $S baixar cpgf 202605 --dir dados
python3 $S colunas dados/202605_CPGF.csvFiltrar e agregar são streaming — aguentam CSV de vários GB sem pandas:
# transações do cartão em postos de combustível
python3 $S filtrar dados/202605_CPGF.csv --onde "NOME FAVORECIDO~auto posto" \
--cols "NOME ÓRGÃO" "NOME FAVORECIDO" "VALOR TRANSAÇÃO" --out postos.csv
# ranking de gasto por órgão
python3 $S agregar dados/202605_CPGF.csv --por "NOME ÓRGÃO" --valor "VALOR TRANSAÇÃO"--onde aceita COLUNA~texto (contém) e COLUNA=valor (igual), ignorando acento
e caixa, e pode ser repetido (AND). Nome de coluna casa por prefixo, então
--por "NOME ÓRGÃO" já resolve "NOME ÓRGÃO SUPERIOR" vs "NOME ÓRGÃO".
Sempre rode descobrir antes de baixar: a defasagem varia por conjunto —
despesas sai no dia seguinte, benefícios costumam atrasar 1 a 2 meses, licitações
às vezes mais.
Para filtro específico (nome, CNPJ, órgão, período), poucos registros, e os temas sem zip.
T=scripts/site.py
python3 $T consulta contratos --p assinaturaDe=01/01/2026 --p assinaturaAte=31/03/2026 \
--tam 500 --paginas 4 --csv --out contratos.csv
python3 $T consulta servidores --p nome=silva --tam 50
python3 $T consulta convenios --p periodoLiberacaoRecursosDe=01/01/2026Temas já mapeados em references/consultas.json:
contratos, convenios, licitacoes, cartoes, viagens, beneficios,
emendas, servidores, despesas-favorecido.
Para qualquer outra consulta do site, descubra o endpoint e os parâmetros automaticamente:
python3 $T capturar https://portaldatransparencia.gov.br/<tema>/consulta --salvar <nome>Isso abre a página no Camoufox, intercepta o XHR /resultado e grava endpoint +
parâmetros no catálogo — nenhum mapeamento manual necessário.
A primeira chamada gasta ~15 s abrindo o browser para pegar o token; depois ele
fica em cache (~/.cache/portal-transparencia/) e as consultas são HTTP puro,
com renovação automática quando expira.
| Pergunta | slug | periodicidade |
|---|---|---|
| Quanto o órgão X pagou / empenhou | despesas |
diária (AAAAMMDD) |
| Quanto a empresa/pessoa Y recebeu da União | despesas-favorecidos |
mensal |
| Execução orçamentária por programa/ação | despesas-execucao, orcamento-despesa |
mensal / anual |
| Gasto no cartão corporativo e quem é o portador | cpgf, cpcc, cpdc |
mensal |
| Salário e cadastro de servidor, militar, pensionista | servidores |
AAAAMM_<sufixo> |
| Licitações, itens licitados, compras | licitacoes, compras |
mensal |
| Notas fiscais emitidas contra órgão federal | notas-fiscais |
mensal |
| Diárias e passagens de viagens a serviço | viagens |
anual |
| Emendas parlamentares (autor, valor pago) | emendas-parlamentares |
arquivo único |
| Transferências a estados e municípios | transferencias |
mensal |
| Receitas da União | receitas |
anual |
| Empresas inidôneas / punidas por corrupção | ceis, cnep |
snapshot do dia |
| ONGs impedidas, servidores expulsos, leniência | cepim, ceaf, acordos-leniencia |
snapshot do dia |
| Pessoas Expostas Politicamente | pep |
mensal |
| Bolsa Família, BPC, Garantia-Safra, Seguro Defeso | novo-bolsa-familia, bpc, garantia-safra, seguro-defeso |
mensal |
| Auxílio Brasil, Auxílio Emergencial (encerrados) | auxilio-brasil, auxilio-emergencial |
mensal, histórico |
servidores usa período composto — 202605_Servidores_SIAPE. Sufixos válidos:
Servidores_SIAPE, Militares, Pensionistas_SIAPE, Reserva_Reforma_Militares.
Contratos, convênios, imóveis funcionais e renúncias fiscais não têm zip no bucket (testado exaustivamente, com dezenas de variações de slug e nome). Use o modo consulta ou a API oficial.
Se você já tem chave, ela também está coberta: 106 endpoints documentados em
references/endpoints.md, DTOs de retorno em
references/schemas.md, spec OpenAPI completa em
references/openapi.json.
export PORTAL_TRANSPARENCIA_API_KEY="sua-chave"
python3 scripts/pt.py api contratos codigoOrgao=26000 pagina=1Chave gratuita em portaldatransparencia.gov.br/api-de-dados/cadastrar-email (exige conta gov.br nível prata ou ouro). Limite de 400 requisições/minuto (700 entre 0h e 6h); estourar suspende o token por 8 horas.
Vale a chave em um caso que nenhum outro modo atende: busca por CPF completo.
Cada uma destas custou uma sessão de depuração:
- Os CSVs são latin-1, separador
;, decimal com vírgula (1.234,56). Com pandas:pd.read_csv(f, sep=";", encoding="latin-1", decimal=","). - CPF vem sempre mascarado (
***.866.951-**) nos arquivos em massa e nas APIs do site. CNPJ vem completo. Casar CPF exato só pela API oficial. - Parâmetro desconhecido é ignorado em silêncio nas APIs do site, sem erro:
nome=silvafiltra servidores,termo=silvadevolve a lista inteira como se tivesse filtrado. Sempre confira que os registros batem com o filtro. recordsTotalvem como9223372036854775807(Long.MAX_VALUE) — é lixo, não use como contagem. Pagine até um lote voltar menor quetamanhoPagina.- O nome do filtro de período muda por tema:
de/ateem despesas, licitações, cartões e viagens;assinaturaDe/assinaturaAteem contratos;periodoLiberacaoRecursosDe/...Ateem convênios. Datas emDD/MM/AAAA. - Órgãos têm dois sistemas de código: SIAFI (orçamento e despesa) e SIAPE (pessoal). Códigos diferentes, não intercambiáveis. Municípios usam código IBGE.
- Um zip pode conter vários CSVs —
despesastraz Empenhos, Liquidação, Pagamento e itens separados. - Arquivos grandes:
novo-bolsa-familia~340 MB,auxilio-brasil~350 MB,bpc~185 MB.pt.py baixaraborta acima de 500 MB por padrão (--limite-mb 0libera) e cacheia o zip. - O nome do arquivo de
viagensinclui a data de extração (2026_20260719_Viagens.zip), que muda sem aviso.pt.pydescobre sozinho.
Preciso de chave de API? Não. Os dois modos principais funcionam sem cadastro. A chave só é necessária para busca por CPF completo.
Isso é raspagem de site? O modo massa baixa arquivos de dados abertos publicados justamente para download em volume — é o uso pretendido. O modo consulta chama as mesmas APIs JSON que o navegador chama ao usar o site, com pausa de 1 s entre requisições e paginação limitada.
Por que precisa de browser stealth? O WAF na frente do site desafia qualquer cliente que não pareça browser, inclusive para ler dado público. O browser só resolve o desafio uma vez; o resto é HTTP normal.
Funciona no Linux/Windows? Sim. pt.py é stdlib puro. site.py depende de
Camoufox e curl_cffi, ambos multiplataforma.
Os dados são em tempo real? Não. Cada conjunto tem sua defasagem — rode
descobrir para ver o período mais recente publicado e cite conjunto e período
na sua análise.
Um tema do modo consulta parou de funcionar. É API interna, sem contrato de
estabilidade. Rode site.py capturar <url> --salvar <nome> de novo para
remapear.
Os dados são públicos por força da Lei de Acesso à Informação (Lei 12.527/2011) e do Decreto 8.777/2016 de dados abertos. Ainda assim:
- Prefira o modo massa para volume. O bucket de dados abertos existe para isso; o site não. Não use o modo consulta para varrer o portal inteiro.
- Respeite a infraestrutura pública. Os padrões deste repo são conservadores (1 s entre requisições, paginação explícita). Mantenha assim.
- Os arquivos de benefícios e de servidores contêm dados pessoais de milhões de pessoas — nome, NIS, CPF parcial. Servidor público e empresa sancionada são informação pública por lei; beneficiário de programa social merece mais cuidado. Não monte perfis de indivíduos privados nem cruze bases para reidentificar CPF mascarado.
- Confira na fonte antes de publicar. Se sua análise vai virar reportagem ou denúncia, valide os números na tela do portal.
Projeto independente, sem vínculo com a CGU ou o governo federal.
AI-agent skill and Python CLI for Brazil's federal government transparency portal (Portal da Transparência / CGU) — no API key required.
Two access modes, both verified against the live source:
- Bulk mode (
scripts/pt.py, stdlib only): downloads open-data zips from the CGU's public bucket, which has no WAF and needs no key. This repo contributes the missing map of 27 datasets — slug, periodicity and filename template — plus streaming filter/aggregate over the latin-1;-separated CSVs. - Query mode (
scripts/site.py): the portal's own internal JSON APIs behind AWS WAF. The WAF challenge is JS-based, so a stealth browser (Camoufox) clears it silently and the resultingaws-waf-tokencookie is then reusable from plain HTTP. This is the only route to federal contracts and grant agreements, which have no bulk zip. Includes an XHR-capture command that auto-discovers any consultation endpoint and its parameters.
Covers public spending, procurement, contracts, corporate-card transactions, civil-servant salaries, invoices, travel, congressional budget amendments, social benefits (Bolsa Família, BPC), and sanction registries (debarred and corruption-punished companies). The official REST API (106 endpoints, OpenAPI spec included) is supported as an optional third mode when you have a key.
MIT licensed. Independent project, not affiliated with the Brazilian government.