Monitor Brazil Regulatory Filings for Compliance

Compliance, IR, and risk teams need a Brazil filings compliance API that can pull the same CVM PDFs auditors expect — with stable identifiers — instead of screenshots from a portal session.

apicvm supports that workflow for DFP, ITR, and FRE: resolve the company, filter documents, download originals, and optionally extract text for internal search.

The persona

  • Sell-side / buy-side compliance reviewing issuer disclosures
  • Corporate IR tooling that archives peer filings
  • Vendors building Latin America KYC / research assistants

The job is evidence: document id, type, year, and the PDF bytes (or cited markdown pages).

The problem

Portals are fine for one-off reads and poor for repeatable controls. Bulk open data lacks a clean “give me this FRE section PDF” call. Teams end up with shared drives of renamed files and no API id to refresh next year.

Solution: compliance-oriented flow

Issuer list (tickers)
  → resolve each company
  → list FRE / DFP for target years
  → filter by name (risk, governance, controls)
  → store document.id + download PDF for audit vault
  → optional async text extraction for internal search

List FRE candidates

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

curl -H "Authorization: Bearer $APICVM_KEY" \
  "$APICVM_URL/v1/documents?ticker=ITUB4&type=FRE&year=2025&perPage=50"

Narrow by section name

curl -H "Authorization: Bearer $APICVM_KEY" \
  "$APICVM_URL/v1/documents?ticker=ITUB4&type=FRE&year=2025&name=Risco&perPage=20"

Keep the audit file

curl -OJ -H "Authorization: Bearer $APICVM_KEY" \
  "$APICVM_URL/v1/documents/<document-id>/file"

Downloads do not consume extraction credits. Use extraction only when you need searchable markdown — and handle 402 credit errors.

Python: archive metadata for a control

import os, json, requests

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

r = requests.get(
    f"{BASE}/v1/documents",
    headers=H,
    params={"ticker": "BBAS3", "type": "FRE", "year": 2025, "name": "Risco", "perPage": 50},
)
r.raise_for_status()
manifest = [
    {"id": d["id"], "name": d["name"], "dateRef": d["dateRef"], "year": d["year"]}
    for d in r.json()["data"]
]
print(json.dumps(manifest, ensure_ascii=False, indent=2))

Current limitations

  • Corpus coverage lags the live CVM portal — not a real-time compliance feed.
  • IPE / fatos relevantes are out of MVP — see IPE.
  • No built-in policy engine; apicvm supplies documents, not pass/fail rules.

Next steps

Ready to integrate?

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