# SportsAPI — data reference

> Every object, WebSocket frame and enum of the public contract, contract version 2026-11-04. Generated from the API's own schema.

## Objects

### Fixture

A match. The same object on every endpoint and in WebSocket snapshots.

| Field | Type | Description |
| --- | --- | --- |
| `id` | `integer` | Our fixture id. |
| `sport` | `string` | Sport slug (as in /v2/sports). |
| `status` | `Status` | Match status. |
| `startTime` | `string (ISO-8601 UTC) \| null \| null` | Start time: the scheduled start, replaced by the recorded kick-off once the source records it (the live feed sends it a few minutes after the start). The same value on every endpoint and in WebSocket deltas. |
| `league` | `LeagueRef \| null \| null` | The competition. null when the source files the fixture under a competition it has no league for — seen on minor regional football (South Africa’s National Second Division, 2026-10-23); season and round are then null too. |
| `season` | `Season \| null \| null` | The season. |
| `round` | `Round \| null \| null` | The round, when the competition has rounds. |
| `home` | `TeamRef \| null \| null` | Home side; null while the side is not decided yet (the source’s placeholder such as "WQF1", winner of quarter-final 1). |
| `away` | `TeamRef \| null \| null` | Away side; null while the side is not decided yet (the source’s placeholder such as "WQF1"). |
| `homeScore` | `ScoreSide` | One side’s score. |
| `awayScore` | `ScoreSide` | One side’s score. |
| `winner` | `Winner \| null \| null` | Null until status.type is finished, and for a fight ruled a no contest (`fightResult.method` noContest). A match finished on penalties: the shoot-out winner, whatever the source says (on a second leg the source names the side that won the 90 minutes). Named from the score when the source leaves it out, or calls a match draw in a sport that cannot draw (regular time or overtime finishes; not cricket). |
| `venue` | `Venue \| null \| null` | Venue, when known (often null in lower tiers). Filled on /fixtures/{id} and, when the source lists it, in date lists; the source’s round, team, player and live lists carry no venue, so null there means "not included", not "unknown" — read /fixtures/{id} for it. |
| `clock` | `Clock \| null \| null` | Match clock; null when the source has none for the fixture and once it is over. |
| `firstToServe` | `Side \| null \| null` | Deprecated (2026-10-23): the same value as `serving`. The source updates this field every game / leg, so it is the side serving (throwing) NOW, not who served first — read `serving`. |
| `serving` | `Side \| null \| null` | Tennis / darts / other serve sports: the side serving (throwing) now, as the source updates it every game / leg. Null when the source does not say. |
| `homeSeed` | `string \| null \| null` | Seeded competitions — tennis draws, playoff seeding (basketball, …): the home side’s seed ("1", "12") or entry status ("WC" wild card, "Q" qualifier, "LL" lucky loser, "PR" protected ranking, …), as the draw prints it. Null when unseeded. |
| `awaySeed` | `string \| null \| null` | The away side’s seed or entry status, like homeSeed. |
| `note` | `string \| null \| null` | Cricket: the source’s match note — the result line once finished ("Pakistan beat Sri Lanka by 37 runs"). Display only. |
| `battingSide` | `Side \| null \| null` | Cricket: the side batting now. Null when no innings is in progress and for other sports. |
| `fightResult` | `FightResult \| null \| null` | MMA / boxing: method, round and time of the finish. Null until status.type is finished, and when the source has no method. |
| `fightDiscipline` | `FightDiscipline \| null \| null` | Combat sports (sport `mma`, which also carries boxing, kickboxing and Muay Thai cards): the discipline of this fight, when the source tags it. The source tags only some cards (ONE, Queensbury, some OKTAGON fights; not UFC or PFL), so null does not mean MMA. |
| `referee` | `Referee \| null \| null` | The referee, when the source names one (football and some other sports; cricket: the match referee). Filled on /fixtures/{id}; lists carry null (not included). |
| `homeManager` | `ManagerRef \| null \| null` | The home side’s manager / head coach for this fixture, when the source names one. Filled on /fixtures/{id}; lists carry null. |
| `awayManager` | `ManagerRef \| null \| null` | The away side’s manager / head coach, like homeManager. |
| `surface` | `Surface \| null \| null` | Tennis: the court surface. Filled on /fixtures/{id} and live lists; null for other sports. |
| `toss` | `CricketToss \| null \| null` | Cricket: the toss, once made. Filled on /fixtures/{id}; null for other sports. |
| `umpires` | `string[] \| null \| null` | Cricket: the on-field umpires as the source names them (often with a country code: "Asif Yaqoob (PAK)"); null when not listed and for other sports. |
| `tvUmpire` | `string \| null \| null` | Cricket: the TV (third) umpire, like umpires. |
| `previousLegFixtureId` | `integer \| null \| null` | Two-legged ties and playoff series: our id of the previous leg / game of the tie, when the source links it. Read /fixtures/{id} of it for the first-leg score. |
| `aggregateWinner` | `Side \| null \| null` | Second leg of a two-legged tie: the side that went through, once finished — the source’s verdict, else read from `aggregated` (higher wins) or, level on aggregate, the shoot-out. Null otherwise, and on a level aggregate the source does not settle (an away-goals rule). `winner` is this match’s winner: on a second leg decided on penalties both name the shoot-out winner; otherwise the two can differ (a side can win the second leg and go out). Filled on /fixtures/{id}; lists and live snapshots may carry null (not included). |
| `fightCard` | `FightCard \| null \| null` | MMA / boxing: card section, order and weight class of the bout, when the source lists them. |
| `attendance` | `integer \| null \| null` | Spectators, when the source reports it (seen on NBA and MLB games, often only once the game is under way). Filled on /fixtures/{id}; lists carry null (not included). |
| `matchFormat` | `MatchFormat \| null \| null` | Darts and esports: the match format (best of N sets / legs / games), when the source gives it; null for other sports. |
| `inningState` | `InningState \| null \| null` | Baseball: the game state in play (inning, half, balls, strikes, outs, runners on base). Null unless the game is in progress (or interrupted), and for other sports. Live: in WebSocket deltas. |
| `timeouts` | `Timeouts \| null \| null` | Basketball: timeouts left per side. Null unless the game is in progress (or interrupted), and when the source does not track them. Live: in WebSocket deltas. |

### Status

Match status.

| Field | Type | Description |
| --- | --- | --- |
| `type` | `StatusType` | Coarse state: derived from `phase` (see the StatusPhase table). |
| `phase` | `StatusPhase` | Fine state, derived from `code`. |
| `code` | `integer \| null \| null` | The source’s status code — the full table is in the data dictionary. `phase`, `period` and `finish` already decode it. |
| `description` | `string \| null \| null` | English label for display, from our status table (the data dictionary’s status codes), sport-aware: e.g. "2nd half", "Halftime", "After extra time" (football), "After overtime" (basketball, ice hockey, …), "After extra innings" (baseball), "After penalties", "1st innings" (cricket), "Coverage canceled". The source’s own text only for a code we do not know. Do not branch on it. |
| `period` | `PeriodKey \| null \| null` | The period in play (or, during a break, the one just played). Null before the start and once over. |
| `finish` | `FinishType \| null \| null` | How the match was decided; null unless `type` is finished. |

### ScoreSide

One side’s score.

| Field | Type | Description |
| --- | --- | --- |
| `current` | `number \| null \| null` | The score as a scoreboard shows it: goals, points, sets won (tennis / volleyball), runs (cricket, baseball), extra time / overtime included. A penalty shoot-out is NOT included — it is in `penalties` — except in ice hockey, whose scoring credits the shoot-out winner with one goal (3-3 after overtime → 3-4). Null before the start, and on a fixture whose coverage was canceled. |
| `periods` | `Record<PeriodKey, number>` | Score per period, keyed by PeriodKey: goals per half / quarter / period, games per set (tennis), points per set (volleyball, table tennis), runs per inning (baseball). Extra time is here too: `extra1` / `extra2` (football, futsal), `overtime` (basketball, ice hockey, handball, American football, water polo, …), `period10`… (baseball extra innings; `overtime` only when the source gives the extra-innings runs as a total). The values add up to `current` when the source’s breakdown is complete (it sometimes is not: some baseball leagues send no innings, a few futsal matches miss a half) — ice hockey after a shoot-out is one goal short by design (see `current`). Esports: one key per game (map), and what the source counts there depends on the title — Counter-Strike 1 for the side that won map N and 0 otherwise (maps not played 0, up to period5 in a best of 3), League of Legends the side’s kills in game N (so they do not add up to `current`, which counts games won); read /fixtures/{id}/games for each game’s winner and score. Empty when the source has none. |
| `tieBreaks` | `Record<PeriodKey, number>` | Tennis: tie-break points of a set, keyed like `periods` (e.g. { "period2": 7 }). |
| `normalTime` | `number \| null \| null` | Score at the end of regulation time, when the source gives it. |
| `penalties` | `number \| null \| null` | Penalty shoot-out score (goals scored in the shoot-out). Ice hockey: 1 for the shoot-out winner and 0 for the loser — the goal `current` credits. |
| `aggregated` | `number \| null \| null` | Aggregate over a two-legged tie. |
| `series` | `number \| null \| null` | Playoff series: games won in the series so far (basketball, baseball, ice hockey, water polo). |
| `point` | `string \| null \| null` | Tennis: the current game score, "0" \| "15" \| "30" \| "40" \| "A" (tie-break points as numbers, "0"–"N"). Null unless play is in progress or interrupted. |
| `redCards` | `integer \| null \| null` | Football: red cards shown to the side (second yellows included). |
| `innings` | `Record<PeriodKey, CricketInnings>` | Cricket: the side’s innings, keyed inning1…N. Empty for other sports. |
| `hits` | `integer \| null \| null` | Baseball: hits (the H of the R/H/E line). |
| `errors` | `integer \| null \| null` | Baseball: errors (the E of the R/H/E line). |

### CricketInnings

One innings of a side in cricket.

| Field | Type | Description |
| --- | --- | --- |
| `runs` | `integer \| null \| null` | Runs scored. |
| `wickets` | `integer \| null \| null` | Wickets lost. |
| `overs` | `number \| null \| null` | Overs bowled, cricket notation (49.5 = 49 overs and 5 balls). |
| `runRate` | `number \| null \| null` | Runs per over. |
| `targetRunRate` | `number \| null \| null` | Required run rate to reach the target (chasing side). |

### Clock

The match clock. Running clock (football, rugby, …): elapsed = periodOffsetSeconds + (now − periodStartedAt); minute = floor(elapsed / 60) + 1; past periodEndSeconds show periodEndSeconds / 60 + "+" + the extra minutes. Only while status.phase is inprogress. Stop clock (basketball, handball, ice hockey, …): playedSeconds as of playedAt, ticking only while `running` is true. Set / map sports (tennis, table tennis, badminton, esports): only `periodStartedAt` (when the current set or map started), when the source sends it — often the whole clock is null. Every field is null when the source does not supply it for the sport; the whole clock is null when there is none and once the match is over. Lists other than /fixtures/{id} may carry fewer clock fields (the static ones such as periodLengthSeconds can be null there).

| Field | Type | Description |
| --- | --- | --- |
| `periodStartedAt` | `string (ISO-8601 UTC) \| null \| null` | When the current period’s clock started. |
| `periodOffsetSeconds` | `number \| null \| null` | Running clock: clock seconds already elapsed when the period started (football 2nd half: 2700). Unit: seconds. |
| `periodEndSeconds` | `number \| null \| null` | Running clock: the clock second at which the period’s regulation time ends (football 1st half: 2700). Unit: seconds. |
| `maxExtraSeconds` | `number \| null \| null` | Running clock: the most added time the source’s display allows beyond periodEndSeconds. Unit: seconds. |
| `injuryTimeMinutes` | `number \| null \| null` | Added time announced for the period in play. Unit: minutes. |
| `playedSeconds` | `number \| null \| null` | Stop clock: seconds played, as of `playedAt`. Unit: seconds. |
| `playedAt` | `string (ISO-8601 UTC) \| null \| null` | When `playedSeconds` was read. |
| `running` | `boolean \| null \| null` | Stop clock: whether the game clock is running. |
| `runningUpdatedAt` | `string (ISO-8601 UTC) \| null \| null` | When `running` was last updated. |
| `periodLengthSeconds` | `number \| null \| null` | Stop clock: regulation length of one period. Unit: seconds. |
| `overtimeLengthSeconds` | `number \| null \| null` | Length of one overtime period. Unit: seconds. |
| `periodCount` | `integer \| null \| null` | Number of regulation periods (combat sports: scheduled rounds). |

### FightResult

MMA / boxing: how a finished fight was decided.

| Field | Type | Description |
| --- | --- | --- |
| `method` | `FightMethod` | How it was won. |
| `round` | `integer \| null \| null` | The round it ended in. |
| `roundTimeSeconds` | `integer \| null \| null` | Time into that round when the fight was stopped (KO, TKO, submission, disqualification, …), when the source has it. Null for a decision (unanimous, split, majority, technical — draws by decision included): the fight was not stopped, and the source’s figure for it is unreliable. Unit: seconds. |

### Referee

The match referee (cricket: the match referee), with the career totals the source keeps — divide by `games` for a per-match rate.

| Field | Type | Description |
| --- | --- | --- |
| `id` | `integer` | Our referee id. |
| `name` | `string` | Referee name. |
| `slug` | `string \| null \| null` | URL slug. |
| `country` | `Country \| null \| null` | The referee’s country, when the source gives it. |
| `games` | `integer \| null \| null` | Matches the source has recorded the referee in charge of (career, all competitions). |
| `yellowCards` | `integer \| null \| null` | Yellow cards shown over those matches; null in sports without cards (cricket). |
| `redCards` | `integer \| null \| null` | Straight red cards shown over those matches; null in sports without cards. |
| `yellowRedCards` | `integer \| null \| null` | Second-yellow sending-offs over those matches; null in sports without cards. |
| `image` | `string (URL) \| null \| null` | Photo on our CDN; null when the referee has no image (or it is not uploaded yet). Since 2026-11-04. |

### Surface

Tennis: the court the match is played on.

| Field | Type | Description |
| --- | --- | --- |
| `type` | `SurfaceType` | A tennis court surface. |
| `indoor` | `boolean \| null \| null` | True indoors, false outdoors; null when the source does not say. |
| `name` | `string` | The source’s text, e.g. "Hardcourt outdoor". Display only. |

### CricketToss

Cricket: the toss.

| Field | Type | Description |
| --- | --- | --- |
| `winner` | `Side \| null \| null` | The side that won the toss; null when the source’s team name matches neither side. |
| `decision` | `TossDecision \| null \| null` | What it chose. |

### FightCard

MMA / boxing: where a bout sits on its card.

| Field | Type | Description |
| --- | --- | --- |
| `section` | `FightCardSection \| null \| null` | Main card, prelims, …, when the source says. |
| `order` | `integer \| null \| null` | The bout’s place on the card as the source numbers it (higher = later; the main event has the highest number). |
| `weightClass` | `string \| null \| null` | The bout’s weight class as the source names it ("light", "bantam", "feather", …). |

### FixturePatch

The `changes` of a WebSocket delta: a partial Fixture with the same names and nesting. Deep-merge it onto the Fixture you hold — objects merge key by key, any other value (null included) replaces. Only these fields are ever sent.

| Field | Type | Description |
| --- | --- | --- |
| `status` (optional) | `{ type?: StatusType; phase?: StatusPhase; code?: integer \| null; description?: string \| null; period?: PeriodKey \| null; finish?: FinishType \| null }` | The status fields that changed (a status change always re-sends type, phase, finish and, when known, period). |
| `startTime` (optional) | `string (ISO-8601 UTC) \| null \| null` | New start time: a reschedule, or the recorded kick-off once the source records it (see Fixture.startTime). |
| `winner` (optional) | `Winner \| null \| null` | Set when the match finishes. |
| `homeScore` (optional) | `ScoreSidePatch` | The changed part of a ScoreSide. |
| `awayScore` (optional) | `ScoreSidePatch` | The changed part of a ScoreSide. |
| `clock` (optional) | `{ periodStartedAt?: string (ISO-8601 UTC) \| null; periodOffsetSeconds?: number \| null; periodEndSeconds?: number \| null; maxExtraSeconds?: number \| null; injuryTimeMinutes?: number \| null; playedSeconds?: number \| null; playedAt?: string (ISO-8601 UTC) \| null; running?: boolean \| null; runningUpdatedAt?: string (ISO-8601 UTC) \| null; periodLengthSeconds?: number \| null; overtimeLengthSeconds?: number \| null; periodCount?: integer \| null } \| null \| null` | null = the match is over: drop the clock. |
| `firstToServe` (optional) | `Side \| null \| null` | Deprecated: the same value as `serving`. |
| `serving` (optional) | `Side \| null \| null` | The side serving (throwing) now. |
| `note` (optional) | `string \| null \| null` | Cricket: new match note. |
| `battingSide` (optional) | `Side \| null \| null` | Cricket: the side now batting (null = none). |
| `inningState` (optional) | `InningState \| null \| null` | Baseball: the new game state, always sent whole; null = no longer in play. |
| `timeouts` (optional) | `{ homeRemaining?: integer \| null; awayRemaining?: integer \| null; perTeam?: integer \| null } \| null \| null` | Basketball: the timeout counts that changed; null = no longer in play. |
| `fightResult` (optional) | `FightResult \| null \| null` | MMA / boxing: the method, round and time of the finish, sent whole once the source has it — usually in a delta after the finishing one (the source publishes it ~20–60 s after the winner). |

### ScoreSidePatch

The changed part of a ScoreSide.

| Field | Type | Description |
| --- | --- | --- |
| `current` (optional) | `number \| null \| null` | The score as a scoreboard shows it: goals, points, sets won (tennis / volleyball), runs (cricket, baseball), extra time / overtime included. A penalty shoot-out is NOT included — it is in `penalties` — except in ice hockey, whose scoring credits the shoot-out winner with one goal (3-3 after overtime → 3-4). Null before the start, and on a fixture whose coverage was canceled. |
| `normalTime` (optional) | `number \| null \| null` | Score at the end of regulation time, when the source gives it. |
| `penalties` (optional) | `number \| null \| null` | Penalty shoot-out score (goals scored in the shoot-out). Ice hockey: 1 for the shoot-out winner and 0 for the loser — the goal `current` credits. |
| `aggregated` (optional) | `number \| null \| null` | Aggregate over a two-legged tie. |
| `series` (optional) | `number \| null \| null` | Playoff series: games won in the series so far (basketball, baseball, ice hockey, water polo). |
| `point` (optional) | `string \| null \| null` | Tennis: the current game score, "0" \| "15" \| "30" \| "40" \| "A" (tie-break points as numbers, "0"–"N"). Null unless play is in progress or interrupted. |
| `redCards` (optional) | `integer \| null \| null` | Football: red cards shown to the side (second yellows included). |
| `hits` (optional) | `integer \| null \| null` | Baseball: hits (the H of the R/H/E line). |
| `errors` (optional) | `integer \| null \| null` | Baseball: errors (the E of the R/H/E line). |
| `periods` (optional) | `Record<PeriodKey, number \| null>` | Only the periods that changed; null = the period was removed upstream (delete it). |
| `tieBreaks` (optional) | `Record<PeriodKey, number \| null>` | Only the tie-breaks that changed; null = removed. |
| `innings` (optional) | `Record<PeriodKey, CricketInnings>` | Only the innings that changed; merge key by key (like periods) — an innings not named is unchanged. |

### TeamRef

A team as referenced from any other object (fixtures, standings, players, leaders).

| Field | Type | Description |
| --- | --- | --- |
| `id` | `integer` | Our team id. |
| `name` | `string` | Team name. In individual sports (tennis, table tennis, darts, MMA, …) a competitor is a team too: the player, or the pair in doubles. |
| `slug` | `string \| null \| null` | URL slug. |
| `shortName` | `string \| null \| null` | Short display name, when the source has one. |
| `code` | `string \| null \| null` | Scoreboard abbreviation, 1–4 characters (e.g. "ARS", "LA"); synthetic in individual sports. |
| `image` | `string (URL) \| null \| null` | Logo on our CDN; null when the team has no image. |

### TeamDetail

A team profile.

| Field | Type | Description |
| --- | --- | --- |
| `id` | `integer` | Our team id. |
| `name` | `string` | Team name. In individual sports (tennis, table tennis, darts, MMA, …) a competitor is a team too: the player, or the pair in doubles. |
| `slug` | `string \| null \| null` | URL slug. |
| `shortName` | `string \| null \| null` | Short display name, when the source has one. |
| `code` | `string \| null \| null` | Scoreboard abbreviation, 1–4 characters (e.g. "ARS", "LA"); synthetic in individual sports. |
| `image` | `string (URL) \| null \| null` | Logo on our CDN; null when the team has no image. |
| `sport` | `string \| null \| null` | Sport slug. |
| `country` | `Country \| null \| null` | Country the team represents / is based in. |
| `venue` | `Venue \| null \| null` | Home venue. |
| `colors` | `{ primary: string \| null; secondary: string \| null; text: string \| null } \| null \| null` | Kit colours as #rrggbb; null when the source has none of its own (it sends a placeholder blue for most minor teams and every individual competitor). |
| `gender` | `TeamGender \| null \| null` | Men’s, women’s or mixed; null when the source does not say. |
| `national` | `boolean \| null \| null` | True for a national side, false for a club; null when the source does not say. |
| `kind` | `TeamKind \| null \| null` | A team, one competitor of an individual sport, or a doubles pair; null when the source does not say. |
| `manager` | `ManagerRef \| null \| null` | The current manager / head coach, when the source names one. |
| `person` | `Person \| null \| null` | Individual competitors: date of birth, height, weight, … where the source profiles them (tennis, MMA); null otherwise. |
| `record` | `FighterRecord \| null \| null` | MMA / boxing fighters: the career win-draw-loss record and the last fights’ methods; null for everyone else. |

### Person

The person behind an individual competitor (`kind: individual`), where the source profiles one (tennis players, MMA fighters). Same names and units as Player.

| Field | Type | Description |
| --- | --- | --- |
| `dateOfBirth` | `string (YYYY-MM-DD) \| null \| null` | Date of birth. |
| `heightCm` | `integer \| null \| null` | Height. Unit: cm. |
| `weightKg` | `number \| null \| null` | Weight in kilograms (MMA: the fighter’s listed weight). |
| `reachCm` | `integer \| null \| null` | Reach (MMA). Unit: cm. |
| `nickname` | `string \| null \| null` | Ring name / nickname (MMA), e.g. "Storm". |
| `weightClass` | `string \| null \| null` | Weight class as the source names it (MMA: "feather", "light", "bantam", …). |
| `birthplace` | `string \| null \| null` | Where they were born, as the source writes it ("San Candido, Italy"). |
| `residence` | `string \| null \| null` | Where they live, as the source writes it ("Monte Carlo, Monaco"). |
| `handedness` | `Handedness \| null \| null` | Tennis: the playing hand. |
| `turnedPro` | `integer \| null \| null` | Tennis: the year they turned professional. |
| `prizeMoneySeason` | `Money \| null \| null` | Tennis: prize money won this season. |
| `prizeMoneyCareer` | `Money \| null \| null` | Tennis: career prize money. |

### LeagueRef

A league / competition (also the shape of /v2/leagues/{id} and of every league list).

| Field | Type | Description |
| --- | --- | --- |
| `id` | `integer` | Our league id. |
| `name` | `string` | League / competition name. |
| `slug` | `string \| null \| null` | URL slug. |
| `sport` | `string \| null \| null` | Sport slug (as in /v2/sports). |
| `category` | `string \| null \| null` | The source’s grouping of the league: a country ("England"), a region ("International", "North America", "World"), a tour ("ATP", "WTA") or a game (esports: "Counter Strike"). Not always a country — see `country`. |
| `country` | `Country \| null \| null` | The league’s country, when its category is one; null for regions, tours and games. |
| `image` | `string (URL) \| null \| null` | Logo on our CDN; null when the league has no image. |

### Country

A country.

| Field | Type | Description |
| --- | --- | --- |
| `code` | `string \| null \| null` | Two-letter code as the source gives it (ISO 3166-1 alpha-2, except the UK home nations: EN England, SX Scotland, WA Wales, NI Northern Ireland). Null when unknown. |
| `name` | `string` | English country name. |

### Season

A season of a league.

| Field | Type | Description |
| --- | --- | --- |
| `id` | `integer` | Our season id. |
| `name` | `string \| null \| null` | Season name, e.g. "Premier League 26/27". |
| `year` | `string \| null \| null` | Season label as the source writes it, for display: "26/27" or "2026/2027" for a season across two years, "2026" for a calendar-year one. Sort and filter by startYear / endYear. |
| `startYear` | `integer \| null \| null` | The year the season starts (2026 for "26/27" and for "2026"); null when the label cannot be read. |
| `endYear` | `integer \| null \| null` | The year the season ends (2027 for "26/27"; the same as startYear for a calendar-year season); null when the label cannot be read. |

### Round

A round of a league season.

| Field | Type | Description |
| --- | --- | --- |
| `number` | `integer` | The source’s round number. An opaque key, not a sequence: cups use the number of remaining entrants (tennis "Round of 64" = 32) and playoff rounds large numbers (636). Pass it to /v2/leagues/{id}/fixtures. Some competitions are not organized in rounds at the source (NBA and NHL regular seasons, NCAA, single tennis / MMA events): a fixture there may still carry a round, while /rounds is empty and the round filter returns no fixtures — list them by date instead. |
| `name` | `string \| null \| null` | Round name, when the round has one ("Quarterfinals", "Playoff round"). |
| `slug` | `string \| null \| null` | Disambiguates rounds that reuse a number across phases; pass it to /fixtures when set. |
| `prefix` | `string \| null \| null` | Second disambiguator (e.g. "Qualification"); pass it to /fixtures together with slug. |

### Rounds

The rounds of a season and the current one. Empty (`current: null`, `rounds: []`) for a competition the source does not organize in rounds — see Round.number.

| Field | Type | Description |
| --- | --- | --- |
| `current` | `Round \| null \| null` |  |
| `rounds` | `Round[]` |  |

### Venue

Where a fixture is played or a team plays its home games.

| Field | Type | Description |
| --- | --- | --- |
| `id` | `integer \| null \| null` | Our venue id; null when the source gives the venue without one. |
| `name` | `string \| null \| null` | Stadium / arena name. |
| `city` | `string \| null \| null` | City. |
| `country` | `Country \| null \| null` | Country of the venue. |
| `capacity` | `integer \| null \| null` | Seating capacity. |

### PlayerRef

A player as referenced from any other object.

| Field | Type | Description |
| --- | --- | --- |
| `id` | `integer` | Our player id. |
| `name` | `string` | Player name. |
| `slug` | `string \| null \| null` | URL slug. |
| `shortName` | `string \| null \| null` | Short display name, e.g. "B. Saka", when the source has one. |
| `image` | `string (URL) \| null \| null` | Photo on our CDN; null when the player has no image. |

### ManagerRef

A team’s manager (head coach) as referenced from another object.

| Field | Type | Description |
| --- | --- | --- |
| `id` | `integer` | Our manager id. |
| `name` | `string` | Manager / head coach name. |
| `slug` | `string \| null \| null` | URL slug. |
| `shortName` | `string \| null \| null` | Short name, e.g. "F. Hurzeler". |
| `image` | `string (URL) \| null \| null` | Photo on our CDN; null when the manager has no image (or it is not uploaded yet). Since 2026-11-04. |

### Player

A player profile.

