Tutorial 25 mar 2026 8 min de leitura

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:

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:

P/L P/VP EV/EBITDA EV/EBIT P/EBITDA P/EBIT P/SR ROE LPA VPA DY Net Margin EBIT Margin EBITDA Margin Gross Margin Debt/Equity Net Debt/EBITDA Net Debt/EBIT CAGR Receita 5a CAGR Lucro 5a Market Cap

De onde vêm os dados?

Todos os dados são extraídos de fontes oficiais brasileiras:

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

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.