# Python URL: /docs/examples/python.mdx Integre a API brapi.dev em suas aplicações Python usando a biblioteca requests. Exemplos práticos para buscar cotações de ações da B3. *** title: 'Python' description: >- Integre a API brapi.dev em suas aplicações Python usando a biblioteca requests. Exemplos práticos para buscar cotações de ações da B3. full: false keywords: brapi, api, python, requests, cotações, B3 openGraph: title: Integração Python - brapi.dev description: Exemplos de integração usando Python e requests type: website locale: pt\_BR lastUpdated: '2025-10-12T17:30:00.000Z' lang: pt-BR ----------- 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: ```bash 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:** ```python 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](/docs/sdks/python)** *** ## Integração Manual (Sem SDK) Se preferir usar requests diretamente, veja os exemplos abaixo. ## Por Que Python para Análise Financeira? ```python 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 ```python 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 ```python 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 ```python 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 ```python 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 ```python 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 ```python from flask import Flask, jsonify import os app = Flask(__name__) BRAPI_TOKEN = os.environ.get('BRAPI_TOKEN') @app.route('/api/quote/') 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 1. **Use variáveis de ambiente** para o token 2. **Implemente timeout** nas requisições 3. **Trate erros** adequadamente 4. **Use sessões** para melhor performance 5. **Feche conexões** quando não precisar mais ## Variáveis de Ambiente ```python 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](/docs/examples) * Veja a [documentação completa](/docs) * Confira os [endpoints disponíveis](/docs/acoes)