Load Brazil CVM Filings into Tableau
Want Tableau CVM filings dashboards without scraping the portal? apicvm returns document metadata as JSON. Tableau has no native CVM connector — land rows as CSV (or a Web Data Connector) and build charts on inventory, type mix, and year coverage.
The problem
BI teams covering Brazilian issuers often need:
- A watchlist inventory of DFP / ITR / FRE documents
- Filters by ticker, type, and year
- Stable document IDs for audit links — not portal session URLs
Portal ZIP dumps do not refresh cleanly into Tableau extracts.
Recommended bridge
apicvm GET /v1/documents
→ Python/Node job writes CSV
→ Tableau Desktop / Server extract
You can wrap the same endpoint in a Tableau Web Data Connector if your org already uses WDCs. The API contract stays identical.
Setup
export APICVM_URL='https://apicvm.dev'
export APICVM_KEY='apicvm_...' # from /signup
Pull an inventory CSV
import csv, os, requests
BASE = os.environ["APICVM_URL"]
H = {"Authorization": f"Bearer {os.environ['APICVM_KEY']}"}
rows = []
page = 1
while True:
r = requests.get(
f"{BASE}/v1/documents",
headers=H,
params={
"ticker": "PETR4",
"type": "DFP",
"year": 2024,
"page": page,
"perPage": 50,
},
).json()
rows.extend(r["data"])
if page >= r["meta"]["lastPage"]:
break
page += 1
with open("petr4_dfp_2024.csv", "w", newline="") as f:
w = csv.DictWriter(f, fieldnames=["id", "name", "type", "year", "ticker"])
w.writeheader()
for d in rows:
w.writerow({
"id": d["id"],
"name": d.get("name"),
"type": d.get("type"),
"year": d.get("year"),
"ticker": "PETR4",
})
perPage max is 50. See Paginate and filter.
Connect in Tableau
- Open Tableau → Text file (or your CSV data source)
- Point at the exported inventory
- Build views: document counts by
type/year, tables ofname+id - Optional: add a calculated URL field to your internal archive keyed by
id
For analyst workflows that already live in Microsoft stacks, see Power BI and Excel Power Query.
curl cross-check
curl -H "Authorization: Bearer $APICVM_KEY" \
"$APICVM_URL/v1/documents?ticker=PETR4&type=DFP&year=2024&perPage=20"
What Tableau should not do alone
- Do not scrape CVM HTML into Tableau Web Data scrapers — brittle and against the spirit of primary-source APIs
- Do not treat empty extracts as “company never filed”; empty means “not in corpus yet”
- PDF binary download (
GET /v1/documents/:id/file) is for your archive/job, not for Tableau viz cells
Current limitations
- No official Tableau connector from apicvm — CSV/WDC is the path
- Text extraction is async via callback (Pro); Student keys get
403on extract - Corpus coverage depends on ingestion lag
Next steps
Ready to integrate?
Get an API key and start querying Brazilian CVM filings programmatically.