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-K label. That label is theirs, not CVM's. On apicvm the native type is FATO_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

  1. Resolve the issuer — GET /v1/companies/resolve
  2. List material facts — GET /v1/documents?type=FATO_RELEVANTE
  3. Download the PDF — GET /v1/documents/:id/file
  4. 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-extractions and read the disclosure in a model. Extraction is asynchronous: you get 202 immediately, progress arrives on an HTTPS callback_url, and there is no job-status GET. Cache hits still debit one credit per page. Free and Student keys receive 403 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 DFPList Brazil DFP (10-K equivalent)
Quarterly numbers ITRList Brazil ITR (10-Q equivalent)
Governance / risk narrative FREList 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/documents does not accept type=8-K. Use FATO_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-prefixes does 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

Ready to integrate?

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