API de LeagueSpy v2

Las predicciones de alineación de fútbol más precisas del mercado. Rastreamos lesiones, suspensiones y patrones de rotación de plantilla para prever quién es titular, quién se sienta en el banquillo y quién está fuera, antes que nadie.

URL base https://api.leaguespy.com
Versión 2.0.0
Protocolo REST / JSON
Comparar niveles de API

Inicio rápido

1
Obtenga su clave API — contáctenos o solicite acceso a través de su administrador de cuenta.
2
Realice su primera llamada:
curl -H "X-API-Key: YOUR_KEY" \
  "https://api.leaguespy.com/v2/fixtures/updates?limit=1"
3
Recibirá datos de alineación en su primera respuesta. Filtre por league_id o team_id para acotar los resultados, o utilice updated_since para consultar únicamente los cambios.

Autenticación

Cada petición requiere una clave API. Pásela como cabecera (header) o como parámetro de consulta (query parameter).

# Cabecera (recomendado)
curl -H "X-API-Key: YOUR_KEY" \
  "https://api.leaguespy.com/v2/fixtures/updates"

# Parámetro de consulta
curl "https://api.leaguespy.com/v2/fixtures/updates?api_key=YOUR_KEY"
Seguridad de la clave. Las claves API deben tener al menos 32 caracteres. Nunca las exponga en código del lado del cliente o repositorios públicos.

Niveles

Cada clave API está vinculada a un nivel (tier). Su nivel determina la actualidad de los datos, la frecuencia de actualización y la visibilidad de los campos.

NivelSincronizaciónDescripción
professionalCada 3 horasXI y banquillo predichos, ausentes con motivo, alineaciones oficiales en cuanto se publican. Ver las competiciones.
realtime≤15 minProfundidad completa: probabilidades y minutos esperados, roles de plantilla, impacto de ausencias, jugadores que regresan, batallas por posición, estadísticas de temporada. Ver las competiciones.
Su nivel actual se devuelve en cada respuesta bajo meta.tier y subscription.tier.

Listar actualizaciones de partidos

GET /v2/fixtures/updates

Devuelve vistas previas de la alineación ordenadas por actualización más reciente. Incluye el XI predicho, banquillo, jugadores ausentes y alineaciones confirmadas cuando están disponibles.

Parámetros de consulta

ParámetroTipoPor defectoDescripción
limitinteger20Resultados por página. Rango: 1–100.
offsetinteger0Desplazamiento de paginación. Rango: 0–5000.
team_idstring—Filtrar por ID público del equipo (coincide local o visitante).
league_idstring—Filtrar por ID público de la liga.
fixture_idstring—Filtrar por ID público del partido.
updated_sincestring—Fecha/hora ISO 8601 con zona horaria. Sólo devuelve partidos actualizados después de este momento. Periodo máximo de consulta: 48 horas.
2026-06-05T08:30:00Z
cursorstring—Cursor opaco de paginación para polling incremental estable. Use el valor next_cursor de la respuesta anterior. Sólo válido junto con updated_since. No se puede combinar con offset.
includestring—Bloques opcionales, separados por comas. league_stats añade estadísticas de temporada a los jugadores, broadcasts las emisoras de TV y streaming del partido.
langstring—Idioma de nombres, posiciones y motivos, p. ej. ko. Ver Localización.
IDs públicos. Todos los IDs de entidad en v2 son cadenas opacas, no enteros. Utilice los IDs exactamente como los devuelve la API.

Ejemplo de petición

curl -H "X-API-Key: YOUR_KEY" \
  "https://api.leaguespy.com/v2/fixtures/updates?league_id=lg_xyz789&limit=5"
Comparar niveles de API

Respuesta

