# The competition detail object

A single competition read; list items carry no `resolution`, `knowledge` or `provenance`.

Attributes:
- `id` (string): Competition identifier (`cmp_<digits>`).
- `name` (string, nullable): The display name at the date (names are dated, and a sponsor rename never changes the identifier); `null` with `name_status: unavailable` when no dated name exists.
- `name_status` (enum): Says why a nullable `name` is or is not served: `known` = a dated name applies at `valid_at` as known at the cutoff; `unavailable` = the entity exists but has no dated name at that date (for example a team known from a source that reports no names); `withheld` = a name exists but the rights of its sources do not allow serving it to you. An entity is never a 404 for lacking a name. One of: `known`, `unavailable`, `withheld`.
- `association_code` (string, nullable): Member association of a national competition; `null` when a confederation or FIFA organises it (see `organiser`).
- `organiser` (enum): Who organises a competition or registers a side. `national_association` means the sibling `association_code` names the member association; a confederation or `FIFA` organises competitions that have no country and the sibling is `null`. One of: `national_association`, `UEFA`, `CONMEBOL`, `CONCACAF`, `AFC`, `CAF`, `OFC`, `FIFA`.
- `competition_kind` (enum): The kind of competition. One of: `league`, `cup`, `international`, `friendly`.
- `tier` (integer, nullable): 1 = top division; `null` when unknown (no sibling status exists yet).
- `seasons` (array of objects)
  - `id` (string): Season identifier (`ssn_<digits>`).
  - `label` (string)
  - `starts_on` (date)
  - `ends_on` (date)
- `sources` (object): Source references, or an explicit statement that they are withheld by source rights or unknown.
  - `status` (enum):  One of: `included`, `withheld`, `unknown`.
  - `items` (array of objects)
    - `source` (string): Source namespace (for example `footystats`).
    - `observed_at` (timestamp, nullable): A `Timestamp`, or `null` when unknown; the owning object says why.
    - `recorded_at` (timestamp): RFC 3339 instant in UTC with `Z` suffix; optional fractional seconds up to microseconds.
    - `precision` (enum): Precision of the source timestamp; `unknown` when the source gave none. One of: `unknown`, `day`, `hour`, `minute`, `second`, `millisecond`.
- `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": "cmp_1",
  "name": "Synthetic Premier Division",
  "name_status": "known",
  "association_code": "SYN",
  "organiser": "national_association",
  "competition_kind": "league",
  "tier": 1,
  "seasons": [
    {
      "id": "ssn_1",
      "label": "2026/27",
      "starts_on": "2026-08-01",
      "ends_on": "2027-05-31"
    }
  ],
  "resolution": {
    "requested_id": "cmp_1",
    "canonical_id": "cmp_1",
    "status": "canonical",
    "decision_id": null,
    "decided_at": null
  },
  "knowledge": {
    "known_at": "2026-10-04T09:00:00Z",
    "as_requested": false
  },
  "sources": {
    "status": "included",
    "items": [
      {
        "source": "synthetic_alpha",
        "observed_at": null,
        "recorded_at": "2026-09-01T00:00:00Z",
        "precision": "unknown"
      },
      {
        "source": "synthetic_beta",
        "observed_at": null,
        "recorded_at": "2026-09-01T00:00:00Z",
        "precision": "unknown"
      }
    ]
  }
}
```
