List Brazil Market Communications (Comunicados ao Mercado) via API

Event monitors and compliance agents often need the issuer’s comunicado ao mercado — the notice that clarifies a transaction, corrects a rumor, or updates the market — as a typed PDF. If you want a Brazil market communication API for those filings, scraping the CVM portal dumps presentations and generic notices into one pile. On apicvm, other market communications (excluding investor decks) are a typed filter: COMUNICADO_AO_MERCADO, with the same resolve → list → download flow used for DFP, ITR, and FRE.

This guide shows how to list comunicados by ticker, grab a document UUID, and download the original PDF.

The problem

Research and surveillance workflows treat market communications as first-class events:

  • Clarifications after a material fact
  • Operational or commercial updates that are not “material facts”
  • Cross-checks against earnings decks and FRE narrative

The portal can surface those filings. It does not give agents a stable typed filter and a per-document UUID. Bulk open-data dumps help offline ETL; they are awkward for “give me PETR4 market communications for 2024 over HTTP.”

What “market communication” means here

In the apicvm contract, presentations filed as market communications are split out from generic comunicados:

API type Role
COMUNICADO_AO_MERCADO Market communications excluding investor presentations
APRESENTACAO_INVESTIDORES Investor presentations filed as market communications
FATO_RELEVANTE Material facts — event disclosures with a stricter label
AVISO_AOS_ACIONISTAS Notices to shareholders
ATA_ASSEMBLEIA Assembly minutes

This is not a literal SEC Form 8-K clone. The analogy helps orientation; taxonomy and filing cadence are Brazilian.

IPE-style documents are single PDFs. Section prefixes (GET /v1/document-prefixes) still apply only to DFP, ITR, and FRE.

How apicvm helps

  1. Resolve the issuer — GET /v1/companies/resolve
  2. List communications — GET /v1/documents?type=COMUNICADO_AO_MERCADO
  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'

Prefer the demo API only for VALE3 evaluation — demo download/markdown scope is FRE risk factors, not IPE types. For market communications, use a real key.

Step 1: Resolve the company

curl -H "Authorization: Bearer $APICVM_KEY" \
  "$APICVM_URL/v1/companies/resolve?query=PETR4&by=ticker"

Confirm cnpj and tickers[]. Ambiguous name queries return 409 AMBIGUOUS_RESULT with candidates — tighten with by=ticker or by=cnpj.

Step 2: List comunicados ao mercado

Filter by ticker, type, and year. perPage max is 50.

curl -H "Authorization: Bearer $APICVM_KEY" \
  "$APICVM_URL/v1/documents?ticker=PETR4&type=COMUNICADO_AO_MERCADO&year=2024&perPage=20&field=dateRef&order=desc"

Each data[] item includes id (UUID), type, year, name, dateRef, and nested company. Store the UUID before downloading — display names are often long Portuguese titles from the feed.

Event watchlist: communications + material facts

Use types (comma-separated) when the agent should see comunicados and material facts together:

curl -H "Authorization: Bearer $APICVM_KEY" \
  "$APICVM_URL/v1/documents?ticker=PETR4&types=COMUNICADO_AO_MERCADO,FATO_RELEVANTE&year=2024&perPage=50"

Need decks in the same pack? See List Brazil investor presentations via API — that filter is APRESENTACAO_INVESTIDORES, not this one.

For pagination patterns (page, field, order), see Paginate and filter CVM documents.

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. Empty list results can mean a corpus gap for that issuer/year — not that the type is unsupported.

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": "COMUNICADO_AO_MERCADO",
        "year": 2024,
        "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"))

Store the UUID, not the display name — names can be long subject lines from the IPE feed.

Optional: extract text for agents (Pro)

IPE filings are PDFs. If an agent needs searchable markdown, enqueue async extraction with an HTTPS callback — same contract as DFP/FRE. There is no synchronous “return full text now” route, and Student keys get 403 on extraction. Details: Extract text from CVM PDFs and async callbacks.

When to use sibling types instead

Need Prefer
Material facts / event disclosures FATO_RELEVANTEguide
Investor presentation decks APRESENTACAO_INVESTIDORESguide
Assembly minutes ATA_ASSEMBLEIAguide
Annual / quarterly financials DFP / ITR
Governance / risk narrative sections FRE

Many compliance workflows poll comunicados around a release window, then pull the related material fact. See compliance monitoring.

Current limitations

  • Coverage depends on the ingestion sync — empty results can be a gap, not an API error
  • Not a push/webhook feed for “new filing arrived”; clients poll GET /v1/documents
  • Do not claim real-time delivery; latency follows the sync pipeline
  • /v1/document-prefixes does not catalog IPE section trees — IPE items are whole PDFs
  • Demo routes do not expose IPE download/markdown for evaluation beyond the VALE3 FRE demo scope

Next steps

Ready to integrate?

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