# info.description
Free REST API for football data and ML predictions. Access leagues, teams, events, live scores, odds, player stats, and CatBoost-powered match predictions across 30+ leagues.

# paths./api/broadcasts/.get.description
**DEPRECATED.** Use `/api/v2/broadcasts/` instead. Migration mapping:
- `event=X` → `event_id=X`
- `country=X` → `country_code=X` (ISO-2)
- `channel=X` → `channel_id=X` — refers to **internal** TVChannel PK in v2 (v1 used the upstream channel_id).
- `league=X` → `league_id=X`
- `date_from`/`date_to` → ISO-8601 UTC (YYYY-MM-DD still accepted, documented as date-time).
- Response now includes `home_team_id`, `away_team_id`, `league_id` alongside the existing labels (id+label pattern).
- v2 adds pagination (`limit`/`offset`), a detail endpoint, plus the sub-resources `/api/v2/events/{event_id}/broadcasts/` and `/api/v2/tv-channels/{channel_id}/broadcasts/`.

This endpoint will be removed in a future release.

Returns event-to-channel broadcast mappings — which licensed TV channel shows which match, in which country, and at what scheduled start time. Only official rights-holders are ingested — no pirate streams. Filter by `?event=`, `?country=`, `?channel=` (internal channel ID), `?league=`, `?date_from=` / `?date_to=` (YYYY-MM-DD on the event date). Default ordering is by scheduled_start_time.

# paths./api/broadcasts/.get.summary
List official match broadcasts per country

# paths./api/broadcasts/.get.parameters[].description
A page number within the paginated result set.

# paths./api/broadcasts/{id}/.get.description
**DEPRECATED.** Use `/api/v2/broadcasts/{id}/` instead.

# paths./api/events/.get.description
**DEPRECATED.** Use /api/v2/events/ instead. See migration guide below.

Migration map:
- `/api/events/`   → `/api/v2/events/`
- `/api/fixtures/` → `/api/v2/events/?status=notstarted`
- `/api/matches/`  → `/api/v2/events/`

Returns football matches with odds and basic info. Defaults to the next 7 days when no date filters are provided. Spatial fields (lineups, shotmap, momentum, average_positions) are excluded by default — add ?full=true to include them.

# paths./api/events/.get.parameters[].description
Filter matches on or after this date (YYYY-MM-DD)

# paths./api/events/.get.parameters[].description
Filter matches on or before this date (YYYY-MM-DD)

# paths./api/events/.get.parameters[].description
Include spatial data (lineups, shotmap, momentum, average_positions). Default: false.

# paths./api/events/.get.parameters[].description
The initial index from which to return the results.

# paths./api/events/.get.parameters[].description
Filter by season ID (from /api/seasons/). Bypasses the default 7-day window — returns all matches in that season.

# paths./api/events/.get.parameters[].description
Filter by status: notstarted, inprogress, finished, postponed, cancelled

# paths./api/events/.get.parameters[].description
Filter by team name (partial match, case-insensitive)

# paths./api/events/.get.parameters[].description
Filter by team ID — returns matches where the team played home or away (exact match)

# paths./api/events/.get.parameters[].description
IANA timezone for date localisation (e.g. Europe/London). Defaults to UTC.

# paths./api/events/{id}/.get.description
**DEPRECATED.** Use /api/v2/events/ instead. See migration guide below.

Migration map:
- `/api/events/`   → `/api/v2/events/`
- `/api/fixtures/` → `/api/v2/events/?status=notstarted`
- `/api/matches/`  → `/api/v2/events/`

Returns a single match with full detail: odds, half-time scores, xG, referee, team form (last N matches in the same league), head-to-head record, and lineups. All spatial fields (lineups, shotmap, momentum, average_positions) require ?full=true.

# paths./api/events/{id}/.get.parameters[].description
Include spatial data: lineups, shotmap, momentum, average_positions. Default: false.

# paths./api/events/{id}/.get.parameters[].description
IANA timezone for date localisation (e.g. Europe/London). Defaults to UTC.

# paths./api/fixtures/.get.description
**DEPRECATED.** Use /api/v2/events/ instead. See migration guide below.

Migration map:
- `/api/events/`   → `/api/v2/events/`
- `/api/fixtures/` → `/api/v2/events/?status=notstarted`
- `/api/matches/`  → `/api/v2/events/`

Returns football matches with odds and basic info. Defaults to the next 7 days when no date filters are provided. Spatial fields (lineups, shotmap, momentum, average_positions) are excluded by default — add ?full=true to include them.

# paths./api/fixtures/.get.parameters[].description
Filter matches on or after this date (YYYY-MM-DD)

# paths./api/fixtures/.get.parameters[].description
Filter matches on or before this date (YYYY-MM-DD)

# paths./api/fixtures/.get.parameters[].description
Include spatial data (lineups, shotmap, momentum, average_positions). Default: false.

# paths./api/fixtures/.get.parameters[].description
The initial index from which to return the results.

# paths./api/fixtures/.get.parameters[].description
Filter by season ID (from /api/seasons/). Bypasses the default 7-day window — returns all matches in that season.

# paths./api/fixtures/.get.parameters[].description
Filter by status: notstarted, inprogress, finished, postponed, cancelled

# paths./api/fixtures/.get.parameters[].description
Filter by team name (partial match, case-insensitive)

# paths./api/fixtures/.get.parameters[].description
Filter by team ID — returns matches where the team played home or away (exact match)

# paths./api/fixtures/.get.parameters[].description
IANA timezone for date localisation (e.g. Europe/London). Defaults to UTC.

# paths./api/fixtures/{id}/.get.description
**DEPRECATED.** Use /api/v2/events/ instead. See migration guide below.

Migration map:
- `/api/events/`   → `/api/v2/events/`
- `/api/fixtures/` → `/api/v2/events/?status=notstarted`
- `/api/matches/`  → `/api/v2/events/`

Returns a single match with full detail: odds, half-time scores, xG, referee, team form (last N matches in the same league), head-to-head record, and lineups. All spatial fields (lineups, shotmap, momentum, average_positions) require ?full=true.

# paths./api/fixtures/{id}/.get.parameters[].description
Include spatial data: lineups, shotmap, momentum, average_positions. Default: false.

# paths./api/fixtures/{id}/.get.parameters[].description
IANA timezone for date localisation (e.g. Europe/London). Defaults to UTC.

# paths./api/leagues/.get.description
**DEPRECATED.** Use the v2 equivalent. See migration mapping below.

Migration map:
- `/api/leagues/`                → `/api/v2/leagues/`
- `/api/leagues/{id}/`           → `/api/v2/leagues/{id}/`
- `/api/leagues/{id}/standings/` → `/api/v2/leagues/{id}/standings/`

Returns all active football leagues and tournaments. Each entry includes the league name, country, current season ID, and a flag for women's competitions. Cached for 5 minutes.

# paths./api/leagues/.get.parameters[].description
A page number within the paginated result set.

# paths./api/leagues/{id}/.get.description
**DEPRECATED.** Use the v2 equivalent. See migration mapping below.

Migration map:
- `/api/leagues/`                → `/api/v2/leagues/`
- `/api/leagues/{id}/`           → `/api/v2/leagues/{id}/`
- `/api/leagues/{id}/standings/` → `/api/v2/leagues/{id}/standings/`

Returns details for a specific league.

# paths./api/leagues/{id}/standings/.get.description
**DEPRECATED.** Use the v2 equivalent. See migration mapping below.

Migration map:
- `/api/leagues/`                → `/api/v2/leagues/`
- `/api/leagues/{id}/`           → `/api/v2/leagues/{id}/`
- `/api/leagues/{id}/standings/` → `/api/v2/leagues/{id}/standings/`

Returns standings for a league season. Defaults to the current season. Use ?season=ID for a specific season.

# paths./api/live/.get.description
**DEPRECATED.** Use /api/v2/events/?status=inprogress instead. See migration guide below.

Migration map:
- `/api/live/` → `/api/v2/events/?status=inprogress`

Returns matches currently in play with real-time scores, incidents, and statistics. Cached for 30 seconds.

# paths./api/live/.get.parameters[].description
Set to true to include spatial fields (lineups, shotmap, momentum, average_positions). Excluded by default for faster responses.

# paths./api/live/.get.parameters[].description
A page number within the paginated result set.

# paths./api/live/.get.parameters[].description
Timezone for dates (e.g. Europe/Warsaw, America/New_York). Default: Asia/Dubai (UTC+4)

# paths./api/live/{id}/.get.description
**DEPRECATED.** Use /api/v2/events/?status=inprogress instead. See migration guide below.

Migration map:
- `/api/live/` → `/api/v2/events/?status=inprogress`

Returns live details for a specific match.

# paths./api/live/{id}/.get.parameters[].description
Set to true to include spatial fields (lineups, shotmap, momentum, average_positions).

# paths./api/managers/.get.description
**DEPRECATED.** Use `/api/v2/managers/` instead. Migration mapping:
- `?league=X` → `?league_id=X`
- `?profile=X` → `?tactical_profile=X`
- `?search=X` → `?name=X`
- `?page=N` → `?limit=M&offset=(N-1)*M`
- `?ordering=X`: not supported in v2 (sort client-side)

This endpoint will be removed in a future release.

Returns head coaches and managers with their tactical profile and aggregated match statistics. Filter by team, tactical style, or minimum matches managed. Supports free-text search by name and ordering by performance metrics. Cached for 1 hour.

# paths./api/managers/.get.parameters[].description
Filter by league ID — returns managers who have coached in that league

# paths./api/managers/.get.parameters[].description
Minimum number of matches managed (default: 0)

# paths./api/managers/.get.parameters[].description
Sort field — prefix with - for descending. Options: win_pct, avg_goals_scored, avg_goals_conceded, matches_total, avg_yellow_cards, name. Example: -win_pct

# paths./api/managers/.get.parameters[].description
A page number within the paginated result set.

# paths./api/managers/.get.parameters[].description
Filter by tactical profile: attacking, defensive, balanced

# paths./api/managers/.get.parameters[].description
Case-insensitive search across name and short_name fields

# paths./api/managers/.get.parameters[].description
Filter by team ID — returns the manager with an active tenure at that club

# paths./api/managers/.get.parameters[].description
Filter by playing style: possession, counter, pressing, defensive, direct, mixed

# paths./api/managers/{id}/.get.description
**DEPRECATED.** Use `/api/v2/managers/{id}/` instead.

Returns full profile and match statistics for a specific manager by ID.

# paths./api/matches/.get.description
**DEPRECATED.** Use /api/v2/events/ instead. See migration guide below.

Migration map:
- `/api/events/`   → `/api/v2/events/`
- `/api/fixtures/` → `/api/v2/events/?status=notstarted`
- `/api/matches/`  → `/api/v2/events/`

Returns football matches with odds and basic info. Defaults to the next 7 days when no date filters are provided. Spatial fields (lineups, shotmap, momentum, average_positions) are excluded by default — add ?full=true to include them.

# paths./api/matches/.get.parameters[].description
Filter matches on or after this date (YYYY-MM-DD)

# paths./api/matches/.get.parameters[].description
Filter matches on or before this date (YYYY-MM-DD)

# paths./api/matches/.get.parameters[].description
Include spatial data (lineups, shotmap, momentum, average_positions). Default: false.

# paths./api/matches/.get.parameters[].description
The initial index from which to return the results.

# paths./api/matches/.get.parameters[].description
Filter by season ID (from /api/seasons/). Bypasses the default 7-day window — returns all matches in that season.

# paths./api/matches/.get.parameters[].description
Filter by status: notstarted, inprogress, finished, postponed, cancelled

# paths./api/matches/.get.parameters[].description
Filter by team name (partial match, case-insensitive)

# paths./api/matches/.get.parameters[].description
Filter by team ID — returns matches where the team played home or away (exact match)

# paths./api/matches/.get.parameters[].description
IANA timezone for date localisation (e.g. Europe/London). Defaults to UTC.

# paths./api/matches/{id}/.get.description
**DEPRECATED.** Use /api/v2/events/ instead. See migration guide below.

Migration map:
- `/api/events/`   → `/api/v2/events/`
- `/api/fixtures/` → `/api/v2/events/?status=notstarted`
- `/api/matches/`  → `/api/v2/events/`

Returns a single match with full detail: odds, half-time scores, xG, referee, team form (last N matches in the same league), head-to-head record, and lineups. All spatial fields (lineups, shotmap, momentum, average_positions) require ?full=true.

# paths./api/matches/{id}/.get.parameters[].description
Include spatial data: lineups, shotmap, momentum, average_positions. Default: false.

# paths./api/matches/{id}/.get.parameters[].description
IANA timezone for date localisation (e.g. Europe/London). Defaults to UTC.

# paths./api/odds/.get.description
**DEPRECATED.** Use `/api/v2/odds/` instead. Migration mapping:
- `event=X` → `event_id=X`
- `league=X` → `league_id=X`
- `bookmaker=X` → `bookmaker_slug=X` (slug only — display name no longer accepted)
- When `?event=ID` was used, v1 returned an envelope shape. v2 always returns the standard paginated shape. For event-scoped comparison use `/api/v2/events/{id}/odds/comparison/`.
- Default market filter changed from `1x2` to all markets.
- Incoherent market+outcome combinations now return 400 instead of empty results.

This endpoint will be removed in a future release.

Returns odds snapshots from 22+ bookmakers. When the `event` filter is used, returns a single-event envelope: `{event: {id, home_team, away_team, event_date, league}, count, odds: [...]}`. Without `event`, returns a standard paginated list of odds snapshots. Default market filter is `1x2` — use `?market=all` or a specific market code to override.

# paths./api/odds/.get.parameters[].description
Filter by bookmaker name or code (e.g. bet365)

# paths./api/odds/.get.parameters[].description
Event ID — when set, wraps response in an event context object and returns all odds unpaginated

# paths./api/odds/.get.parameters[].description
Odds market code: 1x2, over_under_15, over_under_25, over_under_35, btts, double_chance. Defaults to 1x2.

# paths./api/odds/.get.parameters[].description
Filter by outcome code: HOME, DRAW, AWAY, over, under, yes, no

# paths./api/odds/.get.parameters[].description
A page number within the paginated result set.

# paths./api/odds/{id}/.get.description
Returns one odds snapshot record by ID, including decimal odds and line movement.

# paths./api/odds/best/.get.description
**DEPRECATED.** Use `/api/v2/odds/best/` instead. Migration mapping:
- `days=N` → `date_from=now`, `date_to=now+N days` (or pass an explicit `date_from`/`date_to` pair).

Returns the highest available odds per outcome across all bookmakers for upcoming matches. Useful for finding value bets — each outcome shows the best decimal odds and which bookmaker offers them. Defaults to the 1x2 market and the next 3 days.

# paths./api/odds/best/.get.parameters[].description
Number of days ahead to scan (default: 3, max: 7)

# paths./api/odds/best/.get.parameters[].description
Market code (default: 1x2). E.g. over_under_25, btts.

# paths./api/odds/bookmakers/.get.description
**DEPRECATED.** Use `/api/v2/bookmakers/` instead.

Returns all active bookmakers, with their code, display name, and country of origin.

# paths./api/odds/compare/.get.description
**DEPRECATED.** Use `/api/v2/events/{event_id}/odds/comparison/` instead.

Returns all bookmaker odds for a single event, grouped by market and outcome. Each outcome shows the best available odds and a per-bookmaker breakdown with decimal odds and line movement. Requires the `event` parameter.

# paths./api/odds/compare/.get.parameters[].description
BSD internal event ID (required). Use /api/events/ to look up events — do NOT use external provider IDs (api_id).

# paths./api/odds/compare/.get.parameters[].description
Filter by market code (e.g. 1x2, over_under_25, btts). Omit to return all markets.

# paths./api/odds/polymarket/.get.description
**DEPRECATED.** Use `/api/v2/events/{event_id}/polymarket/` instead.

Returns Polymarket prediction market prices for football matches. Prices represent implied probabilities (0-1). Convert to decimal odds with 1/price. Filter by event or league. Synced every 30 minutes.

# paths./api/player-stats/.get.description
**DEPRECATED.** No direct v2 replacement. To migrate:
- `?player=X` → `/api/v2/players/X/stats/`
- `?event=X` → `/api/v2/events/X/player-stats/`
- `?team=X` → `/api/v2/players/{id}/stats/?team_id=X` (per player) or filter client-side from event-level data

This endpoint will be removed in a future release.

Returns per-match player statistics. 139,000+ records. Filter by player, event, or team. Cached for 5 minutes.

# paths./api/player-stats/.get.parameters[].description
A page number within the paginated result set.

# paths./api/player-stats/.get.parameters[].description
Timezone for dates (e.g. Europe/Warsaw, America/New_York). Default: Asia/Dubai (UTC+4)

# paths./api/player-stats/{id}/.get.description
**DEPRECATED.** No direct v2 replacement. Player stats are accessed via the canonical sub-resources `/api/v2/players/{id}/stats/` or `/api/v2/events/{id}/player-stats/`.

Returns a single per-match player statistics record.

# paths./api/players/.get.description
**DEPRECATED.** Use `/api/v2/players/` instead. Migration mapping:
- `?team=X` → `?team_id=X`
- `?national_team=X` → `?national_team_id=X`
- `?nationality=X` → `?nationality_code=XX` (ISO-2 only)
- `?search=X` → `?name=X`
- `?page=N&page_size=M` → `?limit=M&offset=(N-1)*M`

This endpoint will be removed in a future release.

Returns football player profiles. 8,900+ players. Filter by team, nationality, or position. Cached for 5 minutes.

# paths./api/players/.get.parameters[].description
A page number within the paginated result set.

# paths./api/players/.get.parameters[].description
Filter by position. Generic: G, D, M, F. Or specific: GK, CB, LB, RB, LWB, RWB, DM, CM, LCM, RCM, AM, LW, RW, ST.

# paths./api/players/.get.parameters[].description
Search by player name or short name (case-insensitive)

# paths./api/players/{id}/.get.description
**DEPRECATED.** Use `/api/v2/players/{id}/` instead.

Returns details for a specific player by ID.

# paths./api/predicted-lineup/{event_id}/.get.description
DEPRECATED. Use `/api/v2/events/{event_id}/lineups/` instead. The v2 endpoint unifies official confirmed lineups and AI-predicted lineups under a single URL with a `lineup_status` discriminator (`unavailable` | `predicted` | `confirmed`). The `beta: true` flag from v1 is replaced by `lineup_status: predicted`.

Field mapping:
- `lineups.{home,away}.team` → `lineups.{home,away}.team_name`
- `lineups.{home,away}.predicted_formation` → `lineups.{home,away}.formation`
- `confidence` (0–100) → `lineups.{home,away}.confidence` (0–1)
- `starters` → `lineups.{home,away}.players`
- `bench` → `lineups.{home,away}.substitutes`
- `404` when not generated → `200` with `lineup_status: unavailable`

