Dados B3 › Transparency
Transparency
Transparency — how you check the numbers yourself
Data version 2026-11-09-ancora-do-fre · page generated 2026-11-12 08:09 UTC. If these do not match /saude, you are reading a cached copy.
What is checked, before every publication — 1298 automated tests, collected live
13 are DATA invariants (does the number tie out?) and 131 are product tests — access gate, navigation, language, AI connector. Calling all 1298 '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? (7)
AN01— The recorded excerpts of ANP's per-well files (December 2023 in the new layout, latin-1; March 2022 in the old layout with a quoted multi-line title and thousand-dot numbers) become sums per environment, basin, field, operator and contract: Tupi adds up to 804,443.7557 bbl/day and 40,009.19 Mm3/day, all of it pre-salt held in a COLUMN (adding the pre-salt file again would double Tupi); the month is rejected, with the reason, for a missing onshore or offshore file, a different header, a period inside the file that is not the requested one, an unreadable or negative number, a pre-salt field that offshore does not have, or a national total outside the plausible range; numbers with thousand dots and decimal commas are read correctly.AN02— The links on ANP's page (recorded excerpt) give the months under the four file name patterns ANP has used; the yearly 2005-2020 zip and months before 2021-01 stay out; a new file on the page would enter on its own.AN03— The tax ID comes from ANP's list of concessionaires by contract number and links to the production only when the operator name in the production equals the contract operator's current name: Petrobras (Tupi), Eneva and PetroRecôncavo link; Atlanta (Enauta Energia against Brava Energia S.A.), Peregrino in 2022 (Equinor Brasil against Prio Tigris), Frade (Petro Rio Jaguar against Prio Forte S.A) and a contract missing from the list do not; a truncated or different-header list is refused.AN04— The collection reads the page, the months it links and the concessionaires list, writes month by month and the result in the collection record of the meta table; a month missing on the server is an error for that month only; repeating does not duplicate and a re-read month replaces the previous one; the nightly run only downloads missing months and re-reads the last 3, the weekly one re-reads everything; an unreadable zip, a source that is down, a page with no link or an exception writes nothing, deletes nothing, never raises and leaves the reason in the record.AN05— The ANP production table is part of the inheritance of external series, but only for months the new build did not bring (ANP renames operators in old months and the key includes the operator, so inheriting the same month twice would double it); the shrink guard counts the table.AN08— With no ANP production table in the database the filtered JSON route answers 503 with Retry-After, the unfiltered one answers 200 with a notice, the page answers 200 in both languages with the series being collected notice, noindex, the licence, no number, no table and no link to the JSON route, the health route does not fail and shows the anp block as null, and the sitemap does not announce the page.AN12— The ANP Monthly Bulletin (recorded one-page PDF excerpts of the by-operator table) gives every operator from 2024 on: August 2026 has 50 operators, Petrobras at 4,019,651.38 bbl/day and 196,391.44 Mm3/day, and the name SHELL BRASIL that ANP lists twice becomes one operator (summed); the decorative symbol glued to names is removed; a PDF that is unreadable, from another month, with no table or with a row whose total does not match oil plus gas times 6.2898 is refused; only monthly PDFs from 2024-01 are discovered; the collection only takes months after the last OFFICIAL per-well month, writes month by month, re-reads only the last 2 and links the tax ID by name through ANP's list (Petrobras, Brava and the SPE Prio Forte link; the SPE is not PRIO S.A.).
Level 2 — Semantics: does the account mean what the calculation assumes? (6)
AN06— Reads sum per operator and field and compute the share and the 12-month change against the same month of the previous year (March 2022 is not it, so no change; a December 2022 row makes it appear); an operator whose name changed has no change; the series of a field ignores case and accents; the link to a stock exists only when the full tax ID is the one of a company with a ticker: a company without ticker, an SPE with its own tax ID or a branch with the same root never links.AN07— The production route returns the operators of the latest month with source, CC BY-ND 3.0 licence (not CC BY), use agreement, attribution and a citation line; fields with nivel=campo; the monthly series by tax ID (with or without punctuation), operator or field cut by from and to months; CSV with a fixed header per level; 400 for a bad parameter, two filters, a month with a series or from/to without a filter, and 404 for a request with no data.AN09— The oil and gas production page in Portuguese and English opens with the sentence of the latest month, the notice that ANP's monthly files stop there (CAPTCHA from 2024), the four cards, the operators and fields tables with Petrobras and Tupi, how to read each column, the licence stated as NoDerivatives and not CC BY, the use agreement, the attribution, the citation line, the canonical link, a JSON-LD dataset with the licence of the source, no browser script other than JSON-LD and no stock link unless the tax ID is identical; the notice disappears when the latest month is recent.AN10— The health route carries the anp block (latest month in the database and in the source, months since the last, last collection) and shows a source stopped in the same month as information without attention, raising attention only when the source has a newer month than the database; the Macro hub in both languages and the API hub carry the page and route cards; the sitemap announces the page with the last day of the month as last modified and never in the future; llms.txt cites page, route, licence and agreement; the methodology pages exist in both languages with the licence, the agreement, the source and the CAPTCHA.AN11— The production connector tool calls the same route as the page: with no argument it returns the operators of the latest month with source, licence and agreement, with a field it returns the series, and a bad request comes back as an error field and never as an exception.AN13— The manual exports folder of the public query (one CSV per month and environment) is read by the same parser: a month with Mar and Terra is complete, one with only Mar is labelled offshore only; Mar and Terra of the same month do not double; without the pre-salt file the pre-salt share is NULL, never zero, and a later pre-salt file becomes a column of Mar only if it is a subset; two files of the same month and environment count once and different contents warn; a month the official file already has stays official with a warning on divergence above 0.5%; no 12-month change is computed against a month of different scope; the page shows the latest loaded month, says 2024 onward is a manual export with partial coverage, lists the months without Terra and a coverage table by month and environment; the route carries source and scope and the manual coverage.
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 | 441 | 290 |
| 2024 | 443 | 296 |
| 2023 | 441 | 298 |
| 2022 | 428 | 295 |
| 2021 | 422 | 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
457 companies · 884,647 price points · 8,650 recorded restatements · last refresh 2026-11-12 01:38:24. 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-11-09-ancora-do-fre · page generated 2026-11-12 08:09 UTC. If this does not match /saude, you are reading a cached copy.