Nesta página
SDK oficial da brapi para Python 3.8 ou mais novo. Tem type hints para parâmetros e respostas, clientes síncrono e assíncrono, retry e exceções por status HTTP. O SDK é gerado a partir do OpenAPI.
pip install brapi
# Opcional: aiohttp no cliente assíncrono
pip install brapi[aiohttp]O transporte padrão é o httpx, com HTTP/2 e pool de conexões.
Guarde sua chave em um arquivo .env e carregue com python-dotenv:
BRAPI_API_KEY=sua_chaveimport os
from dotenv import load_dotenv
from brapi import Brapi
load_dotenv()
client = Brapi(api_key=os.environ.get("BRAPI_API_KEY"))quote = client.quote.retrieve(tickers="PETR4")
print(quote.results[0].regular_market_price)
# Vários tickers em uma chamada
quotes = client.quote.retrieve(tickers="PETR4,VALE3,ITUB4")
for stock in quotes.results:
print(f"{stock.symbol}: R$ {stock.regular_market_price}")client = Brapi(
api_key=os.environ.get("BRAPI_API_KEY"),
environment="production", # 'production' ou 'sandbox'
max_retries=2, # padrão: 2
timeout=60.0, # em segundos, padrão: 60
)Crie um cliente e use o mesmo em todo o app.
quote = client.quote.retrieve(tickers="PETR4")
stock = quote.results[0]
print(stock.symbol, stock.short_name)
print(stock.regular_market_price, stock.regular_market_change_percent)
quote_with_data = client.quote.retrieve(
tickers="PETR4",
modules="summaryProfile,balanceSheetHistory",
)stocks = client.quote.list(page=1, limit=50)
for stock in stocks.stocks:
print(f"{stock.stock}: {stock.name} ({stock.type})")crypto = client.crypto.retrieve(coin="BTC")
cryptos = client.crypto.available()
currency = client.currency.retrieve(currency="USD-BRL")
print(f"Dólar: R$ {currency.ask}")
currencies = client.currency.available()
inflation = client.inflation.retrieve(country="brazil")
inflation_countries = client.inflation.available()
selic = client.prime_rate.retrieve(country="brazil")
prime_rate_countries = client.prime_rate.available()inflation e prime_rate chamam endpoints descontinuados. Use os dados de
macroeconomia. Veja Versionamento.
Use async with para fechar o cliente no fim:
import asyncio
from brapi import AsyncBrapi
async def main():
async with AsyncBrapi(api_key="sua_chave") as client:
quote = await client.quote.retrieve(tickers="PETR4")
print(quote.results[0].regular_market_price)
asyncio.run(main())Sem async with, chame await client.close() no fim.
Para usar aiohttp, passe http_client=DefaultAioHttpClient():
from brapi import AsyncBrapi, DefaultAioHttpClient
async with AsyncBrapi(
api_key="sua_chave",
http_client=DefaultAioHttpClient(),
) as client:
quote = await client.quote.retrieve(tickers="PETR4")Várias requisições em paralelo:
async with AsyncBrapi(api_key="sua_chave") as client:
results = await asyncio.gather(
client.quote.retrieve(tickers="PETR4"),
client.quote.retrieve(tickers="VALE3"),
client.quote.retrieve(tickers="ITUB4"),
)Cada chamada em paralelo conta no limite de requisições simultâneas do seu
plano. Para vários tickers, uma chamada com tickers="PETR4,VALE3,ITUB4" usa
só uma requisição.
from brapi import (
APIError,
AuthenticationError,
NotFoundError,
RateLimitError,
)
try:
quote = client.quote.retrieve(tickers="INVALID")
except NotFoundError as e:
print(f"Ticker não encontrado: {e}")
except RateLimitError as e:
print(f"Limite de requisições: {e}")
except AuthenticationError as e:
print(f"Chave inválida: {e}")
except APIError as e:
print(f"Erro na API: {e}")| Status | Exceção | Causa |
|---|---|---|
| 400 | BadRequestError | Requisição inválida. |
| 401 | AuthenticationError | Chave ausente ou inválida. |
| 403 | PermissionDeniedError | O plano não inclui o recurso. |
| 404 | NotFoundError | Recurso não encontrado. |
| 422 | UnprocessableEntityError | Parâmetros inválidos. |
| 429 | RateLimitError | Cota ou limite de requisições simultâneas. |
| 5xx | InternalServerError | Erro no servidor. |
| N/A | APIConnectionError | Falha de conexão. |
client = Brapi(
api_key="sua_chave",
max_retries=0, # desliga o retry
timeout=10.0, # 10 segundos para todas as requisições
)
# Timeout de uma requisição
quote = client.quote.retrieve(tickers="PETR4", timeout=5.0)from fastapi import FastAPI, HTTPException
from brapi import AsyncBrapi, NotFoundError
app = FastAPI()
client = AsyncBrapi(api_key="sua_chave")
@app.get("/api/quote/{ticker}")
async def get_quote(ticker: str):
try:
quote = await client.quote.retrieve(tickers=ticker)
return {
"symbol": quote.results[0].symbol,
"price": quote.results[0].regular_market_price,
}
except NotFoundError:
raise HTTPException(status_code=404, detail="Ticker not found")
@app.on_event("shutdown")
async def shutdown():
await client.close()from flask import Flask, jsonify
from brapi import Brapi, NotFoundError
app = Flask(__name__)
client = Brapi(api_key="sua_chave")
@app.route("/api/quote/<ticker>")
def get_quote(ticker):
try:
quote = client.quote.retrieve(tickers=ticker)
return jsonify({
"symbol": quote.results[0].symbol,
"price": quote.results[0].regular_market_price,
})
except NotFoundError:
return jsonify({"error": "Ticker not found"}), 404import pandas as pd
quote = client.quote.retrieve(tickers="PETR4,VALE3,ITUB4")
df = pd.DataFrame([
{
"symbol": stock.symbol,
"name": stock.short_name,
"price": stock.regular_market_price,
"change_percent": stock.regular_market_change_percent,
}
for stock in quote.results
])
df.to_excel("cotacoes.xlsx", index=False)from brapi.types import QuoteRetrieveResponse
quote: QuoteRetrieveResponse = client.quote.retrieve(tickers="PETR4")
price: float = quote.results[0].regular_market_price