APIs de odds para apostas: as melhores
Se você quer construir qualquer coisa relacionada a apostas esportivas — bot, dashboard, modelo de ML — precisa de uma fonte de odds confiável. Aqui está o comparativo
Por que isso é importante
APIs de odds para apostas: as melhores. Se você quer construir qualquer coisa relacionada a apostas esportivas — bot, dashboard, modelo de ML — precisa de uma fonte de odds confiável. Aqui está o comparativo real das melhores APIs disponíveis pra devs.
Galera, antes de qualquer linha de código sobre apostas, você precisa resolver uma coisa: de onde vêm as odds. Dá pra usar scraping em alguns casos, mas APIs são mais rápidas, mais estáveis e muito mais fáceis de manter. O problema é que as opções são muitas e os detalhes importam.
Aviso padrão: este conteúdo é técnico e educacional. Não é incentivo a apostas. Verifique a legislação do seu país antes de qualquer integração voltada a apostas reais.
Por que usar APIs de odds
APIs de odds resolvem três problemas ao mesmo tempo. Primeiro, você tem dados estruturados e normalizados — sem precisar parsear HTML de dez casas diferentes com layouts que mudam toda semana. Segundo, muitas delas agregam odds de várias bookmakers numa única chamada, o que é ouro para detecção de arbitragem. Terceiro, a maioria tem histórico de odds, não só o valor atual — e dados históricos são o que alimenta modelos de ML.
A desvantagem é custo. Planos pagos são caros para quem está começando. Por isso, a escolha certa depende do seu volume de requests e do seu orçamento.
The Odds API — a mais popular entre devs
The Odds API é a mais usada pela comunidade de devs. Documentação clara, SDKs não-oficiais pra várias linguagens, cobertura de mais de 40 esportes e centenas de ligas. O plano gratuito tem 500 requests por mês — suficiente pra testar, apertado pra produção.
O ponto forte dela é a agregação: uma chamada retorna odds de até 40+ bookmakers ao mesmo tempo. Pra detectar oportunidades de arbitragem entre casas, isso é exatamente o que você precisa. Os planos pagos vão de US$ 79/mês (30k requests) até US$ 599/mês (unlimited).
# Python 3.11+
# Exemplo completo de request na The Odds API
import requests
import os
from pprint import pprint
API_KEY = os.getenv("ODDS_API_KEY")
BASE_URL = "https://api.the-odds-api.com/v4"
def get_sports() -> list[dict]:
"""Lista todos os esportes disponíveis."""
resp = requests.get(
f"{BASE_URL}/sports",
params={"apiKey": API_KEY},
timeout=10
)
resp.raise_for_status()
return resp.json()
def get_odds(
sport: str,
regions: str = "eu",
markets: str = "h2h,totals",
bookmakers: str | None = None
) -> list[dict]:
"""
Busca odds atuais para um esporte.
Parâmetros:
- regions: eu (Europa), uk, us, au
- markets: h2h (1x2), spreads, totals, outrights
- bookmakers: lista separada por vírgula (opcional)
"""
params = {
"apiKey": API_KEY,
"regions": regions,
"markets": markets,
"oddsFormat": "decimal",
"dateFormat": "iso",
}
if bookmakers:
params["bookmakers"] = bookmakers
resp = requests.get(f"{BASE_URL}/sports/{sport}/odds", params=params, timeout=15)
resp.raise_for_status()
print(f"Requests usados: {resp.headers.get('x-requests-used', '?')}")
print(f"Requests restantes: {resp.headers.get('x-requests-remaining', '?')}")
return resp.json()
# Uso real
if __name__ == "__main__":
odds = get_odds(
sport="soccer_brazil_campeonato",
regions="eu",
markets="h2h"
)
print(f"\n{len(odds)} jogos encontrados")
if odds:
pprint(odds[0]) # mostra o primeiro eventoBetFair Exchange API
A BetFair não é uma casa de apostas tradicional — é uma exchange. Você aposta contra outros usuários, não contra a casa. A API deles é uma das mais completas do mercado: odds ao vivo, volume por seleção, dados de mercado em tempo real. Pra estratégias de trading de odds (comprar e vender posições), é a referência.
O acesso à API é gratuito para clientes BetFair com conta ativa. A complexidade é maior — a autenticação usa certificados TLS e o modelo de dados é mais elaborado. Não é pra quem está começando, mas é poderosa quando você domina.
# Python 3.11+
# Autenticação básica na BetFair API
# Requer conta BetFair e certificado TLS
import requests
import json
BETFAIR_ENDPOINT = "https://api.betfair.com/exchange/betting/json-rpc/v1"
LOGIN_URL = "https://identitysso-cert.betfair.com/api/certlogin"
def betfair_login(username: str, password: str, app_key: str) -> str:
"""
Autentica na BetFair e retorna o session token.
Requer certificado TLS em /path/to/client-2048.crt e .key
"""
resp = requests.post(
LOGIN_URL,
data={"username": username, "password": password},
headers={"X-Application": app_key, "Content-Type": "application/x-www-form-urlencoded"},
cert=("/path/to/client-2048.crt", "/path/to/client-2048.key"),
timeout=10
)
data = resp.json()
if data.get("loginStatus") != "SUCCESS":
raise ValueError(f"Login falhou: {data.get('loginStatus')}")
return data["sessionToken"]
def list_events(session_token: str, app_key: str, event_type_id: str = "1") -> list[dict]:
"""
Lista eventos disponíveis.
event_type_id: 1=futebol, 2=tênis, 4=cricket, etc.
"""
body = {
"jsonrpc": "2.0",
"method": "SportsAPING/v1.0/listEvents",
"params": {
"filter": {"eventTypeIds": [event_type_id]}
}
}
resp = requests.post(
BETFAIR_ENDPOINT,
data=json.dumps(body),
headers={
"X-Application": app_key,
"X-Authentication": session_token,
"Content-Type": "application/json"
},
timeout=15
)
return resp.json().get("result", [])Pinnacle API
Pinnacle é conhecida por ter as melhores odds do mercado e aceitar apostadores profissionais sem fechar conta. A API deles é REST, bem documentada e retorna odds históricas além das atuais. O acesso é para parceiros e afiliados aprovados — não é aberta ao público como a The Odds API. Mas os dados são superiores em qualidade para análise estatística.
Comparativo de preços e limites
The Odds API
Agregador multi-bookmaker. A mais fácil de começar para devs independentes.
+ Prós
- • Plano gratuito com 500 req/mês para testes
- • Agrega 40+ bookmakers numa chamada só
- • Documentação excelente e SDKs disponíveis
- • Dados históricos de odds disponíveis
− Contras
- • Planos pagos são caros (US$ 79-599/mês)
- • Rate limiting agressivo nos planos menores
- • Dados ao vivo têm delay de 1-2 minutos no plano básico
BetFair Exchange API
API de exchange de apostas com dados ao vivo em tempo real.
+ Prós
- • Gratuita para clientes BetFair com conta ativa
- • Dados ao vivo com latência baixíssima
- • Histórico completo de odds e volumes de mercado
- • Ideal para trading de odds
− Contras
- • Requer conta e aprovação da BetFair
- • Autenticação com certificado TLS é complexa
- • Curva de aprendizado alta — modelo de dados diferente
Pinnacle API
API da casa com melhores odds do mercado. Dados premium.
+ Prós
- • Odds históricas de alta qualidade para ML
- • Linhas de movimento de odds detalhadas
- • Casa que não fecha conta de apostador profissional
− Contras
- • Acesso apenas para parceiros aprovados
- • Sem plano público ou self-service
- • Não agrega outras bookmakers
Como integrar no seu projeto
Independente da API escolhida, o padrão de integração é o mesmo: uma classe cliente que encapsula os requests, tratamento de erros e rate limiting, e um modelo de dados normalizado que abstrai as diferenças de formato entre as APIs.
# Python 3.11+
# odds_client.py — cliente genérico com retry e rate limiting
import time
import requests
from functools import wraps
from typing import Callable
def retry_on_error(max_retries: int = 3, delay: float = 1.0):
"""Decorator para retry automático em erros de rede."""
def decorator(func: Callable):
@wraps(func)
def wrapper(*args, **kwargs):
last_exc = None
for attempt in range(max_retries):
try:
return func(*args, **kwargs)
except requests.exceptions.RequestException as e:
last_exc = e
if attempt < max_retries - 1:
wait = delay * (2 ** attempt) # exponential backoff
print(f"Tentativa {attempt + 1} falhou. Aguardando {wait}s...")
time.sleep(wait)
raise last_exc
return wrapper
return decorator
class OddsAPIClient:
"""Cliente para The Odds API com rate limiting integrado."""
BASE_URL = "https://api.the-odds-api.com/v4"
def __init__(self, api_key: str, requests_per_second: float = 2.0):
self.api_key = api_key
self.min_interval = 1.0 / requests_per_second
self._last_request = 0.0
self.session = requests.Session()
def _throttle(self) -> None:
"""Garante intervalo mínimo entre requests."""
elapsed = time.time() - self._last_request
if elapsed < self.min_interval:
time.sleep(self.min_interval - elapsed)
self._last_request = time.time()
@retry_on_error(max_retries=3)
def get_odds(self, sport: str, **params) -> list[dict]:
"""Busca odds com throttling e retry automático."""
self._throttle()
resp = self.session.get(
f"{self.BASE_URL}/sports/{sport}/odds",
params={"apiKey": self.api_key, "oddsFormat": "decimal", **params},
timeout=15
)
resp.raise_for_status()
return resp.json()
# Uso
# client = OddsAPIClient(api_key=os.getenv("ODDS_API_KEY"))
# odds = client.get_odds("soccer_brazil_campeonato", regions="eu", markets="h2h")