# 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_05, 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, ordered by kick-off ascending. `channel_id` is the **internal PK** of TVChannel (not the upstream channel_id used in v1). When neither date_from nor date_to is set, returns the default window now-3h to now+7d — pass date_from to reach past fixtures. Cached 1 hour.

# paths./api/v2/broadcasts/.get.parameters[].description
Kick-off >=. Setting either bound disables the default now-3h..now+7d window.

# paths./api/v2/broadcasts/.get.parameters[].description
Kick-off <=. Setting either bound disables the default now-3h..now+7d window.

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

# paths./api/v2/coverage/.get.description
One row per sport: whether it has fixtures ahead, how many, how many of them are priced, and when the next and last events are. Written so an empty match list can be told apart from a closed season — hockey and basketball are out of season for months at a time, and the fixture endpoints cannot say so on their own.

Open to any authenticated account, whatever it subscribes to.

# paths./api/v2/coverage/.get.parameters[].description
Restrict to one sport key (football, tennis, basketball, hockey, darts, csgo, horseracing).

# 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
Matchday within `stage` (1-8 for a Champions League league phase). Requires `stage`: round numbers repeat across stages, so on its own it would mix a matchday with a knockout tie.

# paths./api/v2/events/.get.parameters[].description
Filter by season ID. Returns every match in that season.

# paths./api/v2/events/.get.parameters[].description
Filter by competition stage. Use the `stage` slug returned by this endpoint, or read the full list for a season from `/api/v2/leagues/{id}/seasons/` (field `stages`). Main stages are `group-stage`, `league-phase` and `regular-season`; knockout and qualifying rounds use their own slug, e.g. `round-of-16`, `quarterfinals`, `final`, `qualification-round-1`. Example: `?league_id=7&season_id=1112&stage=league-phase` returns the 144 Champions League league-phase fixtures.

# 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.

**Requires Football Unlimited.** Every field in this response is per-bookmaker, so without the entitlement there is nothing to degrade to and the endpoint answers 403 (`bookmakers_not_entitled`) rather than a thinner grid that looks like live data. For the free consensus price use /api/v2/odds/.

# 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.

**xG provenance.** Not every xG here is a measured one: where the shot feed ships no price we estimate it ourselves, and whole competitions are estimated end to end. Four flags say which is which, all answering the same question — `true` = our estimate, `false` = the measured value, `null` = there is no xG to qualify (a shoot-out attempt, or a shot with no usable geometry):

- `xg_estimated` at the root — true when *any* xG in this response is ours. Read this one to decide whether the match belongs in a training set.
- `xg_estimated` per shot in `shotmap` — the per-shot truth the rest derive from.
- `estimated` inside each `stats.*.xg` block — per side and per half. A match can carry a measured team total over shots we priced ourselves, so the team block and the shots can legitimately disagree.
- `estimated` per bucket in `xg_per_minute`.

# 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
Return at most this many events. `count` stays the total number live, not the number returned.

# 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. Unknown query parameters are rejected with 400 rather than ignored, so a mistyped filter fails loudly instead of returning the unfiltered list.

# 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. Pass `team_id` to rank one squad instead of the whole league.

# 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}/top/{stat}/.get.parameters[].description
Rank only this team's players. Ranking is then within the squad, so a player outside the league top 50 still appears.

# 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
Club-by-club tenure history: dates, record, points per match, goals and a home/away split for each spell. Every tenure with a start date also carries `appointment_effect` — how the club performed in the matches immediately before the appointment against the same number immediately after, which is the only way to read a points-per-match figure as good or bad rather than just high or low.

# paths./api/v2/managers/{id}/career/.get.parameters[].description
Matches either side of the appointment for `appointment_effect` (default 10, max 38). Pass 0 to skip the calculation.

