Como acessar dados fundamentalistas da B3 via API Python
Quem trabalha com dados do mercado financeiro brasileiro sabe a dor: scraping frágil, dados inconsistentes, fontes pagas. Neste tutorial, mostramos como acessar P/L, P/VP, ROE e mais 27 indicadores de 350+ ações via uma API REST simples.
O problema
Se você já tentou construir um modelo de investimento, backtest ou dashboard com dados da bolsa brasileira, provavelmente esbarrou nos mesmos problemas:
- A CVM publica dados em CSVs com encoding Latin-1, separador ponto-e-vírgula, e colunas que mudam entre versões
- O COTAHIST da B3 usa formato de largura fixa com 245 bytes por linha — de 1986
- As ações reportam número de ações em unidades, milhares ou milhões, sem indicar qual
- Calcular TTM (Trailing Twelve Months) a partir de ITRs e DFPs é um exercício de paciência
- Não existe uma API pública oficial que agregue tudo isso
Plataformas como Fundamentus e StatusInvest resolvem isso visualmente, mas não oferecem API. Se você precisa dos dados programaticamente — para alimentar um modelo, popular um dashboard ou rodar um backtest — precisa de uma API.
A solução: bolsai API
A bolsai é uma API REST que agrega dados oficiais da B3, CVM e BCB e os entrega limpos, normalizados e calculados. Com uma requisição HTTP, você obtém os mesmos indicadores que veria no Fundamentus ou StatusInvest.
Setup
Primeiro, crie uma conta gratuita em usebolsai.com e copie sua API key do dashboard. Depois instale o httpx:
pip install httpx
1. Fundamentos atuais de uma ação
O endpoint /fundamentals/{ticker} retorna 27 indicadores calculados com TTM
(últimos 12 meses) para qualquer ação da B3:
import httpx
API_KEY = "sua_chave_aqui"
BASE = "https://api.usebolsai.com/api/v1"
# Buscar fundamentos da Petrobras
r = httpx.get(
f"{BASE}/fundamentals/PETR4",
headers={"X-API-Key": API_KEY}
)
data = r.json()
print(f"P/L: {data['pl']}") # 5.32
print(f"P/VP: {data['pvp']}") # 1.42
print(f"EV/EBITDA: {data['ev_ebitda']}") # 3.27
print(f"ROE: {data['roe']}%") # 26.6%
print(f"Net Margin: {data['net_margin']}%") # 22.23%
print(f"Mkt Cap: R${data['market_cap']:,.0f}")
A resposta inclui preço atual, market cap, e todos os indicadores de valuation, endividamento, eficiência e rentabilidade.
O cálculo usa TTM automaticamente — se a empresa publicou ITR Q3 2025 e DFP 2024, a API combina os dois para gerar o valor dos últimos 12 meses.
Para dividend yield, use o endpoint /dividends/{ticker} separadamente.
2. Comparar múltiplas ações
Quer comparar os fundamentos de várias empresas? Basta iterar:
tickers = ["PETR4", "VALE3", "ITUB4", "WEGE3", "ABEV3"]
for ticker in tickers:
r = httpx.get(
f"{BASE}/fundamentals/{ticker}",
headers={"X-API-Key": API_KEY}
)
d = r.json()
print(f"{ticker:6} P/L={d['pl']:>6} P/VP={d['pvp']:>5} ROE={d['roe']}%")
# PETR4 P/L= 5.32 P/VP= 1.42 ROE=26.6%
# VALE3 P/L= 27.31 P/VP= 1.75 ROE=6.41%
# ITUB4 P/L= 9.99 P/VP= 2.13 ROE=21.32%
# WEGE3 P/L= 28.46 P/VP=10.39 ROE=39.5%
# ABEV3 P/L= 14.13 P/VP= 3.85 ROE=18.82%
3. Histórico trimestral
O endpoint /fundamentals/{ticker}/history retorna os fundamentos trimestrais dos últimos 11 anos,
cada um com TTM normalizado. Ideal para visualizar a evolução de um indicador:
# Evolução do P/L da Petrobras nos últimos 3 anos
r = httpx.get(
f"{BASE}/fundamentals/PETR4/history",
params={"limit": 12},
headers={"X-API-Key": API_KEY}
)
for item in r.json()["history"]:
print(f"{item['reference_date']} P/L={item['pl']:6} ROE={item['roe']}%")
# 2025-12-31 P/L= 5.32 ROE=26.6%
# 2025-09-30 P/L= 4.89 ROE=28.1%
# 2025-06-30 P/L= 5.01 ROE=27.3%
# ...
4. Dados brutos para criar seus próprios indicadores
Se os 27 indicadores padrão não bastam, o endpoint /financials/{ticker} retorna todas as contas CVM brutas
— DRE, balanço patrimonial, DFC, DVA. Você pode calcular qualquer indicador personalizado:
# Buscar receita líquida (conta 3.01) e lucro bruto (3.03)
r = httpx.get(
f"{BASE}/financials/PETR4",
params={
"statement_type": "DRE",
"report_type": "DFP",
"limit": 100
},
headers={"X-API-Key": API_KEY}
)
contas = r.json()["data"]
for c in contas:
if c["account_code"] in ("3.01", "3.03", "3.05"):
print(f"{c['account_code']} {c['account_name']:45} {c['value']:>15,.0f}")
# 3.01 Receita de Venda de Bens e/ou Serviços 497,549,000
# 3.03 Resultado Bruto 236,804,000
# 3.05 Result. Antes do Result. Financeiro 145,628,000
5. Export para CSV
Todos os endpoints suportam ?format=csv. Útil para importar direto no Excel, pandas ou Google Sheets:
# Baixar histórico de preços como CSV
r = httpx.get(
f"{BASE}/stocks/PETR4/history",
params={"format": "csv", "limit": 1000},
headers={"X-API-Key": API_KEY}
)
with open("petr4_precos.csv", "w") as f:
f.write(r.text)
# Ou direto no pandas:
import pandas as pd
from io import StringIO
df = pd.read_csv(StringIO(r.text))
print(df.head())
6. FIIs e dividendos
A API também cobre 400+ FIIs com P/VP, DY mensal e distribuições, e dividendos de todas as ações:
# Fundamentos de um FII
r = httpx.get(
f"{BASE}/fiis/HGLG11",
headers={"X-API-Key": API_KEY}
)
fii = r.json()
print(f"P/VP: {fii['pvp']} DY 12m: {fii['dividend_yield_ttm']}%")
# Dividendos de uma ação
r = httpx.get(
f"{BASE}/dividends/PETR4",
headers={"X-API-Key": API_KEY}
)
div = r.json()
print(f"DY TTM: {div['dividend_yield_ttm']}%")
print(f"Total por ano:")
for year in div["annual_summary"]:
print(f" {year['year']}: R${year['total_per_share']:.2f}/ação")
Indicadores disponíveis
A API calcula 27 indicadores fundamentalistas com normalização TTM:
De onde vêm os dados?
Todos os dados são extraídos de fontes oficiais brasileiras:
- B3 — preços diários (COTAHIST), dividendos, número de ações, eventos corporativos
- CVM — demonstrações financeiras (DFP/ITR), composição de capital, relatórios de FIIs
- BCB — indicadores macro (SELIC, IPCA, CDI, USD/BRL)
O pipeline ETL roda diariamente para preços e macro, e semanalmente para balanços e dividendos. A acurácia dos indicadores é de 96% comparado com plataformas como Fundamentus.
Leia também
- Alternativa ao Fundamentus: API oficial da B3 — benchmark de precisão e guia de migração do scraping para API REST
- P/L (Preço/Lucro): como calcular via API da B3 — fórmula, metodologia TTM e screening em Python
- bolsai vs brapi: comparação honesta das APIs da B3 — cobertura, preços, precisão e MCP lado a lado
- Como montar uma carteira de dividendos com Python — screening de dividendos, histórico de proventos e análise de sustentabilidade
- Documentação completa — todos os endpoints, parâmetros e exemplos
Comece agora
O plano gratuito dá 200 requisições por dia — o suficiente para testar, prototipar e decidir se a API atende suas necessidades. O plano Pro (R$49/mês) libera 10.000 requisições, dados históricos e todos os endpoints.