---
title: "Get a season schedule"
method: GET
path: "/api/v2/seasons/{year}/schedule"
---

# Get a season schedule

`GET /api/v2/seasons/{year}/schedule`

## Request

- Base URL: `https://api.racecalendar.app`
- URL: `https://api.racecalendar.app/api/v2/seasons/{year}/schedule`
- Auth: none declared

Returns a compact, freshness-bounded schedule for one year with last-verified and stale-after timestamps. Prefer this over the full snapshot when only session times are needed.

## Path parameters

- `year` string, required: Four-digit championship year.

## Response `200`

Compact, freshness-bounded season schedule

- SeasonSchedulePayload
  - `year` number, required
  - `generatedAt` string, required
  - `lastVerifiedAt` string, required
  - `staleAfter` string, required
  - `refreshIntervalSeconds` number, required
  - `source` 'OpenF1', required
  - `weekends` SeasonScheduleWeekend[], required
    - `id` number, required
    - `round` number, required
    - `grandPrixName` string, required
    - `circuitName` string, required
    - `location` string, required
    - `countryName` string, required
    - `countryCode` string, nullable, required
    - `gmtOffset` string, nullable, required
    - `startDate` string, required
    - `endDate` string, required
    - `status` 'scheduled' | 'cancelled', required
    - `statusNote` string, nullable, required
    - `resultStatus` 'notStarted' | 'pending' | 'available', required
    - `raceWinnerName` string, nullable, required
    - `raceWinnerConstructorName` string, nullable, required
    - `resultSummary` string, nullable, required
    - `sessions` SeasonSession[], required
      - `id` number, required
      - `name` string, required
      - `displayName` string, required
      - `kind` 'practice' | 'sprintQualifying' | 'sprint' | 'qualifying' | 'race' | 'other', required
      - `sessionType` string, required
      - `startDate` string, required
      - `endDate` string, required

## Other responses

- `304`: Not modified
- `400`: Invalid request. Typed RFC 9457-compatible JSON (`ErrorResponse`) keeps `ok: false` plus `error` for iOS clients.
- `404`: Resource not found. Typed RFC 9457-compatible JSON (`ErrorResponse`) keeps `ok: false` plus `error` for iOS clients.
- `429`: Too many requests. Public calendar, season, standings, and track GET routes do not currently return 429; they only advertise an informational RateLimit ceiling. MCP cache-miss queries under `/api/v2/mcp/*` may return 429 with Retry-After. Identity and referral routes keep their existing D1 budgets.
- `500`: Internal server error. Typed RFC 9457-compatible JSON (`ErrorResponse`) keeps `ok: false` plus `error` for iOS clients.

---

[API](https://skmtc.dev/racecalendar/apis/race-calendar-formula-1-api.md) · [All operations](https://skmtc.dev/racecalendar/apis/race-calendar-formula-1-api/llms.txt) · [OpenAPI document](https://skmtc.dev/racecalendar/apis/race-calendar-formula-1-api/revisions/b2c2532b5f80?raw)