# paths./api/v2/managers/{id}/matches/.get.description
Matches managed by this manager, newest first. Returns the full history by default — narrow it with `date_from`/`date_to`, `league_id`, `team_id` or `status`. Same row shape as `/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_05/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)
- european_handicap → HOME, DRAW, AWAY (whole line in `line`, no push)
- asian_handicap → HOME, AWAY (line in `line`, settlement in `push`)

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

Asian handicap lines are home-relative and may be quarter lines: `line=-0.25` means the home team starts a quarter goal down, and the AWAY leg of that same quote is +0.25. The `push` field carries the settlement rule the price alone cannot express — "none" on half lines, "full" on whole lines (stake returned), "half" on quarter lines (stake split, half returned).

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
Keyset pagination. Opaque value taken from the `next` link; resumes exactly where the previous page ended, at constant cost. Use this to consume the feed incrementally (pair it with `updated_after`). Ignores `offset`; `previous` is null (forward-only).

# paths./api/v2/odds/.get.parameters[].description
Max 10000. To walk the whole feed use `cursor` instead — offset pages recount from the start every time.

# 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, newest first. Returns the full history by default — narrow it with `date_from`/`date_to`, `league_id`, `season_id` or `status`. Same row shape as `/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`, ordered by position then shirt number. Each player carries their current availability (`availability`, `injury_type`, `injury_expected_return`), so team news does not need a second call.

# paths./api/v2/transfers/.get.description
Cross-player transfer feed. Newest first by default; pass `ordering=-fee` for the biggest deals. Filter by league, team (incoming or outgoing), player, date range and minimum fee. Fees are in EUR. Unknown query parameters are rejected with 400 rather than ignored, so a mistyped filter fails loudly instead of returning the unfiltered feed.

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

# paths./api/v2/transfers/.get.parameters[].description
Transfers where either club has played in this league (BSD league id, the one from /api/v2/leagues/). Same either-side semantics as team_id.

# 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/transfers/ledger/.get.description
Club-level transfer accounting for a window: gross spend, gross income, net spend, squad turnover, loan dependency and the average age of players in and out.

Money only counts where a fee was published. A move with no figure is counted under `undisclosed` rather than as zero — summing the blanks as zeroes reports a tenth of what the big leagues actually spend. `free` is the separate case where the fee is known to be nothing.

Loan returns are not arrivals. A player coming back from a loan is the same player returning to where he already belonged, and counting him as a signing inflates the arrivals of every club that lends anyone out.

Rows dated in the future are always excluded, whatever window you ask for: the dataset carries pre-agreed loan returns and capture typos ahead of today.

# paths./api/v2/transfers/ledger/.get.parameters[].description
Never reaches past today even if you ask it to.

# paths./api/v2/transfers/ledger/.get.parameters[].description
One club. Mutually exclusive with league_id.

# paths./api/v2/transfers/routes/.get.description
The club pairs that repeat: who sells to whom, how often, how much changed hands and which players walked it.

Only moves where both ends are clubs we hold are counted. A route with a bare name on one side cannot be followed or linked, and the same club spelled three ways would show up as three destinations.

# paths./api/v2/transfers/routes/.get.parameters[].description
Minimum moves for a pair to count as a route (default 2).

# 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}/odds/.get.description
Per-bookmaker moneyline prices plus every other market offered on the event (spreads, totals), each with the direction the price is moving. `source` is "multi" when per-bookmaker prices exist and "none" when the event has not been linked to a priced feed event yet.

# paths./basketball/api/v2/events/{id}/odds/.get.summary
Per-bookmaker odds for a basketball 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/{id}/odds/.get.description
Per-bookmaker match-winner prices plus every other market offered on the match (map handicaps, totals), each with the direction the price is moving. Falls back to the single stored price when the match has not been linked to a priced feed event yet — `source` says which you got.

# paths./csgo/api/v2/matches/{id}/player-stats/.get.description
Per player: per-round averages, K/D, damage, opening kills, utility and clutch rounds, each with the percentile it sits in among players at the same level. Empty list when a match has no player stats collected.

# paths./csgo/api/v2/matches/{id}/stats/.get.description
Per-team round and combat form as it stood before the match, each team's map pool with its win rate per map, and the head-to-head record between the two sides. Empty lists when a match has no stats collected.

# paths./csgo/api/v2/matches/{id}/stats/.get.summary
Pre-match team form, map pool and head-to-head (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/matches/{id}/h2h/.get.description
Every finished meeting between these two players, whichever side of the board they were on, plus their scoring averages in those matches. Computed from the match archive, so it needs no separate sync and is never stale. Mirrors the tennis h2h endpoint.

# paths./darts/api/v2/matches/{id}/h2h/.get.summary
Head-to-head between the two players (v2)

# paths./darts/api/v2/matches/{id}/odds/.get.description
Per-bookmaker match-winner prices plus every other market offered on the match, each with the direction the price is moving. Falls back to the single stored price when the match has not been linked to a priced feed event yet — `source` says which you got.

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

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

# paths./hockey/api/v2/matches/{id}/h2h/.get.description
The record between these two teams and the season form of each side, split home and away. Mirrors the tennis h2h endpoint. Nulls where the pairing or the team has no record yet.

# paths./hockey/api/v2/matches/{id}/h2h/.get.summary
Head-to-head and season form for both teams (v2)

# paths./hockey/api/v2/matches/{id}/odds/.get.description
Per-bookmaker 1X2 prices plus every other market offered on the match (draw-no-bet, handicaps, totals), each with the direction the price is moving. Falls back to the single stored price when the match has not been linked to a priced feed event yet — `source` says which you got.

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

# paths./hockey/api/v2/standings/.get.description
Teams ranked by points, then by points per game, then by goal difference. Overtime results are kept separate — a regulation win and an overtime win are not the same thing in hockey, and a table that hides the difference cannot be used for regulation markets.

Built from the daily form calculation, so `calculated_at` says how fresh a row is.

# 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, odds type, or search by name.

# paths./horseracing/api/v2/tracks/.get.parameters[].description
Keep only courses priced this way: fixed, both, pari_mutuel, unknown. Pass fixed,both (comma-separated) for every course a bookmaker quotes.

# 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./padel/api/v2/matches/.get.description
Padel matches. Every side is a pair — padel has no singles.

# paths./padel/api/v2/pairs/.get.description
Padel pairs, best Elo first. The pair is the unit in padel: a rating belongs to the partnership, not to its two players.

# 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 completed 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.AfterRecordV2Schema.description
El `after`, con el dato que le faltaba para poder leerse.

# components.schemas.AfterRecordV2Schema.properties.ppm.description
Points per match. Null with no matches played, never 0.0.

# components.schemas.AfterRecordV2Schema.properties.matches_led_by_manager.description
How many of these matches this manager was in charge for. It can be fewer than `matches`: the window measures the CLUB, and a caretaker or a co-listed coach shows up in the club record without being this manager.

# components.schemas.AppointmentEffectV2Schema.properties.window.description
Matches counted on each side of the appointment.

# components.schemas.AppointmentEffectV2Schema.properties.before.description
The club's record in the matches before this manager arrived, under whoever was in charge.

# components.schemas.AppointmentEffectV2Schema.properties.after.description
The same club over the same number of matches from the appointment onwards, capped at the end of the tenure. This is the CLUB's record, not the manager's - compare `matches_led_by_manager` before reading it as his.

# components.schemas.AppointmentEffectV2Schema.properties.ppm_change.description
after.ppm minus before.ppm. Negative means the club took fewer points.

# components.schemas.BasketballEventOddsV2.properties.bookmakers_count.description
Bookmakers with at least one moneyline price.

# components.schemas.BasketballEventOddsV2.properties.source.description
"multi" per-bookmaker, "none" if unpriced.

# components.schemas.BasketballEventOddsV2.properties.markets.description
Every market grouped by kind, line and period: market_kind, market_line, market_period, selections, and a bookmakers list with one price per selection.

# 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.CoverageV2.properties.generated_at.description
When this snapshot was computed (UTC ISO-8601).

# components.schemas.CoverageV2.properties.sports.description
One entry per sport: sport (key), name, status (in_season / between_events / off_season / no_fixtures), events_next_7d, events_next_30d, events_last_7d, priced_next_7d (upcoming events with at least one bookmaker price), live_now, next_event_at, last_event_at, docs_url.

# components.schemas.CsgoMatchOddsV2.properties.bookmakers_count.description
Bookmakers with at least one match-winner price.

# components.schemas.CsgoMatchOddsV2.properties.source.description
"multi" per-bookmaker, "consensus" single stored price, "none" if unpriced.

# components.schemas.CsgoMatchOddsV2.properties.markets.description
Every market grouped by kind, line and period: market_kind, market_line, market_period, selections, and a bookmakers list with one price per selection.

# components.schemas.CsgoMatchStatsV2.properties.teams.description
One entry per side: team, map_winrate, map_sample_size, round win rates overall/T/CT, pistol_winrate, headshot_rate, opening_conversion, elimination_winrate, objective_winrate, first_to_rounds (3/6/9/12), per-round combat averages, kd_ratio and form_results (recent results, most recent first).

# components.schemas.CsgoMatchStatsV2.properties.map_pool.description
Per team: maps with win rate and whether they are usually picked or banned.

# components.schemas.CsgoMatchStatsV2.properties.head_to_head.description
total_matches, home_wins, away_wins and the recent meetings. Null when unknown.

# 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.DartsMatchH2HV2.properties.player1_avg.description
Player 1 three-dart average across those meetings. Null when none is recorded.

# components.schemas.DartsMatchH2HV2.properties.player2_avg.description
Player 2 three-dart average across those meetings.

# components.schemas.DartsMatchH2HV2.properties.recent_matches.description
Up to ten most recent meetings, newest first: id, date, tournament, round_name, winner (player1/player2/null) and the set score in this match players order.

# components.schemas.DartsMatchOddsV2.properties.bookmakers_count.description
Bookmakers with at least one match-winner price.

# components.schemas.DartsMatchOddsV2.properties.source.description
"multi" per-bookmaker, "consensus" single stored price, "none" if unpriced.

# components.schemas.DartsMatchOddsV2.properties.markets.description
Every market grouped by kind, line and period: market_kind, market_line, market_period, selections, and a bookmakers list with one price per selection.

# 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, ...}. Player references (player_id, player_in_id, player_out_id, sequence[].player_id) are our player id — the one /api/players/{id}/ answers to — and null when we do not have that player. 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. The eight keys listed are ALWAYS present on each side, with null when the match did not report them — a low-coverage fixture can carry four of the forty-four a fully covered one does. Everything beyond those eight varies with coverage, so read it defensively.

# 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, player_id}. player_id is the shooter as our player id — the one /api/players/{id}/ answers to — and null when we do not have that player. A shot may also carry xg_estimated: true, meaning its xg is our own estimate rather than a measured value — some competitions have no measured shot xG at all. The key is absent on measured shots; /api/v2/events/{id}/stats/ serves the same flag on every shot. 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, player_id, pos: {x,y}, number}], away: [...]}. player_id is our player id — the one /api/players/{id}/ answers to — and null when we do not have that player. 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.stage.description
Competition stage slug: 'group-stage', 'league-phase' or 'regular-season' for the main stage where every team plays numbered matchdays, or the round's own slug for a knockout or qualifying tie ('round-of-16', 'quarterfinals', 'final', 'qualification-round-1'). Filter this endpoint with ?stage=.

# components.schemas.EventDetailV2Schema.properties.stage_name.description
Human-readable stage, e.g. 'League phase', 'Group stage', 'Round of 16'.

# components.schemas.EventDetailV2Schema.properties.round_label.description
Ready-to-display round, e.g. 'League phase · Matchday 5', 'Group A · Matchday 3', 'Round of 16'. Prefer this over round_number/round_name, whose numbering repeats across stages.

# 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.HockeyMatchH2HV2.properties.head_to_head.description
total_matches, home_wins, away_wins, home_goals, away_goals, avg_total_goals and recent_matches (each with date, winner as home/away and the two scores). Null when the two teams have no recorded meeting.

# components.schemas.HockeyMatchOddsV2.properties.bookmakers_count.description
Bookmakers with at least one match-winner price.

# components.schemas.HockeyMatchOddsV2.properties.source.description
"multi" per-bookmaker, "consensus" single stored price, "none" if unpriced.

# components.schemas.HockeyMatchOddsV2.properties.markets.description
Every market grouped by kind, line and period: market_kind, market_line, market_period, selections, and a bookmakers list with one price per selection.

# 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.team_id.description
Echo of the team filter, or null when the whole league was ranked.

# 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}]. Player references (player_id, player_in_id, player_out_id, sequence[].player_id) are our player id — the one /api/players/{id}/ answers to — and null when we do not have that player.

# components.schemas.LiveScore.properties.live_stats.description
Live statistics: {home: {ball_possession, total_shots, ...}, away: {...}}. The eight documented keys are always present, null when unreported.

# 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, player_id}. player_id is the shooter as our player id, null when we do not have that player. 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. Each item carries player_id, our player id (null when we do not have that 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.ManagerTenureV2Schema.properties.appointment_effect.description
Null when the tenure has no start date, or when there are no matches on one of the two sides.

# 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 completed matches for player 1, walkovers included (excluding this match). Each entry: id, date, tournament, surface, round, opponent, score, won.

# components.schemas.MatchH2HV2.properties.player2_last5.description
Last 5 completed matches for player 2, walkovers included (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.MatchSchema.properties.home_pair.description
Home pair. Null only when the pair could not be resolved.

# components.schemas.MatchSchema.properties.status.description
scheduled, live, finished, cancelled, postponed, walkover, retired, or unresolved (the scheduled time passed and no result was ever published).

# components.schemas.MatchSchema.properties.round_name.description
Round, e.g. "Round of 32". Empty when unknown.

# components.schemas.MatchSchema.properties.winner_pair_id.description
Matches home_pair.id or away_pair.id. Null until decided.

# 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_05` - over_under_05
* `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
* `european_handicap` - european_handicap
* `asian_handicap` - asian_handicap
* `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. Set for total_corners, total_red_cards, european_handicap and asian_handicap; null for all others. Handicap lines are home-relative: -1.25 means the home team starts 1.25 goals down, and the away leg of that same quote is therefore +1.25.