{
  "data": [
    {
      "fixture_id": "VJfWANbE",
      "home_team_id": "11uGdbIt",
      "home_team_name": "Levante",
      "home_team_name_en": "Levante",
      "home_team_logo": "https://img.leaguespy.com/teams/11uGdbIt.png",
      "away_team_id": "aGpkiedc",
      "away_team_name": "Athletic Club",
      "away_team_name_en": "Athletic Club",
      "away_team_logo": "https://img.leaguespy.com/teams/aGpkiedc.png",
      "league_id": "QBIQ7xJS",
      "league_name": "La Liga",
      "league_name_en": "La Liga",
      "league_logo": "https://img.leaguespy.com/leagues/QBIQ7xJS.png",
      "country_name": "Spain",
      "country_name_en": "Spain",
      "season_id": "n82fEZtc",
      "season_name": "2026/2027",
      "starting_at": "2026-10-21T18:00:00Z",
      "status": "scheduled",
      "home_score": null,
      "away_score": null,
      "updated_at": "2026-10-21T09:16:54.882613Z",
      "lineup": {
        "home": {
          "formation": "4-1-4-1",
          "is_confirmed": false,
          "is_nomination_announced": false,
          "starting_xi": [
            {
              "name": "Ryan M.",
              "name_en": "Ryan M.",
              "player_id": "BFKC5XyX",
              "squad_role": "regular",
              "detailed_position": "Goalkeeper",
              "formation_position": 1,
              "start_xi_probability": 99,
              "bench_probability": 0,
              "expected_minutes": 90,
              "expected_sub_off_probability": 0,
              "expected_sub_off_minute": null
            },
            {
              "name": "Ratkov P.",
              "name_en": "Ratkov P.",
              "player_id": "jzHpyPj5",
              "squad_role": "backup",
              "detailed_position": "Centre Forward",
              "formation_position": 11,
              "start_xi_probability": 10,
              "bench_probability": 40,
              "expected_minutes": 60.0,
              "expected_sub_off_probability": 100,
              "expected_sub_off_minute": 60
            }
          ],
          "bench": [
            {
              "name": "Axel Tape",
              "name_en": "Axel Tape",
              "player_id": "W10cOGaz",
              "squad_role": "youth",
              "detailed_position": "Right Back",
              "start_xi_probability": 0,
              "bench_probability": 50,
              "expected_minutes": 0,
              "expected_sub_in_probability": 0,
              "expected_sub_in_minute": null
            }
          ],
          "missing": [
            {
              "name": "Primo A.",
              "name_en": "Primo A.",
              "player_id": "Y78HfNjW",
              "squad_role": null,
              "detailed_position": "Goalkeeper",
              "missing_type": "injury",
              "reason": "Shoulder Injury",
              "missed_in_row": 10,
              "days_missed": 157,
              "expected_return": {
                "from": "2026-11-29",
                "to": "2027-02-24"
              },
              "absence_impact": null
            },
            {
              "name": "Sotelo H.",
              "name_en": "Sotelo H.",
              "player_id": "oSwdFDDa",
              "squad_role": "backup",
              "detailed_position": "Central Midfield",
              "missing_type": "doubtful",
              "reason": "Knee Injury",
              "missed_in_row": 3,
              "days_missed": 31,
              "expected_return": null,
              "absence_impact": "low",
              "play_probability": 30,
              "start_xi_probability": 17
            }
          ],
          "new_arrivals": [],
          "returning": [
            {
              "name": "Marc Santos",
              "name_en": "Marc Santos",
              "player_id": "F1PnN5eB",
              "squad_role": "youth",
              "detailed_position": "Left Back",
              "games_missed": 2,
              "days_out": 8,
              "returning_to": "bench"
            }
          ],
          "positional_battles": [
            {
              "position": "Right Back",
              "formation_position": 2,
              "contenders": [
                {
                  "name": "Toljan J.",
                  "name_en": "Toljan J.",
                  "player_id": "0G8ozWJE",
                  "squad_role": "rotation",
                  "probability": 50
                },
                {
                  "name": "Nacho Pérez",
                  "name_en": "Nacho Pérez",
                  "player_id": "fIaRlrWZ",
                  "squad_role": "regular",
                  "probability": 50
                }
              ]
            }
          ],
          "lineup_changes": {
            "count": 4,
            "in": [
              {
                "name": "Toljan J.",
                "name_en": "Toljan J.",
                "player_id": "0G8ozWJE"
              },
              {
                "name": "Mandi A.",
                "name_en": "Mandi A.",
                "player_id": "6DY8rtL6"
              },
              {
                "name": "Olasagasti J. A.",
                "name_en": "Olasagasti J. A.",
                "player_id": "6dWOnhit"
              },
              {
                "name": "Ratkov P.",
                "name_en": "Ratkov P.",
                "player_id": "jzHpyPj5"
              }
            ],
            "out": [
              {
                "name": "Nacho Pérez",
                "name_en": "Nacho Pérez",
                "player_id": "fIaRlrWZ"
              },
              {
                "name": "Ifeanyi Ndukwe",
                "name_en": "Ifeanyi Ndukwe",
                "player_id": "c3gj48hd"
              },
              {
                "name": "Enzo Bardeli",
                "name_en": "Enzo Bardeli",
                "player_id": "RrdKtGfe"
              },
              {
                "name": "Thiago Fernández",
                "name_en": "Thiago Fernández",
                "player_id": "k2fmKhNO"
              }
            ]
          }
        }
      }
    }
  ],
  "meta": {
    "total": 1,
    "limit": 20,
    "offset": 0,
    "next_cursor": null,
    "has_more": false,
    "tier": "realtime",
    "timezone": "UTC"
  },
  "rate_limit": {
    "remaining": 119,
    "limit": 120,
    "resets_in_seconds": 60
  },
  "subscription": {
    "plan": "LeagueSpy Realtime",
    "sport": "Football",
    "tier": "realtime"
  }
}
{
  "data": [
    {
      "fixture_id": "VJfWANbE",
      "home_team_id": "11uGdbIt",
      "home_team_name": "Levante",
      "home_team_name_en": "Levante",
      "home_team_logo": "https://img.leaguespy.com/teams/11uGdbIt.png",
      "away_team_id": "aGpkiedc",
      "away_team_name": "Athletic Club",
      "away_team_name_en": "Athletic Club",
      "away_team_logo": "https://img.leaguespy.com/teams/aGpkiedc.png",
      "league_id": "QBIQ7xJS",
      "league_name": "La Liga",
      "league_name_en": "La Liga",
      "league_logo": "https://img.leaguespy.com/leagues/QBIQ7xJS.png",
      "country_name": "Spain",
      "country_name_en": "Spain",
      "season_id": "n82fEZtc",
      "season_name": "2026/2027",
      "starting_at": "2026-10-21T18:00:00Z",
      "status": "scheduled",
      "home_score": null,
      "away_score": null,
      "updated_at": "2026-10-21T09:16:54.882613Z",
      "lineup": {
        "home": {
          "formation": "4-1-4-1",
          "is_confirmed": false,
          "is_nomination_announced": false,
          "starting_xi": [
            {
              "name": "Ryan M.",
              "name_en": "Ryan M.",
              "player_id": "BFKC5XyX",
              "formation_position": 1
            },
            {
              "name": "Ratkov P.",
              "name_en": "Ratkov P.",
              "player_id": "jzHpyPj5",
              "formation_position": 11
            }
          ],
          "bench": [
            {
              "name": "Axel Tape",
              "name_en": "Axel Tape",
              "player_id": "W10cOGaz"
            }
          ],
          "missing": [
            {
              "name": "Primo A.",
              "name_en": "Primo A.",
              "player_id": "Y78HfNjW",
              "missing_type": "injury",
              "reason": "Shoulder Injury"
            },
            {
              "name": "Sotelo H.",
              "name_en": "Sotelo H.",
              "player_id": "oSwdFDDa",
              "missing_type": "doubtful",
              "reason": "Knee Injury"
            }
          ],
          "new_arrivals": [],
          "lineup_changes": {
            "count": 4,
            "in": [
              {
                "name": "Toljan J.",
                "name_en": "Toljan J.",
                "player_id": "0G8ozWJE"
              },
              {
                "name": "Mandi A.",
                "name_en": "Mandi A.",
                "player_id": "6DY8rtL6"
              },
              {
                "name": "Olasagasti J. A.",
                "name_en": "Olasagasti J. A.",
                "player_id": "6dWOnhit"
              },
              {
                "name": "Ratkov P.",
                "name_en": "Ratkov P.",
                "player_id": "jzHpyPj5"
              }
            ],
            "out": [
              {
                "name": "Nacho Pérez",
                "name_en": "Nacho Pérez",
                "player_id": "fIaRlrWZ"
              },
              {
                "name": "Ifeanyi Ndukwe",
                "name_en": "Ifeanyi Ndukwe",
                "player_id": "c3gj48hd"
              },
              {
                "name": "Enzo Bardeli",
                "name_en": "Enzo Bardeli",
                "player_id": "RrdKtGfe"
              },
              {
                "name": "Thiago Fernández",
                "name_en": "Thiago Fernández",
                "player_id": "k2fmKhNO"
              }
            ]
          }
        }
      }
    }
  ],
  "meta": {
    "total": 1,
    "limit": 20,
    "offset": 0,
    "next_cursor": null,
    "has_more": false,
    "tier": "professional",
    "timezone": "UTC"
  },
  "rate_limit": {
    "remaining": 29,
    "limit": 30,
    "resets_in_seconds": 60
  },
  "subscription": {
    "plan": "LeagueSpy Professional",
    "sport": "Football",
    "tier": "professional"
  }
}

Obtener partido individual

GET /v2/fixtures/{fixture_id}

Devuelve datos de alineación de un único partido por su ID público. La respuesta tiene la misma estructura que un elemento de la matriz data de arriba, con rate_limit y subscription en el nivel superior.

Parámetro de ruta

ParámetroTipoDescripción
fixture_idstringID público del partido.

Ejemplo

curl -H "X-API-Key: YOUR_KEY" \
  "https://api.leaguespy.com/v2/fixtures/fx_a1b2c3"

Respuesta

Devuelve el objeto del partido envuelto en un objeto data, con rate_limit y subscription en el nivel superior.

{
  "data": {
    "fixture_id": "fx_a1b2c3",
    "home_team_name": "FC Barcelona",
    "away_team_name": "Real Madrid",
    "lineup": { /* ... */ }             // Same structure as list response
  },
  "rate_limit": { /* ... */ },
  "subscription": { /* ... */ }
}


Comprobación de estado

GET /health

