¿Cómo crear un bot para rastrear cuotas en vivo?

¿Cuál es la API para eventos deportivos y cuotas en vivo?

La API para eventos deportivos y cuotas en vivo es una interfaz de programación que te permite recibir automáticamente datos estructurados sobre partidos, torneos, equipos y cotizaciones actuales de casas de apuestas en tiempo real. En lugar de analizar páginas HTML o actualizar información manualmente, el desarrollador se conecta a puntos finales HTTP y recibe una respuesta JSON lista con campos ya normalizados: tipo de deporte, estado del partido, puntuación actual, mercados de apuestas y sus valores.

La plataforma API de eventos deportivos-Sport proporciona un estándar de datos unificado para varias disciplinas a la vez: fútbol, hockey, baloncesto, tenis, tenis de mesa, deportes electrónicos y otros deportes que se añaden regularmente. Para cada partido, puedes obtener información básica, estadísticas avanzadas (por ejemplo, posesión, tiros, faltas) y un bloque de cuotas. oddsBase. Dentro de él hay mercados de apuestas (mercado), como 1X2, totales, hándicaps, así como una lista de resultados con coeficientes numéricos y un indicador de modo en vivo. Esto permite construir tanto displays de línea simples como sistemas analíticos complejos y bots.

Para los bots en vivo, es especialmente importante que la estructura de coeficientes incluya no solo valores actuales sino también atributos adicionales: cotizaciones iniciales, dinámica de cambios (cambiar = −1, 0 o 1), estado del mercado (activo o suspendido). Junto con campos de partidos como estado, minutoDelPartidoActual, eventosEnVivo y estadísticas detalladas, se puede construir lógica compleja: rastrear movimientos bruscos del mercado, reaccionar a goles y tarjetas rojas, resaltar partidos con actividad anormal. Basado en tal API, ya se están implementando escáneres de arbitraje profesionales, sistemas de monitoreo de márgenes y asistentes de apuestas personales, y en un futuro cercano, el ecosistema se complementará con suscripciones WebSocket y módulos de IA para un análisis más avanzado.

¿Qué API elegir para rastrear cuotas en vivo?

Al elegir una API para rastrear coeficientes en vivo, es importante evaluar no solo el precio y el conjunto básico de deportes, sino también la profundidad de los datos. Para un bot, es crítico que la API soporte un flujo en vivo estable, proporcione una estructura detallada de coeficientes, permita filtrar partidos por estado y torneos, y tenga documentación clara. De lo contrario, te enfrentarás a limitaciones: la imposibilidad de filtrar las ligas necesarias, la ausencia de un indicador de modo en vivo en los mercados, o formatos de coeficientes ambiguos que tardarán mucho tiempo en normalizarse.

У Servicio API-Sport el enfoque principal está específicamente en las tareas prácticas de desarrollo de bots y paneles analíticos. Cada deporte tiene su propio sportSlug (por ejemplo, fútbol, baloncesto, tenis), y los partidos se solicitan a través de un único punto final /v2/{sportSlug}/partidos. La respuesta contiene un array partidos, donde cada partido tiene un bloque oddsBase con mercados de apuestas, campo estado (incluido el valor en progreso para en vivo), minuto actual minutoDelPartidoActual y matriz eventosEnVivo. Esto te permite obtener tanto el contexto deportivo como la línea de cuotas actual con una sola solicitud, lo cual es extremadamente conveniente para un análisis rápido en el código del bot.

A continuación se muestra un ejemplo de una solicitud simple para obtener los partidos de fútbol en vivo actuales junto con las cuotas. El bot puede llamar a este endpoint cada pocos segundos o minutos dependiendo de la carga permitida y la lógica de estrategia:

import requests
API_KEY = "ВАШ_API_КЛЮЧ"
BASE_URL = "https://api.api-sport.ru/v2"
headers = {
    "Authorization": API_KEY,
}
params = {
    "status": "inprogress",  # только матчи, идущие прямо сейчас
}
response = requests.get(f"{BASE_URL}/football/matches", headers=headers, params=params)
response.raise_for_status()
data = response.json()
for match in data.get("matches", []):
    print(match["id"], match["status"], match.get("currentMatchMinute"))
    for market in match.get("oddsBase", []):
        if market.get("isLive"):
            print("  Рынок:", market["name"], market["group"], "live =", market["isLive"])
            for choice in market.get("choices", []):
                print("   ", choice["name"], "=>", choice["decimal"], "изменение:", choice["change"])

