Brazil CVM Filings for Insurance Research

Insurance and actuarial research teams need primary Brazil filings insurance inputs for peer packs and risk notes — not only broker PDFs. apicvm exposes DFP, ITR, and FRE over HTTP so document IDs stay reproducible. It is not a pricing, reserving, or Solvency model.

The persona

  • Insurance credit analysts covering listed Brazilian insurers and conglomerates
  • Actuarial research associates collecting public disclosure packs
  • Reinsurance desks building peer filing archives for Brazil

The problem

Research task Typical CVM source
Annual statements DFP
Interim updates ITR
Risk factors, controls, related parties FRE (name= filters)

Portal downloads do not scale across an insurer watchlist and do not give stable UUIDs for citations.

Solution flow

Insurer / peer ticker list
  → GET /v1/companies/resolve
  → GET /v1/documents (type + year + optional name)
  → GET /v1/documents/:id/file
  → archive UUID in the research index
export APICVM_KEY='apicvm_...'
export APICVM_URL='https://apicvm.dev'

curl -H "Authorization: Bearer $APICVM_KEY" \
  "$APICVM_URL/v1/documents?ticker=PSSA3&type=DFP&year=2024&perPage=20"

PSSA3 is Porto Seguro — a common insurance research name. Confirm live metadata with resolve; corpus coverage varies by year.

Research checklist

  1. Resolve ticker (confirm CNPJ / legal name)
  2. Pull engagement-year DFP and prior-year comparative
  3. Pull latest ITR for interim monitoring
  4. Pull FRE sections when reading risk / governance disclosures
  5. Store document UUIDs next to memo citations

Credit-adjacent workflows: Brazil filings for credit analysis.

Example: peer pack

import os, requests

BASE = os.environ["APICVM_URL"]
H = {"Authorization": f"Bearer {os.environ['APICVM_KEY']}"}
PEERS = ["PSSA3", "BBSE3", "IRBR3"]  # resolve each; skip if not in corpus

for t in PEERS:
    r = requests.get(
        f"{BASE}/v1/companies/resolve",
        headers=H,
        params={"query": t, "by": "ticker"},
        timeout=30,
    )
    if r.status_code == 404:
        print(t, "not resolved — skip")
        continue
    dfp = requests.get(
        f"{BASE}/v1/documents",
        headers=H,
        params={"ticker": t, "type": "DFP", "year": 2024, "perPage": 20},
        timeout=30,
    ).json()["data"]
    print(t, "DFP ids", [d["id"] for d in dfp[:3]])

If a ticker is outside the ingested corpus, resolve fails or the document list is empty — do not invent coverage.

Current limitations

  • No premium, claim triangle, or capital-model APIs — documents only.
  • Not a substitute for SUSEP filings when those are the required source.
  • Markdown extraction is async (Pro) via callback; Student keys cannot extract.
  • perPage max 50.

Next steps

Ready to integrate?

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