No requiere autenticación. Devuelve un objeto de estado simple.

{ "status": "ok" }

Objeto Fixture

Un elemento de data en /v2/fixtures/updates, y data de /v2/fixtures/{fixture_id}.

CampoTipoDescripción
fixture_idstringID del partido (cadena opaca).
home_team_idstringID del equipo local.
home_team_namestringNombre del equipo local (localizado con ?lang=).
home_team_name_enstringNombre en inglés u original, en todas las respuestas (úselo para cruzar datos).
home_team_logostring (URL)Logo del equipo local. Imagen genérica si el equipo no tiene logo.
away_team_idstringID del equipo visitante.
away_team_namestringNombre del equipo visitante (localizado con ?lang=).
away_team_name_enstringNombre en inglés u original, en todas las respuestas (úselo para cruzar datos).
away_team_logostring (URL)Logo del equipo visitante (imagen genérica si no hay).
league_idstringID de la competición.
league_namestringNombre de la competición (localizado con ?lang=).
league_name_enstringNombre en inglés u original, en todas las respuestas (úselo para cruzar datos).
league_logostring (URL)Logo de la competición (imagen genérica si no hay).
country_namestringPaís de la competición. Las competiciones internacionales usan una región: World, Europe, Asia, South America, North & Central America…
country_name_enstringNombre en inglés u original, en todas las respuestas (úselo para cruzar datos).
season_idstringID de la temporada.
season_namestringEtiqueta de temporada: 2026/2027 si abarca dos años, 2026 si es anual.
starting_atstringHora de inicio, UTC (YYYY-MM-DDTHH:MM:SSZ). Refleja cualquier reprogramación.
statusstringEstado del partido: scheduled, live, finished, postponed, cancelled… Ver valores de status.
home_scoreinteger | nullGoles del local: marcador actual durante el partido y final cuando termina. null antes del inicio, en partidos aplazados o cancelados y cuando no se conoce. Un gol no cambia updated_at y el partido sale de /v2/fixtures/updates una hora después del inicio: consulte el marcador en vivo y final en /v2/fixtures/{fixture_id}.
away_scoreinteger | nullGoles del visitante: marcador actual durante el partido y final cuando termina. null antes del inicio, en partidos aplazados o cancelados y cuando no se conoce. Un gol no cambia updated_at y el partido sale de /v2/fixtures/updates una hora después del inicio: consulte el marcador en vivo y final en /v2/fixtures/{fixture_id}.
periodstring | nullParte del partido en vivo: first_half, half_time, second_half, break (antes de la prórroga, entre sus mitades o antes de los penaltis), extra_time, penalties. null si el partido no está en vivo.
minuteinteger | nullMinuto del partido con el balón en juego (1 a 45, 46 a 90, 91 a 120). En el tiempo añadido se queda en 45, 90, 105 o 120 y extra_minute cuenta los minutos añadidos (45+2 = minute 45, extra_minute 2). null en el descanso, las pausas, los penaltis y cuando el partido no está en vivo. Precisión de unos 30 segundos.
extra_minuteinteger | nullMinutos añadidos sobre minute; 0 fuera del tiempo añadido, null cuando minute es null.
updated_atstringÚltima vez que cambió el partido: datos de alineación, estado u hora de inicio. ISO 8601 UTC; el número de decimales de segundo varía. Úselo para el polling incremental.
lineupobjectObjetos de equipo lineup.home y lineup.away.
broadcastsarray | nullEmisoras de TV y streaming por país, ver broadcasts. Sólo con ?include=broadcasts; null en otro caso. Opcional: sólo aparece cuando aplica.

Objeto Lineup

Cada equipo, lineup.home y lineup.away.

CampoTipoDescripción
formationstring | nullFormación, p. ej. 4-2-3-1. Predicha mientras is_confirmed es false, oficial después. null si no se conoce.
is_confirmedbooleantrue cuando se publica la alineación oficial. Desde entonces starting_xi, bench y formation contienen los datos oficiales.
is_nomination_announcedbooleantrue cuando se conoce la convocatoria oficial. Actualmente cambia junto con is_confirmed.
starting_xiarrayOnce inicial, predicho antes de la confirmación y oficial después. [] si aún no hay alineación.
bencharraySuplentes, predichos antes de la confirmación y oficiales después. Puede ser [].
missingarrayJugadores ausentes o dudosos para este partido. [] si no se conoce ninguno.
new_arrivalsarrayFichajes recientes incluidos en la convocatoria. [] si no hay.
returningarrayRT Jugadores del XI o banquillo que no estuvieron en los últimos partidos del equipo. Máximo 4.
positional_battlesarrayRT Posiciones en las que la elección del titular está abierta.
lineup_changesobject | nullCambios en starting_xi respecto al partido anterior del equipo. Ver cambios de alineación. null si no se pueden comparar las dos alineaciones.

Ciclo de vida

  • Un partido aparece en /v2/fixtures/updates cuando existen datos de alineación, desde hasta 7 días antes del inicio, y permanece hasta 1 hora después (48 horas para partidos aplazados, interrumpidos, cancelados y similares).
  • Primero llegan las alineaciones predichas y los ausentes, hasta 7 días antes del inicio (un equipo que juega dos veces en una semana tiene ambos partidos), cuando hay predicción para la competición. La predicción se actualiza con cada nueva información hasta la alineación oficial. Antes de la confirmación is_confirmed es false y starting_xi / bench contienen la predicción.
  • La alineación oficial reemplaza la predicción en cuanto se publica, normalmente 40 a 60 minutos antes del inicio (unos 50 a 60 minutos en las grandes ligas europeas y competiciones UEFA de clubes). is_confirmed pasa a true y una predicción posterior nunca lo revierte. En algunos partidos de divisiones inferiores la alineación oficial llega poco antes del inicio.
  • Cada cambio de datos de alineación, status o starting_at actualiza updated_at, por lo que el polling con updated_since los detecta todos.
  • /v2/fixtures/{fixture_id} devuelve los partidos desde el inicio de su suscripción.

Objetos de jugador

Jugadores en starting_xi y bench.

starting_xi[]

CampoTipoDescripción
namestringNombre del jugador (localizado con ?lang=).
name_enstringNombre en inglés u original, en todas las respuestas (úselo para cruzar datos).
player_idstring | nullID del jugador. null sólo si no se pudo identificar.
squad_rolestring | nullRT Rol en la plantilla esta temporada. Ver squad_role.
detailed_positionstringRT Posición habitual. Ver posiciones. Siempre en inglés. Opcional: sólo aparece cuando aplica.
detailed_position_labelstringRT Posición en el idioma solicitado. Sólo con ?lang=. Opcional: sólo aparece cuando aplica.
formation_positioninteger | nullCasilla en la formación, 1 a 11. Ver formation_position.
exact_positionstringCódigo de posición táctica oficial, p. ej. RCB. Sólo en algunas alineaciones oficiales. Opcional: sólo aparece cuando aplica.
start_xi_probabilityinteger | nullRT Probabilidad (%) de ser titular, 0 a 99: titularidades en los últimos 10 partidos oficiales del equipo. En alineación oficial 99. null sin historial reciente.
bench_probabilityinteger | nullRT Probabilidad (%) de estar entre los suplentes, 0 a 99.
expected_minutesnumberRT Minutos más probables: 90, o el minuto de sustitución esperado si el cambio es más probable que no. 0 a 90.
expected_sub_off_probabilityinteger | nullRT Probabilidad (%) de ser sustituido. Porteros 0.
expected_sub_off_minuteinteger | nullRT Minuto esperado de sustitución, 1 a 89. null si la probabilidad es menor al 25 %.
was_doubtfulbooleantrue si el jugador era dudoso pero está en la alineación. Opcional: sólo aparece cuando aplica.
debutbooleantrue si puede ser su debut con el club (ver new_arrivals). Opcional: sólo aparece cuando aplica.
returning_after_missedintegerEn algunas alineaciones oficiales: partidos consecutivos que se perdió antes de este. Opcional: sólo aparece cuando aplica.
league_statsobjectEstadísticas de temporada, ver league_stats. Sólo con ?include=league_stats.

