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:

  1. 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.
  2. Periodic governance — remuneration, committees, and policies in FRE. Essential for pay and structure, but lagging for new appointments.
  3. 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

  1. Resolve the issuer — GET /v1/companies/resolve
  2. List event filings — GET /v1/documents with type=FATO_RELEVANTE (optionally add COMUNICADO_AO_MERCADO)
  3. Scope with year and optional dateRef; sort with field=dateRef&order=desc
  4. Download the PDF — GET /v1/documents/:id/file (no extraction credits)
  5. Optional (Pro): page-level markdown — POST /v1/document-text-extractions with 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 — name tokens 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

Ready to integrate?

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