| Field | Type | Description |
| --- | --- | --- |
| `id` | `integer` | Our player id. |
| `name` | `string` | Full name. |
| `slug` | `string \| null \| null` | URL slug. |
| `shortName` | `string \| null \| null` | Short name, e.g. "B. Saka". |
| `position` | `Position \| null \| null` | Main position. |
| `positionCode` | `string \| null \| null` | The source’s position code. |
| `jerseyNumber` | `string \| null \| null` | Shirt number (a string: "0" and "00" are real numbers in basketball and American football); null when unknown — rugby squads list "0" as a placeholder, which is dropped. |
| `heightCm` | `integer \| null \| null` | Height. Unit: cm. |
| `preferredFoot` | `"left" \| "right" \| "both" \| null \| null` | Football: left, right or both. |
| `dateOfBirth` | `string (YYYY-MM-DD) \| null \| null` | Date of birth. |
| `country` | `Country \| null \| null` | Nationality. |
| `marketValue` | `Money \| null \| null` | Estimated transfer market value; null when unknown. |
| `contractUntil` | `string (YYYY-MM-DD) \| null \| null` | Contract end; null when unknown. |
| `image` | `string (URL) \| null \| null` | Photo on our CDN. |
| `injury` | `Injury \| null \| null` | The current injury, when the source lists one (football, mostly covered leagues); null = none listed. |
| `detailedPositions` | `DetailedPosition[]` | Football: the detailed positions the player plays, main one first (e.g. ["striker"], ["rightWinger", "attackingMidfielder"]); [] where the source has none (other sports, minor leagues). `position` stays the broad line. |
| `team` | `TeamRef \| null \| null` | Current team. |

### Injury

A player’s current injury.

| Field | Type | Description |
| --- | --- | --- |
| `description` | `string \| null \| null` | The injury, e.g. "Hamstring Injury". |
| `status` | `InjuryStatus \| null \| null` | Out, day to day, … |
| `since` | `string (YYYY-MM-DD) \| null \| null` | When it started (UTC day). |
| `expectedReturn` | `string (YYYY-MM-DD) \| null \| null` | Expected return (UTC day), when the source estimates one. |
| `updatedAt` | `string (ISO-8601 UTC) \| null \| null` | When the source last updated it. |

### SquadPlayer

A squad member: a Player without `team` (it is the squad’s team).

| Field | Type | Description |
| --- | --- | --- |
| `id` | `integer` | Our player id. |
| `name` | `string` | Full name. |
| `slug` | `string \| null \| null` | URL slug. |
| `shortName` | `string \| null \| null` | Short name, e.g. "B. Saka". |
| `position` | `Position \| null \| null` | Main position. |
| `positionCode` | `string \| null \| null` | The source’s position code. |
| `jerseyNumber` | `string \| null \| null` | Shirt number (a string: "0" and "00" are real numbers in basketball and American football); null when unknown — rugby squads list "0" as a placeholder, which is dropped. |
| `heightCm` | `integer \| null \| null` | Height. Unit: cm. |
| `preferredFoot` | `"left" \| "right" \| "both" \| null \| null` | Football: left, right or both. |
| `dateOfBirth` | `string (YYYY-MM-DD) \| null \| null` | Date of birth. |
| `country` | `Country \| null \| null` | Nationality. |
| `marketValue` | `Money \| null \| null` | Estimated transfer market value; null when unknown. |
| `contractUntil` | `string (YYYY-MM-DD) \| null \| null` | Contract end; null when unknown. |
| `image` | `string (URL) \| null \| null` | Photo on our CDN. |
| `injury` | `Injury \| null \| null` | The current injury, when the source lists one (football, mostly covered leagues); null = none listed. |
| `detailedPositions` | `DetailedPosition[]` | Football: the detailed positions the player plays, main one first (e.g. ["striker"], ["rightWinger", "attackingMidfielder"]); [] where the source has none (other sports, minor leagues). `position` stays the broad line. |

### Transfer

One move of a player between teams — a transfer, a loan, a signing, a trade, a release, … No id: a move is identified by player + type + date.

| Field | Type | Description |
| --- | --- | --- |
| `player` | `PlayerRef` | The player who moved. |
| `type` | `TransferType` | What kind of move a transfer is. |
| `date` | `string (YYYY-MM-DD) \| null \| null` | When it took effect (UTC day); null when the source has no date. |
| `from` | `TeamRef \| null \| null` | The team he left; null for a free agent, or a side the source does not list as a team (see `fromName`). |
| `fromName` | `string \| null \| null` | The source’s name of the team he left — set even when `from` is null (e.g. "Bryne FK Yth."). |
| `to` | `TeamRef \| null \| null` | The team he joined; null when waived, released or retired, or a side the source does not list (see `toName`). |
| `toName` | `string \| null \| null` | The source’s name of the team he joined, as for `fromName`. |
| `fee` | `Money \| null \| null` | The fee, when the source states one; null for a free, undisclosed or unknown fee and for every non-transfer move. |
| `freeTransfer` | `boolean` | True when the source records the move as free (no fee was paid). |
| `draft` | `{ round: integer \| null; pick: integer \| null } \| null \| null` | type draft: the round and pick, when listed; null otherwise. |

### TeamTransfers

A team’s recent moves in and out, as the source lists them (about the last year).

| Field | Type | Description |
| --- | --- | --- |
| `arrivals` | `Transfer[]` | Moves INTO the team, newest first. |
| `departures` | `Transfer[]` | Moves OUT of the team, newest first. |

### Money

An amount of money.

| Field | Type | Description |
| --- | --- | --- |
| `amount` | `number` | Amount in `currency` units. |
| `currency` | `string` | ISO 4217 currency code, e.g. "EUR". |

### Lineups

Lineups of both sides.

| Field | Type | Description |
| --- | --- | --- |
| `confirmed` | `boolean` | True once the official lineups are out (false = predicted / not yet published). |
| `home` | `TeamLineup` | One side’s lineup. |
| `away` | `TeamLineup` | One side’s lineup. |

### TeamLineup

One side’s lineup.

| Field | Type | Description |
| --- | --- | --- |
| `formation` | `string \| null \| null` | Formation, e.g. "4-2-3-1" (football). |
| `players` | `LineupPlayer[]` |  |
| `missing` | `MissingPlayer[]` |  |

### LineupPlayer

One player of a lineup.

| Field | Type | Description |
| --- | --- | --- |
| `player` | `PlayerRef \| null \| null` | The player. |
| `position` | `Position \| null \| null` | Position in this lineup. |
| `positionCode` | `string \| null \| null` | The source’s position code, as a lineup card prints it ("G", "LW", "QB", "1B"). |
| `jerseyNumber` | `string \| null \| null` | Shirt number — a string ("00" exists). |
| `substitute` | `boolean` | On the bench at the start. |
| `captain` | `boolean` | Team captain. |
| `rating` | `number \| null \| null` | Match rating (e.g. 7.4), rounded to 2 decimals; null when the player has none. |
| `avgRating` | `number \| null \| null` | Football: the player’s average match rating this season, rounded to 2 decimals, when the source lists it with the lineup (usually before and around kick-off). |
| `ratingVersions` | `{ original: number \| null; alternative: number \| null } \| null \| null` | Football: the original rating and the source’s alternative model’s rating. |
| `star` | `1 \| 2 \| 3 \| null \| null` | Ice hockey: the game’s first, second or third star. |
| `battingOrder` | `integer \| null \| null` | Baseball: place in the batting order. |
| `statistics` | `Record<string, number> \| null \| null` | Per-player match statistics, sport-specific camelCase keys in the same vocabulary as the team statistics — a key that counts the same quantity as a team StatItem has the team key (football minutesPlayed, passes, accuratePasses, shotsOnGoal, expectedGoals …; basketball points, fieldGoalsMade, fieldGoalsAttempted, secondsPlayed …; ice hockey goals, shotsOnGoal, penalties, plusMinus, savePercentage …). Every …Percentage is a 0–100 share (ice-hockey save percentages included: 94.1, not 0.941). Seconds where the key says so. Null when the player has none. |

### MissingPlayer

A player missing a fixture.

| Field | Type | Description |
| --- | --- | --- |
| `player` | `PlayerRef \| null \| null` | The player. |
| `availability` | `Availability \| null \| null` | Ruled out or doubtful. |
| `reason` | `MissingReason \| null \| null` | Why. |
| `description` | `string \| null \| null` | The source’s detail, e.g. "Hamstring Injury", "Red card suspension". |
| `expectedReturnAt` | `string (ISO-8601 UTC) \| null \| null` | Expected return, when known. |

### Statistics

Match statistics, per period.

| Field | Type | Description |
| --- | --- | --- |
| `periods` | `({ period: "all" \| PeriodKey; groups: StatGroup[] })[]` | One entry per period the source has statistics for, "all" first. |

### StatGroup

A group of statistics.

| Field | Type | Description |
| --- | --- | --- |
| `key` | `string` | Stable group key from a table per sport (not derived from the display name), e.g. "matchOverview", "attack", "other". |
| `name` | `string \| null \| null` | Group display name, e.g. "Match overview". |
| `items` | `StatItem[]` |  |

### StatItem

One match statistic for both sides.

| Field | Type | Description |
| --- | --- | --- |
| `key` | `string` | Stable camelCase key; the same key always means the same quantity, in every sport and in lineup player statistics (it can appear in two groups). A ratio key names the success its `value` counts (`aerialDuelsWon`, `fieldGoalsMade`, `accurateCrosses`, `firstServesIn`, `powerPlayConversion`) — never `…Percentage`; `…Percentage` is a `value` that is itself a 0–100 share (`duelsWonPercentage`, `corsiPercentage`). `blocks` = attempts this side blocked, `shotsBlocked` = this side’s own shots that were blocked. Catalogue per sport in the data dictionary. |
| `name` | `string \| null \| null` | The source’s English display name. |
| `kind` | `StatKind` | How to read a statistic’s value and total. |
| `higherIs` | `HigherIs \| null \| null` | Whether more is better — use it to highlight the leading side. |
| `home` | `StatSide` | One side of a statistic. |
| `away` | `StatSide` | One side of a statistic. |

### StatSide

One side of a statistic.

| Field | Type | Description |
| --- | --- | --- |
| `display` | `string \| null \| null` | What to print, e.g. "57%", "33/53 (62%)", "1:22". |
| `value` | `number \| null \| null` | The number behind it — see the item’s `kind`. |
| `total` | `number \| null \| null` | kind ratio: attempts; kind time: seconds available; null otherwise. |

### Incident

A match event. Lists are oldest first (chronological), like every timeline list.

| Field | Type | Description |
| --- | --- | --- |
| `type` | `IncidentType` | What happened. |
| `detail` | `IncidentDetail \| null \| null` | Kind within the type; null for period and injuryTime rows. |
| `side` | `Side \| null \| null` | The side the incident counts for (an own goal counts for the side credited with it); null for period / injuryTime rows. |
| `minute` | `integer \| null \| null` | Match minute. Null off the clock: before kick-off, at half-time, after full time, on the bench, in a shoot-out. Unit: minutes. |
| `addedMinute` | `integer \| null \| null` | Minutes into added time (90+3 → minute 90, addedMinute 3). injuryTime rows: the minutes announced. Unit: minutes. |
| `second` | `integer \| null \| null` | Match clock in seconds, when the source gives it: on every row in ice hockey, basketball, handball and rugby; football only on period rows. Unit: seconds. |
| `period` | `PeriodKey \| null \| null` | The period it happened in. Period rows: the period that ended (football FT → period2, basketball FT → period4, ET → extra2, PEN → penalties). Other rows: the period between the period rows around it (the source’s own value when it gives one); shoot-out kicks: penalties. Null only when it cannot be told (no period row yet and the sport’s period length unknown). |
| `player` | `PlayerRef \| null \| null` | The player: scorer, booked player, penalised player, VAR subject, shoot-out taker. |
| `playerName` | `string \| null \| null` | The player’s name — also set when the source gives a name but no player record (some own goals). |
| `assists` | `PlayerRef[]` | Goal assists in order (ice hockey has up to two). |
| `playerIn` | `PlayerRef \| null \| null` | substitution: the player coming on. |
| `playerOut` | `PlayerRef \| null \| null` | substitution: the player going off. |
| `drawnBy` | `PlayerRef \| null \| null` | suspension (ice hockey): the player who drew the penalty. |
| `homeScore` | `number \| null \| null` | Running home score after the incident (goals, period rows, shoot-out kicks). Set sports’ period rows (volleyball, table tennis, badminton): sets won so far — the set’s own points are in the fixture’s `periods` and in /points. |
| `awayScore` | `number \| null \| null` | Running away score after the incident (sets won on set sports’ period rows). |
| `text` | `string \| null \| null` | period rows: the scoreboard label ("HT", "FT", "Q4", "3rd period", "Overtime", "PEN"). Display only. |
| `reason` | `string \| null \| null` | card: the reason ("Foul", "Violent conduct"); suspension: the infraction ("Holding"); missed penalty: how ("Goalkeeper save", "Off target"). |
| `rescinded` | `boolean \| null \| null` | card: the card was rescinded later. |
| `confirmed` | `boolean \| null \| null` | varDecision: true = the original decision stood. |
| `shootoutSequence` | `integer \| null \| null` | shootoutPenalty: overall kick order, both sides counted (1 = the first kick of the shoot-out). |
| `shootoutRound` | `integer \| null \| null` | shootoutPenalty: the round — the taker’s side’s 1st, 2nd, … kick. |
| `durationSeconds` | `integer \| null \| null` | suspension: length of the exclusion. Unit: seconds. |
| `buildUp` | `BuildUpStep[]` | football goal: the passes and shots that led to it, in order, the goal last (covered leagues; empty otherwise and for every other incident). |

### KeyedIncident

An incident with its stable key (events frames).

| Field | Type | Description |
| --- | --- | --- |
| `key` | `string` | Stable key of the incident within its fixture: `type:side:minute:addedMinute` ("goal:home:34:0", "-" for a null side or minute), with `#2`, `#3` for further incidents in the same slot, in list order. Not the player: a corrected scorer or goal type keeps the key (an update). A corrected minute is a new key (the old one is removed). |
| `incident` | `Incident` | A match event. Lists are oldest first (chronological), like every timeline list. |

### IncidentChanges

What an events frame changed against the previous one.

| Field | Type | Description |
| --- | --- | --- |
| `added` | `string[]` | Keys of incidents that are new since the previous events frame (or since the copy the server held). |
| `updated` | `string[]` | Keys of incidents whose content changed (scorer, assist, build-up, card rescinded, …). |
| `removed` | `KeyedIncident[]` | Incidents the source no longer lists, with their last content — e.g. a goal chalked off by VAR (the score goes back in a delta; the goal is removed here once REST confirms it). |

### BuildUpStep

One action of a goal’s build-up, as the source maps it (football, covered leagues).

| Field | Type | Description |
| --- | --- | --- |
| `action` | `BuildUpAction` | What one step of a goal’s build-up was. |
| `side` | `Side \| null \| null` | The side of the player who made it (an own goal’s last step is the defending side). |
| `player` | `PlayerRef \| null \| null` | Who made it. |
| `minute` | `integer \| null \| null` | Match minute. Unit: minutes. |
| `position` | `PitchSpot \| null \| null` | Where the action started. |
| `endPosition` | `PitchSpot \| null \| null` | pass / cross: where the ball went; null otherwise. |
| `assist` | `boolean` | The pass credited as the assist. |
| `bodyPart` | `BodyPart \| null \| null` | goal: what it was struck with. |
| `expectedGoals` | `number \| null \| null` | goal / savedShot: expected goals of the chance, 0–1, when the source has it. |
| `expectedGoalsOnTarget` | `number \| null \| null` | goal / savedShot: expected goals on target (xGOT), when it has it. |
| `goalMouthLocation` | `GoalMouthLocation \| null \| null` | goal: zone of the goal mouth. |

### PitchSpot

A spot on a football pitch.

| Field | Type | Description |
| --- | --- | --- |
| `x` | `number` | Along the pitch, 0–100 in the SCORING side’s direction of attack (100 = the goal the goal went into, own goals included). Away goals come rotated from the source’s frame, where the home side always attacks towards 100 (fixed 2026-10-23). Unit: percent. |
| `y` | `number` | Across the pitch, 0–100, rotated with x (the scoring side’s view). Unit: percent. |

### H2H

Head-to-head record of the two teams (the endpoint returns null when they have none).

| Field | Type | Description |
| --- | --- | --- |
| `homeWins` | `integer` | Wins of this fixture’s home team in their meetings. |
| `awayWins` | `integer` | Wins of this fixture’s away team. |
| `draws` | `integer` | Draws. |
| `managerDuel` | `ManagerDuel \| null \| null` | The managers’ own record against each other (football and other sports with managers); null when they never met or the source has none. |

### ManagerDuel

Head-to-head record of the two managers, across every team they managed.

| Field | Type | Description |
| --- | --- | --- |
| `homeManager` | `ManagerRef \| null \| null` | The home team’s manager for this fixture. |
| `awayManager` | `ManagerRef \| null \| null` | The away team’s manager. |
| `homeWins` | `integer` | Wins of the home manager’s teams against the away manager’s. |
| `awayWins` | `integer` | Wins of the away manager’s teams. |
| `draws` | `integer` | Draws. |

### PregameForm

Both sides’ form before a fixture. A side is null when the source has none.

| Field | Type | Description |
| --- | --- | --- |
| `home` | `TeamForm \| null \| null` |  |
| `away` | `TeamForm \| null \| null` |  |

### TeamForm

One side’s form going into a fixture.

| Field | Type | Description |
| --- | --- | --- |
| `results` | `FormResult[]` | The side’s last results in this competition before this fixture (up to five), oldest first, most recent last. |
| `position` | `integer \| null \| null` | League position going into the fixture. |
| `points` | `integer \| null \| null` | Table points going into the fixture, where the competition’s table counts points (football, ice hockey, handball, rugby, …); else null. |
| `wins` | `integer \| null \| null` | Wins going into the fixture, where the table counts wins and losses instead of points (basketball, baseball: W-L; MMA: W-D-L); else null. MMA: the source’s figure for the event’s competition (Volkanovski 8-0-3 before UFC 333, while his career record is 28-0-4) — NOT the career record, which is TeamDetail.record on /v2/teams/{id}. |
| `draws` | `integer \| null \| null` | Draws, where the record has them (MMA W-D-L); else null. |
| `losses` | `integer \| null \| null` | Losses, with `wins`; else null. |
| `avgRating` | `number \| null \| null` | The side’s average player rating over its recent matches, rounded to 2 decimals. |

### Streaks

Team streaks before a fixture.

| Field | Type | Description |
| --- | --- | --- |
| `general` | `Streak[]` | Each side’s streaks over its recent matches in all competitions, up to this fixture (a finished fixture still shows the streaks it was played with). |
| `headToHead` | `Streak[]` | Streaks over the two sides’ meetings. |

### Streak

A team streak worth a headline before a fixture.

| Field | Type | Description |
| --- | --- | --- |
| `name` | `string` | The streak in English, e.g. "Wins", "No losses", "More than 2.5 goals". Display text — the source has no stable key for it. |
| `kind` | `StreakKind` | What a streak’s figure is: a run in a row, x of the last y, or an average. |
| `value` | `string` | As the source prints it: "5" (five in a row), "7/8" (seven of the last eight) or "83" (an average). |
| `count` | `integer \| null \| null` | The number of matches the streak holds for (the 5 of "5", the 7 of "7/8"); null for an average. |
| `outOf` | `integer \| null \| null` | For an "x of the last y" streak: y; null for a run in a row and for an average. |
| `average` | `number \| null \| null` | kind average: the figure (83 points a game); else null. |
| `side` | `StreakSide` | Whose streak it is. |
| `continued` | `boolean \| null \| null` | Whether the streak is still running. |

### BestPlayers

The best performers of each side.

| Field | Type | Description |
| --- | --- | --- |
| `playerOfTheMatch` | `BestPlayer \| null \| null` | Player of the match, where the sport has one. |
| `home` | `BestPlayer[]` |  |
| `away` | `BestPlayer[]` |  |

### BestPlayer

A top performer of the match.

| Field | Type | Description |
| --- | --- | --- |
| `player` | `PlayerRef \| null \| null` | The player. |
| `value` | `number \| null \| null` | The ranking value (a rating, points, goals, yards). |
| `label` | `BestPlayerLabel \| null \| null` | What `value` is. |
| `statistics` | `Record<string, number> \| null \| null` | Basketball: the player’s line, in the lineup-statistics vocabulary (points, rebounds, assists, steals, blocks, rating). Null in sports whose source lists none. |

### Momentum

Momentum graph: per minute (football, basketball, handball, ice hockey, …) or per game (tennis).

| Field | Type | Description |
| --- | --- | --- |
| `points` | `{ minute: number; value: number }[]` | One point per minute. |
| `periodLengthMinutes` | `number \| null \| null` | Regulation length of one period (football 45, basketball 10, ice hockey 20). Unit: minutes. |
| `periodCount` | `integer \| null \| null` | Regulation periods. |
| `overtimeLengthMinutes` | `number \| null \| null` | Length of one overtime period. Unit: minutes. |
| `overtimeCount` | `integer \| null \| null` | Overtime periods played, when the source says. |
| `games` | `{ period: PeriodKey; game: integer; value: number; breakOfServe: boolean }[]` | Tennis: one value per game, in order (the minute points are empty). Empty for other sports. |

### Shot

One shot (football, ice hockey, basketball field goals). Lists are oldest first (chronological; shoot-out kicks last, in kick order) — except basketball, where the source gives no time: home shots then away shots, in the source’s order, with only side, outcome and position set.

| Field | Type | Description |
| --- | --- | --- |
| `side` | `Side \| null \| null` | The shooting side. |
| `player` | `PlayerRef \| null \| null` | The shooter. |
| `goalkeeper` | `PlayerRef \| null \| null` | Football: the goalkeeper faced. |
| `outcome` | `ShotOutcome \| null \| null` | What came of it. |
| `technique` | `ShotTechnique \| null \| null` | Ice hockey: the shot type. |
| `goalType` | `ShotGoalType \| null \| null` | For goals: regular, ownGoal or penalty. |
| `situation` | `ShotSituation \| null \| null` | Football: the play it came from. |
| `bodyPart` | `BodyPart \| null \| null` | Football: what it was struck with. |
| `strength` | `ShotStrength \| null \| null` | Ice hockey: manpower situation. |
| `expectedGoals` | `number \| null \| null` | Expected goals (xG) of the chance, 0–1. |
| `expectedGoalsOnTarget` | `number \| null \| null` | Football: expected goals on target (xGOT, post-shot), when on target. |
| `minute` | `integer \| null \| null` | Match minute. Unit: minutes. |
| `addedMinute` | `integer \| null \| null` | Minutes into added time. Unit: minutes. |
| `second` | `integer \| null \| null` | Match clock in seconds. Unit: seconds. |
| `period` | `PeriodKey \| null \| null` | The period. Football: read from the minute (45+2 → period1, 92 → extra1; shoot-out kicks: penalties); basketball: null (no time). |
| `position` | `Point \| null \| null` | Shot origin. Football: 0–100 pitch percentages, x from the goal line being attacked, y across the pitch. Ice hockey: rink units as the source gives them (x ≈ 0–240 along the rink — each side attacks one end, y 0–100 across). Basketball: tenths of a foot from the basket attacked — x across the court (−250…250, sidelines), y out from the basket (0 at the rim; the NBA three-point arc is 237.5). |
| `goalMouth` | `Point \| null \| null` | Football: where it crossed the goal line (y across the mouth 0–100, z height). |
| `goalMouthLocation` | `GoalMouthLocation \| null \| null` | Football: zone of the goal mouth (or near miss). |
| `blockPosition` | `Point \| null \| null` | Football: where a blocked / saved shot was stopped. |
| `shootoutSequence` | `integer \| null \| null` | Football shoot-out kicks: overall kick order, both sides counted (as on the shoot-out incidents). |
| `shootoutRound` | `integer \| null \| null` | Football shoot-out kicks: the round — the shooting side’s 1st, 2nd, … kick. |

### Point

A coordinate (see Shot for the system per sport).

| Field | Type | Description |
| --- | --- | --- |
| `x` | `number \| null \| null` |  |
| `y` | `number \| null \| null` |  |
| `z` | `number \| null \| null` |  |

### Heatmap

Where one player was active during a fixture (football, covered leagues).

| Field | Type | Description |
| --- | --- | --- |
| `points` | `HeatPoint[]` | Every sample; render them as a density. Empty (200, not 404) when the source has no heatmap for the player in this fixture — also for sports that never have one (only football is covered). |

### HeatPoint

One touch / position sample of a heatmap.

| Field | Type | Description |
| --- | --- | --- |
| `x` | `number` | Along the pitch, 0–100, in the player’s direction of attack (100 = the goal attacked). Unit: percent. |
| `y` | `number` | Across the pitch, 0–100. Unit: percent. |

### AveragePositions

Average positions of each side’s players (football, covered leagues).

| Field | Type | Description |
| --- | --- | --- |
| `home` | `AveragePosition[]` |  |
| `away` | `AveragePosition[]` |  |

### AveragePosition

A player’s average position in a fixture.

| Field | Type | Description |
| --- | --- | --- |
| `player` | `PlayerRef \| null \| null` | The player. |
| `jerseyNumber` | `string \| null \| null` | Shirt number. |
| `position` | `Position \| null \| null` | Playing position, as on lineups (from `positionCode`). |
| `positionCode` | `string \| null \| null` | The source’s position letter ("G", "D", "M", "F"). |
| `x` | `number \| null \| null` | Average position along the pitch, 0–100 in the team’s direction of attack. Unit: percent. |
| `y` | `number \| null \| null` | Average position across the pitch, 0–100. Unit: percent. |
| `pointsCount` | `integer \| null \| null` | How many position samples the average is over. |

### Points

A fixture point by point: tennis (sets → games → points), rally sports (sets → rallies), cricket (innings → overs → balls), baseball (at-bats), darts (sets → legs → visits).

| Field | Type | Description |
| --- | --- | --- |
| `format` | `PointsFormat \| null \| null` | Which of `sets` / `innings` / `atBats` / `darts` is filled; null when none is available yet — and for sports that never have point by point (200 with empty lists, not 404). |
| `sets` | `PointSet[]` | Tennis and rally sports: one entry per set, in order. |
| `innings` | `InningsBalls[]` | Cricket: one entry per innings, in order. |
| `atBats` | `AtBat[]` | Baseball: every plate appearance in order, oldest first. |
| `darts` | `DartsSet[]` | Darts: sets → legs → visits, in order. |

### PointSet

One set, point by point.

| Field | Type | Description |
| --- | --- | --- |
| `period` | `PeriodKey` | The set: period1, period2, … |
| `homeScore` | `integer \| null \| null` | Home games (tennis) or points (rally sports) in the set — the last score listed. A tennis match tie-break counts its points (10-8), as the fixture’s period score does. |
| `awayScore` | `integer \| null \| null` | Away games / points in the set. |
| `games` | `TennisGame[]` | Tennis: the games in order. Empty for rally sports. |
| `points` | `RallyPoint[]` | Rally sports: the rallies in order, as the source recorded them — lower-tier coverage can miss a rally (the running score shows the gap). Empty for tennis. |

### TennisGame

One game of a tennis set.

| Field | Type | Description |
| --- | --- | --- |
| `number` | `integer` | Game number in the set (13 = the tie-break; a match tie-break played instead of a deciding set is game 1 of that set, its points counted to 10). |
| `server` | `Side \| null \| null` | Who served. In a tie-break the source names the server of its LAST point, not its first (checked on real tie-breaks 2026-10-19). |
| `winner` | `Side \| null \| null` | Who won the game (winner ≠ server = a break of serve). A finished tie-break’s winner is read from its last point (the source’s game winner was wrong on 3 of 8 match tie-breaks checked 2026-10-19). |
| `homeGames` | `integer \| null \| null` | Home games in the set after this game. |
| `awayGames` | `integer \| null \| null` | Away games in the set after this game. |
| `points` | `TennisPoint[]` | The points in order. In a game that is over the last point is the one that won it (`winner` = the game’s winner); in a game still in play, the points so far. |

### TennisPoint

One point of a tennis game.

| Field | Type | Description |
| --- | --- | --- |
| `homeScore` | `string \| null \| null` | Home game score after the point: "0", "15", "30", "40", "A" (tie-break: points as numbers). Text because of "A". Null on the point that won a regular game — the game is over, there is no score after it. |
| `awayScore` | `string \| null \| null` | Away game score after the point (null as for `homeScore`). |
| `winner` | `Side \| null \| null` | Who won the point, read from the score change; null when it cannot be read. |
| `description` | `TennisPointDescription \| null \| null` | Ace or double fault; null for any other point, and on the appended game-winning point (the source does not list it, so an ace that won a game is not marked). |
| `homeType` | `TennisPointType \| null \| null` | What the point meant for the home side (won it, now has a break / set point, a tie-break mini-break). Null on the appended game-winning point. |
| `awayType` | `TennisPointType \| null \| null` | The same for the away side. |

