Exemplos
Python
Integre a API brapi.dev em suas aplicações Python usando nossa SDK oficial ou biblioteca requests.
🎉 SDK Oficial Disponível!
A brapi.dev agora oferece uma SDK oficial Python 3.8+ que facilita muito a integração:
pip install brapi
Vantagens da SDK:
- ✅ Type hints completos
- ✅ Suporte síncrono e assíncrono
- ✅ Tratamento de erros automático
- ✅ Retry inteligente
- ✅ Integração com asyncio e aiohttp
Exemplo rápido:
from brapi import Brapi
client = Brapi(api_key="seu_token")
quote = client.quote.retrieve(tickers="PETR4")
print(quote.results[0].regular_market_price)
📚 Ver documentação completa da SDK
Integração Manual (Sem SDK)
Se preferir usar requests diretamente, veja os exemplos abaixo.
Por Que Python para Análise Financeira?
import requests
token = 'SEU_TOKEN'
ticker = 'PETR4'
url = f'https://brapi.dev/api/quote/{ticker}?token={token}'
response = requests.get(url)
data = response.json()
print(data)
Com Tratamento de Erros
import requests
from typing import Dict, Optional
def get_quote(ticker: str, token: str) -> Optional[Dict]:
"""
Busca cotação de um ativo na B3
Args:
ticker: Código do ativo (ex: 'PETR4')
token: Token da API brapi.dev
Returns:
Dicionário com dados da cotação ou None em caso de erro
"""
url = f'https://brapi.dev/api/quote/{ticker}?token={token}'
try:
response = requests.get(url, timeout=10)
response.raise_for_status()
return response.json()
except requests.exceptions.RequestException as e:
print(f'Erro ao buscar cotação: {e}')
return None
# Uso
token = 'SEU_TOKEN'
data = get_quote('PETR4', token)
if data and 'results' in data:
quote = data['results'][0]
print(f"{quote['symbol']}: R$ {quote['regularMarketPrice']:.2f}")
print(f"Variação: {quote['regularMarketChangePercent']:.2f}%")
Múltiplos Tickers
def get_multiple_quotes(tickers: list[str], token: str) -> Optional[Dict]:
"""Busca cotações de múltiplos ativos"""
tickers_param = ','.join(tickers)
url = f'https://brapi.dev/api/quote/{tickers_param}?token={token}'
try:
response = requests.get(url, timeout=10)
response.raise_for_status()
return response.json()
except requests.exceptions.RequestException as e:
print(f'Erro: {e}')
return None
# Uso
tickers = ['PETR4', 'VALE3', 'ITUB4']
data = get_multiple_quotes(tickers, token)
if data:
for quote in data['results']:
print(f"{quote['symbol']}: R$ {quote['regularMarketPrice']:.2f}")
Classe Cliente
import requests
from typing import Dict, List, Optional
from dataclasses import dataclass
from datetime import datetime
@dataclass
class Quote:
"""Representa uma cotação de ativo"""
symbol: str
short_name: str
regular_market_price: float
regular_market_change: float
regular_market_change_percent: float
currency: str
market_cap: Optional[float] = None
@classmethod
def from_dict(cls, data: Dict) -> 'Quote':
return cls(
symbol=data['symbol'],
short_name=data['shortName'],
regular_market_price=data['regularMarketPrice'],
regular_market_change=data['regularMarketChange'],
regular_market_change_percent=data['regularMarketChangePercent'],
currency=data['currency'],
market_cap=data.get('marketCap')
)
class BrapiClient:
"""Cliente para a API brapi.dev"""
BASE_URL = 'https://brapi.dev/api'
def __init__(self, token: str):
self.token = token
self.session = requests.Session()
self.session.headers.update({
'User-Agent': 'Python BrapiClient/1.0'
})
def get_quote(self, ticker: str) -> Optional[Quote]:
"""Busca cotação de um ativo"""
url = f'{self.BASE_URL}/quote/{ticker}'
params = {'token': self.token}
try:
response = self.session.get(url, params=params, timeout=10)
response.raise_for_status()
data = response.json()
if data.get('results'):
return Quote.from_dict(data['results'][0])
return None
except requests.exceptions.RequestException as e:
print(f'Erro ao buscar {ticker}: {e}')
return None
def get_multiple_quotes(self, tickers: List[str]) -> List[Quote]:
"""Busca cotações de múltiplos ativos"""
tickers_param = ','.join(tickers)
url = f'{self.BASE_URL}/quote/{tickers_param}'
params = {'token': self.token}
try:
response = self.session.get(url, params=params, timeout=10)
response.raise_for_status()
data = response.json()
return [Quote.from_dict(item) for item in data.get('results', [])]
except requests.exceptions.RequestException as e:
print(f'Erro ao buscar cotações: {e}')
return []
def __enter__(self):
return self
def __exit__(self, *args):
self.session.close()
# Uso
with BrapiClient('SEU_TOKEN') as client:
# Cotação única
quote = client.get_quote('PETR4')
if quote:
print(f'{quote.symbol}: R$ {quote.regular_market_price:.2f}')
print(f'Variação: {quote.regular_market_change_percent:.2f}%')
# Múltiplas cotações
quotes = client.get_multiple_quotes(['PETR4', 'VALE3', 'ITUB4'])
for quote in quotes:
print(f'{quote.symbol}: R$ {quote.regular_market_price:.2f}')
Salvando em CSV
import csv
from datetime import datetime
def save_quotes_to_csv(tickers: List[str], token: str, filename: str):
"""Salva cotações em arquivo CSV"""
with BrapiClient(token) as client:
quotes = client.get_multiple_quotes(tickers)
if not quotes:
print('Nenhuma cotação obtida')
return
with open(filename, 'w', newline='', encoding='utf-8') as csvfile:
fieldnames = [
'timestamp', 'symbol', 'short_name', 'price',
'change', 'change_percent', 'currency'
]
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
writer.writeheader()
timestamp = datetime.now().isoformat()
for quote in quotes:
writer.writerow({
'timestamp': timestamp,
'symbol': quote.symbol,
'short_name': quote.short_name,
'price': quote.regular_market_price,
'change': quote.regular_market_change,
'change_percent': quote.regular_market_change_percent,
'currency': quote.currency
})
print(f'Cotações salvas em {filename}')
# Uso
tickers = ['PETR4', 'VALE3', 'ITUB4', 'BBDC4']
save_quotes_to_csv(tickers, 'SEU_TOKEN', 'quotes.csv')
Com Pandas
import pandas as pd
def get_quotes_dataframe(tickers: List[str], token: str) -> pd.DataFrame:
"""Retorna cotações como DataFrame do pandas"""
with BrapiClient(token) as client:
quotes = client.get_multiple_quotes(tickers)
if not quotes:
return pd.DataFrame()
data = [{
'symbol': q.symbol,
'name': q.short_name,
'price': q.regular_market_price,
'change': q.regular_market_change,
'change_percent': q.regular_market_change_percent,
'currency': q.currency,
'market_cap': q.market_cap
} for q in quotes]
return pd.DataFrame(data)
# Uso
df = get_quotes_dataframe(['PETR4', 'VALE3', 'ITUB4'], 'SEU_TOKEN')
print(df)
# Salvar em Excel
df.to_excel('quotes.xlsx', index=False)
Aplicação Flask
from flask import Flask, jsonify
import os
app = Flask(__name__)
BRAPI_TOKEN = os.environ.get('BRAPI_TOKEN')
@app.route('/api/quote/<ticker>')
def get_quote_api(ticker):
"""Endpoint para buscar cotação"""
with BrapiClient(BRAPI_TOKEN) as client:
quote = client.get_quote(ticker)
if not quote:
return jsonify({'error': 'Quote not found'}), 404
return jsonify({
'symbol': quote.symbol,
'name': quote.short_name,
'price': quote.regular_market_price,
'change_percent': quote.regular_market_change_percent
})
if __name__ == '__main__':
app.run(debug=True)
Boas Práticas
- Use variáveis de ambiente para o token
- Implemente timeout nas requisições
- Trate erros adequadamente
- Use sessões para melhor performance
- Feche conexões quando não precisar mais
Variáveis de Ambiente
import os
from dotenv import load_dotenv
load_dotenv() # Carrega .env
token = os.environ.get('BRAPI_TOKEN')
if not token:
raise ValueError('BRAPI_TOKEN não configurado')
Arquivo .env
:
BRAPI_TOKEN=seu_token_aqui
Próximos Passos
- Explore outros exemplos
- Veja a documentação completa
- Confira os endpoints disponíveis