Brazil Bank CVM Filings API for Financial Research
Credit analysts, fintech engineers, and quant teams monitoring Brazilian banks need a Brazil bank filings API — not quarterly PDF hunts on the CVM portal. Banks like Itaú, Bradesco, and Banco do Brasil publish dense DFP and ITR packages with Basel disclosures, segment breakdowns, and risk sections.
apicvm gives research pipelines ticker-first access to those CVM documents: resolve, list by type and year, download PDFs, and extract page-level markdown for models or agents.
The persona
Typical users:
- Credit research — track capital ratios and loan book trends from ITR/DFP text
- Fintech compliance — cite original CVM filings in automated reports
- Cross-border funds — add Brazil bank exposure alongside US/EU regulatory data
- AI research assistants — answer "What did Bradesco disclose about credit risk?" with source PDFs
Common blocker: bank filings are multi-file, multi-PDF bundles. Open-data ZIPs lack per-ticker workflows. Scraping bank investor relations pages duplicates effort across ITUB4, BBAS3, BBDC4.
The problem
Bank research workflows need:
- Universe coverage — major B3 bank tickers in one API
- Type filters — DFP (annual), ITR (quarterly), FRE (reference)
- Stable document IDs — deduplicate and cite specific filings
- Text extraction — PDFs are not model-ready without page-level parsing
Manual portal downloads do not scale across a bank watchlist updated every quarter.
Solution: apicvm bank filings flow
Watchlist: [ITUB4, BBAS3, BBDC4, ...]
→ For each ticker:
GET /v1/companies/resolve
GET /v1/documents?ticker=X&type=ITR&year=2024
Pick latest by dateRef
POST /v1/document-text-extractions → callback
→ Index markdown → run analysis / agent queries
Example: quarterly sweep for three banks
import os, requests
BASE = os.environ["APICVM_URL"]
H = {"Authorization": f"Bearer {os.environ['APICVM_KEY']}"}
BANKS = ("ITUB4", "BBAS3", "BBDC4")
for ticker in BANKS:
r = requests.get(
f"{BASE}/v1/documents",
headers=H,
params={"ticker": ticker, "type": "ITR", "year": 2024, "perPage": 5},
)
r.raise_for_status()
docs = r.json()["data"]
latest = docs[0] if docs else None
if latest:
print(f"{ticker}: {latest['dateRef']} — {latest['name']}")
curl: resolve Itaú
export APICVM_KEY='apicvm_...'
export APICVM_URL='https://apicvm.dev'
curl -H "Authorization: Bearer $APICVM_KEY" \
"$APICVM_URL/v1/companies/resolve?query=ITUB4&by=ticker"
Corpus coverage (major banks)
Verified in the apicvm corpus (2026-07-16):
| Ticker | Bank | DFP 2024 | ITR 2024 | FRE 2024 |
|---|---|---|---|---|
| ITUB4 | Itaú Unibanco | 14 | 35 | 79 |
| BBAS3 | Banco do Brasil | 13 | 34 | 78 |
| BBDC4 | Bradesco | 13 | 37 | 78 |
Counts include all PDFs filed under each type — use name filters to target financial statements.
What this API is not
- Not market data — no stock prices, volumes, or dividend history
- Not BACEN regulatory reporting — CVM filings for publicly traded banks, not central bank returns
- Not real-time — availability follows the ingestion pipeline
For price data, use a market data provider. For CVM regulatory PDFs, use apicvm.
Integration patterns
| Pattern | Endpoints |
|---|---|
| Batch download | GET /v1/documents + GET /v1/documents/:id/file |
| LLM/RAG | POST /v1/document-text-extractions with callbacks |
| Company metadata | GET /v1/companies/resolve |
See Build a RAG Pipeline with Brazil CVM Filings for embedding workflows.
Current limitations
- Watchlist limited to companies in the ingested corpus.
- Large FRE files may require paginated extraction callbacks.
- Material facts (Fato Relevante) not in MVP scope.
Next steps
Ready to integrate?
Get an API key and start querying Brazilian CVM filings programmatically.