# components.schemas.OddsItemV2Schema.properties.push.description
Asian handicap settlement rule when the handicap-adjusted result lands exactly on the line: "none" (half lines — always wins or loses outright), "full" (whole lines — stake refunded), "half" (quarter lines — stake split, half refunded). Null for every non-Asian market, which cannot push.

* `none` - none
* `full` - full
* `half` - half

# 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.opening_decimal_odds.description
The first price we recorded for this selection at this bookmaker. Compare with decimal_odds to measure how far the line has moved since it opened.

# components.schemas.OddsItemV2Schema.properties.opening_at.description
UTC timestamp of that first observation (ISO 8601, Z suffix). Null when the line has no recorded opening.

# 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.OddsLine at runtime.

# 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.current_team.description
The player's current club as {id, name, short_name}. Null when unattached.

# components.schemas.PlayerDetailV2Schema.properties.national_team.description
The player's national team as {id, name, short_name}. Null when not capped.

# components.schemas.PlayerDetailV2Schema.properties.market_value_eur.description
Estimated market value in EUR. 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.injury_type.description
Injury or suspension description (e.g. "Hamstring Injury", "Red card suspension"). Empty string when the player is available or the reason is unknown.

# components.schemas.PlayerDetailV2Schema.properties.injury_expected_return.description
Expected return date (ISO 8601). Null when the player is available or no return date is published.

