Brazil Follow-On Offering Disclosures API: Track Capital Increases and Subscription Rights from CVM Filings

A Brazil follow-on offering disclosures API in the compliance sense is not a bookbuilding or allocation endpoint. It is access to the CVM filings that announce board approval, issue price, subscription ratio, preference periods, and amendments for aumento de capital and follow-on equity offerings — the PDFs issuers file when they launch or update a capital raise. Investment banks and market data vendors may summarize deal terms; apicvm returns the regulatory document you can cite in research, dilution models, or NLP pipelines.

This guide shows which type values to query, how to list and download offering-related notices on a watchlist, and how to narrow noisy FATO_RELEVANTE feeds with practical filters.

The problem

Follow-on and capital-increase monitoring on B3 issuers splits into two stacks that search results often confuse:

  1. Execution and market data — live prices, estimated dilution, sometimes deal calendars from sell-side research. Good for trading desks, not for the filing text that defines legal terms and subscription windows.
  2. Regulatory disclosures — fatos relevantes when the offering is market-moving, and avisos aos acionistas when the company frames subscription rights, assembly dates, or formal shareholder notices.

Scraping the CVM portal works for one ticker and breaks on a bank-heavy 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 capital markets events.

For payouts, use Brazil dividend 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 follow-on?

Brazilian issuers do not file a single SEC-style “S-1” in the IPE feed. Equity follow-ons and capital increases usually surface under:

type Role in follow-on workflows
FATO_RELEVANTE Material fact when board approval, launch, pricing, or material updates are disclosed (common for large banks and industrials)
AVISO_AOS_ACIONISTAS Notice to shareholders for subscription rights, preference periods, assembly convocation, and formal terms tied to a capital increase

Practical rule: poll both types for each ticker on your watchlist, then filter rows by name keywords (Aumento, capital, subscri, oferta, distribuicao) before downloading PDFs. After download, search PDF text for preço de emissão, direito de preferência, or período de exercício.

Reference for the aviso layer: List avisos aos acionistas via API. Step-by-step list queries for material facts: List fatos relevantes via API.

On VALE3 for calendar year 2026, the demo corpus included an AVISO_AOS_ACIONISTAS row about the scheduled Assembleia Geral Ordinária with dateRef 2026-04-30 (demo API, queried 2026-09-12). Banks and other issuers file additional FATO_RELEVANTE rows with aumento or oferta tokens when a follow-on is live; zero rows in a given year does not prove no offering occurred — see limitations below.

Public offering disclosures on the same IPE layer also appear as FATO_RELEVANTE rows whose name includes oferta (for example debenture offerings on VALE3 in 2025 in the demo corpus). Equity follow-ons use the same list-and-download pattern with different keyword filters.

How apicvm helps

  1. Resolve the issuer — GET /v1/companies/resolve
  2. List event filings — GET /v1/documents with types=FATO_RELEVANTE,AVISO_AOS_ACIONISTAS
  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 and shareholder notices

curl -H "Authorization: Bearer $APICVM_KEY" \
  "$APICVM_URL/v1/documents?ticker=VALE3&types=FATO_RELEVANTE,AVISO_AOS_ACIONISTAS&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 2: Narrow to follow-on and capital-increase 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&types=FATO_RELEVANTE,AVISO_AOS_ACIONISTAS&year=2026&perPage=50" \
  | jq '.data[] | select(.name | test("Aumento|capital|subscri|oferta|distribuicao"; "i")) | {id, type, dateRef, name}'

Tune the regex per issuer: some titles use Oferta_Publica or Aumento_de_Capital without English tokens.

Step 3: Download an offering or notice PDF

curl -H "Authorization: Bearer $APICVM_KEY" \
  -o follow-on-notice.pdf \
  "$APICVM_URL/v1/documents/<document-id>/file"

Download does not consume extraction credits.

Example: Python watchlist for follow-on filings

Poll event filings across a capital-markets 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
OFFERING_RE = re.compile(
    r"aumento|capital|subscri|oferta|distribuicao|follow", re.I
)
seen = set()  # load from your store on startup

def list_offering_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_offering_filings(ticker)
    r.raise_for_status()
    return r.json()["data"]

for ticker in WATCH:
    for doc in list_offering_filings(ticker):
        if doc["id"] in seen:
            continue
        if not OFFERING_RE.search(doc.get("name") or ""):
            continue
        seen.add(doc["id"])
        print(f"OFFERING {ticker} {doc['type']} {doc['dateRef']} {doc['name'][:70]}")

Wire this into GitHub Actions or extend the diff pattern from Brazil material facts monitoring API.

Where follow-on disclosures sit in the filings stack

Layer Types Follow-on relevance
Events FATO_RELEVANTE, AVISO_AOS_ACIONISTAS Board approval, pricing, preference period, amendments
Statements DFP, ITR Pro forma capital, treasury shares, equity roll-forward
Governance FRE Capital structure policies, authorization limits

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 bookbuilding — apicvm does not route orders, guarantee allocation, or return live subscription balances.
  • 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.