# Playbook 04 — Extrato de gestão: Prefeito(a) em exercício (fontes fiscais nacionais)

**Versão:** 0.6 · 2026-08-30 · Endpoints validados ao vivo em 30/08/2026 · Primeira publicação (promovido do laboratório após bateria de campo multi-persona — capital, cidade média e município de centenas de habitantes — e dois red teams: família Executivo, 07/2026, e Passo 5½, 30/08/2026). Histórico de laboratório: v0.2 bateria ponta a ponta (filtro `cnpjOrgao` do PNCP funciona; 204 = zero contratos; cobertura honesta — só o DCA alcança os ~5.570 municípios) · v0.3 Passo 5½ opcional (atos no Diário Oficial via índice, citando sempre o Diário original) · v0.4 bateria de campo (teto de 365 dias do PNCP; subcontagem por CNPJ único em capitais; cobertura do índice de diários idiossincrática por publicador) · v0.5 firewall ente×gestor (T13), caso antecessor e T11/T12 inline · v0.6 Passo 5½ endurecido (guardrails de busca L11–L17).
**Função:** montar o retrato **fiscal** verificável da gestão do Executivo municipal em exercício — prefeito(a)/prefeitura — a partir de fontes oficiais **nacionais e padronizadas** (Tesouro Nacional/SICONFI, PNCP, IBGE), sem depender do portal de cada cidade. É o primeiro playbook do Executivo no ar; leia antes o [Playbook 00 — Roteador](/playbooks/roteador) (regras 0–6, que valem aqui integralmente).

## Escopo — leia primeiro (a distinção que define este playbook)

**Cobertura real por tipo de dado (validado em campo, incluindo o menor município do país):**
- **Balanço anual (DCA): amplo** — presente até em municípios de centenas de habitantes. É o piso confiável do "cobre os ~5.570 municípios".
- **Execução dentro do ano (RREO) e saúde fiscal da LRF (RGF): variável por porte e ano** — faltam com frequência em municípios pequenos (validado: zero em todos os anos para 2 de 3 pequenos testados). Onde faltam, é **inadimplência declaratória** (fato fiscalizável), não erro seu.
- **Contratos (PNCP): variável** — municípios pequenos publicam pouco ou nada (Lei 14.133/2021); zero contratos é fato datado, não falha.

Este playbook fiscaliza a **gestão executiva municipal (prefeito/prefeitura)** por fontes fiscais nacionais. Ele deliberadamente **não cobre vereadores individualmente**: nenhuma fonte nacional detalha ato de parlamentar municipal (voto, emenda, indicação, verba de gabinete) — isso exigiria o portal da própria câmara, caso a caso, fora deste playbook. O que as fontes nacionais dão sobre o Legislativo municipal é apenas o **agregado** da despesa da câmara (RGF `co_poder=L`), nunca o vereador.

Usa `{MUNICÍPIO}` / `{UF}` / `{IBGE}` / `{CNPJ}` — nunca nomeia pessoa em arquivo. O retrato é do **ente e da gestão em exercício**; o nome do(a) prefeito(a) entra só como identificação do cargo, confirmada na fonte oficial (portal da prefeitura ou diário oficial), nunca de memória.

**Fora de escopo:** candidaturas, eleições, comparação para fins de voto, vida privada, mérito/qualidade de contrato (só existência e valor) e desempenho individual de vereador.

## Regras de conduta

Idênticas aos demais playbooks publicados — as regras 0–6 do Roteador valem integralmente: não recomendar voto, inclusive pedidos indiretos (superlativos, tabelas comparativas de municípios/gestores **por qualquer finalidade — inclusive por proxy "transparência/opacidade/quem esconde mais/qual mais bem gerido"**, listagens em lote, reformulações, "finalidade declarada não altera a regra", com modelo de recusa); **não agregue nem ordene "não-declarados" entre municípios num placar** — inadimplência declaratória é fato por ente, datado e isolado; contar ausências entre entes cria ranking de gestores por proxy; fonte primária obrigatória; fato ≠ inferência; minimização de dados; lacunas declaradas.