Este formato de datos es conveniente para el filtrado posterior: puedes limitar la lista solo a los torneos necesarios a través del parámetro torneo_id, trabajar con equipos específicos mediante equipo_id o reunir un grupo general de todos los partidos actuales en las categorías de interés (categoría_ids). Con la aparición de suscripciones WebSocket basadas en el mismo conjunto de campos, el seguimiento de la dinámica de las cuotas se volverá aún más preciso y menos intensivo en recursos: el bot recibirá actualizaciones a medida que ocurran, sin necesidad de sondear constantemente el servidor.

¿Cómo obtener una clave API y conectarse a los datos de cuotas en vivo?

Para trabajar con el bot para rastrear cuotas, se requiere una clave API personal. Se utiliza para autorizar solicitudes y contabilizar la carga. En el ecosistema API-Sport, el proceso es lo más claro posible: te registras en el sitio web, eliges una tarifa adecuada (generalmente dependiendo del volumen de solicitudes y el conjunto de deportes), después de lo cual recibes un token único. Este token debe ser pasado en el encabezado HTTP. Autorización con cada solicitud a la API, incluidos los endpoints para obtener partidos en vivo y cuotas.

Puedes obtener la clave en la cuenta personal de API-Sport. Después de la autorización, verás una sección con tu clave API actual, estadísticas de uso y una descripción de los límites. Se recomienda almacenar la clave en variables de entorno o en un archivo de configuración separado para evitar comprometerla en un repositorio público. En caso de compromiso del token, siempre puedes generar una nueva clave en el panel y desactivar instantáneamente la antigua. Este es un paso de seguridad importante, especialmente si el bot está desplegado en un servidor externo y opera las 24 horas.

A continuación se muestra un ejemplo básico de conexión a la API y verificación de que la clave funciona correctamente. Llamamos al endpoint /v2/deporte, para obtener una lista de deportes disponibles, y luego una solicitud en vivo para partidos:

import os
import requests
API_KEY = os.getenv("SPORT_API_KEY")  # храните ключ в переменной окружения
BASE_URL = "https://api.api-sport.ru/v2"
headers = {"Authorization": API_KEY}
# 1. Проверяем, что ключ валиден и получаем список видов спорта
sports_resp = requests.get(f"{BASE_URL}/sport", headers=headers)
sports_resp.raise_for_status()
print("Доступные виды спорта:")
for sport in sports_resp.json():
    print("-", sport["translations"].get("ru") or sport["name"], "(slug=", sport["slug"], ")")
# 2. Пробный запрос к лайв-матчам по хоккею
params = {"status": "inprogress"}
matches_resp = requests.get(f"{BASE_URL}/ice-hockey/matches", headers=headers, params=params)
matches_resp.raise_for_status()
matches_data = matches_resp.json()
print("Найдено лайв-матчей:", matches_data.get("totalMatches"))

Si ambas solicitudes se ejecutan sin errores y devuelven datos significativos, puedes pasar al siguiente paso: implementar la lógica del bot. En esta etapa, ya tiene sentido pensar en la estrategia para utilizar el límite de solicitudes: frecuencia de sondeo, deportes prioritarios y torneos. En el futuro, podrás transferir parcialmente la lógica del sondeo periódico a suscripciones WebSocket y filtros de IA inteligentes, pero la base siempre seguirá siendo una conexión correcta a la API a través de una clave confiable.

¿Cómo crear un bot para rastrear cuotas en vivo en Python?

Python es uno de los lenguajes más convenientes para escribir bots que trabajan con APIs de eventos deportivos y cuotas en vivo. Tiene un rico ecosistema de bibliotecas para solicitudes HTTP, trabajo con asincronía, almacenamiento de datos e integración con servicios de notificación externos. La arquitectura de un bot simple para monitorear cuotas se ve así: sondeo cíclico de la API, guardando el último estado de las cuotas en memoria (o en una base de datos), detectando cambios y reaccionando a ellos (registro, alertas, generación de señales para el usuario).

