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.