bench[]

CampoTipoDescripción
namestringNombre del jugador.
name_enstringNombre en inglés u original, en todas las respuestas (úselo para cruzar datos).
player_idstring | nullID del jugador.
squad_rolestring | nullRT Rol en la plantilla esta temporada.
detailed_positionstringRT Posición habitual (siempre en inglés). Opcional: sólo aparece cuando aplica.
detailed_position_labelstringRT Posición en el idioma solicitado. Sólo con ?lang=. Opcional: sólo aparece cuando aplica.
start_xi_probabilityinteger | nullRT Probabilidad (%) de ser titular. En una alineación predicha nunca supera al jugador de starting_xi más bajo en la misma detailed_position. Suplentes oficiales 0.
bench_probabilityinteger | nullRT Probabilidad (%) de estar entre los suplentes.
expected_minutesnumber | nullRT Minutos más probables: 0, o los minutos tras entrar si es más probable que no.
expected_sub_in_probabilityinteger | nullRT Probabilidad (%) de entrar. Porteros 0.
expected_sub_in_minuteinteger | nullRT Minuto esperado de entrada, 1 a 89. null por debajo del 25 %.
was_doubtfulbooleanDudoso antes del partido pero convocado. Opcional: sólo aparece cuando aplica.
debutbooleanPosible debut con el club. Opcional: sólo aparece cuando aplica.
league_statsobjectEstadísticas de temporada. Sólo con ?include=league_stats.

Objeto de jugador ausente

Jugadores en missing[]: ausentes o dudosos para este partido.

CampoTipoDescripción
namestringNombre del jugador.
name_enstringNombre en inglés u original, en todas las respuestas (úselo para cruzar datos).
player_idstring | nullID del jugador.
squad_rolestring | nullRT Rol en la plantilla esta temporada.
detailed_positionstringRT Posición habitual (siempre en inglés). Opcional: sólo aparece cuando aplica.
detailed_position_labelstringRT Posición en el idioma solicitado. Sólo con ?lang=. Opcional: sólo aparece cuando aplica.
missing_typestringCategoría de la ausencia. doubtful significa que aún puede jugar. Ver missing_type.
reasonstring | nullMotivo breve de una lista fija, p. ej. Knee Injury, Red Card, Transfer to <club> (<país>). Ver motivos. Siempre en inglés; la traducción está en reason_label. null si no se conoce.
reason_labelstringMotivo en el idioma solicitado. Sólo con ?lang=. Opcional: sólo aparece cuando aplica.
missed_in_rowintegerRT Partidos consecutivos jugados por el equipo (amistosos incluidos), justo antes de este, sin el jugador en la convocatoria (contados desde que llegó al equipo). 0 = estuvo en la última. 10 sin convocatoria anterior registrada = 10 o más.
days_missedinteger | nullRT Días entre el primer partido de la ausencia actual y este partido. null si aún no se perdió ningún partido.
expected_returnobject | nullRT Ventana estimada de regreso de un jugador lesionado o sancionado: la primera y la última fecha en que se espera su vuelta. En una sanción, ambas fechas son la del primer partido tras la sanción. Se actualiza con cada nueva información. null en otras ausencias o si no hay estimación.
expected_return.from / .tostringRT Fechas, YYYY-MM-DD. from es igual a to cuando se conoce una sola fecha.
absence_impactstring | nullRT Cuánto debería notar el equipo la ausencia. Ver absence_impact.
start_xi_probabilityintegerRT Sólo para algunos jugadores doubtful: probabilidad (%) de ser titular, 0 a 100. Opcional: sólo aparece cuando aplica.
play_probabilityintegerRT Sólo para algunos jugadores doubtful: probabilidad (%) de jugar algún minuto, 0 a 100. Opcional: sólo aparece cuando aplica.
transfer_datestringSólo para transfer_out: fecha de salida (YYYY-MM-DD). Opcional: sólo aparece cuando aplica.
to_team_countrystringSólo para transfer_out: país del nuevo club (localizado con ?lang=). Opcional: sólo aparece cuando aplica.
to_team_country_enstringNombre en inglés u original, en todas las respuestas (úselo para cruzar datos). Opcional: sólo aparece cuando aplica.
to_team_tierinteger | nullSólo para transfer_out: nivel de liga del nuevo club (1 = primera división). Opcional: sólo aparece cuando aplica.
league_statsobjectEstadísticas de temporada. Sólo con ?include=league_stats.

Objeto de nuevo fichaje

Jugadores en new_arrivals[]: llegaron recientemente al club y figuran en el XI o banquillo. Se muestran durante los 3 primeros partidos tras el traspaso.

CampoTipoDescripción
namestringNombre del jugador.
name_enstringNombre en inglés u original, en todas las respuestas (úselo para cruzar datos).
player_idstringID del jugador.
signed_fromstring | nullClub anterior con su país, Club (País) (localizado con ?lang=). null si no se conoce.
signed_from_enstringNombre en inglés u original, en todas las respuestas (úselo para cruzar datos). Opcional: sólo aparece cuando aplica.
transfer_datestringFecha de llegada (YYYY-MM-DD).
stagestringProgreso del debut en el nuevo club. Ver stage.
games_since_arrivalintegerPartidos del equipo desde su llegada, 0 a 2.
startsintegerTitularidades con el club desde su llegada, 0 a 2.

Objeto de jugador que regresa

RT Jugadores en returning[]: en el XI o banquillo tras perderse los últimos partidos del equipo. Máximo 4 por equipo, primero las ausencias más largas.

CampoTipoDescripción
namestringRT Nombre del jugador.
name_enstringRT Nombre en inglés u original, en todas las respuestas (úselo para cruzar datos).
player_idstringRT ID del jugador.
squad_rolestring | nullRT Rol en la plantilla esta temporada.
detailed_positionstring | nullRT Posición habitual (siempre en inglés).
detailed_position_labelstringRT Posición en el idioma solicitado. Sólo con ?lang=. Opcional: sólo aparece cuando aplica.
games_missedintegerRT Partidos consecutivos perdidos antes de este, 1 a 10 (10 = 10 o más).
days_outinteger | nullRT Días entre el primer partido perdido y este partido.
returning_tostringRT starting_xi o bench: dónde figura en este partido.