# 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.RaceDetailV2Schema.properties.has_fixed_odds.description
True when at least one named bookmaker is quoting a fixed price on this race. False on a pari-mutuel/tote-only card, where runners still carry a board price but no book is quoting against another — so no line can move.

# components.schemas.RaceDetailV2Schema.properties.bookmakers_quoting.description
How many distinct bookmakers have a fixed price on this race. 0 on tote-only cards.

# 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.RecordV2Schema.description
Un balance cerrado: lo mismo para una etapa, para su mitad en casa y para
los partidos del club antes y despues de un nombramiento.

# components.schemas.RecordV2Schema.properties.ppm.description
Points per match. Null with no matches played, never 0.0.

# 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.SquadPlayerV2Schema.properties.id.description
Internal player ID. Use /api/v2/players/{id}/ for the full bio.

# components.schemas.SquadPlayerV2Schema.properties.short_name.description
Abbreviated name (e.g. "K. De Bruyne"). Empty string when not set.

# components.schemas.SquadPlayerV2Schema.properties.position.description
G (goalkeeper), D (defender), M (midfielder) or F (forward). Empty string when unknown.

# components.schemas.SquadPlayerV2Schema.properties.nationality.description
Country the player represents. Empty string when unknown.

# components.schemas.SquadPlayerV2Schema.properties.availability.description
Current availability: available, injured, doubtful or suspended. Refreshed several times a day from the team-news list of each side's next fixture. "available" is the default and means the player is not currently listed as missing — it is not a confirmation of fitness, and a club with no upcoming fixture in a covered competition is never re-checked. Test `availability == "injured"` for an injured flag.

