{"id":1230,"date":"2025-12-17T20:08:12","date_gmt":"2025-12-17T17:08:12","guid":{"rendered":"http:\/\/api-sport.pro\/?p=1230"},"modified":"2025-12-17T20:08:12","modified_gmt":"2025-12-17T17:08:12","slug":"como-construir-un-servicio-de-analisis-de-xg-basado-en-datos-abiertos-2","status":"publish","type":"post","link":"https:\/\/api-sport.pro\/es\/como-construir-un-servicio-de-analisis-de-xg-basado-en-datos-abiertos-2\/","title":{"rendered":"\u00bfC\u00f3mo construir un servicio de an\u00e1lisis de xG basado en datos abiertos?"},"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\">\u00bfQu\u00e9 es el xG en el f\u00fatbol y por qu\u00e9 se necesita el servicio de an\u00e1lisis de xG?<\/a><\/li>\n<li class=\"table-of-contents-li\"><a class=\"table-of-contents-a\" href=\"#contents-2\">Datos abiertos y APIs gratuitas para estad\u00edsticas de f\u00fatbol para modelos de xG.<\/a><\/li>\n<li class=\"table-of-contents-li\"><a class=\"table-of-contents-a\" href=\"#contents-3\">C\u00f3mo elegir y conectar una API de eventos deportivos para el c\u00e1lculo de xG.<\/a><\/li>\n<li class=\"table-of-contents-li\"><a class=\"table-of-contents-a\" href=\"#contents-4\">C\u00f3mo construir un modelo de xG basado en eventos de partidos a partir de datos abiertos.<\/a><\/li>\n<li class=\"table-of-contents-li\"><a class=\"table-of-contents-a\" href=\"#contents-5\">Arquitectura del servicio de an\u00e1lisis de xG: almacenamiento, procesamiento y actualizaci\u00f3n de datos.<\/a><\/li>\n<li class=\"table-of-contents-li\"><a class=\"table-of-contents-a\" href=\"#contents-6\">C\u00f3mo crear una API p\u00fablica para el servicio de xG e integrarla con el sitio web y aplicaciones.<\/a><\/li>\n<li class=\"table-of-contents-li\"><a class=\"table-of-contents-a\" href=\"#contents-7\">Visualizaci\u00f3n de estad\u00edsticas de xG: paneles, gr\u00e1ficos e informes para usuarios.<\/a><\/li>\n<\/ul>\n<\/div>\n<div class=\"universal_article\">\n<h2 id=\"contents-1\">\u00bfQu\u00e9 es el xG en el f\u00fatbol y por qu\u00e9 se necesita el servicio de an\u00e1lisis de xG?<\/h2>\n<p>El xG (goles esperados) es una m\u00e9trica que eval\u00faa la probabilidad de que un tiro espec\u00edfico a puerta resulte en un gol. Para cada tiro, el modelo de xG asigna un valor de 0 a 1, donde 0 significa un momento casi sin esperanza, y 1 significa un gol pr\u00e1cticamente garantizado. A nivel final, el xG de un equipo para un partido o temporada muestra cu\u00e1ntos goles el equipo <strong>deber\u00eda haber<\/strong> anotado en funci\u00f3n de la calidad de las oportunidades creadas, en lugar del resultado real en el marcador.<\/p>\n<p>Los servicios de an\u00e1lisis de xG te permiten ver lo que est\u00e1 oculto detr\u00e1s del marcador: la verdadera calidad del juego, la estabilidad del estilo, la efectividad del ataque y la defensa. Los clubes utilizan el xG para evaluar entrenadores y jugadores, los cazatalentos lo utilizan para seleccionar refuerzos, los medios lo utilizan para an\u00e1lisis de partidos en profundidad, y los operadores de apuestas y pronosticadores lo utilizan para construir modelos de pron\u00f3stico avanzados. A diferencia de las estad\u00edsticas simples de tiros o posesi\u00f3n, el xG tiene en cuenta el contexto del momento: la zona de tiro, el tipo de pase, la posici\u00f3n de los defensores, la posici\u00f3n del portero y otros factores (en modelos avanzados).<\/p>\n<p>Un servicio de an\u00e1lisis de xG separado convierte estos c\u00e1lculos en un producto: paneles interactivos, gr\u00e1ficos de xG durante el partido, mapas de tiros, clasificaciones de equipos y jugadores a lo largo del tiempo. Tal servicio puede monetizarse a trav\u00e9s de suscripciones, acceso B2B, asociaciones con medios y casas de apuestas. Para que el servicio de xG sea sostenible y escalable, debe depender de una fuente de datos confiable \u2014 principalmente de <strong>API de eventos deportivos<\/strong>, que proporciona de manera consistente partidos, eventos y estad\u00edsticas en un formato legible por m\u00e1quina conveniente.<\/p>\n<\/div>\n<div class=\"universal_article\">\n<h2 id=\"contents-2\">Datos abiertos y APIs gratuitas para estad\u00edsticas de f\u00fatbol para modelos de xG.<\/h2>\n<p>Puedes comenzar a trabajar en un servicio de xG con datos abiertos: protocolos de partidos disponibles p\u00fablicamente de ligas y federaciones, archivos CSV de entusiastas, planes de demostraci\u00f3n gratuitos o API gratuitas. Sin embargo, tales fuentes a menudo proporcionan una cantidad limitada de informaci\u00f3n: el marcador final, goles, autores y a veces estad\u00edsticas b\u00e1sicas del equipo. Para construir un modelo de xG sostenible, esto generalmente no es suficiente, especialmente si deseas tener en cuenta la calidad de los momentos, las zonas de tiro, o crear m\u00e9tricas avanzadas como xGOT (goles esperados a puerta) y xA (asistencias esperadas).<\/p>\n<p>Las APIs gratuitas generalmente est\u00e1n limitadas en el n\u00famero de solicitudes por d\u00eda, el n\u00famero de torneos o la profundidad de la historia. Para un prototipo, esto puede ser suficiente, pero para un servicio comercial de xG, necesitas disponibilidad garantizada, escalabilidad y datos detallados del partido. Aqu\u00ed, es m\u00e1s conveniente depender de soluciones especializadas a nivel de <a href=\"http:\/\/api-sport.pro\/es\/\">por el API de eventos deportivos api-sport.ru<\/a>, que combinan un amplio conjunto de torneos, historia de temporadas y estad\u00edsticas detalladas de partidos en un formato unificado.<\/p>\n<p>Por ejemplo, incluso a nivel de estad\u00edsticas de equipo, puedes recopilar caracter\u00edsticas importantes de xG: el n\u00famero de tiros a puerta, tiros desde el \u00e1rea penal, \u00abgrandes oportunidades\u00bb, amenazas de jugadas a bal\u00f3n parado, etc. Todo esto est\u00e1 disponible a trav\u00e9s de una \u00fanica solicitud HTTP a la API. Un ejemplo simple de una solicitud para partidos por fecha utilizando la API de Eventos Deportivos podr\u00eda verse as\u00ed:<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\" data-no-translation=\"\">\nfetch('https:\/\/api.api-sport.ru\/v2\/football\/matches?date=2025-09-03', {\n  headers: {\n    'Authorization': 'YOUR_API_KEY'\n  }\n})\n  .then(res =&gt; res.json())\n  .then(data =&gt; {\n    console.log('\u0412\u0441\u0435\u0433\u043e \u043c\u0430\u0442\u0447\u0435\u0439:', data.totalMatches);\n    \/\/ \u0437\u0434\u0435\u0441\u044c \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043e\u0442\u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0443\u0436\u043d\u044b\u0435 \u0442\u0443\u0440\u043d\u0438\u0440\u044b \u0438 \u0434\u0430\u043b\u044c\u0448\u0435 \u0437\u0430\u0431\u0438\u0440\u0430\u0442\u044c \u0434\u0435\u0442\u0430\u043b\u0438 \u043f\u043e \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u043c\u0430\u0442\u0447\u0443\n  });\n<\/pre>\n<p>Basado en tales respuestas, formas un conjunto de datos en bruto: partidos, torneo, equipos, marcador, estad\u00edsticas b\u00e1sicas. Luego puedes enriquecerlo con eventos (goles, tiros, tarjetas) y construir tu modelo de xG sobre esta capa. La principal ventaja del enfoque de API es que los datos llegan en una forma estructurada y est\u00e1n listos para ser cargados directamente en el almacenamiento sin etiquetado manual y an\u00e1lisis HTML.<\/p>\n<\/div>\n<div class=\"universal_article\">\n<h2 id=\"contents-3\">C\u00f3mo elegir y conectar una API de eventos deportivos para el c\u00e1lculo de xG.<\/h2>\n<p>Al elegir una API de eventos deportivos para tareas de xG, varios criterios son importantes: la profundidad de las estad\u00edsticas de partidos, la cobertura de torneos, la estabilidad de operaci\u00f3n, as\u00ed como la disponibilidad de datos hist\u00f3ricos y actualizaciones en vivo. Para casos de xG, los campos con estad\u00edsticas avanzadas sobre tiros y momentos son especialmente \u00fatiles. En la API de Eventos Deportivos, estos datos est\u00e1n disponibles a trav\u00e9s de la entidad <code>estad\u00edsticasDelPartido<\/code>, que se puede obtener al solicitar una lista de partidos o informaci\u00f3n detallada sobre un juego espec\u00edfico.<\/p>\n<p>El algoritmo para la selecci\u00f3n y conexi\u00f3n generalmente se ve as\u00ed: primero, pruebas la funcionalidad en varias ligas, eval\u00faas la estructura de las respuestas y la completitud de las estad\u00edsticas, luego organizas el acceso y configuras la carga autom\u00e1tica. En el caso del servicio <a href=\"https:\/\/app.api-sport.ru\">cuenta personal API-Sport<\/a> permite obtener r\u00e1pidamente una clave API y gestionarla (restricciones, estad\u00edsticas de uso, cambio de clave). Luego, la clave se pasa simplemente en el encabezado <code>Autorizaci\u00f3n<\/code> con cada solicitud.<\/p>\n<p>A continuaci\u00f3n se muestra un ejemplo de c\u00f3mo obtener informaci\u00f3n detallada sobre un partido por su ID, incluidos eventos y estad\u00edsticas, que luego se pueden utilizar en c\u00e1lculos de xG:<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\" data-no-translation=\"\">\nconst matchId = 14570728;\nfetch(`https:\/\/api.api-sport.ru\/v2\/football\/matches\/${matchId}`, {\n  headers: {\n    'Authorization': 'YOUR_API_KEY'\n  }\n})\n  .then(res =&gt; res.json())\n  .then(match =&gt; {\n    const stats = match.matchStatistics;\n    const odds = match.oddsBase; \/\/ \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u044b \u0431\u0443\u043a\u043c\u0435\u043a\u0435\u0440\u043e\u0432 \u0434\u043b\u044f \u0431\u0435\u0442\u0442\u0438\u043d\u0433-\u043c\u043e\u0434\u0435\u043b\u0435\u0439\n    const events = match.liveEvents; \/\/ \u0433\u043e\u043b\u044b, \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0438, \u0434\u0440\u0443\u0433\u0438\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f\n    console.log('\u0421\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0430 \u043c\u0430\u0442\u0447\u0430 \u0434\u043b\u044f xG-\u043c\u043e\u0434\u0435\u043b\u0438:', stats);\n  });\n<\/pre>\n<p>Es importante que en la misma respuesta recibas no solo estad\u00edsticas (la base para xG) sino tambi\u00e9n cuotas de casas de apuestas a trav\u00e9s de <code>oddsBase<\/code>. Esto te permite construir modelos h\u00edbridos que comparan el puntaje \u00abjusto\u00bb por xG con las estimaciones del mercado y la din\u00e1mica de la l\u00ednea.<\/p>\n<\/div>\n<div class=\"universal_article\">\n<h2 id=\"contents-4\">C\u00f3mo construir un modelo de xG basado en eventos de partidos a partir de datos abiertos.<\/h2>\n<p>El modelo de xG es esencialmente un algoritmo que produce la probabilidad de un gol basado en un conjunto de caracter\u00edsticas del momento (disparo). Idealmente, la entrada incluye las coordenadas del disparo, tipo de pase, parte del cuerpo, situaci\u00f3n (juego\/tiro libre), presi\u00f3n de los defensores y otras caracter\u00edsticas detalladas. Si tienes tal nivel de datos de eventos de fuentes abiertas, puedes entrenar un modelo de regresi\u00f3n log\u00edstica, un modelo de boosting por gradientes o una arquitectura de red neuronal. Sin embargo, incluso sin coordenadas, puedes construir una estimaci\u00f3n \u00fatil de xG del equipo a nivel de estad\u00edsticas agregadas disponibles a trav\u00e9s de la API de Eventos Deportivos.<\/p>\n<p>Por ejemplo, en <code>estad\u00edsticasDelPartido<\/code> hay grupos <em>Disparos<\/em>, <em>Ataque<\/em>, <em>Resumen del partido<\/em>, que contienen caracter\u00edsticas que correlacionan fuertemente con los goles esperados: <code>totalDisparosALaPorter\u00eda<\/code>, <code>disparosALaPorter\u00eda<\/code>, <code>totalDisparosDentroDel\u00c1rea<\/code>, <code>granOportunidadCreada<\/code>, <code>granOportunidadMarcada<\/code>, <code>golpe\u00f3ElTravesa\u00f1o<\/code> y otros. En el conjunto de datos hist\u00f3ricos de partidos, puedes ajustar los pesos para estas m\u00e9tricas y obtener una aproximaci\u00f3n del xG del equipo sin datos de seguimiento. Este enfoque ya permite construir clasificaciones de equipos y comparar la calidad del juego a lo largo del tiempo.<\/p>\n<p>Un ejemplo de un c\u00e1lculo simplificado del xG del equipo en Python basado en estad\u00edsticas de partidos obtenidas a trav\u00e9s de la API:<\/p>\n<pre class=\"brush: python; title: ; notranslate\" title=\"\" data-no-translation=\"\">\nimport requests\nAPI_KEY = 'YOUR_API_KEY'\nMATCH_ID = 14570728\nresp = requests.get(\n    f'https:\/\/api.api-sport.ru\/v2\/football\/matches\/{MATCH_ID}',\n    headers={'Authorization': API_KEY}\n)\nmatch = resp.json()\nstats = match&#x5B;'matchStatistics']\nall_period = next(p for p in stats if p&#x5B;'period'] == 'ALL')\nshots_group = next(g for g in all_period&#x5B;'groups'] if g&#x5B;'groupName'] == 'Shots')\nvalues = {item&#x5B;'key']: (item&#x5B;'homeValue'], item&#x5B;'awayValue']) for item in shots_group&#x5B;'statisticsItems']}\n# \u041f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043d\u0430\u044f \u043b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c xG \u043d\u0430 \u0430\u0433\u0440\u0435\u0433\u0430\u0442\u0430\u0445\nweights = {\n    'totalShotsInsideBox': 0.10,\n    'shotsOnGoal': 0.08,\n    'bigChanceCreated': 0.30,\n}\ndef calc_team_xg(side_index):\n    xg = 0.0\n    for key, w in weights.items():\n        if key in values:\n            xg += values&#x5B;key]&#x5B;side_index] * w\n    return xg\nhome_xg = calc_team_xg(0)\naway_xg = calc_team_xg(1)\nprint('\u041e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0435 \u0433\u043e\u043b\u044b (\u0443\u043f\u0440\u043e\u0449\u0435\u043d\u043d\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c):', home_xg, away_xg)\n<\/pre>\n<p>Tal ejemplo est\u00e1 lejos de los modelos acad\u00e9micos avanzados, pero demuestra el enfoque en s\u00ed: utilizas agregados estables de la API y ajustas los pesos basados en datos hist\u00f3ricos. A medida que el servicio evoluciona, puedes agregar caracter\u00edsticas adicionales (por ejemplo, posesi\u00f3n, n\u00famero de penetraciones en el tercio final, tipos de ataques), as\u00ed como conectar modelos de IA para predicciones de probabilidad m\u00e1s precisas, incluyendo sobre nuevas capacidades que aparecen en los proveedores de API.<\/p>\n<\/div>\n<div class=\"universal_article\">\n<h2 id=\"contents-5\">Arquitectura del servicio de an\u00e1lisis de xG: almacenamiento, procesamiento y actualizaci\u00f3n de datos.<\/h2>\n<p>Un servicio de xG completo no es solo un modelo, sino tambi\u00e9n una arquitectura de datos. En una soluci\u00f3n t\u00edpica, se distinguen varias capas: una capa de ingesti\u00f3n de datos de APIs externas, una capa de almacenamiento (OLTP\/OLAP), una capa de c\u00e1lculo (por lotes y casi en tiempo real), y una capa de entrega (tu API p\u00fablica o interna). Los partidos hist\u00f3ricos se cargan en lotes, mientras que los nuevos juegos se programan o est\u00e1n en modo casi en vivo, para que los usuarios puedan ver gr\u00e1ficos de xG actuales durante el partido.<\/p>\n<p>La API de Eventos Deportivos es conveniente de usar como una \u00fanica fuente de datos. Para la historia, pasas por temporadas y torneos, para en vivo \u2014 consultas regularmente los endpoints <code>\/v2\/f\u00fatbol\/partidos<\/code> con estado <code>en progreso<\/code> y luego tomas los detalles de los partidos que te interesan. En un futuro cercano, las suscripciones de WebSocket est\u00e1n apareciendo activamente en las infraestructuras de tales proveedores, incluyendo api-sport.ru, lo que te permite abandonar la consulta frecuente y recibir eventos en modo \u00abpush\u00bb \u2014 esto es especialmente importante para gr\u00e1ficos de xG en vivo y escenarios de apuestas.<\/p>\n<p>A continuaci\u00f3n se muestra un ejemplo de un simple \u00abtrabajador\u00bb en Node.js que actualiza regularmente los datos sobre partidos en vivo y los escribe en tu almacenamiento (funci\u00f3n designada condicionalmente <code>guardarPartido<\/code>):<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\" data-no-translation=\"\">\nconst API_KEY = 'YOUR_API_KEY';\nasync function loadLiveMatches() {\n  const res = await fetch('https:\/\/api.api-sport.ru\/v2\/football\/matches?status=inprogress', {\n    headers: { 'Authorization': API_KEY }\n  });\n  const data = await res.json();\n  for (const match of data.matches) {\n    \/\/ \u0437\u0434\u0435\u0441\u044c \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0437\u0430\u0431\u0440\u0430\u0442\u044c \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0438\u043b\u0438 \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0443, \u0435\u0441\u043b\u0438 \u043d\u0443\u0436\u043d\u043e\n    await saveMatch(match); \/\/ \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0432 \u0411\u0414\n  }\n}\n\/\/ \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a: \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c \u043a\u0430\u0436\u0434\u044b\u0435 30 \u0441\u0435\u043a\u0443\u043d\u0434\nsetInterval(loadLiveMatches, 30_000);\n<\/pre>\n<p>En una arquitectura real, agregar\u00edas una cola de tareas, reintentos en errores, almacenamiento en cach\u00e9 y un circuito separado para la carga hist\u00f3rica. Una capa importante separada son los c\u00e1lculos de xG: el modelo puede ejecutarse tanto peri\u00f3dicamente (por lotes para partidos completados) como en modo casi en vivo (c\u00e1lculo despu\u00e9s de cada actualizaci\u00f3n de estad\u00edsticas). A medida que aparecen canales de WebSocket y herramientas de IA en APIs de terceros, podr\u00e1s simplificar a\u00fan m\u00e1s este circuito al descargar parte de la l\u00f3gica a procesamiento en streaming.<\/p>\n<\/div>\n<div class=\"universal_article\">\n<h2 id=\"contents-6\">C\u00f3mo crear una API p\u00fablica para el servicio de xG e integrarla con el sitio web y aplicaciones.<\/h2>\n<p>Cuando los c\u00e1lculos de xG ya se est\u00e1n realizando regularmente y los datos se almacenan, el siguiente paso es crear tu propia API de servicio p\u00fablico de xG. Por lo general, se implementan varios endpoints principales: xG por partido (a nivel de equipo y de jugador), agregados por torneos y temporadas, clasificaciones de equipos y jugadores, as\u00ed como l\u00edneas de tiempo para construir gr\u00e1ficos durante el juego. Tal API debe ser simple y predecible: URLs estables, esquema de respuesta claro, autenticaci\u00f3n conveniente (claves API u OAuth) y l\u00edmites de solicitud.<\/p>\n<p>La API p\u00fablica de xG se integra bien tanto con sitios web como con aplicaciones m\u00f3viles, paneles anal\u00edticos y plataformas de apuestas. En el lado del backend, la API de xG puede combinar datos de su propia base de datos con informaci\u00f3n actualizada recibida en tiempo real de <a href=\"http:\/\/api-sport.pro\/es\/\">la API deportiva api-sport.ru<\/a> \u2014 por ejemplo, mezclando cuotas en vivo de casas de apuestas de <code>oddsBase<\/code> o actualizando el estado del partido. A continuaci\u00f3n se muestra un ejemplo simplificado de una ruta en Node.js (Express) que devuelve xG por partido junto con informaci\u00f3n b\u00e1sica sobre el juego en s\u00ed:<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\" data-no-translation=\"\">\nconst express = require('express');\nconst fetch = require('node-fetch');\nconst app = express();\nconst API_KEY = 'YOUR_API_KEY';\napp.get('\/api\/xg\/match\/:id', async (req, res) =&gt; {\n  const matchId = req.params.id;\n  \/\/ 1. \u0411\u0435\u0440\u0435\u043c \u043f\u0440\u0435\u0434\u0440\u0430\u0441\u0447\u0438\u0442\u0430\u043d\u043d\u044b\u0439 xG \u0438\u0437 \u0441\u0432\u043e\u0435\u0439 \u0411\u0414\n  const xgData = await loadXgFromDb(matchId);\n  \/\/ 2. \u041f\u043e\u0434\u043c\u0435\u0448\u0438\u0432\u0430\u0435\u043c \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u043c\u0430\u0442\u0447\u0435 \u0438\u0437 Sport Events API\n  const matchRes = await fetch(`https:\/\/api.api-sport.ru\/v2\/football\/matches\/${matchId}`, {\n    headers: { 'Authorization': API_KEY }\n  });\n  const match = await matchRes.json();\n  res.json({\n    matchId,\n    matchInfo: {\n      status: match.status,\n      score: {\n        home: match.homeScore.current,\n        away: match.awayScore.current\n      }\n    },\n    xg: xgData\n  });\n});\n<\/pre>\n<p>Tal capa de abstracci\u00f3n permite no revelar a los usuarios externos los detalles de la integraci\u00f3n con la fuente de datos y la estructura de las tablas internas. El sitio web o la aplicaci\u00f3n simplemente llama a tu xG-API, recibe una respuesta unificada y construye la visualizaci\u00f3n en el frontend. Para un producto comercial, puedes agregar facturaci\u00f3n, an\u00e1lisis de uso y diferentes niveles de acceso (por ejemplo, solo xG previo al partido o acceso a gr\u00e1ficos en vivo y APIs de casas de apuestas sobre tu propio xG).<\/p>\n<\/div>\n<div class=\"universal_article\">\n<h2 id=\"contents-7\">Visualizaci\u00f3n de estad\u00edsticas de xG: paneles, gr\u00e1ficos e informes para usuarios.<\/h2>\n<p>El punto fuerte de cualquier servicio de xG es la visualizaci\u00f3n. A los usuarios no solo les importan los n\u00fameros, sino tambi\u00e9n las formas visuales: gr\u00e1ficos de xG por minutos de partido, gr\u00e1ficos de barras comparativas de equipos, mapas de tiros, tablas de clasificaci\u00f3n y reportes en PDF\/HTML. Basado en tu API p\u00fablica de xG y datos obtenidos de la API de Eventos Deportivos, se pueden construir paneles interactivos: los usuarios seleccionan un torneo, partido, equipo o jugador y reciben una historia visual de la calidad del juego.<\/p>\n<p>El frontend generalmente recupera datos agregados de tu xG-API y los renderiza a trav\u00e9s de bibliotecas de visualizaci\u00f3n (Chart.js, D3.js, ECharts, etc.). En modo en vivo, los datos se actualizan a trav\u00e9s de WebSocket o mediante solicitudes peri\u00f3dicas. Es importante pensar en el formato de respuesta para que sea conveniente para ti construir tanto gr\u00e1ficos cl\u00e1sicos de xG como representaciones avanzadas \u2014 por ejemplo, combinando xG con la din\u00e1mica de cuotas de casas de apuestas o combinando xG con un mapa de posesi\u00f3n por zonas.<\/p>\n<p>Un ejemplo de una solicitud simple del frontend a tu endpoint de xG para construir un gr\u00e1fico de goles esperados por franjas horarias:<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\" data-no-translation=\"\">\nasync function loadMatchXgTimeline(matchId) {\n  const res = await fetch(`\/api\/xg\/match\/${matchId}\/timeline`);\n  const data = await res.json();\n  \/\/ data = { points: &#x5B;{ minute: 5, homeXg: 0.1, awayXg: 0 }, ...] }\n  const labels = data.points.map(p =&gt; p.minute);\n  const homeSeries = data.points.map(p =&gt; p.homeXg);\n  const awaySeries = data.points.map(p =&gt; p.awayXg);\n  renderXgChart(labels, homeSeries, awaySeries); \/\/ \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438 \u0433\u0440\u0430\u0444\u0438\u043a\u0430 \u043d\u0430 Canvas \u0438\u043b\u0438 SVG\n}\n<\/pre>\n<p>Para usuarios comerciales (clubes, medios, empresas de apuestas), tambi\u00e9n es importante poder generar informes autom\u00e1ticos: despu\u00e9s de cada ronda o partido, su servicio puede generar rese\u00f1as listas con m\u00e9tricas clave de xG, gr\u00e1ficos y conclusiones textuales.<\/p>\n<\/div>","protected":false},"excerpt":{"rendered":"<p>Contenido \u00bfQu\u00e9 es xG en el f\u00fatbol y por qu\u00e9 se necesita el servicio de an\u00e1lisis de xG? Datos abiertos y APIs gratuitas para estad\u00edsticas de f\u00fatbol para modelos de xG C\u00f3mo elegir y conectar una API de eventos deportivos para el c\u00e1lculo de xG C\u00f3mo construir un modelo de xG basado en eventos de partidos a partir de datos abiertos Arquitectura del servicio de an\u00e1lisis de xG: almacenamiento, procesamiento y actualizaci\u00f3n de datos C\u00f3mo crear una API p\u00fablica para el servicio de xG [\u2026]<\/p>","protected":false},"author":1,"featured_media":1229,"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\":\"\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 xG \u0438 \u0447\u0435\u043c \u043e\u043d \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 \u043e\u0431\u044b\u0447\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0438 \u0443\u0434\u0430\u0440\u043e\u0432?\",\"answer\":\"xG (expected goals, \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0435 \u0433\u043e\u043b\u044b) \u043e\u0446\u0435\u043d\u0438\u0432\u0430\u0435\u0442 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u0433\u043e\u043b\u0430 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0443\u0434\u0430\u0440\u0430, \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u044f \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u043c\u043e\u043c\u0435\u043d\u0442\u0430. \u0412 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0438 \u0443\u0434\u0430\u0440\u043e\u0432, xG \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u043e\u043f\u044b\u0442\u043e\u043a, \u0430 \u0438\u0445 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e: \u0438\u0437 \u043a\u0430\u043a\u0438\u0445 \u0437\u043e\u043d \u0431\u0438\u043b\u0438, \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u043f\u0430\u0441\u043d\u044b\u043c\u0438 \u0431\u044b\u043b\u0438 \u043c\u043e\u043c\u0435\u043d\u0442\u044b, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u00ab\u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0448\u0430\u043d\u0441\u043e\u0432\u00bb \u0441\u043e\u0437\u0434\u0430\u043b\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u0438 \u043a\u0430\u043a \u0447\u0430\u0441\u0442\u043e \u043f\u043e\u043f\u0430\u0434\u0430\u043b\u0430 \u0432 \u0441\u0442\u0432\u043e\u0440 \u0438\u0437 \u0432\u044b\u0433\u043e\u0434\u043d\u044b\u0445 \u043f\u043e\u0437\u0438\u0446\u0438\u0439.\"},{\"question\":\"\u041c\u043e\u0436\u043d\u043e \u043b\u0438 \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c xG-\u0441\u0435\u0440\u0432\u0438\u0441 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445?\",\"answer\":\"\u041f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0431\u0430\u0437\u043e\u0432\u044b\u0439 xG-\u0441\u0435\u0440\u0432\u0438\u0441 \u043d\u0430 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0435\u0441\u043b\u0438 \u0432\u044b \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442\u0435 \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 (\u0443\u0434\u0430\u0440\u044b, \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b, \u0442\u0438\u043f\u044b \u0430\u0442\u0430\u043a). \u041e\u0434\u043d\u0430\u043a\u043e \u0434\u043b\u044f \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u043e\u043c\u043c\u0435\u0440\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0430 \u0447\u0430\u0449\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 API \u0441\u043f\u043e\u0440\u0442\u0438\u0432\u043d\u044b\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u0439: \u043e\u043d\u0438 \u0434\u0430\u044e\u0442 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043e\u0442\u0432\u0435\u0442\u044b, \u0435\u0434\u0438\u043d\u044b\u0439 \u0444\u043e\u0440\u043c\u0430\u0442 \u043f\u043e \u043b\u0438\u0433\u0430\u043c, \u0438\u0441\u0442\u043e\u0440\u0438\u044e \u0441\u0435\u0437\u043e\u043d\u043e\u0432 \u0438 live-\u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f, \u0447\u0442\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u0438 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u0430.\"},{\"question\":\"\u041a\u0430\u043a\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0443\u0436\u043d\u044b \u043e\u0442 API \u0441\u043f\u043e\u0440\u0442\u0438\u0432\u043d\u044b\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0434\u043b\u044f \u0440\u0430\u0441\u0447\u0435\u0442\u0430 xG?\",\"answer\":\"\u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u043d\u0430\u0431\u043e\u0440 \u2014 \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0430 \u043f\u043e \u0443\u0434\u0430\u0440\u0430\u043c (\u043e\u0431\u0449\u0435\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e, \u0432 \u0441\u0442\u0432\u043e\u0440, \u0438\u0437 \u0448\u0442\u0440\u0430\u0444\u043d\u043e\u0439, \u00abbig chances\u00bb), \u0430 \u0442\u0430\u043a\u0436\u0435 \u0431\u0430\u0437\u043e\u0432\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043c\u0430\u0442\u0447\u0430: \u043a\u043e\u043c\u0430\u043d\u0434\u044b, \u0442\u0443\u0440\u043d\u0438\u0440, \u0441\u0442\u0430\u0442\u0443\u0441, \u0441\u0447\u0435\u0442. \u0427\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043d\u044b\u0445 \u043f\u0440\u0438\u0437\u043d\u0430\u043a\u043e\u0432 (\u0442\u0438\u043f \u0430\u0442\u0430\u043a\u0438, \u0432\u043b\u0430\u0434\u0435\u043d\u0438\u0435, \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0439 \u0442\u0440\u0435\u0442\u0438), \u0442\u0435\u043c \u0442\u043e\u0447\u043d\u0435\u0435 \u043c\u043e\u0434\u0435\u043b\u044c xG. \u0412 Sport Events API \u0447\u0430\u0441\u0442\u044c \u044d\u0442\u0438\u0445 \u043f\u0440\u0438\u0437\u043d\u0430\u043a\u043e\u0432 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430 \u0432 \u043f\u043e\u043b\u0435 matchStatistics, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0432 \u0441\u043e\u0431\u044b\u0442\u0438\u044f\u0445 \u043c\u0430\u0442\u0447\u0430.\"},{\"question\":\"\u041a\u0430\u043a \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u043a API \u0441\u043f\u043e\u0440\u0442\u0438\u0432\u043d\u044b\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0434\u043b\u044f xG-\u043f\u0440\u043e\u0435\u043a\u0442\u0430?\",\"answer\":\"\u041e\u0431\u044b\u0447\u043d\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u0441\u0430\u0439\u0442\u0435 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u0430, \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c API-\u043a\u043b\u044e\u0447 \u0432 \u043b\u0438\u0447\u043d\u043e\u043c \u043a\u0430\u0431\u0438\u043d\u0435\u0442\u0435 \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0432 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0435 Authorization \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u0435. \u0414\u0430\u043b\u0435\u0435 \u0432\u044b \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442\u0435 \u043d\u0443\u0436\u043d\u044b\u0439 \u0432\u0438\u0434 \u0441\u043f\u043e\u0440\u0442\u0430 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, football), \u0442\u0443\u0440\u043d\u0438\u0440\u044b \u0438 \u0441\u0435\u0437\u043e\u043d\u044b, \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0435 \u0432\u044b\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u043c\u0430\u0442\u0447\u0438, \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0438 \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0443 \u0438 \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430 \u0438\u0445 \u043e\u0441\u043d\u043e\u0432\u0435 \u0441\u0432\u043e\u0439 \u043e\u0431\u0443\u0447\u0430\u044e\u0449\u0438\u0439 \u0434\u0430\u0442\u0430\u0441\u0435\u0442 \u0434\u043b\u044f xG-\u043c\u043e\u0434\u0435\u043b\u0438.\"},{\"question\":\"\u041a\u0430\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c xG-\u0441\u0435\u0440\u0432\u0438\u0441 \u0432 \u0431\u0435\u0442\u0442\u0438\u043d\u0433\u0435 \u0438 \u043c\u043e\u0434\u0435\u043b\u044f\u0445 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u043e\u0432?\",\"answer\":\"xG-\u0441\u0435\u0440\u0432\u0438\u0441 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0446\u0435\u043d\u0438\u0432\u0430\u0442\u044c \u0440\u0435\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0438\u043b\u0443 \u043a\u043e\u043c\u0430\u043d\u0434 \u043d\u0430 \u0434\u0438\u0441\u0442\u0430\u043d\u0446\u0438\u0438 \u0438 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e \u0438\u0445 \u043c\u043e\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u043c \u043c\u0430\u0442\u0447\u0435. \u0421\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044f xG-\u043e\u0446\u0435\u043d\u043a\u0438 \u0441 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u0430\u043c\u0438 \u0431\u0443\u043a\u043c\u0435\u043a\u0435\u0440\u043e\u0432 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0447\u0435\u0440\u0435\u0437 \u043f\u043e\u043b\u0435 oddsBase \u0432 \u043e\u0442\u0432\u0435\u0442\u0430\u0445 Sport Events API), \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0438 \u0438 \u0442\u0440\u0435\u0439\u0434\u0435\u0440\u044b \u0441\u0442\u0440\u043e\u044f\u0442 \u043c\u043e\u0434\u0435\u043b\u0438 value-betting, \u043d\u0430\u0445\u043e\u0434\u044f\u0442 \u043f\u0435\u0440\u0435\u043e\u0446\u0435\u043d\u0435\u043d\u043d\u044b\u0435 \u0438 \u043d\u0435\u0434\u043e\u043e\u0446\u0435\u043d\u0435\u043d\u043d\u044b\u0435 \u043b\u0438\u043d\u0438\u0438 \u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u0443\u044e\u0442 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044e \u0441\u0442\u0430\u0432\u043e\u043a \u043d\u0430 \u0438\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445.\"}]","footnotes":""},"categories":[1],"tags":[],"class_list":["post-1230","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blog"],"yoast_head":"<title>How to build an xG analysis service on open data \u2014 sports API<\/title>\n<meta name=\"description\" content=\"Guide to creating an xG service based on open data and sports event APIs. For analysts, media, and betting. Learn how to launch your xG service.\" \/>\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-construir-un-servicio-de-analisis-de-xg-basado-en-datos-abiertos-2\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"How to build an xG analysis service on open data \u2014 sports API\" \/>\n<meta property=\"og:description\" content=\"Guide to creating an xG service based on open data and sports event APIs. For analysts, media, and betting. Learn how to launch your xG service.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/api-sport.pro\/es\/como-construir-un-servicio-de-analisis-de-xg-basado-en-datos-abiertos-2\/\" \/>\n<meta property=\"og:site_name\" content=\"Sports Events API\" \/>\n<meta property=\"article:published_time\" content=\"2025-12-17T17:08:12+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/api-sport.pro\/wp-content\/uploads\/2025\/11\/kak-postroit-servis-xg-analizov-na-osnove-otkrytykh-dannykh_posts.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1408\" \/>\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=\"12 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-build-an-xg-analysis-service-based-on-open-data-2\/\",\"url\":\"https:\/\/api-sport.pro\/how-to-build-an-xg-analysis-service-based-on-open-data-2\/\",\"name\":\"How to build an xG analysis service on open data \u2014 sports API\",\"isPartOf\":{\"@id\":\"https:\/\/api-sport.pro\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/api-sport.pro\/how-to-build-an-xg-analysis-service-based-on-open-data-2\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/api-sport.pro\/how-to-build-an-xg-analysis-service-based-on-open-data-2\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/api-sport.pro\/wp-content\/uploads\/2025\/11\/kak-postroit-servis-xg-analizov-na-osnove-otkrytykh-dannykh_posts.jpg\",\"datePublished\":\"2025-12-17T17:08:12+00:00\",\"author\":{\"@id\":\"https:\/\/api-sport.pro\/#\/schema\/person\/bc93f449b3753a5f254264da266fb601\"},\"description\":\"Guide to creating an xG service based on open data and sports event APIs. For analysts, media, and betting. Learn how to launch your xG service.\",\"breadcrumb\":{\"@id\":\"https:\/\/api-sport.pro\/how-to-build-an-xg-analysis-service-based-on-open-data-2\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/api-sport.pro\/how-to-build-an-xg-analysis-service-based-on-open-data-2\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/api-sport.pro\/how-to-build-an-xg-analysis-service-based-on-open-data-2\/#primaryimage\",\"url\":\"https:\/\/api-sport.pro\/wp-content\/uploads\/2025\/11\/kak-postroit-servis-xg-analizov-na-osnove-otkrytykh-dannykh_posts.jpg\",\"contentUrl\":\"https:\/\/api-sport.pro\/wp-content\/uploads\/2025\/11\/kak-postroit-servis-xg-analizov-na-osnove-otkrytykh-dannykh_posts.jpg\",\"width\":1408,\"height\":768,\"caption\":\"\u041a\u0430\u043a \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0441\u0435\u0440\u0432\u0438\u0441 xG-\u0430\u043d\u0430\u043b\u0438\u0437\u043e\u0432 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445?\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/api-sport.pro\/how-to-build-an-xg-analysis-service-based-on-open-data-2\/#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 build an xG analysis service based on open data?\"}]},{\"@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":"C\u00f3mo construir un servicio de an\u00e1lisis xG sobre datos abiertos \u2014 API de deportes","description":"Gu\u00eda para crear un servicio xG basado en datos abiertos y APIs de eventos deportivos. Para analistas, medios y apuestas. Aprende c\u00f3mo lanzar tu servicio xG.","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-construir-un-servicio-de-analisis-de-xg-basado-en-datos-abiertos-2\/","og_locale":"es_ES","og_type":"article","og_title":"How to build an xG analysis service on open data \u2014 sports API","og_description":"Guide to creating an xG service based on open data and sports event APIs. For analysts, media, and betting. Learn how to launch your xG service.","og_url":"https:\/\/api-sport.pro\/es\/como-construir-un-servicio-de-analisis-de-xg-basado-en-datos-abiertos-2\/","og_site_name":"Sports Events API","article_published_time":"2025-12-17T17:08:12+00:00","og_image":[{"width":1408,"height":768,"url":"https:\/\/api-sport.pro\/wp-content\/uploads\/2025\/11\/kak-postroit-servis-xg-analizov-na-osnove-otkrytykh-dannykh_posts.jpg","type":"image\/jpeg"}],"author":"admin","twitter_card":"summary_large_image","twitter_misc":{"Escrito por":"admin","Tiempo de lectura":"12 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/api-sport.pro\/how-to-build-an-xg-analysis-service-based-on-open-data-2\/","url":"https:\/\/api-sport.pro\/how-to-build-an-xg-analysis-service-based-on-open-data-2\/","name":"C\u00f3mo construir un servicio de an\u00e1lisis xG sobre datos abiertos \u2014 API de deportes","isPartOf":{"@id":"https:\/\/api-sport.pro\/#website"},"primaryImageOfPage":{"@id":"https:\/\/api-sport.pro\/how-to-build-an-xg-analysis-service-based-on-open-data-2\/#primaryimage"},"image":{"@id":"https:\/\/api-sport.pro\/how-to-build-an-xg-analysis-service-based-on-open-data-2\/#primaryimage"},"thumbnailUrl":"https:\/\/api-sport.pro\/wp-content\/uploads\/2025\/11\/kak-postroit-servis-xg-analizov-na-osnove-otkrytykh-dannykh_posts.jpg","datePublished":"2025-12-17T17:08:12+00:00","author":{"@id":"https:\/\/api-sport.pro\/#\/schema\/person\/bc93f449b3753a5f254264da266fb601"},"description":"Gu\u00eda para crear un servicio xG basado en datos abiertos y APIs de eventos deportivos. Para analistas, medios y apuestas. Aprende c\u00f3mo lanzar tu servicio xG.","breadcrumb":{"@id":"https:\/\/api-sport.pro\/how-to-build-an-xg-analysis-service-based-on-open-data-2\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/api-sport.pro\/how-to-build-an-xg-analysis-service-based-on-open-data-2\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/api-sport.pro\/how-to-build-an-xg-analysis-service-based-on-open-data-2\/#primaryimage","url":"https:\/\/api-sport.pro\/wp-content\/uploads\/2025\/11\/kak-postroit-servis-xg-analizov-na-osnove-otkrytykh-dannykh_posts.jpg","contentUrl":"https:\/\/api-sport.pro\/wp-content\/uploads\/2025\/11\/kak-postroit-servis-xg-analizov-na-osnove-otkrytykh-dannykh_posts.jpg","width":1408,"height":768,"caption":"\u041a\u0430\u043a \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0441\u0435\u0440\u0432\u0438\u0441 xG-\u0430\u043d\u0430\u043b\u0438\u0437\u043e\u0432 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445?"},{"@type":"BreadcrumbList","@id":"https:\/\/api-sport.pro\/how-to-build-an-xg-analysis-service-based-on-open-data-2\/#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 build an xG analysis service based on open data?"}]},{"@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\/1230","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=1230"}],"version-history":[{"count":3,"href":"https:\/\/api-sport.pro\/es\/wp-json\/wp\/v2\/posts\/1230\/revisions"}],"predecessor-version":[{"id":1670,"href":"https:\/\/api-sport.pro\/es\/wp-json\/wp\/v2\/posts\/1230\/revisions\/1670"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/api-sport.pro\/es\/wp-json\/wp\/v2\/media\/1229"}],"wp:attachment":[{"href":"https:\/\/api-sport.pro\/es\/wp-json\/wp\/v2\/media?parent=1230"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/api-sport.pro\/es\/wp-json\/wp\/v2\/categories?post=1230"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/api-sport.pro\/es\/wp-json\/wp\/v2\/tags?post=1230"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}