Objeto de batalla por posición

RT Elementos de positional_battles[]: posiciones en las que el jugador del XI predicho no es una elección clara; un aspirante es un suplente de la misma posición cuyas titularidades recientes se acercan a las del titular sin superarlas. probability es la probabilidad de cada jugador de ser titular en este partido, así que la del titular incluye su puesto en el XI predicho y los aspirantes se reparten como mucho el resto (p. ej. 78 frente a 22).

CampoTipoDescripción
positionstringRT Posición disputada (siempre en inglés).
position_labelstringRT Posición en el idioma solicitado. Sólo con ?lang=. Opcional: sólo aparece cuando aplica.
formation_positionintegerRT Casilla en la formación, 1 a 11.
contendersarrayRT Candidatos, 2 o más. El primero es el jugador actualmente en starting_xi.
contenders[].namestringRT Nombre del jugador.
contenders[].name_enstringRT Nombre en inglés u original, en todas las respuestas (úselo para cruzar datos).
contenders[].player_idstringRT ID del jugador.
contenders[].squad_rolestring | nullRT Rol en la plantilla esta temporada.
contenders[].probabilityintegerRT Probabilidad (%) de que sea titular, 0 a 99.

Objeto de cambios de alineación

lineup_changes compara starting_xi con el once inicial del último partido terminado del equipo en cualquier competición. Se omiten los amistosos de clubes; en selecciones los amistosos cuentan. Antes de la confirmación usa el XI predicho y después el oficial. null si no hay un partido anterior con alineación completa, si el XI actual aún no está completo y después de que el equipo juegue otro partido, hasta que se actualice la comparación (como tarde el día del partido).

CampoTipoDescripción
countintegerJugadores de starting_xi que no fueron titulares en el partido anterior. 0 = el mismo once.
inarrayJugadores titulares ahora que no lo fueron en el partido anterior.
outarrayJugadores titulares en el partido anterior que ahora no están en starting_xi.
in[].name / out[].namestringNombre del jugador (localizado con ?lang=).
in[].name_en / out[].name_enstringNombre en inglés u original, en todas las respuestas (úselo para cruzar datos).
in[].player_id / out[].player_idstringID del jugador.

Estadísticas de temporada (league_stats)

Bloque opcional en jugadores de starting_xi[], bench[] y missing[], añadido con ?include=league_stats. Siempre se refiere a la liga nacional del jugador, también en partidos de copa e internacionales.

CampoTipoDescripción
league_stats.current_seasonobject | nullRegistro del jugador con este equipo en la temporada actual de liga. null si no hay. Sólo con ?include=league_stats.
league_stats.previous_seasonobject | nullTemporada anterior de liga (club con más partidos). Sólo hasta que el equipo juega 4 partidos de liga de la nueva temporada. Sólo con ?include=league_stats.
…league / league_idstringNombre de la liga (localizado con ?lang=) e ID. Sólo con ?include=league_stats.
…league_enstringNombre en inglés u original, en todas las respuestas (úselo para cruzar datos). Sólo con ?include=league_stats.
…seasonstringEtiqueta de temporada. Sólo con ?include=league_stats.
…team / team_idstringEquipo al que pertenecen los números (localizado con ?lang=) y su ID. Sólo con ?include=league_stats.
…team_enstringNombre en inglés u original, en todas las respuestas (úselo para cruzar datos). Sólo con ?include=league_stats.
…appearances / starts / sub_appearancesintegerPartidos jugados, de titular y como suplente. Sólo con ?include=league_stats.
…substituted_off / bench_appearancesintegerPartidos sustituido; partidos en el banquillo. Sólo con ?include=league_stats.
…minutes / goals / assistsintegerMinutos, goles, asistencias. Sólo con ?include=league_stats.
…yellow_cards / second_yellow_cards / red_cardsintegerAmarillas, segundas amarillas, rojas directas. Sólo con ?include=league_stats.

Localización

Añada ?lang=ko a cualquiera de los endpoints de fixtures, o pídanos que el coreano sea el idioma por defecto de su clave. Sin parámetro de idioma (o con ?lang=en) la respuesta es en inglés, salvo que su clave tenga un idioma por defecto. GET /v2/languages lista los idiomas disponibles.

Los nombres se traducen en su campo: equipos, ligas, países y jugadores (también dentro de league_stats), signed_from y to_team_country. Un nombre sin traducción se devuelve en inglés. El original en inglés está siempre al lado en *_en (home_team_name_en, name_en, …), en todas las respuestas, para cruzarlo con sus datos.

Los valores fijos nunca se traducen: detailed_position, positional_battles[].position y reason siempre van en inglés. Con un idioma, su traducción se añade en detailed_position_label, position_label y reason_label. Códigos como status, missing_type, squad_role, absence_impact y stage, IDs, números, fechas, formaciones y temporadas nunca se traducen.

Avisamos con antelación, por email y en el registro de cambios, de cualquier cambio de idioma o formato en los valores.


Retransmisiones (broadcasts)

Bloque opcional del partido, añadido con ?include=broadcasts: las emisoras conocidas del partido, una entrada por país. Inglaterra, Escocia, Gales e Irlanda del Norte aparecen juntas como United Kingdom. La información suele aparecer unos tres días antes del inicio; un array vacío significa que aún no se conoce ninguna emisora. Las emisoras pueden añadirse o cambiar sin que cambie updated_at; lea el bloque al mostrar el partido.

CampoTipoDescripción
countrystringPaís (localizado con ?lang=). Opcional: sólo aparece cuando aplica.
country_enstringNombre del país en inglés, en todas las respuestas. Opcional: sólo aparece cuando aplica.
channels[].channelstringEmisora o canal. Las emisoras coreanas en coreano con ?lang=ko cuando escriben su nombre en coreano. Opcional: sólo aparece cuando aplica.
channels[].channel_enstringNombre original de la emisora, en todas las respuestas. Opcional: sólo aparece cuando aplica.
channels[].typestringtv (un canal de TV) o streaming (un servicio o app de streaming). Opcional: sólo aparece cuando aplica.

Meta, límite de tasa y suscripción

meta se incluye en toda respuesta de lista; rate_limit y subscription en todas las respuestas.

CampoTipoDescripción
meta.totalinteger | nullTotal de partidos coincidentes. null en modo cursor.
meta.limitintegerTamaño de página usado.
meta.offsetinteger | nullDesplazamiento usado. null en modo cursor.
meta.next_cursorstring | nullCursor de la página siguiente. null en la última página.
meta.has_morebooleantrue si hay más páginas.
meta.tierstringprofessional o realtime.
meta.timezonestringSiempre UTC.
rate_limit.remainingintegerPeticiones restantes en la ventana actual de un minuto.
rate_limit.limitintegerPeticiones permitidas por minuto.
rate_limit.resets_in_secondsintegerSegundos hasta que se reinicie la ventana.
subscription.planstringNombre del plan, p. ej. LeagueSpy Realtime.
subscription.sportstringSiempre Football.
subscription.tierstringprofessional o realtime.

Listas de valores

status

