# The stage object

Attributes:
- `id` (string): Stage identifier (`stg_<digits>`).
- `season_id` (string): Season identifier (`ssn_<digits>`).
- `label` (string): Structural label (`Regular season`, `Group B`); a source's round label (matchday 12) is not a stage.
- `kind` (enum): The kind of stage. One of: `regular_season`, `main_draw`, `group`, `qualifying`, `knockout_round`, `playoff`, `final`.
- `is_default` (boolean)
- `ordinal` (integer)
- `parent_stage_id` (string, nullable): `null` for a top-level stage (the default stage always is).
- `resolution` (object): How the requested identifier resolved. Present whenever the requested identifier is not the canonical one, and optional otherwise.
  - `requested_id` (string): OddsFinder identifier, `<prefix>_<digits>`, a per-kind sequence number without padding, leading zeros, grouping or sign (1 to 9223372036854775807). The prefix names the kind; the per-kind schemas fix it where a field or parameter has one kind. `Resolution` uses this generic form because its identifiers are of the resource's kind.
  - `canonical_id` (string): OddsFinder identifier, `<prefix>_<digits>`, a per-kind sequence number without padding, leading zeros, grouping or sign (1 to 9223372036854775807). The prefix names the kind; the per-kind schemas fix it where a field or parameter has one kind. `Resolution` uses this generic form because its identifiers are of the resource's kind.
  - `status` (enum): `canonical`: the requested identifier is the identity itself; `alias`: it was retired by a merge decision and resolves to `canonical_id`. One of: `canonical`, `alias`.
  - `decision_id` (string, nullable): Identifier of a merge or reversal decision (`dec_<digits>`), a record you can cite.
  - `decided_at` (timestamp, nullable): A `Timestamp`, or `null` when unknown; the owning object says why.
- `knowledge` (object): The effective knowledge cutoff of the response. Under a grant freshness delay it is never later than the request time minus the delay, whatever `known_at` asked for.
  - `known_at` (timestamp): RFC 3339 instant in UTC with `Z` suffix; optional fractional seconds up to microseconds.
  - `as_requested` (boolean): True when the caller supplied `known_at`; false when it defaulted to the request time.
- `provenance` (object): `include=provenance`: for every field whose value OddsFinder chooses among several sources, the source report its ranking of sources selects among those recorded by the cutoff. The served value is in the body; this block says where it came from. `policy` identifies the ranking used (sport and version).
  - `policy` (object)
    - `sport` (string)
    - `version` (integer)
  - `fields` (map)
    - `status` (enum):  One of: `known`, `unavailable`, `no_observation`, `withheld`.
    - `provider` (string, nullable): A source provider or namespace name (`footystats`, `football`).
    - `namespace` (string, nullable): A source provider or namespace name (`footystats`, `football`).
    - `source_time` (timestamp, nullable): A `Timestamp`, or `null` when unknown; the owning object says why.
    - `source_time_precision` (enum, nullable):  One of: `unknown`, `day`, `hour`, `minute`, `second`, `millisecond`.
    - `observed_at` (timestamp, nullable): A `Timestamp`, or `null` when unknown; the owning object says why.
    - `recorded_at` (timestamp, nullable): A `Timestamp`, or `null` when unknown; the owning object says why.

Example:

```json
{
  "id": "stg_1",
  "season_id": "ssn_1",
  "label": "Regular season",
  "kind": "regular_season",
  "is_default": true,
  "ordinal": 1,
  "parent_stage_id": null,
  "resolution": {
    "requested_id": "stg_1",
    "canonical_id": "stg_1",
    "status": "canonical",
    "decision_id": null,
    "decided_at": null
  },
  "knowledge": {
    "known_at": "2026-10-04T09:00:00Z",
    "as_requested": false
  }
}
```
