← Todas las guías

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:

  1. El calendario completo de la temporada en orden de rondas.
  2. La próxima carrera, para una cuenta atrás o una notificación push.
  3. 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.

Siguiente guía → Puntúa una liga fantasy de MotoGP