* `available` - available
* `injured` - injured
* `doubtful` - doubtful
* `suspended` - suspended

# components.schemas.SquadPlayerV2Schema.properties.injury_type.description
Reason for the absence, e.g. "Knee Injury" or a suspension description. Empty string when available or when no reason was published.

# components.schemas.SquadPlayerV2Schema.properties.injury_expected_return.description
Expected date the player is available again. Null when available or when no return date was published.

# 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.TeamSquadV2Schema.properties.count.description
Number of players in `players`. Not paginated.

# 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.TrackBriefV2Schema.properties.odds_type.description
How this course is priced, measured over the trailing 30 days: "fixed" (bookmakers quote fixed prices on most races), "both" (some races attract a book, the rest are tote-priced), "pari_mutuel" (no bookmaker prices at all — board/SP indications only), "unknown" (no races in the window). Only "fixed" and "both" courses can show a line moving between books.

* `fixed` - fixed
* `both` - both
* `pari_mutuel` - pari_mutuel
* `unknown` - unknown

# components.schemas.TrackBriefV2Schema.properties.fixed_odds_race_pct.description
Share (0-100) of the last 30 days of races at this course carrying at least one bookmaker fixed price. Null when no races fell in the window.

# components.schemas.TrackDetailV2Schema.properties.odds_type.description
How this course is priced, measured over the trailing 30 days: "fixed" (bookmakers quote fixed prices on most races), "both" (some races attract a book, the rest are tote-priced), "pari_mutuel" (no bookmaker prices at all — board/SP indications only), "unknown" (no races in the window). Only "fixed" and "both" courses can show a line moving between books.

