Brazil Balance Sheet Disclosures API: Track Assets, Liabilities, and Equity from CVM Filings
A Brazil balance sheet disclosures API in the credit-research sense is not a live net-debt feed, a covenant monitoring SaaS, or an engine that auto-computes leverage ratios from tables. It is access to the CVM filings where Brazilian issuers publish the balance sheet (balanço patrimonial, BP), notes on financial instruments and debt maturity, equity and treasury-share lines, and liquidity disclosures — primary statements in DFP and ITR (Informações Trimestrais, not US income tax returns), leverage and liquidity narrative in FRE, and event PDFs when refinancing or balance-sheet restructurings land outside the normal calendar. apicvm lets you list those rows by ticker, download the original filing, and diff new document.id values on a watchlist during 3Q ITR season.
This guide shows which type values to query, annex filters for balance-sheet PDFs, and how this hub differs from income statement, cash flow, and generic financial statements access.
The problem
Balance-sheet surveillance splits into three stacks that English search results often merge:
- Market data terminals — show vendor-calculated net debt, enterprise value, and leverage. They rarely store the issuer’s regulatory PDF with the full BP, debt footnotes, and equity reconciliation in one place.
- Periodic packages —
DFP,ITR, andFREwith assets, liabilities, equity, and explanatory notes on borrowings, leases, and contingencies. Essential during earnings season and credit reviews, but you still need ticker-first access and stable file IDs. - Event disclosures — fatos relevantes and investor presentations when management announces a refinancing, asset sale, capital injection, or covenant waiver that changes the balance sheet before the next periodic filing.
Scraping the CVM portal works for one ticker and breaks on a diversified watchlist. Bulk open-data ZIPs are dataset-oriented, not ticker-first. You want GET /v1/documents with stable document.id, then GET /v1/documents/:id/file for the original PDF — scoped to balance sheet workflows.
For receivables and inventory detail inside assets, cross-check Brazil working capital disclosures API. For covenant language tied to leverage tests, see Brazil debt covenant disclosures API. For IFRS 16 lease lines on the liability side, see Brazil lease liability disclosures API. This guide focuses on the API list-and-download pattern for BP and related annexes.
Which filing type carries balance sheet detail?
Brazilian issuers do not expose a dedicated type=BALANCE_SHEET in the apicvm document list. Detail usually appears under:
type |
Role in balance sheet workflows |
|---|---|
ITR / DFP |
Periodic financials — BP, debt and equity notes, cash and equivalents |
FRE |
Annual reference form — liquidity risk, leverage, and capital-structure narrative |
FATO_RELEVANTE |
Material fact when refinancing, acquisitions, or large asset sales affect leverage |
COMUNICADO_AO_MERCADO |
Occasional market communication on capital raises or liability management |
APRESENTACAO_INVESTIDORES |
Slides with net debt bridges (narrative; still a CVM filing row) |
Practical rule: list latest ITR/DFP for each ticker during 3Q ITR season, filter annex rows whose name mentions patrimônio / balanço / balance / ativo / passivo, poll FATO_RELEVANTE for debt and refinancing keywords, and pull FRE once per year for structural leverage context. After download, search PDF text for balanço patrimonial, ativo, passivo, patrimônio líquido, dívida, empréstimo, debênture, caixa, liquidez, alavancagem, or net debt.
Issuer packaging varies: some filers embed the BP inside a single financial-statements PDF; others split balance sheet, income statement, and cash flow into separate annex rows. Zero rows with a name filter does not mean the issuer omitted a BP — broaden the list before download.
How apicvm helps
- Resolve the issuer —
GET /v1/companies/resolve - List periodic packages —
GET /v1/documentswithtype=ITRortype=DFPandyear - Narrow to balance-sheet annexes —
nametokens such asPatrimônio,Balanço, orBalance - Optional section prefixes —
GET /v1/document-prefixeswhen you need a named slice inside a large PDF (filter by section name) - List event filings —
GET /v1/documentswithtype=FATO_RELEVANTEorAPRESENTACAO_INVESTIDORES - Scope with
dateRef; sort withfield=dateRef&order=desc - Download the PDF —
GET /v1/documents/:id/file(no extraction credits) - Optional (Pro): page-level markdown —
POST /v1/document-text-extractionswith async callback
Auth: Authorization: Bearer or X-API-Key. Try VALE3 without a key via the demo API.
Setup
export APICVM_KEY='apicvm_...'
export APICVM_URL='https://apicvm.dev'
Step 1: List quarterly filings for a leverage-sensitive ticker
curl -H "Authorization: Bearer $APICVM_KEY" \
"$APICVM_URL/v1/documents?ticker=PETR4&type=ITR&year=2025&perPage=10&field=dateRef&order=desc"
Response rows include stable id, dateRef, name, and nested company metadata. Use id as your cache key — not name, which can be long and encoding-sensitive.
Paginate with page= when meta.lastPage > 1. perPage maxes at 50.
Step 2: Filter annex rows that likely contain the balance sheet
curl -s -H "Authorization: Bearer $APICVM_KEY" \
"$APICVM_URL/v1/documents?ticker=PETR4&type=ITR&year=2025&perPage=50&name=Patrim" \
| jq '.data[] | {id, type, dateRef, name}'
If that returns few rows, retry with name=Balan or name=Demonstra or list without name and inspect titles manually.
Step 4: Download the filing PDF
DOC_ID=123456
curl -H "Authorization: Bearer $APICVM_KEY" \
"$APICVM_URL/v1/documents/$DOC_ID/file" -o balance-sheet.pdf
Store document.id in your warehouse. Re-download when the issuer replaces a filing; do not assume name alone is a stable key.
Step 5: Watchlist poll (Python sketch)
import os, re, requests
BASE = os.environ["APICVM_URL"]
KEY = os.environ["APICVM_KEY"]
HEADERS = {"Authorization": f"Bearer {KEY}"}
WATCH = ["PETR4", "VALE3", "BBDC4", "WEGE3"]
BS_RE = re.compile(
r"dívida|divida|empréstimo|debênture|refinanc|caixa|liquidez|alavanc|"
r"patrimônio|balanço|ativo|passivo|net debt|covenant|amortiza",
re.I,
)
seen = set()
def list_events(ticker):
r = requests.get(
f"{BASE}/v1/documents",
headers=HEADERS,
params={
"ticker": ticker,
"types": "FATO_RELEVANTE,COMUNICADO_AO_MERCADO,APRESENTACAO_INVESTIDORES",
"year": 2025,
"perPage": 50,
"field": "dateRef",
"order": "desc",
},
timeout=60,
)
r.raise_for_status()
return r.json().get("data") or []
for ticker in WATCH:
for doc in list_events(ticker):
if doc["id"] in seen:
continue
if not BS_RE.search(doc.get("name") or ""):
continue
seen.add(doc["id"])
print(f"BS {ticker} {doc['dateRef']} {doc['name'][:70]}")
Wire this into GitHub Actions CVM filings monitor or extend the diff pattern from Brazil material facts monitoring API. For NLP over downloaded PDFs, see extract text from CVM PDFs for AI agents.
Where the balance sheet sits in the filings stack
| Layer | Types | Balance sheet relevance |
|---|---|---|
| Periodic | ITR, DFP |
BP, debt and equity notes, cash, financial instruments |
| Reference | FRE |
Liquidity risk, leverage, capital structure |
| Events | FATO_RELEVANTE, COMUNICADO_AO_MERCADO |
Refinancing, M&A funding, covenant-related updates |
| Investor materials | APRESENTACAO_INVESTIDORES |
Net debt and leverage narrative (still download via API) |
Brazil regulatory filings API explains the full layer map. Pair BP pulls with quarterly ITR monitoring during 3Q ITR season (typically Oct–Nov). When impairments hit asset lines, cross-check Brazil asset impairment write-down disclosures API. When operating profit and balance-sheet leverage diverge from cash, reconcile via Brazil income statement disclosures API and Brazil cash flow statement disclosures API. For the broader Brazil financial data API pillar, treat the balance sheet as one statement cluster inside periodic filings.
Current limitations
- Documents, not parsed balance-sheet engines — apicvm does not return total assets, net debt, or equity parsed from tables or compute leverage ratios.
- Annex naming varies —
namefilters are heuristic; some BP PDFs share a generic financial-statements title. - Polling, not push — no webhook when CVM publishes a new fact. Schedule polls and diff
document.id. - Ingestion lag — sync is not real-time. A notice may appear on the portal before it is in the corpus.
- Corpus coverage — not every issuer or period is present. Validate against the portal for production compliance use cases.
- Demo scope —
/v1/demo/*is limited to VALE3. Other tickers need a production key. - ITR disambiguation — Informações Trimestrais (CVM quarterly financials), not US income tax return software.
Next steps
- Read the API docs
- Get an API key
- Brazil financial statements API — DFP and ITR package overview
Ready to integrate?
Get an API key and start querying Brazilian CVM filings programmatically.