{"id":1274,"date":"2025-12-17T20:07:59","date_gmt":"2025-12-17T17:07:59","guid":{"rendered":"http:\/\/api-sport.pro\/?p=1274"},"modified":"2025-12-17T20:07:59","modified_gmt":"2025-12-17T17:07:59","slug":"como-crear-un-bot-para-rastrear-cuotas-en-vivo","status":"publish","type":"post","link":"https:\/\/api-sport.pro\/es\/como-crear-un-bot-para-rastrear-cuotas-en-vivo\/","title":{"rendered":"\u00bfC\u00f3mo crear un bot para rastrear cuotas en vivo?"},"content":{"rendered":"<div class=\"table-of-contents\">\n<div class=\"table-of-contents-title\">Contenidos<\/div>\n<ul class=\"table-of-contents-ul\">\n<li class=\"table-of-contents-li\"><a class=\"table-of-contents-a\" href=\"#contents-1\">\u00bfCu\u00e1l es la API para eventos deportivos y cuotas en vivo?<\/a><\/li>\n<li class=\"table-of-contents-li\"><a class=\"table-of-contents-a\" href=\"#contents-2\">\u00bfQu\u00e9 API elegir para rastrear cuotas en vivo?<\/a><\/li>\n<li class=\"table-of-contents-li\"><a class=\"table-of-contents-a\" href=\"#contents-3\">\u00bfC\u00f3mo obtener una clave API y conectarse a los datos de cuotas en vivo?<\/a><\/li>\n<li class=\"table-of-contents-li\"><a class=\"table-of-contents-a\" href=\"#contents-4\">\u00bfC\u00f3mo crear un bot para rastrear cuotas en vivo en Python?<\/a><\/li>\n<li class=\"table-of-contents-li\"><a class=\"table-of-contents-a\" href=\"#contents-5\">Configuraci\u00f3n de un bot para rastrear cambios en cuotas en vivo y notificaciones.<\/a><\/li>\n<li class=\"table-of-contents-li\"><a class=\"table-of-contents-a\" href=\"#contents-6\">\u00bfC\u00f3mo filtrar partidos y cuotas para un bot de apuestas en vivo?<\/a><\/li>\n<li class=\"table-of-contents-li\"><a class=\"table-of-contents-a\" href=\"#contents-7\">Riesgos y limitaciones al usar APIs y bots para cuotas en vivo con casas de apuestas.<\/a><\/li>\n<\/ul>\n<\/div>\n<div class=\"universal_article\">\n<h2 id=\"contents-1\">\u00bfCu\u00e1l es la API para eventos deportivos y cuotas en vivo?<\/h2>\n<p>La API para eventos deportivos y cuotas en vivo es una interfaz de programaci\u00f3n que te permite recibir autom\u00e1ticamente datos estructurados sobre partidos, torneos, equipos y cotizaciones actuales de casas de apuestas en tiempo real. En lugar de analizar p\u00e1ginas HTML o actualizar informaci\u00f3n 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\u00f3n actual, mercados de apuestas y sus valores.<\/p>\n<p>La plataforma <a href=\"http:\/\/api-sport.pro\/es\/\">API de eventos deportivos-Sport<\/a> proporciona un est\u00e1ndar de datos unificado para varias disciplinas a la vez: f\u00fatbol, hockey, baloncesto, tenis, tenis de mesa, deportes electr\u00f3nicos y otros deportes que se a\u00f1aden regularmente. Para cada partido, puedes obtener informaci\u00f3n b\u00e1sica, estad\u00edsticas avanzadas (por ejemplo, posesi\u00f3n, tiros, faltas) y un bloque de cuotas. <code>oddsBase<\/code>. Dentro de \u00e9l hay mercados de apuestas (mercado), como 1X2, totales, h\u00e1ndicaps, as\u00ed como una lista de resultados con coeficientes num\u00e9ricos y un indicador de modo en vivo. Esto permite construir tanto displays de l\u00ednea simples como sistemas anal\u00edticos complejos y bots.<\/p>\n<p>Para los bots en vivo, es especialmente importante que la estructura de coeficientes incluya no solo valores actuales sino tambi\u00e9n atributos adicionales: cotizaciones iniciales, din\u00e1mica de cambios (<code>cambiar<\/code> = \u22121, 0 o 1), estado del mercado (activo o suspendido). Junto con campos de partidos como <code>estado<\/code>, <code>minutoDelPartidoActual<\/code>, <code>eventosEnVivo<\/code> y estad\u00edsticas detalladas, se puede construir l\u00f3gica compleja: rastrear movimientos bruscos del mercado, reaccionar a goles y tarjetas rojas, resaltar partidos con actividad anormal. Basado en tal API, ya se est\u00e1n implementando esc\u00e1neres de arbitraje profesionales, sistemas de monitoreo de m\u00e1rgenes y asistentes de apuestas personales, y en un futuro cercano, el ecosistema se complementar\u00e1 con suscripciones WebSocket y m\u00f3dulos de IA para un an\u00e1lisis m\u00e1s avanzado.<\/p>\n<\/div>\n<div class=\"universal_article\">\n<h2 id=\"contents-2\">\u00bfQu\u00e9 API elegir para rastrear cuotas en vivo?<\/h2>\n<p>Al elegir una API para rastrear coeficientes en vivo, es importante evaluar no solo el precio y el conjunto b\u00e1sico de deportes, sino tambi\u00e9n la profundidad de los datos. Para un bot, es cr\u00edtico 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\u00f3n clara. De lo contrario, te enfrentar\u00e1s 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\u00e1n mucho tiempo en normalizarse.<\/p>\n<p>\u0423 <a href=\"http:\/\/api-sport.pro\/es\/\">Servicio API-Sport<\/a> el enfoque principal est\u00e1 espec\u00edficamente en las tareas pr\u00e1cticas de desarrollo de bots y paneles anal\u00edticos. Cada deporte tiene su propio <code>sportSlug<\/code> (por ejemplo, <code>f\u00fatbol<\/code>, <code>baloncesto<\/code>, <code>tenis<\/code>), y los partidos se solicitan a trav\u00e9s de un \u00fanico punto final <code>\/v2\/{sportSlug}\/partidos<\/code>. La respuesta contiene un array <code>partidos<\/code>, donde cada partido tiene un bloque <code>oddsBase<\/code> con mercados de apuestas, campo <code>estado<\/code> (incluido el valor <code>en progreso<\/code> para en vivo), minuto actual <code>minutoDelPartidoActual<\/code> y matriz <code>eventosEnVivo<\/code>. Esto te permite obtener tanto el contexto deportivo como la l\u00ednea de cuotas actual con una sola solicitud, lo cual es extremadamente conveniente para un an\u00e1lisis r\u00e1pido en el c\u00f3digo del bot.<\/p>\n<p>A continuaci\u00f3n se muestra un ejemplo de una solicitud simple para obtener los partidos de f\u00fatbol 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\u00f3gica de estrategia:<\/p>\n<pre class=\"brush: python; title: ; notranslate\" title=\"\" data-no-translation=\"\">\nimport requests\nAPI_KEY = &quot;\u0412\u0410\u0428_API_\u041a\u041b\u042e\u0427&quot;\nBASE_URL = &quot;https:\/\/api.api-sport.ru\/v2&quot;\nheaders = {\n    &quot;Authorization&quot;: API_KEY,\n}\nparams = {\n    &quot;status&quot;: &quot;inprogress&quot;,  # \u0442\u043e\u043b\u044c\u043a\u043e \u043c\u0430\u0442\u0447\u0438, \u0438\u0434\u0443\u0449\u0438\u0435 \u043f\u0440\u044f\u043c\u043e \u0441\u0435\u0439\u0447\u0430\u0441\n}\nresponse = requests.get(f&quot;{BASE_URL}\/football\/matches&quot;, headers=headers, params=params)\nresponse.raise_for_status()\ndata = response.json()\nfor match in data.get(&quot;matches&quot;, &#x5B;]):\n    print(match&#x5B;&quot;id&quot;], match&#x5B;&quot;status&quot;], match.get(&quot;currentMatchMinute&quot;))\n    for market in match.get(&quot;oddsBase&quot;, &#x5B;]):\n        if market.get(&quot;isLive&quot;):\n            print(&quot;  \u0420\u044b\u043d\u043e\u043a:&quot;, market&#x5B;&quot;name&quot;], market&#x5B;&quot;group&quot;], &quot;live =&quot;, market&#x5B;&quot;isLive&quot;])\n            for choice in market.get(&quot;choices&quot;, &#x5B;]):\n                print(&quot;   &quot;, choice&#x5B;&quot;name&quot;], &quot;=&gt;&quot;, choice&#x5B;&quot;decimal&quot;], &quot;\u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435:&quot;, choice&#x5B;&quot;change&quot;])\n<\/pre>\n<p>Este formato de datos es conveniente para el filtrado posterior: puedes limitar la lista solo a los torneos necesarios a trav\u00e9s del par\u00e1metro <code>torneo_id<\/code>, trabajar con equipos espec\u00edficos mediante <code>equipo_id<\/code> o reunir un grupo general de todos los partidos actuales en las categor\u00edas de inter\u00e9s (<code>categor\u00eda_ids<\/code>). Con la aparici\u00f3n de suscripciones WebSocket basadas en el mismo conjunto de campos, el seguimiento de la din\u00e1mica de las cuotas se volver\u00e1 a\u00fan m\u00e1s preciso y menos intensivo en recursos: el bot recibir\u00e1 actualizaciones a medida que ocurran, sin necesidad de sondear constantemente el servidor.<\/p>\n<\/div>\n<div class=\"universal_article\">\n<h2 id=\"contents-3\">\u00bfC\u00f3mo obtener una clave API y conectarse a los datos de cuotas en vivo?<\/h2>\n<p>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\u00e1s claro posible: te registras en el sitio web, eliges una tarifa adecuada (generalmente dependiendo del volumen de solicitudes y el conjunto de deportes), despu\u00e9s de lo cual recibes un token \u00fanico. Este token debe ser pasado en el encabezado HTTP. <code>Autorizaci\u00f3n<\/code> con cada solicitud a la API, incluidos los endpoints para obtener partidos en vivo y cuotas.<\/p>\n<p>Puedes obtener la clave en <a href=\"https:\/\/app.api-sport.ru\">la cuenta personal de API-Sport<\/a>. Despu\u00e9s de la autorizaci\u00f3n, ver\u00e1s una secci\u00f3n con tu clave API actual, estad\u00edsticas de uso y una descripci\u00f3n de los l\u00edmites. Se recomienda almacenar la clave en variables de entorno o en un archivo de configuraci\u00f3n separado para evitar comprometerla en un repositorio p\u00fablico. En caso de compromiso del token, siempre puedes generar una nueva clave en el panel y desactivar instant\u00e1neamente la antigua. Este es un paso de seguridad importante, especialmente si el bot est\u00e1 desplegado en un servidor externo y opera las 24 horas.<\/p>\n<p>A continuaci\u00f3n se muestra un ejemplo b\u00e1sico de conexi\u00f3n a la API y verificaci\u00f3n de que la clave funciona correctamente. Llamamos al endpoint <code>\/v2\/deporte<\/code>, para obtener una lista de deportes disponibles, y luego una solicitud en vivo para partidos:<\/p>\n<pre class=\"brush: python; title: ; notranslate\" title=\"\" data-no-translation=\"\">\nimport os\nimport requests\nAPI_KEY = os.getenv(&quot;SPORT_API_KEY&quot;)  # \u0445\u0440\u0430\u043d\u0438\u0442\u0435 \u043a\u043b\u044e\u0447 \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f\nBASE_URL = &quot;https:\/\/api.api-sport.ru\/v2&quot;\nheaders = {&quot;Authorization&quot;: API_KEY}\n# 1. \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e \u043a\u043b\u044e\u0447 \u0432\u0430\u043b\u0438\u0434\u0435\u043d \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u0438\u0434\u043e\u0432 \u0441\u043f\u043e\u0440\u0442\u0430\nsports_resp = requests.get(f&quot;{BASE_URL}\/sport&quot;, headers=headers)\nsports_resp.raise_for_status()\nprint(&quot;\u0414\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u0432\u0438\u0434\u044b \u0441\u043f\u043e\u0440\u0442\u0430:&quot;)\nfor sport in sports_resp.json():\n    print(&quot;-&quot;, sport&#x5B;&quot;translations&quot;].get(&quot;ru&quot;) or sport&#x5B;&quot;name&quot;], &quot;(slug=&quot;, sport&#x5B;&quot;slug&quot;], &quot;)&quot;)\n# 2. \u041f\u0440\u043e\u0431\u043d\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u043a \u043b\u0430\u0439\u0432-\u043c\u0430\u0442\u0447\u0430\u043c \u043f\u043e \u0445\u043e\u043a\u043a\u0435\u044e\nparams = {&quot;status&quot;: &quot;inprogress&quot;}\nmatches_resp = requests.get(f&quot;{BASE_URL}\/ice-hockey\/matches&quot;, headers=headers, params=params)\nmatches_resp.raise_for_status()\nmatches_data = matches_resp.json()\nprint(&quot;\u041d\u0430\u0439\u0434\u0435\u043d\u043e \u043b\u0430\u0439\u0432-\u043c\u0430\u0442\u0447\u0435\u0439:&quot;, matches_data.get(&quot;totalMatches&quot;))\n<\/pre>\n<p>Si ambas solicitudes se ejecutan sin errores y devuelven datos significativos, puedes pasar al siguiente paso: implementar la l\u00f3gica del bot. En esta etapa, ya tiene sentido pensar en la estrategia para utilizar el l\u00edmite de solicitudes: frecuencia de sondeo, deportes prioritarios y torneos. En el futuro, podr\u00e1s transferir parcialmente la l\u00f3gica del sondeo peri\u00f3dico a suscripciones WebSocket y filtros de IA inteligentes, pero la base siempre seguir\u00e1 siendo una conexi\u00f3n correcta a la API a trav\u00e9s de una clave confiable.<\/p>\n<\/div>\n<div class=\"universal_article\">\n<h2 id=\"contents-4\">\u00bfC\u00f3mo crear un bot para rastrear cuotas en vivo en Python?<\/h2>\n<p>Python es uno de los lenguajes m\u00e1s 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\u00eda, almacenamiento de datos e integraci\u00f3n con servicios de notificaci\u00f3n externos. La arquitectura de un bot simple para monitorear cuotas se ve as\u00ed: sondeo c\u00edclico de la API, guardando el \u00faltimo estado de las cuotas en memoria (o en una base de datos), detectando cambios y reaccionando a ellos (registro, alertas, generaci\u00f3n de se\u00f1ales para el usuario).<\/p>\n<p>El marco m\u00ednimo 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\u00e9s del endpoint <code>\/v2\/{sportSlug}\/partidos<\/code> con el par\u00e1metro <code>estado=enprogreso<\/code>. De cada partido, extraemos una matriz. <code>oddsBase<\/code>, seleccionamos los mercados de inter\u00e9s (por ejemplo, 1X2 o totales) y los guardamos en un diccionario, donde la clave es la combinaci\u00f3n <code>(matchId, marketName, choiceName)<\/code>. En la siguiente solicitud, comparamos el valor actual de las cuotas con el anterior, as\u00ed como el campo <code>cambiar<\/code>, para entender si ha habido un aumento o disminuci\u00f3n.<\/p>\n<p>A continuaci\u00f3n se muestra un ejemplo simplificado de tal marco. Se puede ampliar a\u00f1adiendo almacenamiento en una base de datos, manejo de errores, asincron\u00eda e integraci\u00f3n con sistemas de notificaci\u00f3n:<\/p>\n<pre class=\"brush: python; title: ; notranslate\" title=\"\" data-no-translation=\"\">\nimport time\nimport requests\nAPI_KEY = &quot;\u0412\u0410\u0428_API_\u041a\u041b\u042e\u0427&quot;\nBASE_URL = &quot;https:\/\/api.api-sport.ru\/v2&quot;\nPOLL_INTERVAL = 10  # \u0447\u0430\u0441\u0442\u043e\u0442\u0430 \u043e\u043f\u0440\u043e\u0441\u0430 \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0430\u0445\nheaders = {&quot;Authorization&quot;: API_KEY}\n# \u0425\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u043e\u0432: (matchId, marketName, choiceName) -&gt; decimal\nlast_odds = {}\n\ndef fetch_live_matches(sport_slug: str):\n    params = {&quot;status&quot;: &quot;inprogress&quot;}\n    resp = requests.get(f&quot;{BASE_URL}\/{sport_slug}\/matches&quot;, headers=headers, params=params, timeout=10)\n    resp.raise_for_status()\n    return resp.json().get(&quot;matches&quot;, &#x5B;])\n\ndef process_match(match):\n    match_id = match&#x5B;&quot;id&quot;]\n    minute = match.get(&quot;currentMatchMinute&quot;)\n    for market in match.get(&quot;oddsBase&quot;, &#x5B;]):\n        if not market.get(&quot;isLive&quot;):\n            continue\n        market_name = f&quot;{market&#x5B;'group']} - {market&#x5B;'name']}&quot;\n        for choice in market.get(&quot;choices&quot;, &#x5B;]):\n            key = (match_id, market_name, choice&#x5B;&quot;name&quot;])\n            new_decimal = choice&#x5B;&quot;decimal&quot;]\n            old_decimal = last_odds.get(key)\n            if old_decimal is not None and new_decimal != old_decimal:\n                direction = &quot;\u0432\u044b\u0440\u043e\u0441&quot; if new_decimal &gt; old_decimal else &quot;\u0443\u043f\u0430\u043b&quot;\n                print(f&quot;\u041c\u0430\u0442\u0447 {match_id} ({minute} \u043c\u0438\u043d.), {market_name}, {choice&#x5B;'name']}: \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 {direction} \u0441 {old_decimal} \u0434\u043e {new_decimal}&quot;)\n            last_odds&#x5B;key] = new_decimal\n\nif __name__ == &quot;__main__&quot;:\n    while True:\n        try:\n            matches = fetch_live_matches(&quot;football&quot;)\n            for m in matches:\n                process_match(m)\n        except Exception as e:\n            # \u041d\u0430 \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u0435\u043d\u0435 \u043b\u0443\u0447\u0448\u0435 \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0443 \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443\n            print(&quot;\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u043e\u043f\u0440\u043e\u0441\u0435 API:&quot;, e)\n        time.sleep(POLL_INTERVAL)\n<\/pre>\n<p>En la pr\u00e1ctica, complicar\u00e1s este esquema: a\u00f1adiendo sondeo asincr\u00f3nico de varios deportes a la vez, restricciones en los torneos de inter\u00e9s, almacenando el historial de cuotas para an\u00e1lisis posteriores, as\u00ed como un m\u00f3dulo que genera se\u00f1ales basadas en los datos de entrada del partido y la din\u00e1mica de las cuotas (por ejemplo, un fuerte desequilibrio en la l\u00ednea, r\u00e1pido crecimiento de totales, etc.). Al mismo tiempo, el acceso a los datos sigue siendo simple gracias a una API unificada y un bloque detallado <code>oddsBase<\/code>, y el desarrollo posterior del proyecto puede construirse en torno a las futuras capacidades de WebSocket y an\u00e1lisis de IA.<\/p>\n<\/div>\n<div class=\"universal_article\">\n<h2 id=\"contents-5\">Configuraci\u00f3n de un bot para rastrear cambios en cuotas en vivo y notificaciones.<\/h2>\n<p>Crear un bucle b\u00e1sico 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 \u00fatiles: las cuotas decimales actuales <code>decimal<\/code>, el valor inicial <code>decimalInicial<\/code>, as\u00ed como el indicador de la direcci\u00f3n del \u00faltimo cambio <code>cambiar<\/code>. Esto te permite registrar no solo el hecho del movimiento de la l\u00ednea, sino tambi\u00e9n evaluar su fuerza en relaci\u00f3n 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\u00f1al al usuario.<\/p>\n<p>Una estrategia pr\u00e1ctica es combinar umbrales relativos y absolutos. El umbral absoluto establece la diferencia m\u00ednima entre las cuotas actuales y las \u00faltimas o iniciales (por ejemplo, un cambio de al menos 0.10). El umbral relativo se establece en porcentajes (por ejemplo, un aumento o disminuci\u00f3n de m\u00e1s del 5\u201310 % del valor inicial). Adem\u00e1s, puedes usar el campo <code>suspendido<\/code> del mercado: cuando se activa, el bot puede enviar una notificaci\u00f3n separada sobre la suspensi\u00f3n de apuestas, lo que a menudo se\u00f1ala un evento importante en el partido (gol, tarjeta roja, revisi\u00f3n de VAR, etc.).<\/p>\n<p>A continuaci\u00f3n se muestra un ejemplo de una funci\u00f3n que se configura a trav\u00e9s de par\u00e1metros y determina si enviar una notificaci\u00f3n para unas cuotas espec\u00edficas. En el ejemplo, la notificaci\u00f3n se simula mediante la salida a la consola, pero en la pr\u00e1ctica, puedes reemplazar esto con integraci\u00f3n con cualquier mensajero o servicio de correo electr\u00f3nico:<\/p>\n<pre class=\"brush: python; title: ; notranslate\" title=\"\" data-no-translation=\"\">\nRELATIVE_THRESHOLD = 0.05  # 5% \u043e\u0442 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u0430\nABSOLUTE_THRESHOLD = 0.10  # \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043d\u0430 0.10 \u0438 \u0431\u043e\u043b\u0435\u0435\n\ndef should_notify(choice: dict) -&gt; bool:\n    &quot;&quot;&quot;\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c, \u0441\u0442\u043e\u0438\u0442 \u043b\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u0435 \u043f\u043e \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u043c\u0443 \u0438\u0441\u0445\u043e\u0434\u0443.&quot;&quot;&quot;\n    current = float(choice&#x5B;&quot;decimal&quot;])\n    initial = float(choice.get(&quot;initialDecimal&quot;) or current)\n    abs_diff = abs(current - initial)\n    rel_diff = abs_diff \/ initial if initial else 0\n    if abs_diff &gt;= ABSOLUTE_THRESHOLD or rel_diff &gt;= RELATIVE_THRESHOLD:\n        return True\n    # \u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043c\u043e\u0436\u043d\u043e \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\n    # change = -1 (\u043f\u043e\u043d\u0438\u0436\u0435\u043d\u0438\u0435), 0 (\u0431\u0435\u0437 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439), 1 (\u043f\u043e\u0432\u044b\u0448\u0435\u043d\u0438\u0435)\n    # \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0440\u0435\u0430\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u0441\u0438\u043b\u044c\u043d\u044b\u0439 \u0440\u043e\u0441\u0442 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u0430\n    if choice.get(&quot;change&quot;) == 1 and rel_diff &gt;= 0.03:\n        return True\n    return False\n\ndef handle_notifications(match, market, choice):\n    if not should_notify(choice):\n        return\n    match_id = match&#x5B;&quot;id&quot;]\n    minute = match.get(&quot;currentMatchMinute&quot;)\n    msg = (\n        f&quot;&#x5B;\u0410\u041b\u0415\u0420\u0422] \u041c\u0430\u0442\u0447 {match_id}, {minute} \u043c\u0438\u043d.&quot;\n        f&quot;\u0420\u044b\u043d\u043e\u043a: {market&#x5B;'group']} - {market&#x5B;'name']}&quot;\n        f&quot;\u0418\u0441\u0445\u043e\u0434: {choice&#x5B;'name']}&quot;\n        f&quot;\u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u0441\u044f \u0434\u043e {choice&#x5B;'decimal']} (\u0441\u0442\u0430\u0440\u0442: {choice.get('initialDecimal')})&quot;\n    )\n    print(msg)\n<\/pre>\n<p>A continuaci\u00f3n, necesitas integrar esta funci\u00f3n en el bucle principal del bot: despu\u00e9s de recibir cada partido y pasar por los mercados de cuotas en vivo, llamas a <code>manejar_notificaciones<\/code> para cada resultado. Como mejora, puedes a\u00f1adir \u00abanti-spam\u00bb: almacenar el tiempo de la \u00faltima notificaci\u00f3n para un resultado espec\u00edfico y no enviar alertas con m\u00e1s frecuencia que un intervalo especificado. Un m\u00f3dulo separado puede gestionar los canales de entrega: enviar algunos eventos instant\u00e1neamente, mientras que agrega otros en res\u00famenes peri\u00f3dicos. Gracias a que la API ya proporciona un conjunto estructurado de campos para mercados y muestras, toda esta l\u00f3gica se implementa a nivel de c\u00f3digo del bot sin necesidad de procesar HTML en bruto de los sitios de las casas de apuestas.<\/p>\n<\/div>\n<div class=\"universal_article\">\n<h2 id=\"contents-6\">\u00bfC\u00f3mo filtrar partidos y cuotas para un bot de apuestas en vivo?<\/h2>\n<p>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\u00e1lisis y conduce a un flujo de notificaciones excesivas. Es mucho m\u00e1s razonable centrarse en ligas espec\u00edficas, 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\u00e1metros <code>torneo_id<\/code>, <code>equipo_id<\/code>, <code>categor\u00eda_ids<\/code>, <code>estado<\/code> y otros filtros en el endpoint. <code>\/v2\/{sportSlug}\/partidos<\/code>. Por ejemplo, puedes recibir inmediatamente solo partidos de la Liga de Campeones y ligas nacionales de primer nivel, ignorando torneos menos significativos.<\/p>\n<p>Se realiza un filtrado adicional en el c\u00f3digo del bot basado en el array de datos. <code>oddsBase<\/code>. Aqu\u00ed puedes implementar la l\u00f3gica para seleccionar mercados por grupo (<code>grupo<\/code> = \u00ab1X2\u00bb, \u00abTotales\u00bb, \u00abHandicap\u00bb), per\u00edodo (<code>per\u00edodo<\/code> = \u00abTiempo completo\u00bb, \u00ab1er tiempo\u00bb), rango de cuotas (por ejemplo, de 1.50 a 3.50) y direcci\u00f3n del cambio (<code>cambiar<\/code> = 1 o -1). Esto te permite centrarte en mercados con mayor volatilidad y descartar aquellos que son de poco inter\u00e9s para la estrategia. Por ejemplo, puedes analizar solo movimientos fuertes en totales, sin prestar atenci\u00f3n a cambios marginales en los resultados de 1X2.<\/p>\n<p>A continuaci\u00f3n se muestra un ejemplo de una funci\u00f3n que selecciona solo los partidos y mercados necesarios seg\u00fan las condiciones especificadas. Se puede utilizar dentro del bot antes del an\u00e1lisis y el env\u00edo de notificaciones:<\/p>\n<pre class=\"brush: python; title: ; notranslate\" title=\"\" data-no-translation=\"\">\nTARGET_TOURNAMENTS = &quot;7,17&quot;  # \u043f\u0440\u0438\u043c\u0435\u0440: \u041b\u0438\u0433\u0430 \u0447\u0435\u043c\u043f\u0438\u043e\u043d\u043e\u0432 \u0438 \u0442\u043e\u043f-\u043b\u0438\u0433\u0430 (ID \u0443\u0441\u043b\u043e\u0432\u043d\u044b\u0435)\nMIN_DECIMAL = 1.5\nMAX_DECIMAL = 3.5\nTARGET_GROUPS = {&quot;1X2&quot;, &quot;Totals&quot;}\n\ndef fetch_filtered_matches(headers):\n    params = {\n        &quot;status&quot;: &quot;inprogress&quot;,\n        &quot;tournament_id&quot;: TARGET_TOURNAMENTS,\n    }\n    resp = requests.get(\n        &quot;https:\/\/api.api-sport.ru\/v2\/football\/matches&quot;,\n        headers=headers,\n        params=params,\n        timeout=10,\n    )\n    resp.raise_for_status()\n    return resp.json().get(&quot;matches&quot;, &#x5B;])\n\ndef iter_filtered_markets(match):\n    for market in match.get(&quot;oddsBase&quot;, &#x5B;]):\n        if not market.get(&quot;isLive&quot;):\n            continue\n        if market.get(&quot;group&quot;) not in TARGET_GROUPS:\n            continue\n        for choice in market.get(&quot;choices&quot;, &#x5B;]):\n            dec = float(choice&#x5B;&quot;decimal&quot;])\n            if MIN_DECIMAL &amp;lt;= dec &amp;lt;= MAX_DECIMAL:\n                yield market, choice\n<\/pre>\n<p>Este enfoque reduce la cantidad de datos que procesa el bot, haciendo que el comportamiento del sistema sea m\u00e1s predecible y transparente. Puedes almacenar la configuraci\u00f3n de filtrado en un archivo de configuraci\u00f3n separado o incluso moverla al panel administrativo de tu propio proyecto para cambiar la estrategia sin reiniciar el c\u00f3digo. Al escalar m\u00e1s \u2014por ejemplo, al agregar nuevos deportes y mercados\u2014 ser\u00e1 suficiente con ampliar la lista <code>sportSlug<\/code> y configurar nuevos conjuntos de filtros sin cambiar la l\u00f3gica b\u00e1sica de trabajo con la API. <a href=\"http:\/\/api-sport.pro\/es\/\">api-sport.pro<\/a>.<\/p>\n<\/div>\n<div class=\"universal_article\">\n<h2 id=\"contents-7\">Riesgos y limitaciones al usar APIs y bots para cuotas en vivo con casas de apuestas.<\/h2>\n<p>El uso de bots para rastrear cuotas en vivo proporciona una ventaja significativa en velocidad de reacci\u00f3n, pero al mismo tiempo conlleva una serie de riesgos y limitaciones. Primero, los datos obtenidos a trav\u00e9s de cualquier API externa siempre tienen un cierto retraso en comparaci\u00f3n con los sistemas internos de la casa de apuestas. Incluso con una alta velocidad de actualizaci\u00f3n, la l\u00ednea 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 \u00abfuente de verdad en el \u00faltimo momento\u00bb \u2014es una herramienta para an\u00e1lisis y detecci\u00f3n temprana de tendencias, no una garant\u00eda de que podr\u00e1s replicar cada movimiento.<\/p>\n<p>En segundo lugar, es importante considerar las reglas de casas de apuestas espec\u00edficas. Muchos operadores estipulan en sus t\u00e9rminos una prohibici\u00f3n o restricciones sobre la recolecci\u00f3n automatizada de datos y apuestas masivas utilizando scripts. Aunque API-Sport proporciona datos agregados sobre cuotas y eventos de partidos, la responsabilidad de c\u00f3mo utilizas esta informaci\u00f3n recae en ti. Antes de lanzar el bot, es recomendable familiarizarse con los aspectos legales en tu jurisdicci\u00f3n y las reglas de las casas de apuestas elegidas para evitar el bloqueo de cuentas u otras sanciones.<\/p>\n<p>En tercer lugar, es necesario trabajar de manera competente con las limitaciones t\u00e9cnicas de la API misma: l\u00edmites de solicitudes, posible indisponibilidad temporal, regulaciones de actualizaci\u00f3n de datos. El bot debe manejar correctamente los errores de red, los c\u00f3digos 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\u00e9n vale la pena recordar que ninguna API e incluso futuros canales de WebSocket o m\u00f3dulos de IA eliminan los riesgos financieros asociados con el juego. Cualquier estrategia debe basarse en la gesti\u00f3n del bankroll y en una comprensi\u00f3n de las estad\u00edsticas, mientras que los bots y los datos de la API son meras herramientas auxiliares que mejoran la conciencia pero no garantizan ganancias.<\/p>\n<\/div>","protected":false},"excerpt":{"rendered":"<p>Content What is the API for sports events and live odds Which API to choose for tracking live odds How to get an API key and connect to live odds data How to create a bot for tracking live odds in Python Setting up a bot to track changes in live odds and notifications How to filter matches and odds for the betting bot in [\u2026]<\/p>","protected":false},"author":1,"featured_media":1273,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_et_pb_use_builder":"","_et_pb_old_content":"","_et_gb_content_width":"","faq":"[{\"question\":\"\u041a\u0430\u043a\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043e \u043b\u0430\u0439\u0432 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u0430\u0445 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0447\u0435\u0440\u0435\u0437 API-Sport?\",\"answer\":\"\u0427\u0435\u0440\u0435\u0437 API-Sport \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043c\u0430\u0442\u0447\u0430 \u0441\u0442\u0430\u0442\u0443\u0441 (\u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 inprogress), \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u043c\u0438\u043d\u0443\u0442\u0443, \u0441\u0447\u0451\u0442, \u043c\u0430\u0441\u0441\u0438\u0432 live-\u0441\u043e\u0431\u044b\u0442\u0438\u0439, \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0443\u044e \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0443 \u0438 \u0431\u043b\u043e\u043a oddsBase \u0441 \u0440\u044b\u043d\u043a\u0430\u043c\u0438 \u0441\u0442\u0430\u0432\u043e\u043a. \u0412 oddsBase \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0440\u044b\u043d\u043a\u0430 \u0438 \u0433\u0440\u0443\u043f\u043f\u044b, \u043f\u0435\u0440\u0438\u043e\u0434 \u043c\u0430\u0442\u0447\u0430, \u043f\u0440\u0438\u0437\u043d\u0430\u043a isLive, \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 suspended, \u0441\u043f\u0438\u0441\u043e\u043a \u0438\u0441\u0445\u043e\u0434\u043e\u0432 \u0441 \u043f\u043e\u043b\u044f\u043c\u0438 decimal, initialDecimal, winning \u0438 change, \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0442\u044c \u043a\u0430\u043a \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u0430, \u0442\u0430\u043a \u0438 \u0434\u0438\u043d\u0430\u043c\u0438\u043a\u0443 \u0435\u0433\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f.\"},{\"question\":\"\u0421 \u043a\u0430\u043a\u043e\u0439 \u0447\u0430\u0441\u0442\u043e\u0442\u043e\u0439 \u0431\u043e\u0442 \u043c\u043e\u0436\u0435\u0442 \u043e\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0442\u044c API \u0441\u043f\u043e\u0440\u0442\u0438\u0432\u043d\u044b\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u0439?\",\"answer\":\"\u0414\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u0430\u044f \u0447\u0430\u0441\u0442\u043e\u0442\u0430 \u043e\u043f\u0440\u043e\u0441\u0430 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0433\u043e \u0442\u0430\u0440\u0438\u0444\u0430 \u0438 \u043b\u0438\u043c\u0438\u0442\u043e\u0432 API-Sport. \u041d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u0434\u043b\u044f \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0430 \u0437\u0430\u0434\u0430\u0447 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430 \u043b\u0430\u0439\u0432 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u043e\u0432 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0430 5\u201330 \u0441\u0435\u043a\u0443\u043d\u0434 \u0434\u043b\u044f \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442\u043d\u044b\u0445 \u043c\u0430\u0442\u0447\u0435\u0439 \u0438 30\u201360 \u0441\u0435\u043a\u0443\u043d\u0434 \u0434\u043b\u044f \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445. \u0420\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043f\u043e \u0432\u0438\u0434\u0430\u043c \u0441\u043f\u043e\u0440\u0442\u0430 \u0438 \u0442\u0443\u0440\u043d\u0438\u0440\u0430\u043c, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0444\u0438\u043b\u044c\u0442\u0440\u044b (tournament_id, category_ids, status), \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0442\u0440\u0430\u0442\u0438\u0442\u044c \u043b\u0438\u043c\u0438\u0442 \u043d\u0430 \u043d\u0435\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f.\"},{\"question\":\"\u041e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Python \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0431\u043e\u0442\u0430 \u043f\u043e \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u0430\u043c?\",\"answer\":\"\u041d\u0435\u0442, \u044f\u0437\u044b\u043a \u043d\u0435 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0438\u0430\u043b\u0435\u043d. \u0412 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f Python, \u0442\u0430\u043a \u043a\u0430\u043a \u043e\u043d \u043f\u0440\u043e\u0441\u0442 \u0438 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u0435\u043d \u0434\u043b\u044f \u0437\u0430\u0434\u0430\u0447 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438, \u0440\u0430\u0431\u043e\u0442\u044b \u0441 HTTP \u0438 \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445. \u041e\u0434\u043d\u0430\u043a\u043e API-Sport \u2014 \u044d\u0442\u043e \u043e\u0431\u044b\u0447\u043d\u044b\u0439 REST API, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0431\u043e\u0442\u0430 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0430 \u043b\u044e\u0431\u043e\u043c \u044f\u0437\u044b\u043a\u0435, \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0449\u0435\u043c HTTP-\u0437\u0430\u043f\u0440\u043e\u0441\u044b: JavaScript (Node.js), PHP, Go, Java, C# \u0438 \u0434\u0440. \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0438 \u043e\u0442\u0432\u0435\u0442\u043e\u0432 \u043e\u0441\u0442\u0430\u043d\u0435\u0442\u0441\u044f \u0442\u0430\u043a\u043e\u0439 \u0436\u0435, \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 \u043a\u043e\u0434\u0430.\"},{\"question\":\"\u041c\u043e\u0436\u043d\u043e \u043b\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e API \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0435 \u043b\u0438\u0433\u0438 \u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u044b?\",\"answer\":\"\u0414\u0430. \u0412 \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u0435 \/v2\/{sportSlug}\/matches \u043f\u0440\u0435\u0434\u0443\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u044b \u0444\u0438\u043b\u044c\u0442\u0440\u044b tournament_id, team_id, category_ids, season_id \u0438 status. \u0421 \u0438\u0445 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043c\u0430\u0442\u0447\u0438 \u043d\u0443\u0436\u043d\u044b\u0445 \u0442\u0443\u0440\u043d\u0438\u0440\u043e\u0432, \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u043a\u043e\u043c\u0430\u043d\u0434 \u0438\u043b\u0438 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u0441\u0442\u0440\u0430\u043d. \u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0432 \u043a\u043e\u0434\u0435 \u0431\u043e\u0442\u0430 \u043c\u043e\u0436\u043d\u043e \u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u044b\u043d\u043a\u0438 oddsBase \u043f\u043e \u0433\u0440\u0443\u043f\u043f\u0435 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, 1X2 \u0438\u043b\u0438 Totals), \u043f\u0435\u0440\u0438\u043e\u0434\u0443 (Full-time, 1st half) \u0438 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0443 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u043e\u0432.\"},{\"question\":\"\u0411\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e \u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0431\u043e\u0442\u0430 \u0434\u043b\u044f \u0441\u0442\u0430\u0432\u043e\u043a \u0443 \u0431\u0443\u043a\u043c\u0435\u043a\u0435\u0440\u043e\u0432 \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0438\u0437 API?\",\"answer\":\"\u0421 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u0431\u043e\u0442, \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0439 \u0441 \u0430\u0433\u0440\u0435\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 API-Sport, \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u0435\u043d, \u0435\u0441\u043b\u0438 \u0441\u043e\u0431\u043b\u044e\u0434\u0430\u0442\u044c \u043b\u0438\u043c\u0438\u0442\u044b \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0438. \u041e\u0434\u043d\u0430\u043a\u043e \u0441 \u044e\u0440\u0438\u0434\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0445 \u0431\u0443\u043a\u043c\u0435\u043a\u0435\u0440\u0441\u043a\u0438\u0445 \u043a\u043e\u043d\u0442\u043e\u0440 \u0438 \u0437\u0430\u043a\u043e\u043d\u043e\u0434\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u043e \u0432\u0430\u0448\u0435\u0439 \u0441\u0442\u0440\u0430\u043d\u044b. \u041d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u043a\u043c\u0435\u043a\u0435\u0440\u044b \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u044e\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0441\u0431\u043e\u0440 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043c\u0430\u0441\u0441\u043e\u0432\u044b\u0435 \u0441\u0442\u0430\u0432\u043a\u0438. \u041f\u0435\u0440\u0435\u0434 \u0437\u0430\u043f\u0443\u0441\u043a\u043e\u043c \u0431\u043e\u0442\u0430 \u0432\u0430\u0436\u043d\u043e \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u043c\u0438 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f \u0438 \u043f\u0440\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u0440\u043e\u043a\u043e\u043d\u0441\u0443\u043b\u044c\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0441\u043e \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0441\u0442\u043e\u043c.\"}]","footnotes":""},"categories":[1],"tags":[],"class_list":["post-1274","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blog"],"yoast_head":"<title>Bot for tracking live odds \u2014 API of sports events<\/title>\n<meta name=\"description\" content=\"Step-by-step guide on how to create a bot for tracking live odds on sports events via API. Examples in Python, tips, and risks.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/api-sport.pro\/es\/como-crear-un-bot-para-rastrear-cuotas-en-vivo\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Bot for tracking live odds \u2014 API of sports events\" \/>\n<meta property=\"og:description\" content=\"Step-by-step guide on how to create a bot for tracking live odds on sports events via API. Examples in Python, tips, and risks.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/api-sport.pro\/es\/como-crear-un-bot-para-rastrear-cuotas-en-vivo\/\" \/>\n<meta property=\"og:site_name\" content=\"Sports Events API\" \/>\n<meta property=\"article:published_time\" content=\"2025-12-17T17:07:59+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/api-sport.pro\/wp-content\/uploads\/2025\/11\/kak-sdelat-bota-dlya-otslezhivaniya-koeffitsientov-v-laive_posts.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1376\" \/>\n\t<meta property=\"og:image:height\" content=\"768\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"admin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"admin\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data2\" content=\"15 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/api-sport.pro\/how-to-create-a-bot-for-tracking-odds-in-live\/\",\"url\":\"https:\/\/api-sport.pro\/how-to-create-a-bot-for-tracking-odds-in-live\/\",\"name\":\"Bot for tracking live odds \u2014 API of sports events\",\"isPartOf\":{\"@id\":\"https:\/\/api-sport.pro\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/api-sport.pro\/how-to-create-a-bot-for-tracking-odds-in-live\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/api-sport.pro\/how-to-create-a-bot-for-tracking-odds-in-live\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/api-sport.pro\/wp-content\/uploads\/2025\/11\/kak-sdelat-bota-dlya-otslezhivaniya-koeffitsientov-v-laive_posts.jpg\",\"datePublished\":\"2025-12-17T17:07:59+00:00\",\"author\":{\"@id\":\"https:\/\/api-sport.pro\/#\/schema\/person\/bc93f449b3753a5f254264da266fb601\"},\"description\":\"Step-by-step guide on how to create a bot for tracking live odds on sports events via API. Examples in Python, tips, and risks.\",\"breadcrumb\":{\"@id\":\"https:\/\/api-sport.pro\/how-to-create-a-bot-for-tracking-odds-in-live\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/api-sport.pro\/how-to-create-a-bot-for-tracking-odds-in-live\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/api-sport.pro\/how-to-create-a-bot-for-tracking-odds-in-live\/#primaryimage\",\"url\":\"https:\/\/api-sport.pro\/wp-content\/uploads\/2025\/11\/kak-sdelat-bota-dlya-otslezhivaniya-koeffitsientov-v-laive_posts.jpg\",\"contentUrl\":\"https:\/\/api-sport.pro\/wp-content\/uploads\/2025\/11\/kak-sdelat-bota-dlya-otslezhivaniya-koeffitsientov-v-laive_posts.jpg\",\"width\":1376,\"height\":768,\"caption\":\"\u041a\u0430\u043a \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0431\u043e\u0442\u0430 \u0434\u043b\u044f \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u044f \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u043e\u0432 \u0432 \u043b\u0430\u0439\u0432\u0435?\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/api-sport.pro\/how-to-create-a-bot-for-tracking-odds-in-live\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u0413\u043b\u0430\u0432\u043d\u0430\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430\",\"item\":\"https:\/\/api-sport.pro\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"How to create a bot for tracking odds in live?\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/api-sport.pro\/#website\",\"url\":\"https:\/\/api-sport.pro\/\",\"name\":\"Sports Events API\",\"description\":\"Sports Events API\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/api-sport.pro\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/api-sport.pro\/#\/schema\/person\/bc93f449b3753a5f254264da266fb601\",\"name\":\"admin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/api-sport.pro\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/8f3dce32feb8659c1f1c917db74325481c6133714f03d5a9433ba6df23a857ab?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/8f3dce32feb8659c1f1c917db74325481c6133714f03d5a9433ba6df23a857ab?s=96&d=mm&r=g\",\"caption\":\"admin\"},\"sameAs\":[\"http:\/\/api-sport.pro\"],\"url\":\"https:\/\/api-sport.pro\/es\/author\/admin\/\"}]}<\/script>","yoast_head_json":{"title":"Bot para rastrear cuotas en vivo \u2014 API de eventos deportivos","description":"Gu\u00eda paso a paso sobre c\u00f3mo crear un bot para rastrear las cuotas en vivo en eventos deportivos a trav\u00e9s de API. Ejemplos en Python, consejos y riesgos.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/api-sport.pro\/es\/como-crear-un-bot-para-rastrear-cuotas-en-vivo\/","og_locale":"es_ES","og_type":"article","og_title":"Bot for tracking live odds \u2014 API of sports events","og_description":"Step-by-step guide on how to create a bot for tracking live odds on sports events via API. Examples in Python, tips, and risks.","og_url":"https:\/\/api-sport.pro\/es\/como-crear-un-bot-para-rastrear-cuotas-en-vivo\/","og_site_name":"Sports Events API","article_published_time":"2025-12-17T17:07:59+00:00","og_image":[{"width":1376,"height":768,"url":"https:\/\/api-sport.pro\/wp-content\/uploads\/2025\/11\/kak-sdelat-bota-dlya-otslezhivaniya-koeffitsientov-v-laive_posts.jpg","type":"image\/jpeg"}],"author":"admin","twitter_card":"summary_large_image","twitter_misc":{"Escrito por":"admin","Tiempo de lectura":"15 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/api-sport.pro\/how-to-create-a-bot-for-tracking-odds-in-live\/","url":"https:\/\/api-sport.pro\/how-to-create-a-bot-for-tracking-odds-in-live\/","name":"Bot para rastrear cuotas en vivo \u2014 API de eventos deportivos","isPartOf":{"@id":"https:\/\/api-sport.pro\/#website"},"primaryImageOfPage":{"@id":"https:\/\/api-sport.pro\/how-to-create-a-bot-for-tracking-odds-in-live\/#primaryimage"},"image":{"@id":"https:\/\/api-sport.pro\/how-to-create-a-bot-for-tracking-odds-in-live\/#primaryimage"},"thumbnailUrl":"https:\/\/api-sport.pro\/wp-content\/uploads\/2025\/11\/kak-sdelat-bota-dlya-otslezhivaniya-koeffitsientov-v-laive_posts.jpg","datePublished":"2025-12-17T17:07:59+00:00","author":{"@id":"https:\/\/api-sport.pro\/#\/schema\/person\/bc93f449b3753a5f254264da266fb601"},"description":"Gu\u00eda paso a paso sobre c\u00f3mo crear un bot para rastrear las cuotas en vivo en eventos deportivos a trav\u00e9s de API. Ejemplos en Python, consejos y riesgos.","breadcrumb":{"@id":"https:\/\/api-sport.pro\/how-to-create-a-bot-for-tracking-odds-in-live\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/api-sport.pro\/how-to-create-a-bot-for-tracking-odds-in-live\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/api-sport.pro\/how-to-create-a-bot-for-tracking-odds-in-live\/#primaryimage","url":"https:\/\/api-sport.pro\/wp-content\/uploads\/2025\/11\/kak-sdelat-bota-dlya-otslezhivaniya-koeffitsientov-v-laive_posts.jpg","contentUrl":"https:\/\/api-sport.pro\/wp-content\/uploads\/2025\/11\/kak-sdelat-bota-dlya-otslezhivaniya-koeffitsientov-v-laive_posts.jpg","width":1376,"height":768,"caption":"\u041a\u0430\u043a \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0431\u043e\u0442\u0430 \u0434\u043b\u044f \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u044f \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u043e\u0432 \u0432 \u043b\u0430\u0439\u0432\u0435?"},{"@type":"BreadcrumbList","@id":"https:\/\/api-sport.pro\/how-to-create-a-bot-for-tracking-odds-in-live\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u0413\u043b\u0430\u0432\u043d\u0430\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430","item":"https:\/\/api-sport.pro\/"},{"@type":"ListItem","position":2,"name":"How to create a bot for tracking odds in live?"}]},{"@type":"WebSite","@id":"https:\/\/api-sport.pro\/#website","url":"https:\/\/api-sport.pro\/","name":"API de Eventos Deportivos","description":"API de Eventos Deportivos","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/api-sport.pro\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Person","@id":"https:\/\/api-sport.pro\/#\/schema\/person\/bc93f449b3753a5f254264da266fb601","name":"administrador","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/api-sport.pro\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/8f3dce32feb8659c1f1c917db74325481c6133714f03d5a9433ba6df23a857ab?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/8f3dce32feb8659c1f1c917db74325481c6133714f03d5a9433ba6df23a857ab?s=96&d=mm&r=g","caption":"admin"},"sameAs":["http:\/\/api-sport.pro"],"url":"https:\/\/api-sport.pro\/es\/author\/admin\/"}]}},"_links":{"self":[{"href":"https:\/\/api-sport.pro\/es\/wp-json\/wp\/v2\/posts\/1274","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/api-sport.pro\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/api-sport.pro\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/api-sport.pro\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/api-sport.pro\/es\/wp-json\/wp\/v2\/comments?post=1274"}],"version-history":[{"count":3,"href":"https:\/\/api-sport.pro\/es\/wp-json\/wp\/v2\/posts\/1274\/revisions"}],"predecessor-version":[{"id":1685,"href":"https:\/\/api-sport.pro\/es\/wp-json\/wp\/v2\/posts\/1274\/revisions\/1685"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/api-sport.pro\/es\/wp-json\/wp\/v2\/media\/1273"}],"wp:attachment":[{"href":"https:\/\/api-sport.pro\/es\/wp-json\/wp\/v2\/media?parent=1274"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/api-sport.pro\/es\/wp-json\/wp\/v2\/categories?post=1274"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/api-sport.pro\/es\/wp-json\/wp\/v2\/tags?post=1274"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}