* `fixed` - fixed
* `both` - both
* `pari_mutuel` - pari_mutuel
* `unknown` - unknown

# components.schemas.TrackDetailV2Schema.properties.fixed_odds_race_pct.description
Share (0-100) of the last 30 days of races at this course carrying at least one bookmaker fixed price. Null when no races fell in the window.

# components.schemas.TrackDetailV2Schema.properties.odds_stats_updated_at.description
When odds_type / fixed_odds_race_pct were last recomputed.

# 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._PairSchema.properties.name.description
Pair name as published, e.g. "Lebron J. / Galan A.".

# components.schemas._PairSchema.properties.elo_rating.description
Pair Elo. Padel is always doubles, so the rating belongs to the pair, not to its players.

# 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._SeasonSchema.properties.stages.description
The competition's structure, in calendar order. Each entry has `stage` (the slug to pass to /api/v2/events/?stage=), `stage_name`, `matches`, `rounds`, `start_date` and `end_date`. A Champions League season lists qualification-round-1/2/3, playoff-round and league-phase (144 matches, 8 rounds), then the knockout rounds as they are played.

# components.schemas._TeamRefSchema.properties.id.description
Internal team ID — use with /api/v2/teams/{id}/.

# components.schemas._TeamRefSchema.properties.short_name.description
Abbreviated team name. Empty string when not set.

# 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/