Brazil Management Change Disclosures API: Track CEO and Director Appointments from CVM Filings
A Brazil management change disclosures API in the compliance sense is not an org-chart database or executive LinkedIn scraper. It is access to the CVM filings that announce nomeação, renúncia, or substituição of CEOs, CFOs, statutory directors, and board members — the PDFs issuers file on the IPE layer when a leadership change is material. News wires and social posts move faster than your archive; apicvm returns the regulatory document you can cite in governance surveillance, activist workflows, or NLP pipelines.
This guide shows which type values to query, how to list and download management-change notices on a watchlist, and how event-layer monitoring differs from generic fato relevante polling, M&A deal notices, and FRE compensation policy deep dives.
The problem
Brazilian governance monitoring splits into three stacks that English search results often merge:
- Media and databases — headlines, biographies, and third-party people graphs. Useful for context, not for the filing text that defines effective dates, interim roles, and board approvals.
- Periodic governance — remuneration, committees, and policies in
FRE. Essential for pay and structure, but lagging for new appointments. - Event disclosures — fatos relevantes when a CEO resigns, a CFO is named, or the board accepts a director departure, plus comunicados ao mercado when issuers frame the change for the market.
Scraping the CVM portal works for one ticker and breaks on a multi-name 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 material facts monitoring API, scoped to leadership changes.
For control transactions that replace management as part of a deal, see Brazil merger and acquisition disclosures API. For assembly-driven officer elections tied to shareholder notices, pair with list avisos aos acionistas.
Which filing type carries management changes?
Brazilian issuers do not expose a dedicated type=MANAGEMENT_CHANGE in the apicvm document list. Leadership events usually surface under:
type |
Role in governance workflows |
|---|---|
FATO_RELEVANTE |
Material fact when appointment, resignation, or interim officer role is disclosed |
COMUNICADO_AO_MERCADO |
Market communication — sometimes used alongside or instead of a fact for officer changes |
AVISO_AOS_ACIONISTAS |
Notice to shareholders — when assembly elects or removes board members |
Practical rule: poll FATO_RELEVANTE on active watchlists, add COMUNICADO_AO_MERCADO when your issuer habitually files officer news there, then filter rows by name keywords (Nomeacao, nomeação, Diretor, diretor, Presidente, Renuncia, renúncia, CEO, CFO, estatutario, estatutário) before downloading PDFs. After download, search PDF text for nomeação, renúncia, diretor estatutário, or diretor presidente.
Issuer titles vary: some banks file Alteracao_na_Diretoria while retailers use Nomeacao_de_Diretor. Zero rows in a given year does not prove no change occurred — see limitations below.
How apicvm helps
- Resolve the issuer —
GET /v1/companies/resolve - List event filings —
GET /v1/documentswithtype=FATO_RELEVANTE(optionally addCOMUNICADO_AO_MERCADO) - Scope with
yearand optionaldateRef; sort withfield=dateRef&order=desc - 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 1: List material facts for one ticker
curl -H "Authorization: Bearer $APICVM_KEY" \
"$APICVM_URL/v1/documents?ticker=PETR4&type=FATO_RELEVANTE&year=2025&perPage=50&field=dateRef&order=desc"
Response rows include stable id, dateRef, name, and nested company metadata. Use id as your cache key — not name, which can be long and encoding-sensitive.
Paginate with page= when meta.lastPage > 1. perPage maxes at 50.
Step 2: Narrow to management-change rows
Filename tokens on the CVM IPE feed are predictable enough for a first-pass filter:
curl -s -H "Authorization: Bearer $APICVM_KEY" \
"$APICVM_URL/v1/documents?ticker=PETR4&types=FATO_RELEVANTE,COMUNICADO_AO_MERCADO&year=2025&perPage=50" \
| jq '.data[] | select(.name | test("Nomeacao|nomeação|Diretor|diretor|Presidente|Renuncia|renúncia|CEO|CFO|estatutario|estatutário"; "i")) | {id, type, dateRef, name}'
Combine with market communications when your coverage includes issuers that route officer news to COMUNICADO_AO_MERCADO:
curl -s -H "Authorization: Bearer $APICVM_KEY" \
"$APICVM_URL/v1/documents?ticker=ITUB4&type=COMUNICADO_AO_MERCADO&year=2025&perPage=50" \
| jq '.data[] | select(.name | test("diretor|presidente|nomeacao|renuncia"; "i")) | {id, dateRef, name}'
After download, search PDF text for aceite de renúncia or eleição de diretor for validation. Extraction credits apply only if you use the text-extraction endpoint.
Step 3: Download a management-change notice PDF
curl -H "Authorization: Bearer $APICVM_KEY" \
-o management-change.pdf \
"$APICVM_URL/v1/documents/<document-id>/file"
Download does not consume extraction credits.
Example: Python watchlist for management-change filings
Poll material facts across a governance-focused watchlist. Persist seen in your database in production.
import os, time, requests, re
from datetime import datetime
BASE = os.environ["APICVM_URL"]
H = {"Authorization": f"Bearer {os.environ['APICVM_KEY']}"}
WATCH = ["PETR4", "ITUB4", "BBDC4", "ABEV3", "WEGE3"]
YEAR = datetime.utcnow().year
MGMT_RE = re.compile(
r"nomeacao|nomeação|diretor|presidente|renuncia|renúncia|"
r"\bceo\b|\bcfo\b|estatutario|estatutário",
re.I,
)
seen = set() # load from your store on startup
def list_events(ticker):
r = requests.get(
f"{BASE}/v1/documents",
headers=H,
params={
"ticker": ticker,
"types": "FATO_RELEVANTE,COMUNICADO_AO_MERCADO",
"year": YEAR,
"perPage": 50,
"field": "dateRef",
"order": "desc",
},
)
if r.status_code == 429:
time.sleep(5)
return list_events(ticker)
r.raise_for_status()
return r.json()["data"]
for ticker in WATCH:
for doc in list_events(ticker):
if doc["id"] in seen:
continue
if not MGMT_RE.search(doc.get("name") or ""):
continue
seen.add(doc["id"])
print(f"MGMT {ticker} {doc['dateRef']} {doc['name'][:70]}")
Wire this into GitHub Actions or extend the diff pattern from Brazil material facts monitoring API.
Where management changes sit in the filings stack
| Layer | Types | Management-change relevance |
|---|---|---|
| Events | FATO_RELEVANTE, COMUNICADO_AO_MERCADO |
Appointment, resignation, interim officer |
| Shareholder process | AVISO_AOS_ACIONISTAS |
Board election convocations |
| Governance | FRE |
Compensation, committees, policies — not same-day officer news |
Brazil regulatory filings API explains the full layer map. For background on material facts demand, see What is a fato relevante? and the pillar CVM API.
Current limitations
- Documents, not an org chart — apicvm does not maintain live executive rosters or LinkedIn profiles.
- Keyword filters are heuristic —
nametokens help; false negatives are possible if issuers use unusual titles. - Polling, not push — no webhook when CVM publishes a new fact. 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 comunicados ao mercado — focused
COMUNICADO_AO_MERCADOreference
Ready to integrate?
Get an API key and start querying Brazilian CVM filings programmatically.