Los partidos en postponed, suspended, interrupted, cancelled, abandoned o awarded permanecen en /v2/fixtures/updates 48 horas tras el inicio. Un cambio de estado u hora de inicio actualiza updated_at.

ValorSignificado
scheduledAún no ha comenzado.
tbaHora de inicio aún sin fijar.
delayedInicio retrasado el mismo día.
liveEn juego (incluye descanso, prórroga y penaltis).
interruptedDetenido durante el juego (p. ej. clima), puede reanudarse.
finishedFinalizado (también tras prórroga o penaltis).
postponedAplazado. starting_at muestra la nueva fecha cuando se conoce.
suspendedSuspendido, se reanudará otro día.
cancelledCancelado, no se jugará.
abandonedAbandonado, no se reanudará.
awardedResultado decidido fuera del campo (p. ej. incomparecencia).
unknownEstado aún sin confirmar.

missing_type

ValorSignificado
injuryLesionado o enfermo.
suspendedSancionado (tarjetas, roja o sanción disciplinaria).
doubtfulDudoso: aún puede jugar. Puede incluir start_xi_probability y play_probability.
national_teamConvocado con su selección.
out_of_selectionDisponible pero fuera de la convocatoria (decisión técnica, descanso, no inscrito).
transfer_outSalió del club recientemente (traspaso o cesión). Se muestra en los primeros partidos tras la salida.
otherNo disponible por otro motivo (p. ej. falta de ritmo, motivos personales).

absence_impact

ValorSignificado
criticalJugador clave, ausencia reciente. Gran efecto esperado.
highEfecto claro esperado.
mediumEfecto apreciable.
lowEfecto pequeño.
minimalEfecto mínimo (jugador secundario o juvenil).
nullDesconocido (rol del jugador sin clasificar).

squad_role

ValorSignificado
key_playerUno de los jugadores más importantes del equipo esta temporada.
regularTitular habitual. Un jugador lesionado de larga duración, enfermo, sancionado o en duda conserva el rol que tenía estando sano.
rotationJuega con frecuencia pero rota con otros.
backupJugador de plantilla con pocos minutos.
youthJoven con pocos minutos en el primer equipo.
nullSin clasificar (p. ej. pocos partidos esta temporada).

new_arrivals[].stage

ValorSignificado
pre_debutPrimera convocatoria con el nuevo club.
bench_debutConvocado antes, aún sin jugar.
playedHa jugado con el club, aún sin ser titular.
startedHa sido titular con el club.

returning[].returning_to

ValorSignificado
starting_xiRegresa en el once inicial.
benchRegresa en el banquillo.

Motivos de ausencia (reason)

reason siempre proviene de esta lista o de una de las plantillas de traspaso. Con ?lang=ko se devuelve en coreano (columna derecha).

ValorCoreano (?lang=ko)
Abdominal strain복근 부상
Achilles Tendon Injury아킬레스건 부상
Ankle Injury발목 부상
Arm Injury팔 부상
Back Injury허리 부상
Broken Hand손 골절
Broken Leg다리 골절
Broken ankle발목 골절
Broken calfbone종아리뼈 골절
Broken cheekbone광대뼈 골절
Broken collarbone쇄골 골절
Broken hipbone고관절 골절
Broken jawbone턱뼈 골절
Broken nose코뼈 골절
Broken rib갈비뼈 골절
Broken shinbone정강이뼈 골절
Broken tailbone꼬리뼈 골절
Broken thighbone대퇴골 골절
Calf Injury종아리 부상
Chest Injury가슴 부상
Coach's decision감독 판단
Concussion뇌진탕
Contusion타박상
Convalescence회복 중
Cruciate Ligament Injury십자인대 부상
Dislocation탈구
Doping도핑 징계
Doubtful출전 불투명
Elbow Injury팔꿈치 부상
Excluded명단 제외
Eye injury눈 부상
Face Injury얼굴 부상
Finger Injury손가락 부상
Foot Injury발 부상
Forearm injury아래팔 부상
Fracture골절
Groin Injury사타구니 부상
Hamstring Injury햄스트링 부상
Hand Injury손 부상
Head Injury머리 부상
Health problems건강 문제
Heart Problems심장 이상
Heel Injury발뒤꿈치 부상
Hernia탈장
Hip Injury고관절 부상
Illness질병
Inactive명단 제외
Injury부상
International duty국가대표 차출
Jaw injury턱 부상
Knee Injury무릎 부상
Knee Ligament Injury무릎 인대 부상
Knock가벼운 부상
Lack of regular playing time at club소속팀 출전 시간 부족
Lacking Match Fitness경기 감각 부족
Leg Injury다리 부상
Ligament Injury인대 부상
Loan agreement임대 계약 조항
Lower Back Injury허리 부상
Lower-Body Injury하체 부상
Meniscus Injury반월판 부상
Muscle Injury근육 부상
Muscle Tear근육 파열
Muscle Tightness근육 경직
Neck Injury목 부상
Not considered전력 외
Not in squad명단 제외
Off the roster엔트리 제외
Other기타
Overload피로 누적
Pelvis Injury골반 부상
Personal Reasons개인 사정
Red Card퇴장 징계
Rest휴식
Ribs Injury갈비뼈 부상
Shin Injury정강이 부상
Shoulder Injury어깨 부상
Stomach Disorder위장 장애
Surgery수술
Suspended출장 정지
Tendon Injury힘줄 부상
Thigh Injury허벅지 부상
Toe Injury발가락 부상
Tooth injury치아 부상
Transfer이적
Transfer negotiations이적 협상
Upper Back Injury등 부상
Upper-Body Injury상체 부상
Without a club무소속
Wrist Injury손목 부상
Yellow Cards경고 누적

Plantillas de traspaso

Transfer to <club> (<country>), Transfer/loan to <club> (<country>), Loan ended (returned to <club> (<country>))

Posiciones

Valores de detailed_position y positional_battles[].position. Defender, Midfielder y Attacker aparecen cuando sólo se conoce la línea.

ValorCoreano (?lang=ko)
Goalkeeper골키퍼
Centre Back센터백
Left Back레프트백
Right Back라이트백
Left Wing Back왼쪽 윙백
Right Wing Back오른쪽 윙백
Defensive Midfield수비형 미드필더
Central Midfield중앙 미드필더
Attacking Midfield공격형 미드필더
Left Midfield왼쪽 미드필더
Right Midfield오른쪽 미드필더
Left Wing왼쪽 윙어
Right Wing오른쪽 윙어
Striker스트라이커
Centre Forward센터포워드
Second Striker세컨드 스트라이커
Defender수비수
Midfielder미드필더
Attacker공격수

formation_position

1 es el portero; luego cada línea de defensa a ataque, leída de derecha a izquierda desde la vista del equipo. Ejemplo 4-3-3: 1 POR, 2–5 defensa (2 lateral derecho … 5 lateral izquierdo), 6–8 medio, 9–11 delanteros.

formation

De defensa a ataque, sin contar el portero, p. ej. 4-2-3-1, 4-3-3, 4-4-2, 3-4-2-1, 4-1-4-1, 3-4-3, 3-5-2, 5-4-1, 5-3-2, 3-4-1-2, 3-1-4-2, 4-3-1-2, 4-1-3-2, 4-4-1-1, 4-2-2-2, 4-5-1.

