Extract Financial Footnotes from Brazil CVM DFP Filings

The headline numbers in a Brazilian annual report tell part of the story. Revenue growth, EBITDA margins, net debt — these live in the DFP income statement and balance sheet. The why behind those numbers sits in the notas explicativas (financial footnotes): revenue breakdowns, debt covenants, lease obligations under IFRS 16, tax contingencies, and one-off items that can distort reported earnings.

If you are building research tools, quant pipelines, or AI agents over Brazilian equities, you need programmatic access to DFP footnotes — not a manual PDF hunt on the CVM portal. apicvm lets you resolve a ticker, list DFP filings by year, download originals, and stream page-level markdown through callbacks so your pipeline can query footnote sections directly.

The problem

Brazilian public companies file DFP (Demonstrações Financeiras Padronizadas) annually with the CVM. Footnotes are embedded inside multi-hundred-page PDFs, often in Portuguese, with tables that break naive copy-paste extraction.

Typical questions that require footnotes, not just the face financials:

  • What drove revenue growth — volume, price, mix, or acquisitions?
  • How much debt matures in the next 12 months, and what covenants apply?
  • Are there non-recurring provisions, impairments, or fair-value adjustments distorting net income?
  • Did the company reverse a tax provision or record a material subsequent event?

Structured data vendors rarely expose footnote-level detail. Scraping the CVM portal does not scale. You need a repeatable API workflow: list DFP → extract text → chunk by note → answer with citations.

What DFP footnotes contain

In a typical DFP, notas explicativas cover:

Topic What you find Why it matters
Revenue and margins Segment breakdown, GLP-1 mix effects, inventory write-downs Explains margin compression despite top-line growth
Debt and cash Debentures, CRIs, short-term maturities, IFRS 16 lease liabilities Net debt ratios miss operating lease burden
Covenants Net debt/EBITDA limits, interest coverage floors Early warning before breach
Non-recurring items Provisions, reversals, restructuring, commodity MTM Separates recurring earnings from noise
Tax contingencies ICMS, PIS/COFINS, IRPJ cases with probability estimates Balance-sheet risk beyond reported provisions

These sections are exactly what production analysis workflows target when reviewing DFP filings — revenue quality, leverage, and earnings sustainability.

How apicvm helps

apicvm does not parse footnotes into structured fields. It gives you reliable access to the source documents and machine-readable text:

  1. Resolve companyGET /v1/companies/resolve?query=RADL3&by=ticker
  2. List DFP filingsGET /v1/documents?ticker=RADL3&type=DFP&year=2024
  3. Download original PDFGET /v1/documents/:id/file
  4. Extract page-level markdownPOST /v1/document-text-extractions with your HTTPS callback URL

Extraction is asynchronous: apicvm returns 202 Accepted and sends page markdown to your callback as each page completes. Chunk the markdown by section headers (e.g., "Nota explicativa — Empréstimos e financiamentos") and feed into your RAG or agent loop.

Example: resolve and list DFP

export APICVM_KEY='apicvm_...'
export APICVM_URL='https://apicvm.dev'

curl -H "Authorization: Bearer $APICVM_KEY" \
  "$APICVM_URL/v1/companies/resolve?query=RADL3&by=ticker"

curl -H "Authorization: Bearer $APICVM_KEY" \
  "$APICVM_URL/v1/documents?ticker=RADL3&type=DFP&year=2024&perPage=20"

Inspect the list response for the main DFP document by name and dateRef. Multiple files may appear under the same type and year.

Example: Python extraction pipeline

import os
import requests

BASE = os.environ["APICVM_URL"]
HEADERS = {"Authorization": f"Bearer {os.environ['APICVM_KEY']}"}

docs = requests.get(
    f"{BASE}/v1/documents",
    params={"ticker": "RADL3", "type": "DFP", "year": 2024, "perPage": 20},
    headers=HEADERS,
).json()

document_id = docs["data"][0]["id"]

requests.post(
    f"{BASE}/v1/document-text-extractions",
    json={
        "documentId": document_id,
        "callbackUrl": "https://your-server.example/callback",
    },
    headers=HEADERS,
)
# Receive page markdown via callback; index by page number and section title

Footnote questions to automate

Once text is extracted, structure your agent or search around recurring footnote themes:

  • Revenue and margins — segment mix, one-off gains/losses, admin explanations for margin changes
  • Debt, cash, and covenants — maturity schedule, covenant headroom, liquidity risk disclosures
  • Non-recurring items — provisions, impairments, fair-value adjustments, tax reversals

Pair the annual DFP with the latest ITR (quarterly filing) to catch interim updates on debt, covenants, and subsequent events between annual releases.

Current limitations

  • No structured footnote parser — apicvm returns page markdown, not tagged note objects. Your pipeline must segment text.
  • Async extraction only — no synchronous text endpoint; progress arrives via callbacks.
  • Corpus coverage — document availability depends on the ingestion pipeline; not every company or year may be present.
  • perPage max 50 — paginate list results for issuers with many files per year.
  • Portuguese source text — footnotes are in Portuguese; plan translation or multilingual models if your audience is English-only.

Next steps

Ready to integrate?

Get an API key and start querying Brazilian CVM filings programmatically.