Brazil Share Buyback Disclosures API: Track Treasury Repurchase Notices from CVM Filings
A Brazil share buyback disclosures API in the compliance sense is not a broker endpoint. It is access to the CVM filings that announce, amend, or report progress on recompra de ações and treasury share programs — the PDFs issuers file when they launch or update a repurchase authorization. Market data APIs may show adjusted float or aggregated buyback amounts; apicvm returns the regulatory document you can cite in research or NLP pipelines.
This guide shows which type values to query, how to list and download buyback-related notices on a watchlist, and how to narrow noisy FATO_RELEVANTE feeds with practical filters.
The problem
Buyback monitoring on B3 issuers splits into two stacks that search results often confuse:
- Trading and market data — execution, volume, sometimes estimated shares repurchased. Good for charts, not for the filing text that defines program size, price limits, and board authorization.
- Regulatory disclosures — fatos relevantes and occasional avisos aos acionistas that describe treasury acquisitions (aquisição de ações de emissão da própria companhia).
Scraping the CVM portal works for one ticker and breaks 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 repurchase events.
For payout notices (dividends and JCP), use the sibling hub Brazil dividend disclosures API. For the generic poll loop on all material facts, see Brazil material facts monitoring API.
Which filing type carries the buyback?
Brazilian issuers do not file a dedicated SEC-style "buyback form." Repurchase programs usually surface under:
type |
Role in buyback workflows |
|---|---|
FATO_RELEVANTE |
Material fact when the program launch, amendment, or material update is market-moving (most common) |
AVISO_AOS_ACIONISTAS |
Notice to shareholders when the disclosure is framed as a formal shareholder notice (less frequent for buybacks, but worth polling on corporate-action watchlists) |
Practical rule: poll FATO_RELEVANTE for each ticker on your watchlist, then filter rows by name keywords (Aquisicao, recompra, buyback, tesouraria) before downloading PDFs. Combine with AVISO_AOS_ACIONISTAS if you already run a dividend and corporate-actions poller.
On VALE3 for calendar year 2026, the demo corpus included a FATO_RELEVANTE row named Aquisicao_de_Acoes_de_Emissao_da_Propria_Companhia with dateRef 2026-07-30 (demo API, queried 2026-09-11). Active issuers file more repurchase-related facts in program-heavy years; zero rows does not prove no buyback occurred — see limitations below.
Step-by-step list queries for material facts: List fatos relevantes via API.
How apicvm helps
- Resolve the issuer —
GET /v1/companies/resolve - List event filings —
GET /v1/documentswithtype=FATO_RELEVANTEortypes=FATO_RELEVANTE,AVISO_AOS_ACIONISTAS - 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=VALE3&type=FATO_RELEVANTE&year=2026&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 3: Download a repurchase notice PDF
curl -H "Authorization: Bearer $APICVM_KEY" \
-o buyback-notice.pdf \
"$APICVM_URL/v1/documents/<document-id>/file"
Download does not consume extraction credits.
Example: Python watchlist for buyback filings
Poll material facts across a repurchase-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 = ["VALE3", "PETR4", "ITUB4", "BBDC4", "ABEV3"]
YEAR = datetime.utcnow().year
BUYBACK_RE = re.compile(
r"aquisicao|recompra|buyback|tesouraria", re.I
)
seen = set() # load from your store on startup
def list_material_facts(ticker):
r = requests.get(
f"{BASE}/v1/documents",
headers=H,
params={
"ticker": ticker,
"type": "FATO_RELEVANTE",
"year": YEAR,
"perPage": 50,
"field": "dateRef",
"order": "desc",
},
)
if r.status_code == 429:
time.sleep(5)
return list_material_facts(ticker)
r.raise_for_status()
return r.json()["data"]
for ticker in WATCH:
for doc in list_material_facts(ticker):
if doc["id"] in seen:
continue
if not BUYBACK_RE.search(doc.get("name") or ""):
continue
seen.add(doc["id"])
print(f"BUYBACK {ticker} {doc['dateRef']} {doc['name'][:70]}")
Wire this into GitHub Actions or extend the diff pattern from Brazil material facts monitoring API.
Where buyback disclosures sit in the filings stack
| Layer | Types | Buyback relevance |
|---|---|---|
| Events | FATO_RELEVANTE, AVISO_AOS_ACIONISTAS |
Program launch, limits, progress updates |
| Statements | DFP, ITR |
Treasury shares in equity, cash flow context |
| Governance | FRE |
Capital structure, authorization policies |
Brazil regulatory filings API explains the full layer map. During earnings windows, pair this hub with Track Brazil earnings season for ITR and investor presentations alongside event filings.
Current limitations
- Documents, not execution — apicvm does not route orders or return live repurchase volume from the exchange.
- 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 fatos relevantes — focused
FATO_RELEVANTEreference
Ready to integrate?
Get an API key and start querying Brazilian CVM filings programmatically.