Pular para o conteúdo
Desenvolvimento

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
# 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 evento

BetFair 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
# 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
# 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")