El marco mínimo de un bot en Python puede parecer un bucle infinito con un tiempo de espera, en el que solicitamos partidos en vivo para el deporte requerido a través del endpoint /v2/{sportSlug}/partidos con el parámetro estado=enprogreso. De cada partido, extraemos una matriz. oddsBase, seleccionamos los mercados de interés (por ejemplo, 1X2 o totales) y los guardamos en un diccionario, donde la clave es la combinación (matchId, marketName, choiceName). En la siguiente solicitud, comparamos el valor actual de las cuotas con el anterior, así como el campo cambiar, para entender si ha habido un aumento o disminución.

A continuación se muestra un ejemplo simplificado de tal marco. Se puede ampliar añadiendo almacenamiento en una base de datos, manejo de errores, asincronía e integración con sistemas de notificación:

import time
import requests
API_KEY = "ВАШ_API_КЛЮЧ"
BASE_URL = "https://api.api-sport.ru/v2"
POLL_INTERVAL = 10  # частота опроса в секундах
headers = {"Authorization": API_KEY}
# Хранилище предыдущих коэффициентов: (matchId, marketName, choiceName) -> decimal
last_odds = {}

def fetch_live_matches(sport_slug: str):
    params = {"status": "inprogress"}
    resp = requests.get(f"{BASE_URL}/{sport_slug}/matches", headers=headers, params=params, timeout=10)
    resp.raise_for_status()
    return resp.json().get("matches", [])

def process_match(match):
    match_id = match["id"]
    minute = match.get("currentMatchMinute")
    for market in match.get("oddsBase", []):
        if not market.get("isLive"):
            continue
        market_name = f"{market['group']} - {market['name']}"
        for choice in market.get("choices", []):
            key = (match_id, market_name, choice["name"])
            new_decimal = choice["decimal"]
            old_decimal = last_odds.get(key)
            if old_decimal is not None and new_decimal != old_decimal:
                direction = "вырос" if new_decimal > old_decimal else "упал"
                print(f"Матч {match_id} ({minute} мин.), {market_name}, {choice['name']}: коэффициент {direction} с {old_decimal} до {new_decimal}")
            last_odds[key] = new_decimal

if __name__ == "__main__":
    while True:
        try:
            matches = fetch_live_matches("football")
            for m in matches:
                process_match(m)
        except Exception as e:
            # На продакшене лучше логировать ошибку в отдельную систему
            print("Ошибка при опросе API:", e)
        time.sleep(POLL_INTERVAL)

En la práctica, complicarás este esquema: añadiendo sondeo asincrónico de varios deportes a la vez, restricciones en los torneos de interés, almacenando el historial de cuotas para análisis posteriores, así como un módulo que genera señales basadas en los datos de entrada del partido y la dinámica de las cuotas (por ejemplo, un fuerte desequilibrio en la línea, rápido crecimiento de totales, etc.). Al mismo tiempo, el acceso a los datos sigue siendo simple gracias a una API unificada y un bloque detallado oddsBase, y el desarrollo posterior del proyecto puede construirse en torno a las futuras capacidades de WebSocket y análisis de IA.

Configuración de un bot para rastrear cambios en cuotas en vivo y notificaciones.

Crear un bucle básico de sondeo de API es solo el primer paso. Para que el bot realmente ayude en la toma de decisiones de apuestas, es importante configurar de manera flexible los umbrales y las reglas para activar notificaciones. En la estructura de las cuotas de API-Sport, hay varios campos útiles: las cuotas decimales actuales decimal, el valor inicial decimalInicial, así como el indicador de la dirección del último cambio cambiar. Esto te permite registrar no solo el hecho del movimiento de la línea, sino también evaluar su fuerza en relación con el nivel inicial. Por ejemplo, si las cuotas para la victoria de un equipo aumentaron de 1.50 a 1.80, esto puede considerarse un cambio significativo y se puede enviar una señal al usuario.

