Dados B3 › Transparency
Transparency
Transparency — how you check the numbers yourself
Data version 2026-10-18-pl-classe-versoes · page generated 2026-10-23 00:42 UTC. If these do not match /saude, you are reading a cached copy.
What is checked, before every publication — 769 automated tests, collected live
13 are DATA invariants (does the number tie out?) and 124 are product tests — access gate, navigation, language, AI connector. Calling all 769 'invariants' would be inflating it: the split is checkable in the list itself. Not a hand-picked highlight reel: every test below was found by introspecting the actual test files just now, the same way pytest --collect-only would. Grouped by what it protects against, not by which file it lives in.
Level 1 — Integrity: does the data tie out? (13)
RO01— An indicator caveat shows as a sentence with the code in brackets (the same code as the API); an unknown flag shows as the code only; a partial Piotroski says how many criteria were checked; charts and tables use the sentence.RO02— The ETF page shows shares outstanding (net assets / NAV per share of the latest daily report, with its date), the administrator from the B3 registry and the year the class was registered; the old keys gestor, cotas_emitidas and data_inicio no longer exist (page, JSON, MCP); the approved quantity stays, under its own name.RO03— The FII page says the segment is the one declared by the administrator, and the P/BV card shows, next to the point-in-time figure, the P/BV at the latest close (close / book value per share) with its date.RO04— The home page 'largest market value' list comes from the same calculation as each company page (today's close x shares of the latest filing), re-ranked by it; a candidate without today's value is left out; only the first N.RO05— The same corporate event in the ON and PN classes (same date, type, multiplier and status) is ONE row naming the classes; a single-class event gets no label; a multiplier below 0.1 keeps the decimals it needs (0.001x, not 0.00x).RO06— The 5-year average dividend yield (the checklist criterion) comes with the median beside it; the criterion stays the average.RO07— Every English page announces Pro at the SAME price (the one for the language), with no hand-written R$ 49.90.RO08— The search title and description use the latest figure when its caveat only declares the method (total profit without minorities, year-end equity...); a caveat that puts the figure in doubt removes that year; a figure more than one year older than the latest published does not enter (better no ROE than the one from 2012).RO09— Every marker that can silence a multiple (P/E, P/BV, EV/EBITDA...) has a sentence in Portuguese and in English; the verdict writes the caveat as a sentence with the code in brackets; patterns with a number (unit of N shares, missing quarter, price N years later) become a sentence with the number; so does the dividend coverage status; FII and ETF markers show the sentence on screen and the code in the tooltip.RO10— Two distributions on the same ex-date are reinvested TOGETHER (1 + (a+b)/P) in the performance block and in the returns table; both 5-year windows start at the same session (the last one up to the same day 5 years earlier) and give the same number; a share-count suspicion that the price refuted is not a company event nor counted in its signals, and what our detector finds is never labelled as declared by the exchange.RO11— A company with common and preferred shares: today's market value is common × common close + preferred × preferred close (the split comes from the capital composition of the latest annual/quarterly filing; the other class's close from COTAHIST, up to 7 days older); EV uses it; the per-share market cap used by multiples does not change. Without the other class, with two preferred classes, or with a stale close, it stays as before. COTAHIST stores the full close history of the other class (a unit only with an inferred basket), and today's market value never counts the unit.RO12— /en leads to the English home and /en/<page> to that page in English (301); /llms-full.txt leads to /llms.txt; /.well-known/mcp.json says where the MCP connector is; the home counts the REITs WITH A PAGE, like /fiis and /para-quem. On 16/10/2026 /en and both agent doors returned 404 and the home said 484 REITs against 472 elsewhere.RO13— The checklist says "no losses" (not "none", read as "no profit") and "years of trading in our data" (not "years listed"); the home says "New at the regulator" (the block shows 30 days, not "yesterday") and cuts names at a word boundary; the free-key offer links to /chave-gratis; the price chart says it is not adjusted for dividends.
Level 2 — Semantics: does the account mean what the calculation assumes? (0)
Level 3 — Economic: is the result possible in the real world? (0)
Other product tests (0)
Access gate, navigation and the MCP connector — they test whether the product works, not whether a number is right, so they don't fit the 3 levels above by design. Still counted, still listed:
Reconstruct it yourself — net margin across 5 companies, 4 sectors
We don't ask you to trust the numbers. Here's the net margin of five companies in four different sectors, each rebuilt straight from its annual report (DFP) at the CVM — net income ÷ revenue, matching the published figure exactly. For ANY indicator, of any company, the whole chain down to the line in CVM's file is at /linhagem:
| Company · sector | Net income (CVM acct) | Revenue (CVM acct) | Margin =÷ |
|---|---|---|---|
| WEGE3 · industrial | R$ 6.78 bn DRE:3.11 | R$ 40.80 bn DRE:3.01 | 16.6% |
| VALE3 · mining | R$ 11.81 bn DRE:3.11 | R$ 213.59 bn DRE:3.01 | 5.5% |
| PETR4 · oil & gas | R$ 110.61 bn DRE:3.11 | R$ 497.55 bn DRE:3.01 | 22.2% |
| ITUB4 · bank | R$ 45.85 bn DRE:3.09 | R$ 387.12 bn DRE:3.01 | 11.8% |
| BBAS3 · bank | R$ 16.78 bn DRE:3.11 | R$ 319.46 bn DRE:3.01 | 5.3% |
Download any of these DFPs from the CVM, take the income and revenue accounts, divide — you get the same number. Banks use interest income as revenue (what makes sense for a bank), so the reconciliation is sector-aware; the others use sales revenue. Figures are the latest fiscal year.
Why we may differ from another site (and it's not an error)
A difference between two sites usually isn't one being wrong — it's a method choice. We disclose ours:
- Average vs ending capital: ROE and ROIC use average equity/capital (this year + last ÷ 2), not the ending balance — so they're not a naive single-year division.
- Controlling vs consolidated: we state which one each item uses.
- TTM vs annual: quarterly multiples use trailing-twelve-months earnings.
- IFRS 16, goodwill, cash, exceptional tax: each handled explicitly and flagged when it distorts.
Do the tests bite? Yes — real cases the suite has caught
A test that never fails could mean perfect data — or a weak test. These were born from real errors that slipped through, and now fail — only shown for tests that actually exist in the collected suite above:
- I-B16 · banks' P/E = 0: the CVM reports share count sometimes in units, sometimes in thousands (varying by company and year); market cap came out 1000× too small and P/E was zero. I-B16 (price × shares recomputed) caught it — we fixed 661 annual and 2,027 quarterly multiples.
- I-B24 · the vanishing profit: the profit/equity account varies by bank (Itaú 3.09, BB 3.11); if the label search fails, the number vanishes silently and ROE is born wrong. I-B24 makes that hole fail.
- H-B23 · the 800% dividend yield: old B3 dividends carry a price not adjusted for splits; without H-B23 the yield would look absurdly real. The flag keeps the record and warns.
- I-B20 · the missing COTAHIST 2023: on the first deploy one year of prices failed to download silently; the API shipped with ~50k fewer prices and the suite passed, because nothing checked coverage. We added I-B20 — a year without prices now fails the build loudly.
- I-B33 · Oil & Gas at −89.6% in one week: COTAHIST isn't split-adjusted; a 10:1 split read as a −90% weekly return and stayed in the cumulative return forever, with nothing failing (a blind amplitude filter didn't fix it either — it just flipped which direction was wrong). I-B33 (no sector week beyond ±35%, the ruler is the exchange itself) stops the build.
- I-B31 · 364 of 865 sector-index weeks frozen: extending the series back to 2010, a sector with no company carrying a market cap that week turned into a factor of 1.0 — a flat line that the cumulative return read as 'market stood still', and the 'since 2010' return came out fictional (+527%). I-B31 fails on any week repeated to the cent.
- I-E05 · EMBRAER's 2010 P/E priced with 2025 data: the point-in-time price lookup fell forward with no ceiling whenever the current ticker had no price at balance-sheet time (ticker change, share-class migration); the multiple came out priced 15 years into the future, in 22% of annual and quarterly rows, silently. The 45-day window (and I-E05) blocks it: no session inside the deadline, no multiple computed.
- I-E04 · AZUL at R$ 1.67 quadrillion market cap: the balance sheet carried 54.7 trillion shares from the judicial recovery issuance, but the price used was already on the post-reverse-split (1:150,000) basis — two ends measured on different bases, market cap wrong by orders of magnitude. I-E04 (market cap never above Brazil's GDP) fails the build on that absurdity.
How far back each block of data goes
No asterisks here: this is coverage year by year, counted right now. Indicators (ROE, ROIC, margins, growth) come from the filings alone and cover the whole series. Multiples (P/E, P/BV, EV/EBITDA) need a price and a share count — and the share count comes from CVM's reference form, which the further back you go the fewer companies filed in a usable format. The gap between the two columns is a source limit, not an ingestion hole. If you look for an old P/E and do not find it, it is because nobody has it — not because we hid it. The same numbers as JSON: /cobertura.
| Year | Companies with indicators | Companies with multiples |
|---|---|---|
| 2025 | 440 | 290 |
| 2024 | 444 | 296 |
| 2023 | 442 | 298 |
| 2022 | 429 | 295 |
| 2021 | 423 | 296 |
| 2020 | 410 | 274 |
| 2019 | 371 | 166 |
| 2018 | 326 | 167 |
| 2017 | 317 | 165 |
| 2016 | 311 | 154 |
| 2015 | 303 | 144 |
| 2014 | 301 | 140 |
| 2013 | 292 | 131 |
| 2012 | 291 | 112 |
| 2011 | 284 | 98 |
| 2010 | 277 | 34 |
Live coverage
456 companies · 880,805 price points · 8,656 recorded restatements · last refresh 2026-10-22 01:17:07. Full live counts at /saude.
Sources: CVM (open data, ODbL) and B3 (COTAHIST). Not affiliated with B3 or the CVM. Not investment advice.
Numbers on this page are live. Data version 2026-10-18-pl-classe-versoes · page generated 2026-10-23 00:42 UTC. If this does not match /saude, you are reading a cached copy.