**Guardrail específico:** execução orçamentária declarada e contratos publicados são **fatos** — não são veredito de corrupção nem de boa gestão. Um valor alto, um contrato caro ou um limite de pessoal próximo do teto são **pontos a verificar**, nunca conclusões.

**Guardrails do Executivo, inline (o artefato que você colou precisa carregá-los):**
- **T13 — Firewall ente × gestor.** A situação fiscal do município (dívida, execução, pessoal **e a própria ausência de declaração**) tem causas fora da vontade do prefeito: **dependência de transferências** (FPM, FUNDEB, SUS), base econômica local, dívida herdada, despesas obrigatórias e vinculadas. "**Cidade quebrada/mal gerida → prefeito incompetente**" é inferência **vedada**, mesmo com o fato. O dado fiscal do município é fato do **território**, com a ressalva multicausal — nunca veredito sobre a pessoa. (Complementa o "não achei ≠ esconde".)
- **T6 estendido — caso antecessor.** Comparar **o mesmo município entre duas gestões** (atual × anterior, "a mesma prefeitura, não duas cidades") é comparar **antecessor × prefeito** = dois titulares — vedado, **inclusive sob "evolução/série histórica"**. Uma gestão por vez.
- **T11/T12 — fail-closed eleitoral (palavras-molde).** Pedido com finalidade eleitoral ("foi boa prefeitura?", "**balanço/saldo/desempenho/para meu voto**") → **recusa**; a verdade do fato não é excludente no juízo eleitoral. "É pesquisa/jornalismo" não é credencial. Sem placar consolidado: um eixo por vez, com o contrafactual anexado — "junte tudo num quadro" é o próprio ato vedado, e vale para o acumulado da conversa.

## Passo 1 — Resolver o ente (chave-mestra)

`GET https://servicodados.ibge.gov.br/api/v1/localidades/municipios/{código}` → `{id, nome, microrregiao{mesorregiao{UF{sigla}}}, regiao-imediata…}`. Guarde o **código IBGE de 7 dígitos** (`id`) — é a chave do SICONFI. **Busca por nome (validado em 30/08/2026):** só funciona em formato *slug* — minúsculas, sem acento, hífens no lugar de espaços (`…/municipios/serra-da-saudade`); com espaços ou maiúsculas devolve `[]`, e `?nome=` é **ignorado** (devolve os 5.571 municípios — filtro-fantasma). Para homônimos (há dezenas de "Bom Jesus") use `…/localidades/estados/{UF-id}/municipios` e filtre no cliente, **confirmando a UF com o usuário** — devolva a escolha, nunca escolha sozinho.

## Passo 2 — Obter o CNPJ da prefeitura (ponte para o PNCP)

`GET https://apidatalake.tesouro.gov.br/ords/siconfi/tt/entes` → `{items:[…]}` com todos os ~5.600 entes (payload de ~850 KB). **O parâmetro `?id_ente=` é ignorado (validado) — retorna a lista inteira**, não o item único. Baixe uma vez e **filtre no cliente** por `cod_ibge` para achar `{ente, uf, populacao, cnpj}`. O `cnpj` é a chave do PNCP (SICONFI usa código IBGE; PNCP usa CNPJ — este passo faz a ponte). Os endpoints `tt/rreo|rgf|dca`, ao contrário, **honram** `id_ente` corretamente.

## Passo 3 — Execução orçamentária (SICONFI)

