APIs de Odds Esportivas: Guia Completo pra
Já perdi horas testando APIs de odds que prometiam tudo e entregavam pouco. Aqui vai o guia honesto — preço, cobertura, latência e qual usar dependendo do seu
Resumo rápido
APIs de Odds Esportivas: Guia Completo pra. Já perdi horas testando APIs de odds que prometiam tudo e entregavam pouco. Aqui vai o guia honesto — preço, cobertura, latência e qual usar dependendo do seu projeto.
Se você tá construindo qualquer coisa relacionada a apostas esportivas — bot, dashboard, comparador de odds, modelo preditivo — vai precisar de dados. E dados bons de odds não são fáceis de conseguir.
Testei mais de dez APIs nos últimos meses. Algumas são ótimas. Outras são armadilha: documentação bonita, dados horríveis. Vou te poupar esse trabalho e contar exatamente o que funciona.
Por que usar APIs em vez de scraping
Galera, eu sei que a tentação de fazer scraping é grande. É grátis, né? Mas depois de manter scrapers de odds por meses, te digo: o custo oculto é enorme. Sites mudam HTML toda semana, anti-bot fica cada vez mais agressivo, e você gasta mais tempo mantendo scraper do que construindo produto.
APIs resolvem tudo isso. Dados estruturados, uptime garantido, documentação decente e — o mais importante — você não viola termos de uso de ninguém. Se ainda assim precisar de scraping, confira nosso guia de web scraping de sites de apostas.
Top 5 APIs de odds esportivas pra devs
1. The Odds API
Minha recomendação pra quem tá começando. Interface simples, documentação excelente, e o plano gratuito de 500 requests por mês dá pra prototipar tranquilo. Cobre mais de 40 esportes e puxa odds de dezenas de casas de uma vez.
The Odds API — Detalhes
- Preço: Free (500 req/mês), $14.99/mês (10k req), $49.99/mês (100k req)
- Esportes: 40+ incluindo futebol, basquete, tênis, NFL, NHL
- Casas cobertas: 20+ incluindo Bet365, Betfair, Pinnacle, 1xBet
- Mercados: H2H, spreads, totals (over/under)
- Latência: 1-5 segundos (dados near-real-time, não tick-by-tick)
- Formato: JSON via REST. Sem SDK oficial, mas exemplos em Python/JS
- Nota: ótima pra começar, mas não tem dados históricos de odds
import requests
def get_the_odds_api(sport="soccer_brazil_serie_a"):
"""Exemplo básico de uso da The Odds API."""
url = f"https://api.the-odds-api.com/v4/sports/{sport}/odds"
params = {
"apiKey": "SUA_API_KEY",
"regions": "eu",
"markets": "h2h",
"oddsFormat": "decimal"
}
response = requests.get(url, params=params)
data = response.json()
# Mostra odds do primeiro jogo
if data:
game = data[0]
print(f"{game['home_team']} vs {game['away_team']}")
for book in game["bookmakers"]:
outcomes = {o["name"]: o["price"] for o in book["markets"][0]["outcomes"]}
print(f" {book['key']}: {outcomes}")
return data2. Betfair Exchange API
A Betfair é diferente das outras casas — é uma exchange, tipo uma bolsa de valores pra apostas. Isso significa que você tá apostando contra outros apostadores, não contra a casa. A API reflete isso e dá acesso a dados únicos: odds bid/ask, volume negociado, profundidade do mercado.
Pra quem quer fazer trading esportivo (comprar e vender posições durante o jogo), a Betfair é obrigatória. O ponto negativo é que a API é complexa. A documentação não é das melhores. Mas os dados são de outra categoria.
Betfair Exchange API — Detalhes
- Preço: grátis com conta Betfair ativa. Rate limit generoso (5 req/segundo)
- Esportes: foco em futebol, corrida de cavalos, tênis, críquete
- Diferencial: dados de exchange (volume, bid/ask, matched bets)
- Mercados: centenas por jogo — resultado, gols, handicap, cantos, cartões
- Latência: sub-segundo (dados de exchange em tempo real)
- Formato: JSON via REST, autenticação via certificado SSL
- Nota: curva de aprendizado alta, mas dados incomparáveis pra trading in-play
3. Pinnacle API
Pinnacle é considerada a sharp bookmaker — a casa que os profissionais usam como referência. As odds da Pinnacle são usadas como benchmark no mercado inteiro. Se as odds de Pinnacle dizem uma coisa e outra casa diz diferente, a Pinnacle provavelmente tá mais perto da realidade.
A API é limpa e simples. O problema é que só funciona se você tem conta ativa e em algumas regiões Pinnacle é bloqueada. Mas se tiver acesso, as odds deles como feature num modelo de ML valem ouro.
4. Sportradar
Nível enterprise. A Sportradar fornece dados pra ligas oficiais, canais de TV e casas de apostas. Cobertura absurda: estatísticas ao vivo, play-by-play, dados de probabilidades pré-jogo e in-play. O preço condiz — estamos falando de planos que começam em centenas de dólares por mês.
Pra projetos pessoais? Overkill total. Pra uma startup ou produto sério? É o padrão do mercado. Eles têm um plano trial que dá pra explorar antes de comprometer grana.
5. API-Football
Se o foco é futebol e você quer estatísticas detalhadas (xG, posse, chutes, formação tática), API-Football é a melhor opção custo-benefício. Não é uma API de odds pura — é uma API de dados de futebol que complementa dados de odds perfeitamente.
API-Football — Detalhes
- Preço: Free (100 req/dia), $10/mês (200 req/dia), $25/mês (ilimitado basicamente)
- Cobertura: 900+ ligas de futebol, 2a divisão de vários países incluindo Brasil
- Dados: lineups, xG, estatísticas ao vivo, eventos (gols, cartões, substituições)
- Histórico: dados desde 2010 pra ligas principais
- Formato: JSON via REST ou via RapidAPI
- Nota: perfeita pra enriquecer dados de odds com features estatísticas pro modelo de ML
Comparativo direto
Pra prototipar / hobby
The Odds API free + API-Football free. Custo zero. Dados suficientes pra um bot básico ou modelo experimental.
+ Prós
- • Custo zero
- • Setup em minutos
- • Documentação ótima pra iniciantes
− Contras
- • Rate limits apertados
- • Sem dados históricos de odds
- • Latência não serve pra trading in-play
Pra produção / startup
Betfair API + The Odds API paid + API-Football paid. Custo de ~$60/mês. Dados robustos.
+ Prós
- • Dados de exchange + odds multi-casa
- • Volume suficiente pra operação diária
- • Estatísticas detalhadas pra features
− Contras
- • Requer conta Betfair ativa (restrição geográfica)
- • Mais complexo de integrar e manter
- • Custo mensal fixo
Tutorial: integrando com Python na prática
Vamos criar uma classe que abstrai múltiplas APIs e normaliza tudo num formato único. Na prática, você vai querer consumir dados de mais de uma fonte — e seu código não pode ficar preso ao formato de uma API específica.
from dataclasses import dataclass
from datetime import datetime
from abc import ABC, abstractmethod
import requests
@dataclass
class NormalizedOdds:
game_id: str
home_team: str
away_team: str
bookmaker: str
home_odds: float
draw_odds: float | None
away_odds: float
timestamp: datetime
source: str
class OddsProvider(ABC):
@abstractmethod
def fetch_odds(self, sport: str) -> list[NormalizedOdds]:
pass
class TheOddsAPI(OddsProvider):
def __init__(self, api_key: str):
self.api_key = api_key
self.base_url = "https://api.the-odds-api.com/v4"
def fetch_odds(self, sport: str = "soccer_brazil_serie_a") -> list[NormalizedOdds]:
url = f"{self.base_url}/sports/{sport}/odds"
params = {
"apiKey": self.api_key,
"regions": "eu",
"markets": "h2h",
"oddsFormat": "decimal"
}
resp = requests.get(url, params=params, timeout=10)
resp.raise_for_status()
results = []
for game in resp.json():
for book in game.get("bookmakers", []):
for market in book.get("markets", []):
if market["key"] == "h2h":
outcomes = {o["name"]: o["price"] for o in market["outcomes"]}
results.append(NormalizedOdds(
game_id=game["id"],
home_team=game["home_team"],
away_team=game["away_team"],
bookmaker=book["key"],
home_odds=outcomes.get(game["home_team"], 0),
draw_odds=outcomes.get("Draw"),
away_odds=outcomes.get(game["away_team"], 0),
timestamp=datetime.fromisoformat(book["last_update"]),
source="the_odds_api"
))
return resultsAgregando odds de múltiplas fontes
O poder real aparece quando você combina dados de várias APIs. Dá pra calcular odds de consenso, detectar discrepâncias entre casas e alimentar tudo no seu modelo de forma padronizada.
class OddsAggregator:
def __init__(self, providers: list[OddsProvider]):
self.providers = providers
def fetch_all(self, sport: str) -> dict[str, list[NormalizedOdds]]:
"""Puxa odds de todos os providers e agrupa por jogo."""
all_odds = []
for provider in self.providers:
try:
all_odds.extend(provider.fetch_odds(sport))
except Exception as e:
print(f"Falha no provider {provider.__class__.__name__}: {e}")
# Agrupa por game_id
grouped = {}
for odd in all_odds:
grouped.setdefault(odd.game_id, []).append(odd)
return grouped
def consensus_odds(self, sport: str) -> dict:
"""Calcula odds de consenso (média) por jogo."""
grouped = self.fetch_all(sport)
consensus = {}
for game_id, odds_list in grouped.items():
home_avg = sum(o.home_odds for o in odds_list) / len(odds_list)
away_avg = sum(o.away_odds for o in odds_list) / len(odds_list)
draw_vals = [o.draw_odds for o in odds_list if o.draw_odds]
draw_avg = sum(draw_vals) / len(draw_vals) if draw_vals else None
consensus[game_id] = {
"home": odds_list[0].home_team,
"away": odds_list[0].away_team,
"home_odds": round(home_avg, 3),
"draw_odds": round(draw_avg, 3) if draw_avg else None,
"away_odds": round(away_avg, 3),
"num_books": len(odds_list)
}
return consensusArmazenando dados históricos
Dados de odds são voláteis. Se você não guardar, perdeu. E dados históricos de odds são ouro pra treinar modelos de ML — nenhuma API grátis oferece histórico extenso, então você precisa construir o seu.
- Crie um job que roda a cada 30-60 minutos coletando odds de todos os jogos disponíveis
- Armazene em SQLite pra começar — simples, sem setup de servidor. Migre pra PostgreSQL quando crescer
- Salve o timestamp de cada coleta. Odds de abertura vs fechamento contam histórias diferentes
- Guarde as odds por bookmaker separadamente. A média é útil, mas ter dados granulares possibilita análises mais ricas
- Comprima dados antigos (mais de 6 meses) — só precisa da odd de abertura e fechamento, não de cada tick
import sqlite3
from datetime import datetime
def save_odds(odds_list: list[NormalizedOdds], db_path: str = "odds_history.db"):
"""Salva odds coletadas em SQLite."""
conn = sqlite3.connect(db_path)
conn.execute("""
CREATE TABLE IF NOT EXISTS odds (
id INTEGER PRIMARY KEY AUTOINCREMENT,
game_id TEXT,
home_team TEXT,
away_team TEXT,
bookmaker TEXT,
home_odds REAL,
draw_odds REAL,
away_odds REAL,
source TEXT,
collected_at TEXT
)
""")
for odd in odds_list:
conn.execute(
"INSERT INTO odds VALUES (NULL, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
(odd.game_id, odd.home_team, odd.away_team, odd.bookmaker,
odd.home_odds, odd.draw_odds, odd.away_odds, odd.source,
datetime.now().isoformat())
)
conn.commit()
conn.close()Perguntas frequentes
Qual API usar se meu projeto é só sobre futebol brasileiro?
The Odds API pra odds (cobre Série A, B e Copa do Brasil) + API-Football pra estatísticas detalhadas. Essa combo dá conta de praticamente qualquer projeto focado no futebol brasileiro.
APIs de odds são grátis?
Algumas têm planos gratuitos com limitações. The Odds API dá 500 requests por mês de graça. Betfair é grátis se você tem conta. API-Football dá 100 requests por dia no free. Pra prototipagem, dá pra ir longe sem gastar nada.
Posso usar dados de API pra fins comerciais?
Depende da API. The Odds API e API-Football explicitamente permitem uso comercial nos planos pagos. Betfair tem restrições sobre redistribuição de dados. Sempre leia os termos de uso antes de lançar um produto. Na real, quando o produto começa a crescer, vale conversar direto com o provider.
Qual a latência aceitável pra um bot de apostas?
Depende da estratégia. Pra value betting pré-jogo, 1-5 segundos de latência tá ótimo. Pra trading in-play, precisa de sub-segundo — e aí só Betfair Exchange API serve. Pra arbitragem, quanto mais rápido melhor, porque as oportunidades duram segundos.