Brazil CVM Filings for Pension Fund Research

Pension and previdência research teams need primary Brazil filings pension fund inputs for holding notes and peer packs — not only broker PDFs. apicvm exposes DFP, ITR, and FRE over HTTP so document IDs stay reproducible. It is not a NAV, ALM, or liability engine.

The persona

  • Equity / credit analysts at closed pension funds covering listed Brazilian issuers
  • Research associates building annual DFP packs for investment committees
  • Risk teams archiving FRE risk-factor sections next to internal memos

The problem

Research task Typical CVM source
Annual statements DFP
Interim updates ITR
Risk factors, governance, related parties FRE (name= filters)

Portal downloads do not scale across a portfolio watchlist and do not give stable UUIDs for IC citations.

Solution flow

Portfolio ticker list
  → GET /v1/companies/resolve
  → GET /v1/documents (type + year + optional name)
  → GET /v1/documents/:id/file
  → archive UUID next to the IC memo
export APICVM_KEY='apicvm_...'
export APICVM_URL='https://apicvm.dev'

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

Research checklist

  1. Resolve ticker (confirm CNPJ / legal name)
  2. Pull engagement-year DFP and prior-year comparative
  3. Pull latest ITR for interim monitoring
  4. Pull FRE sections when reading risk / governance disclosures
  5. Store document UUIDs next to memo citations

Family-office-adjacent workflows: Brazil filings for family offices. Equity research: Brazil equity research.

Example: portfolio DFP pack

import os, requests

BASE = os.environ["APICVM_URL"]
H = {"Authorization": f"Bearer {os.environ['APICVM_KEY']}"}
HOLDINGS = ["VALE3", "PETR4", "ITUB4", "RAIL3"]

for t in HOLDINGS:
    r = requests.get(
        f"{BASE}/v1/companies/resolve",
        headers=H,
        params={"query": t, "by": "ticker"},
        timeout=30,
    )
    if r.status_code == 404:
        print(t, "not resolved — skip")
        continue
    dfp = requests.get(
        f"{BASE}/v1/documents",
        headers=H,
        params={"ticker": t, "type": "DFP", "year": 2024, "perPage": 20},
        timeout=30,
    ).json()["data"]
    print(t, "DFP ids", [d["id"] for d in dfp[:3]])

If a ticker is outside the ingested corpus, resolve fails or the document list is empty — do not invent coverage.

Current limitations

  • No portfolio weights, NAV, or ALM APIs — documents only.
  • Not a substitute for regulatory filings owed by the pension entity itself.
  • Markdown extraction is async (Pro) via callback; Student keys cannot extract.
  • perPage max 50.

Next steps

Ready to integrate?

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