Códigos de exact_position

GK, RB, RCB, CB, LCB, LB, RWB, LWB, RDM, DM, LDM, RCM, CM, LCM, RM, LM, RAM, AM, LAM, RW, LW, CF, ST.

Probabilidades y minutos

Todas las probabilidades son porcentajes enteros, 0 a 100 (start_xi_probability y bench_probability con máximo 99). En una alineación oficial los titulares tienen start_xi_probability: 99 y los suplentes 0. Los minutos van de 1 a 89; null significa no esperado (probabilidad menor al 25 %).

Null, vacío y ausente

Un array vacío [] significa que no se conoce nada, no es un error. null significa desconocido. Los indicadores (was_doubtful, debut) sólo aparecen cuando son true. Pueden añadirse claves nuevas; ignore las desconocidas.


Códigos de error

Todos los errores devuelven un cuerpo JSON con error_code y detail. Los errores de límite de tasa también incluyen retry_after.

{
  "error_code": "RATE_LIMIT_EXCEEDED",
  "detail": "Rate limit exceeded. Please wait before making more requests.",
  "retry_after": 60
}
HTTPCódigo de errorSignificado¿Reintentar?
400INVALID_DATETIMEFormato de fecha/hora incorrectoNo — corrija la petición
400INVALID_ID_FORMATID público mal formadoNo — corrija el ID
400UPDATED_SINCE_TOO_OLDPeriodo de consulta supera 48 horasNo — use paginación por offset para el dataset completo
400INVALID_CURSORCursor corrupto o manipuladoNo — reinicie la consulta sin cursor
400CURSOR_EXPIREDCursor con más de 2 horas de antigüedadNo — reinicie la consulta sin cursor
400INVALID_PARAMScursor + offset usados juntos, o cursor sin updated_sinceNo — corrija la petición
401MISSING_API_KEYNo se proporcionó clave APINo — añada cabecera
401INVALID_API_KEYClave no reconocidaNo — compruebe la clave
403VERSION_ACCESS_DENIEDSin acceso v2 en esta claveNo — contáctenos
404ID_NOT_FOUNDLa entidad no existeNo — verifique el ID
405—Método HTTP incorrectoNo — use GET
429RATE_LIMIT_EXCEEDEDDemasiadas peticionesSí — espere retry_after
500INTERNAL_ERRORError del servidorSí — reintente en 30s
503SERVICE_UNAVAILABLETemporalmente no disponibleSí — reintente en 30s

Cabeceras de respuesta

Incluidas en cada respuesta.

CabeceraDescripción
X-Request-IdIdentificador único de la petición. Inclúyalo en informes de errores.
X-RateLimit-LimitMáximo de peticiones por minuto para su nivel.
X-RateLimit-RemainingPeticiones restantes en la ventana actual.
X-RateLimit-ResetMarca de tiempo Unix de cuándo se reinicia la ventana.
Retry-AfterSegundos a esperar. Presente sólo en respuestas 429.

Sincronización inicial de datos

Las nuevas integraciones deben seguir este enfoque en dos fases para construir y mantener su dataset local:

# Fase 1: Descarga completa del dataset (una vez)
# Use paginación por offset sin updated_since
all_fixtures = []
offset = 0
sync_started_at = datetime.now(timezone.utc).isoformat()

while True:
    resp = httpx.get(API_URL, headers=headers, timeout=30,
                     params={"limit": 100, "offset": offset})
    page = resp.json()
    all_fixtures.extend(page["data"])

    if not page["meta"]["has_more"]:
        break
    offset += page["meta"]["limit"]

# Fase 2: Actualizaciones incrementales (continuas)
# Cambie a updated_since + cursor
last_check = sync_started_at

while True:
    params = {"limit": 100, "updated_since": last_check}
    cursor = None

    while True:
        if cursor:
            params["cursor"] = cursor
        resp = httpx.get(API_URL, headers=headers, params=params, timeout=30)
        data = resp.json()

        for fixture in data["data"]:
            upsert_fixture(fixture)  # Su lógica de upsert

        if not data["meta"]["has_more"]:
            break
        cursor = data["meta"]["next_cursor"]

    last_check = datetime.now(timezone.utc).isoformat()
    time.sleep(300)  # Poll cada 5 minutos
La fase 1 usa offset. La descarga inicial completa utiliza paginación estándar por offset porque updated_since tiene un límite de consulta de 48 horas. Una vez que tenga el dataset completo, cambie a polling incremental basado en cursor para todas las actualizaciones posteriores.

Paginación por cursor

Al consultar actualizaciones usando updated_since, use paginación basada en cursor en lugar de offset. La paginación por cursor garantiza la consistencia de datos — no perderá registros ni recibirá duplicados, incluso cuando los datos cambian entre peticiones de página.

Cómo funciona

Cada respuesta incluye un campo next_cursor en el objeto meta. Pase este valor como parámetro de consulta cursor en su siguiente petición para continuar exactamente donde lo dejó.

¿Por qué no offset? Con la paginación por offset, nuevas actualizaciones pueden desplazar el dataset entre peticiones — causando registros omitidos o duplicados. La paginación por cursor usa un marcador estable que no se ve afectado por la llegada de nuevos datos entre páginas.

Ejemplo: consulta multi-página

# 1. Primera petición — empiece con updated_since, sin cursor
GET /v2/fixtures/updates?updated_since=2026-06-05T08:00:00Z&limit=50

# Respuesta:
{
  "data": [...50 partidos...],
  "meta": {
    "next_cursor": "eyJ1Ijoi...abc.d4e5f6",
    "has_more": true,
    "total": null
  }
}

# 2. Siguiente página — pase el cursor de la respuesta anterior
GET /v2/fixtures/updates?updated_since=2026-06-05T08:00:00Z&limit=50&cursor=eyJ1Ijoi...abc.d4e5f6

# 3. Última página — no hay más datos
{
  "data": [...12 partidos...],
  "meta": {
    "next_cursor": null,
    "has_more": false
  }
}
Reglas del cursor.
• Los cursores son opacos — no los analice, modifique ni almacene a largo plazo.
• Los cursores caducan tras 2 horas. Si caduca, reinicie su consulta sin el parámetro cursor.
• cursor requiere updated_since. Enviar cursor solo devuelve 400.
• cursor y offset no se pueden combinar. Use offset solo para navegación del dataset completo sin updated_since.
• updated_since admite un periodo máximo de consulta de 48 horas.

Estrategia de polling

Use polling basado en cursor con updated_since para obtener eficientemente solo los cambios desde su última sincronización.

import httpx
import time
from datetime import datetime, timezone

API_URL = "https://api.leaguespy.com/v2/fixtures/updates"
headers = {"X-API-Key": "YOUR_KEY"}
last_check = datetime.now(timezone.utc).isoformat()

while True:
    params = {"limit": 100, "updated_since": last_check}
    cursor = None

    while True:  # Recorra todas las páginas de resultados
        if cursor:
            params["cursor"] = cursor
        resp = httpx.get(API_URL, headers=headers, params=params, timeout=30)
        data = resp.json()

        for fixture in data["data"]:
            process_fixture(fixture)

        if not data["meta"]["has_more"]:
            break
        cursor = data["meta"]["next_cursor"]

    last_check = datetime.now(timezone.utc).isoformat()
    time.sleep(300)  # Poll cada 5 minutos