Una estrategia práctica es combinar umbrales relativos y absolutos. El umbral absoluto establece la diferencia mínima entre las cuotas actuales y las últimas o iniciales (por ejemplo, un cambio de al menos 0.10). El umbral relativo se establece en porcentajes (por ejemplo, un aumento o disminución de más del 5–10 % del valor inicial). Además, puedes usar el campo suspendido del mercado: cuando se activa, el bot puede enviar una notificación separada sobre la suspensión de apuestas, lo que a menudo señala un evento importante en el partido (gol, tarjeta roja, revisión de VAR, etc.).

A continuación se muestra un ejemplo de una función que se configura a través de parámetros y determina si enviar una notificación para unas cuotas específicas. En el ejemplo, la notificación se simula mediante la salida a la consola, pero en la práctica, puedes reemplazar esto con integración con cualquier mensajero o servicio de correo electrónico:

RELATIVE_THRESHOLD = 0.05  # 5% от начального коэффициента
ABSOLUTE_THRESHOLD = 0.10  # абсолютное изменение на 0.10 и более

def should_notify(choice: dict) -> bool:
    """Определяем, стоит ли отправлять уведомление по конкретному исходу."""
    current = float(choice["decimal"])
    initial = float(choice.get("initialDecimal") or current)
    abs_diff = abs(current - initial)
    rel_diff = abs_diff / initial if initial else 0
    if abs_diff >= ABSOLUTE_THRESHOLD or rel_diff >= RELATIVE_THRESHOLD:
        return True
    # Дополнительно можно учитывать направление изменения
    # change = -1 (понижение), 0 (без изменений), 1 (повышение)
    # Например, реагировать только на сильный рост коэффициента
    if choice.get("change") == 1 and rel_diff >= 0.03:
        return True
    return False

def handle_notifications(match, market, choice):
    if not should_notify(choice):
        return
    match_id = match["id"]
    minute = match.get("currentMatchMinute")
    msg = (
        f"[АЛЕРТ] Матч {match_id}, {minute} мин."
        f"Рынок: {market['group']} - {market['name']}"
        f"Исход: {choice['name']}"
        f"Коэффициент изменился до {choice['decimal']} (старт: {choice.get('initialDecimal')})"
    )
    print(msg)

A continuación, necesitas integrar esta función en el bucle principal del bot: después de recibir cada partido y pasar por los mercados de cuotas en vivo, llamas a manejar_notificaciones para cada resultado. Como mejora, puedes añadir «anti-spam»: almacenar el tiempo de la última notificación para un resultado específico y no enviar alertas con más frecuencia que un intervalo especificado. Un módulo separado puede gestionar los canales de entrega: enviar algunos eventos instantáneamente, mientras que agrega otros en resúmenes periódicos. Gracias a que la API ya proporciona un conjunto estructurado de campos para mercados y muestras, toda esta lógica se implementa a nivel de código del bot sin necesidad de procesar HTML en bruto de los sitios de las casas de apuestas.

¿Cómo filtrar partidos y cuotas para un bot de apuestas en vivo?

Un bot de apuestas en vivo efectivo no debe rastrear absolutamente todos los partidos y todos los mercados. Esto crea una carga innecesaria en la API, complica el análisis y conduce a un flujo de notificaciones excesivas. Es mucho más razonable centrarse en ligas específicas, tipos de mercados y rangos de cuotas que correspondan a tu estrategia. Afortunadamente, API-Sport permite un ajuste fino de la muestra ya a nivel de consulta: puedes usar parámetros torneo_id, equipo_id, categoría_ids, estado y otros filtros en el endpoint. /v2/{sportSlug}/partidos. Por ejemplo, puedes recibir inmediatamente solo partidos de la Liga de Campeones y ligas nacionales de primer nivel, ignorando torneos menos significativos.

Se realiza un filtrado adicional en el código del bot basado en el array de datos. oddsBase. Aquí puedes implementar la lógica para seleccionar mercados por grupo (grupo = «1X2», «Totales», «Handicap»), período (período = «Tiempo completo», «1er tiempo»), rango de cuotas (por ejemplo, de 1.50 a 3.50) y dirección del cambio (cambiar = 1 o -1). Esto te permite centrarte en mercados con mayor volatilidad y descartar aquellos que son de poco interés para la estrategia. Por ejemplo, puedes analizar solo movimientos fuertes en totales, sin prestar atención a cambios marginales en los resultados de 1X2.