### RallyPoint

One rally of a set (volleyball, table tennis, badminton).

| Field | Type | Description |
| --- | --- | --- |
| `winner` | `Side \| null \| null` | Who won the rally. |
| `homeScore` | `integer \| null \| null` | Home points in the set after the rally. |
| `awayScore` | `integer \| null \| null` | Away points in the set after the rally. |

### InningsBalls

One cricket innings, ball by ball.

| Field | Type | Description |
| --- | --- | --- |
| `inning` | `PeriodKey` | inning1, inning2, … — the same keys as ScoreSide.innings. |
| `battingSide` | `Side \| null \| null` | The side batting in this innings. |
| `overs` | `Over[]` | The overs in order. |

### Over

One over.

| Field | Type | Description |
| --- | --- | --- |
| `number` | `integer` | The over, counted from 1 (the first over is 1; in cricket notation the 3rd ball of over 46 is "45.3"). |
| `balls` | `Ball[]` | The deliveries in order. |

### Ball

One cricket delivery.

| Field | Type | Description |
| --- | --- | --- |
| `sequence` | `integer \| null \| null` | The source’s running delivery number in the match (orders deliveries across overs). |
| `ball` | `integer \| null \| null` | Delivery number within the over (extras push it past 6). |
| `outcome` | `BallOutcome` | What a cricket delivery produced. |
| `runs` | `integer \| null \| null` | Runs off the bat. |
| `totalRuns` | `integer \| null \| null` | Every run the delivery added, extras included. |
| `wicket` | `boolean` | A wicket fell on this delivery. |
| `dismissal` | `Dismissal \| null \| null` | How, when a wicket fell. |
| `batter` | `PlayerRef \| null \| null` | The batter on strike. |
| `bowler` | `PlayerRef \| null \| null` | The bowler. |
| `fielder` | `PlayerRef \| null \| null` | The fielder involved in a dismissal (catch, run-out, stumping). |
| `dismissedBatter` | `PlayerRef \| null \| null` | The batter out (not always the striker: run-outs). |
| `scoreRuns` | `integer \| null \| null` | The batting side’s total after the delivery. |
| `scoreWickets` | `integer \| null \| null` | Wickets down after the delivery. |

### AtBat

One baseball plate appearance. The source gives no outcome (hit, out, walk) for it.

| Field | Type | Description |
| --- | --- | --- |
| `inning` | `integer` | The inning (10, 11, … = extra innings). |
| `half` | `"top" \| "bottom"` | top: the away side bats; bottom: the home side bats. |
| `battingSide` | `Side` | The side batting (from the half). |
| `batter` | `PlayerRef \| null \| null` | The batter. |
| `pitcher` | `PlayerRef \| null \| null` | The pitcher. |
| `homeWinProbabilityBefore` | `number \| null \| null` | The SOURCE’s home win probability before the at-bat, 0–100 (not our model; no bookmaker odds). Unit: percent. |
| `homeWinProbabilityAfter` | `number \| null \| null` | The source’s home win probability after it, 0–100 (away = 100 − home). Unit: percent. |
| `at` | `string (ISO-8601 UTC) \| null \| null` | When it was recorded. |

### DartsSet

One darts set (a legs match has a single set).

| Field | Type | Description |
| --- | --- | --- |
| `number` | `integer` | Set number (1 for a legs match). |
| `winner` | `Side \| null \| null` | Who won the set; null in a legs match and while the set is in play. |
| `homeSets` | `integer \| null \| null` | Home sets won after this set; null in a legs match. |
| `awaySets` | `integer \| null \| null` | Away sets won after this set; null in a legs match. |
| `legs` | `DartsLeg[]` | The legs in order. |

### DartsLeg

One darts leg, visit by visit.

| Field | Type | Description |
| --- | --- | --- |
| `number` | `integer` | Leg number within the set (a legs match is one set). |
| `startScore` | `integer \| null \| null` | The score each player starts the leg from (501), as the source lists it. |
| `throwingFirst` | `Side \| null \| null` | Who threw first in the leg, as the source says (the throw alternates leg by leg). The visit list can start with the other player — seen once on a first leg. |
| `winner` | `Side \| null \| null` | Who won the leg; null while it is in play. |
| `homeLegs` | `integer \| null \| null` | Home legs won in the set after this leg. |
| `awayLegs` | `integer \| null \| null` | Away legs won in the set after this leg. |
| `checkout` | `integer \| null \| null` | The winning visit’s score (the checkout); null while in play, or when the last visit is not listed. |
| `visits` | `DartsVisit[]` | The visits in order. |

### DartsVisit

One darts visit (up to three darts). The source gives no darts-thrown count.

| Field | Type | Description |
| --- | --- | --- |
| `side` | `Side` | Who threw. |
| `scored` | `integer \| null \| null` | Points the visit scored: the thrower’s remaining score before − after. 0 = nothing scored or a bust (the source does not tell them apart). Null when the drop is not a possible visit (more than 180 — the source skipped a visit). |
| `homeRemaining` | `integer` | Home’s remaining score after the visit. |
| `awayRemaining` | `integer` | Away’s remaining score after the visit. |
| `checkout` | `boolean` | The visit won the leg (the thrower reached 0); its `scored` is the checkout. |

### Bases

Baseball: which bases are occupied.

| Field | Type | Description |
| --- | --- | --- |
| `first` | `boolean` | A runner is on first base. |
| `second` | `boolean` | A runner is on second base. |
| `third` | `boolean` | A runner is on third base. |

### InningState

Baseball: the game state in play — inning, half, count, outs, runners. The source gives no batter or pitcher with it (the current at-bat’s are in /points `atBats`). Its live feed re-sends the state about once a minute, not after every pitch, so the count can lag the game by up to a minute.

| Field | Type | Description |
| --- | --- | --- |
| `inning` | `integer` | The inning in play (10, 11, … = extra innings). |
| `half` | `"top" \| "bottom"` | top: the away side bats; bottom: the home side bats. |
| `battingSide` | `Side` | The side batting (from the half). |
| `balls` | `integer \| null \| null` | Balls in the current count. |
| `strikes` | `integer \| null \| null` | Strikes in the current count. |
| `outs` | `integer \| null \| null` | Outs in the half-inning (3 = the half just ended). |
| `bases` | `Bases` | Baseball: which bases are occupied. |

### Timeouts

Basketball: timeouts left per side, as the source tracks them.

| Field | Type | Description |
| --- | --- | --- |
| `homeRemaining` | `integer \| null \| null` | Timeouts the home side has left. |
| `awayRemaining` | `integer \| null \| null` | Timeouts the away side has left. |
| `perTeam` | `integer \| null \| null` | Timeouts each side has for the game (NBA: 7). |

### MatchFormat

How many sets / legs / games the match is played over, when the source says.

| Field | Type | Description |
| --- | --- | --- |
| `bestOfSets` | `integer \| null \| null` | Darts: sets in the match format ("best of 5 sets"); 1 = a legs match with no sets. |
| `bestOfLegs` | `integer \| null \| null` | Darts: legs per set when `bestOfSets` > 1, else legs in the match ("best of 7 legs"). |
| `bestOfGames` | `integer \| null \| null` | Esports: games (maps) in the series ("best of 3"). |

### Umpires

Baseball: the game’s umpire crew.

| Field | Type | Description |
| --- | --- | --- |
| `umpires` | `Umpire[]` | The crew, home plate first, as the source lists it; empty when it has none, and for other sports. |

### Umpire

One umpire of a baseball game.

| Field | Type | Description |
| --- | --- | --- |
| `name` | `string` | Full name as the source writes it. |
| `position` | `UmpirePosition` | Where the umpire works this game. |
| `experienceYears` | `integer \| null \| null` | Years of experience, as the source counts them. |

### Weather

Baseball: the weather at the ballpark (the source reports it for baseball only; other sports answer an empty list). Metric units — the source’s figures are converted from °F and mph (14.44 °C = 58 °F, 8.05 km/h = 5 mph). A roofed stadium reports the outside weather too.

| Field | Type | Description |
| --- | --- | --- |
| `observations` | `WeatherObservation[]` | Observations and forecasts, as the source lists them (observation first); empty when it has none, and for other sports. |

### WeatherObservation

The weather at a venue at one time.

| Field | Type | Description |
| --- | --- | --- |
| `at` | `string (ISO-8601 UTC) \| null \| null` | When it was observed (or, for a forecast, the time it was issued). |
| `forecast` | `boolean` | True for a forecast, false for an observation. |
| `condition` | `WeatherCondition` | The weather, grouped. |
| `description` | `string \| null \| null` | The source’s own words ("Overcast"). Display only. |
| `temperatureC` | `number \| null \| null` | Air temperature in °C. Unit: celsius. |
| `dewPointC` | `number \| null \| null` | Dew point in °C. Unit: celsius. |
| `humidityPercent` | `number \| null \| null` | Relative humidity, 0–100. Unit: percent. |
| `cloudCoverPercent` | `number \| null \| null` | Cloud cover, 0–100. Unit: percent. |
| `windSpeedKmh` | `number \| null \| null` | Wind speed in km/h. Unit: kilometersPerHour. |
| `windDirection` | `string \| null \| null` | Where the wind comes from, as a compass point ("SE", "SSE"). |

### EsportsGames

Esports: an esports fixture game by game — map, winner, score, lineups with K/D/A, bans, objectives.

| Field | Type | Description |
| --- | --- | --- |
| `games` | `EsportsGame[]` | The games in order; empty before the first game, and for other sports. |

### EsportsGame

One game (map) of an esports series.

| Field | Type | Description |
| --- | --- | --- |
| `number` | `integer` | Game number in the series (1, 2, …). |
| `status` | `"notstarted" \| "inprogress" \| "interrupted" \| "willcontinue" \| "postponed" \| "canceled" \| "finished"` | The game’s status type (finished, inprogress, notstarted, …). |
| `map` | `string \| null \| null` | The map ("Dust2"); null for titles with one map (League of Legends). |
| `startedAt` | `string (ISO-8601 UTC) \| null \| null` | When the game started. |
| `durationSeconds` | `integer \| null \| null` | Game length. Unit: seconds. |
| `winner` | `Side \| null \| null` | Who won the game; null until it is over. |
| `home` | `EsportsGameSide` | One side of one esports game. |
| `away` | `EsportsGameSide` | One side of one esports game. |

### EsportsGameSide

One side of one esports game.

| Field | Type | Description |
| --- | --- | --- |
| `score` | `number \| null \| null` | The side’s score in the game: rounds (Counter-Strike), kills (League of Legends, Dota 2). |
| `periods` | `Record<PeriodKey, number>` | Counter-Strike: rounds per half (period1, period2) and the overtime rounds together under `overtime`, so they add up to the game score. Empty when the source has none. |
| `players` | `EsportsGamePlayer[]` | The side’s players; empty when the source has no lineup. |
| `bans` | `EsportsCharacter[]` | Characters the side banned, in order; empty when none are listed. |
| `statistics` | `EsportsTeamStats \| null \| null` | Objectives; null when the source has none. |

### EsportsGamePlayer

One player’s line in one esports game. Each title fills its own fields and leaves the others null: League of Legends gold / creepScore / level; Dota 2 creepScore (last hits) / level / denies / netWorth / goldPerMinute / experiencePerMinute; Counter-Strike averageDamagePerRound / headshotKills / kastPercentage / killDeathDifference / firstKillDifference / flashAssists.

| Field | Type | Description |
| --- | --- | --- |
| `player` | `PlayerRef \| null \| null` | The player. |
| `role` | `EsportsRole` | The player’s role in this game. |
| `character` | `EsportsCharacter \| null \| null` | The champion / hero played. |
| `kills` | `integer \| null \| null` | Kills. |
| `deaths` | `integer \| null \| null` | Deaths. |
| `assists` | `integer \| null \| null` | Assists. |
| `gold` | `integer \| null \| null` | League of Legends: gold earned. |
| `creepScore` | `integer \| null \| null` | Creeps killed: minions and monsters (League of Legends), last hits (Dota 2). |
| `level` | `integer \| null \| null` | Champion / hero level at the end (League of Legends, Dota 2). |
| `denies` | `integer \| null \| null` | Dota 2: own creeps denied (last-hit by the player so the opponent gets no gold). |
| `netWorth` | `integer \| null \| null` | Dota 2: net worth at the end (gold held + items), in gold. |
| `goldPerMinute` | `number \| null \| null` | Dota 2: gold earned per minute of the game. |
| `experiencePerMinute` | `number \| null \| null` | Dota 2: experience earned per minute of the game. |
| `averageDamagePerRound` | `number \| null \| null` | Counter-Strike: average damage dealt per round (ADR), in hit points. |
| `headshotKills` | `integer \| null \| null` | Counter-Strike: kills made with a headshot (a count, at most `kills` — not a percentage). |
| `kastPercentage` | `number \| null \| null` | Counter-Strike: KAST — share of rounds in which the player got a kill or an assist, survived or was traded, 0–100. Unit: percent. |
| `killDeathDifference` | `integer \| null \| null` | Counter-Strike: kills − deaths (negative when the player died more). |
| `firstKillDifference` | `integer \| null \| null` | Counter-Strike: opening kills − opening deaths (the first kill of a round, for or against the player); the players of a map add up to 0. |
| `flashAssists` | `integer \| null \| null` | Counter-Strike: kills by a teammate on an opponent the player had flashed. |

### EsportsCharacter

A champion / hero / agent picked or banned.

| Field | Type | Description |
| --- | --- | --- |
| `name` | `string` | Name ("Viktor"). |
| `slug` | `string \| null \| null` | URL slug. |

### EsportsTeamStats

One side’s objectives in one game — League of Legends and Dota 2 (kills, towers; Dota 2 barracks and first blood); a field the title has not is null. Counter-Strike has none (null object).

| Field | Type | Description |
| --- | --- | --- |
| `kills` | `integer \| null \| null` | Kills. |
| `gold` | `integer \| null \| null` | Gold earned. |
| `towers` | `integer \| null \| null` | Enemy towers destroyed (Dota 2: the towers the opponent lost). |
| `inhibitors` | `integer \| null \| null` | Inhibitors destroyed. |
| `dragons` | `integer \| null \| null` | Dragons (drakes) slain, as the source counts them (`elderDragons` apart). |
| `elderDragons` | `integer \| null \| null` | Elder dragons slain. |
| `barons` | `integer \| null \| null` | Barons (Nashor) slain. |
| `heraldTaken` | `boolean \| null \| null` | Whether the side took the Rift Herald. |
| `barracks` | `integer \| null \| null` | Dota 2: enemy barracks destroyed (the barracks the opponent lost). |
| `firstBlood` | `boolean \| null \| null` | Dota 2: whether the side drew first blood (the game’s first kill). |

### Scorecard

A cricket fixture’s full scorecard. Other sports: 200 with `{ innings: [], current: null }`, not 404.

| Field | Type | Description |
| --- | --- | --- |
| `innings` | `ScorecardInnings[]` | The innings in match order; empty before the first ball and for other sports. |
| `current` | `CricketState \| null \| null` | The innings in play: striker, non-striker, bowler, over and ball. Null when no innings is in progress (not started, between innings, finished) and for other sports. |

### CricketState

Who is at the crease in a live innings — DERIVED by us from the ball-by-ball (the last ball’s batter, swapped on an odd number of runs run and at the end of an over; a wicket brings in the new batter), not the source’s own current-batsman field. Checked against the next ball on 3,000+ deliveries.

| Field | Type | Description |
| --- | --- | --- |
| `inning` | `PeriodKey` | The innings in play (inning1, inning2, …). |
| `battingSide` | `Side \| null \| null` | The side batting. |
| `striker` | `PlayerRef \| null \| null` | The batter who will face the next ball. Null when it cannot be told right now (no ball bowled in the innings yet, or the ball-by-ball and the scorecard briefly disagree after a delivery). |
| `nonStriker` | `PlayerRef \| null \| null` | The other batter at the crease. Null when unknown, as for striker. |
| `bowler` | `PlayerRef \| null \| null` | The bowler of the over in play; null between overs — the next bowler is known only once he bowls. |
| `over` | `integer` | The over in play, 1-based like Points (the next over once one is complete). |
| `ball` | `integer` | Legal balls bowled in that over so far (0–5; wides and no-balls do not count). |

### ScorecardInnings

One cricket innings: totals, batting and bowling cards, falls of wicket, partnerships.

| Field | Type | Description |
| --- | --- | --- |
| `inning` | `PeriodKey` | inning1, inning2, … in match order (the match’s second innings is inning2, whoever bats) — the same keys as Points.innings. |
| `battingSide` | `Side \| null \| null` | The side batting. |
| `battingTeam` | `TeamRef \| null \| null` | The team batting. |
| `bowlingTeam` | `TeamRef \| null \| null` | The team bowling. |
| `runs` | `integer \| null \| null` | Total: the batters’ runs plus extras. |
| `wickets` | `integer \| null \| null` | Wickets down (a batter retired hurt who cannot return counts). |
| `overs` | `number \| null \| null` | Overs faced, cricket notation (19.3 = 19 overs and 3 balls). |
| `extras` | `Extras` | Runs not scored off the bat. |
| `batting` | `ScorecardBatter[]` | The batting card in batting order, did-not-bat lines included. |
| `bowling` | `ScorecardBowler[]` | The bowling card in bowling order. |
| `fallOfWickets` | `FallOfWicket[]` | Falls of wicket in order (a retirement is not a fall). |
| `partnerships` | `Partnership[]` | Partnerships in order. |

### ScorecardBatter

One line of a batting card, in batting order.

| Field | Type | Description |
| --- | --- | --- |
| `batter` | `PlayerRef \| null \| null` | The batter. |
| `state` | `BatterState` | Where a batter’s innings stands. |
| `dismissal` | `Dismissal \| null \| null` | How the batter was out; null unless `state` is out. |
| `description` | `string \| null \| null` | The source’s wording of the state ("Caught & Bowled", "LBW", "Not out", "Did not bat"). Display only. |
| `bowler` | `PlayerRef \| null \| null` | The bowler of the dismissal (credited with the wicket, except for a run out). The source also names him on a retired-hurt line. |
| `fielder` | `PlayerRef \| null \| null` | The fielder in the dismissal: the catcher (the bowler on caught & bowled), the keeper on a stumping, the fielder on a run out. |
| `runs` | `integer \| null \| null` | Runs scored. |
| `balls` | `integer \| null \| null` | Balls faced. |
| `fours` | `integer \| null \| null` | Fours hit. |
| `sixes` | `integer \| null \| null` | Sixes hit. |
| `strikeRate` | `number \| null \| null` | Runs per 100 balls, 2 decimals; null before the first ball faced. |

### ScorecardBowler

One line of a bowling card, in bowling order.

| Field | Type | Description |
| --- | --- | --- |
| `bowler` | `PlayerRef \| null \| null` | The bowler. |
| `overs` | `number \| null \| null` | Overs bowled, cricket notation (3.4 = 3 overs and 4 balls). |
| `maidens` | `integer \| null \| null` | Maiden overs. |
| `runs` | `integer \| null \| null` | Runs conceded (wides and no-balls included, byes and leg byes not). |
| `wickets` | `integer \| null \| null` | Wickets credited (run outs and retirements are not). |
| `wides` | `integer \| null \| null` | Wides bowled. |
| `noBalls` | `integer \| null \| null` | No-balls bowled. |
| `economy` | `number \| null \| null` | Runs per over (6 balls), 2 decimals; null before the first ball. |

### FallOfWicket

One fall of wicket.

| Field | Type | Description |
| --- | --- | --- |
| `wicket` | `integer` | Which wicket: 1 = the first to fall. |
| `runs` | `integer \| null \| null` | The batting side’s total when it fell. |
| `overs` | `number \| null \| null` | When it fell, cricket notation (4.2 = the 2nd ball of the 5th over; the 6th ball of the 5th over is 5, never 4.6). |
| `batter` | `PlayerRef \| null \| null` | The batter out. |

### Partnership

One batting partnership. The source lists them for limited-overs matches; multi-day matches often have none.

| Field | Type | Description |
| --- | --- | --- |
| `batter1` | `PlayerRef \| null \| null` | One batter of the partnership. |
| `batter2` | `PlayerRef \| null \| null` | The other batter. |
| `runs` | `integer \| null \| null` | Runs added together. |
| `balls` | `integer \| null \| null` | Balls it lasted. |

### Extras

Runs not scored off the bat.

| Field | Type | Description |
| --- | --- | --- |
| `total` | `integer \| null \| null` | All extras: wides + noBalls + byes + legByes + penalties. |
| `wides` | `integer \| null \| null` | Wides. |
| `noBalls` | `integer \| null \| null` | No-balls. |
| `byes` | `integer \| null \| null` | Byes. |
| `legByes` | `integer \| null \| null` | Leg byes. |
| `penalties` | `integer \| null \| null` | Penalty runs. |

### StandingsGroup

One table of a season (a conference, a division, a group, or the overall table).

| Field | Type | Description |
| --- | --- | --- |
| `name` | `string \| null \| null` | Table name, e.g. "Eastern Conference", "Group A", "NHL". |
| `primary` | `boolean` | True for the table /standings returns by default — exactly one per season: the overall table when there is one, else the largest (the first group of a group stage). |
| `overall` | `boolean` | True when the table holds every team of the season (a league table); false for a conference, a division or one group of a group stage. |
| `tieBreakRule` | `string \| null \| null` | The source’s explanation of the tie-break order. |
| `scoreUnit` | `StandingsScoreUnit \| null \| null` | What scoresFor / scoresAgainst count in this table; null when the table has no score columns (cricket). |
| `rows` | `StandingsRow[]` |  |

### StandingsRow

One row of a standings table. Columns that do not apply to the sport are null.

| Field | Type | Description |
| --- | --- | --- |
| `position` | `integer \| null \| null` | Rank in this table, 1..n. Where the source’s positions are not 1..n (its NBA tables early in a season) the rows are ranked by us: win share, wins, fewer losses — or points, score difference, scores for. |
| `team` | `TeamRef \| null \| null` | The team. |
| `played` | `integer \| null \| null` | Games played. |
| `wins` | `integer \| null \| null` | Wins (all wins, overtime ones included). |
| `draws` | `integer \| null \| null` | Draws. Null in sports whose tables cannot hold a draw (basketball, ice hockey, baseball, volleyball, esports, water polo, …) — "no draws column", not "none yet"; a number in football, futsal, handball, rugby, American football and cricket. |
| `losses` | `integer \| null \| null` | Losses (all, overtime losses included). |
| `overtimeWins` | `integer \| null \| null` | Ice hockey: overtime wins as the source counts them — overtime only where it also counts shoot-outs apart (the KHL, the NHL’s league table), overtime + shoot-out otherwise; null where it lists none. |
| `overtimeLosses` | `integer \| null \| null` | Ice hockey: overtime + shoot-out losses (the NHL’s OTL, a point each) in every NHL table — league, conference, division and computed home / away; elsewhere the source’s overtime-loss count (the KHL lists overtime only). |
| `scoresFor` | `number \| null \| null` | Scored, in the table’s `scoreUnit` (goals, points, runs, sets, …). |
| `scoresAgainst` | `number \| null \| null` | Conceded, in the table’s `scoreUnit`. |
| `scoreDifference` | `number \| null \| null` | scoresFor − scoresAgainst. |
| `points` | `number \| null \| null` | Table points; null where the table ranks by win percentage (NBA). |
| `winPercentage` | `number \| null \| null` | Basketball / baseball / American football: share of games won, 0–1, as the league computes it (the NFL counts a tie as half a win). Unit: ratio. |
| `gamesBehind` | `number \| null \| null` | Basketball / baseball: games behind the table’s leader (best wins − losses): ((leader wins − wins) + (losses − leader losses)) / 2. The source prints 0 on every row of its EuroLeague tables; computed NBA home / away tables compute it per table. |
| `streak` | `integer \| null \| null` | Current run of results in this competition: +3 = three straight wins, −2 = two straight losses. Set where the source’s table carries it (NBA, EuroLeague, Liga ACB, …); null elsewhere and on home / away tables. |
| `zone` | `string \| null \| null` | The qualification / relegation zone the row is in, e.g. "Champions League", "Playoffs", "Relegation". |
| `form` | `FormResult[] \| null \| null` | The team’s last results in this competition season (up to five), oldest first, most recent last — on a home / away table its last home / away results. Null when the source has no form for the table (computed tables, older stored rows, a failed read). |

### CupTree

A knockout bracket of a league season (cup knockout stage, playoffs, a tennis draw).

| Field | Type | Description |
| --- | --- | --- |
| `name` | `string \| null \| null` | The bracket’s name, e.g. "CONMEBOL Libertadores 2026, Knockout stage", "NBA 25/26, Playoffs". |
| `currentRound` | `integer \| null \| null` | The `order` of the round in play (or next to be played); null when the source gives none, or when the tree is over (the source then names a round past the last one). |
| `rounds` | `CupRound[]` | First round first. |

### CupRound

A round of a knockout bracket.

| Field | Type | Description |
| --- | --- | --- |
| `order` | `integer` | Round order in the bracket, first round 1. |
| `name` | `string \| null \| null` | Round name as the source writes it ("1/8", "Quarterfinals", "Round of 32", "Conference finals"). |
| `blocks` | `CupBlock[]` | The round’s ties, top to bottom. |

### CupBlock

One tie of a knockout round (a single match, two legs or a series).

| Field | Type | Description |
| --- | --- | --- |
| `order` | `integer` | The tie’s slot in its round, top to bottom, as the source draws the bracket: ascending, but not always 1..n — a round with byes or teams entering later leaves gaps (UCL qualifiers 15, 16, 19, …). |
| `home` | `CupParticipant \| null \| null` | The first-listed participant (home in the first leg / higher seed); null when the slot is empty. |
| `away` | `CupParticipant \| null \| null` | The second-listed participant; null when the slot is empty (a bye). |
| `finished` | `boolean` | Whether the tie is decided (a participant is marked winner, or the source says it is over). |
| `inProgress` | `boolean` | Whether one of its fixtures is being played now. |
| `startTime` | `string (ISO-8601 UTC) \| null \| null` | Kick-off of the tie’s first fixture (UTC); null when not scheduled. |
| `matchCount` | `integer \| null \| null` | How many fixtures the tie is played over (2 legs, best-of-7 → 7, 1); 0 for a bye. |
| `fixtureIds` | `integer[]` | Our ids of the tie’s fixtures (/v2/fixtures/{id}), as the source lists them. |
| `automaticProgression` | `boolean` | The source’s flag: the participant goes through without a fixture. |
| `venue` | `Venue \| null \| null` | The tie’s venue when the source gives one (a single-match final, the first leg’s ground). |

### CupParticipant

One side of a knockout tie.

| Field | Type | Description |
| --- | --- | --- |
| `team` | `TeamRef \| null \| null` | The team (or competitor). Null while the slot is a placeholder (“winner of quarter-final 1”) — see `fromBlock`. |
| `seed` | `string \| null \| null` | Seed or entry label as the source writes it ("1", "Q" qualifier, "WC" wild card); null when none. |
| `winner` | `boolean` | Whether this participant won the tie / went through. |
| `score` | `integer \| null \| null` | Its score in the tie, the source’s figure: aggregate goals over the legs (football), games won in a series (basketball, ice hockey), sets in a single match (tennis). Null before the tie is played. |
| `penalties` | `integer \| null \| null` | Football: its penalty shoot-out goals when the tie went to one; null otherwise. |
| `fromBlock` | `integer \| null \| null` | The `order` of the block in the PREVIOUS round this participant came from; null in the first round or when neither the source links it nor the team played in the previous round (a new entrant). |

### SearchResult

One search hit, in the source’s relevance order. Tennis and other individual-sport competitors are `team` results; managers, referees, racing series and races since 2026-10-24; fixtures and venues, and a player’s `team`, since 2026-11-04.