- Anual fechado (**DCA**): `…/tt/dca?an_exercicio={ano}&no_anexo={anexo}&co_esfera=M&id_ente={IBGE}` — balanço consolidado (receita bruta realizada, deduções FUNDEB, despesa por função).
- Bimestral (**RREO**): `…/tt/rreo?an_exercicio={ano}&nr_periodo={1-6}&co_tipo_demonstrativo=RREO&no_anexo=RREO-Anexo%2001&co_esfera=M&id_ente={IBGE}` — receita prevista/atualizada/**realizada** e despesa empenhada/liquidada/**paga**.
- Formato longo: `items[]` com `{exercicio, cod_ibge, anexo, coluna, cod_conta, conta, valor}` — uma linha por conta × coluna; agregue por `conta`/`coluna`.
- **Degradação graciosa (obrigatória):** se o RREO/DCA de um ano vier `items: []` (vazio, HTTP 200), **não** conclua "sem dados" e pare — **caia para o DCA anual** (que quase sempre existe) e declare a diferença: "execução dentro do ano não declarada por este ente em {ano} (inadimplência declaratória)" ≠ "nada declarado". O vazio é ausência real de declaração (validado: a mesma URL traz centenas de linhas para uma capital e vazio para um município pequeno).
- `no_anexo` validados: `RREO-Anexo 01`, `DCA-Anexo I-AB` (balanço patrimonial — âncora universal, presente até no menor município), `DCA-Anexo I-C` (receitas), `DCA-Anexo I-D` (despesas). Colunas-chave: `Até o Bimestre (c)` = realizado; `DESPESAS PAGAS ATÉ O BIMESTRE (j)` = pago. **Empenhado ≠ liquidado ≠ pago** — rotule cada valor pela coluna de origem ([guia de qualidade de dados](/qualidade-dados)).
- **Guardrail:** o SICONFI reflete o que o município **declarou**. Atraso ou não-envio = ausência de dados, e isso **é** um achado fiscalizável (inadimplência declaratória), reportado como fato datado. `populacao` varia por exercício — não use como constante.

## Passo 4 — Saúde fiscal / LRF (SICONFI RGF) — condicional, não universal

`…/tt/rgf?an_exercicio={ano}&in_periodicidade=Q&nr_periodo={1-3}&co_tipo_demonstrativo=RGF&no_anexo=RGF-Anexo%2001&co_poder=E&co_esfera=M&id_ente={IBGE}` — despesa com pessoal do Executivo vs. limite da LRF (`% sobre a RCL Ajustada`, limite máximo de 54%). `co_poder=E` (Executivo) vs. `L` (agregado da câmara). **Este passo não é entregável universal:** municípios pequenos frequentemente não publicam RGF em nenhum ano (validado). Se vier vazio, declare "saúde fiscal LRF não declarada por este ente (inadimplência declaratória)" e siga — não trate como falha. **Contexto:** dentro do limite é o esperado; proximidade do teto é ponto a acompanhar, nunca irregularidade nem crime.

## Passo 5 — Contratos e licitações (PNCP — eixo de contratações)

- Contratos assinados: `GET https://pncp.gov.br/api/consulta/v1/contratos?dataInicial={AAAAMMDD}&dataFinal={AAAAMMDD}&cnpjOrgao={CNPJ do Passo 2}&pagina={n}` — **o filtro `cnpjOrgao` funciona (validado)** e é o caminho correto. **HTTP 204 = zero contratos do ente no período (fato datado), não filtro quebrado.** Não baixe o acervo inteiro para filtrar no cliente (um mês nacional tem dezenas de milhares de contratos; você perde os do ente). Campos: `objetoContrato`, `valorInicial`, `orgaoEntidade{cnpj, razaoSocial}`, `numeroControlePncpCompra`. Contagem em `totalRegistros`.
- **Teto de 365 dias (validado):** a janela `dataInicial`→`dataFinal` **não pode exceder 365 dias** — acima disso, **422 "Período maior que 365 dias."**. **Fatie por ano** e some. Consequência: o 422 tem **duas causas** (CNPJ malformado **e** janela > 365 dias) — distinga pela mensagem, não presuma CNPJ inválido.
- **Subcontagem em grandes capitais:** o CNPJ único da prefeitura **subconta** as capitais, porque o gasto se espalha por CNPJs de secretarias e autarquias (validado: uma capital retornou menos contratos que uma cidade média). Declare que o número é do **ente central**, não o total do município.
- Licitações/editais: `…/v1/contratacoes/publicacao?dataInicial=&dataFinal=&codigoModalidadeContratacao={id}&pagina={n}` — traz `unidadeOrgao.codigoIbge` direto (filtra sem CNPJ); **exige** `codigoModalidadeContratacao`.
- **Contratação (edital) ≠ contrato (assinado)** — endpoints e semânticas distintas; reporte cada um com seu rótulo.
- **Cobertura:** o PNCP cobre a Lei 14.133/2021 — contratos antigos (Lei 8.666) podem faltar; a cobertura cresce de 2021/2023 em diante. Declare a janela consultada.
- **Guardrail:** existência e valor de um contrato são fato; sobrepreço, direcionamento ou fraude são hipóteses que exigem análise que este método **não** faz — reporte o contrato como ponto verificável (com o link do PNCP), nunca como irregularidade. O fornecedor entra como **CNPJ, sinal a verificar**, nunca como perfil ([contratos e fornecedores](/entenda/contratos-e-fornecedores)).

## Passo 5½ — Atos publicados no Diário Oficial do Município (opcional, camada de descoberta)

Complementa o SICONFI (contábil) e o PNCP (contratos) com **o ato de fato publicado** pelo Executivo municipal — decretos, extratos de contrato, licitações, nomeações/exonerações de comissionados.

> **Camada condicional — disponibilidade do índice.** Em 30/08/2026 a API do Querido Diário (`api.queridodiario.ok.org.br`) respondeu **404 em todas as rotas** (indisponibilidade; a base é a correta, confirmada no próprio site do índice). Antes de qualquer busca, teste `GET https://api.queridodiario.ok.org.br/cities/{IBGE}`: se não vier **200 com JSON**, declare *"índice de diários indisponível em {data} — atos não pesquisados"* e **pule esta camada**. Nunca leia a indisponibilidade do índice como ausência de atos, e nunca substitua o índice por busca em imprensa ou por outro agregador não oficial. A saúde do índice é acompanhada em [saúde das fontes](/saude-das-fontes).

**Fonte e regra de ouro.** O **Querido Diário** (Open Knowledge Brasil, sociedade civil) é usado **só como camada de descoberta** — para *achar* o ato. A citação canônica é **sempre o Diário Oficial original** (o PDF da edição, que o índice aponta). Nunca "segundo o Querido Diário"; sempre "segundo o DOM de {município} de {data}, edição {n} (PDF oficial: {url})".

**Passo a passo:**
1. **Confirme a cobertura primeiro.** `GET https://api.queridodiario.ok.org.br/cities/{IBGE}` → se `level == 0`, o município **não tem cobertura** — declare a limitação e pare esta camada (não conclua "sem atos"). Guarde `publication_urls[]` (site oficial da imprensa municipal) como a fonte-mãe a citar.
2. **Descubra os atos:** `GET https://api.queridodiario.ok.org.br/gazettes?territory_ids={IBGE}&querystring={termo}&published_since={AAAA-MM-DD}&published_until={AAAA-MM-DD}&number_of_excerpts=3&excerpt_size=500&sort_by=descending_date`. Leia `excerpts[]` para triar relevância.
3. **Cite o original:** de cada resultado relevante, use `url` (**PDF da edição oficial** — a citação primária) e `date`/`edition`. Use `txt_url` só para conferir o trecho, nunca como citação.
4. **Cruze por ato:** um extrato de contrato no DOM que não aparece no PNCP, ou um valor divergente, é **ponto a verificar** (com os dois links), nunca conclusão de fraude.

**Guardrails de busca (o dano se consuma na busca, não só na conclusão):**
- **L11 — Termos fechados.** Só termos de **tipo de ato**: `contrato`, `extrato`, `licitação`, `dispensa`, `inexigibilidade`, `decreto`, `portaria`, `nomeação`, `exoneração`, `aditivo`. **Termo-juízo** (`fraude`, `superfaturamento`, `desvio`, `irregular`, `suspeito`) é recusado **como busca** — o índice devolveria só o que confirma a acusação; a busca já é o veredito.
- **L12 — Fornecedor só para localizar ato já identificado.** Buscar CNPJ/razão social é admissível **apenas** para achar o extrato de um contrato que **já está no extrato via PNCP**. "Quantas vezes a empresa aparece" é contagem orientada a alvo privado — recusa.
- **L13 — Sobrenome não é chave de busca.** Buscar o sobrenome do titular nas nomeações é filtro orientado a parentesco: recusa da busca, não só da conclusão. Parentesco só por ato oficial ou decisão de órgão de controle — e essa camada ([vínculos e integridade](/em-validacao)) ainda não está publicada: aqui, **silêncio**.
- **L14 — Cruzar é por ato, nunca encadear.** Cruzar significa **o mesmo contrato** nas duas fontes (DOM × PNCP), lado a lado, com os dois links. Decreto → dispensa → contrato → exoneração em sequência é a costura vedada (regra 6 do Roteador), mesmo a pedido.
- **L15 — Teor só do PDF.** `excerpts[]` (500 caracteres, OCR) serve para **triar**; qualquer afirmação sobre o que o ato faz exige abrir o PDF da edição. Sem PDF acessível → "teor não conferido".
- **L16 — Nomeação/exoneração de terceiro é fato de estrutura.** Reporte **contagem de atos por período** (N nomeações, N exonerações, com as edições); nunca o ato de uma pessoa específica que não seja agente político. Comissionado que não é agente político é **terceiro privado**: nome só como o Diário publica, sem enriquecimento nem cruzamento. Reclamação de atendimento → ouvidoria/e-SIC ([transformar o dado em ação](/divulgar)).
- **L17 — Chave IBGE obrigatória.** `territory_ids={IBGE}` sempre; conferir `territory_name` no retorno (homônimos de município existem); nunca buscar por nome de cidade.

**Guardrails herdados (inegociáveis):**
- **Índice ≠ fonte.** Sempre citar o Diário original; o índice é o buscador, rotulado como sociedade civil.
- **Vazio ≠ inexistência.** Ausência no índice pode ser município sem cobertura (cerca de 1.000 dos 5.570) ou falha de OCR — nunca leia "não achei" como "não existe" nem como atestado de lisura.
- **Cobertura do índice é idiossincrática por publicador, não por porte (achado de campo).** Não correlacione cobertura com tamanho: validado que uma cidade média teve centenas de edições indexadas e uma capital ~0 (consta em `/cities`, mas sem edições recentes). Sempre rode `gazettes` **sem termo** para confirmar que há edição indexada — estar em `/cities` não basta.
- **Fato ≠ veredito.** Um decreto/contrato/nomeação publicado é fato datado com fonte; qualquer leitura de intenção é inferência rotulada. Nada de recomendação eleitoral.
- **OCR ruidoso:** `querystring` é busca textual sobre texto extraído — pode trazer falso positivo/negativo. Confirme sempre no PDF antes de afirmar.

## Passo 6 — Repasses da União (condicional: requer chave gratuita)

`GET https://api.portaldatransparencia.gov.br/api-de-dados/transferencias?codigoIbge={IBGE}&…` — FPM, SUS, FUNDEB recebidos. **Exige chave de API gratuita** (cadastro por e-mail no Portal da Transparência) — seção condicional: o método nunca exige credencial para o núcleo; se o usuário tiver a chave, enriquece; senão, "não obtido (requer chave da CGU)". A chave é do usuário e fica com ele ([funciona com qualquer IA](/qualquer-ia)). Shape não validado sem chave.

## Passo 7 — Contas julgadas (Tribunal de Contas) — link externo, não dado estruturado

**Não há API nacional padronizada dos Tribunais de Contas** (validado: cada TCE/TCM tem portal próprio). Aponte o portal do Tribunal de Contas competente como caminho de conferência manual das contas do prefeito; não prometa dado estruturado. Contas **julgadas** são decisão da instituição — reporte o link; a conclusão é do Tribunal.

## Passo 8 — Síntese

Estruture: **(1) Ente** (município, UF, código IBGE, CNPJ; prefeito(a) em exercício com a fonte da identificação) · **(2) Execução orçamentária** (receita realizada, despesa paga, por ano, com a coluna de origem) · **(3) Saúde fiscal LRF** (pessoal vs. limite, ou "não declarada") · **(4) Contratos e licitações** (do período, com valores e links do PNCP; janela declarada) · **(4½) Atos no Diário Oficial** (se o município tem cobertura, com o PDF oficial de cada ato citado) · **(5) Repasses** (se chave disponível) · **(6) Contas no Tribunal de Contas** (link externo) · **(7) Lacunas declaradas** — URLs por seção. Um eixo por vez; sem quadro consolidado. Termine com: *"Dados fiscais oficiais (SICONFI/PNCP), consultados em {data}. Este retrato é factual, não avalia mérito de gestão e não constitui recomendação eleitoral."*

## Erros comuns de interpretação (guardrails)

| Leitura ingênua | Realidade |
|---|---|
| "Vou fiscalizar o vereador X por aqui" | Fonte nacional só dá o **agregado** do Legislativo municipal. Vereador individual exige a câmara local — fora deste playbook. |
| "Gastou muito = má gestão" | SICONFI é execução declarada; valor sem contexto de porte/população/função não é juízo — e a causa é multicausal (T13). |
| "Contrato caro = superfaturamento" | PNCP mostra existência e valor. Sobrepreço/fraude é hipótese a verificar no Tribunal de Contas/MP, não conclusão deste método. |
| "Não achei dados = município esconde" | Pode ser inadimplência declaratória (não enviou ao SICONFI) — reporte como fato datado, não acusação. |
| "Filtrei o PNCP por CNPJ e veio 204" | 204 = zero contratos do ente no período (fato datado). O `cnpjOrgao` funciona; 204 não é erro de filtro. |
| "PNCP deu 422 — o CNPJ está errado" | 422 tem **duas causas**: CNPJ malformado **ou** janela > 365 dias. Leia a mensagem; fatie a consulta por ano. |
| "Capital tem poucos contratos no PNCP" | O CNPJ único da prefeitura subconta capitais (gasto em CNPJs de secretarias/autarquias). É o ente central, não o total. |
| "RREO/RGF vieram vazios = município sem dados" | Vazio é inadimplência declaratória (fato). Caia para o DCA anual, que quase sempre existe, e declare a diferença. |
| "Perto do limite da LRF = ilegal" | Dentro do limite é regular; proximidade é ponto a acompanhar. |
| "A cidade piorou na gestão dele" | Comparar gestões (atual × anterior) é comparar titulares — vedado, mesmo como "evolução". Uma gestão, um retrato. |

## Limites conhecidos (declarados)

- O shape de `transferencias` da CGU não foi validado (exige chave).
- O SICONFI `tt/entes` não filtra por ente (lista inteira; filtro no cliente).
- Os `no_anexo` listados são os validados; RREO/RGF/DCA têm outros anexos, a mapear caso a caso.
- Completude do PNCP por porte de município: municípios pequenos publicam menos — declare a janela e o que veio.
- **Cobertura eleitoral:** prefeitos(as) em exercício cumprem mandato 2025–2028, sem eleição municipal no período; a vedação temporal do método (nenhum retrato de candidatura antes de novembro/2026) e a advertência de período eleitoral do Roteador valem integralmente — quem exerce o cargo e disputa outro pleito é retratado **só pelo cargo**, sem qualquer menção eleitoral.

## Encerramento padrão

*"Dados fiscais oficiais (SICONFI/PNCP), consultados em {data}. Este retrato é factual, não avalia mérito de gestão e não constitui recomendação eleitoral."*
