Overview
Every ITR (quarterly) and DFP (annual) statement CVM publishes, as filed. Two endpoints over the same rows:financials returns the statement lines long, company_financials returns the headline lines wide.
financials("PETR4"), financials("33000167000101") and financials("9512") are the same company — a ticker resolves through CVM’s published FCA map, where the trading code and the CNPJ arrive on the same filed row. Nothing is matched by name; a delisted code resolves to nothing rather than to a guess.
Read this before comparing two rows
Three more discriminators, decided for you and visible in the response:financials — statement lines, long
One row per account line:
value is absolute BRL — the publication scale is applied at ingest, so no caller has to know it.
company_financials — headline lines, wide
One row per (document, reference date, period span), for when you want the shape rather than the ledger.
revenue, gross_profit, net_income, total_assets, equity, net_margin_pct and roe_pct beside the same period_months, scope and version columns.
roe_pctis the period’s return on equity and is not annualised — a three-month row divides one quarter’s profit by equity.period_monthssays which span you have.- Where a company re-filed only its balance sheet,
total_assetsandequityreadnullrather than being paired with an income statement from a different version.
22023). There is no cursor — narrow the window, pin a p_statement, or ask for one p_doc_type.
Point in time
By default every document is read at its latest stored version, so a filing that arrived later, or a restatement, shows as if it had been known on an earlier date. That is right for a current screen and look-ahead in a backtest.financials, company_financials, income_statements, balance_sheets and cash_flow_statements all take a trailing p_as_of date that removes it:
- Only documents CVM had received before the date are read. One received on the date itself is out.
ref_datestill says which period a row is for, and the windowp_from/p_tois on that, not on the receipt date. - Of each document the highest remaining version is kept, with all its lines. A document with no filing header is dropped, never assumed early.
- PETR4’s 2023 annual statements were received on 2024-03-08, so at
2024-02-29the newest period is the quarter ended 2023-09-30. - CVM’s files carry only the newest version of each document, and versions superseded before 2026 are mostly not held. An as-of read is therefore stale for a company that restated, never early: a restating company looks later than it was.
financial_statement_historyalready lists every stored version with itsfiling_received_date.
Freshness
coverage carries a financials row whose as_of is the newest reference date any filing has reached. Its complete_through is deliberately null: the completeness model describes fund filing cadence and says nothing about companies, and a fabricated completeness date is the claim coverage exists to prevent.
Not served here
panelhas no company arm yet. The panel is one value per(id, date, metric), and a quarterly filing offers two spans under one date; picking one silently is the kind of wrong number this API refuses to make. Use these endpoints for fundamentals andpanelfor prices until the span is settled in the contract.- Per-share figures. Share counts are a separate filing; nothing here divides by a number it did not read.