| Field | Type | Description |
| --- | --- | --- |
| `type` | `SearchType` | What a search hit is — and so which endpoint its id belongs to. |
| `id` | `integer` | Our id of the hit — use it with the endpoint its `type` names (/v2/teams, /v2/players, /v2/leagues, /v2/managers, /v2/referees, /v2/series, /v2/races, /v2/fixtures). A venue has no endpoint: its id is the one Fixture.venue and TeamDetail.venue carry. |
| `name` | `string` | Display name; a fixture’s is the source’s "Home - Away". |
| `slug` | `string \| null \| null` |  |
| `sport` | `string \| null \| null` | Sport slug; null for venues (a venue is not tied to one sport). |
| `image` | `string (URL) \| null \| null` | Logo (team, league) or photo (player, manager, referee) on our CDN; null when the entity has no image (or it is not uploaded yet), and always for series, races, fixtures and venues. |
| `team` | `TeamRef \| null \| null` | A player’s current team, as the source lists it (since 2026-11-04); null for every other type and for a player without one (free agent, retired). |
| `fixture` | `SearchFixture \| null \| null` | The match facts of a `fixture` hit (since 2026-11-04); null for every other type. |
| `venue` | `Venue \| null \| null` | The venue of a `venue` hit — city, country, capacity (since 2026-11-04); null for every other type. |

### SearchFixture

What a `fixture` search hit says about the match (since 2026-11-04). Status, score and the rest: /v2/fixtures/{id}.

| Field | Type | Description |
| --- | --- | --- |
| `home` | `TeamRef \| null \| null` | Home team; null while the side is not decided yet. |
| `away` | `TeamRef \| null \| null` | Away team; null while the side is not decided yet. |
| `league` | `LeagueRef \| null \| null` | The competition; null when the source gives none. |
| `startTime` | `string (ISO-8601 UTC) \| null \| null` | Scheduled start (UTC); null when the source gives none. |
| `status` | `StatusType \| null \| null` | Coarse match state at the time of the search (the source gives no finer state here); null when the source gives none. |

### TopPlayersCategory

A season leaderboard.

| Field | Type | Description |
| --- | --- | --- |
| `category` | `string` | The leaderboard, e.g. averageRating, goals, expectedGoals (football), points, rebounds (basketball), points, savePercentage (ice hockey). The same as `statistic` except football `mostConceded` / `leastConceded` (goalkeepers by goals conceded, most / least first). |
| `statistic` | `string` | The key in each entry’s `statistics` the leaderboard ranks (its value is the entry’s `value`, a season total). The order is the source’s: a counting statistic is usually ranked PER APPEARANCE (value ÷ appearances — NBA points 104 in 3 games above 115 in 4), a rating or a share by its value; read the order, not `value`, as the rank. |
| `players` | `TopPlayerEntry[]` |  |

### TopPlayerEntry

One ranked player.

| Field | Type | Description |
| --- | --- | --- |
| `player` | `PlayerRef \| null \| null` |  |
| `team` | `TeamRef \| null \| null` |  |
| `value` | `number \| null \| null` | The ranked statistic for the player: `statistics[statistic]`. |
| `appearances` | `integer \| null \| null` | Appearances. |
| `playedEnough` | `boolean \| null \| null` | Enough minutes / games to qualify for the ranking. |
| `statistics` | `Record<string, number>` | Every numeric statistic the entry was ranked with — v2 keys, the same as the per-match statistic for the same quantity (season rules: `…PerMatch` = total ÷ matches, `…Per90` per 90 minutes, `average…` a season mean, `…Percentage` 0–100, `<key>Against` the opponents’ value, units in the name — `…Seconds`, `…Kmh`). |

### TopTeamsCategory

A season team leaderboard.

| Field | Type | Description |
| --- | --- | --- |
| `category` | `string` | The leaderboard, e.g. averageRating, goalsScored, cleanSheets (football). |
| `statistic` | `string` | The key in each entry’s `statistics` the leaderboard ranks (its value is the entry’s `value`, a season total). The order is the source’s: a counting statistic is usually ranked PER APPEARANCE (value ÷ appearances — NBA points 104 in 3 games above 115 in 4), a rating or a share by its value; read the order, not `value`, as the rank. |
| `teams` | `TopTeamEntry[]` | The ranked teams, best first. |

### TopTeamEntry

One ranked team.

| Field | Type | Description |
| --- | --- | --- |
| `team` | `TeamRef \| null \| null` |  |
| `value` | `number \| null \| null` | The ranked statistic for the team: `statistics[statistic]`. |
| `matches` | `integer \| null \| null` | Matches played. |
| `statistics` | `Record<string, number>` | Every numeric statistic the entry was ranked with — v2 keys, the same as the per-match statistic for the same quantity (season rules: `…PerMatch` = total ÷ matches, `…Per90` per 90 minutes, `average…` a season mean, `…Percentage` 0–100, `<key>Against` the opponents’ value, units in the name — `…Seconds`, `…Kmh`). |

### TeamSeasonStatistics

A team’s statistics for one league, season and type.

| Field | Type | Description |
| --- | --- | --- |
| `statistics` | `Record<string, number>` | Season totals and averages — v2 keys, the same as the per-match statistic for the same quantity (season rules: `…PerMatch` = total ÷ matches, `…Per90` per 90 minutes, `average…` a season mean, `…Percentage` 0–100, `<key>Against` the opponents’ value, units in the name — `…Seconds`, `…Kmh`) (football: matches, goalsScored, goalsConceded, totalShots, averageBallPossession, averageRating, cleanSheets, …). Ratings rounded to 2 decimals. |

### SeasonInfo

Season facts: totals so far and the newcomers.

| Field | Type | Description |
| --- | --- | --- |
| `statistics` | `Record<string, number>` | Season totals as the source names them (football: goals, homeTeamWins, awayTeamWins, draws, yellowCards, redCards, numberOfCompetitors; other sports may only have numberOfCompetitors). |
| `newcomersUpperDivision` | `TeamRef[]` | Teams new this season, relegated from the division above. |
| `newcomersLowerDivision` | `TeamRef[]` | Teams new this season, promoted from the division below. |
| `newcomersOther` | `TeamRef[]` | Other new teams. |
| `hostCountries` | `Country[]` | The host countries of a tournament held in named countries (World Cup 2026: Canada, Mexico, USA; EURO 2020: eleven), in the source’s order. Usually empty for a league season, though the source names the country for some (Bundesliga: Germany; MLS, NFL: USA). `code` is null for a name the source’s country list does not carry. |

### PlayerLeagueSeasons

A league the player has statistics in, with the seasons.

| Field | Type | Description |
| --- | --- | --- |
| `league` | `LeagueRef` | A league / competition (also the shape of /v2/leagues/{id} and of every league list). |
| `seasons` | `({ id: integer; name: string \| null; year: string \| null; startYear: integer \| null; endYear: integer \| null; types: SeasonStatsType[] })[]` |  |

### PlayerStatistics

A player’s statistics for one league, season and type.

| Field | Type | Description |
| --- | --- | --- |
| `team` | `TeamRef \| null \| null` |  |
| `statistics` | `Record<string, number>` | Season totals and averages — v2 keys, the same as the per-match statistic for the same quantity (season rules: `…PerMatch` = total ÷ matches, `…Per90` per 90 minutes, `average…` a season mean, `…Percentage` 0–100, `<key>Against` the opponents’ value, units in the name — `…Seconds`, `…Kmh`) (football: appearances, minutesPlayed, goals, averageRating, expectedGoals, …). Ratings rounded to 2 decimals. |

### PlayerFixture

A Fixture from a player’s fixture list, with the player’s own part in it (`playerMatch`).

| Field | Type | Description |
| --- | --- | --- |
| `id` | `integer` | Our fixture id. |
| `sport` | `string` | Sport slug (as in /v2/sports). |
| `status` | `Status` | Match status. |
| `startTime` | `string (ISO-8601 UTC) \| null \| null` | Start time: the scheduled start, replaced by the recorded kick-off once the source records it (the live feed sends it a few minutes after the start). The same value on every endpoint and in WebSocket deltas. |
| `league` | `LeagueRef \| null \| null` | The competition. null when the source files the fixture under a competition it has no league for — seen on minor regional football (South Africa’s National Second Division, 2026-10-23); season and round are then null too. |
| `season` | `Season \| null \| null` | The season. |
| `round` | `Round \| null \| null` | The round, when the competition has rounds. |
| `home` | `TeamRef \| null \| null` | Home side; null while the side is not decided yet (the source’s placeholder such as "WQF1", winner of quarter-final 1). |
| `away` | `TeamRef \| null \| null` | Away side; null while the side is not decided yet (the source’s placeholder such as "WQF1"). |
| `homeScore` | `ScoreSide` | One side’s score. |
| `awayScore` | `ScoreSide` | One side’s score. |
| `winner` | `Winner \| null \| null` | Null until status.type is finished, and for a fight ruled a no contest (`fightResult.method` noContest). A match finished on penalties: the shoot-out winner, whatever the source says (on a second leg the source names the side that won the 90 minutes). Named from the score when the source leaves it out, or calls a match draw in a sport that cannot draw (regular time or overtime finishes; not cricket). |
| `venue` | `Venue \| null \| null` | Venue, when known (often null in lower tiers). Filled on /fixtures/{id} and, when the source lists it, in date lists; the source’s round, team, player and live lists carry no venue, so null there means "not included", not "unknown" — read /fixtures/{id} for it. |
| `clock` | `Clock \| null \| null` | Match clock; null when the source has none for the fixture and once it is over. |
| `firstToServe` | `Side \| null \| null` | Deprecated (2026-10-23): the same value as `serving`. The source updates this field every game / leg, so it is the side serving (throwing) NOW, not who served first — read `serving`. |
| `serving` | `Side \| null \| null` | Tennis / darts / other serve sports: the side serving (throwing) now, as the source updates it every game / leg. Null when the source does not say. |
| `homeSeed` | `string \| null \| null` | Seeded competitions — tennis draws, playoff seeding (basketball, …): the home side’s seed ("1", "12") or entry status ("WC" wild card, "Q" qualifier, "LL" lucky loser, "PR" protected ranking, …), as the draw prints it. Null when unseeded. |
| `awaySeed` | `string \| null \| null` | The away side’s seed or entry status, like homeSeed. |
| `note` | `string \| null \| null` | Cricket: the source’s match note — the result line once finished ("Pakistan beat Sri Lanka by 37 runs"). Display only. |
| `battingSide` | `Side \| null \| null` | Cricket: the side batting now. Null when no innings is in progress and for other sports. |
| `fightResult` | `FightResult \| null \| null` | MMA / boxing: method, round and time of the finish. Null until status.type is finished, and when the source has no method. |
| `fightDiscipline` | `FightDiscipline \| null \| null` | Combat sports (sport `mma`, which also carries boxing, kickboxing and Muay Thai cards): the discipline of this fight, when the source tags it. The source tags only some cards (ONE, Queensbury, some OKTAGON fights; not UFC or PFL), so null does not mean MMA. |
| `referee` | `Referee \| null \| null` | The referee, when the source names one (football and some other sports; cricket: the match referee). Filled on /fixtures/{id}; lists carry null (not included). |
| `homeManager` | `ManagerRef \| null \| null` | The home side’s manager / head coach for this fixture, when the source names one. Filled on /fixtures/{id}; lists carry null. |
| `awayManager` | `ManagerRef \| null \| null` | The away side’s manager / head coach, like homeManager. |
| `surface` | `Surface \| null \| null` | Tennis: the court surface. Filled on /fixtures/{id} and live lists; null for other sports. |
| `toss` | `CricketToss \| null \| null` | Cricket: the toss, once made. Filled on /fixtures/{id}; null for other sports. |
| `umpires` | `string[] \| null \| null` | Cricket: the on-field umpires as the source names them (often with a country code: "Asif Yaqoob (PAK)"); null when not listed and for other sports. |
| `tvUmpire` | `string \| null \| null` | Cricket: the TV (third) umpire, like umpires. |
| `previousLegFixtureId` | `integer \| null \| null` | Two-legged ties and playoff series: our id of the previous leg / game of the tie, when the source links it. Read /fixtures/{id} of it for the first-leg score. |
| `aggregateWinner` | `Side \| null \| null` | Second leg of a two-legged tie: the side that went through, once finished — the source’s verdict, else read from `aggregated` (higher wins) or, level on aggregate, the shoot-out. Null otherwise, and on a level aggregate the source does not settle (an away-goals rule). `winner` is this match’s winner: on a second leg decided on penalties both name the shoot-out winner; otherwise the two can differ (a side can win the second leg and go out). Filled on /fixtures/{id}; lists and live snapshots may carry null (not included). |
| `fightCard` | `FightCard \| null \| null` | MMA / boxing: card section, order and weight class of the bout, when the source lists them. |
| `attendance` | `integer \| null \| null` | Spectators, when the source reports it (seen on NBA and MLB games, often only once the game is under way). Filled on /fixtures/{id}; lists carry null (not included). |
| `matchFormat` | `MatchFormat \| null \| null` | Darts and esports: the match format (best of N sets / legs / games), when the source gives it; null for other sports. |
| `inningState` | `InningState \| null \| null` | Baseball: the game state in play (inning, half, balls, strikes, outs, runners on base). Null unless the game is in progress (or interrupted), and for other sports. Live: in WebSocket deltas. |
| `timeouts` | `Timeouts \| null \| null` | Basketball: timeouts left per side. Null unless the game is in progress (or interrupted), and when the source does not track them. Live: in WebSocket deltas. |
| `playerMatch` | `PlayerMatch \| null \| null` | The player’s part in this fixture; null when the source lists nothing for it. |

### PlayerMatch

The player’s own part in one fixture.

| Field | Type | Description |
| --- | --- | --- |
| `side` | `Side \| null \| null` | The side the player played for. |
| `onBench` | `boolean` | Named on the bench and did not come on. |
| `rating` | `number \| null \| null` | Match rating (e.g. 7.4), rounded to 2 decimals; null when the player has none (did not play, not rated, not played yet). |
| `statistics` | `Record<string, number>` | Per-match statistics listed with the player’s fixtures, with the lineup statistics’ keys — football minutesPlayed; basketball points, rebounds, assists, fieldGoalsMade, fieldGoalsAttempted, secondsPlayed, plusMinus …; ice hockey goals, assists, shotsOnGoal, secondsPlayed …. Every …Percentage is 0–100. Empty when there are none. |
| `incidents` | `Record<string, number>` | Counts from the match’s incidents: goals (penalties included), penaltyGoals (of those, from the spot), assists, yellowCards, redCards …. Empty when there are none. |

### RankingTypeInfo

One ranking table of GET /v2/rankings; pass `type` to GET /v2/rankings/{type}.

| Field | Type | Description |
| --- | --- | --- |
| `type` | `RankingTypeSlug` | A ranking table we serve — the list with names is GET /v2/rankings. |
| `name` | `string` | Display name, e.g. "ATP singles ranking". |
| `sport` | `string` | Sport slug (as in /v2/sports). |
| `gender` | `TeamGender \| null \| null` | Men’s or women’s ranking; null when it ranks countries. |
| `entry` | `RankingEntry` | What one row of a ranking stands for. |

### Ranking

A ranking table (GET /v2/rankings/{type}).

| Field | Type | Description |
| --- | --- | --- |
| `type` | `RankingTypeSlug` | A ranking table we serve — the list with names is GET /v2/rankings. |
| `updatedAt` | `string (ISO-8601 UTC) \| null \| null` | When the source last updated the table. |
| `rows` | `RankingRow[]` | Every row, best first. |

### RankingRow

One row of a ranking table.

| Field | Type | Description |
| --- | --- | --- |
| `position` | `integer` | Place in the ranking, 1 = first. MMA division rankings list the champion first with position 0. |
| `previousPosition` | `integer \| null \| null` | Place in the previous edition of the ranking (0 = the champion, MMA); null when the source does not give one. |
| `points` | `number \| null \| null` | Ranking points (coefficients for UEFA); null for rankings without points (MMA). |
| `previousPoints` | `number \| null \| null` | Points in the previous edition; null when the source does not give them. |
| `bestPosition` | `integer \| null \| null` | Career-best place (tennis); null otherwise. |
| `tournamentsPlayed` | `integer \| null \| null` | Tournaments counted (ATP); null otherwise. |
| `team` | `TeamRef \| null \| null` | The ranked team or competitor (tennis players and fighters are team objects); null in a ranking of countries. |
| `league` | `LeagueRef \| null \| null` | A ranking of countries (UEFA): the country’s top league; null otherwise. |
| `country` | `Country \| null \| null` | The country of the team, competitor or (UEFA countries) the ranked country; null when unknown. |

### Category

A grouping of leagues within a sport — the top level of the league directory.

| Field | Type | Description |
| --- | --- | --- |
| `id` | `integer` | Our category id — pass it as `category` to GET /v2/leagues. |
| `name` | `string` | Category name: a country ("England"), a region ("International", "World"), a tour ("ATP") or a game (esports). |
| `slug` | `string \| null \| null` | URL slug. |
| `sport` | `string \| null \| null` | Sport slug (as in /v2/sports). |
| `country` | `Country \| null \| null` | The category’s country, when it is one; null for regions, tours and games. Its `code` is what GET /v2/leagues takes as `country`. |

### PlayerStatisticsRow

One player in a league season’s player-statistics explorer.

| Field | Type | Description |
| --- | --- | --- |
| `player` | `PlayerRef` | A player as referenced from any other object. |
| `team` | `TeamRef \| null \| null` | The team the player played for in this league season (the latest one after a mid-season move). |
| `statistics` | `Record<string, number>` | Season totals of the requested group — v2 season-statistic keys (the same as /v2/players/{id}/statistics: averageRating, goals, expectedGoals, shotsOnGoal, cleanSheets, …; `…Percentage` 0–100). A key the source leaves out for a player is absent; averageRating is absent for a player without a rating (the source sends 0). |

### SeriesRef

A racing series — the race sports’ counterpart of a league (motorsport championships; in cycling the whole men’s or women’s road calendar). Its seasons hold the races; /v2/series/{id}/standings ranks the competitors over a season.

| Field | Type | Description |
| --- | --- | --- |
| `id` | `integer` | Our series id. |
| `name` | `string` | Series name ("Formula 1", "MotoGP", "NASCAR Cup Series"). Cycling: the source groups every road race of one gender under one series ("Cycling Men", "Cycling Women"). |
| `slug` | `string \| null \| null` | URL slug. |
| `sport` | `string \| null \| null` | Sport slug (as in /v2/sports). |

### Circuit

Where a motorsport race is held.

| Field | Type | Description |
| --- | --- | --- |
| `name` | `string \| null \| null` | Circuit name ("Circuit of the Americas"). |
| `city` | `string \| null \| null` | City. |
| `country` | `Country \| null \| null` | Country. |
| `lengthMeters` | `integer \| null \| null` | Lap length in metres. Unit: meters. |

### Race

A race: a motorsport race weekend (practice, qualifying, sprint, race) or a cycling race (one-day race or stage race).

| Field | Type | Description |
| --- | --- | --- |
| `id` | `integer` | Our race id. |
| `name` | `string` | Race name ("USA GP", "Tour de France", "Gran Piemonte"). |
| `slug` | `string \| null \| null` | URL slug. |
| `sport` | `string \| null \| null` | Sport slug (as in /v2/sports). |
| `series` | `SeriesRef \| null \| null` | The series the race belongs to. |
| `season` | `Season \| null \| null` | The series season ("Formula 1 2026"); pass its id to the /v2/series/{id}/… endpoints. |
| `round` | `integer \| null \| null` | Round of the championship, as the source numbers it (canceled races can leave the numbering uneven). |
| `status` | `StatusType \| null \| null` | Race state: notstarted until its first session, inprogress, finished once every session is over, canceled, postponed. |
| `startDate` | `string (YYYY-MM-DD) \| null \| null` | First day of the race (UTC). Sessions carry exact times. On /v2/races and /v2/races/{id} it is never later than the first session’s day; a season’s race list (/v2/series/{id}/races) has the source’s own days. |
| `endDate` | `string (YYYY-MM-DD) \| null \| null` | Last day of the race (UTC); on /v2/races and /v2/races/{id} never earlier than the last session’s day. |
| `country` | `Country \| null \| null` | Host country. |
| `circuit` | `Circuit \| null \| null` | The circuit (motorsport; null in cycling). |
| `laps` | `integer \| null \| null` | Scheduled laps of the main race (motorsport). |
| `distanceMeters` | `integer \| null \| null` | Distance of the main race in metres (motorsport). Unit: meters. |
| `category` | `string \| null \| null` | The source’s category label of the race (cycling, e.g. "World Tour 1 Grand Tour"). |
| `winner` | `TeamRef \| null \| null` | Winner of the race (motorsport: of the main race; a cycling stage race: of the general classification), only once finished. A driver / rider is a TeamRef (kind individual), like a tennis player. |
| `sessions` | `RaceSession[]` | The sessions in start order (oldest first). |

### RaceSnapshot

race:{id} snapshot: the race with its sessions and the current session’s results.

| Field | Type | Description |
| --- | --- | --- |
| `race` | `Race` | A race: a motorsport race weekend (practice, qualifying, sprint, race) or a cycling race (one-day race or stage race). |
| `session` | `integer \| null \| null` | The session the results are of: the one in progress, else the last one that finished; null before any session ran. |
| `results` | `RaceResult[]` | That session’s classification (as /v2/races/{id}/results?session=); [] when there is none yet. |

### RaceSummary

A race as listed in a season (no sessions; /v2/races/{id} has them).

| Field | Type | Description |
| --- | --- | --- |
| `id` | `integer` | Our race id. |
| `name` | `string` | Race name ("USA GP", "Tour de France", "Gran Piemonte"). |
| `slug` | `string \| null \| null` | URL slug. |
| `sport` | `string \| null \| null` | Sport slug (as in /v2/sports). |
| `series` | `SeriesRef \| null \| null` | The series the race belongs to. |
| `season` | `Season \| null \| null` | The series season ("Formula 1 2026"); pass its id to the /v2/series/{id}/… endpoints. |
| `round` | `integer \| null \| null` | Round of the championship, as the source numbers it (canceled races can leave the numbering uneven). |
| `status` | `StatusType \| null \| null` | Race state: notstarted until its first session, inprogress, finished once every session is over, canceled, postponed. |
| `startDate` | `string (YYYY-MM-DD) \| null \| null` | First day of the race (UTC). Sessions carry exact times. On /v2/races and /v2/races/{id} it is never later than the first session’s day; a season’s race list (/v2/series/{id}/races) has the source’s own days. |
| `endDate` | `string (YYYY-MM-DD) \| null \| null` | Last day of the race (UTC); on /v2/races and /v2/races/{id} never earlier than the last session’s day. |
| `country` | `Country \| null \| null` | Host country. |
| `circuit` | `Circuit \| null \| null` | The circuit (motorsport; null in cycling). |
| `laps` | `integer \| null \| null` | Scheduled laps of the main race (motorsport). |
| `distanceMeters` | `integer \| null \| null` | Distance of the main race in metres (motorsport). Unit: meters. |
| `category` | `string \| null \| null` | The source’s category label of the race (cycling, e.g. "World Tour 1 Grand Tour"). |
| `winner` | `TeamRef \| null \| null` | Winner of the race (motorsport: of the main race; a cycling stage race: of the general classification), only once finished. A driver / rider is a TeamRef (kind individual), like a tennis player. |

### RaceSession

One timed part of a race: a practice, qualifying, sprint or the race in motorsport; a stage of a cycling stage race (a one-day race has one session, the race).

| Field | Type | Description |
| --- | --- | --- |
| `id` | `integer` | Our session id (pass it to /v2/races/{id}/results?session=). |
| `name` | `string` | Session name as the source gives it ("Practice 1", "Qualification", "Grand Prix", "Stage 5"). |
| `type` | `RaceSessionType` | What the session is. |
| `status` | `StatusType \| null \| null` | Session state (the fixture status types; null when the source gives none). |
| `startTime` | `string (ISO-8601 UTC) \| null \| null` | Scheduled start (UTC). |
| `laps` | `integer \| null \| null` | Scheduled laps (motorsport races). |
| `lapsCompleted` | `integer \| null \| null` | Laps run (a shortened race has fewer than `laps`). |
| `distanceMeters` | `integer \| null \| null` | Race distance in metres (a cycling stage’s length). Unit: meters. |
| `departureCity` | `string \| null \| null` | Start town (cycling). |
| `arrivalCity` | `string \| null \| null` | Finish town (cycling). |
| `profile` | `StageProfile \| null \| null` | Terrain (cycling). |
| `weather` | `RaceWeather \| null \| null` | Weather (once the session has run). |
| `trackCondition` | `TrackCondition \| null \| null` | Dry or wet. |
| `airTemperatureC` | `number \| null \| null` | Air temperature in °C. Unit: celsius. |
| `trackTemperatureC` | `number \| null \| null` | Track temperature in °C (motorsport). Unit: celsius. |
| `humidityPercent` | `number \| null \| null` | Relative humidity, 0–100. Unit: percent. |
| `safetyCar` | `boolean \| null \| null` | True when a safety car came out (null: not reported). |
| `winner` | `TeamRef \| null \| null` | The session’s winner (fastest in practice / qualifying), only once the session is finished. |
| `parts` | `RaceSessionPart[]` | The parts of a knock-out qualifying or sprint qualifying session (Q1, Q2…), in run order; empty for every other session and where the source lists none. |

### RaceSessionPart

One part of a knock-out qualifying session (MotoGP Q1 / Q2, Formula 1 Q1–Q3), in run order.

| Field | Type | Description |
| --- | --- | --- |
| `id` | `integer` | Our id of the part (pass it to /v2/races/{id}/results?session= for that part alone). |
| `name` | `string` | The part’s label in the series’ own terms: "Q1", "Q2", "Q3" (qualifying), "SQ1"… (sprint qualifying), numbered in run order. |
| `status` | `StatusType \| null \| null` | Part state (null when the source gives none — Formula 1 parts). |
| `startTime` | `string (ISO-8601 UTC) \| null \| null` | Scheduled start (UTC; null when the source gives none). |

### RaceResult

One competitor’s line in a session’s or a race’s classification.

| Field | Type | Description |
| --- | --- | --- |
| `position` | `integer \| null \| null` | Place; null for a competitor out of the classification (see `state`). |
| `competitor` | `TeamRef \| null \| null` | The driver / rider (a TeamRef, kind individual). |
| `team` | `TeamRef \| null \| null` | The competitor’s team (constructor, cycling team). |
| `state` | `RaceResultState` | Classified, or why not. |
| `outReason` | `string \| null \| null` | Why the competitor is out, as the source words it ("Retired"); null when classified. |
| `carNumber` | `integer \| null \| null` | Car / bike number (motorsport). |
| `gridPosition` | `integer \| null \| null` | Starting position (races; null from the pit lane or unknown). |
| `startedFromPitLane` | `boolean \| null \| null` | True when the competitor started from the pit lane. |
| `laps` | `integer \| null \| null` | Laps as the source counts them. |
| `lapsBehind` | `integer \| null \| null` | Laps behind the winner (lapped cars); null when on the lead lap. |
| `lapsLed` | `integer \| null \| null` | Laps led. |
| `pitStops` | `integer \| null \| null` | Pit stops. |
| `timeMs` | `integer \| null \| null` | Total time in ms (race / stage), or the best lap (practice, qualifying). Null for the lapped and the out, and when the source recorded no time for a classified rider. Unit: milliseconds. |
| `gapMs` | `integer \| null \| null` | Behind the winner in ms; null for the winner, the lapped and the out, and when the source recorded no time for a classified rider. Unit: milliseconds. |
| `intervalMs` | `integer \| null \| null` | Behind the competitor one place ahead in ms; null for the winner, the lapped and the out, and when the source recorded no time for a classified rider. Unit: milliseconds. |
| `bestLapMs` | `integer \| null \| null` | The competitor’s fastest lap in ms (races). Unit: milliseconds. |
| `bestLapNumber` | `integer \| null \| null` | Lap on which it was set. |
| `fastestLap` | `boolean \| null \| null` | True for the fastest lap of the session. |
| `points` | `number \| null \| null` | Championship points scored here. |
| `tyreStints` | `TyreStint[]` | Tyre stints in order (Formula 1 races; empty otherwise). |
| `cycling` | `CyclingStanding \| null \| null` | Side classifications (a cycling stage race’s overall result; null otherwise). |
| `part` | `string \| null \| null` | The qualifying part this line comes from ("Q2", "Q1") when the classification is assembled from the parts (MotoGP qualifying: the source has no table of its own) — timeMs / gapMs / intervalMs are then that part’s; null otherwise. |

