{
 "recurso": "fontes-de-dados",
 "versao": 1,
 "titulo": "APIs públicas para fiscalizar",
 "descricao": "APIs oficiais catalogadas, com uma chamada que funciona e a armadilha de cada uma.",
 "dataDoDado": "2026-09-22",
 "pagina": "https://fiscaliza.bsb.br/fontes-de-dados",
 "licenca": "CC BY 4.0 — cite \"FiscalizaBSB (fiscaliza.bsb.br)\", o recurso e a data de acesso",
 "metodo": "Catálogo das APIs públicas que servem para fiscalizar, verificado ao vivo. Campos: id, nome, orgao, cobre, chave em {nao, sim}, formato, exemplo (uma chamada que funciona, para quem quiser conferir agora), armadilha (o detalhe que faz a chamada falhar ou o resultado enganar), esperado (trecho que precisa aparecer na resposta, para a verificação ser por conteúdo e não só por código HTTP), verificar (URL leve, quando o exemplo é pesado demais para pingar a cada verificação), estado em {responde, exige-chave, instavel, fora-do-ar}, verificadoEm. O grupo 'apis' do npm run validate confere o estado por conteúdo, como já faz com os portais dos mapas institucionais. Nenhuma página consulta estas APIs em tempo de execução: a CSP do site não tem connect-src. O catálogo existe para a pessoa (ou a IA dela) rodar na própria máquina.",
 "dados": {
  "verificadoEm": "2026-09-22",
  "itens": [
   {
    "id": "siconfi",
    "nome": "SICONFI",
    "orgao": "Tesouro Nacional",
    "cobre": "Relatórios fiscais de todos os entes: RREO (execução bimestral), RGF (pessoal e dívida), DCA (balanço anual) e a tabela de entes com código do IBGE, população e CNPJ.",
    "chave": "nao",
    "formato": "JSON",
    "exemplo": "https://apidatalake.tesouro.gov.br/ords/siconfi/tt/rreo?an_exercicio=2025&nr_periodo=6&co_tipo_demonstrativo=RREO&no_anexo=RREO-Anexo%2002&co_esfera=M&id_ente=5212501",
    "armadilha": "O Distrito Federal responde como esfera E, de estado, e não como D, apesar de a própria tabela de entes classificá-lo como D — consultar com co_esfera=D devolve zero linha em todos os anos testados, sem erro. O id_ente é o código do IBGE: sete dígitos para município, dois para estado e para o DF. O nome do anexo vai com espaço codificado.",
    "estado": "responde",
    "verificadoEm": "2026-09-22",
    "esperado": "hasMore"
   },
   {
    "id": "ibge-agregados",
    "nome": "IBGE — agregados (SIDRA)",
    "orgao": "IBGE",
    "cobre": "As tabelas do SIDRA por API: população estimada, PIB municipal, censo. Uma chamada devolve os 5.571 municípios.",
    "chave": "nao",
    "formato": "JSON",
    "exemplo": "https://servicodados.ibge.gov.br/api/v3/agregados/6579/periodos/-1/variaveis/9324?localidades=N6%5Ball%5D",
    "armadilha": "Os colchetes de localidades=N6[all] precisam ir codificados, ou o terminal os interpreta. O período -1 pede o mais recente, e o ano vem no retorno: nunca presuma qual é. A resposta vem comprimida mesmo sem pedir.",
    "estado": "responde",
    "verificadoEm": "2026-09-22",
    "esperado": "localidade",
    "verificar": "https://servicodados.ibge.gov.br/api/v3/agregados/6579/periodos/-1/variaveis/9324?localidades=N6%5B5300108%5D"
   },
   {
    "id": "ibge-localidades",
    "nome": "IBGE — localidades e malhas",
    "orgao": "IBGE",
    "cobre": "Nome, código e hierarquia de municípios, estados e regiões; e a geometria (malha) para desenhar mapas.",
    "chave": "nao",
    "formato": "JSON e GeoJSON",
    "exemplo": "https://servicodados.ibge.gov.br/api/v1/localidades/municipios/5300108",
    "armadilha": "A malha de todos os municípios passa de 3 MB: peça por UF. Município recém-criado entra na lista de localidades antes de entrar na malha — a geometria fica faltando por meses.",
    "estado": "responde",
    "verificadoEm": "2026-09-22",
    "esperado": "Brasília"
   },
   {
    "id": "bcb-sgs",
    "nome": "Banco Central — SGS",
    "orgao": "Banco Central do Brasil",
    "cobre": "Séries temporais econômicas. Para fiscalização importam o IPCA mensal (série 433) e o acumulado em doze meses (13522), que corrigem valores de anos diferentes.",
    "chave": "nao",
    "formato": "JSON e CSV",
    "exemplo": "https://api.bcb.gov.br/dados/serie/bcdata.sgs.433/dados?formato=json",
    "armadilha": "As datas vêm no formato brasileiro e os valores como texto com ponto decimal. Pedir a série inteira sem filtro funciona para o IPCA, mas séries diárias longas estouram o limite do servidor.",
    "estado": "responde",
    "verificadoEm": "2026-09-22",
    "esperado": "valor",
    "verificar": "https://api.bcb.gov.br/dados/serie/bcdata.sgs.433/dados/ultimos/1?formato=json"
   },
   {
    "id": "querido-diario",
    "nome": "Querido Diário",
    "orgao": "Open Knowledge Brasil",
    "cobre": "Diários oficiais municipais com texto buscável, de centenas de municípios. Serve para achar a menção a um contrato, a uma nomeação ou a uma empresa.",
    "chave": "nao",
    "formato": "JSON",
    "exemplo": "https://api.queridodiario.org.br/gazettes?territory_ids=5300108&size=1",
    "armadilha": "O endereço mudou: queridodiario.ok.org.br/api redireciona para api.queridodiario.org.br, e cliente que não segue redirecionamento quebra. O serviço oscila: em 22/09/2026 respondeu 200 e, vinte minutos depois, 503 com \"no available server\" — trate a queda como esperada e tente de novo. A cobertura não é nacional, e município ausente não significa município sem diário. Menção no diário não é fato apurado.",
    "estado": "instavel",
    "verificadoEm": "2026-09-22",
    "esperado": "gazettes"
   },
   {
    "id": "camara",
    "nome": "Dados Abertos da Câmara",
    "orgao": "Câmara dos Deputados",
    "cobre": "Proposições, votações, despesas de gabinete e a estrutura da Casa.",
    "chave": "nao",
    "formato": "JSON e XML",
    "exemplo": "https://dadosabertos.camara.leg.br/api/v2/deputados?itens=1",
    "armadilha": "Paginação obrigatória em quase tudo. Este site não publica nada sobre pessoas: a fonte está aqui pelo dado institucional e orçamentário.",
    "estado": "responde",
    "verificadoEm": "2026-09-22",
    "esperado": "dados"
   },
   {
    "id": "senado",
    "nome": "Dados Abertos do Senado",
    "orgao": "Senado Federal",
    "cobre": "Matérias, votações, comissões e a estrutura da Casa.",
    "chave": "nao",
    "formato": "JSON e XML",
    "exemplo": "https://legis.senado.leg.br/dadosabertos/senador/lista/atual.json",
    "armadilha": "O JSON vem com uma casca de nomes longos herdada do XML; o dado costuma estar três ou quatro níveis abaixo da raiz.",
    "estado": "responde",
    "verificadoEm": "2026-09-22",
    "esperado": "ListaParlamentarEmExercicio"
   },
   {
    "id": "ipeadata",
    "nome": "Ipeadata",
    "orgao": "Ipea",
    "cobre": "Séries macroeconômicas, regionais e sociais, muitas com recorte municipal.",
    "chave": "nao",
    "formato": "OData (JSON)",
    "exemplo": "http://www.ipeadata.gov.br/api/odata4/Metadados",
    "armadilha": "O catálogo de metadados tem mais de 7 MB e leva mais de dez segundos: baixe uma vez e guarde. O endereço é http, não https.",
    "estado": "responde",
    "verificadoEm": "2026-09-22",
    "esperado": "SERCODIGO",
    "verificar": "http://www.ipeadata.gov.br/api/odata4/Metadados?%24top=1"
   },
   {
    "id": "portal-transparencia",
    "nome": "Portal da Transparência",
    "orgao": "Controladoria-Geral da União",
    "cobre": "Despesas federais, convênios, servidores, sanções, benefícios sociais. É a fonte federal mais completa.",
    "chave": "sim",
    "formato": "JSON",
    "exemplo": "https://api.portaldatransparencia.gov.br/api-de-dados/despesas/por-orgao?ano=2025&pagina=1",
    "armadilha": "Sem chave responde 401. O cadastro é gratuito e sai na hora, no próprio portal; a chave vai no cabeçalho chave-api-dados. Há limite de requisições por minuto, menor em horário comercial.",
    "estado": "exige-chave",
    "verificadoEm": "2026-09-22"
   },
   {
    "id": "pncp",
    "nome": "PNCP",
    "orgao": "Governo federal",
    "cobre": "Contratações públicas de todos os entes sob a Lei 14.133/2021: editais, atas e contratos.",
    "chave": "nao",
    "formato": "JSON",
    "exemplo": "https://pncp.gov.br/api/consulta/v1/contratos?dataInicial=20260101&dataFinal=20260930&cnpjOrgao=01169416000109&pagina=1&tamanhoPagina=10",
    "armadilha": "Voltou a responder em 29/10/2026, mas devagar e com limite: a primeira chamada levou 40 a 50 segundos, e chamadas seguidas receberam 429 (excesso de pedidos) — use tempo limite de 60 s, pausa entre pedidos e nova tentativa. Datas em AAAAMMDD (com hífen dá 422), período de no máximo 365 dias, CNPJ só com dígitos, \"pagina\" obrigatório; o CNPJ se chama cnpjOrgao em /contratos e cnpj em /contratacoes, onde a modalidade também é obrigatória.",
    "estado": "instavel",
    "verificadoEm": "2026-10-29"
   },
   {
    "id": "transferegov",
    "nome": "TransfereGov",
    "orgao": "Ministério da Gestão e da Inovação",
    "cobre": "Transferências da União a estados e municípios: convênios e contratos de repasse (discricionárias) e transferências especiais de emendas, com o plano de ação de cada uma.",
    "chave": "nao",
    "formato": "JSON",
    "exemplo": "https://api-publica.transferegov.gestao.gov.br/discricionarias/propostas?cd_identif_proponente=01169416000109&pagina=1&tamanho_da_pagina=50",
    "armadilha": "Há duas gerações de API com dados divergentes: use a nova (api-publica.transferegov.gestao.gov.br). Nela o filtro é valor puro — com \"eq.\", à moda da antiga, a resposta vem vazia sem erro —, e CNPJ com pontuação também volta vazio. Filtrar por código do IBGE traz todo proponente do município, inclusive organizações da sociedade civil; para a prefeitura, filtre pelo CNPJ. Em transferências especiais, ache antes o id do beneficiário. Valores vêm como texto.",
    "estado": "responde",
    "esperado": "total_items",
    "verificadoEm": "2026-10-29"
   },
   {
    "id": "siope",
    "nome": "SIOPE",
    "orgao": "FNDE",
    "cobre": "Aplicação em educação declarada por estados e municípios: percentual em manutenção e desenvolvimento do ensino, Fundeb nos profissionais, receitas e despesas.",
    "chave": "nao",
    "formato": "JSON (OData)",
    "exemplo": "https://www.fnde.gov.br/olinda-ide/servico/DADOS_ABERTOS_SIOPE/versao/v1/odata/Indicadores_Siope(Ano_Consulta=@Ano_Consulta,Num_Peri=@Num_Peri,Sig_UF=@Sig_UF)?@Ano_Consulta=2024&@Num_Peri=6&@Sig_UF='GO'&$filter=COD_MUNI%20eq%20521250&$format=json",
    "armadilha": "O código do município vai com 6 dígitos, sem o dígito verificador (521250, não 5212501): com 7, a resposta vem vazia. Ano, bimestre e UF são obrigatórios, a UF entre aspas simples, e o 6º bimestre é o fechamento do ano. Os valores vêm como texto, e um \"0\" pode ser indicador não calculado — não obtido não é zero.",
    "estado": "responde",
    "esperado": "VAL_INDI",
    "verificadoEm": "2026-10-29"
   },
   {
    "id": "siops",
    "nome": "SIOPS",
    "orgao": "Ministério da Saúde",
    "cobre": "Aplicação em ações e serviços públicos de saúde declarada por estados e municípios: base, valor aplicado e percentual contra o mínimo da LC 141/2012.",
    "chave": "nao",
    "formato": "HTML (formulário)",
    "exemplo": "http://siops.datasus.gov.br/rel_LRF.php",
    "armadilha": "Não há API: o demonstrativo sai de um formulário que só responde a POST, em http (o https redireciona e o POST vira GET, sem dados). O código do bimestre não é sequencial (1º = 12, 2º = 14, 3º = 1, 4º = 18, 5º = 20, 6º = 2), o município vai com 6 dígitos e a UF pelo código numérico. A página vem em Latin-1, com vírgula decimal.",
    "estado": "responde",
    "esperado": "Demonstrativo da Lei de Responsabilidade Fiscal",
    "verificadoEm": "2026-10-29"
   }
  ]
 }
}