Brazil Tender Offer Disclosures API: Track OPA and Takeover Notices from CVM Filings
A Brazil tender offer disclosures API in the compliance sense is not a bid router or exchange gateway. It is access to the CVM filings that announce ofertas públicas de aquisição (OPA), amendments, results, and related control-change events — the PDFs acquirers and targets file on the IPE layer. News wires summarize headlines; apicvm returns the regulatory document you can cite in surveillance, arb research, or NLP pipelines.
This guide shows which type values to query, how to list and download OPA-related notices on a watchlist, and how this event layer differs from periodic M&A diligence on DFP and FRE.
The problem
Takeover monitoring on B3 issuers splits into two stacks that search results often confuse:
- Execution and market data — live prices, implied control premiums, sometimes deal calendars from sell-side research. Useful for trading, not for the filing text that defines price, acceptance conditions, and regulatory references.
- Regulatory disclosures — fatos relevantes when an OPA launches, changes, or closes, and avisos aos acionistas when assemblies or formal notices frame the transaction for holders.
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 IPE disclosures, scoped to control transactions.
For equity issuance and dilution, see Brazil follow-on offering disclosures API. For treasury repurchases, see Brazil share buyback disclosures API. For the generic poll loop on all material facts, see Brazil material facts monitoring API.
Which filing type carries the tender offer?
Brazilian issuers do not expose a dedicated type=OPA in the apicvm document list. Tender offers and control events usually surface under:
type |
Role in OPA workflows |
|---|---|
FATO_RELEVANTE |
Material fact when an OPA is launched, amended, extended, or when results and regulatory milestones are disclosed |
AVISO_AOS_ACIONISTAS |
Notice to shareholders for assembly convocation, formal terms, or holder communications tied to a control transaction |
Practical rule: poll both types for each ticker on your watchlist, then filter rows by name keywords (OPA, Oferta, aquisicao, controle, alienacao) before downloading PDFs. After download, search PDF text for oferta pública de aquisição, preço da oferta, or aceitação.
Step-by-step list queries for material facts: List fatos relevantes via API. Reference for avisos: List avisos aos acionistas via API.
On VALE3 for calendar year 2025, the demo corpus included a FATO_RELEVANTE row whose name references aquisição of participative debentures with dateRef 2025-11-05 (demo API, queried 2026-09-13). That row illustrates acquisition-related material facts on the IPE feed; live OPA launches on banks and mid-caps use the same list-and-download pattern with OPA / oferta tokens when present in the corpus. Zero rows in a given year does not prove no tender offer occurred — see limitations below.
How apicvm helps
- Resolve the issuer —
GET /v1/companies/resolve - List event filings —
GET /v1/documentswithtypes=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 2: Narrow to OPA and takeover 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=VALE3&type=FATO_RELEVANTE&year=2025&perPage=50" \
| jq '.data[] | select(.name | test("OPA|Oferta|aquisicao|controle|alienacao"; "i")) | {id, dateRef, name}'
After download, search PDF text for oferta pública, ações em circulação, or prazo de aceitação for validation. Extraction credits apply only if you use the text-extraction endpoint.
Step 3: Download a tender offer notice PDF
curl -H "Authorization: Bearer $APICVM_KEY" \
-o tender-offer-notice.pdf \
"$APICVM_URL/v1/documents/<document-id>/file"
Download does not consume extraction credits.
Example: Python watchlist for OPA filings
Poll material facts across a control-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
OPA_RE = re.compile(
r"OPA|oferta|aquisicao|controle|alienacao|takeover", re.I
)
seen = set() # load from your store on startup
def list_event_filings(ticker):
r = requests.get(
f"{BASE}/v1/documents",
headers=H,
params={
"ticker": ticker,
"types": "FATO_RELEVANTE,AVISO_AOS_ACIONISTAS",
"year": YEAR,
"perPage": 50,
"field": "dateRef",
"order": "desc",
},
)
if r.status_code == 429:
time.sleep(5)
return list_event_filings(ticker)
r.raise_for_status()
return r.json()["data"]
for ticker in WATCH:
for doc in list_event_filings(ticker):
if doc["id"] in seen:
continue
if not OPA_RE.search(doc.get("name") or ""):
continue
seen.add(doc["id"])
print(f"OPA {ticker} {doc['dateRef']} {doc['name'][:70]}")
Wire this into GitHub Actions CVM monitor or extend the diff pattern from Brazil material facts monitoring API.
OPA events vs periodic M&A diligence
| Workflow | Document focus | apicvm starting point |
|---|---|---|
| Event surveillance | OPA launch, amendment, result | FATO_RELEVANTE + avisos on a watchlist (this guide) |
| Target diligence | Contingencies, related parties, contracts | DFP, ITR, FRE sections — see M&A research use case |
Brazil regulatory filings API explains the full layer map. During earnings windows, pair this hub with Track Brazil earnings season for ITR alongside event filings.
Current limitations
- Documents, not execution — apicvm does not route bids, accept tender instructions, or return CVM registration status as an API field.
- 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.