### TyreStint

One stint on one set of tyres.

| Field | Type | Description |
| --- | --- | --- |
| `compound` | `TyreCompound` | The compound. |
| `laps` | `integer \| null \| null` | Laps on this set. |

### CyclingStanding

A rider’s side classifications in a stage race’s overall result.

| Field | Type | Description |
| --- | --- | --- |
| `jersey` | `CyclingJersey \| null \| null` | The leader’s jersey this rider holds, if any. |
| `pointsPosition` | `integer \| null \| null` | Place in the points classification. |
| `points` | `number \| null \| null` | Points-classification points. |
| `mountainsPosition` | `integer \| null \| null` | Place in the mountains classification. |
| `mountainsPoints` | `number \| null \| null` | Mountains-classification points. |
| `youngRiderPosition` | `integer \| null \| null` | Place in the young-rider classification. |
| `youngRiderTimeMs` | `integer \| null \| null` | Total time counted for the young-rider classification, in ms. Unit: milliseconds. |

### SeriesStandingsRow

A row of a series’ championship table.

| Field | Type | Description |
| --- | --- | --- |
| `position` | `integer \| null \| null` | Championship place. |
| `competitor` | `TeamRef \| null \| null` | Who is ranked: the driver / rider (`type=competitors`) or the team (`type=teams`). |
| `team` | `TeamRef \| null \| null` | The driver’s / rider’s team; null in the teams’ table. |
| `points` | `number \| null \| null` | Championship points. |
| `wins` | `integer \| null \| null` | Race wins. |
| `podiums` | `integer \| null \| null` | Podium finishes. |
| `polePositions` | `integer \| null \| null` | Pole positions. |
| `fastestLaps` | `integer \| null \| null` | Fastest laps. |
| `racesStarted` | `integer \| null \| null` | Races started. |
| `racesWithPoints` | `integer \| null \| null` | Races that scored points. |

### WinProbability

Our own in-play win-probability model for a football fixture (documented in the docs): pre-match expected goals (v2: from both teams’ recent matches in all competitions, their domestic tables and league-strength coefficients, blended with the competition’s table and form), then updated by time left, score, red cards and momentum. An analysis indicator — not betting advice; no bookmaker odds are used.

| Field | Type | Description |
| --- | --- | --- |
| `fixtureId` | `integer` | Our fixture id. |
| `model` | `WinProbabilityModel` | Model version (the docs describe each). A new version is announced in the changelog. |
| `updatedAt` | `string (ISO-8601 UTC)` | When this estimate was computed. |
| `prematch` | `WinProbabilityPrematch` | The pre-match estimate and the inputs it was built from. Fixed once computed (it does not move when the table is updated after the match). |
| `current` | `WinProbabilityState` | The latest estimate: the pre-match one before kick-off, certainty (1 / 0 / 0) once finished. |
| `series` | `WinProbabilityPoint[]` | The curve, oldest first (by `at`): a point at kick-off, one per match minute, and one right after every goal, red card, period start / end and big missed chance. Empty before kick-off. History: a point is stored once it is two minutes old (or the match is over) and is not changed after, so the curve shows what the model said at the time; kept for good. With `?since=` only the points after that instant. |
| `inputs` | `{ shotmap: boolean; momentum: boolean; events: boolean }` | Which live inputs the in-play estimate used. |

### WinProbabilityPrematch

The pre-match estimate and the inputs it was built from. Fixed once computed (it does not move when the table is updated after the match).

| Field | Type | Description |
| --- | --- | --- |
| `home` | `number` | Pre-match probability of a home win, 0–1. Unit: ratio. |
| `draw` | `number` | Pre-match probability of a draw, 0–1. Unit: ratio. |
| `away` | `number` | Pre-match probability of an away win, 0–1. Unit: ratio. |
| `homeExpectedGoals` | `number` | The model’s expected goals for the home side over the whole match (λ home). |
| `awayExpectedGoals` | `number` | The model’s expected goals for the away side over the whole match (λ away). |
| `standings` | `boolean` | Whether the league table was available (attack / defence ratings); false = league or global averages were used. |
| `form` | `boolean` | Whether the pre-match form guide was available. |
| `allCompetitions` | `boolean \| null \| null` | Model v2: whether the teams’ recent matches in all competitions were available (strength from up to their last 20 results, weighted by age and by the opponent’s strength). Null for model v1. |
| `domesticTables` | `boolean \| null \| null` | Model v2: whether the teams’ domestic league tables were available (for a cup or European match: their own leagues’ tables, put on one scale by our league-strength coefficients). Null for model v1. |

### WinProbabilityState

One estimate of the result: home / draw / away probabilities at a moment of the match.

| Field | Type | Description |
| --- | --- | --- |
| `home` | `number` | Probability that the home side ends the match ahead on the scoreboard, 0–1. Unit: ratio. |
| `draw` | `number` | Probability that the match ends level on the scoreboard (a penalty shoot-out is not counted), 0–1. home + draw + away = 1. Unit: ratio. |
| `away` | `number` | Probability that the away side ends the match ahead on the scoreboard, 0–1. Unit: ratio. |
| `minute` | `integer \| null \| null` | Match minute of the estimate, as incidents count it (a goal in the 23rd minute is minute 23; 45+2 is minute 45, addedMinute 2). Null before kick-off. Unit: minutes. |
| `addedMinute` | `integer \| null \| null` | Minutes into added time, else null. Unit: minutes. |
| `homeScore` | `integer \| null \| null` | Home goals at that moment. Null before kick-off. |
| `awayScore` | `integer \| null \| null` | Away goals at that moment. Null before kick-off. |
| `at` | `string (ISO-8601 UTC) \| null \| null` | UTC instant of the estimate. A curve point: the moment of the match it describes (the end of that minute, the goal, the whistle) — measured from the match clock while it runs, else estimated from kick-off (15 min half-time). `current`: when it was computed (in play / before kick-off) or the end of the match (finished). Non-decreasing along the series. Null only for points stored before 2026-10-22 whose kick-off time is unknown. |

### WinProbabilityPoint

A point of the win-probability curve: an estimate and why it was emitted.

| Field | Type | Description |
| --- | --- | --- |
| `home` | `number` | Probability that the home side ends the match ahead on the scoreboard, 0–1. Unit: ratio. |
| `draw` | `number` | Probability that the match ends level on the scoreboard (a penalty shoot-out is not counted), 0–1. home + draw + away = 1. Unit: ratio. |
| `away` | `number` | Probability that the away side ends the match ahead on the scoreboard, 0–1. Unit: ratio. |
| `minute` | `integer \| null \| null` | Match minute of the estimate, as incidents count it (a goal in the 23rd minute is minute 23; 45+2 is minute 45, addedMinute 2). Null before kick-off. Unit: minutes. |
| `addedMinute` | `integer \| null \| null` | Minutes into added time, else null. Unit: minutes. |
| `homeScore` | `integer \| null \| null` | Home goals at that moment. Null before kick-off. |
| `awayScore` | `integer \| null \| null` | Away goals at that moment. Null before kick-off. |
| `at` | `string (ISO-8601 UTC) \| null \| null` | UTC instant of the estimate. A curve point: the moment of the match it describes (the end of that minute, the goal, the whistle) — measured from the match clock while it runs, else estimated from kick-off (15 min half-time). `current`: when it was computed (in play / before kick-off) or the end of the match (finished). Non-decreasing along the series. Null only for points stored before 2026-10-22 whose kick-off time is unknown. |
| `reason` | `WinProbabilityReason` | Why a win-probability point was emitted. |

### Commentary

AI match commentary for a football fixture, written by SportsAPI AI from our own data only: one short entry per goal, red card, missed penalty, VAR decision, period start / end, big chance and sustained momentum swing, plus half-time and full-time summaries. Written once and shared by every client.

| Field | Type | Description |
| --- | --- | --- |
| `fixtureId` | `integer` | Our fixture id. |
| `entries` | `CommentaryEntry[]` | Oldest first (by `seq`), like every timeline list. Empty until something has been written — commentary is generated only while someone follows the match (this endpoint or the fixture:{id} channel; a featured match on sportsapi.app always has it), so a match nobody watched has none. |

### CommentaryEntry

One AI commentary entry.

| Field | Type | Description |
| --- | --- | --- |
| `seq` | `integer` | Position in the fixture’s commentary: 1, 2, 3, … in the order written. Never reused. |
| `kind` | `CommentaryKind` | What the entry is about — the most important event when it covers several. |
| `minute` | `integer \| null \| null` | Match minute of the newest event it covers (as incidents count it: 45+2 is minute 45, addedMinute 2). Summaries: the whistle — halfTime 45, fullTime 90 (120 after extra time); null on a fullTime entry written before 2026-10-23. Unit: minutes. |
| `addedMinute` | `integer \| null \| null` | Minutes into added time, else null. Unit: minutes. |
| `text` | `string` | One or two English sentences (summaries: up to three), written by SportsAPI AI from our own data of the match only — events, score, clock, statistics and our win-probability model. No betting language. Plain text. |
| `model` | `string` | The model that wrote it: "sportsapi-ai" (SportsAPI AI). Entries served before 2026-11-02 named the underlying provider model. |
| `createdAt` | `string (ISO-8601 UTC)` | When it was written. |

### PlayByPlay

The source’s text commentary, one entry per action (football, basketball, …): written by the source’s data provider, not by us — our own AI commentary is /commentary.

| Field | Type | Description |
| --- | --- | --- |
| `entries` | `PlayByPlayEntry[]` | Oldest first, like every timeline list. |

### PlayByPlayEntry

One line of the source’s text commentary (play by play).

| Field | Type | Description |
| --- | --- | --- |
| `type` | `PlayByPlayType` | What a play-by-play entry records. |
| `side` | `Side \| null \| null` | The side of `player` (or of the team the entry is about); null for match-level entries (kick-off, period ends, delays). |
| `period` | `PeriodKey \| null \| null` | The period it happened in; null when the source gives none (football’s final whistle). |
| `minute` | `integer \| null \| null` | Football: match minute (added time apart: 45+6 → minute 45, addedMinute 6). Null in clock sports (basketball: see `periodSecond`) and when the source gives no time. Unit: minutes. |
| `addedMinute` | `integer \| null \| null` | Football: minutes into added time (45+6 → 6); null otherwise. Unit: minutes. |
| `periodSecond` | `integer \| null \| null` | Clock sports (basketball): seconds played in the period; null in football. Unit: seconds. |
| `periodSecondsLeft` | `integer \| null \| null` | Clock sports (basketball): the game clock — seconds left in the period; null in football. Unit: seconds. |
| `at` | `string (ISO-8601 UTC) \| null \| null` | When the action was recorded (UTC), where the source stamps it (basketball); null otherwise. |
| `text` | `string` | The commentary line, in English, as the source writes it. |
| `player` | `PlayerRef \| null \| null` | The player the entry is about: shooter, scorer, booked player, fouling player, rebounder, … |
| `assist` | `PlayerRef \| null \| null` | The player who assisted it, when the source names one (basketball baskets). |
| `playerIn` | `PlayerRef \| null \| null` | substitution: the player coming on. |
| `playerOut` | `PlayerRef \| null \| null` | substitution: the player going off. |
| `drawnBy` | `PlayerRef \| null \| null` | foul (basketball): the player who drew the foul. |
| `stolenBy` | `PlayerRef \| null \| null` | possessionChange (basketball): the player who stole the ball. |
| `goalkeeper` | `PlayerRef \| null \| null` | The goalkeeper the source attaches to a shot (football); the source also sets it on a few basketball shots, meaning not verified. |
| `homeScore` | `number \| null \| null` | scoreChange / penaltyScored: the home score after it; null on other entries. |
| `awayScore` | `number \| null \| null` | scoreChange / penaltyScored: the away score after it; null on other entries. |
| `scoreType` | `PlayByPlayScoreType \| null \| null` | scoreChange (basketball): what the basket was worth; null in football and on other entries. |
| `position` | `CourtPosition \| null \| null` | Basketball: where on the court; null when the source gives no location. |
| `zone` | `CourtZone \| null \| null` | Basketball: the court zone; null when the source gives none. |

### CourtPosition

Where on the court an action happened (basketball), in the source’s court units.

| Field | Type | Description |
| --- | --- | --- |
| `x` | `number` | Horizontal court coordinate, in the source’s court units. |
| `y` | `number` | Vertical court coordinate, in the source’s court units. |

### LeagueDetail

A league profile (/v2/leagues/{id}): the LeagueRef fields plus level, title holder, record holders and the divisions above and below. Host countries are per season (/v2/leagues/{id}/seasons/{seasonId}).

| Field | Type | Description |
| --- | --- | --- |
| `id` | `integer` | Our league id. |
| `name` | `string` | League / competition name. |
| `slug` | `string \| null \| null` | URL slug. |
| `sport` | `string \| null \| null` | Sport slug (as in /v2/sports). |
| `category` | `string \| null \| null` | The source’s grouping of the league: a country ("England"), a region ("International", "North America", "World"), a tour ("ATP", "WTA") or a game (esports: "Counter Strike"). Not always a country — see `country`. |
| `country` | `Country \| null \| null` | The league’s country, when its category is one; null for regions, tours and games. |
| `image` | `string (URL) \| null \| null` | Logo on our CDN; null when the league has no image. |
| `tier` | `integer \| null \| null` | Level in its country’s pyramid: 1 = top flight (Premier League), 2 = second tier (Championship); null for cups, international and non-pyramid competitions. |
| `gender` | `TeamGender \| null \| null` | Men’s or women’s competition; null when the source does not say. |
| `titleHolder` | `TeamRef \| null \| null` | The reigning champion (the last completed season’s winner), when the source names one. |
| `titleHolderTitles` | `integer \| null \| null` | How many times the title holder has won the competition. |
| `mostTitles` | `integer \| null \| null` | The record number of titles won by one team. |
| `mostTitlesTeams` | `TeamRef[]` | The team(s) holding that record (several on a tie); [] when the source names none. |
| `upperDivisions` | `LeagueRef[]` | The league(s) one level up (where promoted teams go); [] for a top flight or a cup. |
| `lowerDivisions` | `LeagueRef[]` | The league(s) one level down (where relegated teams go); [] when none is listed. |
| `currentSeasonStart` | `string (YYYY-MM-DD) \| null \| null` | First day of the current (or upcoming) season, UTC. |
| `currentSeasonEnd` | `string (YYYY-MM-DD) \| null \| null` | Last day of the current season, UTC (planned). |

### RefereeProfile

A referee (/v2/referees/{id}): career totals over every competition the source covers (`games`, cards) and the figures per competition.

| Field | Type | Description |
| --- | --- | --- |
| `id` | `integer` | Our referee id. |
| `name` | `string` | Referee name. |
| `slug` | `string \| null \| null` | URL slug. |
| `country` | `Country \| null \| null` | The referee’s country, when the source gives it. |
| `games` | `integer \| null \| null` | Matches the source has recorded the referee in charge of (career, all competitions). |
| `yellowCards` | `integer \| null \| null` | Yellow cards shown over those matches; null in sports without cards (cricket). |
| `redCards` | `integer \| null \| null` | Straight red cards shown over those matches; null in sports without cards. |
| `yellowRedCards` | `integer \| null \| null` | Second-yellow sending-offs over those matches; null in sports without cards. |
| `image` | `string (URL) \| null \| null` | Photo on our CDN; null when the referee has no image (or it is not uploaded yet). Since 2026-11-04. |
| `sport` | `string \| null \| null` | Sport slug. |
| `competitions` | `RefereeCompetition[]` | Career figures per competition, in the source’s order; [] when the source has none. |

### RefereeCompetition

A referee’s career figures in one competition — divide by `appearances` for a per-match rate.

| Field | Type | Description |
| --- | --- | --- |
| `league` | `LeagueRef` | The competition. |
| `appearances` | `integer` | Matches refereed in it. |
| `yellowCards` | `integer \| null \| null` | Yellow cards shown in those matches. |
| `redCards` | `integer \| null \| null` | Straight red cards shown. |
| `yellowRedCards` | `integer \| null \| null` | Second-yellow sending-offs. |
| `penalties` | `integer \| null \| null` | Penalties awarded. |

### ManagerProfile

A manager / head coach (/v2/managers/{id}): profile, career record and the jobs behind it.

| Field | Type | Description |
| --- | --- | --- |
| `id` | `integer` | Our manager id (the same id as ManagerRef on fixtures and teams). |
| `name` | `string` | Name. |
| `slug` | `string \| null \| null` | URL slug. |
| `shortName` | `string \| null \| null` | Short name, e.g. "J. Mourinho". |
| `image` | `string (URL) \| null \| null` | Photo on our CDN; null when the manager has no image (or it is not uploaded yet). Since 2026-11-04. |
| `sport` | `string \| null \| null` | Sport slug. |
| `country` | `Country \| null \| null` | Nationality. |
| `dateOfBirth` | `string (YYYY-MM-DD) \| null \| null` | Date of birth. |
| `preferredFormation` | `string \| null \| null` | Football: his preferred formation as the source writes it ("4-2-3-1"). |
| `team` | `TeamRef \| null \| null` | The team he manages now; null when without a job. |
| `career` | `ManagerRecord \| null \| null` | Career results over every job the source covers. |
| `stints` | `ManagerStint[]` | His jobs, newest first (like transfer lists); [] when the source has no history. |

### ManagerRecord

A manager’s results over a period (a whole career or one job). Points per game = points / games.

| Field | Type | Description |
| --- | --- | --- |
| `games` | `integer` | Matches in charge. |
| `wins` | `integer` | Won. |
| `draws` | `integer \| null \| null` | Drawn; null in sports without draws. |
| `losses` | `integer` | Lost. |
| `scoresFor` | `number \| null \| null` | Goals (points, …) scored by his teams; null when the source does not give them. |
| `scoresAgainst` | `number \| null \| null` | Conceded. |
| `points` | `number \| null \| null` | Table points won (football: 3 a win, 1 a draw); null when the source does not give them. |

### ManagerStint

One job in a manager’s career.

| Field | Type | Description |
| --- | --- | --- |
| `team` | `TeamRef \| null \| null` | The team he managed. |
| `from` | `string (YYYY-MM-DD) \| null \| null` | First day in charge (UTC). |
| `to` | `string (YYYY-MM-DD) \| null \| null` | Last day in charge (UTC). For the current job the source gives a FUTURE date (the end of his contract as it has it), not null. |
| `record` | `ManagerRecord \| null \| null` | Results in that job; null when the source has none (youth teams, old spells). |

### Trophy

One competition in a team’s trophy cabinet.

| Field | Type | Description |
| --- | --- | --- |
| `league` | `LeagueRef` | The competition won. |
| `competitionType` | `CompetitionType \| null \| null` | National league, national cup or international competition. |
| `major` | `boolean \| null \| null` | Whether the source counts it as a major trophy (a league or cup, not a super cup). |
| `count` | `integer` | Times won. |
| `seasons` | `TrophySeason[]` | The seasons it was won in, newest first (like season lists). May be shorter than `count` for very old titles the source does not date. |

### TrophySeason

A season a trophy was won in (the source gives the label only — no season id).

| Field | Type | Description |
| --- | --- | --- |
| `year` | `string` | Season label as the source writes it ("23/24", "1932/1933", "2026"). |
| `startYear` | `integer \| null \| null` | The year that season started; null when the label cannot be read. |
| `endYear` | `integer \| null \| null` | The year it ended. |

### PositionHistoryPoint

Where a team stood in the table at the end of one week of the season.

| Field | Type | Description |
| --- | --- | --- |
| `week` | `integer` | Week of the season, 1-based (the source’s weekly buckets). |
| `from` | `string (YYYY-MM-DD)` | First day of that week (UTC). |
| `to` | `string (YYYY-MM-DD)` | Last day of that week (UTC, inclusive). |
| `position` | `integer \| null \| null` | The team’s league position at the end of that week. |
| `fixtureIds` | `integer[]` | The team’s fixtures of the competition in that week (our ids; usually one, none in a blank week). |

### FighterCareerStatistics

An MMA fighter’s career statistics as the source computes them over the fights it has detailed data for (not necessarily the whole career): per-round and per-15-minute rates, shares 0–100 and time in position. Keys follow the match-statistics vocabulary (`significantStrikesHeadLanded`, `takedownsSucceeded`, …) with the rate in the name. Null = the source has no figure.

| Field | Type | Description |
| --- | --- | --- |
| `strikesLandedPerRound` | `number \| null \| null` | Strikes landed per round (all strikes). |
| `strikesDistanceLandedPerRound` | `number \| null \| null` | Strikes landed at distance per round. |
| `strikesDistancePercentage` | `number \| null \| null` | Share of his strikes landed at distance, 0–100. Unit: percent. |
| `strikesClinchLandedPerRound` | `number \| null \| null` | Strikes landed in the clinch per round. |
| `strikesClinchPercentage` | `number \| null \| null` | Share landed in the clinch, 0–100. Unit: percent. |
| `strikesGroundLandedPerRound` | `number \| null \| null` | Strikes landed on the ground per round. |
| `strikesGroundPercentage` | `number \| null \| null` | Share landed on the ground, 0–100. Unit: percent. |
| `strikesReceivedPerRound` | `number \| null \| null` | Strikes absorbed per round. |
| `significantStrikesLandedPerRound` | `number \| null \| null` | Significant strikes landed per round. |
| `significantStrikesPercentage` | `number \| null \| null` | Share of his landed strikes that were significant, 0–100. Unit: percent. |
| `significantStrikesHeadLandedPerRound` | `number \| null \| null` | Significant strikes to the head per round. |
| `significantStrikesHeadPercentage` | `number \| null \| null` | Share of significant strikes to the head, 0–100. Unit: percent. |
| `significantStrikesBodyLandedPerRound` | `number \| null \| null` | Significant strikes to the body per round. |
| `significantStrikesBodyPercentage` | `number \| null \| null` | Share to the body, 0–100. Unit: percent. |
| `significantStrikesLegsLandedPerRound` | `number \| null \| null` | Significant strikes to the legs per round. |
| `significantStrikesLegsPercentage` | `number \| null \| null` | Share to the legs, 0–100. Unit: percent. |
| `significantStrikesDistanceLandedPerRound` | `number \| null \| null` | Significant strikes at distance per round. |
| `significantStrikesDistancePercentage` | `number \| null \| null` | Share at distance, 0–100. Unit: percent. |
| `significantStrikesClinchLandedPerRound` | `number \| null \| null` | Significant strikes in the clinch per round. |
| `significantStrikesClinchPercentage` | `number \| null \| null` | Share in the clinch, 0–100. Unit: percent. |
| `significantStrikesGroundLandedPerRound` | `number \| null \| null` | Significant strikes on the ground per round. |
| `significantStrikesGroundPercentage` | `number \| null \| null` | Share on the ground, 0–100. Unit: percent. |
| `significantStrikesReceivedPerRound` | `number \| null \| null` | Significant strikes absorbed per round. |
| `takedownsAttemptedPer15Min` | `number \| null \| null` | Takedowns attempted per 15 minutes of fighting. |
| `takedownsSucceededPer15Min` | `number \| null \| null` | Takedowns landed per 15 minutes. |
| `takedownsSucceededPercentage` | `number \| null \| null` | Takedown accuracy: landed / attempted, 0–100. Unit: percent. |
| `takedownsReceivedPer15Min` | `number \| null \| null` | Takedowns his opponents attempted per 15 minutes. |
| `takedownsDefendedPer15Min` | `number \| null \| null` | Of those, defended per 15 minutes. |
| `takedownsDefendedPercentage` | `number \| null \| null` | Takedown defence: defended / attempted against him, 0–100. Unit: percent. |
| `transitionsSucceededPer15Min` | `number \| null \| null` | Positional transitions (ground advances) made per 15 minutes. |
| `transitionsReceivedPer15Min` | `number \| null \| null` | Transitions his opponents made per 15 minutes. |
| `submissionsAttemptedPer15Min` | `number \| null \| null` | Submission attempts per 15 minutes. |
| `submissionsSucceededPer15Min` | `number \| null \| null` | Submissions finished per 15 minutes. |
| `submissionsSucceededPercentage` | `number \| null \| null` | Submissions finished / attempted, 0–100. Unit: percent. |
| `submissionsReceivedPer15Min` | `number \| null \| null` | Submission attempts against him per 15 minutes. |
| `submissionsDefendedPer15Min` | `number \| null \| null` | Of those, defended per 15 minutes. |
| `submissionsDefendedPercentage` | `number \| null \| null` | Submission defence, 0–100. Unit: percent. |
| `distanceSeconds` | `number \| null \| null` | Time fought at distance, career total. Unit: seconds. |
| `distanceSecondsPerRound` | `number \| null \| null` | Time at distance per round. Unit: seconds. |
| `distancePercentage` | `number \| null \| null` | Share of fight time at distance, averaged per round, 0–100 — the source’s figure: it can pass 100 by a fraction (100.2 seen), and the distance / clinch / ground shares need not add up to 100. Unit: percent. |
| `clinchSeconds` | `number \| null \| null` | Time in the clinch, career total. Unit: seconds. |
| `clinchSecondsPerRound` | `number \| null \| null` | Time in the clinch per round. Unit: seconds. |
| `clinchPercentage` | `number \| null \| null` | Share of fight time in the clinch, averaged per round, 0–100 (see `distancePercentage`). Unit: percent. |
| `clinchControlSeconds` | `number \| null \| null` | Time controlling the opponent in the clinch, career total. Unit: seconds. |
| `clinchControlPercentage` | `number \| null \| null` | Share of fight time in clinch control, 0–100. Unit: percent. |
| `groundSeconds` | `number \| null \| null` | Time on the ground, career total. Unit: seconds. |
| `groundSecondsPerRound` | `number \| null \| null` | Time on the ground per round. Unit: seconds. |
| `groundPercentage` | `number \| null \| null` | Share of fight time on the ground, averaged per round, 0–100 (see `distancePercentage`). Unit: percent. |
| `groundControlSeconds` | `number \| null \| null` | Time in control on the ground, career total. Unit: seconds. |
| `groundControlPercentage` | `number \| null \| null` | Share of fight time in ground control, 0–100. Unit: percent. |

### FighterRecord

An MMA / boxing fighter’s CAREER record (e.g. 28-0-4). Not the same figure as /v2/fixtures/{id}/form, which is the source’s pre-fight form in that event’s competition (e.g. 8-0-3 for the same fighter).

| Field | Type | Description |
| --- | --- | --- |
| `wins` | `integer` | Career wins (professional, every promotion — the source’s career record). |
| `draws` | `integer` | Career draws. |
| `losses` | `integer` | Career losses. |
| `recent` | `RecentFight[]` | The last fights (up to five), oldest first, with the method. The source keeps no career breakdown by method (and lists only the recent fights it covers), so there is none here. |

### RecentFight

One of a fighter’s most recent fights, as the source’s record lists it.

| Field | Type | Description |
| --- | --- | --- |
| `result` | `FormResult` | Win, draw or loss for this fighter. |
| `method` | `FightMethod \| null \| null` | How the fight was decided (KO, TKO, submission, decisions, …); null when the source gives no method. |

## WebSocket server frames

### WsWelcome

First frame after connecting.

| Field | Type | Description |
| --- | --- | --- |
| `type` | `"welcome"` |  |
| `protocol` | `integer` | Protocol version — 4 since 2026-10-23 evening (a fixture entering a list channel arrives as a `fixture` frame); 3 from 2026-10-23, 2 from 2026-10-19. |
| `heartbeatMs` | `integer` | The server pings this often; answer pings (the browser does) or be dropped. |
| `maxChannels` | `integer` | Channels allowed on this connection. |
| `replay` | `boolean` | Whether `lastSeq` replay is available on your plan. |

### WsSnapshot

Full state of a channel: sent on subscribe and on resync.

