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:

  1. Universe coverage — major B3 bank tickers in one API
  2. Type filters — DFP (annual), ITR (quarterly), FRE (reference)
  3. Stable document IDs — deduplicate and cite specific filings
  4. 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.