List Brazil Assembly Minutes (Atas de Assembleia) via API

Governance pipelines need the PDF from the meeting — not a paraphrase from FRE. If you want a Brazil assembly minutes API for AGO/AGE packets, scrape-the-portal is slow and brittle. On apicvm, atas de assembleia are listable as ATA_ASSEMBLEIA with the same resolve → filter → download flow used for DFP, ITR, and FRE.

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

The problem

Proxy, legal, and IR workflows treat meeting minutes as primary source:

  • Who was elected, which bylaws changed, what capital action passed
  • Cross-checks against FRE board/compensation narrative
  • Watchlists around AGM season (often paired with avisos aos acionistas)

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

What “assembly minutes” means here

In Brazil, ata de assembleia is the issuer filing that records ordinary (AGO) or extraordinary (AGE) shareholder meetings. On apicvm it is one of the IPE-related type values:

API type Role
ATA_ASSEMBLEIA Assembly minutes
AVISO_AOS_ACIONISTAS Notices to shareholders (often before/around the meeting)
FATO_RELEVANTE Material facts — events, not the full minute book
COMUNICADO_AO_MERCADO Market communications (excluding investor presentations)

This is not a literal SEC DEF 14A / proxy statement 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 minutes — GET /v1/documents?type=ATA_ASSEMBLEIA
  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 assembly minutes, 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 atas de assembleia

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

curl -H "Authorization: Bearer $APICVM_KEY" \
  "$APICVM_URL/v1/documents?ticker=PETR4&type=ATA_ASSEMBLEIA&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 can be long Portuguese titles from the feed.

AGM-season watchlist: minutes + shareholder notices

Use types (comma-separated) when the agent should see minutes and avisos together:

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

For pagination (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. An empty list can mean a corpus gap for that issuer/year — not that ATA_ASSEMBLEIA 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": "ATA_ASSEMBLEIA",
        "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"))

Optional: extract text for agents (Pro)

Atas 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.

Minutes vs FRE vs material facts

Need Prefer
Verbatim meeting record / votes / elections ATA_ASSEMBLEIA
Ongoing governance / risk / compensation narrative FREfiling type
Event disclosures outside the meeting packet FATO_RELEVANTEmaterial facts guide
Pre-meeting shareholder notices, dividends, JCP AVISO_AOS_ACIONISTASshareholder notices guide

Proxy-style workflows often combine FRE for structure and atas for the meeting outcome. See proxy advisor research.

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 ata 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 — atas are whole PDFs
  • Demo routes do not expose IPE download/markdown beyond the VALE3 FRE demo scope

Next steps

Ready to integrate?

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