| Field | Type | Description |
| --- | --- | --- |
| `type` | `"snapshot"` |  |
| `channel` | `string` |  |
| `seq` | `integer` | The channel’s current sequence number. Opaque and increasing — not 0-based; the next delta has seq + 1. |
| `ts` | `integer` | Server time, Unix milliseconds. |
| `data` | `Fixture[] \| Fixture \| RaceSnapshot \| null \| null` | livescores / sport:{slug} / league:{id}: Fixture[] (league: that league’s in-progress fixtures); fixture:{id}: Fixture, or null if unavailable; race:{id}: RaceSnapshot, or null if unavailable. |

### WsDelta

One fixture changed. On livescores / sport:{slug} / league:{id} a delta only names a fixture the channel already gave you (in its snapshot or a `fixture` frame); a fixture that leaves the channel (finished, canceled) gets one last delta saying so. Deltas carry live-feed changes and the corrections a board refresh makes; a score that goes DOWN (a disallowed goal, a corrected basket) arrives up to 1.5 s after the source sends it — the source sometimes re-sends an older score for a moment, and such flaps are dropped; a REST refetch of /fixtures/{id} can still be a few seconds newer — resync now and then if you need it exact.

| Field | Type | Description |
| --- | --- | --- |
| `type` | `"delta"` |  |
| `channel` | `string` |  |
| `seq` | `integer` | Previous seq + 1 on this channel; a gap means a delta was lost — send resync. |
| `ts` | `integer` | Server time, Unix milliseconds. |
| `id` | `integer` | Our fixture id. |
| `sport` | `string` | Sport slug of the fixture. |
| `changes` | `FixturePatch` | The `changes` of a WebSocket delta: a partial Fixture with the same names and nesting. Deep-merge it onto the Fixture you hold — objects merge key by key, any other value (null included) replaces. Only these fields are ever sent. |

### WsFixture

livescores / sport:{slug} / league:{id}: a fixture entered the channel’s set (it kicked off, or the server first saw it) — the whole Fixture, as a snapshot would hold it. Add it to your list; later deltas patch it. Not sent on fixture:{id} channels.

| Field | Type | Description |
| --- | --- | --- |
| `type` | `"fixture"` |  |
| `channel` | `string` |  |
| `seq` | `integer` | Previous seq + 1 on this channel (shared with the deltas). |
| `ts` | `integer` | Server time, Unix milliseconds. |
| `id` | `integer` | Our fixture id. |
| `sport` | `string` | Sport slug of the fixture. |
| `data` | `Fixture` | A match. The same object on every endpoint and in WebSocket snapshots. |

### WsSubscribed

Confirms a subscribe that did not send a snapshot: a `lastSeq` replay (after the replayed frames), or a second subscribe to a channel you are already on.

| Field | Type | Description |
| --- | --- | --- |
| `type` | `"subscribed"` |  |
| `channel` | `string` |  |
| `seq` | `integer` | The channel’s current seq after the replay — the next delta has seq + 1. |
| `ts` | `integer` | Server time, Unix milliseconds. |
| `replayed` | `integer` | How many frames the replay sent (0 = nothing was missed, or a subscribe to a channel you are already on). |

### WsWinProbability

fixture:{id} channels of in-play football fixtures: the win-probability estimate moved by at least one percentage point (checked on every change of the fixture and once a minute). `point` is the endpoint’s `current` (with the reason it moved) and `point.at` is when it was computed — NOT a point of the stored curve, whose minute points sit at minute ends: build a chart from GET /v2/fixtures/{id}/win-probability and keep it current with `?since=`.

| Field | Type | Description |
| --- | --- | --- |
| `type` | `"winProbability"` |  |
| `channel` | `string` |  |
| `seq` | `integer` | Previous seq + 1 on this channel (shared with the channel’s deltas). |
| `ts` | `integer` | Server time, Unix milliseconds. |
| `id` | `integer` | Our fixture id. |
| `sport` | `"football"` | Sport slug of the fixture (win probability is football only). |
| `model` | `WinProbabilityModel` | Model version (the docs describe each). A new version is announced in the changelog. |
| `point` | `WinProbabilityPoint` | A point of the win-probability curve: an estimate and why it was emitted. |

### WsCommentary

fixture:{id} channels of football fixtures: a new AI commentary entry was written. The frame’s `seq` is the channel’s (shared with the deltas); `entry.seq` is the entry’s number in GET /v2/fixtures/{id}/commentary — two different counters.

| Field | Type | Description |
| --- | --- | --- |
| `type` | `"commentary"` |  |
| `channel` | `string` |  |
| `seq` | `integer` | Previous seq + 1 on this channel (shared with the channel’s deltas). |
| `ts` | `integer` | Server time, Unix milliseconds. |
| `id` | `integer` | Our fixture id. |
| `sport` | `"football"` | Sport slug of the fixture (commentary is football only). |
| `entry` | `CommentaryEntry` | One AI commentary entry. |

### WsEvents

fixture:{id} channels of fixtures in play: the match events changed (goal, card, substitution, VAR decision, period, …). Fetched from REST by the server — the live feed carries no events: refetched about 20 s and 45 s after each score, red-card or status change (the source lists a goal 18–33 s after the score moves) and every 30 s while in play (cards and substitutions have no signal). Sent only when the list changed; a goal that is chalked off arrives in `changes.removed`, never before REST confirms it. The list is whole, so a missed frame costs nothing; before the first one, read GET /v2/fixtures/{id}/events.

| Field | Type | Description |
| --- | --- | --- |
| `type` | `"events"` |  |
| `channel` | `string` |  |
| `seq` | `integer` | Previous seq + 1 on this channel (shared with the channel’s deltas). |
| `ts` | `integer` | Server time, Unix milliseconds. |
| `id` | `integer` | Our fixture id. |
| `sport` | `string` | Sport slug of the fixture. |
| `events` | `KeyedIncident[]` | The WHOLE events list now, oldest first — the same incidents as GET /v2/fixtures/{id}/events, each with its key. Replace your copy with it. |
| `changes` | `IncidentChanges` | What an events frame changed against the previous one. |

### WsStatistics

fixture:{id} channels of fixtures in play: the match statistics changed — the whole object, as GET /v2/fixtures/{id}/statistics. Polled from REST every 30 s while someone is subscribed (plus once after full time); sent only when the content changed. Expect ~30–60 s behind the pitch.

| Field | Type | Description |
| --- | --- | --- |
| `type` | `"statistics"` |  |
| `channel` | `string` |  |
| `seq` | `integer` | Previous seq + 1 on this channel (shared with the channel’s deltas). |
| `ts` | `integer` | Server time, Unix milliseconds. |
| `id` | `integer` | Our fixture id. |
| `sport` | `string` | Sport slug of the fixture. |
| `statistics` | `Statistics` | Match statistics, per period. |

### WsLineups

fixture:{id} channels of fixtures in play: the lineups changed — the whole object, as GET /v2/fixtures/{id}/lineups (per-player statistics included). Polled every 30 s while subscribed until they are confirmed and unchanged for 10 minutes; substitutions arrive as events.

| Field | Type | Description |
| --- | --- | --- |
| `type` | `"lineups"` |  |
| `channel` | `string` |  |
| `seq` | `integer` | Previous seq + 1 on this channel (shared with the channel’s deltas). |
| `ts` | `integer` | Server time, Unix milliseconds. |
| `id` | `integer` | Our fixture id. |
| `sport` | `string` | Sport slug of the fixture. |
| `lineups` | `Lineups` | Lineups of both sides. |

### WsPlayByPlay

fixture:{id} channels of football and basketball fixtures in play: the source’s play by play (text commentary) changed. Polled from REST every 20 s while someone is subscribed (the source’s own page re-polls every 15–20 s), plus once after full time; sent only when the list changed, from the first changed entry on. Before the first frame, read GET /v2/fixtures/{id}/play-by-play.

| Field | Type | Description |
| --- | --- | --- |
| `type` | `"playByPlay"` |  |
| `channel` | `string` |  |
| `seq` | `integer` | Previous seq + 1 on this channel (shared with the channel’s deltas). |
| `ts` | `integer` | Server time, Unix milliseconds. |
| `id` | `integer` | Our fixture id. |
| `sport` | `string` | Sport slug of the fixture. |
| `start` | `integer` | Index (0-based) in the whole list of the first entry in `entries`. Keep your first `start` entries, drop the rest, append `entries`. Usually your list’s length (new lines appended); smaller when the source corrected or removed a line. |
| `total` | `integer` | Length of the whole list now (= start + entries.length). Your list is out of step when `start` is beyond its length — read GET /v2/fixtures/{id}/play-by-play again. |
| `entries` | `PlayByPlayEntry[]` | The entries from `start` on, oldest first, as GET /v2/fixtures/{id}/play-by-play lists them. |

### WsMomentum

fixture:{id} channels of football fixtures in play: the momentum graph changed — the whole object, as GET /v2/fixtures/{id}/momentum (one point per minute, so about once a minute). Polled every 30 s while subscribed, plus once after full time; sent only when it changed.

| Field | Type | Description |
| --- | --- | --- |
| `type` | `"momentum"` |  |
| `channel` | `string` |  |
| `seq` | `integer` | Previous seq + 1 on this channel (shared with the channel’s deltas). |
| `ts` | `integer` | Server time, Unix milliseconds. |
| `id` | `integer` | Our fixture id. |
| `sport` | `string` | Sport slug of the fixture. |
| `momentum` | `Momentum` | Momentum graph: per minute (football, basketball, handball, ice hockey, …) or per game (tennis). |

### WsShotmap

fixture:{id} channels of football fixtures in play: the shot map changed (a new shot, or the source corrected one). Polled every 30 s while subscribed, plus once after full time; sent only when it changed. Expect ~30–60 s behind the pitch.

| Field | Type | Description |
| --- | --- | --- |
| `type` | `"shotmap"` |  |
| `channel` | `string` |  |
| `seq` | `integer` | Previous seq + 1 on this channel (shared with the channel’s deltas). |
| `ts` | `integer` | Server time, Unix milliseconds. |
| `id` | `integer` | Our fixture id. |
| `sport` | `string` | Sport slug of the fixture. |
| `shots` | `Shot[]` | The WHOLE shot map now, oldest first, as GET /v2/fixtures/{id}/shotmap. Replace your copy with it. |

### WsRace

race:{id}: the race changed — a session started or ended, a status or schedule moved. The whole Race, as GET /v2/races/{id}. Polled from REST every 60 s while a session runs or starts within 15 minutes (the live feed carries nothing for race sports).

| Field | Type | Description |
| --- | --- | --- |
| `type` | `"race"` |  |
| `channel` | `string` |  |
| `seq` | `integer` | Previous seq + 1 on this channel. |
| `ts` | `integer` | Server time, Unix milliseconds. |
| `id` | `integer` | Our race id. |
| `sport` | `string` | Sport slug of the race (motorsport, cycling). |
| `data` | `Race` | A race: a motorsport race weekend (practice, qualifying, sprint, race) or a cycling race (one-day race or stage race). |

### WsRaceResults

race:{id}: a session’s classification changed. Polled every 30 s while the session runs, and once more when it ends; sent only when it changed.

| Field | Type | Description |
| --- | --- | --- |
| `type` | `"raceResults"` |  |
| `channel` | `string` |  |
| `seq` | `integer` | Previous seq + 1 on this channel. |
| `ts` | `integer` | Server time, Unix milliseconds. |
| `id` | `integer` | Our race id. |
| `sport` | `string` | Sport slug of the race. |
| `session` | `integer \| null \| null` | The session the classification is of. |
| `results` | `RaceResult[]` | The session’s whole classification, as /v2/races/{id}/results?session=. |

### WsUnsubscribed

Confirms an unsubscribe.

| Field | Type | Description |
| --- | --- | --- |
| `type` | `"unsubscribed"` |  |
| `channel` | `string` |  |
| `ts` | `integer` | Server time, Unix milliseconds. |

### WsPing

Application-level heartbeat, sent every heartbeatMs next to the protocol ping. No reply needed.

| Field | Type | Description |
| --- | --- | --- |
| `type` | `"ping"` |  |
| `ts` | `integer` | Server time, Unix milliseconds. |

### WsPong

Reply to your { "type": "ping" }.

| Field | Type | Description |
| --- | --- | --- |
| `type` | `"pong"` |  |
| `ts` | `integer` | Server time, Unix milliseconds. |

### WsError

Something you sent was refused. The connection stays open.

| Field | Type | Description |
| --- | --- | --- |
| `type` | `"error"` |  |
| `code` | `WsErrorCode` | WebSocket error code. |
| `message` | `string` |  |
| `channel` (optional) | `string` |  |
| `ts` | `integer` | Server time, Unix milliseconds. |

## Enums

### Side

A side of the fixture.

| Value | Meaning |
| --- | --- |
| `home` | The fixture’s home side. |
| `away` | The fixture’s away side. |

### Winner

Result of a finished fixture.

| Value | Meaning |
| --- | --- |
| `home` | Home side won. |
| `away` | Away side won. |
| `draw` | Draw. |

### StatusType

Coarse match state — what to filter on.

| Value | Meaning |
| --- | --- |
| `notstarted` | Not started yet (scheduled, or its start is delayed). |
| `inprogress` | Being played — including breaks such as half-time and a fight awaiting its decision. |
| `interrupted` | Stopped mid-match (weather, crowd, …) and expected to resume. |
| `willcontinue` | A multi-day match between days (cricket Tests: end of day N). |
| `postponed` | Moved to a later date; the fixture keeps its id. |
| `canceled` | Will not be played (canceled, abandoned, removed). |
| `finished` | Over, with a result. |

### StatusPhase

Finer match state — what a scoreboard shows.

| Value | Meaning |
| --- | --- |
| `notstarted` | Scheduled, not started. |
| `delayed` | Past its start time, start delayed. |
| `inprogress` | A period is being played (status.period says which). |
| `break` | A scheduled pause inside the match: half-time, pause between sets, awaiting extra time or penalties, cricket lunch / tea / drinks. |
| `awaitingResult` | Play is over, the result is not announced yet (combat sports judges’ decision). |
| `interrupted` | Stopped unexpectedly, expected to resume. |
| `suspended` | Suspended by the organiser; may resume another day. |
| `willcontinue` | A multi-day match between days. |
| `postponed` | Moved to a later date. |
| `canceled` | Canceled before it started, or removed. |
| `abandoned` | Started and called off without a result. |
| `finished` | Over — status.finish says how it was decided. |

### FinishType

How a finished match was decided.

| Value | Meaning |
| --- | --- |
| `regular` | Decided in regulation (also every set / frame / game sport’s normal finish). |
| `overtime` | Decided in overtime / extra time / extra innings (upstream “AET”). |
| `penalties` | Decided by a penalty shoot-out (upstream “AP”). |
| `goldenSet` | Decided by a golden set (volleyball). |
| `walkover` | Awarded without being played. |
| `retired` | One side retired during the match (tennis). |
| `defaulted` | One side was defaulted / disqualified. |

### FightMethod

How a fight was won.

| Value | Meaning |
| --- | --- |
| `ko` | Knockout. |
| `tko` | Technical knockout (referee or doctor stoppage). |
| `submission` | Submission. |
| `unanimousDecision` | Judges’ decision, all judges agreeing. |
| `splitDecision` | Judges’ decision, split. |
| `majorityDecision` | Judges’ decision by a majority: two judges for the winner and one scoring a draw — or, with `winner: "draw"`, a majority draw (two judges scoring a draw; real boxing capture 2026-10-19). |
| `technicalDecision` | Decision on the scorecards after a stoppage. |
| `pointsDecision` | Boxing: a points decision (the source’s PTS — scored by the referee alone, as in British small-hall bouts; a draw comes with `winner: "draw"`). |
| `disqualification` | Disqualification. |
| `noContest` | No contest. |
| `other` | A method not classified yet (the source’s code is logged). |

### FightDiscipline

The combat discipline of a fight.

| Value | Meaning |
| --- | --- |
| `mma` | Mixed martial arts. |
| `boxing` | Boxing. |
| `kickboxing` | Kickboxing. |
| `muayThai` | Muay Thai. |
| `grappling` | Submission grappling. |
| `other` | A discipline not classified yet (the source’s value is logged). |

### SurfaceType

A tennis court surface.

| Value | Meaning |
| --- | --- |
| `hard` | Hard court. |
| `clay` | Clay (red or green). |
| `grass` | Grass. |
| `carpet` | Carpet (indoor synthetic). |
| `other` | A surface not classified yet (the source’s text is in `name`). |

### TossDecision

What a cricket toss winner chose.

| Value | Meaning |
| --- | --- |
| `bat` | The toss winner chose to bat first. |
| `bowl` | The toss winner chose to bowl (field) first. |

### FightCardSection

The part of a fight card a bout is on.

| Value | Meaning |
| --- | --- |
| `mainCard` | The main card. |
| `prelims` | The preliminary card. |
| `earlyPrelims` | The early preliminary card. |
| `other` | A section not classified yet (the source’s value is logged). |

### Position

Playing position, per sport (the source’s letter code is in `positionCode`).

| Value | Meaning |
| --- | --- |
| `goalkeeper` | Goalkeeper (football, futsal, handball). |
| `defender` | Defender (football, futsal). |
| `midfielder` | Midfielder (football, futsal). |
| `forward` | Forward (football, futsal, basketball, ice hockey, rugby). |
| `guard` | Guard (basketball). |
| `center` | Center (basketball, ice hockey, American football). |
| `guardForward` | Guard-forward (basketball). |
| `forwardCenter` | Forward-center (basketball). |
| `goalie` | Goalie (ice hockey). |
| `defenseman` | Defenseman (ice hockey). |
| `leftWing` | Left wing (ice hockey, handball). |
| `rightWing` | Right wing (ice hockey, handball). |
| `leftBack` | Left back (handball). |
| `rightBack` | Right back (handball). |
| `centreBack` | Centre back (handball). |
| `pivot` | Pivot / line player (handball). |
| `quarterback` | Quarterback (American football). |
| `runningBack` | Running back / fullback (American football). |
| `wideReceiver` | Wide receiver (American football). |
| `tightEnd` | Tight end (American football). |
| `offensiveLineman` | Offensive lineman (American football). |
| `offensiveTackle` | Offensive tackle (American football). |
| `offensiveGuard` | Offensive guard (American football). |
| `defensiveTackle` | Defensive tackle / nose tackle (American football). |
| `defensiveEnd` | Defensive end (American football). |
| `defensiveLineman` | Defensive lineman (American football). |
| `linebacker` | Linebacker (American football). |
| `cornerback` | Cornerback (American football). |
| `safety` | Safety (American football). |
| `defensiveBack` | Defensive back (American football). |
| `kicker` | Kicker (American football). |
| `punter` | Punter (American football). |
| `longSnapper` | Long snapper (American football). |
| `pitcher` | Pitcher (baseball). |
| `startingPitcher` | Starting pitcher (baseball). |
| `reliefPitcher` | Relief pitcher (baseball). |
| `catcher` | Catcher (baseball). |
| `firstBase` | First baseman (baseball). |
| `secondBase` | Second baseman (baseball). |
| `thirdBase` | Third baseman (baseball). |
| `shortstop` | Shortstop (baseball). |
| `leftField` | Left fielder (baseball). |
| `centerField` | Center fielder (baseball). |
| `rightField` | Right fielder (baseball). |
| `infielder` | Infielder (baseball). |
| `outfielder` | Outfielder (baseball). |
| `designatedHitter` | Designated hitter (baseball). |
| `batter` | Batter (cricket). |
| `bowler` | Bowler (cricket). |
| `allRounder` | All-rounder (cricket). |
| `wicketKeeper` | Wicket-keeper (cricket). |
| `back` | Back (rugby: any of the backs — the source does not say which). |
| `other` | A position code without a mapping for this sport (`positionCode` keeps it). |

### Availability

Whether a missing player is ruled out or doubtful.

| Value | Meaning |
| --- | --- |
| `out` | Ruled out of this fixture. |
| `doubtful` | May miss this fixture. |

### MissingReason

Why a player is missing.

| Value | Meaning |
| --- | --- |
| `injury` | Injured (`description` names it when known, e.g. "Hamstring Injury"). |
| `illness` | Ill. |
| `suspension` | Suspended (other than a card ban). |
| `absent` | Absent for another reason (personal, international duty, …). |
| `yellowCardSuspension` | Banned for accumulated yellow cards. |
| `yellowRedCardSuspension` | Banned after a second-yellow sending-off. |
| `redCardSuspension` | Banned after a straight red card. |
| `onLoan` | On loan and not eligible against the parent club. |
| `other` | A reason the source sent that this API does not classify yet. |

### StatKind

How to read a statistic’s value and total.

| Value | Meaning |
| --- | --- |
| `value` | `value` is the number shown (57 for "57%", 2.04 for "2.04"); `total` is null. |
| `ratio` | `value` successes out of `total` attempts ("33/53 (62%)" → 33 of 53; a percentage-only display such as "42%" is still value / total). |
| `time` | `value` is seconds; `total` is the seconds available (the period length), e.g. time spent in the lead. |

### HigherIs

Whether more is better.

| Value | Meaning |
| --- | --- |
| `better` | A higher value is good for that side (shots, possession). |
| `worse` | A higher value is bad for that side (fouls, turnovers, errors). |

### IncidentType

What happened.

| Value | Meaning |
| --- | --- |
| `goal` | A score: goal, basket, try, touchdown, … (`detail` says which kind). Set sports (volleyball, table tennis, badminton) do not list points — their set ends are `period` rows. |
| `card` | A card shown to a player (or a team official). |
| `substitution` | A player change: playerIn replaces playerOut. |
| `period` | A period ended — only that: a period still being played has no row (since 2026-10-23). `period` names the period that ended, `text` is the scoreboard label (HT, FT, Q2, 3rd period, 2. set, …). The scores are the running match score at that moment; in set sports (volleyball, table tennis, badminton) the sets won so far (the set’s own points are in the fixture’s `periods` and in /points). |
| `injuryTime` | Added time announced: `addedMinute` minutes after `minute`. |
| `varDecision` | A video-review decision (`detail`), `confirmed` = the original call stood. |
| `inGamePenalty` | A penalty kick during play that did not produce a goal (`detail` missed); a scored one is a `goal` with detail `penalty`. |
| `shootoutPenalty` | One kick of a penalty shoot-out: `shootoutSequence` = the overall kick order (1, 2, 3, … both sides counted), `shootoutRound` = the round (the taker’s side’s 1st, 2nd, … kick). |
| `suspension` | A timed exclusion (ice hockey penalty, handball two minutes): `durationSeconds`, `reason`. |

### IncidentDetail

The kind of incident within its type.

| Value | Meaning |
| --- | --- |
| `regular` | goal: an ordinary goal; substitution: a tactical change. |
| `ownGoal` | goal: scored by the conceding side (`side` = the team credited with the goal). |
| `penalty` | goal: a penalty kick / 7-metre throw converted. |
| `powerPlay` | goal (ice hockey): scored with a man advantage. |
| `shortHanded` | goal (ice hockey): scored a man down. |
| `emptyNet` | goal (ice hockey): scored into an empty net. |
| `onePoint` | goal (basketball): a free throw. |
| `twoPoints` | goal: basketball 2-point field goal; rugby conversion. |
| `threePoints` | goal: basketball 3-pointer; rugby penalty goal or drop goal. |
| `try` | goal (rugby): a try. |
| `touchdown` | goal (American football): a touchdown. |
| `extraPoint` | goal (American football): an extra point. |
| `fieldGoal` | goal (American football): a field goal. |
| `twoPointConversion` | goal (American football): a two-point conversion. |
| `safety` | goal (American football): a safety. |
| `yellow` | card: yellow card. |
| `secondYellow` | card: second yellow, i.e. a sending-off. |
| `red` | card: straight red card. |
| `injury` | substitution: forced by an injury. |
| `goalAwarded` | varDecision: goal given after review. |
| `goalNotAwarded` | varDecision: goal ruled out after review. |
| `penaltyAwarded` | varDecision: penalty given after review. |
| `penaltyNotAwarded` | varDecision: penalty cancelled after review. |
| `cardUpgrade` | varDecision: card upgraded (e.g. yellow → red). |
| `cardDowngrade` | varDecision: card downgraded. |
| `scored` | shootoutPenalty: kick scored. |
| `missed` | shootoutPenalty / inGamePenalty: kick missed or saved (`reason` says which). |
| `twoMinutes` | suspension: a two-minute (minor) penalty. |
| `fiveMinutes` | suspension: a five-minute (major) penalty. |
| `tenMinutes` | suspension: a ten-minute (misconduct) penalty. |
| `other` | A kind the source sent that this API does not classify yet. |

### BodyPart

What the shot was struck with (football).

| Value | Meaning |
| --- | --- |
| `rightFoot` | Right foot. |
| `leftFoot` | Left foot. |
| `head` | Header. |
| `other` | Any other body part. |

### GoalMouthLocation

Where a shot ended relative to the goal (football).

| Value | Meaning |
| --- | --- |
| `lowLeft` | On target, low left (from the shooter’s view). |
| `lowCentre` | On target, low centre. |
| `lowRight` | On target, low right. |
| `highLeft` | On target, high left. |
| `highCentre` | On target, high centre. |
| `highRight` | On target, high right. |
| `left` | Wide left. |
| `right` | Wide right. |
| `high` | Over the bar. |
| `closeLeft` | Just wide left. |
| `closeRight` | Just wide right. |
| `closeHigh` | Just over. |
| `closeHighLeft` | Just over, left. |
| `closeHighRight` | Just over, right. |
| `other` | A location not classified yet. |

### BuildUpAction

What one step of a goal’s build-up was.

| Value | Meaning |
| --- | --- |
| `pass` | A pass (`endPosition` = where it was received). |
| `cross` | A cross (`endPosition` = where it arrived). |
| `throwIn` | A throw-in (`endPosition` = where it landed). Since 2026-10-25. |
| `carry` | The player moved with the ball (the source’s ball-movement; no `endPosition`). Since 2026-10-25. |
| `touch` | A touch that kept the play going — a block, a deflection, a goalkeeper’s parry (the source’s ball-touch). Since 2026-10-25. |
| `savedShot` | A shot the goalkeeper saved; the play went on (a rebound). |
| `missedShot` | A shot that missed; the play went on. Since 2026-10-25. |
| `goal` | The shot that scored — the last step. |
| `other` | An action not classified yet (the source’s value is logged). |

### BestPlayerLabel

What a best-player value measures.

| Value | Meaning |
| --- | --- |
| `rating` | Match rating (football, basketball, …). |
| `points` | Points (ice hockey: goals + assists). |
| `goals` | Goals (handball). |
| `yards` | Yards (American football). |
| `other` | A measure not classified yet. |

### ShotOutcome

What came of a shot.

| Value | Meaning |
| --- | --- |
| `goal` | Scored (basketball: a made field goal). |
| `save` | On target, stopped by the goalkeeper / goalie. |
| `miss` | Off target (basketball: a missed field goal). |
| `block` | Blocked by an outfield player / skater (basketball: a blocked field goal). |
| `post` | Hit the woodwork (football). |

### ShotTechnique

How a shot was taken (ice hockey).

| Value | Meaning |
| --- | --- |
| `wrist` | Wrist shot. |
| `snap` | Snap shot. |
| `slap` | Slap shot. |
| `backhand` | Backhand. |
| `tipIn` | Tip-in. |
| `deflected` | Deflection. |
| `wrapAround` | Wrap-around. |
| `poke` | Poke. |
| `bat` | Batted puck. |
| `other` | A technique not classified yet. |

### ShotSituation

The play a shot came from (football).

| Value | Meaning |
| --- | --- |
| `regular` | Open play, unassisted. |
| `assisted` | Open play, from a team-mate’s pass. |
| `corner` | From a corner kick. |
| `setPiece` | From another set piece. |
| `fastBreak` | On a counter-attack. |
| `freeKick` | A direct free kick. |
| `throwInSetPiece` | From a throw-in routine. |
| `penalty` | A penalty kick in play. |
| `shootout` | A penalty shoot-out kick (`shootoutSequence` = overall kick order, `shootoutRound` = the taker’s side’s round). |
| `other` | A situation not classified yet. |

### ShotGoalType

Kind of goal.