This endpoint will be removed in a future release.

# paths./api/predictions/.get.description
**DEPRECATED.** Use `/api/v2/predictions/` instead. Migration mapping:
- `upcoming=true` → `status=upcoming` (default)
- `upcoming=false` → `status=past`
- `league=X` → `league_id=X`
- `tz=…` → not supported, all datetimes returned in UTC (Z)
- Response shape changed: fields are now grouped under `markets`, `recommendations`, `model`. See `/api/v2/predictions/` docs.

This endpoint will be removed in a future release.

Returns engine forecasts for football matches (flat legacy shape, probabilities 0-100). Defaults to upcoming matches. Cached for 2 minutes.

# paths./api/predictions/.get.parameters[].description
Start date (YYYY-MM-DD). Overrides upcoming filter.

# paths./api/predictions/.get.parameters[].description
End date (YYYY-MM-DD). Overrides upcoming filter.

# paths./api/predictions/.get.parameters[].description
Filter to upcoming matches only (default: true). Set to false to include past predictions.

# paths./api/predictions/{id}/.get.description
**DEPRECATED.** Use `/api/v2/predictions/{id}/` instead.

Returns forecast details for a specific match.

# paths./api/referees/.get.description
**DEPRECATED.** Use `/api/v2/referees/` instead. Migration mapping:
- `?league=X` → `?league_id=X`
- `?name=X` → `?name=X` (unchanged)
- v2 adds pagination (limit/offset), country_code filter, min_matches filter, and a new detail endpoint at /api/v2/referees/{id}/.

This endpoint will be removed in a future release.

Returns referees with career stats and per-match aggregates (cards, goals, fouls). Filter by league or name. Sorted by matches officiated. Cached 10 minutes.

# paths./api/referees/.get.parameters[].description
Filter by referee name (case-insensitive contains)

# paths./api/seasons/.get.description
**DEPRECATED.** No direct v2 replacement. To migrate:
- `/api/seasons/?league=X` → `/api/v2/leagues/X/seasons/`
- `/api/seasons/?league=X&current=true` → `/api/v2/leagues/X/season/`
- `/api/seasons/?current=true` (global, all leagues): no v2 equivalent. Iterate `/api/v2/leagues/` and call `/api/v2/leagues/{id}/season/` for each league you need.

This endpoint will be removed in a future release.

Returns seasons for all leagues. Use ?league= to filter by league ID, or ?current=true for the current season only.

# paths./api/seasons/.get.parameters[].description
Set to true to return only the current active season per league

# paths./api/seasons/.get.parameters[].description
A page number within the paginated result set.

# paths./api/seasons/{id}/.get.description
**DEPRECATED.** No direct v2 replacement. To resolve a `season_id` returned by other endpoints (e.g. event.season_id), use the parent league's sub-resources: `/api/v2/leagues/{league_id}/seasons/` and filter client-side by ID. This endpoint will be removed in a future release.

Returns a single season by ID.

# paths./api/social/.get.description
**DEPRECATED.** Use `/api/v2/social/` instead. Migration mapping:
- `team=X` → `team_id=X`
- `event=X` → `event_id=X`
- `player=X` → `player_id=X` (still heuristic linking)
- `manager=X` → `manager_id=X`
- `since=X` → `published_after=X` (ISO 8601 UTC)
- `source` field → removed (vendor name no longer exposed)
- `media_urls` → `media` (normalized: `[{type, url, width, height}]`)
- `account_handle`/`account_name`/`account_verified` → grouped under `account` object
- `teams`/`events`/`players`/`managers` arrays → grouped under `linked` object
- v2 adds detail endpoint `/api/v2/social/{id}/` and entity-scoped sub-resources (`/teams/{id}/social/`, `/events/{id}/social/`, `/players/{id}/social/`, `/managers/{id}/social/`).
- v2 adds pagination (`limit`/`offset`).
- v2 excludes `news` items — only `tweet` and `video` are returned.

This endpoint will be removed in a future release.

Returns a blended feed of three item types:
 - **tweet** — posts from official club Twitter accounts
 - **video** — YouTube match-highlight videos
 - **news** — editorial articles from third-party football news sources
Each item carries M2M links to the teams it was pulled from plus heuristic links to the current-squad players, current manager, and nearby match (±36h of publish time) for that team. Tweets refresh every 30 minutes, highlights every 6 hours, news every hour.

# paths./api/social/.get.summary
List social items (tweets, video highlights, news) linked to teams, events, players or managers

# paths./api/social/.get.parameters[].description
A page number within the paginated result set.

# paths./api/social/.get.parameters[].description
ISO date — only items published on/after this date

# paths./api/social/{id}/.get.description
Social items (tweets, video highlights, news) linked to entities.

# paths./api/social/{id}/.get.parameters[].description
A unique integer value identifying this social item.

# paths./api/teams/.get.description
**DEPRECATED.** Use `/api/v2/teams/` instead. Migration mapping:
- `?country=X` → `?country_code=XX` (ISO-2 only)
- `?league=X` → `?league_id=X`
- `?in_competition=true&league=X` → `?in_competition=true&league_id=X`

This endpoint will be removed in a future release.

Returns all football teams. Filter by country, league, and competition status. Cached for 5 minutes.

# paths./api/teams/.get.parameters[].description
Filter to teams still in competition (have upcoming matches in this league). Requires league filter. Values: true/false

# paths./api/teams/.get.parameters[].description
A page number within the paginated result set.

# paths./api/teams/{id}/.get.description
**DEPRECATED.** Use `/api/v2/teams/{id}/` instead.

Returns details for a specific team by ID.

# paths./api/tv-channels/.get.description
**DEPRECATED.** Use `/api/v2/tv-channels/` instead. Migration mapping:
- `country=X` → `country_code=X` (ISO-2)
- `search=X` → `name=X`
- `is_official` → removed (always true, redundant)
- upstream `channel_id` → removed from public response
- v2 adds pagination (`limit`/`offset`) and a detail endpoint at `/api/v2/tv-channels/{id}/`, plus the sub-resource `/api/v2/tv-channels/{id}/broadcasts/`.

This endpoint will be removed in a future release.

Returns the catalogue of licensed TV channels that show live sports, per country. Only official rights-holders are ingested — no pirate streams. Filter by `?country=XX` (ISO-2, e.g. PT, ES, GB) to narrow to one market. Use `?search=` for case-insensitive partial matches on the channel name.

# paths./api/tv-channels/.get.summary
List official TV broadcast channels per country

# paths./api/tv-channels/.get.parameters[].description
ISO-2 country code (e.g. PT, ES, GB). Returns all countries if omitted.

# paths./api/tv-channels/.get.parameters[].description
A page number within the paginated result set.

# paths./api/tv-channels/.get.parameters[].description
Case-insensitive partial match on channel name

# paths./api/tv-channels/{id}/.get.description
**DEPRECATED.** Use `/api/v2/tv-channels/{id}/` instead.

# paths./api/v2/bookmakers/.get.description
All active bookmakers as {slug, name}. No detail endpoint, no pagination, no filters — there are ~15 of them. The `consensus` entry is a synthetic average across the rest, not a real bookmaker.

# paths./api/v2/broadcasts/.get.description
Paginated event-to-channel broadcast mappings. `channel_id` is the **internal PK** of TVChannel (not the upstream channel_id used in v1). Cached 1 hour.

# paths./api/v2/broadcasts/.get.parameters[].description
Broadcasts of events where the team played home or away.

# paths./api/v2/events/.get.description
Lightweight events list. Same shape as detail. Filter by league, season, team, status, or date range. Spatial data (lineups, shotmap, momentum, average_positions) is never included in the list — fetch it from the sub-resources `/events/{id}/lineups/` and `/events/{id}/stats/`.

# paths./api/v2/events/.get.parameters[].description
Filter by season ID. Bypasses the default 7-day window — returns all matches in that season.

# paths./api/v2/events/.get.parameters[].description
Matches where the team played home or away (exact match).

# paths./api/v2/events/.get.parameters[].description
Partial, case-insensitive match on home or away team name.

# paths./api/v2/events/{id}/broadcasts/.get.description
Paginated broadcasts mappings for a single event across countries and channels. Filter to a specific country with `country_code`. Cached 1 hour.

# paths./api/v2/events/{id}/h2h/.get.description
Aggregated head-to-head stats for the two teams in this event. Returns null for all fields if no history is indexed.

# paths./api/v2/events/{id}/incidents/.get.description
**This is where the goalscorers are.** Every incident of the match, in order.