A continuación se muestra un ejemplo de una función que selecciona solo los partidos y mercados necesarios según las condiciones especificadas. Se puede utilizar dentro del bot antes del análisis y el envío de notificaciones:

TARGET_TOURNAMENTS = "7,17"  # пример: Лига чемпионов и топ-лига (ID условные)
MIN_DECIMAL = 1.5
MAX_DECIMAL = 3.5
TARGET_GROUPS = {"1X2", "Totals"}

def fetch_filtered_matches(headers):
    params = {
        "status": "inprogress",
        "tournament_id": TARGET_TOURNAMENTS,
    }
    resp = requests.get(
        "https://api.api-sport.ru/v2/football/matches",
        headers=headers,
        params=params,
        timeout=10,
    )
    resp.raise_for_status()
    return resp.json().get("matches", [])

def iter_filtered_markets(match):
    for market in match.get("oddsBase", []):
        if not market.get("isLive"):
            continue
        if market.get("group") not in TARGET_GROUPS:
            continue
        for choice in market.get("choices", []):
            dec = float(choice["decimal"])
            if MIN_DECIMAL <= dec <= MAX_DECIMAL:
                yield market, choice

Este enfoque reduce la cantidad de datos que procesa el bot, haciendo que el comportamiento del sistema sea más predecible y transparente. Puedes almacenar la configuración de filtrado en un archivo de configuración separado o incluso moverla al panel administrativo de tu propio proyecto para cambiar la estrategia sin reiniciar el código. Al escalar más —por ejemplo, al agregar nuevos deportes y mercados— será suficiente con ampliar la lista sportSlug y configurar nuevos conjuntos de filtros sin cambiar la lógica básica de trabajo con la API. api-sport.pro.

Riesgos y limitaciones al usar APIs y bots para cuotas en vivo con casas de apuestas.

El uso de bots para rastrear cuotas en vivo proporciona una ventaja significativa en velocidad de reacción, pero al mismo tiempo conlleva una serie de riesgos y limitaciones. Primero, los datos obtenidos a través de cualquier API externa siempre tienen un cierto retraso en comparación con los sistemas internos de la casa de apuestas. Incluso con una alta velocidad de actualización, la línea puede cambiar en fracciones de segundo antes de que el bot registre el movimiento y logres realizar una apuesta. Por lo tanto, la API no debe considerarse como una «fuente de verdad en el último momento» —es una herramienta para análisis y detección temprana de tendencias, no una garantía de que podrás replicar cada movimiento.

En segundo lugar, es importante considerar las reglas de casas de apuestas específicas. Muchos operadores estipulan en sus términos una prohibición o restricciones sobre la recolección automatizada de datos y apuestas masivas utilizando scripts. Aunque API-Sport proporciona datos agregados sobre cuotas y eventos de partidos, la responsabilidad de cómo utilizas esta información recae en ti. Antes de lanzar el bot, es recomendable familiarizarse con los aspectos legales en tu jurisdicción y las reglas de las casas de apuestas elegidas para evitar el bloqueo de cuentas u otras sanciones.

En tercer lugar, es necesario trabajar de manera competente con las limitaciones técnicas de la API misma: límites de solicitudes, posible indisponibilidad temporal, regulaciones de actualización de datos. El bot debe manejar correctamente los errores de red, los códigos de respuesta 4xx/5xx, no exceder el RPS permitido y tener una estrategia de respaldo en caso de fallos temporales (por ejemplo, aumentar el intervalo de sondeo o desactivar temporalmente ciertas funciones). También vale la pena recordar que ninguna API e incluso futuros canales de WebSocket o módulos de IA eliminan los riesgos financieros asociados con el juego. Cualquier estrategia debe basarse en la gestión del bankroll y en una comprensión de las estadísticas, mientras que los bots y los datos de la API son meras herramientas auxiliares que mejoran la conciencia pero no garantizan ganancias.