| Value | Meaning |
| --- | --- |
| `regular` | An ordinary goal. |
| `ownGoal` | An own goal (the same name as the incident detail). |
| `penalty` | A converted penalty (in play or in the shoot-out). |

### ShotStrength

Manpower situation (ice hockey).

| Value | Meaning |
| --- | --- |
| `even` | Ice hockey: even strength. |
| `powerPlay` | Ice hockey: the shooting side had a man advantage. |
| `shortHanded` | Ice hockey: the shooting side was a man down. |

### FormResult

A result in a form guide.

| Value | Meaning |
| --- | --- |
| `win` | Won. |
| `draw` | Drew. |
| `loss` | Lost. |

### StreakSide

Whose streak it is.

| Value | Meaning |
| --- | --- |
| `home` | The fixture’s home side has the streak. |
| `away` | The fixture’s away side has the streak. |
| `both` | Both sides (head-to-head streaks: their meetings). |

### StreakKind

What a streak’s figure is: a run in a row, x of the last y, or an average.

| Value | Meaning |
| --- | --- |
| `inARow` | A run in a row: `count` matches ("5"). |
| `ofLast` | `count` of the last `outOf` matches ("7/8"). |
| `average` | An average over recent matches, in `average` ("83" points a game); `count` and `outOf` are null. |

### PointsFormat

Which point-by-point shape a fixture has.

| Value | Meaning |
| --- | --- |
| `tennis` | Tennis: sets → games → points (`sets[].games`). |
| `rally` | Volleyball, table tennis, badminton: sets → points (`sets[].points`). |
| `cricket` | Cricket: innings → overs → balls (`innings`). |
| `baseball` | Baseball: at-bat by at-bat (`atBats`) — pitcher, batter and win probability before / after each. |
| `darts` | Darts: sets → legs → visits (`darts`) — each visit’s score and both players’ remaining scores. |

### TennisPointDescription

How a tennis point was won, when the source says.

| Value | Meaning |
| --- | --- |
| `ace` | An ace: the server won the point on the serve. |
| `doubleFault` | A double fault: the receiver won the point. |
| `other` | A description not classified yet (the source’s code is logged). |

### TennisPointType

What a tennis point meant for one side.

| Value | Meaning |
| --- | --- |
| `won` | Won the point, nothing more to mark. |
| `none` | Nothing to mark for this side — mostly: lost the point (the point that ends a tie-break can be `none` for both). |
| `breakPoint` | After this point the side, receiving, has a break point (one point from breaking serve). |
| `setPoint` | After this point the side has a set point — a match point too when the set decides the match (the source does not tell them apart). Beats breakPoint and miniBreak. |
| `miniBreak` | Tie-break: won this point on the opponent’s serve. |
| `other` | A type not classified yet (the source’s code is logged). |

### BallOutcome

What a cricket delivery produced.

| Value | Meaning |
| --- | --- |
| `dot` | No run. |
| `runs` | Runs off the bat other than a boundary (1, 2, 3, …). |
| `four` | A boundary four. |
| `six` | A six. |
| `wicket` | A wicket fell (see `dismissal`). |
| `wide` | A wide (an extra; the ball is bowled again). |
| `noBall` | A no-ball (an extra; the ball is bowled again). |
| `legBye` | Leg byes (extras off the body). |
| `bye` | Byes (extras past the keeper). |
| `other` | A delivery not classified yet (the source’s code is logged). |

### Dismissal

How a batter was out.

| Value | Meaning |
| --- | --- |
| `caught` | Caught (by a fielder other than the bowler). |
| `caughtAndBowled` | Caught by the bowler. |
| `bowled` | Bowled. |
| `lbw` | Leg before wicket. |
| `runOut` | Run out. |
| `stumped` | Stumped. |
| `hitWicket` | Hit wicket. |
| `retired` | Retired (hurt or out). |
| `obstructingTheField` | Obstructing the field. |
| `timedOut` | Timed out. |
| `other` | A dismissal not classified yet (the source’s text is logged). |

### UmpirePosition

A baseball umpire’s position on the field.

| Value | Meaning |
| --- | --- |
| `homePlate` | Home-plate umpire (calls balls and strikes). |
| `firstBase` | First-base umpire. |
| `secondBase` | Second-base umpire. |
| `thirdBase` | Third-base umpire. |
| `leftField` | Left-field umpire (six-man postseason crews). |
| `rightField` | Right-field umpire (six-man postseason crews). |
| `other` | An assignment not listed here. |

### WeatherCondition

The weather, in a few words.

| Value | Meaning |
| --- | --- |
| `clear` | Clear or sunny. |
| `cloudy` | Cloudy or overcast. |
| `fog` | Fog or mist. |
| `rain` | Rain or showers. |
| `snow` | Snow or sleet. |
| `storm` | Thunderstorm. |
| `other` | A condition not listed here (the source’s own words are in `description`). |

### EsportsRole

A player’s role in an esports game.

| Value | Meaning |
| --- | --- |
| `top` | Top lane (League of Legends). |
| `jungle` | Jungle (League of Legends). |
| `mid` | Mid lane (League of Legends; Dota 2 position 2). |
| `bottom` | Bottom-lane carry (AD carry, League of Legends). |
| `support` | Support (League of Legends). |
| `carry` | Carry, safe lane (Dota 2 position 1). |
| `offlane` | Offlane (Dota 2 position 3). |
| `softSupport` | Soft support (Dota 2 position 4). |
| `hardSupport` | Hard support (Dota 2 position 5). |
| `other` | A role not listed here, or a title without roles (Counter-Strike). |

### BatterState

Where a batter’s innings stands.

| Value | Meaning |
| --- | --- |
| `out` | Dismissed (see `dismissal`). |
| `notOut` | Batted and was not out when the innings closed. |
| `batting` | At the crease now (innings in progress). |
| `didNotBat` | Did not bat (or not yet, while the innings is in progress). |
| `retiredHurt` | Retired hurt — left the crease injured, not dismissed. |
| `other` | A state not classified yet (the source’s code is logged). |

### TeamGender

Whether a team (or competitor) is a men’s, women’s or mixed one.

| Value | Meaning |
| --- | --- |
| `male` | A men’s team (or a male competitor). |
| `female` | A women’s team (or a female competitor). |
| `mixed` | A mixed team (mixed doubles). |

### TeamKind

What a team object stands for: a team, one competitor of an individual sport, or a doubles pair.

| Value | Meaning |
| --- | --- |
| `team` | A team or club (also a national side). |
| `individual` | One competitor of an individual sport (a tennis player, a fighter, a darts player) — see `person`. |
| `pair` | A doubles pair (tennis, badminton, table tennis, beach volleyball). |

### Handedness

The hand a player plays with.

| Value | Meaning |
| --- | --- |
| `right` | Right-handed. |
| `left` | Left-handed. |
| `ambidextrous` | Plays with both hands. |

### DetailedPosition

A detailed playing position (football), from the source’s position codes.

| Value | Meaning |
| --- | --- |
| `goalkeeper` | Goalkeeper (source code GK). |
| `leftBack` | Left back / left wing-back (DL). |
| `centreBack` | Centre back (DC). |
| `rightBack` | Right back / right wing-back (DR). |
| `defensiveMidfielder` | Defensive midfielder (DM). |
| `leftMidfielder` | Left midfielder (ML). |
| `centralMidfielder` | Central midfielder (MC). |
| `rightMidfielder` | Right midfielder (MR). |
| `attackingMidfielder` | Attacking midfielder (AM). |
| `leftWinger` | Left winger (LW). |
| `rightWinger` | Right winger (RW). |
| `striker` | Striker / centre forward (ST). |
| `other` | A code not classified yet (the source’s code is logged). |

### InjuryStatus

How a current injury affects selection.

| Value | Meaning |
| --- | --- |
| `out` | Ruled out until the expected return. |
| `outForSeason` | Out for the rest of the season (the source’s outForSeason, seen on NBA squads 2026-10-25). |
| `dayToDay` | Day to day: may play the next match. |
| `doubtful` | Doubtful for the next match. |
| `other` | A status not classified yet (the source’s value is logged). |

### TransferType

What kind of move a transfer is.

| Value | Meaning |
| --- | --- |
| `transfer` | A permanent move from one team to another (paid, free or undisclosed — see `fee` and `freeTransfer`). |
| `loan` | A loan to another team. |
| `loanEnd` | The end of a loan: back to the parent team. |
| `signed` | Signed by the team, typically as a free agent (`from` is then null). |
| `released` | Released: the contract was terminated. |
| `waived` | Waived (US leagues): put on waivers / let go by the team (`to` is null). |
| `claimed` | Claimed off waivers by another team. |
| `traded` | Traded to another team (US leagues). |
| `draft` | Drafted (`draft` has the round and pick when listed). |
| `contractExpired` | The contract ran out. |
| `tenDayContract` | A 10-day contract (NBA). |
| `secondTenDayContract` | A second 10-day contract with the same team (NBA). |
| `retired` | End of career. |
| `deceased` | The player died. |
| `other` | A move the source sent that this API does not classify yet. |

### StandingsScoreUnit

What a table’s scoresFor / scoresAgainst / scoreDifference count.

| Value | Meaning |
| --- | --- |
| `goals` | Goals (football, futsal, handball, ice hockey, water polo). |
| `points` | Points (basketball, rugby, American football). |
| `runs` | Runs (baseball). |
| `sets` | Sets won and lost (volleyball) — not rally points. |
| `maps` | Maps won and lost (esports). |
| `frames` | Frames (snooker). |
| `legs` | Legs (darts). |

### SearchType

What a search hit is — and so which endpoint its id belongs to.

| Value | Meaning |
| --- | --- |
| `team` | A team — or an individual-sport competitor (tennis player, fighter, driver): /v2/teams/{id}. |
| `player` | A player of a team sport: /v2/players/{id}. |
| `league` | A league / competition: /v2/leagues/{id}. |
| `manager` | A manager / head coach: /v2/managers/{id}. |
| `referee` | A referee: /v2/referees/{id}. |
| `series` | A racing series (Formula 1, MotoGP, …): /v2/series/{id}. |
| `race` | One race of a racing series (a Grand Prix, a cycling race): /v2/races/{id}. |
| `fixture` | A match / fixture (since 2026-11-04): /v2/fixtures/{id}; its teams, league, start and status are in `fixture`. |
| `venue` | A stadium / arena (since 2026-11-04). No endpoint of its own: the id is the one Fixture.venue and TeamDetail.venue carry; city, country and capacity are in `venue`. |

### CompetitionType

What kind of competition it is.

| Value | Meaning |
| --- | --- |
| `domesticLeague` | A national league (LaLiga). |
| `domesticCup` | A national cup or super cup (Copa del Rey, Supercopa). |
| `internationalCup` | An international club or national-team competition (Champions League, UEFA Super Cup). |
| `other` | A type not classified yet (the source’s value is logged). |

### SeasonStatsType

Which matches season statistics cover. Without `type` the endpoints use the season’s first listed type (`overall`, else `regularSeason`).

| Value | Meaning |
| --- | --- |
| `overall` | Every match of the season (football, handball, rugby, European basketball, …). |
| `home` | Home matches only. |
| `away` | Away matches only. |
| `regularSeason` | The regular season (North American leagues: NBA, NHL, … — they have no `overall`). |
| `playoffs` | The playoffs. |

### WinProbabilityModel

Model version (the docs describe each). A new version is announced in the changelog.

| Value | Meaning |
| --- | --- |
| `v1` | The first model (2026-10-22): pre-match from the current competition’s table and form only. Still served for fixtures whose pre-match estimate was fixed before v2 (it is kept once a match starts). |
| `v2` | Since 2026-10-22: pre-match from both teams’ recent matches in all competitions, their domestic league tables and our league-strength coefficients (teams of different leagues on one scale), blended with the current competition’s table as it fills up. In play identical to v1. Still served for fixtures whose pre-match estimate was fixed before v3. |
| `v3` | Since 2026-10-25: v2’s pre-match estimate, except that a league match with a newcomer (one side promoted or relegated into the competition, early in a season) uses the current table and form only, plus the Turkish 1.Lig in the league-strength coefficients; in play, v2’s formula with a calibration step that makes the curve slightly less certain (it was a little over-confident), phased in over the first 15 minutes. |

### WinProbabilityReason

Why a win-probability point was emitted.

| Value | Meaning |
| --- | --- |
| `kickoff` | The match started: the pre-match estimate at minute 0. |
| `minute` | A regular once-a-minute point (time running down moves the estimate even when nothing happens). |
| `goal` | Right after a goal (own goals count for the side credited). |
| `redCard` | Right after a red card (a second yellow included). |
| `periodStart` | A period started: the second half, or a half of extra time. |
| `periodEnd` | A period ended: half-time, the end of regulation, the end of extra time. |
| `bigChance` | Right after a big chance that was not scored (a shot of at least 0.3 expected goals) — marks the moment on the curve; the model (v1 and v2 alike) does not blend live expected goals into the estimate. |
| `final` | The match is over: the result, as certainty (1 / 0 / 0). |

### CommentaryKind

What a commentary entry is about.

| Value | Meaning |
| --- | --- |
| `kickoff` | The match kicked off. |
| `goal` | A goal (own goals and penalties included). |
| `redCard` | A sending-off (a straight red or a second yellow). |
| `missedPenalty` | A penalty during play that was missed or saved (a scored one is a goal). |
| `varDecision` | A video-review decision: goal or penalty given / ruled out, card changed. |
| `bigChance` | A big chance that was not scored (a shot of at least 0.3 expected goals). |
| `momentum` | One side has had sustained pressure for several minutes (the attack-momentum graph). |
| `periodStart` | The second half or a half of extra time started. |
| `periodEnd` | Regulation time or the first half of extra time ended, and play goes on. |
| `halfTime` | Half-time summary. |
| `fullTime` | Full-time summary. |
| `update` | A summary of the match so far, written when commentary starts during a match. |
| `correction` | The source credited a goal already commented to another player: one line naming the scorer it now gives (earlier entries stay as written). Since 2026-10-27. |

### PlayByPlayType

What a play-by-play entry records.

| Value | Meaning |
| --- | --- |
| `matchStarted` | Football: a half (or a half of extra time) kicked off. |
| `matchEnded` | Football: the match is over. |
| `endFirstHalf` | Football: the first half ended. |
| `endSecondHalf` | Football: the second half ended. |
| `periodStart` | Basketball and other clock sports: a period started (the opening tip is a periodStart too). |
| `periodEnd` | Basketball and other clock sports: a period ended. |
| `addedTime` | Football: the fourth official announced added time (the minutes are in `text`). |
| `scoreChange` | The score changed: a goal, or points in basketball (`scoreType` says which); `homeScore` / `awayScore` are the score after it. |
| `shotSaved` | Football: a shot on target that was saved. |
| `shotOffTarget` | A shot that missed: off target (football), a missed field goal (basketball). |
| `shotBlocked` | Football: a shot blocked by a defender. |
| `cornerKick` | Football: a corner kick (`player` = the defender who conceded it; `side` is his side, so the corner was won by the other one). |
| `freeKickWon` | Football: a free kick won (`player` = the player fouled). |
| `freeKickLost` | Football: a foul conceded (`player` = the player who fouled). |
| `offside` | Football: a player caught offside. |
| `yellowCard` | Football: a yellow card. |
| `redCard` | Football: a red card (a second yellow included). |
| `substitution` | A substitution (`playerIn` / `playerOut`). |
| `startDelay` | Football: play stopped (an injury, a delay). |
| `endDelay` | Football: play resumed after a delay. |
| `foul` | Basketball: a foul (`player` = who fouled, `drawnBy` = who drew it). |
| `freeThrowMissed` | Basketball: a missed free throw. |
| `rebound` | Basketball: a rebound (offensive or defensive, see `text`). |
| `possessionChange` | Basketball: a turnover (`stolenBy` = the player who stole the ball, when there was a steal). |
| `jumpBall` | Basketball: a jump ball. |
| `lineupChange` | Basketball: a side’s five on the floor changed (the names are in `text`). |
| `timeout` | A timeout. |
| `stoppage` | Basketball: the clock stopped (out of bounds, …). |
| `review` | An instant-replay review and its outcome (in `text`); in football a VAR decision. |
| `penaltyAwarded` | Football: a penalty kick awarded (`player` = the player fouled, `side` = his side). |
| `penaltyConceded` | Football: a penalty kick conceded (`player` = the player who gave it away, `side` = his side). |
| `penaltyScored` | Football: a goal from a penalty kick in play. `homeScore` / `awayScore` = the score after it, counted on from the previous goal of the list (the source gives none on this entry); null in a penalty shoot-out, which does not change the match score. |
| `penaltyMissed` | Football: a penalty kick missed (off target). |
| `penaltySaved` | Football: a penalty kick saved by the goalkeeper. |
| `violation` | Basketball: a violation (kicked ball, goaltending, …; the kind is in `text`). |
| `other` | Another kind of entry (a value the source added later — read `text`). |

### PlayByPlayScoreType

What a basketball scoring play was worth.

| Value | Meaning |
| --- | --- |
| `freeThrow` | A made free throw (1 point). |
| `twoPointer` | A made two-point field goal. |
| `threePointer` | A made three-point field goal. |
| `other` | Another kind of score. |

### CourtZone

Basketball court zone of an action.

| Value | Meaning |
| --- | --- |
| `underBasket` | Right under the basket. |
| `inThePaint` | In the paint (the lane), away from the basket. |
| `insideLeft` | Inside the three-point line, left baseline side. |
| `insideRight` | Inside the three-point line, right baseline side. |
| `insideCenter` | Inside the three-point line, in front of the basket (mid-range, centre). |
| `insideLeftWing` | Inside the three-point line, left wing. |
| `insideRightWing` | Inside the three-point line, right wing. |
| `outsideLeft` | Beyond the three-point line, left corner. |
| `outsideRight` | Beyond the three-point line, right corner. |
| `outsideCenter` | Beyond the three-point line, top of the key. |
| `outsideLeftWing` | Beyond the three-point line, left wing. |
| `outsideRightWing` | Beyond the three-point line, right wing. |
| `backcourt` | The backcourt (the other half). |
| `other` | Another zone (a value the source added later). |

### RankingTypeSlug

A ranking table we serve — the list with names is GET /v2/rankings.

| Value | Meaning |
| --- | --- |
| `fifa-men` | FIFA World Ranking (men) (football). |
| `uefa-countries` | UEFA country coefficients (football). |
| `uefa-clubs` | UEFA club coefficients (football). |
| `world-rugby-men` | World Rugby Rankings (men) (rugby). |
| `atp` | ATP singles ranking (tennis). |
| `wta` | WTA singles ranking (tennis). |
| `atp-live` | ATP live singles ranking (moves during tournaments) (tennis). |
| `wta-live` | WTA live singles ranking (moves during tournaments) (tennis). |
| `ufc-flyweight` | UFC flyweight rankings (mma). |
| `ufc-bantamweight` | UFC bantamweight rankings (mma). |
| `ufc-featherweight` | UFC featherweight rankings (mma). |
| `ufc-lightweight` | UFC lightweight rankings (mma). |
| `ufc-welterweight` | UFC welterweight rankings (mma). |
| `ufc-middleweight` | UFC middleweight rankings (mma). |
| `ufc-light-heavyweight` | UFC light heavyweight rankings (mma). |
| `ufc-heavyweight` | UFC heavyweight rankings (mma). |
| `ufc-womens-strawweight` | UFC women’s strawweight rankings (mma). |
| `ufc-womens-flyweight` | UFC women’s flyweight rankings (mma). |
| `ufc-womens-bantamweight` | UFC women’s bantamweight rankings (mma). |

### RankingEntry

What one row of a ranking stands for.

| Value | Meaning |
| --- | --- |
| `team` | A team (a national side or a club): `team` is set. |
| `competitor` | One competitor of an individual sport (a tennis player, a fighter) — a team object of kind `individual`: `team` is set. |
| `country` | A country, ranked by its clubs’ results: `country` and `league` (the country’s top league) are set, `team` is null. |

### PlayerStatisticsGroup

Which statistics a player-statistics page carries (every group also has appearances and minutesPlayed, and the sort key).

| Value | Meaning |
| --- | --- |
| `summary` | Goals, expected goals, assists, dribbles, tackles, pass accuracy, rating. |
| `attack` | Shooting and scoring: shots, on / off target, blocked, goal conversion, penalties, set pieces, goals by body part and area, woodwork, offsides. |
| `defense` | Tackles, interceptions, clearances, blocks, errors, own goals, dribbled past, clean sheets, penalties conceded. |
| `passing` | Big chances created, assists, passes and their accuracy by area, key passes, crosses, long balls. |
| `goalkeeping` | Saves (inside / outside the box), clean sheets, penalties faced and saved, goals conceded by area, punches, runs out, high claims. |
| `other` | Cards, duels (ground, aerial, total), minutes, fouls, fouled, dispossessed, possession lost, appearances, starts. |

### SportKind

Which endpoint family a sport’s data lives in.

| Value | Meaning |
| --- | --- |
| `fixtures` | Matches between two sides: /v2/fixtures, /v2/livescores, /v2/leagues/… . |
| `races` | Races with a field of competitors (motorsport, cycling): /v2/races, /v2/series/… . The fixture endpoints have nothing for these sports. |

### RaceSessionType

What a session of a race is.

| Value | Meaning |
| --- | --- |
| `practice` | A practice session (motorsport). |
| `qualifying` | Qualifying — sets the grid of the race (motorsport; also a qualifying part such as Q1 when the source lists it as a session). |
| `sprintQualifying` | Sprint qualifying — sets the grid of the sprint (Formula 1). |
| `sprint` | A sprint race: a short race of its own, with its own points (Formula 1, MotoGP). |
| `race` | The race (motorsport: the Grand Prix / main race; cycling: a one-day race). |
| `stage` | One stage of a cycling stage race (Tour de France stage 5). |
| `other` | A session of a kind not listed here. |

### RaceResultState

Where a competitor stands in a classification.

| Value | Meaning |
| --- | --- |
| `classified` | In the classification, lapped or not (`position` is set unless the source left a gap). |
| `didNotFinish` | Started but did not finish (retired, crashed out); no position. |
| `didNotStart` | Entered but did not start; no position. |
| `disqualified` | Disqualified; no position. |
| `notClassified` | Out of the classification for another reason (the source marks the row out without saying why); no position. |

### TyreCompound

A tyre compound (Formula 1).

| Value | Meaning |
| --- | --- |
| `soft` | Soft slick (the source’s "S"). |
| `medium` | Medium slick ("M"). |
| `hard` | Hard slick ("H"). |
| `intermediate` | Intermediate, for a damp track ("I"). |
| `wet` | Full wet ("W"). |
| `other` | A compound letter not listed here. |

### CyclingJersey

A leader’s jersey in a cycling stage race.

| Value | Meaning |
| --- | --- |
| `general` | Leader of the general classification (the Tour’s yellow jersey). |
| `points` | Leader of the points classification (green in the Tour). |
| `mountains` | Leader of the mountains classification (polka dot in the Tour). |
| `young` | Best young rider (white in the Tour). |
| `other` | A jersey not listed here. |

### StageProfile

The terrain of a cycling stage or one-day race.

| Value | Meaning |
| --- | --- |
| `flat` | Flat — a sprinters’ day. |
| `hilly` | Hilly. |
| `intermediate` | Medium mountains / rolling. |
| `mountain` | Mountains. |
| `highMountain` | High mountains, usually a summit finish. |
| `timeTrial` | Individual time trial. |
| `teamTimeTrial` | Team time trial. |
| `other` | A profile not listed here. |

### RaceWeather

Weather during a session, as the source words it.

| Value | Meaning |
| --- | --- |
| `sunny` | Sunny. |
| `hot` | Hot. |
| `cloudy` | Cloudy. |
| `lightRain` | Light rain. |
| `rain` | Rain. |
| `night` | A night session (the source gives no other weather word for it). |
| `other` | A weather word not listed here. |

### TrackCondition

Track / road surface during a session.

| Value | Meaning |
| --- | --- |
| `dry` | Dry track / road. |
| `wet` | Wet track / road. |
| `other` | A condition not listed here. |

### SeriesStandingsType

Which championship table.

| Value | Meaning |
| --- | --- |
| `competitors` | The drivers’ / riders’ championship. |
| `teams` | The teams’ (constructors’) championship. |

### StandingsSource

Where a standings table comes from — `meta.source` of /standings.

| Value | Meaning |
| --- | --- |
| `upstream` | The table as the data source publishes it. |
| `computed` | Computed by us from the season’s finished fixtures, because the source publishes no such table (NBA and NHL home / away tables). Same columns as the source’s total table; ties ranked by our order, not head-to-head. |

### SeriesFiguresSource

Where a series table’s wins / podiums / polePositions / racesStarted / racesWithPoints come from — `meta.figuresSource` of /series/{id}/standings.

| Value | Meaning |
| --- | --- |
| `upstream` | As the data source publishes them (null where it has none). |
| `computed` | Computed by us from the main race of every finished championship round, because the source publishes only positions and points (MotoGP): wins = 1st, podiums = top 3, polePositions = started from grid position 1, racesStarted = races started (a team: races with at least one entry started), racesWithPoints = races that scored points; a team counts every entry. Sprints are not counted. fastestLaps stays null when the races do not report them. |

### WsErrorCode

WebSocket error code.

| Value | Meaning |
| --- | --- |
| `bad_frame` | The frame was not valid JSON, not a known shape, or lacks a field it needs (`message` names the field, e.g. "channel: required"). |
| `unknown_channel` | Not a channel name we serve (or an unknown sport slug). |
| `channel_forbidden` | The channel is not in your plan’s grade. |
| `unknown_league` | league:{id} names a league id we never issued (use the ids of /v2/leagues and of fixtures’ league) — REST answers the same id with 404 not_found. |
| `unknown_fixture` | fixture:{id} names a fixture id we never issued — REST answers the same id with 404 not_found. The channel is not counted. |
| `unknown_race` | race:{id} names no race (a season or session id, or one we never issued) — /v2/races/{id} answers the same id with 404. The channel is not counted. |
| `not_subscribed` | resync / unsubscribe of a channel this connection is not on. |
| `too_many_channels` | You hit maxChannels on this connection. |
| `snapshot_failed` | The snapshot could not be built — send resync to retry (for league:{id}, when the league id could not be checked right now: subscribe again). |
| `rate_limited` | More than 60 frames in 10 seconds on this connection; frames are dropped until the window resets. |

## Periods

| Key | Meaning |
| --- | --- |
| `periodN` | The Nth regulation period: half (football, rugby, handball, futsal), quarter (basketball, American football, water polo), period (ice hockey), set (tennis, volleyball, table tennis, badminton), inning (baseball), round (combat sports), map / game (esports), leg / frame block (darts, snooker). |
| `inningN` | Cricket: the Nth innings. |
| `extra1` | Football / futsal: first half of extra time. |
| `extra2` | Football / futsal: second half of extra time. |
| `overtime` | Overtime as a whole (basketball, ice hockey, handball, American football, water polo, …; every overtime period together). Baseball: the extra-innings runs, only when the source gives no per-inning breakdown (period10, …). |
| `penalties` | Penalty shoot-out (a `status.period` value; the shoot-out score is ScoreSide.penalties, not a `periods` key). |

## Status codes

