Dados B3 › Transparência
Transparência
Transparência — como você confere os números você mesmo
Versão do dado 2026-11-03-ponte-b3-codigo-de-fundo · página gerada em 2026-11-07 01:13 UTC. Se isto não bater com o /saude, você está lendo uma cópia em cache.
O que é conferido, antes de cada publicação — 1238 testes automáticos, coletados ao vivo
310 são invariantes de DADO (o número fecha?) e 131 são de produto — gate de acesso, navegação, idioma, conector de IA. Chamar os 1238 de 'invariantes' seria inflar: a divisão é conferível na própria lista. Não é uma seleção à mão dos melhores exemplos: cada teste abaixo foi achado agora, introspectando os arquivos de teste de verdade, do mesmo jeito que pytest --collect-only acharia. Agrupados pelo que protegem, não pelo arquivo onde moram.
Nível 1 — Integridade: o dado fecha? (305)
I-N100— Quando há reenvio capturado, a página mostra competência, campo (com o nosso rótulo), antes, depois, diferença e as versões; quando não há, diz com todas as letras que a CVM publica só a versão vigente e que não há número de antes — nunca tabela vazia calada.I-N101— Em /comparar/A/B cada indicador sai do dado da comparação no formato da casa (percentual ×100 com uma casa, múltiplo com duas e "x", F-Score "/9"), FCF yield em %, o ano do múltiplo é um só quando coincide e "A × B" quando não; a ficha traz nome e setor; conta que não existe para banco diz de quem é; o JSON-LD lista as duas nas posições 1 e 2. ★ POR QUE (27/09/2026): 23 de 38 pontos da comparação sobreviveram à mutação — a página renderizava qualquer número.I-N102— /vigia/{T}: para companhia ou fundo, os eventos do papel — os MESMOS do vigia, filtrados pelo ticker —, com filtro por tipo, o formulário de acompanhar (só companhia) e links para a página do papel, o vigia geral e o JSON; papel sem evento é noindex,follow; desconhecido é 404; fora do sitemap.I-N103— No banco real, a companhia que só publica o individual e tem reapresentação com um lado zerado no arquivo da CVM: a página de reapresentações diz "individual — companhia não consolida" em cada linha e "sem valor no arquivo" onde o lado veio zerado, nunca "R$ 0"; o JSON da mesma URL (Accept) e o de /empresas/{T}/reapresentacoes trazem a agregação e o lado sem valor, linha a linha igual à tabela; a página da companhia também não escreve 0,0 no lugar do lado zerado.I-N104— No banco real: as comparações curadas por setor (as três mais líquidas de cada setor) nunca passam do teto da configuração nem de 60; cada uma abre em PT e EN com o título "X × Y × Z: margem, ROIC, dívida, P/L (ano)", a tabela com as três lado a lado e o link do veredito de cada uma; ficam no sitemap com lastmod (o índice também), SEM noindex, e o índice lista todas; slug desconhecido é 404; /comparar/A/B continua noindex; a página de cada companhia da trinca liga para "comparar com o setor".I-N105— Para 30 companhias, 10 FIIs, 5 ETFs e todas as páginas de fato, o HTML inglês tem os MESMOS números de dado do português (extraídos por regex e normalizados: 1.234,5 = 1,234.5; datas em ISO), as mesmas âncoras, os mesmos links internos e o mesmo número de linhas em cada tabela; a diferença é só de texto.I-N106— Em toda página HTML do sitemap sem parâmetro e numa amostra das com parâmetro (companhias, FIIs, ETFs, guias, metodologias), em PT e EN: meta viewport; todo <img> com alt; todo campo de formulário com rótulo (label, label for ou aria-label); toda tabela dentro de .I-N107— Toda página HTML pública do sitemap (as de papel por amostra) declara exatamente três `<link rel="alternate" hreflang>`: pt-BR = a própria URL, en = a URL com `?lang=en`, x-default = pt-BR — e a versão `?lang=en` existe (`<html lang="en">`) e declara os MESMOS três.I-N108— Um só bloco JSON-LD, JSON de verdade, no `<head>`.I-N109— Cada `<url>` do sitemap de rota com versão EN traz os três `xhtml:link` (pt-BR, en, x-default) iguais aos do `<head>` da página; rota sem versão EN (/docs) não traz nenhum; o namespace xhtml está declarado; o XML é válido.I-N110— Toda resposta traz HSTS, nosniff, Referrer-Policy, Permissions-Policy e CSP (de `seguranca_config.I-N111— Rastreador da lista (configuração) recebe 403 em qualquer rota, antes de qualquer consulta; navegador, Googlebot, Bingbot e agentes de IA a pedido passam; o robots.I-N114— /cobertura, pedida como página (Accept text/html), mostra por companhia os exercícios (da primeira à última DFP entregue) e os campos centrais que existem, existem com ressalva ou faltam; o total por exercício; e cada falta com o motivo — da fonte ou nosso —, nunca "não temos" sem dizer por quê.I-N115— As três gravações do analytics (visita, uso de chave, degustação) rodam num fio do pool, nunca no laço de eventos da aplicação.I-N116— O erro do build mostra a primeira linha "E " de CADA teste reprovado, na ordem em que aparecem.I-N117— O título de busca das páginas de FII e de ETF traz o código, o nome como se busca (sem "FUNDO DE INVESTIMENTO IMOBILIÁRIO", "CLASSE DE ÍNDICE…", "RESPONSABILIDADE LIMITADA") e, no FII, o DY 12m e o P/VP quando o número não tem ressalva; e cabe no que o Google mostra.I-N118— Cada companhia tem três respostas (/acoes/X/dividendos, /lucro, /divida; banco e seguradora sem dívida): a frase começa pelo código e pelo nome (sem artigo de gênero), traz número e ano, nunca chama prejuízo de "lucro -R$", nunca transforma provento desconhecido em zero, conta o ano corrente só nos 12 meses; a página tem "confira você mesmo", o FAQPage, a versão .I-N119— O arquivo-chave do IndexNow responde 200 em texto simples com a chave e só com ela (e só a rota exata: outro nome .I-N120— A página de resposta (/acoes/X/dividendos, /lucro, /divida) traz UM bloco JSON-LD válido com o FAQPage cuja resposta é a MESMA frase do primeiro parágrafo visível (mesmos números), `dateModified` = data do dado mais recente usado (nunca futura), `isBasedOn` com a fonte (B3 ou CVM) e a URL canônica da língua pedida; um Dataset só quando há tabela.I-N121— /privacidade e /termos (PT), com ?lang=en e os endereços curtos /privacy e /terms (EN), respondem 200 sem cookie, nomeiam o operador com o CNPJ, o contato e a data; estão no sitemap; o rodapé de toda página liga as duas.I-N121b— A limpeza da /privacidade existe de verdade, em bancos sintéticos: no analytics, a linha de 366 dias sai e a de 364 fica, nas quatro tabelas e em lotes; o pedido de aviso cancelado há 366 dias sai com o e-mail (e os envios dele), o de 364 e o ativo ficam; a linha de campanha com mais de 365 dias perde o e-mail e guarda o resumo, e quem a recebeu continua sem receber de novo (campanha e lembrete).I-N122— O site tem ícone: /favicon.I-N123— `pl_max`/`pl_min` (anual) e `pl_ttm_max`/`pl_ttm_min` (12 meses) no screener, com `as_of`: o P/L é o do documento MAIS RECENTE já recebido na data, com preço de um pregão que já existia nela.I-N124— A página /buscar, com filtro de P/L, diz em frase curta quantas empresas ficaram de fora e por quê (agrupado), e quais entraram com ressalva.I-N150— `/indices/{codigo}` é uma PÁGINA para cada índice que o hub lista: o último fechamento com a data, a variação no dia, no mês, no ano e em 12 meses (cada uma sobre a base que a página diz), o gráfico em SVG, o desempenho (os MESMOS números de `/indices/{codigo}/desempenho`), os links para os JSON, o "Como citar" e um bloco JSON-LD (Dataset, FAQPage com a MESMA frase da página, trilha).I-N151— O portal de apps do ChatGPT confere o domínio do conector lendo /.I-N160— O guia das IAs (llms.I-N170— (1) A página de ATIVO individual (/acoes/X, /fiis/X, /etfs/X, /bdrs/X e subpáginas como /reapresentacoes e /dividendos) na versão `?lang=en` abre normalmente mas traz exatamente um uma só meta robots com noindex,follow (a regra mora em sinais_busca.I-N180— A primeira frase da página da AÇÃO responde "quanto pagou?" com número e data, gerada do banco: (1) o valor do ano é a soma das linhas daquele ano na TABELA DE PROVENTOS da própria página (?ano=); (2) a classe não se soma; (3) vale para a lista que as IAs mais abrem; (4) EN tem a mesma frase com os mesmos números; (5) a /dividendos abre com a mesma frase.I-N181— A primeira frase da página do FII traz o rendimento dos 12 meses e o DY 12m com as datas, da MESMA linha do cartão "DY 12m"; histórico parcial vira soma parcial SEM DY anualizado; DY extremo fica de fora com a ressalva dita.I-N182— Sem dado a frase CALA ("" — nada de R$ 0,00 que pareça medida); só a parte que existe sai; o gerador e a página de respostas não têm SQL (a camada de leitura é a única porta).I-N183— Gerador, não lista: percorre ações e FIIs da base — a página abre 200, e quando a frase existe ela não tem NaN/None/R$ 0,00.I-N184— Na página da AÇÃO a frase de resposta direta e o cartão "DY 12m" do bloco de valuation mostram o MESMO percentual e o MESMO R$/ação (a frase usa a conta do cartão, não outra); quando há data-com já anunciada, a soma a inclui e a frase diz quanto é e até quando.I-N190— Nas três listas com data (/listas/maiores-pagadoras-de-dividendos-AAAA, /listas/acoes-pl-abaixo-de-10, /listas/fiis-maior-dy-12-meses), em PT e EN, a PRIMEIRA frase traz o ticker e o número da PRIMEIRA linha da tabela (DY ou P/L, formatado igual), a tabela vem em ordem (DY do maior para o menor; P/L do menor para o maior), e todo número da página sai do mesmo cálculo da fonte: DY dos FIIs = fii_yield no ranking do hub /fiis, P/L = o do /buscar.I-N191— Em /listas/maiores-pagadoras-de-dividendos-AAAA cada linha é UMA classe (a do código principal: ON, PN, PNA, PNB, UNT) e o provento de 12 meses é a soma dos proventos SÓ dessa classe com data-com na janela, conferida direto na tabela `dividendo`; o DY é essa soma sobre o fechamento do último pregão; o mesmo ticker não aparece duas vezes; só entra ação com volume médio de 63 pregões >= o mínimo da home.I-N192— Cada lista mostra a DATA do dado (a do último pregão da base, ou a do preço do FII) na primeira frase e em "Dados de", explica o critério numa linha ("Critério:"), traz o bloco "Como citar" com a URL canônica e a data, termina com "não é recomendação", e declara UM bloco JSON-LD (lista de objetos, I-N35) com ItemList (nº de itens = linhas da tabela, primeiro item = primeira linha) e Dataset (`dateModified` = a data da página).I-N193— As três listas estão no /sitemap.I-N194— As três listas respondem 200 em PT e EN (`<html lang>` certo), com um <h1>, o seletor de idioma, o trio hreflang (EN indexável: é página de lista, não de ativo), sem problemas de acessibilidade e com cada ticker da tabela ligando para a página dele (/acoes/X ou /fiis/X), que também responde 200. ATAQUE: EN em 404; tabela sem link; h1 duplicado; EN com noindex.I-N200— UM mapa ticker -> classe exata (3 ON, 4 PN, 5 PNA, 6 PNB, 7 PNC, 8 PND, 11 UNT), o vocabulário de `dividendo.I-N201— Ação PNA/PNB/PNC (final 5-8) com provento nos 12 meses mostra o DY 12m e a frase, e o valor é a soma da tabela `dividendo` da CLASSE EXATA do ticker (nunca PN, nunca outra classe).I-N202— O ranking de maiores DY da home e o das maiores pagadoras (`_ranking_dy`) enxergam as ações de final 5-8 pela classe exata: uma PNB principal com provento na janela entra, e o provento de outra classe não conta.I-N20— Página que usa a moldura de FATO está em PAGINAS_DE_FATO.I-N210— O cartão /cartao/{ticker}/{tipo}.I-N211— O cartão sai com ETag e Last-Modified ligados à versão do dado e cache longo; `If-None-Match` devolve 304; ticker ou tipo inválido (e fundo, que não tem cartão) dá 404 limpo, sem cartão vazio.I-N212— A página /cartao/{ticker} (PT e EN) mostra a prévia de cada cartão e o código em <textarea readonly> (HTML com utm de embed, Markdown, BBCode; só lucro e ROE), sem JavaScript, `noindex,follow` e fora do sitemap; a página da ação leva o link "Embutir este quadro".I-N213— Cada pedido de /cartao/*.I-N21— Todo caminho de PAGINAS_DE_FATO responde 200. O par do I-N20. Sem ele a lista pode acumular caminho de página removida, e o painel passaria a publicar uma linha eternamente zerada — um zero que não significa "ninguém acessou", significa "isso não existe mais".I-N220— /empresas abre a página de vendas do Plano Empresarial em PT e EN para quem pede HTML, traz a frase do CNPJ, a primeira frase com o número de companhias do banco e o formulário POST sem JavaScript; quem pede `*/*` (o pacote Python, curl) continua recebendo a lista de companhias em JSON; a página está no sitemap, no rodapé e no llms.I-N221— Os preços da página são os aprovados em 18/10/2026 (R$ 490/mês ou R$ 4.900/ano; R$ 1.290/mês ou R$ 12.900/ano; 25% de desconto no 1º ano para plataformas de análise; sob medida; pagamento adiantado), nas duas línguas, e cada um dos exemplos de código (Python, Excel/Power Query, curl) chama uma rota que o app tem.I-N222— O POST /empresas grava o pedido de teste numa tabela própria do arquivo persistente (não no b3.sqlite), responde "Recebemos; respondemos em até 1 dia útil" sem repetir o e-mail, e NÃO grava: campo-isca preenchido, User-Agent de rastreador, e-mail de provedor pessoal, CNPJ que não fecha, falta de aceite, uso fora da lista.I-N223— O /admin/stats traz o bloco `pedidos_teste_empresa` (contagem e os últimos 10) e NUNCA o e-mail inteiro nem o nome: só `m***@dominio`.I-N224— A política de privacidade (PT e EN) cita o formulário de /empresas, o que ele guarda e o prazo em dias que o código aplica (`DIAS_GUARDA`), e as colunas da tabela do pedido são exatamente as que o texto descreve.I-N225— /privacidade/apagar (PT e EN) diz o que guardamos, por quê, por quanto tempo, como apagar, o que sai e o que fica (cobranças no Stripe, resumo do e-mail), traz o encarregado ("Encarregado pelo tratamento de dados pessoais", Valth Guimarães, contato@dadosb3.com) e o formulário; os prazos são os que o código aplica; a política de privacidade aponta para a página e traz o mesmo encarregado; a página não manda cookie.I-N226— docs/LGPD_INVENTARIO.I-N22— `/acoes/TICKER` responde 200 SEM chave, e está no sitemap.I-N23— O índice de `/acoes` e o sitemap cobrem as mesmas companhias.I-N240— Quem pede ao host antigo dados-b3.onrender.I-N241— No host antigo ficam SEM redirect: /mcp, /mcp/, /mcp/<qualquer>, /saude, /webhook/stripe, /.I-N242— O host normal (dadosb3.com) e o host de teste (testserver) nunca ganham 301; um POST ao host antigo fora da lista passa como está; REDIRECT_HOST_ANTIGO=0 desliga o redirect.I-N243— O middleware do redirect é registrado DEPOIS do `_registrar_visita`, ou seja, fica mais de fora e o 301 nunca chega ao registro de visita (no Starlette, o último registrado é o mais externo).I-N24— Número suprimido aparece com o motivo, não em branco.I-N250— Nenhuma página renderizada (/termos, /metodologia, /info, /conector, em PT e EN) diz que o COTAHIST é de "distribuição livre" nem cita o item 7.9 da política da B3; /termos declara que os dados da B3 dependem de licença para uso comercial e que guardar ou redistribuir a base exige o Plano Empresarial.I-N25— `/fiis/TICKER` responde 200 em HTML SEM chave, e está no sitemap.I-N260— O logger `uvicorn.I-N261— Se o provedor recusa (ou não existe) o envio de uma mensagem `sigiloso=True`, a linha de `correio_pendente.I-N262— A guarda diária (`retencao.I-N263— A guarda diária apaga de `envio_semanal` (semana, e-mail, estado) a linha de mais de 365 dias: ela só serve para não mandar o aviso duas vezes na mesma semana.I-N26— O índice do hub `/fiis` e o sitemap cobrem os mesmos fundos.I-N27— P/VP com ressalva aparece com a ressalva, não limpo.I-N28— Sem chave, `/fiis/TICKER` devolve a PÁGINA com qualquer Accept.I-N290— `analytics.I-N291— O middleware de visitas grava todo 5xx, também de caminho FORA da lista de medição e de visitante que não é IA (antes só a IA tinha rastro), e a exceção sem tratador conta como 500 e segue para o tratador padrão.I-N292— Depois da troca da base (atualização diária ou base estacionada) o servidor monta o sitemap uma vez, na thread da troca, em vez de deixar o primeiro visitante (o Googlebot) pagar a montagem fria.I-N29— A página e o JSON da amostra trazem os mesmos casos.I-N300— Cada provento da rota REST e da ferramenta `dividendos` traz `parcela` e `data_pagamento` (campos ACRESCENTADOS; nenhum campo antigo sai).I-N301— `dividend_yield_12m` ganha `ano_corrente_ate_hoje` e `ano_anterior_fechado` (R$ por ação, pela data-com, classe do ticker, o mesmo critério do total de 12 meses), conferidos aqui contra a soma da lista `proventos`.I-N302— O veredito da WEGE3 (JSON e página) diz de que dia é o preço do P/L e do P/VP: a `frase_topo` cita a data do preço do balanço (`itens.I-N30— Sitemap e `noindex` são ordens opostas; nada pode ter as duas.I-N31— A tabela do buscador sai montada do servidor, sem JavaScript.I-N32— Cada filtro corta mais, e dá para tirar UM sem perder os outros.I-N33— Quem não tem o número vai para o FIM, nas duas direções.I-N34— Cada empresa aponta para as outras do setor; cada fundo, para os outros do segmento.I-N35— O JSON-LD (schema.I-N360— /agenda-de-balancos e /data-com-da-semana, em PT e EN: a PRIMEIRA frase traz número e data (no formato do idioma), a página tem a data do dado, o critério, o bloco "Como citar" com a URL canônica, um JSON-LD (ItemList e Dataset) e NENHUM <script> que não seja JSON-LD (sem JavaScript); a frase da agenda de balanços diz que a data futura é ESTIMADA e que não é calendário oficial.I-N361— Com `Accept: application/json` a MESMA URL devolve o JSON (`Vary: Accept`); sem Accept explícito (e com `*/*`) devolve a página.I-N362— Cada tabela de /agenda-de-balancos está em ordem DECRESCENTE de valor de mercado (o do bloco "Tamanho e valuation" da página da companhia: `pagina_empresa.I-N363— Em /agenda-de-balancos (PT e EN) e no JSON, TODA linha com data depois de 'hoje' é 'Estimada' (Estimated), traz a data de entrega do ano passado de que sai (364 dias antes, mesmo dia da semana) e nunca 'Entregue'; toda linha 'Entregue' tem data até hoje e até o último dia que a base viu; as datas estimadas só existem para companhia que NÃO entregou este ano.I-N364— /agenda-de-balancos e /data-com-da-semana têm os MESMOS tickers, na mesma ordem, e os mesmos números (valores de mercado, valores por ação) em PT e EN; só o texto e o formato da data mudam; a primeira frase inglesa não tem palavra portuguesa e a portuguesa não tem a inglesa; cada página aponta para a outra (alternância de idioma).I-N365— Toda linha de /data-com-da-semana (data-com, código, valor por ação ou cota) e toda data de pagamento dela estão na agenda da /hoje (`agenda.I-N366— /agenda-de-balancos e /data-com-da-semana estão no sitemap (com lastmod), na seção de listas com data do llms.I-N367— Numa base mínima montada à mão: quem entregou na semana vai para 'entregue' (data real da primeira versão, mesmo com reenvio depois); quem entregou o documento do ano passado nesta semana e não entregou o deste ano vai para 'estimada' com a data +364 dias; quem já entregou este ano ANTES da semana não é estimado; a semana passada nunca estima; o período é o último fim de trimestre antes da semana (DFP em dezembro, ITR nos outros); semana sem nada devolve zeros e uma frase com número e data.I-N368— A home v3 (PT e EN) não tem JavaScript além do JSON-LD, e cada bloco de mercado traz a DATA do dado (o pulso em cada cartão; altas e quedas, as três abas e a agenda no cabeçalho do bloco).I-N369— O que a home mostra é o que a base guarda: o último valor e a variação do dia de Ibovespa, IFIX e dólar saem de `indice_preco`/`cambio` (último e penúltimo pregão), a meta Selic de `selic_meta`, e as 5 altas e 5 quedas são as ações líquidas (≥ R$ 5 mi) do último pregão, sem evento societário, com o fechamento como negociado.I-N36— O /sobre nomeia quem faz o site, em PT e em EN.I-N370— A TRAVA: o dado de um bloco com mais de 3 pregões de atraso (contra o último pregão da base) ou faltando NÃO aparece; no lugar vem "Dado em atualização".I-N371— Todo link interno da home (PT e EN) responde 200 (ou o redirecionamento que ele promete; só /dump, a porta com chave, responde 401 com a página que explica), o campo de e-mail envia para a rota que existe, e as seis ferramentas da grade abrem.I-N372— Paridade PT/EN da home: os mesmos ids, os mesmos links (só muda o ?lang=en), o mesmo número de cartões, linhas e datas; o inglês declara lang="en", traz o preço em dólar e não vaza as frases de interface em português.I-N373— Cada par texto/fundo desenhado pela home v3 (V3_PARES, em dados_b3/estilo.I-N374— O HTML da home (PT e EN) pesa menos que o teto medido.I-N375— O /saude traz o bloco `home`: o último pregão da base, o limite (3 pregões) e, para cada bloco da home (cobertura, altas e quedas, ações, FIIs, ETFs, agenda, CVM, índice e os quatro do pulso), a data, o atraso em pregões e o estado ok/atrasado; `atrasados` lista os que passaram da trava.I-N376— LICENÇA B3: preço, índice e provento só aparecem como tabela/gráfico informativo.I-N377— "A semana na bolsa" mostra o fechamento do último pregão da semana FECHADA contra o da semana anterior; o termômetro (IBOV, IDIV, IFIX, SMLL) é a variação de `indice_preco` entre as duas datas; o placar conta as ações líquidas (média de 63 pregões ≥ R$ 5 mi, código principal, sem evento societário na semana) que subiram, caíram e ficaram iguais; as 5 altas e 5 quedas são as do mesmo universo.I-N378— Cada frase do "Você sabia?" é uma REGRA sobre a base (índice que virou de direção; maior sequência de pregões seguidos de uma ação líquida; quantas ações líquidas com P/L entre 0 e 10; maior DY 12m de FII com 5.000 cotistas ou mais; maior volume da semana), tem número, data e fonte, e o número confere por SQL independente.I-N379— A TRAVA dos blocos novos, numa base montada à mão.I-N37— `/hoje` abre com qualquer Accept, está no sitemap e na lista do painel, e diz a janela e até onde cada dado vai.I-N380— A linha do tempo da CVM só lê o que a base já guarda: `comunicado` (Fato Relevante, Comunicado ao Mercado, Aviso aos Acionistas, do IPE da CVM) e `documento` (DFP/ITR; versão > 1 = reapresentação).I-N381— Todo link da semana na bolsa e da linha do tempo (PT e EN) responde 200: índices (/indices/IBOV.I-N382— Paridade PT/EN da semana e da linha do tempo: o mesmo número de índices, quadrados, altas e quedas, frases do "Você sabia?", dias e itens da linha do tempo; as frases de interface novas não vazam em português na página inglesa; a âncora "A semana" existe nos dois.I-N383— Os pares de texto/fundo que a semana e a linha do tempo desenham (texto e cinza sobre âmbar claro, título sobre cartão, etiquetas por tipo de documento) estão em V3_PARES e passam de 4,5 nos dois modos (I-N373 calcula); o CSS novo só usa cor por token (nenhum #hex, rgb() ou nome de cor solto); a cor nunca é o único sinal: toda variação leva seta e sinal, e o placar tem legenda com número.I-N384— O peso dos blocos novos: a semana inteira (placar com um <i> vazio por ação) abaixo de 12 KB e a linha do tempo abaixo de 5 KB, em PT e EN; nenhum <svg> novo (barras e quadrados são CSS); a home toda segue no teto de I-N374 (130 KB desde a fase 3).I-N385— O bloco `home` do /saude traz `semana`, `semana_indices` e `cvm_linha` com data, atraso em pregões e estado, e `limites_por_bloco` (semana 5, índices da semana 5, CVM 10) — o MESMO estado que decide o que a home mostra: 'ok' no /saude aparece com número na home, 'atrasado' aparece como aviso.I-N386— O mapa de calor mostra as ações líquidas (média de 63 pregões ≥ R$ 5 mi, código principal) do último pregão, no máximo 60 (as de maior volume médio), agrupadas pela ATIVIDADE do cadastro da CVM (a mesma do /comparar/setor; a holding entra na atividade-fim, atividade com menos de 2 ações ou sem atividade vai para "Outros", sempre o último grupo), sem papel com evento societário entre os dois pregões; cada célula é link para a ficha, escreve a variação do fechamento contra o pregão anterior e tem a cor da faixa do MESMO número arredondado; o title traz a variação (a fase 5 trocou o fechamento pelos três números); cada setor diz quantas e a mediana.I-N387— A TRAVA dos blocos da fase 3, numa base montada à mão.I-N388— O exemplo da home (12 meses; o papel do dia vem do rodízio, ver I-N397) é a linha de 1 ano da página /quanto-rendeu/{papel do dia}: os mesmos R$ só com o preço e com os proventos reinvestidos, as mesmas datas; sem evento societário na janela, o "só preço" confere com fechamento ÷ fechamento por SQL.I-N389— A grade de ferramentas (PT e EN): oito cartões (as calculadoras de DI e de juros compostos entraram em 30/10/2026); cada descrição começa pelo que a pessoa FAZ (verbo: Veja, Filtre, Digite, Abra / See, Filter, Type, Open), sem adjetivo de venda nem recomendação; pelo menos três usam PETR4 como exemplo; cada link responde 200; e o que o cartão promete está na página: os horizontes 1, 3, 5 e 10 anos no quanto rendeu, PETR4 na comparação de petróleo e gás, P/L e ROE no buscador, valor, peso e proventos a receber na carteira, os seis números do veredito nas small caps, Piotroski e dividendos nos rankings.I-N38— O total de cada seção da `/hoje` é o total do banco na mesma janela; seção vazia diz que está vazia.I-N390— Os links dos blocos de mercado e de ferramentas levam `?h=<bloco>` com o nome do PRÓPRIO bloco (lista fechada `analytics.I-N391— Cada clique de gente num bloco da home conta em `home_cliques` do /admin/stats, por bloco, em 7 e 30 dias: pela marca `?h=<bloco>` ou, sem marca, pelo Referer da home ('outros').I-N392— Paridade PT/EN do mapa, do quanto rendeu e das ferramentas: as mesmas células na mesma ordem e com a mesma cor, os mesmos setores (traduzidos no inglês), os mesmos links (só muda o idioma), o mesmo número de cartões; o número no inglês usa ponto decimal; nenhuma frase de interface em português vaza no inglês; as âncoras #mapa e #rendeu existem nos dois.I-N393— As sete faixas do mapa (texto sobre cada cor) e a faixa do quanto rendeu estão em V3_PARES e passam de 4,5 para 1 nos dois modos (calculado aqui também); o CSS novo só usa cor por token; a cor nunca é o único sinal: toda célula escreve o número com sinal (ou 0,0%) e a legenda dá o intervalo de cada cor em texto; no celular o mapa não alarga a página (grade com min(100%,…), célula de 68 px que quebra linha, nada de largura fixa acima de 340 px).I-N394— O bloco `home` do /saude traz `mapa` e `rendeu` com data, atraso em pregões e estado (régua diária de 3 pregões) — o MESMO estado que decide a home: 'ok' aparece com células/números, 'atrasado' com o aviso.I-N395— O peso dos blocos da fase 3: o mapa inteiro abaixo de 21,5 KB (10 KB nas fases 3 e 4; a fase 5 pôs três números, o title e o aria-label em cada uma das até 60 células: ~20,3 KB; no máximo 60 células, o estilo no CSS e não em cada célula), o quanto rendeu abaixo de 3,5 KB (2,5 KB na fase 3; a fase 4 acrescentou a frase da regra do rodízio), sem <svg> e sem style inline, em PT e EN; a home toda segue no teto de I-N374 (130 KB).I-N396— Numa base montada à mão com a ficha da CVM: a holding de setor-fim ("Emp.I-N397— O papel do exemplo sai de uma REGRA: as 6 ações de maior volume médio (63 pregões até o último pregão, código principal; empate pela ordem do código), em ordem, e a posição é o dia do ano do último pregão módulo 6. Refeito aqui por SQL próprio na base real.I-N398— O bloco "Fluxo estrangeiro" da home mostra os últimos 24 meses da tabela `fluxo_estrangeiro` (SQL independente), o último mês (líquido, o que entrou e o que saiu) e o acumulado de 12 meses com sinal, iguais ao JSON /fluxo-estrangeiro e ao cartão da página /fluxo-estrangeiro/grafico (a MESMA conta e o MESMO desenho).I-N399— A corrida da home sai de `indice_setorial` (SQL independente): janela das 261 últimas semanas (a de 5 anos do /setores), os 5 setores de maior retorno acumulado, os 3 de menor e o índice de mercado — 9 linhas, no máximo 10 —, cada um com o retorno escrito e com sinal, igual à coluna "5 anos" do /setores.I-N39— `/hoje` devolve JSON só a quem pede `application/json` EXPLICITAMENTE, e continua devolvendo a PÁGINA para todo o resto — e os números do JSON são os mesmos do banco.I-N400— A TRAVA dos dois gráficos, numa base montada à mão (último pregão 28/10/2026).I-N401— Paridade PT/EN dos dois gráficos: as mesmas barras, as mesmas linhas, os mesmos itens na mesma ordem (nomes dos setores traduzidos), os mesmos links (só muda o idioma), os mesmos ids; o número do inglês usa vírgula de milhar e ponto decimal; nenhuma frase de interface em português vaza no inglês; a barra de âncoras tem #corrida e #fluxo nos dois, na ordem pulso → altas e quedas → mapa → semana → corrida → fluxo → o resto; cada link dos blocos responde 200 (e o que leva ?h= devolve a mesma página sem ele).I-N402— As oito cores das linhas da corrida estão em V3_PARES (sobre o cartão e sobre o fundo) e passam de 4,5 para 1 nos dois modos (calculado aqui também), assim como as barras do fluxo (--pos e --coral sobre o cartão); o CSS novo só usa cor por token (nada de hexadecimal, rgb ou nome de cor) e nenhuma largura fixa acima de 340 px; o desenho não leva cor inline (`stroke=`/`fill=` só por classe); a cor NUNCA é o único sinal: o gráfico tem role="img" com aria-label que escreve os números-chave, a corrida tem a lista com o retorno com sinal e linhas tracejadas por classe, o fluxo tem o líquido e o acumulado escritos com sinal, e a barra de saída fica abaixo da linha do zero (ver I-N398).I-N403— O peso da fase 4: a corrida inteira abaixo de 10 KB (no máximo 9 caminhos de 70 pontos com coordenadas inteiras, a cor por classe de CSS), o fluxo abaixo de 5 KB (24 barras por classe), em PT e EN; a home toda abaixo do teto de I-N374 (150 KB e 34 KB comprimidos, o alvo do dono para a fase 4); os dois gráficos não ganham JavaScript.I-N404— O bloco `home` do /saude traz `corrida` (data, atraso em pregões, estado) e `fluxo` (competência, atraso em MESES, estado) — o MESMO estado que decide a home — e `limites_em_meses`; os blocos `corrida` e `fluxo` estão na lista fechada de cliques (`analytics.I-N405— Só as `/quanto-rendeu/{T}` de papéis LÍQUIDOS ficam no sitemap (ação: média de 63 pregões >= R$ 5 mi/dia; FII: >= 5.000 cotistas; ETF: média de 60 pregões >= R$ 1 mi/dia, as réguas que o site já usa); um papel líquido entra, um ilíquido sai.I-N406— A régua do sitemap do quanto rendeu é a das constantes do site (nenhum número novo): 63 pregões e `LIQUIDEZ_MIN_HOME` para ação, `COTISTAS_MIN` para FII, `LIQUIDEZ_MIN` para ETF; `_enxugar_quanto_rendeu` tira só o que é `/quanto-rendeu/X` fora do conjunto, mantém o resto na ordem e, se a conta falhar, devolve a lista como veio.I-N407— TODA `/acoes/X/reapresentacoes` e `/fiis/X/reapresentacoes` leva `<meta name=robots noindex,follow>` (com e sem reapresentação, como /comparar e /vigia), continua 200, mantém os links internos (a página do ativo liga para ela e ela liga de volta), nenhuma está no sitemap, e o JSON pedido por `Accept` segue igual.I-N408— `X-Robots-Tag: noindex` em toda resposta JSON/CSV (/saude, /fiis/X/desempenho, /empresas/X/veredito, o JSON de uma página pedido por Accept, o CSV do /buscar) e em NENHUMA destas: página HTML, robots.I-N409— `XRobotsNoindexNosDados` (ASGI puro) soma `X-Robots-Tag: noindex` só quando o `Content-Type` é JSON (inclui `+json`), NDJSON ou CSV e o caminho não é `/mcp` nem `/.I-N40— `/metodologia` devolve JSON a quem pede, com o título de cada página, e continua servindo a página para todo o resto.I-N410— A seção "LISTAS COM DATA (aberto, SEM CHAVE)" do /llms.I-N414— O quadro "Fluxo diário dos ETFs" da home bate com um SQL próprio, refeito aqui sem importar o módulo: o dia é o último com informe de MAIS DA METADE dos ETFs líquidos (média de 60 pregões de etf_preco >= R$ 1 mi, a régua de pagina_etf.I-N415— Numa base montada à mão (5 ETFs líquidos e 1 ilíquido): (1) o dia é o último com informe de MAIS DA METADE dos líquidos (2 de 5 = 40% não vale; num fundo de 4 ETFs, 2 de 4 = exatamente a metade também não vale e 3 de 4 vale); (2) ETF sem captação e resgate no dia fica de fora e é CONTADO, nunca vira zero ("1 ETF líquido não informou"); (3) a linha com resgate maior que o patrimônio do próprio fundo é descartada, contada e nomeada; (4) o ilíquido nunca entra; (5) total do dia = soma dos líquidos válidos (+R$ 55,0 mi) e a soma dos 5 últimos dias com cobertura (+R$ 79,0 mi); (6) a TRAVA: informe até 25 pregões atrás do último pregão da base mostra (25 = ok), com 26 vira "Dado em atualização" sem nenhum número, e o /saude diz o mesmo; (7) sem nenhum informe: aviso.I-N416— Paridade PT/EN do quadro dos ETFs (os mesmos ETFs, na mesma ordem, com as mesmas barras e os mesmos links; só muda o idioma; número com ponto decimal no inglês; nenhuma frase de interface em português vaza no inglês); cada ETF do quadro é link para a página DELE e a página responde 200; a âncora #etfs-fluxo existe e está na barra de âncoras; sem JavaScript; o texto diz o que é e o que não é ("Captação líquida = aplicações menos resgates informados no dia .I-N417— O termômetro de amplitude, numa base de 14 papéis montada à mão (260 pregões), bate com um cálculo refeito aqui com funções de janela do SQLite e um IFR escrito de novo: % de ações acima da média de 200 pregões hoje e há 5 pregões, a série dos últimos 20 pregões, quantas fecham na máxima e na mínima dos 252 pregões e o IFR médio com as contagens acima de 70 e abaixo de 30. O universo é o das líquidas com histórico e sem salto: a que desdobrou 3:1 entra pelo preço AJUSTADO (sem o ajuste ela seria uma "queda de 67%" e sairia como salto), a de salto sem evento, a de histórico curto e a ilíquida ficam de fora, e a página escreve o N.I-N418— Numa base REAL, a amplitude é conferida ação a ação por SQL próprio (função de janela AVG sobre 200 fechamentos, MAX/MIN sobre 252): para TODAS as ações do universo sem evento societário na janela, o `acima200`, a máxima e a mínima de 52 semanas do módulo são os do SQL; para cinco ações (as de maior volume, sem evento) o IFR de Wilder refeito aqui bate; o agregado (quantas acima da média, máximas, mínimas, IFR > 70 e < 30) é a soma do detalhe; a % escrita na home é essa contagem sobre o N.I-N419— A TRAVA da amplitude, numa base montada à mão em que as ações líquidas PARAM e só um papel ilíquido segue negociando (o último pregão da base anda; o das líquidas não): com as líquidas até 3 pregões atrás do último pregão da base o termômetro mostra (com a data do último pregão que mede escrita), com 4 vira "Dado em atualização" sem número nenhum; o /saude lista `amplitude` nos dois casos com o MESMO estado da tela e `atencao` acesa no atrasado; o universo pequeno demais (menos de 10 ações) também vira aviso.I-N41— A página de uma companhia traz a série trimestral, cada número igual ao do banco, sem 4º trimestre, nas duas línguas.I-N420— O termômetro (PT e EN): os mesmos cartões, na mesma ordem, com os mesmos números (ponto decimal no inglês); cada indicador tem a frase de uma linha que o explica ("Acima da média de 200 pregões: quantas ações fecham acima do preço médio dos últimos 200 pregões.I-N421— O mapa de calor tem TRÊS critérios (variação do dia, volume do dia e valor de mercado), trocados só com CSS (três rádios `name="mc"`, o primeiro marcado, e rótulos `for=`; nenhum JavaScript).I-N422— Numa base montada à mão (sem balanços, logo sem valor de mercado calculável): as células escrevem o volume do pregão (R$ 50 mi → "50 mi", faixa v1), o valor de mercado vira "—" sem faixa (m0), o title e o aria-label dizem "indisponível" em vez de inventar um número, e a legenda do valor de mercado ganha "— sem valor calculável".I-N423— Contraste e cor da fase 5: as cinco faixas da escala sequencial do mapa (texto escuro nas três claras, a tinta forte `--mc-t3` nas duas escuras) estão em V3_PARES e passam de 4,5 para 1 nos DOIS modos (calculado aqui também); a escala é de UMA cor (matiz azul, a mesma nas cinco, nos dois modos) e vai do claro ao escuro no modo claro e do escuro ao claro no modo escuro (a faixa mais forte é sempre a mais destacada contra o fundo); o seletor de critério usa só pares que já existem; o CSS novo só usa cor por token (nenhuma cor crua) e nenhuma largura fixa acima de 340 px; o estado marcado do seletor aparece sem depender só da cor (o rótulo marcado muda de fundo E o texto da legenda diz o critério); o foco do teclado tem contorno; o resto da fase (amplitude e ETFs) usa só tokens que existem.I-N424— O bloco `home` do /saude traz `amplitude` (régua diária de 3 pregões) e `etfs_fluxo` (régua de 25 pregões, em `limites_por_bloco`), cada um com data, atraso em pregões e estado — o MESMO estado que decide a tela (ok mostra os números, atrasado mostra "Dado em atualização"); `atrasados` lista os que passaram da trava; os dois blocos estão na lista fechada de cliques (`analytics.I-N425— O peso da fase 5: o termômetro de amplitude abaixo de 7 KB (4 cartões e um <svg> de 20 pontos amostrados, o estilo no CSS e não em cada elemento), o fluxo dos ETFs abaixo de 6 KB (no máximo 5 aportes e 5 resgates, uma barra por classe de CSS e `--w` como único estilo inline), em PT e EN; nenhum dos dois tem JavaScript nem imagem; a home toda abaixo do teto de I-N374 (165 KB e 38 KB comprimidos, o alvo que o dono deu para a fase 5).I-N426— A ingestão de ETF e de FII lê do COTAHIST abertura, máxima, mínima, fechamento, volume, negócios e quantidade.I-N427— A rodada noturna (`atualizacao_diaria.I-N428— Com a base que estava no ar (etf_preco/fii_preco sem as colunas novas, sem etf_provento nem etf_evento), as rotas que já existiam (`/etfs/{T}/desempenho`, `/fiis/{T}/desempenho`, `/etfs/{T}/diario`) respondem 200 como antes e a rota nova responde 200 com as colunas novas NULL, `ajustada` falso e sem erro de coluna ou tabela inexistente.I-N429— `gravar_suplemento` (a ficha da B3 pela sigla do ETF): rendimento com ISIN de cota (BR + 4 letras da sigla + CTF) e valor positivo entra em `etf_provento` (a AMORTIZAÇÃO entra com o tipo dela, para a conta de retorno ignorar); valor zero e ISIN de ação de outro código ficam de fora; no bloco de eventos entram só DESDOBRAMENTO, GRUPAMENTO e BONIFICAÇÃO de cota (a bonificação de 1987 com ISIN de ação e o "RESG TOTAL RV" ficam de fora).I-N42— `/o-que-erramos` sai dos docstrings dos invariantes, não de uma lista à mão — e todo defeito datado do código aparece nela.I-N430— Numa base montada à mão (ETF com desdobramento 4:1 e um rendimento de R$ 0,50): `/etfs/{T}/precos` devolve o `fechamento_ajustado` igual a fechamento ÷ 4 até a data-com e igual ao fechamento depois (conta refeita aqui), sem ajustar abertura/máxima/mínima/volume, com o evento listado como conferido e nenhum salto sem explicação; o retorno de 1 mês COM rendimentos reinvestidos é o de `retornos.I-N431— (a) ETF com queda de 4x e NENHUM evento: a série NÃO é ajustada (`ajustada` falso, sem `fechamento_ajustado`), o salto está em `saltos_sem_explicacao` com a data e a razão, e o retorno da janela que o atravessa fica SEM número, com o motivo `evento_societario_no_periodo`; (b) ETF com evento declarado mas não confirmado pelo preço (declarou 2:1, o preço caiu 4x): não ajusta, e o salto continua sinalizado; (c) o mesmo salto num FII é sinalizado do mesmo jeito (FII não tem tabela de eventos).I-N432— `/etfs/{T}/precos` e `/fiis/{T}/precos` seguem o acesso da série de BDR e de ação: BOVA11 e MXRF11 abertos e inteiros; os demais, SEM chave, devolvem 200 com os últimos 30 pregões, `amostra` verdadeiro e o aviso de como ter a série (CSV vira JSON); COM chave, a série inteira e o CSV.I-N433— Na base de verdade: o número de pregões, o primeiro e o último dia e cada fechamento de BOVA11 (ETF) e de MXRF11 (FII) que a rota entrega são os de um SELECT próprio em `etf_preco`/`fii_preco`; a série vem em ordem de data sem dia repetido; se a base já foi reconstruída com o pregão inteiro, a mínima é maior que zero e menor ou igual à abertura e ao fechamento, e esses são menores ou iguais à máxima em TODOS os pregões.I-N434— O dump (CSV do plano Pro) ganhou `etf_precos`, `fii_precos`, `etf_proventos` e `etf_eventos`: o CSV de `etf_precos` e de `fii_precos` tem o cabeçalho (ticker, cnpj, data, abertura, maxima, minima, fechamento, volume, negocios, quantidade) e todas as linhas do banco, iguais a um SELECT próprio; os eventos e rendimentos saem com a conferência.I-N435— A página de metodologia de ETFs (`/metodologia/etfs`, PT e EN) tem a seção da série diária, da série ajustada e dos rendimentos, e diz o que a conta faz e o que NÃO faz: só evento confirmado pelo preço ajusta, salto sem explicação é sinalizado e não ajustado, o retorno com rendimentos usa a conta das ações e dos FIIs, a B3 informa cerca de 12 meses de rendimento, BOVA11 não distribui (nada é estimado) e a renda fixa não responde na fonte.I-N436— Uma resposta 4xx no `/mcp` é gravada no painel com o método e a versão do protocolo MCP pedida, entre colchetes depois do caminho, para o pulso dizer POR QUE a IA recebeu 400. Fora esses dois campos, nada vai junto (nem outro cabeçalho, nem o corpo).I-N43— A moldura de toda página bilíngue está em inglês, e onde o CONTEÚDO fica em português a página declara isso — não deixa o leitor de inglês bater num muro de texto sem explicação.I-N445— Pela mesma régua de liquidez do quanto rendeu, `/acoes/X/dividendos`, `/lucro` e `/divida` de papel ilíquido saem do sitemap (as do líquido ficam); `/acoes/X`, a página da companhia, fica sempre; outra rota com três partes não é tocada.I-N446— A página principal da ação e a do FII trazem "Como citar" (PT) / "How to cite" (EN) logo abaixo da resposta direta, com o nome do site, o código e a URL canônica da própria página (com ?lang=en no inglês).I-N447— A /saiu-da-bolsa abre com a resposta de "quem saiu da bolsa em {ano}?": o último ano FECHADO, quantas e quais companhias deixaram de ser negociadas na B3 (ano do último pregão), o ano corrente até hoje, a tabela por ano com a situação na CVM (cancelada com motivo, ou registro ainda ativo) e a linha "Como citar"; sem dado, cala.I-N448— Quem saiu da bolsa é contado pelo ÚLTIMO PREGÃO: entra a companhia cancelada na CVM com pregão registrado (no ano do último pregão, não do cancelamento) e a companhia ainda registrada que negociava com regularidade e parou há mais de 60 dias.I-N44— A busca acha por código, por nome (com ou sem acento) e por CNPJ; código exato leva DIRETO ao ativo; termo vazio não devolve a base.I-N45— `/comparar/A/B` compara o ano em que AS DUAS têm o número, declara o que não existe para aquele tipo de companhia, e não diz qual é a melhor.I-N46— A página da empresa traz gráficos em SVG gerados no servidor — sem script — um por indicador que se aplica; ano sem valor é buraco na linha, ponto com ressalva é vazado, e o último valor do cartão é o do banco.I-N471— A home (a página mais aberta a pedido de IA: 1.576 em 30 dias) traz "Como citar" (PT) / "How to cite" (EN) logo abaixo dos cartões de cobertura, com as MESMAS contagens dos cartões, o fechamento datado e a URL da própria home (com ?lang=en no inglês).I-N472— A página do ETF (/etfs/BOVA11 240 e /etfs/DIVO11 165 aberturas a pedido de IA em 30 dias) abre, logo abaixo do título, com uma frase gerada do banco: fechamento, retorno de 12 meses pela cota e patrimônio, CADA UM com a sua data; e a linha "Como citar" com o código, a data e a URL canônica.I-N473— O /hoje abre com uma frase que diz os totais da janela (balanços, reenvios, proventos e rendimentos de FII) com as duas datas e o último pregão, os MESMOS números dos títulos das seções; e a linha "Como citar" com a janela e o último pregão, porque a página muda todo dia.I-N47— A página da empresa e a do FII mostram o fechamento NOSSO (data e preço do COTAHIST, o que a API serve) ao lado do widget do TradingView — com o crédito obrigatório, dizendo que aquele número não entra na API.I-N48— A home abre com a conta aberta de uma companhia real — o ROIC refeito a partir das linhas cruas, cada linha com a conta da CVM de origem — e o resultado mostrado é o MESMO que a base publica.I-N490— Seguindo só `<a href>` sem parâmetro a partir de `/`, TODA URL do sitemap é alcançada, a no máximo 3 cliques, e nenhuma página do caminho responde erro.I-N491— Cada `/quanto-rendeu/{T}` e cada `/acoes/{T}/dividendos` do sitemap recebe link de pelo menos 2 páginas do sitemap (antes: 1 e 3, só as do próprio papel), cada índice da B3 de pelo menos 3, e a mediana do quanto rendeu sobe a 4 ou mais.I-N492— A ficha /acoes/{T} traz o bloco "Proventos e retorno no setor": as `K` (6) maiores do MESMO setor por valor de mercado (as mesmas do "Comparar"), cada uma com link para a ficha, os proventos e o quanto rendeu, todos 200; a migalha passa pela página do setor (200).I-N493— `/acoes/{T}/dividendos` liga os proventos das maiores do setor, o quanto rendeu do papel, a lista das pagadoras e o setor; `/quanto-rendeu/{T}` liga os proventos (ação) e o quanto rendeu das pares de PORTE PARECIDO do setor (ação, valor de mercado), do segmento (FII, cotistas) ou dos ETFs (volume); a página do FII liga o quanto rendeu dos maiores do segmento, o IFIX e, se o fundo está nela, a lista com data com a posição.I-N494— O hub /acoes tem cartão (link simples) para /indices, /small-caps, /carteira e /saiu-da-bolsa; o /macro para /indices; o /fiis para a lista dos FIIs de maior rendimento e para o IFIX — todos 200. O sitemap não anuncia o `/quanto-rendeu` de ETF com menos de um ano de cota (a página só diria "ainda não há histórico"), que segue no ar, ligado de volta ao ETF.I-N49— A página da empresa abre com o que a companhia faz e onde está (ficha do FCA, com a fonte declarada), traz uma barra de âncoras em que TODA entrada aponta para uma seção que existe, e um gráfico de preço em SVG do servidor cujo último ponto é o último fechamento do banco.I-N50— A página do FII tem o que a página da empresa tem: ficha em cartões com a fonte declarada, barra de âncoras em que toda entrada aponta para seção existente, três gráficos SVG do servidor (preço, P/VP ponto-no-tempo, rendimento por cota) cujo último ponto bate com o banco, e a série de P/VP enxuta (24 informes) com a completa por link.I-N51— A página da empresa abre um bloco "Tamanho e valuation": valor de mercado (fechamento de hoje × ações do último balanço público), EV, LPA, VPA, DY 12m, payout e nº de ações — cada cartão com o ano — e os múltiplos ponto-no-tempo ganham o ano no rótulo.I-N52— Ao lado do fechamento, a página (empresa e FII) mostra o retorno de 1 mês, 12 meses e no ano e a faixa de 52 semanas — calculados da série de fechamento do banco.I-N530— A /procurar vazia (e a busca sem resultado, como "dados b3") abre, antes da caixa de busca, com UMA frase que diz o que é o Dados B3: as contagens de companhias, FIIs, ETFs e BDRs IGUAIS às dos cartões da home, o fechamento datado (B3, COTAHIST), balanços da CVM desde 2010, a versão do dado do rodapé e que o site não é afiliado à B3 nem à CVM; logo abaixo, "Como citar" com a URL da /procurar.I-N531— A busca por nome com UM resultado à frente na ordem da busca abre com a frase dos fatos dele, gerada do banco: ação ("petrobras" -> PETR4) com o último fechamento e a data, os proventos por ação dos 12 meses e o DY (os do bloco de valuation da ficha), o P/L 12 m com o trimestre e o link para a página completa; FII ("maxi renda" -> MXRF11) e ETF com a frase das suas páginas; e "Como citar" apontando para a página do ativo.I-N532— O primeiro parágrafo da home (logo abaixo do título) começa com as contagens de companhias, FIIs, ETFs e BDRs IGUAIS às dos cartões de cobertura e o fechamento datado; o resto do texto de sempre vem depois.I-N533— A primeira frase do /etfs ("etfs listados b3", 2ª consulta que mais trouxe o Copilot) diz quantos fundos, quantos negociam mais de R$ 1 milhão por dia e de quando são os preços (a mesma data da linha "Preços até" da página), em PT e EN com os mesmos números.I-N53— Ao lado de cada indicador e múltiplo da empresa, a página mostra a mediana das OUTRAS companhias do mesmo setor CVM (cada uma no seu último ano), com quantas são.I-N54— Abaixo das razões, a página da empresa mostra o histórico em REAIS — receita, lucro dos controladores, EBITDA, dívida líquida, caixa e aplicações, patrimônio — ano a ano, com a unidade (R$ bi ou R$ mi) no rótulo.I-N55— A agenda de proventos (em /hoje, na home e nas páginas de ativo) mostra só o que tem data marcada daqui para a frente — pagamentos e datas-com de FII, datas-com de ação —, nunca uma data impossível (9999-12-31, "a definir" na B3), e DIZ até quando a base enxerga (data do anúncio mais novo que ela tem).I-N56— A data-com de ação ANTES de acontecer vem do "Relatório Proventos" que a companhia entrega à CVM (IPE): o formulário é lido (aprovação, último dia com direito, ISIN, valor, pagamento), entra sem tipo — o formulário não separa dividendo de JCP, e a página diz isso —, não repete o que a B3 já publicou (mesma companhia, classe, data-com e valor), só a classe do ticker principal, e cada item carrega o link do documento na CVM.I-N57— As últimas páginas que ainda rodavam JavaScript saem prontas do servidor: a corrida dos setores é SVG desenhado em Python, com janela e escala por LINK; o gráfico do fluxo estrangeiro é SVG desenhado em Python; a transparência filtra por família por um link que o servidor responde; o título da metodologia é escrito na página, não reescrito no navegador.I-N582— A ficha /acoes/{T} monta pela fila própria (`_limitador_da_ficha`, duas de cada vez), e a espera não ocupa vaga do pool das rotas síncronas.I-N583— `avisar_novas_do_sitemap` manda ao IndexNow só as URLs do sitemap que ainda não foram avisadas, no máximo uma vez a cada 20 h: na primeira vez (sem arquivo de estado) só o que o sitemap marca como mudado nos últimos 7 dias; nas seguintes, qualquer URL que não esteja no estado.I-N58— A página da companhia lista cada provento da classe principal numa tabela: tipo, data-com, data-ex, pagamento e valor por ação.I-N596— Depois da troca da base o aquecimento espera (`_AQUECER_ESPERA_S`), pede ao Linux que solte o cache do banco e PULA o sitemap e a carteira dos fundos se o processo está acima de ~1200 MB.I-N59— O gráfico de cotação (empresa e FII) escolhe a janela por LINK (1m, 3m, 6m, ano, 1a, 5a, max) e desenha o fechamento do banco na granularidade que cabe: diária até um ano, semanal em cinco, mensal no máximo.I-N60— A tabela "Em reais, ano a ano" ganha duas colunas da ITR: o último trimestre sozinho e os últimos 12 meses (TTM), montados pela MESMA identidade do P/L TTM — anual do ano anterior menos os trimestres dele até aqui, mais os deste ano; faltou um pedaço, fica vazio, nunca interpolado.I-N61— Depois da passada de coerência (cotação com o gráfico, valuation com os dois tempos, indicadores com as sparklines, nove âncoras), a página da companhia ganha três coisas vistas na AUVP Analítica, todas do que o banco já tinha: (1) indicadores por tema — valuation, endividamento, eficiência, rentabilidade, crescimento — cada um com a definição de uma linha e a marca "hoje" quando divide o valor de mercado de hoje por conta do exercício; múltiplo sobre denominador não positivo não existe; banco e seguradora ficam sem o que não se aplica; (2) as três demonstrações numa tabela só (resultado, balanço, caixa), com as derivadas ditas no nome da linha — dívida bruta = curto + longo, caixa livre = FCO + capex; (3) os eventos societários, com o multiplicador e se bateram com o salto do preço.I-N62— Do Investidor 10, só com o que o banco já tinha: (1) tabela de rentabilidade por janela (1 mês a 10 anos) com o preço sozinho e com proventos reinvestidos no fechamento da data-ex; o preço inicial é ajustado pelos eventos societários CONFERIDOS com o preço, e salto que eles não explicam deixa a janela vazia; (2) DY por ano (soma do ano ÷ fechamento do último pregão do ano) e a média de 5 anos; (3) meses com data-com nos últimos 5 anos, contados, não projetados; (4) liquidez média diária dos últimos 63 pregões na ficha; (5) checklist de nove fatos com o limiar escrito em cada linha, banco e seguradora fora do que não se aplica, dito como fato e não como recomendação.I-N63— Uma auditoria externa (ChatGPT cruzando com Fundamentus e Status Invest, 13/09/2026) deu nota 8,5 em "dados atuais": os outros mostram o último balanço trimestral e indicadores de 12 meses, nós abríamos com o exercício fechado.I-N64— Decisão do dono (13/09/2026): a ficha mostra o logotipo da companhia.I-N65— A tabela de rentabilidade ganha a linha real: o retorno com proventos reinvestidos dividido pela inflação acumulada na janela, do IPCA mensal do Banco Central (série 433), capitalizado mês a mês, com os meses de ponta pro rata pelos dias.I-N66— A página da companhia ganha "Acionistas e free float": do Formulário de Referência (FRE) da CVM, na versão mais recente que a companhia entregou, só as participações DIRETAS (a cadeia de controle, quem é dono da holding, fica fora), com a linha "Outros" do próprio formulário como mercado e a distribuição do capital como free float; a página diz a data de entrega e a versão.I-N67— Roadmap 7. O gráfico de preço e a linha 1m/12m/ano passam a ajustar a série pelos eventos societários CONFERIDOS contra a queda de preço observada (evento_societario.I-N68— Roadmap 12. Quem chega por um código de negociação ANTIGO (EMBR3, VVAR3, ELET3) é redirecionado com 301 para o atual, e a página de destino DIZ de onde ele veio — não finge que a pergunta era outra.I-N69— A agenda passa a mostrar o PAGAMENTO futuro de ação, que a ficha da B3 traz (`dividendo.I-N70— Roadmap 10 e 11. Duas regras de coerência, uma por vez: (1) MOLDURA.I-N71— Os três restos que ficaram para trás quando o item principal foi feito: (1) ao lado da mediana do setor, a POSIÇÃO no setor — "3º de 40" —, calculada dos mesmos valores da mediana, com a direção declarada (ROE alto é bom, P/L baixo é bom) e nenhuma posição inventada para indicador sem direção óbvia; (2) na página de FII, a mediana dos pares do segmento sai do parágrafo solto e entra no cartão do P/VP e do DY, como na companhia; (3) cada linha da tabela em reais ganha a forma da série numa linha minúscula, com buraco onde falta ano e a linha do zero quando a série troca de sinal.I-N72— Roadmap 8. A home ganha o mercado na primeira tela, do que já está no banco: maiores altas e baixas do último pregão, maiores dividend yields de 12 meses e os setores pelo retorno de 12 meses do nosso índice.I-N73— O que a companhia entregou à CVM fora das demonstrações — fato relevante, aviso aos acionistas, ata, comunicado ao mercado — vira uma lista na ficha, da entrega mais recente para a mais antiga, com o link para o documento na CVM.I-N74— Roadmap 14, a passada de texto.I-N75— A página /para-quem é o resumo que um assistente de IA consegue citar: a quem serve, a quem NÃO serve, quanto custa, como começar — em PT e EN, com o FAQ em JSON-LD (schema.I-N76— /fiis e /etfs devolvem JSON pela MESMA URL.I-N82— LPA, VPA e nº de ações saem na API, e são o MESMO número da página da companhia.I-N83— Depoimento obedece às mesmas exigências que um número, adaptadas ao que ele é: palavra de outra pessoa.I-N84— A página das companhias que saíram da bolsa mede o buraco sem fingir que o conserta, e não publica ticker inferido.I-N85— `as_of` filtra pelo que ESTAVA PÚBLICO na data, não pelo exercício.I-N86— /carteira?WEGE3=30&.I-N87— `screener?.I-N88— Toda resposta de dado de companhia (API e conector) traz o campo `citacao`, pronto para copiar: fonte, versão do dado e a data do último documento recebido pela CVM.I-N89— /empresas/{ticker}/veredito responde sem chave, com os seis itens, a bandeira com motivo, a frase de topo (≤ 35 palavras), a citação e nenhum termo da lista proibida — e a mesma coisa sai pelo conector.I-N90— A página da empresa traz o veredito no topo — a mesma frase, a mesma bandeira e os mesmos seis textos do JSON — com âncora, link "como calculamos" em cada número, e nenhum termo da lista proibida.I-N91— /small-caps lista SÓ as companhias dentro da janela de liquidez da configuração (piso ≤ média < teto), entre 30 e 120 delas; ordena por cada um dos seis números via link; filtra por setor; e diz na página que o veredito existe para todas as companhias, com o caminho.I-N92— /acoes/{T}/reapresentacoes responde no H1 "A {nome} já reapresentou balanço? Em que anos?", com uma linha por conta reapresentada (a mesma contagem da camada de leitura), o arquivo da CVM do ano que revelou cada uma, PT e EN; papel desconhecido é 404; a página está no sitemap e é linkada da página da companhia que tem reapresentação.I-N93— Toda página de companhia traz um FAQPage com as cinco perguntas do roteiro de citações, e cada NÚMERO de cada resposta aparece no HTML visível da própria página (a pergunta de reapresentação: os anos aparecem na página /reapresentacoes dela).I-N94— Cada cartão de múltiplo da página da companhia e a nota ponto-no-tempo dizem "preço de DD/MM/AAAA", e o JSON de múltiplos traz o mesmo texto em `preco_de`, casado com `data_preco`.I-N95— O <title> da página da companhia é gerado do dado — "WEGE3: ROE 32,2%, P/L 33,1 (2025) — Dados B3" — com o ROE do último ano sem ressalva e o P/L do último balanço, cada número no formato da própria página; a meta description traz os números do ano, não o objeto social.I-N96— As comparações geradas respondem `noindex,follow` (fora do índice, links seguidos) e não estão no sitemap; a página de reapresentação entra no sitemap SÓ para companhia que reapresentou — a de quem nunca reapresentou é `noindex,follow`.I-N97— Cada página de companhia no sitemap leva `<lastmod>` = o recebimento do documento mais recente dela na CVM; a de reapresentação, o da DFP que revelou a última; FII e ETF, o último informe.I-N98— /acoes lista todas as companhias com página, por setor, cada uma com código, nome e o ROE do último ano sem ressalva (o mesmo número da página dela; traço quando não há); o rodapé de toda página liga /acoes, /fiis e /etfs.I-N99— /fiis/{T}/reapresentacoes: o H1 é a pergunta, a primeira linha responde, e a tabela traz cada competência com versão acima de 1 — as MESMAS do banco — com a entrega e o arquivo da CVM do ano; link para o FNET e para a página do fundo, que liga para cá.I-N443— No conector, o código passa pelo MESMO ponto de normalização das rotas: `precos` com "PETR4.SA" e com "petr4f" devolve a mesma série de "PETR4"; `indicadores_anuais` com "BVMF:VALE3" responde VALE3; `fii` com "HGLG11.SA" responde HGLG11; `indice` com "^BVSP" responde IBOV.I-N444— Nas ferramentas que exigem chave (eventos, scores, trimestres.I-N330— Sem chave, as seis ferramentas da vitrine (fatos_contabeis, indicadores_anuais, multiplos, dividendos, fii, fiis_ranking) respondem para um ticker que não é a degustação, com `citacao`, e o dado é o MESMO da rota REST (fatos, indicadores, múltiplos, dividendos).I-N331— A descrição que a IA lê, em `tools/list`, marca as seis ferramentas da vitrine como ABERTAS, sem chave, qualquer ticker, um por vez, com o limite VIGENTE (o número de limites_config.I-N131— /demo/chatgpt (PT) e /demo/chatgpt?lang=en (EN) respondem 200 sem chave, mostram a gravação (img com alt e dimensões), o endereço https://dadosb3.com/mcp/chatgpt/ e o link da página do conector do Claude (/conector); declaram os três hreflang coerentes; cache público de 5 minutos; o GIF é servido como image/gif; a rota está no sitemap; e a página não fala de preço, plano nem recomenda.I-N495— /claude-code (PT) e /claude-code?lang=en (EN) respondem 200 sem chave e mostram os comandos de instalação do plugin (`/plugin install dados-b3 --marketplace Val7h/dados-b3-mcp`, o par `/plugin marketplace add` + `/plugin install dados-b3@dados-b3`) e o `claude mcp add --transport http dados-b3 https://dadosb3.com/mcp`; três perguntas de exemplo; link para /conector; os três hreflang coerentes; a página não fala de preço, plano, licença da B3 nem recomenda.I-N651— Na base real, /acoes/ITUB4 mostra o bloco "Definição exata" com o ROE sobre patrimônio consolidado, data-base e DFP, o cartão do ROE diz "consolidado" e a barra de âncoras leva ao bloco; /acoes/VALE3 (PT e EN) mostra a dívida líquida com as contas 2.01.04 e 1.01.01; /acoes/VALE3/divida e a versão .I-N411— Em cinco papéis líquidos (ITUB4, PETR4, VALE3, KNRI11, BOVA11), em português e em inglês, a página `/quanto-rendeu/{T}` tem o bloco "Leitura dos números" / "Reading the figures" com SEIS parágrafos (janelas, melhor e pior ano, maior queda, comparação com o índice e a Selic, parte dos proventos, método) e de 250 a 400 palavras; os dois idiomas têm os mesmos seis parágrafos; entre quaisquer dois papéis menos de 60% das frases são iguais (o texto muda de verdade, não só o ticker); a página inteira pesa menos de 60 KB, não leva `<script>` além do JSON-LD e o aviso "não é recomendação" segue lá.I-N412— Os números do bloco "Leitura dos números" são os de `pagina_quanto_rendeu.I-N413— O bloco "Leitura dos números" só aparece em papel LÍQUIDO, pela mesma régua do sitemap (`sitemap_quanto_rendeu`: ação com média de 63 pregões >= R$ 5 mi/dia, FII com >= 5.000 cotistas, ETF com média de 60 pregões >= R$ 1 mi/dia): as funções de um papel só (`acao_liquida_uma`, `fii_liquido_um`, `etf_liquido_um`) concordam com os conjuntos do sitemap para todas as ações e para uma amostra de fundos; uma ação ilíquida segue com a página de antes (200, canonical, sem noindex, sem o bloco).I-N230— A foto do pregão traz, por ação, os números das mesmas funções da página (valor de mercado = preço × ações, LPA, VPA, DY 12m, EV/EBITDA ponto-no-tempo com o ano) e DE QUAL balanço saíram (ano e data de entrega à CVM); por FII, P/VP do informe, P/VP de hoje (fechamento ÷ VP da cota), DY 12m e o último rendimento.I-N231— A foto é append-only: rodar duas vezes no mesmo pregão não duplica nem altera nada; o banco recusa UPDATE e DELETE nas tabelas de foto; um pregão novo acrescenta sem mexer no anterior.I-N232— A foto mora num arquivo próprio: trocar o b3.sqlite (a troca noturna e o build de domingo) não apaga nem altera uma linha dela, e o backup diário passa a copiar o arquivo.I-N233— Se a foto falha, `gravar_do_dia` NÃO levanta (a atualização noturna segue), nada fica gravado pela metade, e o /saude mostra o bloco `foto_diaria` com o estado `falhou` e a mensagem.I-N234— O /saude traz o bloco `foto_diaria`: última data gravada, nº de dias, linhas e tamanho do arquivo; sem arquivo, `nunca_rodou`.I-N235— `GET /api/foto/{ticker}?de=&ate=` responde só com X-Admin-Token (sem ele, 404, como as outras rotas de admin), devolve a série do ticker (ação ou FII) no intervalo pedido, e recusa data malformada.I-N236— O laço noturno chama a foto DEPOIS da atualização do preço, em try/except próprio, e só fora da bateria (a bateria sobe o app e não pode gravar no disco real).I-N270— `/foto-diaria` e `/foto-diaria/{ticker}` (pt e en) não mostram preço de fechamento, valor de mercado, P/L, DY, provento, EV nem LPA/VPA/ações (campos da B3 ou misto); mostram a data da foto, a versão da base, o balanço vigente, a data de entrega à CVM, o lucro e o hash de cada linha; têm "Como citar" com o hash da série e um bloco JSON-LD Dataset; e abrir as páginas não muda o arquivo da foto, byte a byte.I-N271— Toda coluna das tabelas de foto está classificada (metadado, CVM, B3, misto ou interno) em `foto_diaria.I-N272— Ticker que o site não conhece dá 404 em HTML com a moldura (e JSON simples para quem pede JSON), sem eco do texto cru; ticker conhecido sem pregão gravado dá a página dizendo que não há pregão gravado, sem tabela e sem data inventada; sem o arquivo da foto, o índice diz que ainda não há pregão gravado, e a rota não cria o arquivo.I-N273— Com 2 pregões gravados a página diz "2 pregões gravados" (e "2 trading days recorded"), nunca mais; o aviso da série começar em 21/10/2026 está nas duas línguas; as duas línguas têm as mesmas âncoras, os mesmos links e o mesmo nº de linhas na tabela.I-N274— `/foto-diaria` está no sitemap (com lastmod igual à data da última foto), na lista de páginas de fato do painel e no hub de fatos; o sitemap NÃO lista as páginas por ativo; `/foto-diaria/{ticker}` é medida pelo painel.I-N237— SECURITY.I-N238— Todo pacote de requirements.I-N112— Num interpretador novo (cache do processo frio), com a base real e sem rede, cada rota de `custo_config.I-N113— O servidor de verdade (uvicorn, um worker, o laço horário e o aquecimento ligados) sobe com a base real, e o /saude responde em menos de 1 s durante os primeiros 60 s de vida do processo — enquanto quatro "robôs" pedem sem parar as rotas que dependem dos eventos do vigia (sitemap, /vigia, /vigia/semana/…, /vigia/WEGE3).I-N437— Com os NÚMEROS DE VERDADE de limites_config.I-N438— A conta das IAs tem teto GLOBAL próprio: com 3 por hora, a 4ª consulta de "IA" (User-Agent de ChatGPT-User, cada uma de um IP diferente) recebe 429 com `Retry-After` e um corpo que diz que é o limite do servidor para assistentes de IA, com o link da chave grátis.I-N439— A regra de quem é "assistente de IA" para o limite sem chave: TODA chamada ao /mcp (e ao /mcp/chatgpt/), qualquer que seja o User-Agent (o cliente MCP chega com o da biblioteca, ex.I-N440— A regra de dados_b3/codigo_ativo.I-N441— Na base real: /empresas/PETR4.SA/indicadores, /empresas/petr4f/indicadores e /empresas/BVMF:PETR4/.I-N442— Código que não existe dá 404 que começa como sempre ("ticker desconhecido: PETR9"), sugere o parecido ("quis dizer PETR4") e manda para a busca por nome (/procurar?q=PETR9).I-N581— Decisão do dono (03/11/2026): o limite por endereço dos assistentes de IA nas ferramentas ABERTAS passa de 1.000/hora e 10.000/dia para 2.000/hora e 20.000/dia, com os números de VERDADE de limites_config.I-N320— Sem chave, com o gate comercial ligado, fatos (anual e trimestral), indicadores, múltiplos e dividendos respondem 200 para tickers que NÃO são a degustação (PETR4, VALE3, ITUB4), a ficha de FII (HGLG11) e o ranking de FII respondem em JSON, e todas trazem `citacao` com a fonte e a versão do dado.I-N321— O cofre continua fechado: `as_of` em fatos e em múltiplos, as versões e as reapresentações por empresa, o /dump (JSON e CSV), o screener de ações e o de FIIs respondem 401 sem chave.I-N322— Sem chave, o IP que passa do teto por hora recebe 429 com `Retry-After` (segundos até a hora virar, entre 1 e 3.600) e um corpo que diz o limite, o link da chave grátis e o de /assinar.I-N323— Além do teto por IP há um teto de TODOS os anônimos juntos (padrão 3.000 por hora e 30.000 por dia): quem troca de endereço a cada pedido bate nele, e a resposta é 429 com `Retry-After`, dizendo que é o limite do servidor.I-N324— A janela por hora zera quando a hora vira e a por dia quando o dia vira (UTC); o hash do mesmo IP muda de um dia para o outro (sal do dia), então o hash de ontem não casa com o de hoje; mesmo IP no mesmo dia dá o mesmo hash, IPs diferentes dão hashes diferentes.I-N325— Depois de consultas sem chave de um IP conhecido, esse IP (nem o endereço do soquete) não aparece em claro: nem nas chaves e valores do dicionário de contagem, nem nos bytes do arquivo de analytics, nem no log capturado.I-N326— Atrás do proxy o soquete é sempre o do proxy: o limite usa `cf-connecting-ip`, depois `true-client-ip`, depois o PRIMEIRO do `x-forwarded-for`, e só então o soquete.I-N327— A vitrine NÃO amplia o que a licença da B3 limita: a série diária de preços de um papel fechado segue sendo AMOSTRA (30 pregões) sem chave, a do índice também, o JSON de um ETF que não é a degustação segue pedindo chave, os trimestres (que trazem preço), os eventos e os scores seguem com chave, e o JSON da ficha de FII não traz preço diário nem série de fechamentos (só os pontos mensais que a página pública já mostra).I-N328— O índice /empresas/{T} marca indicadores, múltiplos, fatos e dividendos como abertos sem chave (com limite por IP) e o resto como `exige_chave`; o bloco `chave` diz o que é aberto, o que exige chave e o limite, com os mesmos números do gate.I-N329— O /llms.I-N594— `soltar_cache_de` solta o cache de cada arquivo (e do `-wal`), ignora arquivo ausente e qualquer erro; sem posix_fadvise (Windows) é um nada.I-N595— A cópia de trabalho, o checkpoint e a troca da atualização diária chamam o alívio de cache (`_soltar`), o backup também depois de copiar; falha no alívio não derruba nenhum dos dois.I-N480— `orientar` devolve, para cada tipo de código que a base não acha como companhia, a frase, o caminho e o que a base NÃO tem: cota de FII/ETF/BDR/índice pedida em /empresas aponta a rota certa e não sugere nada; "TICKER" e "SEARCH" são texto do modelo da URL; "3557" é só número; "SANEPAR" é nome de empresa e traz o código; "MXRF12" é direito/série de MXRF11 e diz que os números são do MXRF11; "AEFI11" (final 11, fora da base) diz que é falta de cobertura e que as sugestões são de OUTROS fundos; AZUL97 é unit e aponta AZUL3 como OUTRA classe; CTIP3 sai com o bloco de quem saiu, vindo do cadastro da CVM; código comum (PETR9) não ganha orientação nenhuma.I-N481— Cada linha da `CURADOS` precisa ser verdade no banco: o `codigo_na_base` existe (ticker, fii ou delistada), o `saiu_de` está em `delistada_papel`, o `cd_cvm` está em `companhia_fora_do_universo`, e as trocas de código têm continuidade medida no próprio banco: COGN3 abre em 11/10/2019 (o KROT3 fechou em 10/10), RAIL3 em 13/03/2017 (RUMO3 em 10/03), MEGA3 em 27/12/2021 (OMGE3 em 23/12), SMLS3 em 23/10/2017 (SMLE3 em 20/10).I-N482— Nas rotas, o `detail` segue começando por "ticker desconhecido: X" (o painel depende) e o status segue 404; ao lado vêm `tipo_do_codigo`, `onde_esta`, `relacionado`.I-N483— No MCP, o erro de código desconhecido leva `sugestoes`, `saiu_da_bolsa`, `tipo_do_codigo` e `onde_esta` em TODAS as ferramentas, não só em `dividendos` e `eventos` (16 das 18 ferramentas com `except HTTPException` devolviam só o texto).I-N540— `gravar_cotas_b3` liga o código de cota do COTAHIST ao CNPJ que declarou o MESMO ISIN no informe mensal de FII, lendo os DOIS layouts da CVM (`CNPJ_Fundo` de 2016 a 2020 e `CNPJ_Fundo_Classe` de 2021 em diante).I-N541— `mapa_trocas_fii` dá RBFF11 -> RBFM11 (mesmo CNPJ pelo ISIN, e o RBFF11 parou antes do último pregão do RBFM11) e NÃO dá AVUR11 -> AVUR15 (os dois negociam juntos) nem o código atual para ele mesmo.I-N542— No banco real, os códigos que deram 404 no painel de 7 dias e são código antigo de um FII da base resolvem para o código atual (RBFF11 -> RBFM11, SHOP11 -> GRAV11, EVBI11 -> CPUR11, TRXL11 -> BTLG11..I-N543— /fiis/RBFF11 (página) responde 301 para /fiis/RBFM11?de=RBFF11, e a página diz "Você veio de RBFF11, código antigo deste fundo"; /fiis/RBFF11/dividendos vai para a seção de rendimentos do RBFM11 com o `de`; um `de` que NÃO é código antigo do fundo não ganha a frase.I-N544— O informe mensal de FII de 2016 a 2020 (colunas `CNPJ_Fundo` e `Nome_Fundo`) entra na base como o de 2021 em diante: o fundo que saiu antes de 2021 ganha cadastro (`fii`) e fato (`fii_informe`, com PL, cotas e VP por cota do `complemento`), e o layout novo continua igual.I-N545— Um mês do informe de Fiagro da CVM (dados.I-N546— `gravar_cotas_b3` liga a cota do COTAHIST ao fundo que entrega o informe de Fiagro quando o ISIN declarado é OUTRA série do mesmo emissor (KNCA: declara BRKNCACTF014, negocia BRKNCACTF006), gravando `ligacao` = emissor_isin; o ISIN idêntico continua `isin_exato`.I-N547— `ligar_codigo_sem_ticker`: fundo do informe sem `fii.I-N548— No banco real, códigos do painel que davam 404 por falta de ligação agora têm página de fundo: KNCA11 e CPTR11 (Fiagro, com a nota do informe de Fiagro), FATN11, MGFF11 e SCPF11 (o informe mais recente declarava outro ISIN) e GRLV11 e XPGA11 (só no informe de 2016-2020).I-N590— `gravar_ponte` grava código, ISIN, CNPJ, nome, tipo, URL da ficha e data só quando o código é IGUAL ao `tradingCode` da ficha pública do fundo na B3 e negocia no COTAHIST (o ISIN é o do pregão mais recente).I-N591— `aplicar_ponte`: FII sem código ganha o da ficha; FII com código que parou ANTES do da ficha troca (o TVRI11 no lugar do BBPO11, que vira código antigo); FI-Infra fora do informe de FII entra em `fii` com segmento "FI-Infra", o nome do cadastro da CVM e o patrimônio do Informe Diário (`fundo_informe_mes`) em `fii_informe`; ISIN disputado na CVM é decidido pela ficha; o preço do ISIN negociado entra em `fii_preco`.I-N592— No banco real: IFRA11 (FI-Infra, fora do informe de FII) tem página de fundo com o CNPJ que a ficha da B3 dá (34.633.510/0001-18), diz que é FI-Infra e não FII, que cota e patrimônio vêm do Informe Diário da CVM, e cita a ficha da B3; tem informe mensal e P/VP.I-N593— Invariante no banco real: todo `fii.I-N700— O mesmo URL pedido com `Accept-Language: en-US` e com `pt-BR` devolve o MESMO HTML, em português (`lang="pt-BR"`), com o canonical no próprio URL, sem `noindex` e sem `Vary: Accept-Language`, nas fichas, nas listas, em /saiu-da-bolsa, na linhagem, nos guias e na home.I-N701— `?lang=en` devolve inglês.I-N702— Página marcada como só-português (`sinais_busca.I-N703— Os robôs de busca e de IA, com `Accept-Language: en-US`, recebem no URL português a página em português, indexável, com canonical no próprio URL (ficha de ação, ficha de FII, lista, /saiu-da-bolsa).I-N704— `/sitemap_index.I-N705— `/acoes/PETR4/` (e `/fiis/HGLG11/`, `/saiu-da-bolsa/`) responde 301 para o endereço sem barra, em GET e HEAD.I-N706— Página pública em HTML (e o sitemap) sai com `ETag` forte e `Last-Modified` em formato HTTP; `If-None-Match` com o mesmo ETag devolve 304 sem corpo; ETag muda com a língua (`?lang=en` é outra página).I-N707— `python -m dados_b3.indexnow --tudo` lê o índice do sitemap (segue os filhos), junta as URLs sem repetir e, sem `--enviar`, só conta e mostra os lotes (nenhum POST).
Nível 2 — Semântica: a conta significa o que o cálculo supõe? (5)
I-N77— As três páginas que ficaram sem JSON-LD no teste "como uma IA" (10/09/2026) agora têm UM bloco válido no <head>: /buscar e /buscar/fiis dizem que existe uma busca com parâmetro (SearchAction → /procurar?q=); /hoje é datada pela VERSÃO DO DADO (não por hoje — a página diz quando aquilo era verdade); /comparar/A/B lista as duas companhias com ticker e a URL da página de cada uma.I-N78— Cache-Control público em toda resposta de leitura sem chave, e em NENHUMA resposta com chave ou de rota de sessão/cobrança/protocolo.I-N79— `pip install dadosb3` é o primeiro gesto de quem programa, e por isso está nas três portas por onde essa pessoa chega: o hub /api, o llms.I-N81— Quando o aviso à CVM declara pagamento PARCELADO, a agenda do ativo diz isso e leva ao documento — em vez de calar o pagamento.I-N650— A memória de cálculo do ROE e da dívida (dados_b3/definicoes.
Nível 3 — Econômico: o resultado é possível no mundo real? (0)
Outros testes do produto (25)
Gate comercial, navegação e o conector MCP — testam se o produto funciona, não se um número está certo, então não entram nos 3 níveis acima por natureza. Contados e listados do mesmo jeito:
I-N01— Rastreia todas as páginas a partir da home: nenhum link interno pode responder erro, e toda página tem de ter caminho de volta para a home.I-N02— Os apelidos de metodologia (URLs que as pessoas ADIVINHAM, como /metodologia/pl) redirecionam para a página canônica — e um nome inexistente continua 404, para o alias não virar um buraco que engole tudo.I-N03— Toda página HTML tem link visível de troca de idioma.I-N04— A metodologia — o argumento central do produto — existe em inglês.I-N07— Cada vertical configurada tem porta, e a porta fala os dois idiomas.I-N05— Toda página pública declara viewport e tem regra responsiva.I-N08— O menu principal, nos dois idiomas, tem porta para cada vertical.I-N06— Rota que depende de tabela NOVA responde 503, nunca 500, quando a tabela ainda não existe.I-N09— Tabela que mistura duas temporalidades tem de rotular cada uma.I-N10— Todo exemplo que o cardápio do /screener oferece precisa ser aceito pelo /screener.I-N11— O cardápio do /screener responde a quem NÃO tem chave.I-N12— O /saude publica a versão do dado, e ela é a do banco servido.I-N13— A página de reapresentações abre sem chave; o feed por empresa não.I-N14— A página de qualidade lista o que NÃO publicamos, e por quê.I-N15— A página do plano de contas prova que código não define conta.I-N16— A página do ISSB diz que a obrigação foi REVOGADA, com data.I-N17— A página de armadilhas conta do banco, não afirma de memória.I-N18— A página do look-ahead mede, e distingue atraso de republicação.I-N19— Quem chega sem chave recebe a PÁGINA, qualquer que seja o Accept.I-N340— O coletor lê a resposta da CVM (fixture com linhas reais do IPE) e grava só as categorias do radar (Fato Relevante e Comunicado ao Mercado) de companhias do universo, com companhia, ticker, categoria, assunto, data de entrega, link do documento ORIGINAL na CVM e protocolo; "Aviso aos Acionistas" e companhia de fora ficam de fora.I-N341— A CVM é consultada no máximo uma vez a cada `intervalo_minimo_s` (10 min), contado em disco: a segunda chamada dentro do intervalo NÃO chama a rede.I-N342— O pedido à CVM leva um User-Agent que identifica o robô (nome, versão e página) e o ETag condicional; erro de rede vira status 0, nunca exceção.I-N343— A frase é "A PETR4 entregou à CVM um Fato Relevante em 16/10/2026: <assunto>.I-N344— O mesmo endereço /fatos-relevantes devolve JSON com `Accept: application/json` (e HTML para navegador, com `Vary: Accept`); a ferramenta MCP `fatos_relevantes` é aberta (sem chave), filtra por ticker e por categoria, e as duas respostas trazem `citacao`, `fonte` (licença ODbL, atualização semanal) e `aviso` de que a data vem sem hora.I-N345— /acoes/{T} ganha o bloco "Último fato relevante" (frase descritiva, link do original e a ressalva da fonte semanal) só quando a companhia tem um Fato Relevante dos últimos 30 dias; com um de 40 dias, com só Comunicado ao Mercado ou sem arquivo do radar, a ficha segue igual e sem o bloco.
Reconstrua você mesmo — margem líquida de 5 empresas, 4 setores
Não pedimos que você confie nos números. Eis a margem líquida de cinco empresas de quatro setores diferentes, cada uma reconstruída direto do balanço anual (DFP) na CVM — lucro líquido ÷ receita, batendo exatamente com o valor publicado. Para QUALQUER indicador, de qualquer empresa, a cadeia inteira até a linha do arquivo da CVM está em /linhagem:
| Empresa · setor | Lucro líq. (conta CVM) | Receita (conta CVM) | Margem =÷ |
|---|---|---|---|
| WEGE3 · indústria | R$ 6,78 bi DRE:3.11 | R$ 40,80 bi DRE:3.01 | 16,6% |
| VALE3 · mineração | R$ 11,81 bi DRE:3.11 | R$ 213,59 bi DRE:3.01 | 5,5% |
| PETR4 · petróleo | R$ 110,61 bi DRE:3.11 | R$ 497,55 bi DRE:3.01 | 22,2% |
| ITUB4 · banco | R$ 45,85 bi DRE:3.09 | R$ 387,12 bi DRE:3.01 | 11,8% |
| BBAS3 · banco | R$ 16,78 bi DRE:3.11 | R$ 319,46 bi DRE:3.01 | 5,3% |
Baixe a DFP de qualquer uma delas na CVM, pegue as contas de lucro e receita, divida — você chega no mesmo número. Bancos usam a receita de intermediação (o que faz sentido pra um banco), então a reconciliação é ciente do setor; os demais usam a receita de vendas. Valores do último exercício.
Por que às vezes divergimos de outro site (e não é erro)
Uma diferença entre dois sites geralmente não é um estar errado — é uma escolha de método. A nossa está aberta:
- Capital médio vs final: ROE e ROIC usam patrimônio/capital médio (ano atual + anterior ÷ 2), não o saldo final — então não são uma divisão ingênua de um ano só.
- Controladora vs consolidado: dizemos qual cada item usa.
- TTM vs anual: múltiplos trimestrais usam lucro dos últimos 12 meses.
- IFRS 16, goodwill, caixa, imposto excepcional: cada um tratado explicitamente e sinalizado quando distorce.
Os testes mordem? Sim — casos reais que a bateria já pegou
Um teste que nunca falha pode significar dado perfeito — ou teste fraco. Estes nasceram de erros reais que passaram, e hoje reprovam — só aparece o que existe de verdade na bateria coletada acima:
- I-B16 · o P/L = 0 dos bancos: a CVM reporta o nº de ações ora em unidades, ora em milhares (varia por empresa e por ano); o market cap saía 1000× menor e o P/L dava zero. O I-B16 (preço × ações recomputado) pegou — corrigimos 661 múltiplos anuais e 2.027 trimestrais.
- I-B24 · o lucro que sumia: a conta de lucro/PL varia por banco (Itaú 3.09, BB 3.11); se a busca por rótulo falha, o número some em silêncio e o ROE nasce errado. I-B24 faz esse buraco reprovar.
- H-B23 · o dividend yield de 800%: provento antigo na B3 vem com preço não ajustado por desdobramento; sem o H-B23 o yield sairia absurdo como se fosse real. A flag mantém o registro e avisa.
- I-B20 · o furo do COTAHIST 2023: no 1º deploy, o download de um ano de preços falhou em silêncio; a API subiu com ~50 mil preços a menos e a bateria passou, porque nenhum teste olhava cobertura. Criamos o I-B20 — ano sem preço agora reprova o build alto.
- I-B33 · Petróleo e Gás em −89,6% numa semana: o COTAHIST não é ajustado por desdobramento; um split 10:1 lia como −90% de retorno semanal e ficava no acumulado para sempre, sem nada reprovar (um filtro cego de amplitude nem resolveu — só trocou o erro de sinal). I-B33 (nenhuma semana de setor além de ±35%, a régua é a própria bolsa) faz o build parar.
- I-B31 · 364 de 865 semanas do índice setorial congeladas: ao estender a série até 2010, setor sem nenhuma empresa com market cap naquela semana virava fator 1,0 — uma linha reta que o retorno acumulado lia como 'mercado parado', e o retorno 'desde 2010' saía ficcional (+527%). I-B31 reprova qualquer semana repetida ao centavo.
- I-E05 · o P/L de 2010 da EMBRAER com preço de 2025: a busca de preço ponto-no-tempo caía para a frente sem teto quando o ticker atual não tinha preço na época do balanço (troca de código, mudança de classe); o múltiplo saía calculado com um preço 15 anos no futuro, em 22% das linhas anuais e trimestrais, em silêncio. A janela de 45 dias (e o I-E05) barra isso: sem pregão dentro do prazo, o múltiplo não é calculado.
- I-E04 · a AZUL com R$ 1,67 quadrilhão de valor de mercado: o balanço trazia 54,7 trilhões de ações da recuperação judicial, mas o preço usado já estava na base pós-grupamento de 1:150.000 — duas pontas em bases diferentes, market cap errado por ordens de grandeza. I-E04 (valor de mercado nunca maior que o PIB do Brasil) faz esse absurdo reprovar o build.
Até onde vai cada bloco de dado
Aqui não tem asterisco: esta é a cobertura ano a ano, contada agora. Indicadores (ROE, ROIC, margens, crescimento) saem só das demonstrações e cobrem a série inteira. Múltiplos (P/L, P/VP, EV/EBITDA) exigem preço e número de ações — e o nº de ações vem do Formulário de Referência, que quanto mais antigo menos companhia entregou em formato aproveitável. A diferença entre as duas colunas é limite da fonte, não buraco de ingestão. Se você procurar um P/L antigo e não achar, é porque ninguém tem — não porque escondemos. Os mesmos números em JSON: /cobertura.
| Ano | Empresas com indicadores | Empresas com múltiplos |
|---|---|---|
| 2025 | 440 | 290 |
| 2024 | 444 | 296 |
| 2023 | 442 | 298 |
| 2022 | 429 | 295 |
| 2021 | 423 | 296 |
| 2020 | 411 | 274 |
| 2019 | 372 | 166 |
| 2018 | 327 | 167 |
| 2017 | 318 | 165 |
| 2016 | 312 | 154 |
| 2015 | 304 | 144 |
| 2014 | 302 | 140 |
| 2013 | 293 | 131 |
| 2012 | 291 | 112 |
| 2011 | 284 | 98 |
| 2010 | 277 | 34 |
Cobertura ao vivo
456 empresas · 883,569 pontos de preço · 8,670 reapresentações registradas · última atualização 2026-11-06 01:27:27. Contagens completas ao vivo em /saude.
Fontes: CVM (dados abertos, ODbL) e B3 (COTAHIST). Não afiliado à B3 nem à CVM. Não é recomendação de investimento.
Os números desta página são ao vivo. Versão do dado 2026-11-03-ponte-b3-codigo-de-fundo · página gerada em 2026-11-07 01:13 UTC. Se isto não bater com o /saude, você está lendo uma cópia em cache.