Calendario de la temporada, próxima carrera y resultados
Crea un calendario de carreras con cuenta atrás de la «próxima carrera» y una página de resultados por ronda, en Python.
8 min de lectura
Toda app de carreras necesita un calendario. Esta guía construye tres cosas con los endpoints de carreras:
- El calendario completo de la temporada en orden de rondas.
- La próxima carrera, para una cuenta atrás o una notificación push.
- Los resultados clasificados de una ronda terminada.
El calendario
GET /races/seasons/{year} devuelve todas las rondas de una temporada para una categoría:
{
"round_number": 12,
"name": "Qatar Airways Grand Prix of Great Britain",
"circuit_name": "Silverstone Circuit, Silverstone",
"country": "United Kingdom",
"flag": "🇬🇧",
"category": "MOTOGP",
"race_date": "2026-08-09",
"season_year": 2026
}
Las rondas no se devuelven en orden, así que ordénalas por round_number:
import os
from datetime import date
import requests
HOST = "motogp-api-championship-data-statistics.p.rapidapi.com"
HEADERS = {"X-RapidAPI-Key": os.environ["RAPIDAPI_KEY"], "X-RapidAPI-Host": HOST}
def get(path: str, **params):
res = requests.get(f"https://{HOST}{path}", headers=HEADERS, params=params, timeout=10)
res.raise_for_status()
return res.json()["data"]
def calendar(year: int, category: str = "MOTOGP") -> list[dict]:
races = get(f"/races/seasons/{year}", category=category)
return sorted(races, key=lambda r: r["round_number"])
for race in calendar(2026):
print(f"R{race['round_number']:>2} {race['race_date']} {race['flag']} {race['name']}")
...
R 6 2026-05-17 🇪🇸 Monster Energy Grand Prix of Catalunya
...
R12 2026-08-09 🇬🇧 Qatar Airways Grand Prix of Great Britain
...
La próxima carrera
race_date es una fecha ISO (YYYY-MM-DD), así que se ordena y compara como cadena o se convierte
con date.fromisoformat:
def next_race(races: list[dict], today: date) -> dict | None:
upcoming = [r for r in races if date.fromisoformat(r["race_date"]) >= today]
return upcoming[0] if upcoming else None
race = next_race(calendar(2026), date.today())
if race:
days = (date.fromisoformat(race["race_date"]) - date.today()).days
print(f"Next: {race['name']} at {race['circuit_name']} in {days} days")
else:
print("Season finished")
Resultados de una ronda
Una vez disputada la ronda, sus resultados están disponibles por temporada y ronda:
def results(year: int, round_number: int, category: str = "MOTOGP") -> list[dict]:
rows = get(f"/races/seasons/{year}/round/{round_number}/results", category=category)
return sorted(rows, key=lambda r: r["position"])
for row in results(2026, 1)[:3]:
print(f"P{row['position']} {row['rider_name']:<22} {row['team_name']:<32} +{row['points']} pts")
P1 Marco Bezzecchi Aprilia Racing +25 pts
P2 ...
P3 Raúl Fernández SuperFile Trackhouse MotoGP Team +16 pts
Cada fila tiene un status — FINISHED para los pilotos clasificados y valores como DNF o DNS
en caso contrario. Muestra a los no clasificados debajo de los clasificados.
Consultar tras una carrera
Los resultados se añaden después de cada fin de semana de carrera. Si envías notificaciones de
«resultados disponibles», consulta el endpoint de resultados de la última ronda cada 30–60 minutos
tras la fecha de la carrera en lugar de cada pocos segundos: una lista vacía significa «todavía no»,
y consultar despacio te mantiene muy por debajo de tu cuota. Una ronda que no está en el calendario
devuelve 404.
def results_ready(year: int, round_number: int) -> bool:
return len(results(year, round_number)) > 0
Moto2 y Moto3
Pasa category="MOTO2" o category="MOTO3" a cualquiera de las funciones anteriores. Los números de
ronda y las fechas siguen el mismo calendario, así que una vista combinada del fin de semana es una
combinación por round_number.