---
title: "One season, its weeks, and how it froze"
method: GET
path: "/seasons/{id}"
tags: ["Seasons"]
---

# One season, its weeks, and how it froze

`GET /seasons/{id}`

## Request

- Base URL: `https://kellian.app/api/v1`
- URL: `https://kellian.app/api/v1/seasons/{id}`
- Auth: none required

## Path parameters

- `id` string, required

## Response `200`

Success

- SeasonDetail
  - `id` string, required
  - `number` integer, required
  - `name` string, required
  - `status` 'scheduled' | 'open' | 'closed' | 'frozen', required: scheduled → open → closed → frozen. `closed` means calls no longer attribute to it; `frozen` means the standings are written and stand.
  - `opensAt` union, required
    - string, date-time
    - string
  - `closesAt` union, required: Exclusive. A call filled at this instant belongs to no season.
    - string, date-time
    - string
  - `frozenAt` union, required
    - string, date-time
    - string
  - `rulesetHash` string, required: keccak256 of the canonical ruleset. Immutable once the season opens, so the archive can always say which rules a standing was scored under.
  - `rulesetVersion` string, required
  - `counterWindowEndsAt` union, required: Denormalised from `opensAt` at charter: a published methodology whose window moved later is not a methodology.
    - string, date-time
    - string
  - `cohorts` CohortSummary[], required
    - `week` integer, required: 1-based week within the season.
    - `opensAt` union, required
      - string, date-time
      - string
    - `freezesAt` union, required: Exclusive. Fills at or after this are not cohort-scored.
      - string, date-time
      - string
    - `frozenAt` union, required
      - string, date-time
      - string
    - `status` 'open' | 'frozen', required
    - `selectionHash` string, required: keccak256 over the sorted market ids, the week and the ruleset hash. Recomputable — which is the point: it proves the set never changed.
    - `marketCount` integer, required
  - `freezeSummary` object, nullable, required
    - `frozenAt` union, required
      - string, date-time
      - string
    - `standingsWritten` integer, required
    - `belowBarCount` integer, required
    - `usedDeadline` boolean, required: True when the freeze deadline forced it over markets that never settled.
    - `unsettledMarketIds` integer[], required: Named rather than quietly dropped: they were in the cohort and never scored.

## Other responses

- `400`: Error: one of INVALID_PAYLOAD
- `404`: Error: one of SEASON_NOT_FOUND
- `429`: Error: one of RATE_LIMITED
- `500`: Error: one of INTERNAL_ERROR
- `default`: Error response (RFC 9457 Problem Details for HTTP APIs)

---

[API](https://skmtc.dev/problee/apis/kellian-consumer-api.md) · [All operations](https://skmtc.dev/problee/apis/kellian-consumer-api/llms.txt) · [OpenAPI document](https://skmtc.dev/problee/apis/kellian-consumer-api/revisions/2b8254b0ec57?raw)