Intervalos recomendados. Nivel Professional: 5–10 minutos (los datos tienen un retraso de 3h). Nivel Real-time: 1–5 minutos. Gestione siempre los 429 con retroceso exponencial.

Registro de cambios

FechaVersiónCambios
2026-10-272.4.0?include=broadcasts: emisoras de TV y streaming del partido por país. Reloj en vivo del partido: period, minute, extra_minute.
2026-10-212.3.0expected_return en los jugadores de missing[] (Realtime): ventana estimada de regreso de jugadores lesionados y sancionados.
2026-10-192.2.0home_score y away_score. lineup_changes: cambios en el once inicial respecto al partido anterior del equipo. Originales en inglés de todos los nombres en *_en en todas las respuestas. detailed_position, position y reason vuelven a ir siempre en inglés; las traducciones pasan a *_label.
2026-10-082.1.0Nuevo campo status (aplazado, cancelado, interrumpido y otros estados). Los cambios de estado y de hora de inicio actualizan updated_at. Localización coreana ampliada a posiciones y motivos de ausencia. reason siempre proviene de una lista fija. Documentación de todos los campos actualizada.
2026-06-052.0.4Consistencia de respuesta mejorada para partidos con datos parciales. Documentación de API actualizada.
2026-01-082.0.2Equipo de investigación ampliado con analistas dedicados a las rotaciones en calendarios apretados.
2025-11-202.0.1Expansión de cobertura para ligas de menor perfil. Frescura de datos mejorada para competiciones fuera del top 5.
2025-09-10—Tiempo de respuesta de la API reducido a <120ms (p95). Infraestructura migrada a despliegue optimizado en el borde (edge).
2025-08-15—Detección de convocatoria para el día de partido (is_nomination_announced). Categorización mejorada de jugadores ausentes.
2025-06-20—Más opciones de filtrado: parámetros team_id, league_id y fixture_id.
2025-03-012.0.0Lanzamiento GA de v2. Acceso por niveles, limitación de tasa estructurada, nombres de entidades enriquecidos, polling updated_since.
2024-11-152.0.0-betaBeta de v2. Nuevo esquema de respuesta, flujo de alineación confirmada (is_confirmed), seguimiento de convocatorias.
2024-09-011.4.0Reestructuración de la limitación de tasa. Añadidas cabeceras de respuesta X-RateLimit-*. Seguimiento por clave.
2024-09-01—Equipo de investigación ampliado a más husos horarios. Actualizaciones más rápidas a lo largo del día.
2024-08-15—Infraestructura de API: compresión gzip habilitada, tamaño de payload significativamente reducido. Añadido endpoint de health check.
2024-07-101.3.0Sistema de niveles introducido (Essential / Professional / Real-Time). Garantías de frescura de datos por nivel.
2024-05-011.2.0Añadido campo de probabilidad de titularidad. Minutos esperados para suplentes — diseñado para plataformas de fantasy y DFS.
2024-05-01—Hito de precisión de predicción: mejora significativa en la tasa de coincidencia del XI inicial en todas las ligas cubiertas.
2024-03-151.1.0Detección de formación y predicciones de banquillo añadidas al esquema de respuesta.
2024-03-15—Motivos de ausencia más detallados. Categorización por tipo de lesión y sanción.
2023-11-011.0.1Soporte para paginación. Esquema de respuesta estabilizado. Añadido campo updated_at.
2023-11-01—Cobertura de ligas de tercer nivel: League One & Two (Inglaterra), 3. Liga (Alemania), National (Francia).
2023-08-10—Mejoras en la precisión de las predicciones. Mejor manejo de cambios de entrenador a mitad de temporada y patrones de rotación.
2023-08-011.0.0Lanzamiento GA de v1. API pública con autenticación de clave. 70 competiciones cubiertas.
2023-02-01—Expansión a segundas divisiones: Championship, 2. Bundesliga, Serie B, Ligue 2, Segunda División. 50 ligas en total.
2022-12-10—Soporte para webhooks de API en beta privada. Notificaciones push para cambios de alineación en partidos seleccionados.
2022-10-20—Lanzamiento en Sudamérica: Brasileirão Série A, Argentine Primera División, Copa Libertadores.
2022-08-01—Entrada en el mercado asiático: J1 League (Japón), K League 1 (Corea del Sur), A-League (Australia).
2022-04-15—Equipo de investigación ampliado con analistas de alineaciones para cada liga cubierta.
2022-01-10—Cobertura ampliada a 35 ligas. Añadidas Eredivisie, Primeira Liga, Süper Lig, Belgian Pro League y Scottish Premiership.
2021-11-01—El tiempo de actividad (uptime) de la API alcanza el SLA del 99.95%. Migración a infraestructura en la nube de alta disponibilidad.
2021-09-01—Equipo de investigación ampliado con especialistas en preparación de partidos.
2021-06-15—Se añadieron 5 ligas adicionales. Cobertura total: 25 competiciones en 12 países.
2021-02-01—Formato de respuesta JSON estabilizado. Introducción de autenticación por clave de API.
2020-10-15—Equipo de investigación ampliado con especialistas en plantillas. Rol en la plantilla para cada equipo cubierto.
2020-08-01—Banquillo predicho añadido a los datos de la alineación. Ampliados los motivos de ausencia de jugadores con categorías detalladas.
2020-05-10—Equipo de investigación ampliado a 40 expertos en fútbol de todo el mundo. Profundidad de cobertura mejorada para clubes de mitad de tabla.
2020-02-01—Mejor seguimiento de lesiones y ausencias. Categorías de ausencia más detalladas.
2019-09-15—Equipo de investigación ampliado. Impacto de la ausencia evaluado para cada jugador ausente.
2019-06-01—Cobertura ampliada a 25 ligas. Añadidas MLS, Liga MX, Russian Premier League y Swiss Super League.
2019-01-10—Equipo de investigación escalado a 20 analistas. Cobertura mejorada para partidos de menor perfil.
2018-11-01—Almacenamiento en caché de la respuesta de la API (caching) introducido. El tiempo de respuesta medio se redujo de 800ms a menos de 200ms.
2018-08-15—Se añadieron 10 ligas adicionales: Eredivisie, Primeira Liga, Austrian Bundesliga, Danish Superliga y más.
2018-03-01—Mejora notable de la precisión en las 10 principales ligas tras la ampliación del equipo de investigación.
2017-11-01—Se añade la cobertura de las copas nacionales: FA Cup, Copa del Rey, DFB-Pokal, Coppa Italia, Coupe de France.
2017-08-01—Expansión a las 10 mejores ligas europeas. Añadidas Eredivisie, Primeira Liga, Russian Premier League, Turkish Süper Lig, Belgian Pro League.
2017-02-15—Equipo de investigación dedicado a las 5 grandes ligas.
2016-11-25—Lanzamiento de LeagueSpy. 5 grandes ligas: Premier League, La Liga, Serie A, Bundesliga, Ligue 1. XI inicial predicho.