Brazil Dividend Disclosures API: Track JCP and Payout Notices from CVM Filings
A Brazil dividend disclosures API in the research sense is not a yield endpoint. It is access to the CVM filings that define dividends, juros sobre capital próprio (JCP), rights issues, and shareholder meetings — the PDFs issuers file when they announce payout terms. Market data APIs return price and sometimes historical dividend cash flows; apicvm returns the regulatory document with record dates, per-share amounts, and legal references.
This guide maps which document type to query, how to list and download payout notices on a watchlist, and where monitoring fits next to your quarterly ITR workflow.
The problem
Dividend research on B3 issuers breaks into two stacks that SERPs often mix:
- Quotes and market data — OHLCV, dividend yield, sometimes a cash dividend history. Good for charts, not for the filing text your compliance or NLP pipeline must cite.
- Regulatory disclosures — avisos aos acionistas and material facts that announce or amend payouts. These live in CVM's IPE layer, not in a stock quote JSON field.
Scraping the CVM portal works for one ticker and fails on a watchlist. Bulk open-data ZIPs are dataset-oriented, not ticker-first. You want GET /v1/documents with stable document.id, then GET /v1/documents/:id/file for the original PDF — the same pattern as Brazil IPE disclosures, scoped to payout events.
For the quotes vs filings split, see Quotes API vs CVM filings API and Brazil financial data API.
Which filing type carries the payout?
Brazilian issuers do not use a single SEC-style "dividend form." Payout-related information typically appears under two apicvm type values:
type |
Role in payout workflows |
|---|---|
AVISO_AOS_ACIONISTAS |
Formal notice to shareholders — dividends, JCP, capital increases, splits, assembly dates |
FATO_RELEVANTE |
Material fact when the announcement is framed as market-moving news (common alongside earnings) |
Practical rule: start with AVISO_AOS_ACIONISTAS for structured payout notices; add FATO_RELEVANTE when you monitor earnings-season clusters or want the same loop as material facts monitoring. Filter downloaded PDFs by keywords (dividendo, JCP, juros sobre capital) if you poll both types.
On VALE3 for calendar year 2026, the demo corpus held 1 AVISO_AOS_ACIONISTAS row (demo API, queried 2026-09-10). Active issuers file more notices in payout-heavy years; zero rows does not prove no dividend occurred — see limitations below.
Step-by-step list queries for avisos: List Brazil shareholder notices via API.
How apicvm helps
- Resolve the issuer —
GET /v1/companies/resolve - List payout-related filings —
GET /v1/documentswithtype=AVISO_AOS_ACIONISTASortypes=AVISO_AOS_ACIONISTAS,FATO_RELEVANTE - Scope with
yearand optionaldateRef - Download the PDF —
GET /v1/documents/:id/file(no extraction credits) - Optional (Pro): page-level markdown —
POST /v1/document-text-extractionswith async callback
Auth: Authorization: Bearer or X-API-Key. Try VALE3 without a key via the demo API.
Setup
export APICVM_KEY='apicvm_...'
export APICVM_URL='https://apicvm.dev'
Step 3: Download a payout notice PDF
curl -H "Authorization: Bearer $APICVM_KEY" \
-o payout-notice.pdf \
"$APICVM_URL/v1/documents/<document-id>/file"
Download does not consume extraction credits.
Example: Python watchlist for payout filings
Poll avisos (and optionally material facts) across a dividend-focused watchlist. Persist seen in your database in production.
import os, time, requests
from datetime import datetime
BASE = os.environ["APICVM_URL"]
H = {"Authorization": f"Bearer {os.environ['APICVM_KEY']}"}
WATCH = ["VALE3", "PETR4", "ITUB4", "BBDC4", "ABEV3"]
YEAR = datetime.utcnow().year
PAYOUT_TYPES = "AVISO_AOS_ACIONISTAS,FATO_RELEVANTE"
seen = set() # load from your store on startup
def list_payout_docs(ticker):
r = requests.get(
f"{BASE}/v1/documents",
headers=H,
params={
"ticker": ticker,
"types": PAYOUT_TYPES,
"year": YEAR,
"perPage": 50,
"field": "dateRef",
"order": "desc",
},
)
if r.status_code == 429:
time.sleep(5)
return list_payout_docs(ticker)
r.raise_for_status()
return r.json()["data"]
for ticker in WATCH:
for doc in list_payout_docs(ticker):
if doc["id"] in seen:
continue
seen.add(doc["id"])
if doc["type"] == "AVISO_AOS_ACIONISTAS":
print(f"AVISO {ticker} {doc['dateRef']} {doc['name'][:70]}")
# Optionally filter FATO_RELEVANTE by filename keywords before alerting
Wire this into GitHub Actions or extend the diff pattern from Brazil material facts monitoring API.
Where dividend disclosures sit in the filings stack
| Layer | Types | Payout relevance |
|---|---|---|
| Events | AVISO_AOS_ACIONISTAS, FATO_RELEVANTE |
Announcement and terms |
| Statements | DFP, ITR |
Retained earnings context, footnotes |
| Governance | FRE |
Dividend policy, shareholder structure |
Brazil regulatory filings API explains the full layer map. Brazil financial statements API covers DFP/ITR for the periodic side.
Current limitations
- Documents, not dividend yield series — apicvm does not replace a quotes API for historical yield or payment calendars derived from market data.
- Polling, not push — no webhook when CVM publishes a new aviso. Schedule polls and diff
document.id. - Ingestion lag — sync is not real-time. A notice may appear on the portal before it is in the corpus.
- Corpus coverage — not every issuer or period is present. Validate against the portal for production compliance use cases.
- Demo scope —
/v1/demo/*is limited to VALE3. Other tickers need a production key.
Next steps
- Read the API docs
- Get an API key
- List Brazil shareholder notices — focused
AVISO_AOS_ACIONISTASreference
Ready to integrate?
Get an API key and start querying Brazilian CVM filings programmatically.