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
41 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? (41)
PR05— PR05 · O botão da chave grátis leva a um formulário, não ao Stripe.PR06— PR06 · O /assinar declara que a cobrança sai em nome da Lemon Tech.PR07— PR07 · E-mail malformado não cria cliente, e robô também não.PR08— PR08 · A chave criada grava DE ONDE a pessoa veio — a marca do link que saiu de nós e a resposta opcional "como chegou" — e nada disso fica junto do e-mail.PR09— PR09 · O checkout do Pro (cartão) e do Pix pedem ao Stripe a recuperação do carrinho abandonado (link de recuperação e consentimento de comunicação na própria tela); o grátis não.PR10— PR10 · O e-mail aprovado pelo dono vai só ao plano GRÁTIS (sem Pro, sem o dono, sem repetição de e-mail), com a resposta no e-mail do dono; o ensaio só conta; um segundo disparo pula quem já recebeu; falha de envio fica anotada como falha e volta no próximo; a rota não existe sem o token.PR11— PR11 · O site manda o lembrete do checkout PAGO que expirou só para quem marcou o consentimento na tela do Stripe, com o link de recuperação e a resposta no e-mail do dono; checkout de R$ 0 (grátis), sem e-mail, sem link ou de quem concluiu outro checkout na janela fica de fora; ninguém recebe duas vezes; falha do Stripe não levanta.PR12— PR12 · O buscador (ações e FIIs) oferece "baixar esta lista em planilha" com os MESMOS filtros; a planilha é só do Pro (grátis 403, sem chave 401) e traz exatamente as linhas da tela, na mesma ordem, com % em % e a ressalva numa coluna própria; a chave pode vir na URL (o formulário manda assim).PR13— PR13 · A página de planos (PT e EN) mostra o que o Pro faz por quem usa todo dia: a lista do buscador em planilha, a base em CSV, a resposta direta em até 1 dia útil e a garantia de 7 dias em destaque; e segue dizendo que nada foi tirado do grátis.PR14— PR14 · Todo e-mail de campanha e de lembrete leva um link de parar de um clique (e o List-Unsubscribe do Gmail): o link é assinado (não dá para descadastrar o e-mail de outra pessoa) e não carrega o endereço; abrir (GET) só pergunta, o POST grava; quem parou não recebe a campanha nem o lembrete; o "parar" respondido por e-mail entra pelo painel com token; sem a lista legível, a campanha não sai.PR15— PR15 · Página HTML pedida com `utm_source=x&utm_medium=resposta&utm_campaign=radar` sai com a MESMA marca nos links internos (os `a href` que começam com barra), então o clique seguinte (por exemplo, /assinar) chega marcado e o painel conta "veio do X → olhou o Pro" — sem cookie e sem identificar ninguém.PR16— PR16 · A página da chave distingue a PRIMEIRA entrega (`chave_entregue_` mais o plano, que é a conversão) de um assinante antigo reabrindo a própria chave (`chave_reaberta_` mais o plano, que não é).PR17— PR17 · Pedido com User-Agent de Chrome mas sem `Accept-Language` ou sem `sec-ch-ua` é programa, não pessoa: entra como classe 'robo_disfarcado' (bot=1) e fica fora da contagem de visitantes; navegador de verdade (com os dois cabeçalhos) continua 'humano'; Firefox não precisa de sec-ch-ua; nenhum cabeçalho é gravado.PR18— PR18 · O GET de /assinar mostra a confirmação e NÃO cobra: nenhuma sessão no Stripe, nenhum evento de funil.PR19— PR19 · O POST de /assinar cria a sessão, grava o evento de funil e redireciona 303 para o Stripe.PR20— PR20 · Rastreador declarado que faz POST em /assinar não abre sessão nem evento (cartão e Pix).PR21— PR21 · Quem desiste no formulário do cartão volta à página de planos, não à home.PR22— PR22 · Na página de planos o Pix e o cartão são botões de MESMO peso (mesma classe), Pix primeiro.PR23— PR23 · No /chave-gratis, o e-mail de um assinante Pro (ou de quem já tem chave grátis) NÃO devolve a chave no HTML nem no JSON: a resposta diz "se este e-mail já tem chave, enviamos para ele", e a chave vai só ao próprio e-mail (normalizado).PR24— PR24 · Sem enumeração: no /chave-gratis, a resposta de quem já tem chave é a MESMA para Pro e para grátis (não revela o plano); no /portal, a mesma para e-mail de cliente e e-mail que não existe.PR25— PR25 · A chave de API sozinha não abre o Portal do Stripe: GET /portal com X-API-Key mostra o formulário; POST com a chave (formulário antigo) não redireciona, não cria sessão no Stripe e só manda um link ao e-mail CADASTRADO do cliente; só o cabeçalho, sem e-mail, é 400. A página do portal pede o e-mail, não a chave.PR26— PR26 · O link do portal é de uso único e vence em 30 minutos: o GET só mostra o botão (não gasta o link — o leitor de e-mail que pré-abre endereços não o queima); o POST abre o portal do cliente certo (303); o segundo POST é 410 sem nova sessão; link vencido ou inventado é 410; no disco fica só o resumo, nem o link nem o e-mail.PR27— PR27 · Falha fechada: em produção (RENDER=true) sem STRIPE_SECRET_KEY/STRIPE_PRICE_ID, o dump Pro, as rotas de chave e o resumo Pro NÃO liberam — 503; só a degustação (WEGE3) continua aberta.PR28— PR28 · Sem STRIPE_WEBHOOK_SECRET o webhook responde 503 e não lê nem processa o corpo (antes, era lido como JSON cru: qualquer um mandava "evento"); o método também recusa sozinho.PR29— PR29 · Reenvio de chave e link do portal: no máximo 3 por hora e 10 por dia para o mesmo e-mail (somados), no disco (vale entre reinícios e réplicas); depois do limite a tela é a mesma e nada sai.PR30— PR30 · Pedir a exclusão responde IGUAL (status e texto) para quem tem dados e para quem não tem; o link de confirmação vai só ao próprio e-mail, e só se existe algo para apagar; pedir não apaga nada; e-mail que não parece e-mail é recusado sem consultar nada.PR31— PR31 · O GET do link só mostra o botão (leitor de e-mail que pré-abre endereços não apaga nada); o POST apaga uma vez só; link inventado, vencido ou do PORTAL não apaga; e o link de apagar não abre o portal do Stripe.PR32— PR32 · Confirmado o link: o cadastro do Stripe é esvaziado e apagado e a chave sai do cache; os avisos, a carteira, o boletim, o histórico semanal, o pedido de teste, a fila de e-mail e as contagens da chave do titular somem; a campanha troca o e-mail pelo resumo; os recibos perdem só o dono; os dados de OUTRA pessoa ficam intactos; o resumo do e-mail entra na lista de não enviar; o evento fica com o resumo, nunca o e-mail; e o e-mail não sobra em byte nenhum dos arquivos do disco.PR33— PR33 · Sem provedor de e-mail, as rotas de pedido e de confirmação respondem 503 com o contato, nada é enviado e nada é gravado (nem a fila de e-mail pendente, que guardaria o endereço); em produção sem Stripe, o mesmo.PR34— PR34 · foto_diaria.PR35— PR35 · O mesmo limite do portal vale para o apagar: no máximo 3 e-mails por hora e 10 por dia para o mesmo endereço (somados com chave e portal), e a tela continua a mesma.PR36— PR36 · O pagamento Pix antigo continua no Stripe depois que o cliente é apagado.PR37— PR37 · /admin/chave/{prefixo} responde 404 sem o cabeçalho, com token errado e com o token na query; e com o token certo mas sem Stripe configurado, 503. Nada do Stripe é consultado antes da porta.PR38— PR38 · Só vale hexadecimal minúsculo de 8 a 32 caracteres.PR39— PR39 · O prefixo de 12 caracteres acha o Pro: e-mail, plano, assinatura ativa, data de criação e o uso (total ok, dias ativos, primeiro e último dia, famílias mais usadas, 429).PR40— PR40 · Nem a chave inteira nem pedaço dela sai na resposta, e o e-mail não entra no log, nem quando o Stripe falha.PR41— PR41 · Com mais de 5 cadastros no prefixo, a rota devolve só quantos são e pede prefixo maior: nenhum e-mail.PR42— PR42 · Perguntas seguidas varrem o Stripe uma vez só (índice em memória), e a rota nunca chama modify, delete ou create.PR43— PR43 · POST /admin/chave/trocar com {"email"} troca a chave do cadastro: a antiga deixa de valer na hora, a nova vale com o mesmo plano, vai SÓ ao e-mail do cadastro e não aparece na resposta nem no log.PR44— PR44 · Sem token (ou com ele na query): 404 e nada muda.PR45— PR45 · O e-mail de agradecimento aprovado pelo dono em 01/11/2026 vai só a quem tem chave GRÁTIS usada em 3 dias distintos ou mais nos últimos 30; Pro, o dono, chave de uso esporádico e quem já recebeu ficam de fora; o ensaio só conta; a resposta vai ao e-mail do dono; a rota não existe sem o token.
Nível 2 — Semântica: a conta significa o que o cálculo supõe? (0)
Nível 3 — Econômico: o resultado é possível no mundo real? (0)
Outros testes do produto (4)
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:
PR01— PR01 · O cabeçalho deste arquivo não pode perder o aviso de que passar na bateria não é prova de verdade.PR02— PR02 · Nenhum indicador vai ao ar sem página de metodologia.PR03— PR03 · Quem não escolheu plano vê os planos, não um formulário de cartão.PR04— PR04 · O grátis aparece na página, e não escondido atrás de script.
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.