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.
Inicio rápido
curl -H "X-API-Key: YOUR_KEY" \
"https://api.leaguespy.com/v2/fixtures/updates?limit=1"
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"
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.
| Nivel | Sincronización | Descripción |
|---|---|---|
| professional | Cada 3 horas | XI y banquillo predichos, ausentes con motivo, alineaciones oficiales en cuanto se publican. Ver las competiciones. |
| realtime | ≤15 min | Profundidad 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. |
meta.tier y subscription.tier.
Listar actualizaciones de partidos
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ámetro | Tipo | Por defecto | Descripción |
|---|---|---|---|
| limit | integer | 20 | Resultados por página. Rango: 1–100. |
| offset | integer | 0 | Desplazamiento de paginación. Rango: 0–5000. |
| team_id | string | — | Filtrar por ID público del equipo (coincide local o visitante). |
| league_id | string | — | Filtrar por ID público de la liga. |
| fixture_id | string | — | Filtrar por ID público del partido. |
| updated_since | string | — | 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 |
| cursor | string | — | 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. |
| include | string | — | 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. |
| lang | string | — | Idioma de nombres, posiciones y motivos, p. ej. ko. Ver Localización. |
Ejemplo de petición
curl -H "X-API-Key: YOUR_KEY" \
"https://api.leaguespy.com/v2/fixtures/updates?league_id=lg_xyz789&limit=5"
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
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ámetro | Tipo | Descripción |
|---|---|---|
| fixture_id | string | ID 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
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}.
| Campo | Tipo | Descripción |
|---|---|---|
| fixture_id | string | ID del partido (cadena opaca). |
| home_team_id | string | ID del equipo local. |
| home_team_name | string | Nombre del equipo local (localizado con ?lang=). |
| home_team_name_en | string | Nombre en inglés u original, en todas las respuestas (úselo para cruzar datos). |
| home_team_logo | string (URL) | Logo del equipo local. Imagen genérica si el equipo no tiene logo. |
| away_team_id | string | ID del equipo visitante. |
| away_team_name | string | Nombre del equipo visitante (localizado con ?lang=). |
| away_team_name_en | string | Nombre en inglés u original, en todas las respuestas (úselo para cruzar datos). |
| away_team_logo | string (URL) | Logo del equipo visitante (imagen genérica si no hay). |
| league_id | string | ID de la competición. |
| league_name | string | Nombre de la competición (localizado con ?lang=). |
| league_name_en | string | Nombre en inglés u original, en todas las respuestas (úselo para cruzar datos). |
| league_logo | string (URL) | Logo de la competición (imagen genérica si no hay). |
| country_name | string | País de la competición. Las competiciones internacionales usan una región: World, Europe, Asia, South America, North & Central America… |
| country_name_en | string | Nombre en inglés u original, en todas las respuestas (úselo para cruzar datos). |
| season_id | string | ID de la temporada. |
| season_name | string | Etiqueta de temporada: 2026/2027 si abarca dos años, 2026 si es anual. |
| starting_at | string | Hora de inicio, UTC (YYYY-MM-DDTHH:MM:SSZ). Refleja cualquier reprogramación. |
| status | string | Estado del partido: scheduled, live, finished, postponed, cancelled… Ver valores de status. |
| home_score | integer | null | Goles 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_score | integer | null | Goles 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}. |
| period | string | null | Parte 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. |
| minute | integer | null | Minuto 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_minute | integer | null | Minutos añadidos sobre minute; 0 fuera del tiempo añadido, null cuando minute es null. |
| updated_at | string | Ú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. |
| lineup | object | Objetos de equipo lineup.home y lineup.away. |
| broadcasts | array | null | Emisoras 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.
| Campo | Tipo | Descripción |
|---|---|---|
| formation | string | null | Formación, p. ej. 4-2-3-1. Predicha mientras is_confirmed es false, oficial después. null si no se conoce. |
| is_confirmed | boolean | true cuando se publica la alineación oficial. Desde entonces starting_xi, bench y formation contienen los datos oficiales. |
| is_nomination_announced | boolean | true cuando se conoce la convocatoria oficial. Actualmente cambia junto con is_confirmed. |
| starting_xi | array | Once inicial, predicho antes de la confirmación y oficial después. [] si aún no hay alineación. |
| bench | array | Suplentes, predichos antes de la confirmación y oficiales después. Puede ser []. |
| missing | array | Jugadores ausentes o dudosos para este partido. [] si no se conoce ninguno. |
| new_arrivals | array | Fichajes recientes incluidos en la convocatoria. [] si no hay. |
| returning | array | RT Jugadores del XI o banquillo que no estuvieron en los últimos partidos del equipo. Máximo 4. |
| positional_battles | array | RT Posiciones en las que la elección del titular está abierta. |
| lineup_changes | object | null | Cambios 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/updatescuando 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_confirmedesfalseystarting_xi/benchcontienen 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_confirmedpasa atruey 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,
statusostarting_atactualizaupdated_at, por lo que el polling conupdated_sincelos 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[]
| Campo | Tipo | Descripción |
|---|---|---|
| name | string | Nombre del jugador (localizado con ?lang=). |
| name_en | string | Nombre en inglés u original, en todas las respuestas (úselo para cruzar datos). |
| player_id | string | null | ID del jugador. null sólo si no se pudo identificar. |
| squad_role | string | null | RT Rol en la plantilla esta temporada. Ver squad_role. |
| detailed_position | string | RT Posición habitual. Ver posiciones. Siempre en inglés. Opcional: sólo aparece cuando aplica. |
| detailed_position_label | string | RT Posición en el idioma solicitado. Sólo con ?lang=. Opcional: sólo aparece cuando aplica. |
| formation_position | integer | null | Casilla en la formación, 1 a 11. Ver formation_position. |
| exact_position | string | Código de posición táctica oficial, p. ej. RCB. Sólo en algunas alineaciones oficiales. Opcional: sólo aparece cuando aplica. |
| start_xi_probability | integer | null | RT 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_probability | integer | null | RT Probabilidad (%) de estar entre los suplentes, 0 a 99. |
| expected_minutes | number | RT 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_probability | integer | null | RT Probabilidad (%) de ser sustituido. Porteros 0. |
| expected_sub_off_minute | integer | null | RT Minuto esperado de sustitución, 1 a 89. null si la probabilidad es menor al 25 %. |
| was_doubtful | boolean | true si el jugador era dudoso pero está en la alineación. Opcional: sólo aparece cuando aplica. |
| debut | boolean | true si puede ser su debut con el club (ver new_arrivals). Opcional: sólo aparece cuando aplica. |
| returning_after_missed | integer | En algunas alineaciones oficiales: partidos consecutivos que se perdió antes de este. Opcional: sólo aparece cuando aplica. |
| league_stats | object | Estadísticas de temporada, ver league_stats. Sólo con ?include=league_stats. |
bench[]
| Campo | Tipo | Descripción |
|---|---|---|
| name | string | Nombre del jugador. |
| name_en | string | Nombre en inglés u original, en todas las respuestas (úselo para cruzar datos). |
| player_id | string | null | ID del jugador. |
| squad_role | string | null | RT Rol en la plantilla esta temporada. |
| detailed_position | string | RT Posición habitual (siempre en inglés). Opcional: sólo aparece cuando aplica. |
| detailed_position_label | string | RT Posición en el idioma solicitado. Sólo con ?lang=. Opcional: sólo aparece cuando aplica. |
| start_xi_probability | integer | null | RT 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_probability | integer | null | RT Probabilidad (%) de estar entre los suplentes. |
| expected_minutes | number | null | RT Minutos más probables: 0, o los minutos tras entrar si es más probable que no. |
| expected_sub_in_probability | integer | null | RT Probabilidad (%) de entrar. Porteros 0. |
| expected_sub_in_minute | integer | null | RT Minuto esperado de entrada, 1 a 89. null por debajo del 25 %. |
| was_doubtful | boolean | Dudoso antes del partido pero convocado. Opcional: sólo aparece cuando aplica. |
| debut | boolean | Posible debut con el club. Opcional: sólo aparece cuando aplica. |
| league_stats | object | Estadísticas de temporada. Sólo con ?include=league_stats. |
Objeto de jugador ausente
Jugadores en missing[]: ausentes o dudosos para este partido.
| Campo | Tipo | Descripción |
|---|---|---|
| name | string | Nombre del jugador. |
| name_en | string | Nombre en inglés u original, en todas las respuestas (úselo para cruzar datos). |
| player_id | string | null | ID del jugador. |
| squad_role | string | null | RT Rol en la plantilla esta temporada. |
| detailed_position | string | RT Posición habitual (siempre en inglés). Opcional: sólo aparece cuando aplica. |
| detailed_position_label | string | RT Posición en el idioma solicitado. Sólo con ?lang=. Opcional: sólo aparece cuando aplica. |
| missing_type | string | Categoría de la ausencia. doubtful significa que aún puede jugar. Ver missing_type. |
| reason | string | null | Motivo 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_label | string | Motivo en el idioma solicitado. Sólo con ?lang=. Opcional: sólo aparece cuando aplica. |
| missed_in_row | integer | RT 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_missed | integer | null | RT Días entre el primer partido de la ausencia actual y este partido. null si aún no se perdió ningún partido. |
| expected_return | object | null | RT 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 / .to | string | RT Fechas, YYYY-MM-DD. from es igual a to cuando se conoce una sola fecha. |
| absence_impact | string | null | RT Cuánto debería notar el equipo la ausencia. Ver absence_impact. |
| start_xi_probability | integer | RT Sólo para algunos jugadores doubtful: probabilidad (%) de ser titular, 0 a 100. Opcional: sólo aparece cuando aplica. |
| play_probability | integer | RT Sólo para algunos jugadores doubtful: probabilidad (%) de jugar algún minuto, 0 a 100. Opcional: sólo aparece cuando aplica. |
| transfer_date | string | Sólo para transfer_out: fecha de salida (YYYY-MM-DD). Opcional: sólo aparece cuando aplica. |
| to_team_country | string | Sólo para transfer_out: país del nuevo club (localizado con ?lang=). Opcional: sólo aparece cuando aplica. |
| to_team_country_en | string | Nombre en inglés u original, en todas las respuestas (úselo para cruzar datos). Opcional: sólo aparece cuando aplica. |
| to_team_tier | integer | null | Sólo para transfer_out: nivel de liga del nuevo club (1 = primera división). Opcional: sólo aparece cuando aplica. |
| league_stats | object | Estadí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.
| Campo | Tipo | Descripción |
|---|---|---|
| name | string | Nombre del jugador. |
| name_en | string | Nombre en inglés u original, en todas las respuestas (úselo para cruzar datos). |
| player_id | string | ID del jugador. |
| signed_from | string | null | Club anterior con su país, Club (País) (localizado con ?lang=). null si no se conoce. |
| signed_from_en | string | Nombre en inglés u original, en todas las respuestas (úselo para cruzar datos). Opcional: sólo aparece cuando aplica. |
| transfer_date | string | Fecha de llegada (YYYY-MM-DD). |
| stage | string | Progreso del debut en el nuevo club. Ver stage. |
| games_since_arrival | integer | Partidos del equipo desde su llegada, 0 a 2. |
| starts | integer | Titularidades 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.
| Campo | Tipo | Descripción |
|---|---|---|
| name | string | RT Nombre del jugador. |
| name_en | string | RT Nombre en inglés u original, en todas las respuestas (úselo para cruzar datos). |
| player_id | string | RT ID del jugador. |
| squad_role | string | null | RT Rol en la plantilla esta temporada. |
| detailed_position | string | null | RT Posición habitual (siempre en inglés). |
| detailed_position_label | string | RT Posición en el idioma solicitado. Sólo con ?lang=. Opcional: sólo aparece cuando aplica. |
| games_missed | integer | RT Partidos consecutivos perdidos antes de este, 1 a 10 (10 = 10 o más). |
| days_out | integer | null | RT Días entre el primer partido perdido y este partido. |
| returning_to | string | RT 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).
| Campo | Tipo | Descripción |
|---|---|---|
| position | string | RT Posición disputada (siempre en inglés). |
| position_label | string | RT Posición en el idioma solicitado. Sólo con ?lang=. Opcional: sólo aparece cuando aplica. |
| formation_position | integer | RT Casilla en la formación, 1 a 11. |
| contenders | array | RT Candidatos, 2 o más. El primero es el jugador actualmente en starting_xi. |
| contenders[].name | string | RT Nombre del jugador. |
| contenders[].name_en | string | RT Nombre en inglés u original, en todas las respuestas (úselo para cruzar datos). |
| contenders[].player_id | string | RT ID del jugador. |
| contenders[].squad_role | string | null | RT Rol en la plantilla esta temporada. |
| contenders[].probability | integer | RT 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).
| Campo | Tipo | Descripción |
|---|---|---|
| count | integer | Jugadores de starting_xi que no fueron titulares en el partido anterior. 0 = el mismo once. |
| in | array | Jugadores titulares ahora que no lo fueron en el partido anterior. |
| out | array | Jugadores titulares en el partido anterior que ahora no están en starting_xi. |
| in[].name / out[].name | string | Nombre del jugador (localizado con ?lang=). |
| in[].name_en / out[].name_en | string | Nombre en inglés u original, en todas las respuestas (úselo para cruzar datos). |
| in[].player_id / out[].player_id | string | ID 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.
| Campo | Tipo | Descripción |
|---|---|---|
| league_stats.current_season | object | null | Registro del jugador con este equipo en la temporada actual de liga. null si no hay. Sólo con ?include=league_stats. |
| league_stats.previous_season | object | null | Temporada 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_id | string | Nombre de la liga (localizado con ?lang=) e ID. Sólo con ?include=league_stats. |
| …league_en | string | Nombre en inglés u original, en todas las respuestas (úselo para cruzar datos). Sólo con ?include=league_stats. |
| …season | string | Etiqueta de temporada. Sólo con ?include=league_stats. |
| …team / team_id | string | Equipo al que pertenecen los números (localizado con ?lang=) y su ID. Sólo con ?include=league_stats. |
| …team_en | string | Nombre en inglés u original, en todas las respuestas (úselo para cruzar datos). Sólo con ?include=league_stats. |
| …appearances / starts / sub_appearances | integer | Partidos jugados, de titular y como suplente. Sólo con ?include=league_stats. |
| …substituted_off / bench_appearances | integer | Partidos sustituido; partidos en el banquillo. Sólo con ?include=league_stats. |
| …minutes / goals / assists | integer | Minutos, goles, asistencias. Sólo con ?include=league_stats. |
| …yellow_cards / second_yellow_cards / red_cards | integer | Amarillas, 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.
| Campo | Tipo | Descripción |
|---|---|---|
| country | string | País (localizado con ?lang=). Opcional: sólo aparece cuando aplica. |
| country_en | string | Nombre del país en inglés, en todas las respuestas. Opcional: sólo aparece cuando aplica. |
| channels[].channel | string | Emisora o canal. Las emisoras coreanas en coreano con ?lang=ko cuando escriben su nombre en coreano. Opcional: sólo aparece cuando aplica. |
| channels[].channel_en | string | Nombre original de la emisora, en todas las respuestas. Opcional: sólo aparece cuando aplica. |
| channels[].type | string | tv (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.
| Campo | Tipo | Descripción |
|---|---|---|
| meta.total | integer | null | Total de partidos coincidentes. null en modo cursor. |
| meta.limit | integer | Tamaño de página usado. |
| meta.offset | integer | null | Desplazamiento usado. null en modo cursor. |
| meta.next_cursor | string | null | Cursor de la página siguiente. null en la última página. |
| meta.has_more | boolean | true si hay más páginas. |
| meta.tier | string | professional o realtime. |
| meta.timezone | string | Siempre UTC. |
| rate_limit.remaining | integer | Peticiones restantes en la ventana actual de un minuto. |
| rate_limit.limit | integer | Peticiones permitidas por minuto. |
| rate_limit.resets_in_seconds | integer | Segundos hasta que se reinicie la ventana. |
| subscription.plan | string | Nombre del plan, p. ej. LeagueSpy Realtime. |
| subscription.sport | string | Siempre Football. |
| subscription.tier | string | professional 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.
| Valor | Significado |
|---|---|
| scheduled | Aún no ha comenzado. |
| tba | Hora de inicio aún sin fijar. |
| delayed | Inicio retrasado el mismo día. |
| live | En juego (incluye descanso, prórroga y penaltis). |
| interrupted | Detenido durante el juego (p. ej. clima), puede reanudarse. |
| finished | Finalizado (también tras prórroga o penaltis). |
| postponed | Aplazado. starting_at muestra la nueva fecha cuando se conoce. |
| suspended | Suspendido, se reanudará otro día. |
| cancelled | Cancelado, no se jugará. |
| abandoned | Abandonado, no se reanudará. |
| awarded | Resultado decidido fuera del campo (p. ej. incomparecencia). |
| unknown | Estado aún sin confirmar. |
missing_type
| Valor | Significado |
|---|---|
| injury | Lesionado o enfermo. |
| suspended | Sancionado (tarjetas, roja o sanción disciplinaria). |
| doubtful | Dudoso: aún puede jugar. Puede incluir start_xi_probability y play_probability. |
| national_team | Convocado con su selección. |
| out_of_selection | Disponible pero fuera de la convocatoria (decisión técnica, descanso, no inscrito). |
| transfer_out | Salió del club recientemente (traspaso o cesión). Se muestra en los primeros partidos tras la salida. |
| other | No disponible por otro motivo (p. ej. falta de ritmo, motivos personales). |
absence_impact
| Valor | Significado |
|---|---|
| critical | Jugador clave, ausencia reciente. Gran efecto esperado. |
| high | Efecto claro esperado. |
| medium | Efecto apreciable. |
| low | Efecto pequeño. |
| minimal | Efecto mínimo (jugador secundario o juvenil). |
| null | Desconocido (rol del jugador sin clasificar). |
squad_role
| Valor | Significado |
|---|---|
| key_player | Uno de los jugadores más importantes del equipo esta temporada. |
| regular | Titular habitual. Un jugador lesionado de larga duración, enfermo, sancionado o en duda conserva el rol que tenía estando sano. |
| rotation | Juega con frecuencia pero rota con otros. |
| backup | Jugador de plantilla con pocos minutos. |
| youth | Joven con pocos minutos en el primer equipo. |
| null | Sin clasificar (p. ej. pocos partidos esta temporada). |
new_arrivals[].stage
| Valor | Significado |
|---|---|
| pre_debut | Primera convocatoria con el nuevo club. |
| bench_debut | Convocado antes, aún sin jugar. |
| played | Ha jugado con el club, aún sin ser titular. |
| started | Ha sido titular con el club. |
returning[].returning_to
| Valor | Significado |
|---|---|
| starting_xi | Regresa en el once inicial. |
| bench | Regresa 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).
| Valor | Coreano (?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.
| Valor | Coreano (?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
}
| HTTP | Código de error | Significado | ¿Reintentar? |
|---|---|---|---|
| 400 | INVALID_DATETIME | Formato de fecha/hora incorrecto | No — corrija la petición |
| 400 | INVALID_ID_FORMAT | ID público mal formado | No — corrija el ID |
| 400 | UPDATED_SINCE_TOO_OLD | Periodo de consulta supera 48 horas | No — use paginación por offset para el dataset completo |
| 400 | INVALID_CURSOR | Cursor corrupto o manipulado | No — reinicie la consulta sin cursor |
| 400 | CURSOR_EXPIRED | Cursor con más de 2 horas de antigüedad | No — reinicie la consulta sin cursor |
| 400 | INVALID_PARAMS | cursor + offset usados juntos, o cursor sin updated_since | No — corrija la petición |
| 401 | MISSING_API_KEY | No se proporcionó clave API | No — añada cabecera |
| 401 | INVALID_API_KEY | Clave no reconocida | No — compruebe la clave |
| 403 | VERSION_ACCESS_DENIED | Sin acceso v2 en esta clave | No — contáctenos |
| 404 | ID_NOT_FOUND | La entidad no existe | No — verifique el ID |
| 405 | — | Método HTTP incorrecto | No — use GET |
| 429 | RATE_LIMIT_EXCEEDED | Demasiadas peticiones | Sí — espere retry_after |
| 500 | INTERNAL_ERROR | Error del servidor | Sí — reintente en 30s |
| 503 | SERVICE_UNAVAILABLE | Temporalmente no disponible | Sí — reintente en 30s |
Cabeceras de respuesta
Incluidas en cada respuesta.
| Cabecera | Descripción |
|---|---|
| X-Request-Id | Identificador único de la petición. Inclúyalo en informes de errores. |
| X-RateLimit-Limit | Máximo de peticiones por minuto para su nivel. |
| X-RateLimit-Remaining | Peticiones restantes en la ventana actual. |
| X-RateLimit-Reset | Marca de tiempo Unix de cuándo se reinicia la ventana. |
| Retry-After | Segundos 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
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ó.
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
}
}
• 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
Registro de cambios
| Fecha | Versión | Cambios |
|---|---|---|
| 2026-10-27 | 2.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-21 | 2.3.0 | expected_return en los jugadores de missing[] (Realtime): ventana estimada de regreso de jugadores lesionados y sancionados. |
| 2026-10-19 | 2.2.0 | home_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-08 | 2.1.0 | Nuevo 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-05 | 2.0.4 | Consistencia de respuesta mejorada para partidos con datos parciales. Documentación de API actualizada. |
| 2026-01-08 | 2.0.2 | Equipo de investigación ampliado con analistas dedicados a las rotaciones en calendarios apretados. |
| 2025-11-20 | 2.0.1 | Expansió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-01 | 2.0.0 | Lanzamiento GA de v2. Acceso por niveles, limitación de tasa estructurada, nombres de entidades enriquecidos, polling updated_since. |
| 2024-11-15 | 2.0.0-beta | Beta de v2. Nuevo esquema de respuesta, flujo de alineación confirmada (is_confirmed), seguimiento de convocatorias. |
| 2024-09-01 | 1.4.0 | Reestructuració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-10 | 1.3.0 | Sistema de niveles introducido (Essential / Professional / Real-Time). Garantías de frescura de datos por nivel. |
| 2024-05-01 | 1.2.0 | Añ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-15 | 1.1.0 | Detecció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-01 | 1.0.1 | Soporte 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-01 | 1.0.0 | Lanzamiento 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. |