List Brazil Material Facts (8-K Equivalent) via API
Brazil does not have a Form 8-K. If you are looking for a Brazil 8-K API, the CVM filing that carries event-driven material disclosures is the fato relevante (material fact). apicvm lists those documents with type=FATO_RELEVANTE. It does not accept type=8-K.
This guide shows how to resolve a ticker, list material facts for a year, pick a document UUID, and download the original PDF.
The problem
EDGAR pipelines filter by form type. The material-event query is 8-K. Point that same filter at CVM and you get nothing useful: the regulator never named the form that way.
English-language material adds two more traps:
- Multi-market aggregators sometimes expose Brazilian material facts under a normalized
8-Klabel. That label is theirs, not CVM's. On apicvm the native type isFATO_RELEVANTE. - Portuguese searchers and RI pages use fato relevante. Same category. Different string. If your client only knows
8-K, you miss the filings.
Filter type=FATO_RELEVANTE. Use DFP/ITR/FRE when you need the periodic packages — not when something material happened mid-quarter.
New to the concept? Start with What is a fato relevante?. Prefer Portuguese keyword copy? See List fatos relevantes via API.
Fato relevante vs the rest of the 8-K mental model
CVM is Brazil's securities regulator. Resolve, list, and fetch still look like an EDGAR client. The type codes do not. Do not treat the table below as an official SEC mapping.
| You want | CVM type |
Closest EDGAR role |
|---|---|---|
| Material event disclosures | FATO_RELEVANTE |
Closer to an 8-K than to a 10-K |
| Market communications | COMUNICADO_AO_MERCADO |
Related IPE disclosure (not an 8-K clone) |
| Audited annual financials | DFP |
10-K financial statements |
| Interim (quarterly) financials | ITR |
10-Q. ITR here is Informações Trimestrais (Brazilian quarterly filings), not an income tax return |
| Business, risk, governance narrative | FRE |
10-K items 1 / 1A / 7, plus proxy-like sections |
A fato relevante is usually a single PDF from the IPE feed — not a bundle of section files. GET /v1/document-prefixes stays limited to DFP, ITR, and FRE.
On PETR4, the corpus held 20 FATO_RELEVANTE rows for 2025 and 16 for 2026 year-to-date through 2026-08-06 (Hold Postgres, queried 2026-08-21). Subjects look like commercial contracts, auction results, business-plan approvals, and production reports — event-driven, not a fixed quarterly package.
How apicvm helps
- Resolve the issuer —
GET /v1/companies/resolve - List material facts —
GET /v1/documents?type=FATO_RELEVANTE - Download the PDF —
GET /v1/documents/:id/file - Optional (Pro): enqueue page-level markdown —
POST /v1/document-text-extractions
Auth: Authorization: Bearer or X-API-Key.
Setup
export APICVM_KEY='apicvm_...'
export APICVM_URL='https://apicvm.dev'
The public demo API is scoped to VALE3 FRE 2025 risk factors. It will not return PETR4 IPE files. Use a real key for this flow.
Step 1: Resolve the company
curl -H "Authorization: Bearer $APICVM_KEY" \
"$APICVM_URL/v1/companies/resolve?query=PETR4&by=ticker"
Confirm cnpj and tickers[] before you store anything. A name query that matches more than one issuer returns 409 AMBIGUOUS_RESULT with candidates. Tighten it with by=ticker or by=cnpj.
Step 2: List material facts (not type=8-K)
There is no type=8-K in v1. Use FATO_RELEVANTE. perPage maxes out at 50.
curl -H "Authorization: Bearer $APICVM_KEY" \
"$APICVM_URL/v1/documents?ticker=PETR4&type=FATO_RELEVANTE&year=2025&perPage=20&field=dateRef&order=desc"
Each data[] item carries id (UUID), type, year, name, dateRef, and a nested company with tickers. Persist the UUID. Display names are long Portuguese subject lines from the IPE feed and are not stable identifiers.
Empty data for a large issuer is usually a corpus gap for that year, not an unsupported type.
Watchlist pattern: material facts + sibling IPE types
Event monitors often want fatos relevantes next to market communications. Use types (comma-separated):
curl -H "Authorization: Bearer $APICVM_KEY" \
"$APICVM_URL/v1/documents?ticker=PETR4&types=FATO_RELEVANTE,COMUNICADO_AO_MERCADO&year=2025&perPage=50&field=dateRef&order=desc"
Sibling IPE types on the contract: APRESENTACAO_INVESTIDORES, AVISO_AOS_ACIONISTAS, ATA_ASSEMBLEIA. Pagination details (page, field, order) are in Paginate and filter CVM documents. Taxonomy overview: IPE filing type.
Step 3: Download the PDF
curl -OJ -H "Authorization: Bearer $APICVM_KEY" \
"$APICVM_URL/v1/documents/<document-id>/file"
File download does not consume extraction credits. The bytes are the original filing (usually application/pdf), not a structured event schema or XBRL object.
Example: Python
import os
import requests
BASE = os.environ["APICVM_URL"]
H = {"Authorization": f"Bearer {os.environ['APICVM_KEY']}"}
company = requests.get(
f"{BASE}/v1/companies/resolve",
params={"query": "PETR4", "by": "ticker"},
headers=H,
timeout=60,
)
company.raise_for_status()
docs = requests.get(
f"{BASE}/v1/documents",
params={
"ticker": "PETR4",
"type": "FATO_RELEVANTE",
"year": 2025,
"perPage": 20,
"field": "dateRef",
"order": "desc",
},
headers=H,
timeout=60,
)
docs.raise_for_status()
for row in docs.json()["data"]:
print(row["id"], row.get("dateRef"), row.get("name"))
A multi-ticker monitor is the same call in a loop. See Build a multi-ticker CVM filings watchlist and compliance monitoring.
Getting text out of the PDF
The list endpoint returns metadata and the path to the original PDF. It does not return a classified event type, settlement amount, or English summary in JSON.
Two ways to go further:
- Parse the PDF yourself after
GET /v1/documents/:id/file - On Pro, enqueue page-level markdown with
POST /v1/document-text-extractionsand read the disclosure in a model. Extraction is asynchronous: you get202immediately, progress arrives on an HTTPScallback_url, and there is no job-status GET. Cache hits still debit one credit per page. Free and Student keys receive403 FORBIDDEN.
See Extract text from CVM PDFs and async callbacks.
If you want bulk CSV across many issuers for a one-off load, CVM open-data fato relevante CSVs may fit better than per-ticker HTTP. That comparison is in CVM open data vs apicvm.
When DFP, ITR, or FRE is the filing you actually wanted
A US 8-K is the ad-hoc event filing between 10-Ks and 10-Qs. In Brazil those event disclosures are fatos relevantes (and sibling IPE types). Do not expect type=8-K to return annual statements or FRE risk chapters.
| Need | Prefer |
|---|---|
| Audited annual financials | DFP — List Brazil DFP (10-K equivalent) |
| Quarterly numbers | ITR — List Brazil ITR (10-Q equivalent) |
| Governance / risk narrative | FRE — List Formulário de Referência via API |
| Material event disclosures | FATO_RELEVANTE (this guide) |
Many research workflows combine both: ITR for the quarter, then material facts around the release window. For the mapping across the whole CVM set, see Brazil CVM vs SEC EDGAR. New to the product API? CVM API overview.
Current limitations
GET /v1/documentsdoes not accepttype=8-K. UseFATO_RELEVANTE.- This is an analogy to Form 8-K for orientation — not an official SEC equivalence.
- Coverage depends on the ingestion sync. Empty results can be a gap, not an API error.
- No push feed for "a new fato relevante arrived"; clients poll
GET /v1/documents. - Do not expect real-time delivery; latency follows the sync pipeline.
/v1/document-prefixesdoes not catalog IPE section trees — IPE items are whole PDFs.- No structured event schema in the JSON. Substance is inside the PDF.
- Demo routes do not expose IPE downloads beyond the VALE3 FRE demo scope.
- apicvm covers Brazilian CVM filings only. It does not replace EDGAR for US issuers.
Next steps
- Read the API docs — full
/v1contract and error codes - Get an API key — list and download across supported issuers
- What is a fato relevante? — definition and taxonomy
- IPE filing type — sibling types and when to use each
- CVM API overview — where this sits next to DFP, ITR, and FRE
Ready to integrate?
Get an API key and start querying Brazilian CVM filings programmatically.