A goal reads `{"type": "goal", "player": "M. Oyarzabal", "minute": 22, "is_home": false, "assist": "D. Olmo"}` — `player` is the scorer, `minute` the minute, and `is_home` the side (false = the event's away team). `assist` is present when there was one. Filter on `type == "goal"` for a scorers list; the same response also carries cards and substitutions.

Goals may include a `sequence`: the build-up positions leading to the goal.

# paths./api/v2/events/{id}/incidents/.get.summary
Event incidents (v2) — goals and scorers, cards, substitutions

# paths./api/v2/events/{id}/lineups/.get.description
Unified lineups endpoint covering three states via the `lineup_status` discriminator:

- `confirmed` — official XI published by the club. Available ~1 hour before kickoff and persists after the match. `confidence` and `ai_score` are always `null` in this state.
- `predicted` — AI-generated lineup with `confidence` and per-player `ai_score` (both 0–1, four decimals). Only served for matches that have not started. The `beta: true` flag is set only in this state.
- `unavailable` — no lineup data yet; `lineups`, `unavailable_players` and `updated_at` are all null. The response is still 200, not 404.

Selection priority: confirmed > predicted > unavailable. Live and finished matches never receive predicted, even if predictions exist in the database.

Replaces the v1 endpoint `/api/predicted-lineup/{id}/`.

# paths./api/v2/events/{id}/metadata/.get.description
Jerseys, pre-match facts, AI-generated preview text.

# paths./api/v2/events/{id}/odds/.get.description
Consensus decimal odds. Markets: 1X2, Over/Under {1.5,2.5,3.5}, BTTS.

# paths./api/v2/events/{id}/odds/comparison/.get.description
All bookmakers side-by-side for a single event. Outcome keys are codes (HOME/DRAW/AWAY/over/under/...), not team names — stable parsing even when teams are renamed. Bookmaker keys are slugs. Cached 3 min. Event with no odds returns {markets: {}}; missing event returns 404.

# paths./api/v2/events/{id}/odds/comparison/.get.summary
Side-by-side bookmaker comparison for an event (v2)

# paths./api/v2/events/{id}/player-stats/.get.description
Per-player statistics for every player who appeared in this match (typically 22+ records). Tagged under v2 / Players because the records belong to the players domain.

# paths./api/v2/events/{id}/polymarket/.get.description
Polymarket prediction-market prices for one event. Prices are implied probabilities (0–1); decimal odds = 1/price. Distinct shape from traditional odds. Cached 1 min.

# paths./api/v2/events/{id}/prediction/.get.description
Returns the CatBoost ML prediction associated with this event. The response shape matches /api/v2/predictions/{id}/. Tagged under v2 / Events because the resource hangs off the events namespace, consistent with /events/{id}/stats/ etc.

# paths./api/v2/events/{id}/social/.get.description
Paginated tweets and video highlights linked to this event. No temporal filters — the event already bounds the window. Cached 15 min.

# paths./api/v2/events/{id}/stats/.get.description
Per-team merged stats (live + provider-only counters), shotmap, momentum, average positions, per-minute xG.

# paths./api/v2/events/live/.get.description
Lightweight list of events in their live window (event_date − 5 min to ~10 min after final whistle). Designed for high-frequency polling by livetracker dashboards. Cached in Redis with TTL 30 s. For full event detail use /api/v2/events/{id}/.

# paths./api/v2/events/live/.get.parameters[].description
Matches where the team played home or away.

# paths./api/v2/leagues/.get.description
Paginated leagues list. Returns only active leagues by default; pass `include_inactive=true` to include inactive ones too. Filter by country and women/men.

# paths./api/v2/leagues/.get.parameters[].description
ISO country name (case-insensitive exact match).

# paths./api/v2/leagues/.get.parameters[].description
Set to true to include inactive leagues in the response. Default behavior (omit or false) returns only active leagues.

# paths./api/v2/leagues/{id}/bestxi/{season_id}/.get.description
Best-performing player per position (1-4-3-3) across the whole season, ranked by average match rating. Requires at least 450 minutes played to qualify (roughly 5 full matches), so early-season results won't be skewed by a single big performance.

# paths./api/v2/leagues/{id}/bestxi/{season_id}/{round_number}/.get.description
Best-performing player per position (1-4-3-3) within one specific round of a season, ranked by match rating. Requires at least 45 minutes played to qualify.

# paths./api/v2/leagues/{id}/season/.get.description
The season currently flagged as active for this league. Returns null if none is marked current (e.g. between cycles).

# paths./api/v2/leagues/{id}/seasons/.get.description
All seasons we have on file for this league, newest first.

# paths./api/v2/leagues/{id}/seasons/{season_id}/venues/.get.description
Venues assigned to a specific league + season. Replaces the legacy `/api/worldcup/venues/` endpoint for FIFA World Cup 2026 — and works the same way for any league/season pair.

# paths./api/v2/leagues/{id}/seasons/{season_id}/venues/.get.parameters[].description
Restrict to venues in this host country (ISO 3166-1 alpha-2).

# paths./api/v2/leagues/{id}/seasons/{season_id}/venues/.get.parameters[].description
Restrict to venues hosting this knockout round.

# paths./api/v2/leagues/{id}/standings/.get.description
Standings for one season (defaults to current). Cup competitions return a `groups` map; league competitions return a flat `standings` array.

# paths./api/v2/leagues/{id}/standings/.get.parameters[].description
Season ID. Defaults to the league's current season.

# paths./api/v2/leagues/{id}/top/{stat}/.get.description
Top players in one season for a given stat: `scorers` (goals), `assists`, `yellowcards`, `redcards`, or `fouls`. Defaults to the league's current season.

# paths./api/v2/leagues/{id}/top/{stat}/.get.parameters[].description
Number of players to return (default 20, max 50).

# paths./api/v2/leagues/{id}/top/{stat}/.get.parameters[].description
Season ID. Defaults to the league's current season.

# paths./api/v2/leagues/{id}/venues/.get.description
Venues assigned to this league across one or more seasons. Each row is a `VenueCompetition` record with the `venue` embedded.

# paths./api/v2/managers/.get.description
Paginated managers list with computed match aggregates. Filter by current club, league experience, nationality (ISO-2), tactical profile, primary team style, minimum matches, or name.

# paths./api/v2/managers/.get.parameters[].description
Managers who have coached at least one match in this league.

# paths./api/v2/managers/.get.parameters[].description
Partial, case-insensitive match on name or short_name.

# paths./api/v2/managers/.get.parameters[].description
ISO 3166-1 alpha-2 country code. Unknown codes return an empty list.

# paths./api/v2/managers/.get.parameters[].description
Manager with an active tenure at that club.

# paths./api/v2/managers/.get.parameters[].description
Primary playing style category derived from manager-style scoring.

# paths./api/v2/managers/{id}/career/.get.description
Tenure history at each club with date range and per-tenure record. Final shape will be defined in the schema pass.

# paths./api/v2/managers/{id}/matches/.get.description
Matches managed by this manager. Defaults to a window of `now - 3h` to `now + 7d` when no date filters are provided. Final response shape will align with `/api/v2/events/`.

# paths./api/v2/managers/{id}/matches/.get.parameters[].description
Restrict to matches where this manager was on the bench for this team (useful for managers with multiple tenures).

# paths./api/v2/managers/{id}/social/.get.description
Paginated tweets and video highlights linked to this manager. Cached 15 min.

# paths./api/v2/odds/.get.description
Paginated list of latest odds across bookmakers. Each item is one (event, bookmaker, market, outcome) tuple at its most recent observation. Standard v2 wrapper (count + next + previous + results). Cached 3 min.

When no event_id/league_id/season_id/team_id or updated_after filter is given, results default to the last 48h of observations (the meaningful "latest odds" window). Pass an explicit updated_after to widen it.

Market+outcome compatibility (incoherent combos return 400):
- 1x2            → HOME, DRAW, AWAY
- btts           → yes, no
- over_under_15/25/35 → over, under
- double_chance  → 1X, 12, X2
- draw_no_bet    → HOME, AWAY
- total_corners  → over, under (line in `line` field)
- corners_1x2    → HOME, DRAW, AWAY (which team has more corners)
- total_red_cards → over, under (line in `line` field)
- red_card       → yes, no (a red card is shown in the match)

For total_corners/total_red_cards the handicap line varies per quote and is returned in the `line` field (null for all other markets).

For event-scoped side-by-side comparison use `/api/v2/events/{id}/odds/comparison/`.

# paths./api/v2/odds/.get.parameters[].description
Slug only (e.g. "pinnacle"). Display names rejected with 400.

# paths./api/v2/odds/.get.parameters[].description
ISO-8601 UTC. Only odds with observed_at >= this.

# paths./api/v2/odds/{id}/.get.description
Returns one odds row by its id. NOT the event-context envelope that v1 had as a fallback — invalid ids are 404s.

# paths./api/v2/odds/best/.get.description
Per upcoming event, the highest decimal odds for each outcome of the requested market across all bookmakers. Defaults: market=1x2, date_from=now, date_to=now+7 days. Cached 5 min.

# paths./api/v2/players/.get.description
Paginated players list. Filter by current club, national team, nationality (ISO-2), position, or name. Heavy per-player data (stats, transfers, career) is exposed via dedicated sub-resources.

# paths./api/v2/players/.get.parameters[].description
Partial, case- and accent-insensitive match on name or short_name. `gyokeres` matches `Gyökeres`, `sesko` matches `Šeško`, `estevao` matches `Estêvão`.

# paths./api/v2/players/.get.parameters[].description
ISO 3166-1 alpha-2 nationality code (e.g. PT, BR). Unknown codes return an empty list.

# paths./api/v2/players/.get.parameters[].description
Generic (G/D/M/F) or specific position code.

# paths./api/v2/players/{id}/career/.get.description
Career totals aggregated by season (matches, goals, assists, minutes, average rating). Final shape will be defined in the schema pass.

# paths./api/v2/players/{id}/national-team/.get.description
National-team identifier plus aggregate caps/goals from national-team event statistics (when available). Final shape will be defined in the schema pass.

# paths./api/v2/players/{id}/social/.get.description
Paginated tweets and video highlights mentioning this player. Linking is **heuristic** (best-effort NLP/regex over the text); false positives are possible. Cached 15 min.

# paths./api/v2/players/{id}/stats/.get.description
Per-match player statistics for one player. Filter by season, team, league or date range. To get stats for one specific event use `/api/v2/events/{id}/player-stats/` (the canonical path); passing `event_id` here is rejected with 400.

# paths./api/v2/players/{id}/stats/.get.parameters[].description
Stats logged with this team (handles transfers).

# paths./api/v2/players/{id}/transfers/.get.description
Transfer history for the player, newest first.

# paths./api/v2/predictions/.get.description
Paginated list of engine forecasts. Response items group fields by market (match_result, expected_goals, over_under, btts, score, draw_no_bet, corners). Probabilities are calibrated, market-anchored where a consensus price exists. When date_from or date_to is set, status is ignored — the explicit window wins. Cached 120 s.

# paths./api/v2/predictions/.get.parameters[].description
ISO-8601 UTC. Date-only YYYY-MM-DD also accepted.

# paths./api/v2/predictions/.get.parameters[].description
Lower bound (0–1) on the probability of the most likely 1X2 outcome.

# paths./api/v2/predictions/.get.parameters[].description
Kept for contract compatibility. The engine issues no bet recommendations, so true matches nothing and false matches all.

# paths./api/v2/predictions/.get.parameters[].description
upcoming (default) | past | all. Ignored when date_from/date_to is set.

# paths./api/v2/predictions/.get.parameters[].description
Forecasts where the team plays home or away.

# paths./api/v2/referees/.get.description
Paginated referees list with computed match aggregates. Filter by league, name, country (ISO-2) or minimum matches. Ordered by matches officiated, descending.

# paths./api/v2/referees/.get.parameters[].description
ISO 3166-1 alpha-2 country code. Unknown codes return an empty list.

# paths./api/v2/referees/.get.parameters[].description
Referees who have officiated at least one match in this league.

# paths./api/v2/referees/.get.parameters[].description
Minimum matches officiated (default: 0).

# paths./api/v2/referees/.get.parameters[].description
Partial, case-insensitive match on referee name.

# paths./api/v2/referees/{id}/.get.description
New in v2 (no equivalent in v1). Same shape as the list item, with aggregate stats over all played matches.

# paths./api/v2/referees/{id}/matches/.get.description
Matches officiated by this referee. Defaults to a window of `now - 3h` to `now + 7d` when no date filters are provided. Final response shape will align with `/api/v2/events/`.

# paths./api/v2/social/.get.description
Paginated feed of tweets and video highlights linked to BSD entities. News items (v1 type=`news`) are intentionally excluded from v2. Order: published_at DESC. Cached 15 min.

# paths./api/v2/social/.get.parameters[].description
Filter by mentioned player. Linking is **heuristic** (best-effort NLP/regex over the text); false positives are possible.

# paths./api/v2/teams/.get.description
Paginated teams list. Filter by country (ISO-2), league, season, name, or competition status. Spatial / squad data is not in this list — fetch it from `/teams/{id}/squad/` or `/teams/{id}/fixtures/`.

# paths./api/v2/teams/.get.parameters[].description
ISO 3166-1 alpha-2 country code (e.g. PT, ES, BR). Unknown codes return an empty list.

# paths./api/v2/teams/.get.parameters[].description
Set true for teams with upcoming matches in the league. Requires `league_id`; otherwise responds 400.

# paths./api/v2/teams/.get.parameters[].description
Filter by women / men competitions (requires `league_id` or `season_id` to apply).

# paths./api/v2/teams/.get.parameters[].description
Teams that have at least one event in this league.

# paths./api/v2/teams/.get.parameters[].description
Partial, case-insensitive match on team name.

# paths./api/v2/teams/{id}/fixtures/.get.description
Matches for this team. Defaults to a window of `now - 3h` to `now + 7d` when no date filters are provided. Final response shape will be aligned with `/api/v2/events/` in the schema pass.

# paths./api/v2/teams/{id}/social/.get.description
Paginated tweets and video highlights linked to this team. Cached 15 min.

# paths./api/v2/teams/{id}/squad/.get.description
Active players currently linked to this team via `current_team`. Final shape will be defined in the players-schema pass.

# paths./api/v2/transfers/.get.description
Cross-player transfer feed. Newest first by default; pass `ordering=-fee` for the biggest deals. Filter by team (incoming or outgoing), player, date range and minimum fee. Fees are in EUR.

# paths./api/v2/transfers/.get.parameters[].description
Only transfers with a known paid fee (>0).

# paths./api/v2/transfers/.get.parameters[].description
Minimum fee in EUR (implies a paid transfer).

# paths./api/v2/transfers/.get.parameters[].description
One of: -transfer_date (default), transfer_date, -fee, fee.

# paths./api/v2/transfers/.get.parameters[].description
Transfers involving this team (incoming OR outgoing).

# paths./api/v2/tv-channels/.get.description
Paginated list of licensed TV channels. Cached 1 hour.

# paths./api/v2/tv-channels/.get.parameters[].description
Case-insensitive partial match on channel name.

# paths./api/v2/tv-channels/{id}/broadcasts/.get.description
Paginated list of broadcasts emitted by this channel. When neither date_from nor date_to is set, returns the default window now-3h to now+7d. Cached 1 hour.

# paths./api/v2/venues/.get.description
Paginated venues list. Filter by country (ISO-2), city, name, capacity, or home team.

# paths./api/v2/venues/.get.parameters[].description
Partial, case-insensitive match on city.

# paths./api/v2/venues/.get.parameters[].description
ISO 3166-1 alpha-2 country code. Unknown codes return an empty list.

# paths./api/v2/venues/.get.parameters[].description
Partial, case-insensitive match on venue name.

# paths./api/v2/venues/.get.parameters[].description
Venues that are the home stadium of this team.

# paths./api/v2/venues/{id}/.get.description
Single venue with embedded `competition_assignments` (list of tournament roles). Each venue typically has fewer than five assignments so they ship inline.

# paths./api/v2/venues/{id}/competitions/.get.description
All `VenueCompetition` rows for this venue (every tournament/season this venue is used in).

# paths./api/v2/worldcup/squads/.get.description
Per-player squad call-ups for the 2026 FIFA World Cup. Each row is a single announced player on a national team (26 final / up to 55 preliminary). `player_id` is null when the player is not yet in our Player table; the remaining fields (name, club, caps, goals, age) are still populated from the source. Filter with `has_player=true` to restrict to rows that resolve to an existing player.

# paths./api/v2/worldcup/squads/.get.parameters[].description
Restrict to rows linked to a Player record (true) or only raw announcements without a linked Player (false).

# paths./api/v2/worldcup/squads/.get.parameters[].description
official = final 26-man list; preliminary = pre-list (up to 55); projected = unannounced rumour; dropped = removed from a list.

# paths./api/v2/worldcup/squads/{team_id}/.get.description
Full squad for a single national team at the 2026 FIFA World Cup. Returns every announced call-up sorted by position then jersey number. See `/api/v2/worldcup/squads/` for the paginated all-teams view.

# paths./api/venues/.get.description
**DEPRECATED.** Use `/api/v2/venues/` instead. Migration mapping:
- `?country=X` → `?country_code=XX` (ISO-2 only)
- `?page=N` → `?limit=M&offset=(N-1)*M`

This endpoint will be removed in a future release.

Returns all football venues (home stadiums) with city, country, and capacity.

# paths./api/venues/.get.parameters[].description
Filter by city (case-insensitive substring match)

# paths./api/venues/.get.parameters[].description
Filter by country (case-insensitive substring match)

# paths./api/venues/.get.parameters[].description
A page number within the paginated result set.

# paths./api/venues/{id}/.get.description
**DEPRECATED.** Use `/api/v2/venues/{id}/` instead.

Returns a single venue with the team that plays home there.

# paths./basketball/api/v2/events/{id}/box-score/.get.summary
Box score (per-player stat lines) for an event (v2)

# paths./basketball/api/v2/events/{id}/pregame/.get.summary
Pre-game bundle: managers, venue, streaks, featured players, standings (v2)

# paths./basketball/api/v2/players/{id}/.get.summary
Basketball player detail with season averages (v2)

# paths./basketball/api/v2/players/{id}/games/.get.summary
Recent box-score lines for a player (v2)

# paths./basketball/api/v2/predictions/.get.summary
List upcoming basketball predictions (v2)

# paths./basketball/api/v2/teams/.get.summary
List basketball teams sorted by ELO (v2)

# paths./csgo/api/v2/matches/live/.get.description
Only currently in-progress CS2 matches with map results. Cached 30s.

# paths./csgo/api/v2/teams/.get.description
Paginated CS2 teams (Natus Vincere, FaZe, G2, etc.).

# paths./csgo/api/v2/teams/{id}/.get.description
Team profile plus a `map_stats` block: recent winrate per map and overall/T/CT round winrates (null when we have no data for the team).

# paths./csgo/api/v2/tournaments/.get.description
Paginated CS2 tournaments (ESL Pro League, BLAST Premier, IEM, etc.).

# paths./darts/api/v2/rankings/.get.parameters[].description
pdc_oom, protour or wdf. Defaults to pdc_oom.

# paths./horseracing/api/v2/horses/.get.description
Paginated horse list. Use `query` for case-insensitive name search.

# paths./horseracing/api/v2/meetings/.get.description
Paginated list of race meetings. With no date filter, defaults to today + 7 days.

# paths./horseracing/api/v2/meetings/{id}/.get.description
Meeting detail including the nested list of races (brief form).

# paths./horseracing/api/v2/races/.get.description
Paginated list of races. With no date filter, defaults to today + 1 day.

# paths./horseracing/api/v2/races/.get.parameters[].description
race_stage value: SCHEDULED, OFF, FINISHED, ABANDONED, VOID.

# paths./horseracing/api/v2/races/{id}/.get.description
Full race detail including all runners (brief form), prize money, tipster verdict, betting forecast, last year's winners and stewards.

# paths./horseracing/api/v2/races/live/.get.description
Races whose start_time has passed within the last 15 minutes and that do not yet have a podium. Cached 30s.

# paths./horseracing/api/v2/races/next-to-jump/.get.description
Races starting in the next 30 minutes, sorted by start time. Cached 60s.

# paths./horseracing/api/v2/runners/.get.description
At least one filter is required: race, horse, jockey or trainer.

# paths./horseracing/api/v2/runners/.get.parameters[].description
Trainer ID — all that trainer's entries.

# paths./horseracing/api/v2/runners/{id}/.get.description
Full per-runner detail including headgear, medication, current odds, SP, finish position, commentary and per-horse lifetime stats.

# paths./horseracing/api/v2/runners/{id}/odds/.get.description
All current bookmaker prices for this runner. Decimal + fractional formats; best-price flag highlights the top market.

# paths./horseracing/api/v2/tracks/.get.description
Paginated list of racecourses. Filter by country or search by name.

# paths./odds/api/events/.get.description
GET /odds/api/events/?sport=&date=YYYY-MM-DD&status=live|upcoming|finished

Returns paginated events with per-bookmaker odds. Football maps to internal
Event table; all other sports map to ExternalEvent.
Params:
  sport      — filter by sport (required for non-football)
  date       — YYYY-MM-DD, default today+next 3 days window
  status     — live | upcoming | finished (football only)
  limit      — default 20, max 50
  offset     — pagination offset

# paths./odds/api/events/{event_id}/.get.description
GET /odds/api/events/{id}/?sport=football

Per-bookmaker odds for a single event, grouped by bookmaker.
Query param `sport` (default: football) selects the lookup table.

# paths./odds/api/sports/.get.description
GET /odds/api/sports/ — sports with active odds coverage.

# paths./tennis/api/v2/matches/.get.description
Paginated tennis matches. If no `date_from`/`date_to` is supplied, defaults to the next 7 days.

# paths./tennis/api/v2/matches/.get.parameters[].description
Filter by player ID (numeric) or name fragment.

# paths./tennis/api/v2/matches/.get.parameters[].description
scheduled, live, finished, cancelled, postponed.

# paths./tennis/api/v2/matches/.get.parameters[].description
Filter by tournament ID (numeric) or name fragment.

# paths./tennis/api/v2/matches/{id}/.get.description
Full per-match details including live snapshot and per-player serve stats.

# paths./tennis/api/v2/matches/{id}/h2h/.get.description
Returns the full head-to-head record between the two players of this match (overall and by surface) plus the last 5 finished matches for each player.

# paths./tennis/api/v2/matches/{id}/odds/.get.description
Returns per-bookmaker match-winner odds (P1 / P2) sourced from oddssafari (13+ bookmakers when available). Falls back to the best-available single price when no multi-bookmaker data has been synced yet.

# paths./tennis/api/v2/matches/{id}/odds/.get.summary
Per-bookmaker odds for a tennis match (v2)

# paths./tennis/api/v2/matches/{id}/point-by-point/.get.description
Every point of the match, in chronological order: sets, then games, then points. Reverse both levels for the newest-first layout scoreboards use.

It is a score progression — the score and who won each point. There is no shot-level detail: no aces, serve placement or rally length.

Points track the progression within a game and do not always include the deciding point; the game-level winner covers that, so point counts need not reconcile exactly with p1_total_points_won / p2_total_points_won on the match detail. Check point_by_point_available there to tell "never collected" from "collected, none exists" without fetching this.

# paths./tennis/api/v2/matches/live/.get.description
Currently in-progress tennis matches, including those temporarily interrupted (e.g. rain delay). Cached 30s.

# paths./tennis/api/v2/players/.get.description
Paginated tennis player profiles (4,700+ players). Filter by gender, country code, or name search.

# paths./tennis/api/v2/players/.get.parameters[].description
ISO 3166-1 alpha-2 country code (e.g. ES, US).

# paths./tennis/api/v2/predictions/.get.description
Paginated ML predictions for tennis matches. Defaults to upcoming. Pass `upcoming=false` to include past matches, or specify a date range.

# paths./tennis/api/v2/predictions/.get.parameters[].description
Filter by match ID (returns prediction for that match regardless of date).

# paths./tennis/api/v2/predictions/.get.parameters[].description
Default true. False to include past predictions.

# paths./tennis/api/v2/rankings/.get.description
ATP or WTA rankings. Defaults to the latest snapshot. Pass `date=YYYY-MM-DD` for a historical snapshot.

# paths./tennis/api/v2/rankings/.get.parameters[].description
Snapshot date (YYYY-MM-DD). Default: latest.

# paths./tennis/api/v2/tournaments/.get.description
Paginated tennis tournaments. Active-only by default. Filter by circuit (ATP/WTA), category (grand_slam, masters_1000, atp_500, …) or surface.

# paths./tennis/api/v2/tournaments/.get.parameters[].description
Set true to include inactive tournaments.

# paths./tipsters/api/slips/.get.description
GET /tipsters/api/slips/
Returns the authenticated user's last 20 slips with tips.

# paths./tipsters/api/tips/.post.description
POST /tipsters/api/tips/
Submit a new slip with 1–8 tips.

# paths./tipsters/api/wom/.post.description
POST /tipsters/api/wom/
Submit Weight-of-Money movements for one or more events.
Each movement must reference a valid future football or tennis event in our DB.

# paths./wom/api/coverage/.get.description
GET /wom/api/coverage/ — what the dataset currently holds.

Free to any authenticated token: a caller has to be able to see whether the
data is worth subscribing to before paying for it.

# paths./wom/api/events/.get.description
GET /wom/api/events/ — fixtures with their latest money split.

Params:
  date    — YYYY-MM-DD (default: kickoffs from 3h ago onwards)
  status  — live | upcoming | finished
  market  — market code filter, e.g. 1X2_HOME_FT or a kind like OU
  limit   — default 20, max 50
  offset  — pagination offset

# paths./wom/api/events/{event_id}/.get.description
GET /wom/api/events/<id>/ — every market's latest money for one fixture.

# paths./wom/api/events/{event_id}/history/.get.description
GET /wom/api/events/<id>/history/?market=CODE — money over time.

Without `market`, returns every market's series for the fixture. Series are
ordered oldest first so they can be plotted directly.

# paths./wom/api/markets/.get.description
GET /wom/api/markets/ — catalog of markets money is reported on.

# paths./wom/api/movers/.get.description
GET /wom/api/movers/ — selections where the money disagrees with the price.

`divergence` is share-of-money minus implied probability, in points. A large
positive value means the crowd has put more money on a selection than its
price implies. This is a descriptive statistic, not a prediction.

Params:
  min_volume    — ignore markets thinner than this (default 5000)
  min_divergence— minimum absolute divergence in points (default 10)
  status        — live | upcoming | finished
  limit         — default 25, max 100

# components.schemas.BestXIPlayerSchema.properties.avg_rating.description
Average match rating (0-10 scale) over the qualifying matches.

# components.schemas.BookmakerV2Schema.properties.slug.description
Machine-readable bookmaker identifier (e.g. "bet365"). Use this as the bookmaker_slug filter.

# components.schemas.BroadcastV2Schema.properties.event_id.description
Internal ID of the match being broadcast.

# components.schemas.BroadcastV2Schema.properties.home_team_id.description
Internal ID of the home team. Null when not resolved.

# components.schemas.BroadcastV2Schema.properties.away_team_id.description
Internal ID of the away team. Null when not resolved.

# components.schemas.BroadcastV2Schema.properties.league_id.description
Internal ID of the competition. Null when not assigned.

# components.schemas.BroadcastV2Schema.properties.league_name.description
Competition name. Null when not assigned.

# components.schemas.BroadcastV2Schema.properties.event_date.description
Scheduled kick-off time in UTC (ISO 8601, Z suffix).

# components.schemas.BroadcastV2Schema.properties.country_code.description
ISO 3166-1 alpha-2 country code of the target broadcast territory.

# components.schemas.BroadcastV2Schema.properties.channel_id.description
Internal ID of the broadcasting TV channel.

# components.schemas.BroadcastV2Schema.properties.channel_name.description
Display name of the broadcasting channel.

# components.schemas.BroadcastV2Schema.properties.channel_link.description
URL to the channel's website or stream page. Empty string when not set.

# components.schemas.BroadcastV2Schema.properties.scheduled_start_time.description
UTC time the broadcast is scheduled to start (ISO 8601, Z suffix). Falls back to kick-off time when no specific start time is recorded.

# components.schemas.DartsMatchBriefSchema.properties.api_id.description
External API ID for the match. Null if not synced.

# components.schemas.DartsMatchBriefSchema.properties.tournament.description
Tournament this match belongs to. Null if unassigned.

# components.schemas.DartsMatchBriefSchema.properties.player1.description
First player (home side). Null if player data is missing.

# components.schemas.DartsMatchBriefSchema.properties.player2.description
Second player (away side). Null if player data is missing.

# components.schemas.DartsMatchBriefSchema.properties.match_date.description
Scheduled or actual start time (UTC, ISO 8601). Null if not set.

# components.schemas.DartsMatchBriefSchema.properties.status.description
Match lifecycle: scheduled, live, or finished.

# components.schemas.DartsMatchBriefSchema.properties.round_name.description
Round label (e.g. Quarter-final). Null for group-stage formats.

# components.schemas.DartsMatchBriefSchema.properties.player1_sets.description
Sets won by player 1. Null before match starts.

# components.schemas.DartsMatchBriefSchema.properties.player2_sets.description
Sets won by player 2. Null before match starts.

# components.schemas.DartsMatchBriefSchema.properties.sets_detail.description
Per-set leg breakdown. Null before any set completes.

# components.schemas.DartsMatchBriefSchema.properties.winner_id.description
Internal ID of the winning player. Null if match is not finished.

# components.schemas.DartsMatchBriefSchema.properties.best_of_legs.description
Best-of-N legs per set. Null when not reported upstream.

# components.schemas.DartsMatchBriefSchema.properties.best_of_sets.description
Best-of-N sets for the match. Null when not reported upstream.

# components.schemas.DartsMatchBriefSchema.properties.first_to_throw_id.description
Internal ID of the player who threw first. Null when not reported upstream.

# components.schemas.DartsMatchDetailSchema.properties.api_id.description
External API ID for the match. Null if not synced.

# components.schemas.DartsMatchDetailSchema.properties.tournament.description
Tournament this match belongs to. Null if unassigned.

# components.schemas.DartsMatchDetailSchema.properties.player1.description
First player (home side). Null if player data is missing.

# components.schemas.DartsMatchDetailSchema.properties.player2.description
Second player (away side). Null if player data is missing.

# components.schemas.DartsMatchDetailSchema.properties.match_date.description
Scheduled or actual start time (UTC, ISO 8601). Null if not set.

# components.schemas.DartsMatchDetailSchema.properties.status.description
Match lifecycle: scheduled, live, or finished.

# components.schemas.DartsMatchDetailSchema.properties.round_name.description
Round label (e.g. Quarter-final). Null for group-stage formats.

# components.schemas.DartsMatchDetailSchema.properties.player1_sets.description
Sets won by player 1. Null before match starts.

# components.schemas.DartsMatchDetailSchema.properties.player2_sets.description
Sets won by player 2. Null before match starts.

# components.schemas.DartsMatchDetailSchema.properties.sets_detail.description
Per-set leg breakdown. Null before any set completes.

# components.schemas.DartsMatchDetailSchema.properties.winner_id.description
Internal ID of the winning player. Null if match is not finished.

# components.schemas.DartsMatchDetailSchema.properties.best_of_legs.description
Best-of-N legs per set. Null when not reported upstream.

# components.schemas.DartsMatchDetailSchema.properties.best_of_sets.description
Best-of-N sets for the match. Null when not reported upstream.

# components.schemas.DartsMatchDetailSchema.properties.first_to_throw_id.description
Internal ID of the player who threw first. Null when not reported upstream.

# components.schemas.DartsMatchDetailSchema.properties.player1_legs.description
Legs won by player 1 in the current or last set.

# components.schemas.DartsMatchDetailSchema.properties.player2_legs.description
Legs won by player 2 in the current or last set.

# components.schemas.DartsMatchDetailSchema.properties.current_set.description
1-based index of the set currently being played. Null when not live.

# components.schemas.DartsMatchDetailSchema.properties.odds_player1.description
Decimal market odds for player 1 to win the match.

# components.schemas.DartsMatchDetailSchema.properties.odds_player2.description
Decimal market odds for player 2 to win the match.

# components.schemas.DartsMatchDetailSchema.properties.stats.description
Per-player match statistics: 3-dart average, checkout %, 180s, 140+/100+ scores, highest checkout. Null values when not reported upstream.

# components.schemas.DartsMatchStatsSchema.properties.player1.description
average, checkout_pct, 180s, 140_plus, 100_plus, highest_checkout for player 1.

# components.schemas.DartsMatchStatsSchema.properties.player2.description
average, checkout_pct, 180s, 140_plus, 100_plus, highest_checkout for player 2.

# components.schemas.DartsPlayerBriefSchema.properties.short_name.description
Abbreviated name used in compact displays. Null when not set.

# components.schemas.DartsPlayerBriefSchema.properties.country_code.description
ISO 3166-1 alpha-2 country code (e.g. GB).

# components.schemas.DartsPlayerBriefSchema.properties.elo_overall.description
Overall ELO rating across all tournament formats.

# components.schemas.DartsTournamentBriefSchema.properties.category.description
Tournament series or category (e.g. PDC European Tour). Null when unclassified.

# components.schemas.DartsTournamentBriefSchema.properties.is_active.description
True if the tournament is currently active.

# components.schemas.Event.properties.round_number.description
Matchday / round number within the season (null for cup knockout stages)

# components.schemas.Event.properties.round_name.description
Cup round name when applicable (e.g. "Semifinals", "Final")

# components.schemas.Event.properties.group_name.description
Group label for group-stage tournaments (e.g. 'Group A'). Null for league play or knockout rounds.

# components.schemas.Event.properties.status.description
Match status: notstarted, delayed (kickoff not yet happened), 1st_half, halftime, 2nd_half, extratime, penalties (live); finished, aet, postponed, cancelled (final)

# components.schemas.Event.properties.home_score.description
Home goals at full time (regular time only, excluding penalty shootout)

# components.schemas.Event.properties.away_score.description
Away goals at full time (regular time only, excluding penalty shootout)

# components.schemas.Event.properties.home_score_ht.description
Home goals at half-time (derived from incidents)

# components.schemas.Event.properties.away_score_ht.description
Away goals at half-time (derived from incidents)

# components.schemas.Event.properties.period.description
Period: 1T, HT, 2T (regular time); ET1, ETHT, ET2 (extra time); PEN (penalty shootout); FT, AET (final)

# components.schemas.Event.properties.actual_home_xg.description
Actual home team xG (post-match, from player stats)

# components.schemas.Event.properties.actual_away_xg.description
Actual away team xG (post-match, from player stats)

# components.schemas.Event.properties.home_xg_live.description
Home team total xG (live from shotmap, or post-match fallback)

# components.schemas.Event.properties.away_xg_live.description
Away team total xG (live from shotmap, or post-match fallback)

# components.schemas.Event.properties.penalty_shootout.description
Penalty shootout result: {home: X, away: Y} if a shootout occurred, null otherwise

# components.schemas.Event.properties.extra_time_score.description
Goals scored in extra time only: {home: X, away: Y}. Non-null when status is aet or penalties. The home_score/away_score fields always reflect the result after 90 minutes.

# components.schemas.Event.properties.is_local_derby.description
True when the two teams share a city/region. Null = unknown.

# components.schemas.Event.properties.is_neutral_ground.description
True when played on neutral ground (cup finals, internationals).

# components.schemas.Event.properties.referee.description
Referee info: name, yellowCards, redCards (null if unavailable)

# components.schemas.Event.properties.unavailable_players.description
Players unavailable for this match: injured, suspended, or doubtful (grouped by team)

# components.schemas.Event.properties.venue.description
Match venue (stadium). Uses the event-specific venue when available; falls back to the home team's home stadium. Null only when neither is set. To detect neutral-ground matches compare venue.id with home_team_obj.venue.id.

# components.schemas.Event.properties.incidents.description
Match incidents: goals, cards, substitutions. Each item: {type, minute, player_name, is_home, ...}. Requires ?full=true.

# components.schemas.Event.properties.live_stats.description
Match statistics: {home: {ball_possession, total_shots, shots_on_target, corner_kicks, fouls, yellow_cards, red_cards, offsides, expected_goals, ...}, away: {...}}. Available both during the match and after full time.

# components.schemas.Event.properties.lineups.description
Team lineups with player positions. Each item: {player_name, position, x, y, is_home}. Included only when ?full=true is set on the list endpoint, or always on GET /api/events/{id}/.

# components.schemas.Event.properties.shotmap.description
All shots in the match. Each item: {min, type, sit, body, home, xg, xgot, pos: {x,y}, gm: {y,z}, gml, pid}. Requires ?full=true on both the list endpoint and GET /api/events/{id}/.

# components.schemas.Event.properties.momentum.description
Minute-by-minute pressure index. Each item: {m: minute (int), v: pressure (signed int, positive = home dominance, negative = away)}. Requires ?full=true on both the list endpoint and GET /api/events/{id}/.

# components.schemas.Event.properties.xg_per_minute.description
Per-minute xG buckets aggregated from the shotmap. Each item: {m: minute (int), xg_home: xG added by home this minute, xg_away: xG added by away this minute, cum_home: cumulative home xG up to and including this minute, cum_away: cumulative away xG}. Useful for in-play momentum models (delta xG/min) without paginating the shotmap. Requires ?full=true on both the list endpoint and GET /api/events/{id}/.

# components.schemas.Event.properties.average_positions.description
Average pitch positions per player during the match. Structure: {home: [{player, pid, pos: {x,y}, number}], away: [...]}. Requires ?full=true on both the list endpoint and GET /api/events/{id}/.

# components.schemas.Event.properties.jerseys.description
{home: {player, GK}, away: {...}} colours used in the match

# components.schemas.Event.properties.funfacts.description
Pre-match facts: list of {sentence, type_id}. Set ~24h before KO.

# components.schemas.Event.properties.sr_stats.description
Provider-only counters at full time: ball_safe, attack, dangerous_attack (+ percentage variants). Each value: {home, away}.

# components.schemas.Event.properties.ai_preview.description
AI-generated match preview text (markdown). Returns null if no preview has been generated yet. Generated for fixtures kicking off in the next 24h.

# components.schemas.Event.properties.live_websocket.description
True when this event is wired to the live-stream WebSocket (/ws/live/). Subscribe via {"action":"subscribe","event_id":<id>} after connect; only available for tracked matches.

# components.schemas.EventAIPreview.properties.text.description
Markdown-formatted preview text (uses **bold** and dash bullets)

# components.schemas.EventAIPreview.properties.generated_at.description
When the preview was generated (ISO 8601)

# components.schemas.EventBroadcast.description
Links an event to a TV channel broadcasting it in a given country.

# components.schemas.EventBroadcast.properties.country_code.description
ISO country code in which this broadcast applies

# components.schemas.EventBroadcast.properties.scheduled_start_time.description
Broadcast start time as published by the rights-holder schedule (may differ from event kickoff on delayed coverage)

# components.schemas.EventDetailV2Schema.properties.league_id.description
League this match belongs to. Use /api/v2/leagues/{id}/ for details. Null if unassigned.

# components.schemas.EventDetailV2Schema.properties.season_id.description
Season this match belongs to. Null if not assigned to a season.

# components.schemas.EventDetailV2Schema.properties.home_team_id.description
Internal ID of the home team. Use /api/v2/teams/{id}/ for details.

# components.schemas.EventDetailV2Schema.properties.home_team.description
Home team name (string, for display convenience).

# components.schemas.EventDetailV2Schema.properties.away_team_id.description
Internal ID of the away team. Use /api/v2/teams/{id}/ for details.

# components.schemas.EventDetailV2Schema.properties.away_team.description
Away team name (string, for display convenience).

# components.schemas.EventDetailV2Schema.properties.home_coach_id.description
Internal ID of the home team's head coach. Use /api/v2/managers/{id}/. Null when not available.

# components.schemas.EventDetailV2Schema.properties.away_coach_id.description
Internal ID of the away team's head coach. Null when not available.

# components.schemas.EventDetailV2Schema.properties.referee_id.description
Internal ID of the referee. Use /api/v2/referees/{id}/. Null when not available.

# components.schemas.EventDetailV2Schema.properties.venue_id.description
Internal ID of the stadium. Use /api/v2/venues/{id}/. Falls back to the home team's default stadium. Null when unknown.

# components.schemas.EventDetailV2Schema.properties.event_date.description
Scheduled kick-off time in UTC (ISO 8601).

# components.schemas.EventDetailV2Schema.properties.status.description
Match lifecycle status. Common values: notstarted, inprogress, 1st_half, halftime, 2nd_half, finished, aet (after extra time), postponed, cancelled.

# components.schemas.EventDetailV2Schema.properties.replaced_by.description
If this match was postponed and later replayed, this is the ID of the replacement event. Null otherwise.

# components.schemas.EventDetailV2Schema.properties.round_number.description
Numeric match week or round (e.g. 28 for gameweek 28). Null for cup knockout rounds.

# components.schemas.EventDetailV2Schema.properties.round_name.description
Round label (e.g. "Round of 16", "Gameweek 28"). Empty string when not set.

# components.schemas.EventDetailV2Schema.properties.group_name.description
Group stage name (e.g. "Group A"). Null for knockout or league formats.

# components.schemas.EventDetailV2Schema.properties.period.description
Current period for live matches (e.g. "1st_half", "2nd_half", "extra_time"). Empty string when not live.

# components.schemas.EventDetailV2Schema.properties.current_minute.description
Elapsed minutes in the current period for live matches. Null when not live.

# components.schemas.EventDetailV2Schema.properties.home_score.description
Home team goals at full time (excludes penalty shootout). Null before match starts.

# components.schemas.EventDetailV2Schema.properties.away_score.description
Away team goals at full time (excludes penalty shootout). Null before match starts.

# components.schemas.EventDetailV2Schema.properties.home_score_ht.description
Home team goals at half time. Null before half time.

# components.schemas.EventDetailV2Schema.properties.away_score_ht.description
Away team goals at half time. Null before half time.

# components.schemas.EventDetailV2Schema.properties.penalty_shootout.description
Penalty shootout score (home/away). Non-null only when the match was decided by a shootout.

# components.schemas.EventDetailV2Schema.properties.extra_time_score.description
Goals scored in extra time only (home/away). Non-null when status is aet or penalties.

# components.schemas.EventDetailV2Schema.properties.is_local_derby.description
True when both teams are from the same city or metropolitan area.

# components.schemas.EventDetailV2Schema.properties.is_neutral_ground.description
True when the match is played at a neutral venue (e.g. cup finals, World Cup).

# components.schemas.EventDetailV2Schema.properties.travel_distance_km.description
Straight-line distance in km between the two teams' home cities. Null when geodata is missing.

# components.schemas.EventDetailV2Schema.properties.weather.description
Weather conditions at kick-off. All sub-fields may be null when data is unavailable.

# components.schemas.EventDetailV2Schema.properties.pitch_condition.description
Pitch condition code from the data provider. Null when not reported.

# components.schemas.EventDetailV2Schema.properties.attendance.description
Official match attendance figure. Null when not reported.

# components.schemas.EventDetailV2Schema.properties.live_websocket.description
True when this match can be subscribed to via /ws/live/ for real-time score, clock, and ball-movement updates.

# components.schemas.EventDetailV2Schema.properties.websocket_plus.description
True when Opta POEM pitch-level tracking is available via /ws/poem/{event_id}/.

# components.schemas.EventDetailV2Schema.properties.highlights.description
Post-match highlight videos linked to this event. Empty list for upcoming or live matches.

# components.schemas.EventDetailV2Schema.properties.head_to_head.description
Head-to-head aggregate between the two teams: total_matches, home_wins, draws, away_wins, home_goals, away_goals, avg_total_goals, home_win_rate, away_win_rate, recent_matches. Null when no H2H history is found.

# components.schemas.EventLiveListItemV2Schema.properties.status.description
* `notstarted` - notstarted
* `delayed` - delayed
* `inprogress` - inprogress
* `penalties` - penalties
* `finished` - finished

# components.schemas.EventLiveListItemV2Schema.properties.period.description
* `1st_half` - 1st_half
* `halftime` - halftime
* `2nd_half` - 2nd_half
* `extra_time` - extra_time
* `FT` - FT

# components.schemas.EventLiveListItemV2Schema.properties.home_score.description
Regulation-time score only — see extra_time_score for goals scored in extra time.

# components.schemas.EventLiveListItemV2Schema.properties.away_score.description
Regulation-time score only — see extra_time_score for goals scored in extra time.

# components.schemas.EventLiveListItemV2Schema.properties.penalty_shootout.description
Penalty shootout score (home/away). Non-null only when the match was decided by a shootout.

# components.schemas.EventLiveListItemV2Schema.properties.extra_time_score.description
Goals scored in extra time only (home/away). Non-null when the match is in or past extra time.

# components.schemas.EventLiveListItemV2Schema.properties.last_updated.description
Per-event Event.updated_at as ISO-8601 UTC (Z suffix). Useful for clients to skip polls when the row has not changed.

# components.schemas.HockeyLeagueBriefSchema.properties.name.description
Full name of the league (e.g. NHL, KHL).

# components.schemas.HockeyLeagueBriefSchema.properties.country.description
Country where the league is based. Empty string if international.

# components.schemas.HockeyMatchBriefSchema.properties.api_id.description
External data-source match ID. Null if not synced.

# components.schemas.HockeyMatchBriefSchema.properties.league.description
League this match belongs to. Null if unassigned.

# components.schemas.HockeyMatchBriefSchema.properties.match_date.description
Scheduled or actual start time (UTC, ISO 8601). Null if not set.

# components.schemas.HockeyMatchBriefSchema.properties.status.description
Match lifecycle: scheduled, live, or finished.

# components.schemas.HockeyMatchBriefSchema.properties.round_name.description
Competition round or stage label (e.g. Playoffs Round 1). Null for regular season.

# components.schemas.HockeyMatchBriefSchema.properties.home_score.description
Goals scored by the home team. Null before match starts.

# components.schemas.HockeyMatchBriefSchema.properties.away_score.description
Goals scored by the away team. Null before match starts.

# components.schemas.HockeyMatchBriefSchema.properties.is_overtime.description
True if the match was decided in overtime.

# components.schemas.HockeyMatchBriefSchema.properties.is_shootout.description
True if the match was decided in a shootout.

# components.schemas.HockeyMatchBriefSchema.properties.winner_id.description
Internal ID of the winning team. Null for ties or unfinished matches.

# components.schemas.HockeyMatchDetailSchema.properties.api_id.description
External data-source match ID. Null if not synced.

# components.schemas.HockeyMatchDetailSchema.properties.league.description
League this match belongs to. Null if unassigned.

# components.schemas.HockeyMatchDetailSchema.properties.match_date.description
Scheduled or actual start time (UTC, ISO 8601). Null if not set.

# components.schemas.HockeyMatchDetailSchema.properties.status.description
Match lifecycle: scheduled, live, or finished.

# components.schemas.HockeyMatchDetailSchema.properties.round_name.description
Competition round or stage label (e.g. Playoffs Round 1). Null for regular season.

# components.schemas.HockeyMatchDetailSchema.properties.home_score.description
Goals scored by the home team. Null before match starts.

# components.schemas.HockeyMatchDetailSchema.properties.away_score.description
Goals scored by the away team. Null before match starts.

# components.schemas.HockeyMatchDetailSchema.properties.is_overtime.description
True if the match was decided in overtime.

# components.schemas.HockeyMatchDetailSchema.properties.is_shootout.description
True if the match was decided in a shootout.

# components.schemas.HockeyMatchDetailSchema.properties.winner_id.description
Internal ID of the winning team. Null for ties or unfinished matches.

# components.schemas.HockeyMatchDetailSchema.properties.periods_score.description
Per-period score breakdown. Null before any period finishes.

# components.schemas.HockeyMatchDetailSchema.properties.current_period.description
Current period number for live matches (1, 2, 3…). Null when not live.

# components.schemas.HockeyMatchDetailSchema.properties.current_minute.description
Elapsed minutes in the current period for live matches. Null when not live.

# components.schemas.HockeyMatchDetailSchema.properties.odds_home.description
Decimal market odds for a home team win. Null if no odds available.

# components.schemas.HockeyMatchDetailSchema.properties.odds_away.description
Decimal market odds for an away team win. Null if no odds available.

# components.schemas.HockeyPeriodScoreSchema.properties.home.description
Goals scored by the home team in this period.

# components.schemas.HockeyPeriodScoreSchema.properties.away.description
Goals scored by the away team in this period.

# components.schemas.HockeyTeamBriefSchema.properties.short_name.description
Abbreviated name used in compact views. Null when not set.

# components.schemas.HockeyTeamBriefSchema.properties.country_code.description
ISO 3166-1 alpha-2 country code of the team.

# components.schemas.HockeyTeamBriefSchema.properties.elo_rating.description
Current ELO rating (higher = stronger). Null when not calculated.

# components.schemas.LeaderboardEntrySchema.properties.position.description
Generic position code (G/D/M/F). Empty string when unknown.

# components.schemas.LeaderboardEntrySchema.properties.value.description
Total for the requested stat over the season.

# components.schemas.LeaderboardResponseSchema.properties.stat.description
* `scorers` - scorers
* `assists` - assists
* `yellowcards` - yellowcards
* `redcards` - redcards
* `fouls` - fouls

# components.schemas.LeagueDetailV2List.properties.api_id.description
External API provider ID for the league.

# components.schemas.LeagueDetailV2List.properties.country.description
Country where the league is based, empty string if unknown.

# components.schemas.LeagueDetailV2List.properties.country_code.description
ISO country code for the league country, empty string if unknown.

# components.schemas.LeagueDetailV2List.properties.is_active.description
Whether the league is currently active and receiving updates.

# components.schemas.LeagueDetailV2List.properties.priority.description
Display priority; higher values appear first in listings.

# components.schemas.LeagueDetailV2Schema.properties.name.description
Full official name of the league or competition (e.g. "Premier League").

# components.schemas.LeagueDetailV2Schema.properties.country.description
Country the league belongs to (e.g. "England"). Empty string for international competitions.

# components.schemas.LeagueDetailV2Schema.properties.is_active.description
True if the league is currently active and receiving data updates.

# components.schemas.LeagueDetailV2Schema.properties.current_season.description
The season currently flagged as active. Null if none is marked current (e.g. between cycles).

# components.schemas.LeagueDetailV2Single.properties.api_id.description
External API provider ID for the league.

# components.schemas.LeagueDetailV2Single.properties.country.description
Country where the league is based, empty string if unknown.

# components.schemas.LeagueDetailV2Single.properties.country_code.description
ISO country code for the league country, empty string if unknown.

# components.schemas.LeagueDetailV2Single.properties.is_active.description
Whether the league is currently active and receiving updates.

# components.schemas.LeagueDetailV2Single.properties.priority.description
Display priority; higher values appear first in listings.

# components.schemas.LineupsV2Schema.properties.lineup_status.description
`confirmed` — official XI published by the club (≈1h before kickoff). `predicted` — AI-generated, only served for matches that have not started. `unavailable` — no lineup data; `lineups`, `unavailable_players` and `updated_at` are all null.

* `unavailable` - unavailable
* `predicted` - predicted
* `confirmed` - confirmed

# components.schemas.LineupsV2Schema.properties.beta.description
Always present. `true` only when `lineup_status` is `predicted` — confirmed lineups are not beta.

# components.schemas.LineupsV2Schema.properties.updated_at.description
ISO 8601 UTC ending in `Z`. Null when `lineup_status` is `unavailable`.

# components.schemas.LiveScore.properties.group_name.description
Group label for group-stage tournaments (e.g. 'Group A'). Null for league play or knockout rounds.

# components.schemas.LiveScore.properties.home_score.description
Home goals at full time (regular time only, excluding penalty shootout)

# components.schemas.LiveScore.properties.away_score.description
Away goals at full time (regular time only, excluding penalty shootout)

# components.schemas.LiveScore.properties.home_score_ht.description
Home goals at half-time (derived from incidents)

# components.schemas.LiveScore.properties.away_score_ht.description
Away goals at half-time (derived from incidents)

# components.schemas.LiveScore.properties.penalty_shootout.description
Penalty shootout result: {home: X, away: Y} if a shootout occurred, null otherwise

# components.schemas.LiveScore.properties.extra_time_score.description
Goals scored in extra time only: {home: X, away: Y}. Non-null when status is aet or penalties.

# components.schemas.LiveScore.properties.home_xg_live.description
Home team total xG so far in the match (sum of per-shot xG from shotmap). Updates in real time alongside the shotmap. Null when no shots have been logged yet.

# components.schemas.LiveScore.properties.away_xg_live.description
Away team total xG so far in the match (sum of per-shot xG from shotmap). Updates in real time alongside the shotmap. Null when no shots have been logged yet.

# components.schemas.LiveScore.properties.incidents.description
Match incidents: goals, cards, substitutions [{type, minute, player_name, is_home}]

# components.schemas.LiveScore.properties.live_stats.description
Live statistics: {home: {ball_possession, total_shots, ...}, away: {...}}

# components.schemas.LiveScore.properties.lineups.description
Team lineups with player positions. Requires ?full=true. Null if not yet available.

# components.schemas.LiveScore.properties.shotmap.description
Per-shot xG data with pitch coordinates. Each item: {min, type, sit, body, home, xg, xgot, pos: {x, y}, gm: {y, z}, gml, pid}. Requires ?full=true. Null if no shots logged yet.

# components.schemas.LiveScore.properties.momentum.description
Minute-by-minute pressure index. Each item: {m: minute (int), v: pressure (signed int, positive = home dominance, negative = away)}. Requires ?full=true.

# components.schemas.LiveScore.properties.xg_per_minute.description
Per-minute xG buckets aggregated from the shotmap. Each item: {m: minute (int), xg_home: xG added by home this minute, xg_away: xG added by away this minute, cum_home: cumulative home xG up to and including this minute, cum_away: cumulative away xG}. Useful for in-play momentum models (delta xG/min) without paginating the shotmap. Requires ?full=true.

# components.schemas.LiveScore.properties.average_positions.description
Average pitch positions per player. Requires ?full=true. Null if not yet available.

# components.schemas.Manager.properties.preferred_formation.description
Most frequently used formation (e.g. "4-3-3")

# components.schemas.Manager.properties.formations_used.description
JSON object mapping formation strings to usage counts (e.g. {"4-3-3": 12, "4-2-3-1": 5})

# components.schemas.Manager.properties.profile.description
Tactical profile: attacking, defensive, or balanced (null if not yet determined)

* `attacking` - Attacking
* `defensive` - Defensive
* `balanced` - Balanced

# components.schemas.Manager.properties.team_style.description
Tactical style code: possession, counter, pressing, defensive, direct, mixed

* `hard` - Hard
* `soft` - Soft
* `neutral` - Neutral

# components.schemas.Manager.properties.pressing_intensity.description
Pressing intensity 0-1 (derived from defensive-action rate and opponent pass disruption)

# components.schemas.Manager.properties.defensive_line.description
Low / Mid / High — bucketed from average Y position of the back line

* `low` - Low
* `mid` - Mid
* `high` - High

# components.schemas.Manager.properties.tactical_styles.description
Top tactical styles derived from match data (rank 1-4), empty if <5 matches with full stats

# components.schemas.Manager.properties.matches_total.description
Total matches managed (in the current dataset)

# components.schemas.Manager.properties.avg_xg_for.description
Average expected goals (xG) for per match

# components.schemas.Manager.properties.avg_xg_against.description
Average expected goals (xG) against per match

# components.schemas.Manager.properties.clean_sheet_pct.description
Percentage of matches with a clean sheet (0–100)

# components.schemas.Manager.properties.btts_pct.description
Percentage of matches where both teams scored (0–100)

# components.schemas.Manager.properties.over_25_pct.description
Percentage of matches with over 2.5 goals (0–100)

# components.schemas.Manager.properties.over_15_pct.description
Percentage of matches with over 1.5 goals (0–100)

# components.schemas.Manager.properties.fail_to_score_pct.description
Percentage of matches where the team failed to score (0–100)

# components.schemas.Manager.properties.avg_goals_scored_1h.description
Average goals scored in the first half per match

# components.schemas.Manager.properties.avg_goals_conceded_1h.description
Average goals conceded in the first half per match

# components.schemas.ManagerBrief.description
Compact manager object embedded in Event responses (home_coach / away_coach fields).

# components.schemas.ManagerBrief.properties.profile.description
Tactical profile: attacking, defensive, or balanced (null if not yet determined)

* `attacking` - Attacking
* `defensive` - Defensive
* `balanced` - Balanced

# components.schemas.ManagerBrief.properties.preferred_formation.description
Most frequently used formation (e.g. "4-3-3")

# components.schemas.ManagerBrief.properties.defensive_line.description
Low / Mid / High

* `low` - Low
* `mid` - Mid
* `high` - High

# components.schemas.ManagerBrief.properties.top_styles.description
Top 2 tactical style codes for at-a-glance comparison, e.g. ["positional","tiki_taka"]

# components.schemas.ManagerDetailV2Schema.properties.short_name.description
Abbreviated name used in compact views. Empty string when not set.

# components.schemas.ManagerDetailV2Schema.properties.country.description
Country of nationality. Empty string when not set.

# components.schemas.ManagerDetailV2Schema.properties.tactical_profile.description
Broad tactical label: attacking, defensive, or balanced. Empty string when not profiled.

# components.schemas.ManagerDetailV2Schema.properties.preferred_formation.description
Most commonly deployed formation (e.g. "4-3-3"). Empty string when not recorded.

# components.schemas.ManagerDetailV2Schema.properties.current_team_id.description
Internal ID of the club where the manager currently has an active tenure. Null if unemployed or unknown.

# components.schemas.ManagerDetailV2Schema.properties.matches_total.description
Total matches managed across all counted tenures.

# components.schemas.ManagerDetailV2Schema.properties.losses.description
Total losses across all counted matches.

# components.schemas.ManagerDetailV2Schema.properties.win_pct.description
Win percentage (0–100). Null when no matches managed.

# components.schemas.ManagerDetailV2Schema.properties.avg_goals_scored.description
Average goals scored per match by the manager's team. Null when no data.

# components.schemas.ManagerDetailV2Schema.properties.avg_goals_conceded.description
Average goals conceded per match. Null when no data.

# components.schemas.ManagerDetailV2Schema.properties.avg_possession.description
Average ball possession percentage across tracked matches. Null when possession data unavailable.

# components.schemas.ManagerDetailV2Schema.properties.clean_sheet_pct.description
Percentage of matches where the managed team kept a clean sheet. Null when no data.

# components.schemas.ManagerDetailV2Schema.properties.btts_pct.description
Percentage of matches where both teams scored (BTTS). Null when no data.

# components.schemas.ManagerDetailV2Schema.properties.over_25_pct.description
Percentage of matches with more than 2.5 total goals. Null when no data.

# components.schemas.ManagerDetailV2Schema.properties.stats_updated_at.description
UTC timestamp when aggregated stats were last recomputed. Null if never computed.

# components.schemas.MatchBriefV2List.properties.tournament.description
Tournament brief (id, name, circuit, category, surface). Null when not linked.

# components.schemas.MatchBriefV2List.properties.player1.description
Player 1 brief (id, name, short_name, country_code, country_name, gender, current_ranking). Null when missing.

# components.schemas.MatchBriefV2List.properties.player2.description
Player 2 brief (id, name, short_name, country_code, country_name, gender, current_ranking). Null when missing.

# components.schemas.MatchBriefV2List.properties.match_date.description
Scheduled or actual start time (UTC ISO-8601). Null when not set.

# components.schemas.MatchBriefV2List.properties.status.description
Match status: scheduled, live, finished, cancelled, or postponed.

# components.schemas.MatchBriefV2List.properties.round_name.description
Round label (e.g. R32, QF, SF, F). Null when not available.

# components.schemas.MatchBriefV2List.properties.player1_sets.description
Sets won by player 1. Null before match starts.

# components.schemas.MatchBriefV2List.properties.player2_sets.description
Sets won by player 2. Null before match starts.

# components.schemas.MatchBriefV2List.properties.sets_detail.description
Per-set score breakdown as JSON. Null when not available.

# components.schemas.MatchBriefV2List.properties.odds_player1.description
Best available decimal match-winner odds for player 1. Null when no price is available.

# components.schemas.MatchBriefV2List.properties.odds_player2.description
Best available decimal match-winner odds for player 2. Null when no price is available.

# components.schemas.MatchBriefV2Schema.properties.api_id.description
Upstream data-source match ID, null if unknown.

# components.schemas.MatchBriefV2Schema.properties.tournament.description
Tournament this match belongs to, null if unassigned.

# components.schemas.MatchBriefV2Schema.properties.start_time.description
Scheduled start time (UTC), null if not set.

# components.schemas.MatchBriefV2Schema.properties.status.description
Match status: notstarted, inprogress, or finished.

# components.schemas.MatchBriefV2Schema.properties.home_score.description
Number of maps won by the home team, null before completion.

# components.schemas.MatchBriefV2Schema.properties.away_score.description
Number of maps won by the away team, null before completion.

# components.schemas.MatchBriefV2Schema.properties.best_of.description
Series format (e.g. 1, 3, 5), null if unknown.

# components.schemas.MatchBriefV2Schema.properties.stage.description
Tournament stage label (e.g. Group Stage, Playoffs), null if not set.

# components.schemas.MatchDetailV2.properties.tournament.description
Tournament brief (id, name, circuit, category, surface). Null when not linked.

# components.schemas.MatchDetailV2.properties.player1.description
Player 1 brief including current ranking. Null when missing.

# components.schemas.MatchDetailV2.properties.player2.description
Player 2 brief including current ranking. Null when missing.

# components.schemas.MatchDetailV2.properties.match_date.description
Scheduled or actual start time (UTC ISO-8601). Null when not set.

# components.schemas.MatchDetailV2.properties.status.description
Match status: scheduled, live, finished, cancelled, or postponed.

# components.schemas.MatchDetailV2.properties.round_name.description
Round label (e.g. R32, QF, SF, F). Null when not available.

# components.schemas.MatchDetailV2.properties.player1_sets.description
Sets won by player 1. Null before match starts.

# components.schemas.MatchDetailV2.properties.player2_sets.description
Sets won by player 2. Null before match starts.

# components.schemas.MatchDetailV2.properties.sets_detail.description
Per-set score breakdown as JSON. Null when not available.

# components.schemas.MatchDetailV2.properties.odds_player1.description
Best available decimal match-winner odds for player 1. Null when no price is available.

# components.schemas.MatchDetailV2.properties.odds_player2.description
Best available decimal match-winner odds for player 2. Null when no price is available.

# components.schemas.MatchDetailV2.properties.player1_games.description
Total games won by player 1 across all sets. Null when not available.

# components.schemas.MatchDetailV2.properties.player2_games.description
Total games won by player 2 across all sets. Null when not available.

# components.schemas.MatchDetailV2.properties.current_set.description
Set number currently in progress (1-indexed). Null when match is not live.

# components.schemas.MatchDetailV2.properties.current_game_p1.description
Games won by player 1 in the current set. Null when not live.

# components.schemas.MatchDetailV2.properties.current_game_p2.description
Games won by player 2 in the current set. Null when not live.

# components.schemas.MatchDetailV2.properties.current_point.description
Current point score string (e.g. 30-15). Null when not live.

# components.schemas.MatchDetailV2.properties.is_serving_p1.description
True when player 1 is currently serving. Null when serve data is unavailable.

# components.schemas.MatchDetailV2.properties.p1_aces.description
Total aces served by player 1 in the match. Null when stats are unavailable.

# components.schemas.MatchDetailV2.properties.p1_double_faults.description
Total double faults by player 1 in the match. Null when stats are unavailable.

# components.schemas.MatchDetailV2.properties.p1_first_serve_pct.description
Percentage of first serves in for player 1 (0-100). Null when stats are unavailable.

# components.schemas.MatchDetailV2.properties.p1_first_serve_won_pct.description
Percentage of first-serve points won by player 1 (0-100). Null when stats are unavailable.

# components.schemas.MatchDetailV2.properties.p1_second_serve_won_pct.description
Percentage of second-serve points won by player 1 (0-100). Null when stats are unavailable.

# components.schemas.MatchDetailV2.properties.p2_aces.description
Total aces served by player 2 in the match. Null when stats are unavailable.

# components.schemas.MatchDetailV2.properties.p2_double_faults.description
Total double faults by player 2 in the match. Null when stats are unavailable.

# components.schemas.MatchDetailV2.properties.p2_first_serve_pct.description
Percentage of first serves in for player 2 (0-100). Null when stats are unavailable.

# components.schemas.MatchDetailV2.properties.p2_first_serve_won_pct.description
Percentage of first-serve points won by player 2 (0-100). Null when stats are unavailable.

# components.schemas.MatchDetailV2.properties.p2_second_serve_won_pct.description
Percentage of second-serve points won by player 2 (0-100). Null when stats are unavailable.

# components.schemas.MatchDetailV2.properties.p1_second_serve_pct.description
Percentage of second serves in for player 1 (0-100). Null when stats are unavailable.

# components.schemas.MatchDetailV2.properties.p1_break_points_saved_pct.description
Percentage of break points saved on serve by player 1 (0-100). Null when stats are unavailable.

# components.schemas.MatchDetailV2.properties.p1_break_points_converted_pct.description
Percentage of break-point chances converted by player 1 (0-100). Null when stats are unavailable.

# components.schemas.MatchDetailV2.properties.p1_return_points_won_pct.description
Percentage of return points won by player 1 (0-100). Null when stats are unavailable.

# components.schemas.MatchDetailV2.properties.p1_service_games.description
Service games played by player 1. Null when stats are unavailable.

# components.schemas.MatchDetailV2.properties.p1_service_games_won.description
Service games held by player 1. Null when stats are unavailable.

# components.schemas.MatchDetailV2.properties.p1_games_won.description
Total games won by player 1. Null when stats are unavailable.

# components.schemas.MatchDetailV2.properties.p1_total_points_won.description
Total points won by player 1. Null when stats are unavailable.

# components.schemas.MatchDetailV2.properties.p1_service_points_won.description
Points won on own serve by player 1. Null when stats are unavailable.

# components.schemas.MatchDetailV2.properties.p1_receiver_points_won.description
Points won on return by player 1. Null when stats are unavailable.

# components.schemas.MatchDetailV2.properties.p1_tiebreaks_won.description
Tiebreaks won by player 1. Null when stats are unavailable.

# components.schemas.MatchDetailV2.properties.p1_max_points_in_row.description
Longest run of consecutive points won by player 1. Null when stats are unavailable.

# components.schemas.MatchDetailV2.properties.p1_max_games_in_row.description
Longest run of consecutive games won by player 1. Null when stats are unavailable.

# components.schemas.MatchDetailV2.properties.p2_second_serve_pct.description
Percentage of second serves in for player 2 (0-100). Null when stats are unavailable.

# components.schemas.MatchDetailV2.properties.p2_break_points_saved_pct.description
Percentage of break points saved on serve by player 2 (0-100). Null when stats are unavailable.

# components.schemas.MatchDetailV2.properties.p2_break_points_converted_pct.description
Percentage of break-point chances converted by player 2 (0-100). Null when stats are unavailable.

# components.schemas.MatchDetailV2.properties.p2_return_points_won_pct.description
Percentage of return points won by player 2 (0-100). Null when stats are unavailable.

# components.schemas.MatchDetailV2.properties.p2_service_games.description
Service games played by player 2. Null when stats are unavailable.

# components.schemas.MatchDetailV2.properties.p2_service_games_won.description
Service games held by player 2. Null when stats are unavailable.

# components.schemas.MatchDetailV2.properties.p2_games_won.description
Total games won by player 2. Null when stats are unavailable.

# components.schemas.MatchDetailV2.properties.p2_total_points_won.description
Total points won by player 2. Null when stats are unavailable.

# components.schemas.MatchDetailV2.properties.p2_service_points_won.description
Points won on own serve by player 2. Null when stats are unavailable.

# components.schemas.MatchDetailV2.properties.p2_receiver_points_won.description
Points won on return by player 2. Null when stats are unavailable.

# components.schemas.MatchDetailV2.properties.p2_tiebreaks_won.description
Tiebreaks won by player 2. Null when stats are unavailable.

# components.schemas.MatchDetailV2.properties.p2_max_points_in_row.description
Longest run of consecutive points won by player 2. Null when stats are unavailable.

# components.schemas.MatchDetailV2.properties.p2_max_games_in_row.description
Longest run of consecutive games won by player 2. Null when stats are unavailable.

# components.schemas.MatchDetailV2.properties.aces_per_set.description
Aces per set: [{set: 1, p1: 4, p2: 2}, ...]. Empty when match_stats unavailable.

# components.schemas.MatchDetailV2.properties.double_faults_per_set.description
Double faults per set: [{set: 1, p1: 1, p2: 3}, ...]. Empty when match_stats unavailable.

# components.schemas.MatchDetailV2.properties.point_by_point_available.description
Whether point-by-point has been collected for this match. False means it was never collected; true means it is worth fetching /point-by-point/, though an empty sets list there means it was collected and none exists.

# components.schemas.MatchDetailV2Live.properties.tournament.description
Tournament brief (id, name, circuit, category, surface). Null when not linked.

# components.schemas.MatchDetailV2Live.properties.player1.description
Player 1 brief including current ranking. Null when missing.

# components.schemas.MatchDetailV2Live.properties.player2.description
Player 2 brief including current ranking. Null when missing.

# components.schemas.MatchDetailV2Live.properties.match_date.description
Scheduled or actual start time (UTC ISO-8601). Null when not set.

# components.schemas.MatchDetailV2Live.properties.round_name.description
Round label (e.g. QF, SF, F). Null when not available.

# components.schemas.MatchDetailV2Live.properties.player1_sets.description
Sets won by player 1. Null before match starts.

# components.schemas.MatchDetailV2Live.properties.player2_sets.description
Sets won by player 2. Null before match starts.

# components.schemas.MatchDetailV2Live.properties.sets_detail.description
Per-set score breakdown as JSON. Null when not available.

# components.schemas.MatchDetailV2Live.properties.odds_player1.description
Best available decimal match-winner odds for player 1. Null when no price is available.

# components.schemas.MatchDetailV2Live.properties.odds_player2.description
Best available decimal match-winner odds for player 2. Null when no price is available.

# components.schemas.MatchDetailV2Live.properties.player1_games.description
Total games won by player 1 across all sets. Null when not available.

# components.schemas.MatchDetailV2Live.properties.player2_games.description
Total games won by player 2 across all sets. Null when not available.

# components.schemas.MatchDetailV2Live.properties.current_set.description
Set number currently in progress (1-indexed). Null when match is not live.

# components.schemas.MatchDetailV2Live.properties.current_game_p1.description
Games won by player 1 in the current set. Null when not live.

# components.schemas.MatchDetailV2Live.properties.current_game_p2.description
Games won by player 2 in the current set. Null when not live.

# components.schemas.MatchDetailV2Live.properties.current_point.description
Current point score string (e.g. 30-15). Null when not live.

# components.schemas.MatchDetailV2Live.properties.is_serving_p1.description
True when player 1 is currently serving. Null when serve data is unavailable.

# components.schemas.MatchDetailV2Live.properties.p1_aces.description
Total aces served by player 1 in the match. Null when stats are unavailable.

# components.schemas.MatchDetailV2Live.properties.p1_double_faults.description
Total double faults by player 1 in the match. Null when stats are unavailable.

# components.schemas.MatchDetailV2Live.properties.p1_first_serve_pct.description
Percentage of first serves in for player 1 (0-100). Null when stats are unavailable.

# components.schemas.MatchDetailV2Live.properties.p1_first_serve_won_pct.description
Percentage of first-serve points won by player 1 (0-100). Null when stats are unavailable.

# components.schemas.MatchDetailV2Live.properties.p1_second_serve_won_pct.description
Percentage of second-serve points won by player 1 (0-100). Null when stats are unavailable.

# components.schemas.MatchDetailV2Live.properties.p2_aces.description
Total aces served by player 2 in the match. Null when stats are unavailable.

# components.schemas.MatchDetailV2Live.properties.p2_double_faults.description
Total double faults by player 2 in the match. Null when stats are unavailable.

# components.schemas.MatchDetailV2Live.properties.p2_first_serve_pct.description
Percentage of first serves in for player 2 (0-100). Null when stats are unavailable.

# components.schemas.MatchDetailV2Live.properties.p2_first_serve_won_pct.description
Percentage of first-serve points won by player 2 (0-100). Null when stats are unavailable.

# components.schemas.MatchDetailV2Live.properties.p2_second_serve_won_pct.description
Percentage of second-serve points won by player 2 (0-100). Null when stats are unavailable.

# components.schemas.MatchDetailV2Live.properties.p1_second_serve_pct.description
Percentage of second serves in for player 1 (0-100). Null when stats are unavailable.

# components.schemas.MatchDetailV2Live.properties.p1_break_points_saved_pct.description
Percentage of break points saved on serve by player 1 (0-100). Null when stats are unavailable.

# components.schemas.MatchDetailV2Live.properties.p1_break_points_converted_pct.description
Percentage of break-point chances converted by player 1 (0-100). Null when stats are unavailable.

# components.schemas.MatchDetailV2Live.properties.p1_return_points_won_pct.description
Percentage of return points won by player 1 (0-100). Null when stats are unavailable.

# components.schemas.MatchDetailV2Live.properties.p1_service_games.description
Service games played by player 1. Null when stats are unavailable.

# components.schemas.MatchDetailV2Live.properties.p1_service_games_won.description
Service games held by player 1. Null when stats are unavailable.

# components.schemas.MatchDetailV2Live.properties.p1_games_won.description
Total games won by player 1. Null when stats are unavailable.

# components.schemas.MatchDetailV2Live.properties.p1_total_points_won.description
Total points won by player 1. Null when stats are unavailable.

# components.schemas.MatchDetailV2Live.properties.p1_service_points_won.description
Points won on own serve by player 1. Null when stats are unavailable.

# components.schemas.MatchDetailV2Live.properties.p1_receiver_points_won.description
Points won on return by player 1. Null when stats are unavailable.

# components.schemas.MatchDetailV2Live.properties.p1_tiebreaks_won.description
Tiebreaks won by player 1. Null when stats are unavailable.

# components.schemas.MatchDetailV2Live.properties.p1_max_points_in_row.description
Longest run of consecutive points won by player 1. Null when stats are unavailable.

# components.schemas.MatchDetailV2Live.properties.p1_max_games_in_row.description
Longest run of consecutive games won by player 1. Null when stats are unavailable.

# components.schemas.MatchDetailV2Live.properties.p2_second_serve_pct.description
Percentage of second serves in for player 2 (0-100). Null when stats are unavailable.

# components.schemas.MatchDetailV2Live.properties.p2_break_points_saved_pct.description
Percentage of break points saved on serve by player 2 (0-100). Null when stats are unavailable.

# components.schemas.MatchDetailV2Live.properties.p2_break_points_converted_pct.description
Percentage of break-point chances converted by player 2 (0-100). Null when stats are unavailable.

# components.schemas.MatchDetailV2Live.properties.p2_return_points_won_pct.description
Percentage of return points won by player 2 (0-100). Null when stats are unavailable.

# components.schemas.MatchDetailV2Live.properties.p2_service_games.description
Service games played by player 2. Null when stats are unavailable.

# components.schemas.MatchDetailV2Live.properties.p2_service_games_won.description
Service games held by player 2. Null when stats are unavailable.

# components.schemas.MatchDetailV2Live.properties.p2_games_won.description
Total games won by player 2. Null when stats are unavailable.

# components.schemas.MatchDetailV2Live.properties.p2_total_points_won.description
Total points won by player 2. Null when stats are unavailable.

# components.schemas.MatchDetailV2Live.properties.p2_service_points_won.description
Points won on own serve by player 2. Null when stats are unavailable.

# components.schemas.MatchDetailV2Live.properties.p2_receiver_points_won.description
Points won on return by player 2. Null when stats are unavailable.

# components.schemas.MatchDetailV2Live.properties.p2_tiebreaks_won.description
Tiebreaks won by player 2. Null when stats are unavailable.

# components.schemas.MatchDetailV2Live.properties.p2_max_points_in_row.description
Longest run of consecutive points won by player 2. Null when stats are unavailable.

# components.schemas.MatchDetailV2Live.properties.p2_max_games_in_row.description
Longest run of consecutive games won by player 2. Null when stats are unavailable.

# components.schemas.MatchDetailV2Live.properties.aces_per_set.description
Aces per set: [{set: 1, p1: 4, p2: 2}, ...]. Empty when match_stats unavailable.

# components.schemas.MatchDetailV2Live.properties.double_faults_per_set.description
Double faults per set: [{set: 1, p1: 1, p2: 3}, ...]. Empty when match_stats unavailable.

# components.schemas.MatchDetailV2Schema.properties.api_id.description
Upstream data-source match ID, null if unknown.

# components.schemas.MatchDetailV2Schema.properties.tournament.description
Tournament this match belongs to, null if unassigned.

# components.schemas.MatchDetailV2Schema.properties.start_time.description
Scheduled start time (UTC), null if not set.

# components.schemas.MatchDetailV2Schema.properties.status.description
Match status: notstarted, inprogress, or finished.

# components.schemas.MatchDetailV2Schema.properties.home_score.description
Number of maps won by the home team, null before completion.

# components.schemas.MatchDetailV2Schema.properties.away_score.description
Number of maps won by the away team, null before completion.

# components.schemas.MatchDetailV2Schema.properties.best_of.description
Series format (e.g. 1, 3, 5), null if unknown.

# components.schemas.MatchDetailV2Schema.properties.stage.description
Tournament stage label (e.g. Group Stage, Playoffs), null if not set.

# components.schemas.MatchDetailV2Schema.properties.maps.description
Per-map round scores for each map played in the series.

# components.schemas.MatchH2HV2.properties.match_id.description
ID of the match these H2H stats relate to.

# components.schemas.MatchH2HV2.properties.player1.description
Player 1 brief (id, name, short_name, country_code, country_name, gender, current_ranking).

# components.schemas.MatchH2HV2.properties.player2.description
Player 2 brief (id, name, short_name, country_code, country_name, gender, current_ranking).

# components.schemas.MatchH2HV2.properties.h2h.description
Head-to-head record: total_matches, player1_wins, player2_wins, by_surface (hard/clay/grass with total and player1_wins), and recent_matches list. Null when no H2H record exists.

# components.schemas.MatchH2HV2.properties.player1_last5.description
Last 5 finished matches for player 1 (excluding this match). Each entry: id, date, tournament, surface, round, opponent, score, won.

# components.schemas.MatchH2HV2.properties.player2_last5.description
Last 5 finished matches for player 2 (excluding this match). Each entry: id, date, tournament, surface, round, opponent, score, won.

# components.schemas.MatchOddsV2.properties.match_date.description
Scheduled or actual match start time (UTC ISO-8601). Null when not set.

# components.schemas.MatchOddsV2.properties.bookmakers_count.description
Number of bookmakers with at least one price for this match.

# components.schemas.MatchOddsV2.properties.source.description
Odds source identifier: "multi" for multi-bookmaker data, "consensus" for best-available fallback.

# components.schemas.MatchOddsV2.properties.bookmakers.description
Per-bookmaker odds list. Each entry contains: bookmaker (display name), bookmaker_slug (identifier), odds_player1, odds_player2 (decimal), movement_player1/movement_player2 (DRIFTING/SHORTENING/STABLE/null), updated_at (ISO-8601 timestamp of last observation or null).

# components.schemas.MatchPointByPointV2.properties.available.description
False when point-by-point was never collected for this match. True with an empty sets list means it was collected and none exists.

# components.schemas.MatchPointByPointV2.properties.sets.description
Chronological. Each entry is {set, duration_seconds, games}; duration_seconds is the set length, null when not recorded. Each game is {game, server, winner, break, player1_games, player2_games, points}: server/winner are "player1"/"player2" or null, break is true when the receiver took the game, and player1_games/player2_games are the set score after it. Each point is {player1_score, player2_score, winner}, scores as displayed ("0", "15", "30", "40", "A"; plain integers in tiebreaks), winner null when the progression is undecidable.

# components.schemas.OddsItemV2Schema.properties.event_id.description
BSD event id this quote belongs to — the same id /api/v2/events/{id}/ takes. Null when the quote is not linked to a match in the catalogue.

# components.schemas.OddsItemV2Schema.properties.market.description
Betting market (e.g. 1x2, btts, over_under_25).

* `1x2` - 1x2
* `btts` - btts
* `over_under_15` - over_under_15
* `over_under_25` - over_under_25
* `over_under_35` - over_under_35
* `double_chance` - double_chance
* `draw_no_bet` - draw_no_bet
* `total_corners` - total_corners
* `corners_1x2` - corners_1x2
* `total_red_cards` - total_red_cards
* `red_card` - red_card

# components.schemas.OddsItemV2Schema.properties.outcome.description
Selection within the market (e.g. HOME, DRAW, AWAY, over, under, yes, no).

* `HOME` - HOME
* `DRAW` - DRAW
* `AWAY` - AWAY
* `over` - over
* `under` - under
* `yes` - yes
* `no` - no
* `1X` - 1X
* `12` - 12
* `X2` - X2

# components.schemas.OddsItemV2Schema.properties.line.description
Handicap or totals line. Only set for total_corners and total_red_cards markets; null for all others.

# components.schemas.OddsItemV2Schema.properties.outcome_name.description
Human-readable label for the outcome (e.g. "Over 2.5"). Null when not available.

# components.schemas.OddsItemV2Schema.properties.decimal_odds.description
Current decimal odds (e.g. 1.85). Multiply by stake to get total return.

# components.schemas.OddsItemV2Schema.properties.previous_decimal_odds.description
Previous odds observation before the last change. Null on first observation.

# components.schemas.OddsItemV2Schema.properties.implied_probability.description
Implied win probability derived from decimal_odds (1 / decimal_odds), ignoring the overround.

# components.schemas.OddsItemV2Schema.properties.movement.description
Direction of the most recent odds move: SHORTENING (odds fell = more likely) or DRIFTING (odds rose = less likely). Empty string if unchanged.

* `SHORTENING` - SHORTENING
* `DRIFTING` - DRIFTING

# components.schemas.OddsItemV2Schema.properties.is_max_quote.description
True when this is the best available price across all tracked bookmakers for this market + outcome.

# components.schemas.OddsItemV2Schema.properties.updated_at.description
UTC timestamp of the last odds change (ISO 8601, Z suffix).

# components.schemas.OddsListResponse.properties.event.description
Match context — only present when ?event=ID filter is used

# components.schemas.OddsSnapshot.description
Schema for `/api/odds/` rows. Backed by oddsfeed.Odds at runtime.

# components.schemas.OddsSnapshot.properties.market.description
Odds market: 1x2, over_under_15, over_under_25, over_under_35, btts, double_chance, draw_no_bet

# components.schemas.OddsSnapshot.properties.outcome.description
Outcome code: HOME, DRAW, AWAY, over, under, yes, no, 1X, 12, X2

# components.schemas.OddsSnapshot.properties.outcome_name.description
Human-readable outcome label (e.g. "Manchester United", "Over 2.5")

# components.schemas.OddsSnapshot.properties.decimal_odds.description
Decimal odds (European format, e.g. 1.90)

# components.schemas.OddsSnapshot.properties.previous_decimal_odds.description
Prior decimal odds for the same (event, bookmaker, market). Lets clients show movement without fetching history.

# components.schemas.OddsSnapshot.properties.is_max_quote.description
True when this row carried the best price for its outcome at observation time, as flagged by the source.

# components.schemas.OddsSnapshot.properties.movement.description
Direction of price change vs previous_decimal_odds: SHORTENING (price went down → market thinks it is more likely), DRIFTING (price went up → less likely), or empty when unchanged or no prior price.

# components.schemas.OddsSnapshot.properties.updated_at.description
When the source reported this price (ISO 8601)

# components.schemas.Player.properties.position.description
Generic position: G (Goalkeeper), D (Defender), M (Midfielder), F (Forward)

* `G` - Portero
* `D` - Defensa
* `M` - Centrocampista
* `F` - Delantero

# components.schemas.Player.properties.specific_position.description
Primary detailed position: GK, CB, LB, RB, LWB, RWB, DM, CM, AM, LW, RW, ST. Falls back to generic label (GK/DEF/MID/FWD) when not yet determined.

# components.schemas.Player.properties.positions_detailed.description
All known specific positions for this player (e.g. ["CB","LB"]) — usually a primary + secondary. Empty list if not yet synced.

# components.schemas.Player.properties.attributes.description
Overall skill breakdown on a 0-100 scale: {attacking, technical, tactical, defending, creativity}. Empty object when not yet synced.

# components.schemas.Player.properties.strengths.description
Ordered list of the player's top strengths (e.g. ["Long balls", "Playmaking"]).

# components.schemas.Player.properties.weaknesses.description
Ordered list of the player's notable weaknesses.

# components.schemas.Player.properties.preferred_foot.description
Preferred foot: R (Right), L (Left), B (Both)

* `R` - Right
* `L` - Left
* `B` - Both

# components.schemas.Player.properties.availability.description
Current availability: available, injured, doubtful, suspended

* `available` - Available
* `injured` - Injured
* `doubtful` - Doubtful
* `suspended` - Suspended

# components.schemas.Player.properties.injury_type.description
Injury/suspension description (e.g. Hamstring Injury, Red card suspension)

# components.schemas.PlayerAttributesV2Schema.properties.attacking.description
Attacking attribute score (0–20 FM scale). Null when not available.

# components.schemas.PlayerAttributesV2Schema.properties.technical.description
Technical attribute score (0–20 FM scale).

# components.schemas.PlayerAttributesV2Schema.properties.tactical.description
Tactical/positioning attribute score (0–20 FM scale).

# components.schemas.PlayerAttributesV2Schema.properties.defending.description
Defending attribute score (0–20 FM scale).

# components.schemas.PlayerAttributesV2Schema.properties.creativity.description
Creativity/vision attribute score (0–20 FM scale).

# components.schemas.PlayerAttributesV2Schema.properties.position.description
Primary position from the scouting model (e.g. "Striker", "Centre Back").

# components.schemas.PlayerDetailResponse.properties.api_id.description
External API ID for the player, null if not synced.

# components.schemas.PlayerDetailResponse.properties.short_name.description
Abbreviated name used in compact displays.

# components.schemas.PlayerDetailResponse.properties.country_code.description
ISO 3166-1 alpha-2 country code of the player.

# components.schemas.PlayerDetailResponse.properties.elo_overall.description
Overall ELO rating across all tournament formats.

# components.schemas.PlayerDetailResponse.properties.elo_major.description
ELO rating computed from major PDC events only.

# components.schemas.PlayerDetailResponse.properties.elo_protour.description
ELO rating computed from ProTour events only.

# components.schemas.PlayerDetailResponse.properties.avg_average.description
Three-dart average scored per visit, null if insufficient data.

# components.schemas.PlayerDetailResponse.properties.avg_checkout_pct.description
Checkout (double-out) success percentage, null if insufficient data.

# components.schemas.PlayerDetailResponse.properties.avg_180s.description
Average number of 180s scored per leg, null if insufficient data.

# components.schemas.PlayerDetailResponse.properties.legs_won_pct.description
Percentage of legs won over all recorded matches, null if insufficient data.

# components.schemas.PlayerDetailV2.properties.short_name.description
Abbreviated name (e.g. N. Djokovic). Null when not set.

# components.schemas.PlayerDetailV2.properties.country_code.description
ISO 3166-1 alpha-2 country code (e.g. RS).

# components.schemas.PlayerDetailV2.properties.date_of_birth.description
Player date of birth (ISO-8601 date). Null when not available.

# components.schemas.PlayerDetailV2.properties.height.description
Player height in centimetres. Null when not available.

# components.schemas.PlayerDetailV2.properties.weight.description
Player weight in kilograms. Null when not available.

# components.schemas.PlayerDetailV2.properties.plays.description
Dominant hand: right-handed or left-handed. Null when not recorded.

# components.schemas.PlayerDetailV2.properties.turned_pro.description
Year the player turned professional. Null when not recorded.

# components.schemas.PlayerDetailV2.properties.birthplace.description
Birthplace (city, country). Null when not recorded.

# components.schemas.PlayerDetailV2.properties.residence.description
Current residence (city, country). Null when not recorded.

# components.schemas.PlayerDetailV2.properties.prize_current_usd.description
Prize money won in the current season, in USD. Null when not recorded.

# components.schemas.PlayerDetailV2.properties.prize_total_usd.description
Career prize money, in USD. Null when not recorded.

# components.schemas.PlayerDetailV2.properties.current_ranking.description
Latest ranking snapshot (position, points, type). Null when no ranking is on record.

# components.schemas.PlayerDetailV2List.properties.short_name.description
Abbreviated name (e.g. N. Djokovic). Null when not set.

# components.schemas.PlayerDetailV2List.properties.country_code.description
ISO 3166-1 alpha-2 country code (e.g. RS).

# components.schemas.PlayerDetailV2List.properties.date_of_birth.description
Player date of birth (ISO-8601 date). Null when not available.

# components.schemas.PlayerDetailV2List.properties.height.description
Player height in centimetres. Null when not available.

# components.schemas.PlayerDetailV2List.properties.weight.description
Player weight in kilograms. Null when not available.

# components.schemas.PlayerDetailV2List.properties.plays.description
Dominant hand: right-handed or left-handed. Null when not recorded.

# components.schemas.PlayerDetailV2List.properties.turned_pro.description
Year the player turned professional. Null when not recorded.

# components.schemas.PlayerDetailV2List.properties.birthplace.description
Birthplace (city, country). Null when not recorded.

# components.schemas.PlayerDetailV2List.properties.residence.description
Current residence (city, country). Null when not recorded.

# components.schemas.PlayerDetailV2List.properties.prize_current_usd.description
Prize money won in the current season, in USD. Null when not recorded.

# components.schemas.PlayerDetailV2List.properties.prize_total_usd.description
Career prize money, in USD. Null when not recorded.

# components.schemas.PlayerDetailV2List.properties.current_ranking.description
Latest ranking snapshot (position, points, type). Null when no ranking is on record.

# components.schemas.PlayerDetailV2Schema.properties.short_name.description
Abbreviated name (e.g. "V. Gyökeres"). Empty string when not set.

# components.schemas.PlayerDetailV2Schema.properties.position.description
Generic position code: G (Goalkeeper), D (Defender), M (Midfielder), F (Forward). Empty string when unknown.

# components.schemas.PlayerDetailV2Schema.properties.specific_position.description
Specific position label (e.g. "Centre Back", "Attacking Midfielder"). Empty string when not set.

# components.schemas.PlayerDetailV2Schema.properties.jersey_number.description
Shirt number at the current club. Null when not available.

# components.schemas.PlayerDetailV2Schema.properties.date_of_birth.description
Player date of birth (ISO 8601). Null when not available.

# components.schemas.PlayerDetailV2Schema.properties.height_cm.description
Height in centimetres. Null when not available.

# components.schemas.PlayerDetailV2Schema.properties.weight_kg.description
Weight in kilograms. Null when not available.

# components.schemas.PlayerDetailV2Schema.properties.preferred_foot.description
Preferred foot: "left", "right", or "both". Empty string when unknown.

# components.schemas.PlayerDetailV2Schema.properties.nationality.description
Player nationality (country name in English). Empty string when unknown.

# components.schemas.PlayerDetailV2Schema.properties.current_team_id.description
ID of the player's current club. Use /api/v2/teams/{id}/ for details. Null when unattached.

# components.schemas.PlayerDetailV2Schema.properties.national_team_id.description
ID of the player's national team. Null when not capped.

# components.schemas.PlayerDetailV2Schema.properties.market_value_eur.description
Estimated market value in EUR (Transfermarkt-sourced). Null when not available.

# components.schemas.PlayerDetailV2Schema.properties.contract_until.description
Contract expiry date (ISO 8601). Null when unknown or out of contract.

# components.schemas.PlayerDetailV2Schema.properties.availability.description
Player availability status: "available", "injured", "suspended", or "doubtful".

# components.schemas.PlayerDetailV2Schema.properties.attributes.description
FM-sourced scouting attribute scores (0–20 per category). Null when no scouting data exists.

# components.schemas.PlayerDetailV2Schema.properties.strengths.description
List of identified strength labels (e.g. ["Aerial Threat", "Dribbling"]). Empty list when not available.

# components.schemas.PlayerDetailV2Schema.properties.weaknesses.description
List of identified weakness labels. Empty list when not available.

# components.schemas.PlayerDetailV2Schema.properties.rating.description
Overall FM scouting ability rating (0–200). Higher is better. Null when not available.

# components.schemas.PlayerDetailV2Schema.properties.potential.description
FM potential label (e.g. "Can Still Improve", "Reached Potential"). Null when not available.

# components.schemas.PlayerDetailV2Schema.properties.injury_risk.description
FM injury proneness label (e.g. "Unlikely", "Sometimes", "Often"). Null when not available.

# components.schemas.PlayerDetailV2Schema.properties.wage_eur_annual.description
Estimated annual gross wage in EUR. Null when not available.

# components.schemas.PlayerStat.properties.event.description
Match info: id, home_team, away_team, event_date, scores

# components.schemas.PlayerStat.properties.expected_goals.description
Expected goals (xG) — sum of shot quality

# components.schemas.PlayerStat.properties.expected_assists.description
Expected assists (xA) — sum of pass-to-shot quality

# components.schemas.PlayerStat.properties.total_shots.description
Total shots (on target + off target + blocked)

# components.schemas.PlayerStat.properties.shots_on_target.description
Shots on target (forcing a save or resulting in a goal)

# components.schemas.PlayerStat.properties.key_pass.description
Key passes — passes leading directly to a shot

# components.schemas.PlayerStat.properties.dispossessed.description
Times dispossessed (lost ball under pressure)

# components.schemas.PlayerStat.properties.possession_lost.description
Times possession lost (bad touch or pass)

# components.schemas.PlayerStat.properties.red_card.description
Red cards received (0 or 1; counts straight reds and second yellows)

# components.schemas.PlayerStat.properties.saves.description
Goalkeeper saves (null for outfield players)

# components.schemas.PlayerStat.properties.goals_conceded.description
Goals conceded (null for outfield players)

# components.schemas.PlayerStat.properties.heatmap.description
Pitch heatmap — list of {x, y} touch coordinates (0–100 scale, origin top-left)

# components.schemas.PlayerStatPlayer.properties.specific_position.description
Primary detailed position: GK, CB, LB, RB, LWB, RWB, DM, CM, AM, LW, RW, ST

# components.schemas.PlayerStatPlayer.properties.positions_detailed.description
All detailed positions for this player (e.g. ["CB","LB"]). Empty if not yet synced.

# components.schemas.PlayerTransfer.properties.transfer_date.description
Date the transfer was completed (YYYY-MM-DD)

# components.schemas.PlayerTransfer.properties.from_team_name.description
Selling club name (string fallback if from_team object is null)

# components.schemas.PlayerTransfer.properties.to_team_name.description
Buying club name (string fallback if to_team object is null)

# components.schemas.PlayerTransfer.properties.fee.description
Transfer fee in EUR (null if undisclosed or free)

# components.schemas.PlayerTransfer.properties.fee_description.description
Human-readable fee label (e.g. "Free transfer", "Loan", "€45M")

# components.schemas.PredictionDetailV2.properties.match.description
Brief match object (id, tournament, player1, player2, match_date, status, round_name, sets, odds).

# components.schemas.PredictionDetailV2.properties.prob_player1_wins.description
Model probability (0-100) that player 1 wins the match.

# components.schemas.PredictionDetailV2.properties.prob_player2_wins.description
Model probability (0-100) that player 2 wins the match.

# components.schemas.PredictionDetailV2.properties.predicted_winner.description
Name of the player predicted to win. Null when prediction is unavailable.

# components.schemas.PredictionDetailV2.properties.confidence.description
Model confidence score (0-100) for the predicted winner.

# components.schemas.PredictionDetailV2.properties.expected_total_sets.description
Model expected total number of sets played in the match.

# components.schemas.PredictionDetailV2.properties.prob_over_2_5_sets.description
Model probability (0-100) that the match goes to more than 2.5 sets.

# components.schemas.PredictionDetailV2.properties.expected_total_games.description
Model expected total number of games played across all sets.

# components.schemas.PredictionDetailV2.properties.prob_over_20_5_games.description
Model probability (0-100) that total games exceed 20.5.

# components.schemas.PredictionDetailV2.properties.prob_over_21_5_games.description
Model probability (0-100) that total games exceed 21.5.

# components.schemas.PredictionDetailV2.properties.prob_over_22_5_games.description
Model probability (0-100) that total games exceed 22.5.

# components.schemas.PredictionDetailV2.properties.prob_player1_wins_first_set.description
Model probability (0-100) that player 1 wins the first set.

# components.schemas.PredictionDetailV2.properties.actual_winner.description
Name of the player who actually won. Null for upcoming or unresolved matches.

# components.schemas.PredictionDetailV2.properties.was_winner_correct.description
True when predicted_winner matches actual_winner. Null for unresolved matches.

# components.schemas.PredictionDetailV2List.properties.match.description
Brief match object the prediction is for.

# components.schemas.PredictionDetailV2List.properties.home_win_prob.description
Model probability (0-100) that the home team wins.

# components.schemas.PredictionDetailV2List.properties.away_win_prob.description
Model probability (0-100) that the away team wins.

# components.schemas.PredictionDetailV2List.properties.predicted_winner.description
Name of the team predicted to win, null if no clear winner.

# components.schemas.PredictionDetailV2List.properties.confidence.description
Overall model confidence score (0-100) for the prediction.

# components.schemas.PredictionDetailV2Schema.properties.match.description
Brief summary of the match this prediction covers.

# components.schemas.PredictionDetailV2Schema.properties.home_win_prob.description
Model probability (0-1) that the home team wins.

# components.schemas.PredictionDetailV2Schema.properties.away_win_prob.description
Model probability (0-1) that the away team wins.

# components.schemas.PredictionDetailV2Schema.properties.predicted_winner.description
Name of the team predicted to win, null if undecided.

# components.schemas.PredictionDetailV2Schema.properties.confidence.description
Model confidence score for the predicted outcome (0-1).

# components.schemas.PredictionDetailV2Schema.properties.home_form_score.description
Aggregated recent-form score for the home team, null if insufficient data.

# components.schemas.PredictionDetailV2Schema.properties.away_form_score.description
Aggregated recent-form score for the away team, null if insufficient data.

# components.schemas.PredictionDetailV2Schema.properties.h2h_advantage.description
Head-to-head advantage metric; positive favours home team, null if no H2H history.

# components.schemas.PredictionDetailV2Schema.properties.is_correct.description
True if the prediction matched the actual result, null if the match has not finished yet.

# components.schemas.PredictionDetailV2Single.properties.match.description
Brief match object the prediction is for.

# components.schemas.PredictionDetailV2Single.properties.home_win_prob.description
Model probability (0-100) that the home team wins.

# components.schemas.PredictionDetailV2Single.properties.away_win_prob.description
Model probability (0-100) that the away team wins.

# components.schemas.PredictionDetailV2Single.properties.predicted_winner.description
Name of the team predicted to win, null if no clear winner.

# components.schemas.PredictionDetailV2Single.properties.confidence.description
Overall model confidence score (0-100) for the prediction.

# components.schemas.PredictionV2BttsSchema.properties.prob_yes.description
Probability (0-100) that both teams score at least one goal (BTTS).

# components.schemas.PredictionV2CornersSchema.properties.prob_over_85.description
Probability (0-100) of more than 8.5 total corners.

# components.schemas.PredictionV2CornersSchema.properties.prob_over_95.description
Probability (0-100) of more than 9.5 total corners.

# components.schemas.PredictionV2CornersSchema.properties.prob_over_105.description
Probability (0-100) of more than 10.5 total corners.

# components.schemas.PredictionV2DnbSchema.properties.prob_home.description
Draw-no-bet: probability (0-100) the home side wins given no draw.

# components.schemas.PredictionV2EventEmbedSchema.properties.event_date.description
Scheduled kick-off time in UTC (ISO 8601, Z suffix).

# components.schemas.PredictionV2EventEmbedSchema.properties.status.description
Match status (e.g. notstarted, inprogress, finished).

# components.schemas.PredictionV2EventEmbedSchema.properties.league_id.description
Internal ID of the competition. Null if unassigned.

# components.schemas.PredictionV2ExpectedGoalsSchema.properties.home.description
Expected goals for the home team. Null when the model side is unavailable (market-only forecast).

# components.schemas.PredictionV2ExpectedGoalsSchema.properties.away.description
Expected goals for the away team. Null when the model side is unavailable.

# components.schemas.PredictionV2MarketsSchema.properties.match_result.description
1X2 match result probabilities and predicted outcome.

# components.schemas.PredictionV2MarketsSchema.properties.over_under.description
Over/under goal probabilities for the 1.5, 2.5, and 3.5 lines.

# components.schemas.PredictionV2MarketsSchema.properties.btts.description
Both Teams To Score (BTTS) market probability.

# components.schemas.PredictionV2MarketsSchema.properties.corners.description
Total-corner O/U lines. Null when neither team history nor a market line exists.

# components.schemas.PredictionV2MatchResultSchema.properties.predicted.description
Most likely outcome: H (home win), D (draw), or A (away win).

* `H` - H
* `D` - D
* `A` - A

# components.schemas.PredictionV2ModelSchema.properties.confidence.description
Probability (0–1) of the most likely 1X2 outcome.

# components.schemas.PredictionV2ModelSchema.properties.version.description
Engine version identifier (e.g. "dc-blend-v1").

# components.schemas.PredictionV2OverUnderSchema.properties.prob_over_15.description
Probability (0-100) that the match has more than 1.5 total goals.

# components.schemas.PredictionV2OverUnderSchema.properties.prob_over_25.description
Probability (0-100) that the match has more than 2.5 total goals.

# components.schemas.PredictionV2OverUnderSchema.properties.prob_over_35.description
Probability (0-100) that the match has more than 3.5 total goals.

# components.schemas.PredictionV2RecommendationsSchema.properties.favorite.description
Side with the higher win probability: H (home) or A (away).

* `H` - H
* `A` - A

# components.schemas.PredictionV2RecommendationsSchema.properties.favorite_prob.description
Win probability (0-100) of the favourite.

# components.schemas.PredictionV2RecommendationsSchema.properties.bet_favorite.description
Always false — the engine serves calibrated probabilities, not bet advice.

# components.schemas.PredictionV2RecommendationsSchema.properties.over_15.description
Always false (kept for schema compatibility).

# components.schemas.PredictionV2RecommendationsSchema.properties.over_25.description
Always false (kept for schema compatibility).

# components.schemas.PredictionV2RecommendationsSchema.properties.over_35.description
Always false (kept for schema compatibility).

# components.schemas.PredictionV2RecommendationsSchema.properties.btts.description
Always false (kept for schema compatibility).

# components.schemas.PredictionV2RecommendationsSchema.properties.winner.description
Always false (kept for schema compatibility).

# components.schemas.PredictionV2Schema.properties.created_at.description
UTC timestamp when the forecast was generated (ISO 8601, Z suffix).

# components.schemas.PredictionV2Schema.properties.event.description
Brief summary of the match this forecast covers.

# components.schemas.PredictionV2Schema.properties.markets.description
Market-grouped probabilities (match result, xG, over/under, BTTS, score, DNB, corners).

# components.schemas.PredictionV2Schema.properties.recommendations.description
Compatibility block; the engine does not issue bet recommendations.

# components.schemas.PredictionV2Schema.properties.model.description
Engine metadata: top-outcome probability and version.

# components.schemas.PredictionV2ScoreSchema.properties.most_likely.description
Most likely final scoreline (e.g. "2-1"). Null when not computed.

# components.schemas.RankingDetailV2.properties.player.description
Player brief (id, name, short_name, country_code, country_name, gender, current_ranking). Null when player data is missing.

# components.schemas.RankingDetailV2.properties.date.description
Snapshot date of this ranking entry (ISO-8601). Null when not recorded.

# components.schemas.RankingDetailV2.properties.position.description
Ranking position at this snapshot date (1 = highest).

# components.schemas.RankingDetailV2.properties.points.description
Ranking points at this snapshot date. Null when not recorded.

# components.schemas.RankingDetailV2.properties.previous_position.description
Ranking position in the previous snapshot. Null when not available.

# components.schemas.RankingDetailV2.properties.previous_points.description
Ranking points in the previous snapshot. Null when not available.

# components.schemas.RankingDetailV2.properties.best_position.description
Career best ranking position. Null when not recorded.

# components.schemas.RankingDetailV2List.properties.player.description
Player brief (id, name, short_name, country_code, country_name, gender, current_ranking). Null when player data is missing.

# components.schemas.RankingDetailV2List.properties.date.description
Snapshot date of this ranking entry (ISO-8601). Null when not recorded.

# components.schemas.RankingDetailV2List.properties.position.description
Ranking position at this snapshot date (1 = highest).

# components.schemas.RankingDetailV2List.properties.points.description
Ranking points at this snapshot date. Null when not recorded.

# components.schemas.RankingDetailV2List.properties.previous_position.description
Ranking position in the previous snapshot. Null when not available.

# components.schemas.RankingDetailV2List.properties.previous_points.description
Ranking points in the previous snapshot. Null when not available.

# components.schemas.RankingDetailV2List.properties.best_position.description
Career best ranking position. Null when not recorded.

# components.schemas.RankingDetailV2Schema.properties.ranking_type.description
Ranking series: PDC, ProTour, Challenge Tour, etc.

# components.schemas.RankingDetailV2Schema.properties.date.description
Date of this ranking snapshot (ISO 8601).

# components.schemas.RankingDetailV2Schema.properties.previous_position.description
Rank position at the previous snapshot. Null on a player's first appearance.

# components.schemas.RankingDetailV2Schema.properties.prize_money_gbp.description
Prize money used to calculate this position, in GBP. Null when not available.

# components.schemas.RefereeDetailV2Schema.properties.country.description
Country name. Empty string when not set.

# components.schemas.RefereeDetailV2Schema.properties.nationality_a3.description
ISO 3166-1 alpha-3 nationality code (e.g. PRT, ESP). Empty string when not set.

# components.schemas.RefereeDetailV2Schema.properties.birthdate.description
Date of birth (ISO 8601). Null when not recorded.

# components.schemas.RefereeDetailV2Schema.properties.matches.description
Number of finished matches officiated in the filtered scope (or all-time when no filter applied).

# components.schemas.RefereeDetailV2Schema.properties.total_yellow_cards.description
Total yellow cards shown across all counted matches.

# components.schemas.RefereeDetailV2Schema.properties.total_red_cards.description
Total red cards shown (includes straight reds and second yellows).

# components.schemas.RefereeDetailV2Schema.properties.avg_yellow_per_match.description
Average yellow cards per match. Null when no matches played.

# components.schemas.RefereeDetailV2Schema.properties.avg_red_per_match.description
Average red cards per match. Null when no matches played.

# components.schemas.RefereeDetailV2Schema.properties.avg_goals_per_match.description
Average total goals per match. Null when no matches played.

# components.schemas.RefereeDetailV2Schema.properties.avg_fouls_per_match.description
Average total fouls per match (home + away). Null when foul data is unavailable.

# components.schemas.RefereeDetailV2Schema.properties.career_games.description
Total career matches officiated (lifetime, from external source). Null when not recorded.

# components.schemas.RefereeDetailV2Schema.properties.career_yellow_cards.description
Total career yellow cards issued. Null when not recorded.

# components.schemas.RefereeDetailV2Schema.properties.career_red_cards.description
Total career red cards issued. Null when not recorded.

# components.schemas.Season.description
Season within a league — e.g. 2024/25 Premier League.

# components.schemas.Season.properties.is_current.description
True if this is the currently active season for the league

# components.schemas.SocialAccountSchema.properties.handle.description
Social media handle (e.g. Twitter username without @). Empty string when not available.

# components.schemas.SocialAccountSchema.properties.name.description
Display name of the account. Empty string when not available.

# components.schemas.SocialAccountSchema.properties.verified.description
True if the account holds a platform-verified badge.

# components.schemas.SocialItem.description
Tweet or video highlight with lightweight entity links.

# components.schemas.SocialItem.properties.type.description
"tweet" (official club twitter account), "video" (match highlight), or "news" (editorial article)

* `tweet` - Tweet
* `video` - Video highlight
* `news` - News article

# components.schemas.SocialItem.properties.url.description
Direct link to the tweet, highlight video, or news article

# components.schemas.SocialItem.properties.title.description
Title of the video highlight (empty for tweets)

# components.schemas.SocialItem.properties.text.description
Tweet body, or subtitle/caption for videos

# components.schemas.SocialItem.properties.media_urls.description
Raw media objects from upstream (image/video URLs)

# components.schemas.SocialItem.properties.account_handle.description
Twitter @handle (or "youtube" for videos)

# components.schemas.SocialItem.properties.account_verified.description
True if the posting Twitter account is verified

# components.schemas.SocialItem.properties.published_at.description
When the tweet or video was published (ISO 8601)

# components.schemas.SocialItemV2Schema.properties.type.description
Content type: tweet (Twitter/X post) or video (highlight clip).

* `tweet` - tweet
* `video` - video

# components.schemas.SocialItemV2Schema.properties.url.description
Canonical URL of the original post or video.

# components.schemas.SocialItemV2Schema.properties.text.description
Body text of the tweet or video caption. Empty string when not available.

# components.schemas.SocialItemV2Schema.properties.title.description
Title for video items. Empty string for tweets or when not set.

# components.schemas.SocialItemV2Schema.properties.thumbnail.description
URL of the best available thumbnail image. Empty string when no media is attached.

# components.schemas.SocialItemV2Schema.properties.media.description
Normalized media attachments (images and videos). Empty array when there are none.

# components.schemas.SocialItemV2Schema.properties.account.description
The social account that published this item.

# components.schemas.SocialItemV2Schema.properties.published_at.description
UTC timestamp when the item was published (ISO 8601, Z suffix).

# components.schemas.SocialItemV2Schema.properties.linked.description
BSD entities associated with this social item.

# components.schemas.SocialLinkedEventSchema.properties.event_date.description
Scheduled kick-off time in UTC (ISO 8601, Z suffix).

# components.schemas.SocialLinkedSchema.properties.players.description
Players linked to this social item (id + name).

# components.schemas.SocialLinkedSchema.properties.managers.description
Managers linked to this social item (id + name).

# components.schemas.SocialMediaItemSchema.properties.type.description
Media asset type: image or video.

* `image` - image
* `video` - video

# components.schemas.SocialMediaItemSchema.properties.width.description
Width in pixels. Null when not recorded.

# components.schemas.SocialMediaItemSchema.properties.height.description
Height in pixels. Null when not recorded.

# components.schemas.SocialMediaItemSchema.properties.duration_seconds.description
Video duration in seconds. Only present for video type; null when not recorded.

# components.schemas.SquadRowV2Schema.properties.status.description
* `official` - official
* `preliminary` - preliminary
* `projected` - projected
* `dropped` - dropped

# components.schemas.SquadRowV2Schema.properties.player_id.description
Internal Player id if the call-up resolved to an existing player record. null when the player is not yet in our Player table — name + club + caps + age remain populated from the source announcement.

# components.schemas.TVChannel.description
An official broadcast channel licensed to show events in a given country.
Only licensed rights-holders are ingested — no pirate streams.

# components.schemas.TVChannel.properties.country_code.description
ISO country code where this channel is licensed

# components.schemas.TVChannel.properties.link.description
Official channel link / affiliate URL (empty when not provided)

# components.schemas.TVChannel.properties.is_official.description
Always True — only licensed rights-holders are ingested

# components.schemas.TVChannelV2Schema.properties.name.description
Display name of the channel (e.g. "BT Sport 1").

# components.schemas.TVChannelV2Schema.properties.country_code.description
ISO 3166-1 alpha-2 country code of the channel's primary broadcast region.

# components.schemas.TVChannelV2Schema.properties.link.description
URL to the channel's website or stream page. Empty string when not set.

# components.schemas.Team.properties.coach.description
Current head coach: name, shortName (from most recent match, null if unavailable)

# components.schemas.TeamDetailFullV2Schema.properties.map_stats.description
Latest map and round winrate statistics; null when no data is available.

# components.schemas.TeamDetailV2List.properties.country.description
Country the team represents, empty string if unknown.

# components.schemas.TeamDetailV2List.properties.country_code.description
ISO country code for the team country, empty string if unknown.

# components.schemas.TeamDetailV2List.properties.elo_rating.description
Current ELO rating reflecting the team strength relative to opponents.

# components.schemas.TeamDetailV2Schema.properties.name.description
Full official team name (e.g. "Manchester City").

# components.schemas.TeamDetailV2Schema.properties.short_name.description
Abbreviated name (e.g. "Man City"). Empty string when not set.

# components.schemas.TeamDetailV2Schema.properties.country.description
Country the team represents (e.g. "England"). Empty string when unknown.

# components.schemas.TeamDetailV2Schema.properties.venue_id.description
ID of the team's home stadium. Use /api/v2/venues/{id}/ for details. Null when no venue is linked.

# components.schemas.TeamDetailV2Single.properties.country.description
Country the team represents, empty string if unknown.

# components.schemas.TeamDetailV2Single.properties.country_code.description
ISO country code for the team country, empty string if unknown.

# components.schemas.TeamDetailV2Single.properties.elo_rating.description
Current ELO rating reflecting the team strength relative to opponents.

# components.schemas.TeamList.description
Lightweight serializer for list endpoint — no per-team DB queries.

# components.schemas.TeamMapStatsV2Schema.properties.as_of.description
Timestamp of the most recent match used for this snapshot.

# components.schemas.TeamMapStatsV2Schema.properties.sample_size.description
Number of maps included in the statistical sample.

# components.schemas.TeamMapStatsV2Schema.properties.map_winrate.description
Overall map winrate (%) across all maps in the sample.

# components.schemas.TeamMapStatsV2Schema.properties.round_winrate.description
Overall round winrate (%) across all rounds in the sample.

# components.schemas.TeamMapStatsV2Schema.properties.round_winrate_t.description
Round winrate (%) when playing as the Terrorist side.

# components.schemas.TeamMapStatsV2Schema.properties.round_winrate_ct.description
Round winrate (%) when playing as the Counter-Terrorist side.

# components.schemas.TournamentDetailResponse.properties.api_id.description
External API ID for the tournament, null if not synced.

# components.schemas.TournamentDetailResponse.properties.category.description
Tournament category or series name, e.g. PDC European Tour.

# components.schemas.TournamentDetailResponse.properties.country.description
Full country name where the tournament is held.

# components.schemas.TournamentDetailResponse.properties.country_code.description
ISO 3166-1 alpha-2 country code for the tournament host country.

# components.schemas.TournamentDetailResponse.properties.is_active.description
True if the tournament is currently active and accepting matches.

# components.schemas.TournamentDetailV2.properties.category.description
Tournament tier (e.g. grand_slam, masters_1000, atp_500, wta_1000). Null when not classified.

# components.schemas.TournamentDetailV2.properties.surface.description
Playing surface: hard, clay, grass, or carpet. Null when unknown.

# components.schemas.TournamentDetailV2.properties.circuit.description
Tour circuit: ATP or WTA. Null when not classified.

# components.schemas.TournamentDetailV2.properties.country.description
Country where the tournament is held. Empty string when not recorded.

# components.schemas.TournamentDetailV2.properties.city.description
City where the tournament is held. Empty string when not recorded.

# components.schemas.TournamentDetailV2.properties.winner_points.description
Ranking points awarded to the tournament winner. Null when not set.

# components.schemas.TournamentDetailV2.properties.is_active.description
True when the tournament is currently active in the schedule.

# components.schemas.TournamentDetailV2List.properties.category.description
Tournament tier (e.g. grand_slam, masters_1000, atp_500, wta_1000). Null when not classified.

# components.schemas.TournamentDetailV2List.properties.surface.description
Playing surface: hard, clay, grass, or carpet. Null when unknown.

# components.schemas.TournamentDetailV2List.properties.circuit.description
Tour circuit: ATP or WTA. Null when not classified.

# components.schemas.TournamentDetailV2List.properties.country.description
Country where the tournament is held. Empty string when not recorded.

# components.schemas.TournamentDetailV2List.properties.city.description
City where the tournament is held. Empty string when not recorded.

# components.schemas.TournamentDetailV2List.properties.winner_points.description
Ranking points awarded to the tournament winner. Null when not set.

# components.schemas.TournamentDetailV2List.properties.is_active.description
True when the tournament is currently active in the schedule.

# components.schemas.TournamentDetailV2Schema.properties.api_id.description
Upstream data-source tournament ID, null if unknown.

# components.schemas.TournamentDetailV2Schema.properties.name.description
Full tournament name (e.g. ESL Pro League, BLAST Premier).

# components.schemas.TournamentDetailV2Schema.properties.is_active.description
True if the tournament is currently running or accepting matches.

# components.schemas.Venue.description
Full venue serializer used by /api/venues/ endpoints.

# components.schemas.Venue.properties.team.description
Team that plays home at this venue (id, name) — null if unassigned

# components.schemas.VenueBrief.description
Compact venue object embedded in Team responses.

# components.schemas.VenueDetailV2Schema.properties.city.description
City where the venue is located. Empty string when not set.

# components.schemas.VenueDetailV2Schema.properties.country.description
Country name. Empty string when not set.

# components.schemas.VenueDetailV2Schema.properties.country_code.description
ISO 3166-1 alpha-2 country code (e.g. PT, ES). Empty string when not set.

# components.schemas.VenueDetailV2Schema.properties.capacity.description
Seating capacity of the venue. Null when not recorded.

# components.schemas.VenueDetailV2Schema.properties.latitude.description
WGS-84 latitude (decimal degrees). Null when not georeferenced.

# components.schemas.VenueDetailV2Schema.properties.longitude.description
WGS-84 longitude (decimal degrees). Null when not georeferenced.

# components.schemas.VenueDetailV2Schema.properties.pitch_length_m.description
Pitch length in metres. Null when not recorded.

# components.schemas.VenueDetailV2Schema.properties.pitch_width_m.description
Pitch width in metres. Null when not recorded.

# components.schemas.VenueDetailV2Schema.properties.built_year.description
Year the venue was built or officially opened. Null when not recorded.

# components.schemas.VenueDetailV2Schema.properties.home_team_id.description
Internal ID of the team that uses this venue as their home ground. Null for neutral or unassigned venues.

# components.schemas._ExtraTimeScoreSchema.properties.home.description
Goals scored by the home team in extra time only.

# components.schemas._ExtraTimeScoreSchema.properties.away.description
Goals scored by the away team in extra time only.

# components.schemas._HighlightSchema.properties.kind.description
Clip type: full (full match), goals (all goals), key (key moments), or clip (short highlight).

# components.schemas._HighlightSchema.properties.thumbnail.description
Thumbnail image URL. Null when not available.

# components.schemas._HighlightSchema.properties.published_at.description
UTC datetime when the clip was published.

# components.schemas._LineupPlayerV2.properties.ai_score.description
AI confidence score 0–1, four decimals. Always null when `lineup_status` is `confirmed`.

# components.schemas._LineupSideV2.properties.confidence.description
AI confidence for the predicted formation, 0–1, four decimals. Always null when `lineup_status` is `confirmed`.

# components.schemas._MapWinrateV2Schema.properties.winrate.description
Team winrate (%) on this map from recent picked-map history.

# components.schemas._PlayerBriefSchema.properties.country_code.description
ISO 3166-1 alpha-2 country code (e.g. GB).

# components.schemas._PlayerBriefSchema.properties.elo_overall.description
Overall ELO rating across all tournament formats.

# components.schemas._SeasonSchema.properties.name.description
Human-readable season label (e.g. "2025/2026").

# components.schemas._SeasonSchema.properties.year.description
Season start year (e.g. 2025). Null for competitions without a standard year.

# components.schemas._SeasonSchema.properties.start_date.description
Date the season starts (ISO 8601). Null when not set.

# components.schemas._SeasonSchema.properties.end_date.description
Date the season ends (ISO 8601). Null when not set.

# components.schemas._SeasonSchema.properties.is_current.description
True if this is the active season for the league.

# components.schemas._TournamentBriefSchema.properties.is_active.description
True if the tournament is currently running.

# components.schemas._UnavailablePlayerV2.properties.status.description
Availability status — e.g. `injured`, `suspended`, `doubtful`.

# components.schemas._UnavailablePlayerV2.properties.reason.description
Free-text reason — e.g. `Muscle Injury`, `5 yellow cards`.

# components.schemas._WeatherSchema.properties.code.description
Numeric weather code (0=unknown, 1=clear, 2=cloudy, 3=rain, 4=snow, 5=extreme).

# components.schemas._WeatherSchema.properties.description.description
Human-readable weather label derived from the code (e.g. "clear", "rain").

# components.schemas._WeatherSchema.properties.wind_speed.description
Wind speed in km/h at match time. Null when not available.

# components.schemas._WeatherSchema.properties.temperature_c.description
Air temperature in Celsius at match time. Null when not available.

# components.securitySchemes.tokenAuth.description
Token-based auth. Format: "Token YOUR_API_KEY". Register free at /register/