| Code | Label | Phase | Type | Finish |
| --- | --- | --- | --- | --- |
| 0 | Not started | notstarted | notstarted |  |
| 1 | 1st period | inprogress | inprogress |  |
| 2 | 2nd period | inprogress | inprogress |  |
| 3 | 3rd period | inprogress | inprogress |  |
| 4 | 4th period | inprogress | inprogress |  |
| 5 | 5th period | inprogress | inprogress |  |
| 6 | 1st half | inprogress | inprogress |  |
| 7 | 2nd half | inprogress | inprogress |  |
| 8 | 1st set | inprogress | inprogress |  |
| 9 | 2nd set | inprogress | inprogress |  |
| 10 | 3rd set | inprogress | inprogress |  |
| 11 | 4th set | inprogress | inprogress |  |
| 12 | 5th set | inprogress | inprogress |  |
| 13 | 1st quarter | inprogress | inprogress |  |
| 14 | 2nd quarter | inprogress | inprogress |  |
| 15 | 3rd quarter | inprogress | inprogress |  |
| 16 | 4th quarter | inprogress | inprogress |  |
| 20 | Started | inprogress | inprogress |  |
| 21 | 1st inning | inprogress | inprogress |  |
| 22 | 2nd inning | inprogress | inprogress |  |
| 23 | 3rd inning | inprogress | inprogress |  |
| 24 | 4th inning | inprogress | inprogress |  |
| 25 | 5th inning | inprogress | inprogress |  |
| 26 | 6th inning | inprogress | inprogress |  |
| 27 | 7th inning | inprogress | inprogress |  |
| 28 | 8th inning | inprogress | inprogress |  |
| 29 | 9th inning | inprogress | inprogress |  |
| 30 | Pause | break | inprogress |  |
| 31 | Halftime | break | inprogress |  |
| 32 | Awaiting extra time | break | inprogress |  |
| 33 | Extra time halftime | break | inprogress |  |
| 34 | Awaiting penalties | break | inprogress |  |
| 40 | Overtime | inprogress | inprogress |  |
| 41 | 1st extra | inprogress | inprogress |  |
| 42 | 2nd extra | inprogress | inprogress |  |
| 43 | Lunch | break | inprogress |  |
| 44 | Tea break | break | inprogress |  |
| 45 | Innings break | break | inprogress |  |
| 46 | Extra innings | inprogress | inprogress |  |
| 47 | Dinner | break | inprogress |  |
| 48 | Drinks | break | inprogress |  |
| 50 | Penalties | inprogress | inprogress |  |
| 51 | Penalties | inprogress | inprogress |  |
| 52 | Shootout | inprogress | inprogress |  |
| 53 | 1st round | inprogress | inprogress |  |
| 54 | 2nd round | inprogress | inprogress |  |
| 55 | 3rd round | inprogress | inprogress |  |
| 56 | 4th round | inprogress | inprogress |  |
| 57 | 5th round | inprogress | inprogress |  |
| 58 | Awaiting announcement | awaitingResult | inprogress |  |
| 60 | Postponed | postponed | postponed |  |
| 61 | Start delayed | delayed | notstarted |  |
| 70 | Canceled | canceled | canceled |  |
| 80 | Interrupted | interrupted | interrupted |  |
| 81 | Suspended | suspended | interrupted |  |
| 90 | Abandoned | abandoned | canceled |  |
| 91 | Walkover | finished | finished | walkover |
| 92 | Retired | finished | finished | retired |
| 93 | Removed | canceled | canceled |  |
| 97 | Home defaulted | finished | finished | defaulted |
| 98 | Away defaulted | finished | finished | defaulted |
| 100 | Ended | finished | finished | regular |
| 110 | After overtime | finished | finished | overtime |
| 120 | After penalties | finished | finished | penalties |
| 130 | After golden set | finished | finished | goldenSet |
| 140 | Will continue | willcontinue | willcontinue |  |
| 141 | End of day 1 | willcontinue | willcontinue |  |
| 142 | End of day 2 | willcontinue | willcontinue |  |
| 143 | End of day 3 | willcontinue | willcontinue |  |
| 144 | End of day 4 | willcontinue | willcontinue |  |
| 301 | First break | break | inprogress |  |
| 302 | Second break | break | inprogress |  |
| 303 | Third break | break | inprogress |  |
| 441 | 6th set | inprogress | inprogress |  |
| 442 | 7th set | inprogress | inprogress |  |
| 445 | Break | break | inprogress |  |
| 500 | Not played | canceled | canceled |  |
| 1001 | Game 1 | inprogress | inprogress |  |
| 1002 | Game 2 | inprogress | inprogress |  |
| 1003 | Game 3 | inprogress | inprogress |  |
| 1004 | Game 4 | inprogress | inprogress |  |
| 1005 | Game 5 | inprogress | inprogress |  |
| 1006 | Game 6 | inprogress | inprogress |  |
| 1007 | Game 7 | inprogress | inprogress |  |

## Positions

### football

| Code | Position |
| --- | --- |
| `G` | goalkeeper |
| `D` | defender |
| `M` | midfielder |
| `F` | forward |

### futsal

| Code | Position |
| --- | --- |
| `G` | goalkeeper |
| `D` | defender |
| `M` | midfielder |
| `F` | forward |

### basketball

| Code | Position |
| --- | --- |
| `G` | guard |
| `F` | forward |
| `C` | center |
| `GF` | guardForward |
| `FG` | guardForward |
| `FC` | forwardCenter |
| `CF` | forwardCenter |

### ice-hockey

| Code | Position |
| --- | --- |
| `G` | goalie |
| `D` | defenseman |
| `C` | center |
| `L` | leftWing |
| `R` | rightWing |
| `F` | forward |
| `W` | leftWing |

### handball

| Code | Position |
| --- | --- |
| `G` | goalkeeper |
| `LW` | leftWing |
| `RW` | rightWing |
| `LB` | leftBack |
| `RB` | rightBack |
| `CB` | centreBack |
| `P` | pivot |
| `B` | centreBack |

### american-football

| Code | Position |
| --- | --- |
| `QB` | quarterback |
| `RB` | runningBack |
| `FB` | runningBack |
| `WR` | wideReceiver |
| `TE` | tightEnd |
| `OL` | offensiveLineman |
| `T` | offensiveTackle |
| `OT` | offensiveTackle |
| `G` | offensiveGuard |
| `OG` | offensiveGuard |
| `C` | center |
| `DT` | defensiveTackle |
| `DE` | defensiveEnd |
| `DL` | defensiveLineman |
| `NT` | defensiveTackle |
| `LB` | linebacker |
| `ILB` | linebacker |
| `OLB` | linebacker |
| `CB` | cornerback |
| `SAF` | safety |
| `S` | safety |
| `FS` | safety |
| `SS` | safety |
| `DB` | defensiveBack |
| `K` | kicker |
| `P` | punter |
| `LS` | longSnapper |

### baseball

| Code | Position |
| --- | --- |
| `P` | pitcher |
| `SP` | startingPitcher |
| `RP` | reliefPitcher |
| `C` | catcher |
| `1B` | firstBase |
| `2B` | secondBase |
| `3B` | thirdBase |
| `SS` | shortstop |
| `LF` | leftField |
| `CF` | centerField |
| `RF` | rightField |
| `IF` | infielder |
| `OF` | outfielder |
| `DH` | designatedHitter |

### cricket

| Code | Position |
| --- | --- |
| `BM` | batter |
| `B` | bowler |
| `AR` | allRounder |
| `WK` | wicketKeeper |

### rugby

| Code | Position |
| --- | --- |
| `F` | forward |
| `B` | back |

## Statistic keys

### american-football

| Key | Name | Group | Higher is | Kind |
| --- | --- | --- | --- | --- |
| `touchdowns` | Touchdowns | Offense | better | value |
| `fieldGoalsMade` | Field goals | Offense | better | ratio |
| `totalYards` | Total yards | Offense | better | value |
| `turnovers` | Turnovers | Offense | worse | value |
| `redZoneConversion` | Red zone efficiency | Offense | better | ratio |
| `timeOfPossession` | Time of Possession | Offense | better | time |
| `firstDowns` | First downs | Offense | better | value |
| `penaltyFirstDowns` | First downs by penalty | Offense | better | value |
| `thirdDownConversion` | Third down efficiency | Offense | better | ratio |
| `punts` | Punts | Offense | worse | value |
| `puntingYardsPerPunt` | Average yards per punt | Offense | better | value |
| `yardsPerPlay` | Average yards per play | Offense | better | value |
| `passingFirstDowns` | First downs by passing | Passing | better | value |
| `passingNetYards` | Net yards passing | Passing | better | value |
| `passingYards` | Gross yards passing | Passing | better | value |
| `passingTouchdowns` | Passing touchdowns | Passing | better | value |
| `passingInterceptions` | Interceptions thrown | Passing | worse | value |
| `passingYardsPerAttempt` | Average passing yards per attempt | Passing | better | value |
| `passingRedZoneAttempts` | Red zone passing attempts | Passing | better | value |
| `rushingAttempts` | Rushing attempts | Rushing | better | value |
| `rushingYards` | Rushing yards | Rushing | better | value |
| `rushingYardsPerAttempt` | Average rushing yards per attempt | Rushing | better | value |
| `rushingFirstDowns` | First downs by rushing | Rushing | better | value |
| `rushingRedZoneAttempts` | Red zone rushing attempts | Rushing | better | value |
| `penalties` | Penalties | Other | worse | value |
| `penaltyYards` | Yards penalized | Other | worse | value |
| `fumbles` | Fumbles | Other | worse | value |
| `fumblesLost` | Fumbles lost | Other | worse | value |

### badminton

| Key | Name | Group | Higher is | Kind |
| --- | --- | --- | --- | --- |
| `pointsWon` | Points won | Points | better | value |
| `maxPointsInRow` | Max points in a row | Points | better | value |
| `matchPoints` | Match points | Points | better | value |
| `comebackToWin` | Comeback to win | Points | better | value |
| `biggestLead` | Biggest lead | Points | better | value |

### baseball

| Key | Name | Group | Higher is | Kind |
| --- | --- | --- | --- | --- |
| `battingRuns` | Runs | Batting | better | value |
| `battingDoubles` | Doubles | Batting | better | value |
| `battingTriples` | Triples | Batting | better | value |
| `battingHomeRuns` | Home runs | Batting | better | value |
| `battingStrikeOuts` | Strike outs | Batting | worse | value |
| `battingBaseOnBalls` | Base on balls | Batting | better | value |
| `battingHits` | Hits | Batting | better | value |
| `battingAvg` | AVG | Batting | better | value |
| `battingObp` | OBP | Batting | better | value |
| `battingSlg` | SLG | Batting | better | value |
| `battingOps` | OPS | Batting | better | value |
| `battingRbi` | RBI | Batting | better | value |
| `battingAtBats` | At bats | Batting | better | value |
| `battingLeftOnBase` | Left on base | Batting | worse | value |
| `pitchingRuns` | Runs | Pitching | worse | value |
| `pitchingHomeRuns` | Home runs | Pitching | worse | value |
| `pitchingStrikeOuts` | Strike outs | Pitching | better | value |
| `pitchingBaseOnBalls` | Base on balls | Pitching | worse | value |
| `pitchingHits` | Hits | Pitching | worse | value |
| `pitchingEra` | ERA | Pitching | worse | value |
| `pitchingInningsPitched` | Innings pitched | Pitching | better | value |
| `pitchingEarnedRuns` | Earned runs | Pitching | worse | value |
| `pitchingBattersFaced` | Batters faced | Pitching | better | value |
| `pitchingOuts` | Outs | Pitching | better | value |
| `fieldingAssists` | Assists | Fielding | better | value |
| `fieldingPutOuts` | Put outs | Fielding | better | value |

### basketball

| Key | Name | Group | Higher is | Kind |
| --- | --- | --- | --- | --- |
| `freeThrowsMade` | Free throws | Scoring | better | ratio |
| `twoPointersMade` | 2 pointers | Scoring | better | ratio |
| `threePointersMade` | 3 pointers | Scoring | better | ratio |
| `fieldGoalsMade` | Field goals | Scoring | better | ratio |
| `rebounds` | Rebounds | Other | better | value |
| `defensiveRebounds` | Defensive rebounds | Other | better | value |
| `offensiveRebounds` | Offensive rebounds | Other | better | value |
| `assists` | Assists | Other | better | value |
| `turnovers` | Turnovers | Other | worse | value |
| `steals` | Steals | Other | better | value |
| `blocks` | Blocks | Other | better | value |
| `fouls` | Fouls | Other | worse | value |
| `timeouts` | Timeouts | Other | better | value |
| `maxPointsInRow` | Max points in a row | Lead | better | value |
| `timeSpentInLead` | Time spent in lead | Lead | better | time |
| `leadChanges` | Lead changes | Lead | better | value |
| `biggestLead` | Biggest lead | Lead | better | value |

### darts

| Key | Name | Group | Higher is | Kind |
| --- | --- | --- | --- | --- |
| `threeDartAverage` | Average 3 darts | Attacking | better | value |
| `thrown180` | Thrown 180 | Attacking | better | value |
| `thrownOver140` | Thrown over 140 | Attacking | better | value |
| `thrownOver100` | Thrown over 100 | Attacking | better | value |
| `highestCheckout` | Highest checkout | Attacking | better | value |
| `checkoutsOver100` | Checkouts over 100 | Attacking | better | value |
| `checkouts` | Checkouts accuracy | Attacking | better | ratio |

### football

| Key | Name | Group | Higher is | Kind |
| --- | --- | --- | --- | --- |
| `ballPossession` | Ball possession | Match overview | better | value |
| `expectedGoals` | Expected goals | Match overview | better | value |
| `bigChances` | Big chances | Match overview | better | value |
| `totalShots` | Total shots | Match overview | better | value |
| `saves` | Goalkeeper saves | Match overview | better | value |
| `cornerKicks` | Corner kicks | Match overview | better | value |
| `fouls` | Fouls | Match overview | worse | value |
| `passes` | Passes | Match overview | better | value |
| `tackles` | Tackles | Match overview | better | value |
| `freeKicks` | Free kicks | Match overview | better | value |
| `yellowCards` | Yellow cards | Match overview | worse | value |
| `shotsOnGoal` | Shots on target | Shots | better | value |
| `hitWoodwork` | Hit woodwork | Shots | worse | value |
| `shotsOffGoal` | Shots off target | Shots | worse | value |
| `shotsBlocked` | Blocked shots | Shots | worse | value |
| `shotsInsideBox` | Shots inside box | Shots | better | value |
| `shotsOutsideBox` | Shots outside box | Shots | better | value |
| `bigChancesMissed` | Big chances missed | Attack | worse | value |
| `touchesInPenaltyArea` | Touches in penalty area | Attack | better | value |
| `fouledFinalThird` | Fouled in final third | Attack | better | value |
| `offsides` | Offsides | Attack | worse | value |
| `accuratePasses` | Accurate passes | Passes | better | value |
| `throwIns` | Throw-ins | Passes | better | value |
| `finalThirdEntries` | Final third entries | Passes | better | value |
| `finalThirdPhaseStatistic` | Final third phase | Passes | better | ratio |
| `accurateLongBalls` | Long balls | Passes | better | ratio |
| `accurateCrosses` | Crosses | Passes | better | ratio |
| `duelsWonPercentage` | Duels | Duels | better | value |
| `dispossessed` | Dispossessed | Duels | worse | value |
| `groundDuelsWon` | Ground duels | Duels | better | ratio |
| `aerialDuelsWon` | Aerial duels | Duels | better | ratio |
| `successfulDribbles` | Dribbles | Duels | better | ratio |
| `tacklesWon` | Tackles won | Defending | better | ratio |
| `interceptions` | Interceptions | Defending | better | value |
| `recoveries` | Recoveries | Defending | better | value |
| `clearances` | Clearances | Defending | better | value |
| `errorsLeadingToShot` | Errors lead to a shot | Defending | worse | value |
| `errorsLeadingToGoal` | Errors lead to a goal | Defending | worse | value |
| `diveSaves` | Big saves | Goalkeeping | better | value |
| `highClaims` | High claims | Goalkeeping | better | value |
| `punches` | Punches | Goalkeeping | better | value |
| `goalKicks` | Goal kicks | Goalkeeping | better | value |
| `kilometersCovered` | Distance covered | Match overview | better | value |
| `numberOfSprints` | Number of sprints | Match overview | better | value |
| `redCards` | Red cards | Match overview | worse | value |
| `averageRating` | Average rating | Match overview | better | value |
| `expectedGoalsOnTarget` | Expected goals on target | Shots | better | value |
| `bigChancesScored` | Big chances scored | Attack | better | value |
| `accurateThroughBalls` | Through balls | Attack | better | value |
| `goalsPrevented` | Goals prevented | Goalkeeping | better | value |
| `penaltySaves` | Penalty saves | Goalkeeping | better | value |

### handball

| Key | Name | Group | Higher is | Kind |
| --- | --- | --- | --- | --- |
| `shootingEfficiency` | Shooting efficiency | Goals | better | ratio |
| `wingGoals` | Wing goals | Goals | better | value |
| `fastBreakGoals` | Fastbreak goals | Goals | better | ratio |
| `goals7m` | 7 meters | Goals | better | ratio |
| `goals9m` | 9m goals | Goals | better | value |
| `goals6m` | 6m goals | Goals | better | value |
| `saves` | Saves | Saves | better | ratio |
| `twoMinutePenalties` | 2 min penalty | Penalty | worse | value |
| `yellowCards` | Yellow cards | Penalty | worse | value |
| `redCards` | Red cards | Penalty | worse | value |
| `maxGoalsInRow` | Goal streak | Goals extra | better | value |
| `powerPlayGoals` | Goals in powerplay | Goals extra | better | value |
| `shortHandedGoals` | Shorthanded goals | Goals extra | better | value |
| `steals` | Steals | Other | better | value |
| `technicalFaults` | Technical faults | Other | worse | value |
| `timeouts` | Timeouts | Other | better | value |

### ice-hockey

| Key | Name | Group | Higher is | Kind |
| --- | --- | --- | --- | --- |
| `shotsOnGoal` | Shots on goal | Match overview | better | value |
| `penalties` | Penalties | Match overview | worse | value |
| `penaltyMinutes` | Penalty minutes | Match overview | worse | value |
| `hits` | Hits | Match overview | better | value |
| `blocks` | Blocked shots | Match overview | better | value |
| `takeaways` | Takeaways | Match overview | better | value |
| `giveaways` | Giveaways | Match overview | worse | value |
| `powerPlayConversion` | Power play % | Match overview | better | ratio |
| `faceoffsWon` | Faceoffs won % | Match overview | better | ratio |
| `powerPlayShotConversion` | Power play shot % | Special teams | better | ratio |
| `shortHandedShotConversion` | Shorthanded shot % | Special teams | better | ratio |
| `evenStrengthShotConversion` | Even strength shot % | Special teams | better | ratio |
| `powerPlayFaceoffsWon` | Power play faceoffs | Special teams | better | ratio |
| `shortHandedFaceoffsWon` | Shorthanded faceoffs | Special teams | better | ratio |
| `evenStrengthFaceoffsWon` | Even strength faceoffs | Special teams | better | ratio |
| `fiveOnFourConversion` | 5v4 conversion | Special teams | better | ratio |
| `corsiPercentage` | Corsi % | Advanced | better | value |
| `fenwickPercentage` | Fenwick % | Advanced | better | value |
| `averageShotDistance` | Average shot distance | Advanced | better | value |
| `wristGoals` | Wrist | Shots | better | ratio |
| `slapGoals` | Slap | Shots | better | ratio |
| `backhandGoals` | Backhand | Shots | better | ratio |
| `tipGoals` | Tip | Shots | better | ratio |
| `snapGoals` | Snap | Shots | better | ratio |
| `emptyNetGoals` | Empty net goals | Match overview | better | value |
| `saves` | Saves | Match overview | better | value |
| `puckPossession` | Puck possession | Match overview | better | value |
| `pokeGoals` | Poke | Shots | better | ratio |
| `fiveOnThreeConversion` | 5v3 conversion | Special teams | better | ratio |
| `fourOnThreeConversion` | 4v3 conversion | Special teams | better | ratio |
| `wrapAroundGoals` | Wrap around | Shots | better | ratio |
| `batGoals` | Bat | Shots | better | value |

### mma

| Key | Name | Group | Higher is | Kind |
| --- | --- | --- | --- | --- |
| `durationSeconds` | Statistics time | General |  | value |
| `distanceSeconds` | Distance Seconds | Distance |  | value |
| `distancePercentage` | Distance Percent | Distance |  | value |
| `groundSeconds` | Ground Seconds | Ground |  | value |
| `groundPercentage` | Ground Percent | Ground |  | value |
| `groundClinchSeconds` | Ground Clinch Seconds | Ground |  | value |
| `groundClinchPercentage` | Ground Clinch Percent | Ground |  | value |
| `groundClinchControlSeconds` | Ground Clinch Control Seconds | Ground | better | value |
| `groundClinchControlPercentage` | Ground Clinch Control Percent | Ground | better | value |
| `strikesGroundLanded` | Strikes Ground | Ground | better | value |
| `takedownsAttempted` | Takedowns Attempted | Ground | better | value |
| `takedownsSucceeded` | Takedowns Succeeded | Ground | better | value |
| `takedownsReceived` | Takedowns Received | Ground | worse | value |
| `takedownsDefended` | Takedowns Defended | Ground | better | value |
| `takedownsSucceededPercentage` | Takedown Success Rate | Ground | better | value |
| `takedownsDefendedPercentage` | Takedown Defense Rate | Ground | better | value |
| `transitionsSucceeded` | Transitions Succeeded | Ground | better | value |
| `transitionsReceived` | Transitions Received | Ground | worse | value |
| `submissionsAttempted` | Submissions Attempted | Ground | better | value |
| `submissionsSucceeded` | Submissions Succeeded | Ground | better | value |
| `submissionsReceived` | Submissions Received | Ground | worse | value |
| `submissionsDefended` | Submissions Defended | Ground | better | value |
| `submissionsSucceededPercentage` | Submission Success Rate | Ground | better | value |
| `submissionsDefendedPercentage` | Submission Defense Rate | Ground | better | value |
| `clinchSeconds` | Clinch Seconds | Clinch |  | value |
| `clinchPercentage` | Clinch Percent | Clinch |  | value |
| `clinchControlSeconds` | Clinch Control Seconds | Clinch | better | value |
| `clinchControlPercentage` | Clinch Control Percent | Clinch | better | value |
| `strikesLanded` | Strikes | Strikes | better | value |
| `strikesReceived` | Strikes Received | Strikes | worse | value |
| `strikesDistanceLanded` | Strikes Distance | Strikes | better | value |
| `strikesClinchLanded` | Strikes Clinch | Strikes | better | value |
| `significantStrikesLanded` | Significant Strikes | Strikes | better | value |
| `significantStrikesReceived` | Significant Strikes Received | Strikes | worse | value |
| `significantStrikesDistanceLanded` | Significant Strikes Distance | Strikes | better | value |
| `significantStrikesGroundLanded` | Significant Strikes Ground | Strikes | better | value |
| `significantStrikesClinchLanded` | Significant Strikes Clinch | Strikes | better | value |
| `significantStrikesDistancePercentage` | Significant Strikes Distance Percentage | Strikes | better | value |
| `significantStrikesGroundPercentage` | Significant Strikes Ground Percentage | Strikes | better | value |
| `significantStrikesHeadLanded` | Significant Strikes Head | Strikes | better | value |
| `significantStrikesBodyLanded` | Significant Strikes Body | Strikes | better | value |
| `significantStrikesLegsLanded` | Significant Strikes Legs | Strikes | better | value |
| `significantStrikesHeadPercentage` | Significant Strikes Head Percentage | Strikes | better | value |
| `significantStrikesBodyPercentage` | Significant Strikes Body Percentage | Strikes | better | value |
| `significantStrikesLegsPercentage` | Significant Strikes Legs Percentage | Strikes | better | value |
| `knockdowns` | Knockdowns | Strikes | better | value |

### rugby

| Key | Name | Group | Higher is | Kind |
| --- | --- | --- | --- | --- |
| `tries` | Tries | Scoring | better | value |
| `conversions` | Conversions | Scoring | better | value |
| `tryAssists` | Try assists | Scoring | better | value |
| `penaltyTries` | Penalty tries | Scoring | better | value |
| `penaltyGoals` | Penalty goals | Scoring other | better | value |
| `dropGoals` | Drop goals | Scoring other | better | value |
| `cleanBreaks` | Clean breaks | Scoring other | better | value |
| `carries` | Carries | Scoring other | better | value |
| `ballPossession` | Ball possession | Possession | better | value |
| `passes` | Passes | Possession | better | value |
| `yellowCards` | Yellow cards | Penalty | worse | value |
| `redCards` | Red cards | Penalty | worse | value |
| `penaltiesConceded` | Penalties conceded | Penalty | worse | value |
| `lineoutsWon` | Lineouts | Other | better | ratio |
| `scrumsWon` | Scrums | Other | better | ratio |
| `tackles` | Tackles | Other | better | value |
| `tacklesMissed` | Tackles missed | Other | worse | value |
| `turnovers` | Turnovers | Other | worse | value |
| `turnoversWon` | Turnovers won | Other | better | value |
| `metersRun` | Meters run | Other | better | value |
| `offloads` | Offloads | Other | better | value |

### table-tennis

| Key | Name | Group | Higher is | Kind |
| --- | --- | --- | --- | --- |
| `pointsWon` | Points won | Points | better | value |
| `maxPointsInRow` | Max points in a row | Points | better | value |
| `comebackToWin` | Comeback to win | Points | better | value |
| `biggestLead` | Biggest lead | Points | better | value |
| `servicePointsWon` | Service points won | Points | better | ratio |
| `returnPointsWon` | Receiver points won | Points | better | ratio |
| `serviceErrors` | Service errors | Points | worse | value |
| `timeouts` | Timeouts | Other | better | value |
| `lets` | Number of lets | Other | worse | value |

### tennis

| Key | Name | Group | Higher is | Kind |
| --- | --- | --- | --- | --- |
| `aces` | Aces | Service | better | value |
| `doubleFaults` | Double faults | Service | worse | value |
| `firstServesIn` | First serve | Service | better | ratio |
| `secondServesIn` | Second serve | Service | better | ratio |
| `firstServePointsWon` | First serve points | Service | better | ratio |
| `secondServePointsWon` | Second serve points | Service | better | ratio |
| `serviceGamesPlayed` | Service games played | Service | better | value |
| `breakPointsSaved` | Break points saved | Service | better | ratio |
| `pointsWon` | Total | Points | better | value |
| `servicePointsWon` | Service points won | Points | better | value |
| `returnPointsWon` | Receiver points won | Points | better | value |
| `maxPointsInRow` | Max points in a row | Points | better | value |
| `gamesWon` | Total won | Games | better | value |
| `serviceGamesWon` | Service games won | Games | better | value |
| `maxGamesInRow` | Max games in a row | Games | better | value |
| `winners` | Total | Winners | better | value |
| `forehandWinners` | Forehand | Winners | better | value |
| `backhandWinners` | Backhand | Winners | better | value |
| `volleyWinners` | Volley | Winners | better | value |
| `groundstrokeWinners` | Groundstroke | Winners | better | value |
| `lobWinners` | Lob | Winners | better | value |
| `overheadWinners` | Overhead | Winners | better | value |
| `dropShotWinners` | Drop shot | Winners | better | value |
| `returnWinners` | Return | Winners | better | value |
| `errors` | Total | Errors | worse | value |
| `forehandErrors` | Forehand | Errors | worse | value |
| `backhandErrors` | Backhand | Errors | worse | value |
| `groundstrokeErrors` | Groundstroke | Errors | worse | value |
| `overheadErrors` | Overhead stroke | Errors | worse | value |
| `returnErrors` | Return | Errors | worse | value |
| `unforcedErrors` | Total | Unforced errors | worse | value |
| `forehandUnforcedErrors` | Forehand | Unforced errors | worse | value |
| `backhandUnforcedErrors` | Backhand | Unforced errors | worse | value |
| `volleyUnforcedErrors` | Volley | Unforced errors | worse | value |
| `groundstrokeUnforcedErrors` | Groundstroke | Unforced errors | worse | value |
| `lobUnforcedErrors` | Lob | Unforced errors | worse | value |
| `dropShotUnforcedErrors` | Drop shot | Unforced errors | worse | value |
| `firstServeReturnPointsWon` | First serve return points | Return | better | ratio |
| `secondServeReturnPointsWon` | Second serve return points | Return | better | ratio |
| `returnGamesPlayed` | Return games played | Return | better | value |
| `breakPointsConverted` | Break points converted | Return | better | value |
| `tiebreaks` | Tiebreaks | Miscellaneous | better | value |

### volleyball

| Key | Name | Group | Higher is | Kind |
| --- | --- | --- | --- | --- |
| `serviceErrors` | Errors | Service | worse | value |
| `aces` | Aces | Service | better | value |

HTML: https://sportsapi.app/docs/reference
