{"components":{"responses":{},"schemas":{"PredictionNativeListingPage":{"properties":{"cursor":{"nullable":true,"type":"string"},"data":{"items":{"$ref":"#/components/schemas/PredictionNativeListing"},"type":"array"},"page_size":{"maximum":100,"minimum":1,"type":"integer"}},"required":["data","cursor","page_size"],"title":"PredictionNativeListingPage","type":"object"},"CryptoWindowUnmatched":{"properties":{"constituent":{"description":"One venue's native listing for a crypto window: its native IDs\n(`native_market_id`, `native_ref`, and `native_yes_token`/`native_no_token`\nwhen the venue exposes on-chain tokens) and, while the listing is quotable,\nan indicative `quote` from our one-minute poll. `result`/`resolved_at`/\n`end_price` are a pass-through of the venue's own settlement, never a\nSportsStack determination. Clients that need executable prices stream order\nbooks from the venue directly using the native IDs.\n","properties":{"end_price":{"format":"double","nullable":true,"type":"number"},"family_id":{"description":"Shared by every listing with the same window, reference source and tie rule.","format":"uuid","type":"string"},"last_changed_at":{"description":"Fetch time of the feed file that last changed this listing.","format":"date_time","type":"string"},"lifecycle":{"enum":["upcoming","live","closed","resolved","voided"],"type":"string"},"mirror_of":{"description":"For a Limitless listing, the Polymarket slug it mirrors.","nullable":true,"type":"string"},"native_market_id":{"description":"The venue's native market ID.","type":"string"},"native_no_token":{"description":"On-chain CLOB token ID for the Down/No side, when the venue exposes one.","nullable":true,"type":"string"},"native_ref":{"description":"The venue's ticker (Kalshi) or slug (Polymarket, Limitless).","type":"string"},"native_yes_token":{"description":"On-chain CLOB token ID for the Up/Yes side, when the venue exposes one.","nullable":true,"type":"string"},"quote":{"description":"The listing's indicative quote: our one-minute poll capture of the venue's\nprice (`observed_at` is OUR capture time, never a provider clock). `null`\nwhen the listing is not currently quotable: it is not `upcoming`/`live`, its\nwindow has ended, it has no quote, or the quote is older than 15 minutes.\nIndicative, not executable: `stale` is true once `age_ms` exceeds\n`stale_after_ms` (150 s for 5m/15m, 300 s for 1h, 600 s for 1d).\n","nullable":true,"properties":{"age_ms":{"minimum":0,"type":"integer"},"down":{"format":"double","maximum":1,"minimum":0,"type":"number"},"observed_at":{"format":"date_time","type":"string"},"source":{"enum":["kalshi_bid_ask_mid","kalshi_last","polymarket_clob_mid","polymarket_gamma","limitless_clob_mid","limitless_prices"],"type":"string"},"stale":{"type":"boolean"},"stale_after_ms":{"minimum":0,"type":"integer"},"up":{"format":"double","maximum":1,"minimum":0,"type":"number"}},"required":["up","down","source","observed_at","age_ms","stale_after_ms","stale"],"title":"CryptoWindowQuote","type":"object"},"reference_source":{"description":"The oracle/index this listing resolves against. Two listings of the\nsame window with different reference sources are the\n`same_window_different_reference` match class, not `exact` -- they\ncan and do disagree on start price and result even on a near-flat\nwindow. `binance_usdt_1m_noon` is the Binance USDT 1-minute candle at\n12:00 America/New_York, used by Polymarket's daily up/down markets.\n","enum":["cf_benchmarks_rti","chainlink_twap_60s","binance_usdt_1h_candle","binance_usdt_1m_noon"],"type":"string"},"resolved_at":{"format":"date_time","nullable":true,"type":"string"},"result":{"description":"The venue's own result, passed through unchanged. `null` does not\nmean \"no\": a window whose status is `ended` has not necessarily been\nresolved by the venue yet -- see the result-latency notes on the\nparent window.\n","enum":["up","down","split"],"nullable":true,"type":"string"},"result_revision":{"description":"Increments on every terminal-state correction (including voided -> resolved and back).","minimum":0,"type":"integer"},"settlement_value":{"format":"double","nullable":true,"type":"number"},"start_price":{"format":"double","nullable":true,"type":"number"},"tie_rule":{"enum":["up","split"],"type":"string"},"venue":{"enum":["kalshi","polymarket","limitless"],"type":"string"}},"required":["venue","native_market_id","native_ref","reference_source","tie_rule","family_id","lifecycle","result_revision","last_changed_at"],"title":"CryptoWindowConstituent","type":"object"},"reason":{"enum":["no_match","mirror_counterpart_missing","mirror_terms_disagree"],"type":"string"}},"required":["reason","constituent"],"title":"CryptoWindowUnmatched","type":"object"},"Tournament":{"description":"A tournament represents an organized competition structure with brackets, rounds, and matchups.\n\nTournaments organize events into structured competition formats including single elimination brackets,\nbest-of-series playoffs, and group stage + knockout combinations. They provide the framework for\ndetermining champions through progressive elimination or series-based competition.\n\n## Bracket Types\n\n### Single Elimination\nClassic bracket format where one loss eliminates a team (March Madness, CFP, Tennis Grand Slams).\n- Teams progress through rounds (First Round, Sweet 16, Elite 8, Final Four, Championship)\n- Each matchup is a single game\n- Winner advances, loser is eliminated\n\n### Best-of-Series\nPlayoff format where teams compete in multi-game series (NBA, NHL, MLB, NFL playoffs).\n- Each round is a best-of-N series (best of 7, best of 5, etc.)\n- Series winner determined by games won\n- Individual games tracked as separate events\n\n### Group + Knockout\nTwo-stage format with group play followed by knockout rounds (World Cup, UEFA Champions League).\n- **Groups**: Round-robin play within groups, top teams advance\n- **Knockout**: Single elimination bracket after group stage\n- Combines group standings with bracket progression\n\n## Data Sources\n\nTournament structure can be built from two sources:\n1. **Tournament Entity**: `rounds` field contains pre-structured bracket data\n2. **Events**: Individual game events with `tournament_id` and `tournament_round` can reconstruct brackets\n\nThe bracket endpoint intelligently uses whichever source provides the most complete data.\n\n### Soccer bracket reconstruction (FIFA-family tournaments)\nSoccer tournaments do not use 1-based `tournament_round` numbering. Reconstruct from events using:\n- **Group stage matches**: `tournament_id != null && tournament_round == 0`. Matchday in `metadata.round.number`, group identity in `metadata.group`.\n- **Knockout matches**: `tournament_id != null && tournament_round == null && metadata.cup_round_id != null`. The `metadata.cup_round_id` is the stable grouping key (4 quarterfinals share one id; Final and 3rd-place playoff have distinct ids despite sharing `metadata.stage`).\nNon-soccer tournaments (NCAAB, etc.) retain 1-based `tournament_round` bracket positions.\n\n## Key Relationships\n- **League**: Tournament belongs to a specific league\n- **Events**: Individual games/matches within the tournament\n- **Rounds**: Organized competition stages with matchups\n- **Groups**: Group stage divisions (for group_knockout tournaments)\n","example":{"abbreviation":"MM","bracket_type":"single_elimination","common_model_id":"01c7133f-2999-4803-9872-8c2ab1ba63ac","end_date":"2025-04-08","groups":[],"league_id":"31c65553-2f05-4ef7-993c-9e91c583afc8","name":"2025 NCAA Tournament","rounds":[],"season_year":2025,"start_date":"2025-03-20","status":"in_progress","tournament_type":"championship"},"properties":{"abbreviation":{"description":"Short form or acronym for the tournament","example":"MM","type":"string"},"bracket_type":{"description":"Bracket structure type: single_elimination (March Madness), best_of_series (NBA playoffs), group_knockout (World Cup)","enum":["single_elimination","best_of_series","group_knockout"],"type":"string"},"common_model_id":{"description":"Unique tournament identifier in our unified system","format":"uuid","type":"string"},"end_date":{"description":"Tournament end date","example":"2025-04-08","format":"date","type":"string"},"groups":{"description":"Group stage divisions (for group_knockout tournaments, see TournamentGroup schema)","items":{"description":"A group represents a division within the group stage of a tournament (World Cup, UEFA Champions League).\n\nGroups organize teams into round-robin competition pools where teams play each other\nand standings determine advancement to knockout rounds. Each group has its own standings\ntable tracking wins, losses, goals, and points.\n\n## Group Stage Structure\n\n- **Teams**: 3-4 teams per group (varies by tournament)\n- **Format**: Round-robin (each team plays every other team in group)\n- **Advancement**: Top teams (typically top 2) advance to knockout stage\n- **Standings**: Points, goal differential, head-to-head determine rankings\n\n## Standings Calculation\n\nStandings are calculated from group stage events:\n- **Points**: Win = 3, Draw = 1, Loss = 0 (varies by sport)\n- **Goal Differential**: Goals for - Goals against\n- **Head-to-Head**: Direct matchup results for tiebreaking\n","example":{"group_name":"Group A","standings":[{"drawn":1,"goal_difference":3,"goals_against":2,"goals_for":5,"lost":0,"played":3,"points":7,"position":1,"team_id":"e2790078-ec3a-4c45-8dc4-5cf173960b2b","won":2}],"teams":[{"abbreviation":"TMA","country_code":"USA","name":"Team A","team_id":"e2790078-ec3a-4c45-8dc4-5cf173960b2b"}]},"properties":{"group_name":{"description":"Group identifier (e.g., 'Group A', 'Group B')","example":"Group A","type":"string"},"standings":{"description":"Current group standings ordered by position","items":{"properties":{"drawn":{"description":"Draws","type":"integer"},"goal_difference":{"description":"Goal differential","type":"integer"},"goals_against":{"description":"Goals conceded","type":"integer"},"goals_for":{"description":"Goals scored","type":"integer"},"lost":{"description":"Losses","type":"integer"},"played":{"description":"Games played","type":"integer"},"points":{"description":"Total points","type":"integer"},"position":{"description":"Current position in group (1-based)","type":"integer"},"team_id":{"format":"uuid","type":"string"},"won":{"description":"Wins","type":"integer"}},"type":"object"},"type":"array"},"teams":{"description":"Teams participating in this group","items":{"properties":{"abbreviation":{"description":"Team abbreviation","type":"string"},"country_code":{"description":"Country code (for international tournaments)","type":"string"},"name":{"description":"Team name","type":"string"},"team_id":{"description":"Team common_model_id","format":"uuid","type":"string"}},"type":"object"},"type":"array"}},"required":["group_name","teams","standings"],"title":"TournamentGroup","type":"object"},"type":"array"},"league_id":{"description":"League this tournament belongs to","format":"uuid","type":"string"},"metadata":{"additionalProperties":true,"description":"Tournament metadata and provider-specific data. For soccer tournaments with multi-stage structure (World Cup family, and any future tournament sport adopting this shape), the following key is emitted:\n\n- `stages` — list of stage descriptors, each tagged with the provider that emitted it so multiple providers can coexist without clobbering each other. Each entry: `{source, order, type, phase, start_date, end_date, year, group_ids, matchdays, cup_round_ids}`. `group_ids` and `matchdays` populated for `type: \"league\"` (group) stages; `cup_round_ids` populated for `type: \"cup\"` (knockout) stages. The `source` field is the normalized provider source (e.g. `\"provider.soccer.fifa_world_cup\"`) — clients wanting a single provider's view filter `stages` by `source`.\n- `round_numbers` (where present) — flat list of all round numbers across stages. Kept for backward compatibility; prefer `stages[*].matchdays` and `stages[*].cup_round_ids` for navigable structure.\n\nThe flat `Tournament.rounds[]` and `Tournament.groups[]` arrays are unchanged; `metadata.stages` cross-references them by provider id.","type":"object"},"name":{"description":"Tournament name (e.g., '2025 NCAA Tournament', 'NBA Playoffs')","example":"2025 NCAA Tournament","type":"string"},"participants":{"description":"Initial seeded participants/teams in the tournament","items":{"properties":{"abbreviation":{"description":"Team abbreviation","type":"string"},"name":{"description":"Team name","type":"string"},"seed":{"description":"Tournament seed (1-16 for NCAA)","type":"integer"},"team_id":{"description":"Team common_model_id","type":"string"}},"type":"object"},"type":"array"},"rounds":{"description":"Bracket rounds with matchups (see TournamentRound schema)","items":{"description":"A round represents a stage of competition within a tournament bracket.\n\nRounds organize matchups into progressive stages of elimination or series competition.\nEach round contains multiple matchups (games or series) that determine advancement.\n\n## Round Structure by Bracket Type\n\n### Single Elimination Rounds\n- **Round 1**: First Round (64 teams → 32 teams)\n- **Round 2**: Second Round (32 teams → 16 teams)\n- **Round 3**: Sweet 16 (16 teams → 8 teams)\n- **Round 4**: Elite 8 (8 teams → 4 teams)\n- **Round 5**: Final Four (4 teams → 2 teams)\n- **Round 6**: Championship (2 teams → 1 champion)\n\n### Best-of-Series Rounds\n- **Round 1**: First Round (e.g., 16 teams → 8 teams via best-of-7 series)\n- **Round 2**: Conference Semifinals\n- **Round 3**: Conference Finals\n- **Round 4**: Finals\n\n### Group + Knockout Rounds\n- **Groups**: Round-robin play (not numbered rounds)\n- **Round 1**: Round of 16 (knockout stage begins)\n- **Round 2**: Quarterfinals\n- **Round 3**: Semifinals\n- **Round 4**: Final\n","example":{"best_of":null,"matchups":[{"away_score":72,"away_team":{"abbreviation":"TMB","name":"Team B","seed":16,"source_id":"competitor_67890","team_id":"f1798a7e-4832-4a2c-8cb6-60d5afcb3d41"},"event_id":"a96af633-aee6-48a0-bf72-0865a4419772","home_score":85,"home_team":{"abbreviation":"TMA","name":"Team A","seed":1,"source_id":"competitor_12345","team_id":"e2790078-ec3a-4c45-8dc4-5cf173960b2b"},"matchup_source_id":"event_12345678","position":0,"region":"East","scheduled_time":"2025-03-20T12:00:00Z","status":"completed","winner_id":"home"}],"round_name":"First Round","round_number":1,"round_type":"elimination"},"properties":{"best_of":{"description":"Best-of-N value for series rounds (3, 5, or 7 games). Null for single elimination.","example":7,"type":"integer"},"matchups":{"description":"Games or series in this round (see TournamentMatchup schema)","items":{"description":"A matchup represents a single game or series within a tournament round.\n\nMatchups connect teams/participants with game results, scores, and advancement status.\nEach matchup can be either a single game (elimination) or a series (best-of-N).\n\n## Matchup States\n\n- **Scheduled**: Game/series not yet started\n- **In Progress**: Currently being played\n- **Completed**: Finished with final results\n- **Pending**: Placeholder matchup (e.g., waiting for previous round results)\n\n## Team Information\n\nTeams in matchups include:\n- **team_id**: Our unified team identifier (resolved via identity mapping)\n- **source_id**: Provider's team identifier (before mapping)\n- **seed**: Tournament seed number (1-16 for NCAA, null for non-seeded tournaments)\n- **name/abbreviation**: Team display information\n\n## Winner Determination\n\n- **winner_id**: \"home\", \"away\", or null (if not yet determined)\n- **home_score/away_score**: Final scores (null if game not completed)\n- For series: `series_score` object with home/away wins instead of single game scores\n\n## Event Linking\n\n- **event_id**: Links to actual Event entity (populated when events are created)\n- **matchup_source_id**: Provider's game ID (before event creation)\n- When both exist, `event_id` takes precedence for detailed game data\n","example":{"away_score":72,"away_team":{"abbreviation":"TMB","name":"Team B","seed":16,"source_id":"competitor_67890","team_id":"f1798a7e-4832-4a2c-8cb6-60d5afcb3d41"},"event_id":"a96af633-aee6-48a0-bf72-0865a4419772","home_score":85,"home_team":{"abbreviation":"TMA","name":"Team A","seed":1,"source_id":"competitor_12345","team_id":"e2790078-ec3a-4c45-8dc4-5cf173960b2b"},"matchup_source_id":"event_12345678","position":0,"region":"East","scheduled_time":"2025-03-20T12:00:00Z","series_score":null,"status":"completed","winner_id":"home"},"properties":{"away_score":{"description":"Away team score (null if game not completed or for series rounds)","example":72,"type":"integer"},"away_team":{"description":"Away team information (same structure as home_team)","properties":{"abbreviation":{"type":"string"},"name":{"type":"string"},"seed":{"type":"integer"},"source_id":{"type":"string"},"team_id":{"format":"uuid","type":"string"}},"type":"object"},"event_id":{"description":"Event entity common_model_id (populated when events are created)","example":"a96af633-aee6-48a0-bf72-0865a4419772","format":"uuid","type":"string"},"home_score":{"description":"Home team score (null if game not completed or for series rounds)","example":85,"type":"integer"},"home_team":{"description":"Home team information","properties":{"abbreviation":{"description":"Team abbreviation","type":"string"},"name":{"description":"Team full name","type":"string"},"seed":{"description":"Tournament seed (1-16 for NCAA, null for non-seeded)","type":"integer"},"source_id":{"description":"Provider's team identifier","type":"string"},"team_id":{"description":"Team common_model_id (resolved via identity mapping)","format":"uuid","type":"string"}},"type":"object"},"matchup_source_id":{"description":"Provider's game/series ID (before event entity is created)","example":"event_12345678","type":"string"},"position":{"description":"Position/order of matchup within the round","example":0,"type":"integer"},"region":{"description":"Region/bracket name (for NCAA tournaments: East, West, South, Midwest)","example":"East","type":"string"},"scheduled_time":{"description":"Scheduled start time for the game/series","example":"2025-03-20T12:00:00Z","format":"date-time","type":"string"},"series_score":{"description":"Series score for best-of-series rounds (null for single elimination)","example":{"away":2,"home":4},"properties":{"away":{"description":"Away team wins in series","type":"integer"},"home":{"description":"Home team wins in series","type":"integer"}},"type":"object"},"status":{"description":"Matchup status","enum":["scheduled","in_progress","completed","pending"],"type":"string"},"winner_id":{"description":"Winner designation: 'home', 'away', or null if not determined","enum":["home","away",null],"type":"string"}},"required":["position","home_team","away_team","status"],"title":"TournamentMatchup","type":"object"},"type":"array"},"round_name":{"description":"Human-readable round name (e.g., 'First Round', 'Sweet 16', 'Conference Finals')","example":"First Round","type":"string"},"round_number":{"description":"Sequential round number (1-based, lower numbers = earlier rounds)","example":1,"type":"integer"},"round_type":{"description":"Type of round: elimination (single game), best_of_series (multi-game), knockout (post-group stage)","enum":["elimination","best_of_series","knockout"],"type":"string"}},"required":["round_number","round_name","round_type","matchups"],"title":"TournamentRound","type":"object"},"type":"array"},"season_year":{"description":"Primary year of the season (e.g., 2025 for 2024-25 season)","example":2025,"type":"integer"},"start_date":{"description":"Tournament start date","example":"2025-03-20","format":"date","type":"string"},"status":{"description":"Current tournament status","enum":["scheduled","in_progress","completed","cancelled"],"type":"string"},"tournament_type":{"description":"Type of tournament (championship, playoffs, tournament, etc.)","example":"championship","type":"string"}},"required":["common_model_id","name","league_id"],"title":"Tournament","type":"object"},"FutureMarket":{"description":"A contract served through the futures compatibility route. actual_scope identifies race, session, tournament, round, or season meaning when proven.","example":{"common_model_id":"123e4567-e89b-12d3-a456-426614174000","future_type":"championship","league_id":"123e4567-e89b-12d3-a456-426614174001","name":"2026 FIFA World Cup Winner","outcomes":[],"status":"active","tradeable":false,"untradeable_reasons":["insufficient_outcomes"]},"properties":{"actual_scope":{"description":"Native contract scope; null means unknown, independent of storage route.","enum":["event","race","session","tournament","round","season"],"nullable":true,"type":"string"},"common_model_id":{"format":"uuid","type":"string"},"future_type":{"nullable":true,"type":"string"},"inserted_at":{"format":"date-time","nullable":true,"type":"string"},"league_id":{"format":"uuid","nullable":true,"type":"string"},"market_type_id":{"format":"uuid","nullable":true,"type":"string"},"metadata":{"nullable":true,"type":"object"},"name":{"type":"string"},"outcomes":{"description":"Included only when include_outcomes=true","items":{"properties":{"common_model_id":{"format":"uuid","type":"string"},"execution":{"additionalProperties":true,"description":"Venue-keyed execution blocks (`{\"kalshi\": {...}, \"polymarket\": {...}}`, the same shape event odds carry under metadata.execution) unioned from this outcome's quotes. Unlike metadata.execution, which holds one venue on a cross-venue outcome, this lists every venue that currently quotes the outcome. Empty when no quote carries a block.","type":"object"},"grouping_key":{"nullable":true,"type":"string"},"inserted_at":{"format":"date-time","nullable":true,"type":"string"},"is_main":{"nullable":true,"type":"boolean"},"line":{"nullable":true,"type":"number"},"metadata":{"description":"Provider metadata. For prediction markets this includes the \"execution\" block carrying the identifiers needed to place a trade on the originating venue (venue, ticker/token_id, condition_id, neg_risk, tick_size, venue contracts, url).","nullable":true,"type":"object"},"name":{"type":"string"},"normalized_selection":{"nullable":true,"type":"string"},"odds":{"description":"Current tenant-visible quotes for this canonical outcome, one per venue/position.","items":{"properties":{"aggregator":{"type":"string"},"canonical_outcome_id":{"description":"Cross-venue outcome identity; present only when the outcome identity is verified (same rule as GET /v1/odds), otherwise null. Never a per-venue fallback.","format":"uuid","nullable":true,"type":"string"},"clock_provenance":{"properties":{"evaluated_at":{"format":"date-time","type":"string"},"max_age_seconds":{"enum":[300],"type":"integer"},"quote_provenance":{"description":"Unmodified retained JSON provenance, including legacy or malformed evidence.","nullable":true},"source":{"enum":["timestamp",null],"nullable":true,"type":"string"}},"type":"object"},"common_model_id":{"format":"uuid","type":"string"},"deep_link":{"nullable":true,"type":"string"},"event_id":{"description":"Always null for a future market; present for parity with GET /v1/odds.","format":"uuid","nullable":true,"type":"string"},"execution_readiness":{"description":"Requires exact native source-ID binding, active parent/outcome lifecycle and proven fresh provider clock; not order-fill certification. ProphetX additionally requires one atomic native strike/price/size/time observation matching its documented submit-order fields. ready=null means unknown. Native IDs remain separate from common_model_id.","example":{"available_size":{"state":"unknown","value":null},"depth":{"state":"unknown","value":null},"executable":{"reason":"catalog_is_not_a_book","state":"unknown"},"identifiers_valid":true,"liquidity":{"state":"unknown","value":null},"ready":null,"reasons":["provider_clock_provenance_downgrade"],"scope":"outcome_identifiers_and_provider_clock","venue":"limitless"},"properties":{"available_size":{"additionalProperties":true,"description":"Retained evidence; absent measurements have state unknown and value null.","type":"object"},"depth":{"additionalProperties":true,"description":"Retained evidence; absent measurements have state unknown and value null.","type":"object"},"executable":{"additionalProperties":true,"description":"Retained evidence; absent measurements have state unknown and value null.","type":"object"},"identifiers_valid":{"type":"boolean"},"liquidity":{"additionalProperties":true,"description":"Retained evidence; absent measurements have state unknown and value null.","type":"object"},"ready":{"nullable":true,"type":"boolean"},"reasons":{"items":{"type":"string"},"type":"array"},"scope":{"enum":["outcome_identifiers_and_provider_clock"],"type":"string"},"venue":{"type":"string"}},"type":"object"},"fetched_at":{"description":"Timestamp when SportsStack fetched or observed this quote","format":"date-time","nullable":true,"type":"string"},"freshness_reasons":{"description":"Deterministic provider_clock_* or lifecycle_* reasons; empty when fresh.","items":{"type":"string"},"type":"array"},"is_main":{"nullable":true,"type":"boolean"},"limits":{"nullable":true,"type":"object"},"market_id":{"description":"The future market this quote belongs to (its common_model_id, which is the canonical family id for a classified family). Same field as GET /v1/odds.","format":"uuid","nullable":true,"type":"string"},"market_name":{"nullable":true,"type":"string"},"market_type":{"nullable":true,"type":"string"},"metadata":{"description":"Provider quote metadata, including venue execution identifiers.","nullable":true,"type":"object"},"outcome_id":{"description":"The outcome common_model_id this quote is nested under. Same field as GET /v1/odds.","format":"uuid","nullable":true,"type":"string"},"platform_observed_at":{"description":"Prediction quotes only. Row observed_at, independently of provider freshness.","format":"date-time","nullable":true,"type":"string"},"points":{"description":"Line value distinguishing alternate positions, when applicable","nullable":true,"type":"number"},"price":{"type":"number"},"price_type":{"type":"string"},"provider_freshness":{"description":"Prediction quotes only. Fresh requires a proven nonfuture provider clock at most 300 seconds old and proven active exact-parent/outcome lifecycle. Standalone odds report unknown without lifecycle proof.","enum":["fresh","stale","unknown"],"type":"string"},"provider_observed_at":{"description":"Prediction quotes only. Authoritative provider quote timestamp; never receipt/observation time. Requires matching observed quote_provenance.provider_updated_at; null for absent, synthetic or downgraded authority.","format":"date-time","nullable":true,"type":"string"},"selection_line":{"description":"Provider label for the selected line position, when applicable","nullable":true,"type":"string"},"source_id":{"nullable":true,"type":"string"},"source_market_id":{"nullable":true,"type":"string"},"source_selection_id":{"nullable":true,"type":"string"},"sportsbook":{"type":"string"},"timestamp":{"format":"date-time","nullable":true,"type":"string"},"trading_fees":{"description":"Prediction quotes only (absent on sportsbook rows and on venues whose fees are not captured yet: Limitless, ProphetX, Polymarket US, SX Bet). Computed at read time; no order-fill or account-specific guarantee (per-account discounts, maker rebates and balance-precision rounding are not modelled). Kalshi: rates from a versioned snapshot of Kalshi's public series metadata, event fee overrides and fee schedule; `observed_at` is the snapshot time. Series with event-level fee overrides (MLB) resolve per event: an override in force reports `scope: event` (with `event_ticker`, `effective_from`), before its `scheduled_ts` the series fee is reported with the pending change under `scheduled_override`, and an event missing from the snapshot reports `unknown` (`event_fee_override_not_in_snapshot`). Predict.fun: derived from the stored market `fee_rate_bps`; `observed_at` is the quote observation time. Polymarket: the market's own Gamma `feesEnabled`/`feeSchedule` captured with the quote (`fee = shares x rate x P x (1 - P)`, taker only, makers pay nothing; `maker.rebate_rate` is the fraction of taker fees returned to makers through a daily rebate program, not a per-fill credit; fees round to 5 decimal places with no published direction, so `rounding.direction` is absent); `observed_at` is the quote observation time, and quotes whose fee data is missing, has an exponent other than 1, or is not taker-only report `unknown`. The rate is per market (`sports_fees_v3` 0.05, `sports_fees_v2` 0.03, `zero_fees` 0 are all live on sports), never a category default.","example":{"availability":"published","charge_basis":"fill","fee_multiplier":1.0,"fee_type":"quadratic_with_maker_fees","maker":{"exponent":1,"model":"quadratic","multiplier":1.0,"rate":0.0175,"rounding":{"applies_to":"fee_plus_position_cost","direction":"up","increment":0.0001}},"observed_at":"2026-09-30T15:33:45Z","scope":"series","series_ticker":"KXNBAGAME","source":"kalshi_series_snapshot","taker":{"exponent":1,"model":"quadratic","multiplier":1.0,"rate":0.07,"rounding":{"applies_to":"fee_plus_position_cost","direction":"up","increment":0.0001}}},"properties":{"availability":{"enum":["published","unavailable","unknown"],"type":"string"},"charge_basis":{"description":"Fees are charged per fill, not per order or per settlement.","enum":["fill"],"type":"string"},"effective_from":{"description":"Kalshi, `scope: event`: the override's `scheduled_ts`, from which these rates apply.","format":"date-time","type":"string"},"event_ticker":{"description":"Kalshi: the market ticker minus its last `-` segment. Present for series with event-level fee overrides.","type":"string"},"fee_multiplier":{"type":"number"},"fee_rate_bps":{"type":"integer"},"fee_type":{"type":"string"},"fees_enabled":{"description":"Polymarket: the market's Gamma `feesEnabled` flag.","type":"boolean"},"maker":{"description":"One side of the fee. `quadratic`: fee = rate x contracts x (P x (1 - P)) ^ exponent. `linear_min_price`: fee = rate x min(P, 1 - P) x shares. `none`: no fee. `rate` already includes any venue multiplier.","properties":{"exponent":{"type":"integer"},"formula":{"type":"string"},"model":{"enum":["quadratic","linear_min_price","none"],"type":"string"},"multiplier":{"type":"number"},"rate":{"type":"number"},"rebate_rate":{"description":"Polymarket maker side: fraction of taker fees rebated to resting makers by the daily rebate program (context only, not a per-fill credit).","type":"number"},"rounding":{"properties":{"applies_to":{"type":"string"},"direction":{"enum":["up"],"type":"string"},"increment":{"type":"number"}},"type":"object"}},"type":"object"},"observed_at":{"format":"date-time","nullable":true,"type":"string"},"reason":{"description":"Present when availability is unknown; deterministic snake_case reason.","type":"string"},"scheduled_override":{"description":"Kalshi, `scope: series`: an event-level override that is not yet in force. Charged from `effective_from`; carries `fee_type`, `fee_multiplier`, `taker` and `maker` like the top-level object.","properties":{"effective_from":{"format":"date-time","type":"string"},"fee_multiplier":{"type":"number"},"fee_type":{"type":"string"},"maker":{"description":"One side of the fee. `quadratic`: fee = rate x contracts x (P x (1 - P)) ^ exponent. `linear_min_price`: fee = rate x min(P, 1 - P) x shares. `none`: no fee. `rate` already includes any venue multiplier.","properties":{"exponent":{"type":"integer"},"formula":{"type":"string"},"model":{"enum":["quadratic","linear_min_price","none"],"type":"string"},"multiplier":{"type":"number"},"rate":{"type":"number"},"rebate_rate":{"description":"Polymarket maker side: fraction of taker fees rebated to resting makers by the daily rebate program (context only, not a per-fill credit).","type":"number"},"rounding":{"properties":{"applies_to":{"type":"string"},"direction":{"enum":["up"],"type":"string"},"increment":{"type":"number"}},"type":"object"}},"type":"object"},"taker":{"description":"One side of the fee. `quadratic`: fee = rate x contracts x (P x (1 - P)) ^ exponent. `linear_min_price`: fee = rate x min(P, 1 - P) x shares. `none`: no fee. `rate` already includes any venue multiplier.","properties":{"exponent":{"type":"integer"},"formula":{"type":"string"},"model":{"enum":["quadratic","linear_min_price","none"],"type":"string"},"multiplier":{"type":"number"},"rate":{"type":"number"},"rebate_rate":{"description":"Polymarket maker side: fraction of taker fees rebated to resting makers by the daily rebate program (context only, not a per-fill credit).","type":"number"},"rounding":{"properties":{"applies_to":{"type":"string"},"direction":{"enum":["up"],"type":"string"},"increment":{"type":"number"}},"type":"object"}},"type":"object"}},"type":"object"},"scope":{"enum":["series","event","market"],"type":"string"},"series_ticker":{"type":"string"},"source":{"description":"kalshi_series_snapshot | kalshi_event_fee_snapshot | kalshi_fee_schedule_default | venue_record. `kalshi_event_fee_snapshot` is a Kalshi event-level override in force; `kalshi_fee_schedule_default` is the schedule default (quadratic x 1) inferred for a KX series not in the exception snapshot.","type":"string"},"taker":{"description":"One side of the fee. `quadratic`: fee = rate x contracts x (P x (1 - P)) ^ exponent. `linear_min_price`: fee = rate x min(P, 1 - P) x shares. `none`: no fee. `rate` already includes any venue multiplier.","properties":{"exponent":{"type":"integer"},"formula":{"type":"string"},"model":{"enum":["quadratic","linear_min_price","none"],"type":"string"},"multiplier":{"type":"number"},"rate":{"type":"number"},"rebate_rate":{"description":"Polymarket maker side: fraction of taker fees rebated to resting makers by the daily rebate program (context only, not a per-fill credit).","type":"number"},"rounding":{"properties":{"applies_to":{"type":"string"},"direction":{"enum":["up"],"type":"string"},"increment":{"type":"number"}},"type":"object"}},"type":"object"}},"type":"object"}},"required":["common_model_id","price","price_type","sportsbook","aggregator"],"title":"FutureOutcomeOdd","type":"object"},"type":"array"},"player_id":{"format":"uuid","nullable":true,"type":"string"},"selection":{"nullable":true,"type":"string"},"selection_line":{"nullable":true,"type":"string"},"status":{"nullable":true,"type":"string"},"team_id":{"format":"uuid","nullable":true,"type":"string"},"updated_at":{"format":"date-time","nullable":true,"type":"string"}},"required":["common_model_id","name"],"title":"FutureOutcome","type":"object"},"type":"array"},"player_id":{"format":"uuid","nullable":true,"type":"string"},"sport_id":{"format":"uuid","nullable":true,"type":"string"},"start_date":{"format":"date-time","nullable":true,"type":"string"},"status":{"nullable":true,"type":"string"},"team_id":{"format":"uuid","nullable":true,"type":"string"},"timestamp":{"format":"date-time","nullable":true,"type":"string"},"tournament_id":{"format":"uuid","nullable":true,"type":"string"},"tradeable":{"description":"Included only when include_outcomes=true. True when no lifecycle or structural tradeability reason applies; this does not guarantee current liquidity or executable quotes.","type":"boolean"},"untradeable_reasons":{"description":"Included only when include_outcomes=true. Empty exactly when tradeable is true; otherwise lists every failed lifecycle or structural invariant.","items":{"enum":["lifecycle_not_tradable","missing_mutually_exclusive_signal","insufficient_outcomes","duplicate_canonical_selection"],"type":"string"},"type":"array"},"updated_at":{"format":"date-time","nullable":true,"type":"string"}},"required":["common_model_id","name"],"title":"FutureMarket","type":"object"},"Season":{"description":"A season represents a specific time period of competition within a league.\n\nSeasons organize events into distinct time-bound periods with specific start and end dates.\nMost leagues have multiple seasons per year, including preseason, regular season, and postseason.\nSeasons are crucial for organizing statistics, determining standings, and structuring competition.\n\n## Season Types\n- **PRE**: Preseason - exhibition games before the official season starts\n- **REG**: Regular Season - standard competitive games counting toward standings\n- **PST**: Postseason/Playoffs - championship tournament after regular season\n\n## Key Characteristics\n- **Time-Bounded**: Each season has defined start and end dates\n- **League-Specific**: Seasons belong to a specific league\n- **Type-Categorized**: Different rules/importance based on season type\n\n## Examples\n- **NFL 2024 Regular Season**: September 2024 - January 2025\n- **NBA 2023-24 Playoffs**: April 2024 - June 2024\n- **MLB 2024 Preseason**: February 2024 - March 2024\n\n## Key Relationships\n- **League**: Each season belongs to exactly one league\n- **Events**: All games/matches played during the season\n- **Statistics**: Season-scoped performance data aggregated across events\n","example":{"abbreviation":"2024-REG","common_model_id":"a1b2c3d4-5678-90ab-cdef-123456789abc","end_date":"2025-01-05","league_id":"8019d4db-7854-4542-b4af-7265d4b57105","metadata":{"sportradar":{"season_code":"REG","status":"closed"}},"name":"2024 NFL Regular Season","season_type":"REG","season_year":2024,"start_date":"2024-09-05","status":"closed"},"properties":{"abbreviation":{"description":"Short form or code for the season","type":"string"},"common_model_id":{"description":"Unique season identifier in our unified system","type":"string"},"end_date":{"description":"Season end date in ISO 8601 format","example":"2025-01-05","format":"date","type":"string"},"image_url":{"description":"Season logo or branding image URL","type":"string"},"league_id":{"description":"Reference to the league this season belongs to","type":"string"},"metadata":{"description":"Provider-specific metadata and codes","example":{"sportradar":{"name":"2014 Season","season_code":"REG","status":"closed"}},"properties":{"sportradar":{"description":"Provider-specific season metadata","properties":{"name":{"description":"Original provider season name (may be generic like '2014 Season')","example":"2014 Season","type":"string"},"season_code":{"description":"Original provider season type code (REG, PST, AST, etc.)","example":"REG","type":"string"},"status":{"description":"Original provider status value","example":"closed","type":"string"}},"type":"object"}},"type":"object"},"name":{"description":"Human-readable season name (e.g., '2024 Regular Season', '2023-24 Playoffs')","type":"string"},"season_type":{"description":"Type of season: PRE (preseason), REG (regular), PST (postseason)","enum":["PRE","REG","PST","IST","PIT","SC","EX","CC","CT","ALL_STAR"],"example":"REG","type":"string"},"season_year":{"description":"Primary year of the season (e.g., 2024 for 2024-25 NBA season)","example":2024,"type":"integer"},"start_date":{"description":"Season start date in ISO 8601 format","example":"2024-09-05","format":"date","type":"string"},"status":{"description":"Season status (normalized across providers)","enum":["scheduled","in_progress","closed"],"example":"closed","type":"string"}},"required":["name","season_year"],"title":"Season","type":"object"},"PredictionNativeListing":{"description":"One venue-native contract. Missing or uncertain canonical references remain visible with reasons; a quarantined native ID remains blocked.","properties":{"actual_scope":{"enum":["event","race","session","tournament","round","season","unknown"],"type":"string"},"canonical_attachment":{"additionalProperties":true,"type":"object"},"canonical_league_id":{"format":"uuid","nullable":true,"type":"string"},"description":{"nullable":true,"type":"string"},"execution_readiness":{"properties":{"reasons":{"items":{"type":"string"},"type":"array"},"status":{"enum":["ready","blocked","unknown"],"type":"string"}},"required":["status","reasons"],"type":"object"},"id":{"format":"uuid","type":"string"},"identity_status":{"enum":["active","quarantined"],"type":"string"},"league":{"nullable":true,"type":"string"},"lifecycle":{"type":"string"},"line":{"format":"double","nullable":true,"type":"number"},"native_listing_id":{"type":"string"},"native_subject":{"additionalProperties":true,"type":"object"},"outcome_meaning":{"type":"string"},"period":{"nullable":true,"type":"string"},"provenance":{"additionalProperties":true,"type":"object"},"quarantine_reasons":{"items":{"type":"string"},"type":"array"},"quote_readiness":{"properties":{"reasons":{"items":{"type":"string"},"type":"array"},"status":{"enum":["ready","blocked","unknown"],"type":"string"}},"required":["status","reasons"],"type":"object"},"resolution_terms":{"additionalProperties":true,"type":"object"},"round":{"nullable":true,"type":"string"},"scope_key":{"nullable":true,"type":"string"},"season":{"nullable":true,"type":"string"},"selections":{"items":{"properties":{"canonical_subject":{"additionalProperties":false,"properties":{"id":{"format":"uuid","nullable":true,"type":"string"},"reasons":{"items":{"type":"string"},"type":"array"},"type":{"enum":["player"],"nullable":true,"type":"string"}},"required":["type","id","reasons"],"type":"object"},"execution_identifiers":{"additionalProperties":true,"type":"object"},"execution_readiness":{"properties":{"reasons":{"items":{"type":"string"},"type":"array"},"status":{"enum":["ready","blocked","unknown"],"type":"string"}},"required":["status","reasons"],"type":"object"},"id":{"format":"uuid","type":"string"},"label":{"type":"string"},"lifecycle":{"type":"string"},"line":{"format":"double","nullable":true,"type":"number"},"native_selection_id":{"type":"string"},"native_subject":{"additionalProperties":true,"nullable":true,"type":"object"},"outcome_meaning":{"type":"string"},"quote_readiness":{"properties":{"reasons":{"items":{"type":"string"},"type":"array"},"status":{"enum":["ready","blocked","unknown"],"type":"string"}},"required":["status","reasons"],"type":"object"},"sort_order":{"nullable":true,"type":"integer"}},"required":["id","native_selection_id","label","outcome_meaning","lifecycle","execution_identifiers","native_subject","canonical_subject","quote_readiness","execution_readiness"],"type":"object"},"type":"array"},"session":{"nullable":true,"type":"string"},"title":{"type":"string"},"url":{"nullable":true,"type":"string"},"venue":{"enum":["kalshi","polymarket","limitless","predict_fun","prophetx","polymarket_us"],"type":"string"}},"required":["id","venue","native_listing_id","identity_status","quarantine_reasons","title","lifecycle","actual_scope","outcome_meaning","native_subject","resolution_terms","canonical_attachment","quote_readiness","execution_readiness","provenance","selections"],"title":"PredictionNativeListing","type":"object"},"CryptoWindowQuote":{"description":"The listing's indicative quote: our one-minute poll capture of the venue's\nprice (`observed_at` is OUR capture time, never a provider clock). `null`\nwhen the listing is not currently quotable: it is not `upcoming`/`live`, its\nwindow has ended, it has no quote, or the quote is older than 15 minutes.\nIndicative, not executable: `stale` is true once `age_ms` exceeds\n`stale_after_ms` (150 s for 5m/15m, 300 s for 1h, 600 s for 1d).\n","nullable":true,"properties":{"age_ms":{"minimum":0,"type":"integer"},"down":{"format":"double","maximum":1,"minimum":0,"type":"number"},"observed_at":{"format":"date_time","type":"string"},"source":{"enum":["kalshi_bid_ask_mid","kalshi_last","polymarket_clob_mid","polymarket_gamma","limitless_clob_mid","limitless_prices"],"type":"string"},"stale":{"type":"boolean"},"stale_after_ms":{"minimum":0,"type":"integer"},"up":{"format":"double","maximum":1,"minimum":0,"type":"number"}},"required":["up","down","source","observed_at","age_ms","stale_after_ms","stale"],"title":"CryptoWindowQuote","type":"object"},"CryptoWindowPage":{"properties":{"after":{"description":"Opaque signed cursor for the next page; null on the last page.","nullable":true,"type":"string"},"as_of":{"description":"Frozen for this cursor walk; pass the returned `after` to keep it stable.","format":"date_time","type":"string"},"data":{"items":{"description":"A calendar-grid crypto up/down window matched across Kalshi, Polymarket\nand Limitless (ParlayX). Identity, cross-venue match classes, each\nconstituent's native IDs, the venue's own lifecycle/result and an\nindicative per-constituent `quote`; SportsStack never computes settlement.\nPrefer the unified `CRYPTO` league surface (`/v1/events`, `/v1/odds`) for new\nintegrations; this endpoint is a documented alias of it.\n\nDiscovery lag (R1): Kalshi and Polymarket pre-list windows, so the next\nwindow is readable before `window_start`. Limitless creates 5m/15m\nmarkets 1-2 windows ahead but creates hourly/daily markets only at\n`window_start` itself, so a missing Limitless hourly/daily constituent\nfor up to 3 minutes after `window_start` is expected lag, not a gap.\n\n`status` is a window-clock computation (`upcoming`/`live`/`ended`\nrelative to `as_of`) and is independent of any constituent's result --\n`ended` does not imply any venue has posted a result yet; check each\nconstituent's own `lifecycle`/`result`.\n\nResult latency and correction bounds, measured from `window_end` (R6):\n\n| Venue | Published within 30 min of window_end | Later |\n|---|---|---|\n| Kalshi, Polymarket | visible within 5 min (live poll) | visible within 20 min (15-min sweep, up to window_end + 24h) |\n| Limitless | visible within 5 min during the first hour (3-min re-checks) | visible within 35 min (30-min re-checks) up to window_end + 24h |\n\nA later or different venue result, or a venue void, corrects the stored\nstate (bumping `result_revision`) up to `window_end` + 24h. A result is\nnever overwritten by a null except by an explicit venue void.\n\nData is retained for 30 days from `window_end`.\n","properties":{"as_of":{"description":"Frozen at the first page of a cursor walk so status stays stable.","format":"date_time","type":"string"},"asset":{"enum":["BTC","ETH","SOL","DOGE"],"type":"string"},"groups":{"items":{"description":"A cross-venue match class for this window. `exact` groups share one\n`family_id` (same window, reference source and tie rule) and are safe to\ntreat as one contract. `same_window_different_reference` groups share a\n`tie_rule` across two or more distinct `reference_source`s (for example\nKalshi's `cf_benchmarks_rti` vs Polymarket/Limitless's\n`chainlink_twap_60s`) -- same window and side convention, different\noracle, and must never be collapsed into `exact`.\n","properties":{"constituents":{"items":{"description":"One venue's native listing for a crypto window: its native IDs\n(`native_market_id`, `native_ref`, and `native_yes_token`/`native_no_token`\nwhen the venue exposes on-chain tokens) and, while the listing is quotable,\nan indicative `quote` from our one-minute poll. `result`/`resolved_at`/\n`end_price` are a pass-through of the venue's own settlement, never a\nSportsStack determination. Clients that need executable prices stream order\nbooks from the venue directly using the native IDs.\n","properties":{"end_price":{"format":"double","nullable":true,"type":"number"},"family_id":{"description":"Shared by every listing with the same window, reference source and tie rule.","format":"uuid","type":"string"},"last_changed_at":{"description":"Fetch time of the feed file that last changed this listing.","format":"date_time","type":"string"},"lifecycle":{"enum":["upcoming","live","closed","resolved","voided"],"type":"string"},"mirror_of":{"description":"For a Limitless listing, the Polymarket slug it mirrors.","nullable":true,"type":"string"},"native_market_id":{"description":"The venue's native market ID.","type":"string"},"native_no_token":{"description":"On-chain CLOB token ID for the Down/No side, when the venue exposes one.","nullable":true,"type":"string"},"native_ref":{"description":"The venue's ticker (Kalshi) or slug (Polymarket, Limitless).","type":"string"},"native_yes_token":{"description":"On-chain CLOB token ID for the Up/Yes side, when the venue exposes one.","nullable":true,"type":"string"},"quote":{"description":"The listing's indicative quote: our one-minute poll capture of the venue's\nprice (`observed_at` is OUR capture time, never a provider clock). `null`\nwhen the listing is not currently quotable: it is not `upcoming`/`live`, its\nwindow has ended, it has no quote, or the quote is older than 15 minutes.\nIndicative, not executable: `stale` is true once `age_ms` exceeds\n`stale_after_ms` (150 s for 5m/15m, 300 s for 1h, 600 s for 1d).\n","nullable":true,"properties":{"age_ms":{"minimum":0,"type":"integer"},"down":{"format":"double","maximum":1,"minimum":0,"type":"number"},"observed_at":{"format":"date_time","type":"string"},"source":{"enum":["kalshi_bid_ask_mid","kalshi_last","polymarket_clob_mid","polymarket_gamma","limitless_clob_mid","limitless_prices"],"type":"string"},"stale":{"type":"boolean"},"stale_after_ms":{"minimum":0,"type":"integer"},"up":{"format":"double","maximum":1,"minimum":0,"type":"number"}},"required":["up","down","source","observed_at","age_ms","stale_after_ms","stale"],"title":"CryptoWindowQuote","type":"object"},"reference_source":{"description":"The oracle/index this listing resolves against. Two listings of the\nsame window with different reference sources are the\n`same_window_different_reference` match class, not `exact` -- they\ncan and do disagree on start price and result even on a near-flat\nwindow. `binance_usdt_1m_noon` is the Binance USDT 1-minute candle at\n12:00 America/New_York, used by Polymarket's daily up/down markets.\n","enum":["cf_benchmarks_rti","chainlink_twap_60s","binance_usdt_1h_candle","binance_usdt_1m_noon"],"type":"string"},"resolved_at":{"format":"date_time","nullable":true,"type":"string"},"result":{"description":"The venue's own result, passed through unchanged. `null` does not\nmean \"no\": a window whose status is `ended` has not necessarily been\nresolved by the venue yet -- see the result-latency notes on the\nparent window.\n","enum":["up","down","split"],"nullable":true,"type":"string"},"result_revision":{"description":"Increments on every terminal-state correction (including voided -> resolved and back).","minimum":0,"type":"integer"},"settlement_value":{"format":"double","nullable":true,"type":"number"},"start_price":{"format":"double","nullable":true,"type":"number"},"tie_rule":{"enum":["up","split"],"type":"string"},"venue":{"enum":["kalshi","polymarket","limitless"],"type":"string"}},"required":["venue","native_market_id","native_ref","reference_source","tie_rule","family_id","lifecycle","result_revision","last_changed_at"],"title":"CryptoWindowConstituent","type":"object"},"minItems":2,"type":"array"},"family_id":{"description":"Set for `exact` groups; null for `same_window_different_reference`.","format":"uuid","nullable":true,"type":"string"},"match_class":{"enum":["exact","same_window_different_reference"],"type":"string"},"tie_rule":{"description":"Set for `same_window_different_reference` groups; null for `exact`.","nullable":true,"type":"string"}},"required":["match_class","constituents"],"title":"CryptoWindowGroup","type":"object"},"type":"array"},"horizon":{"enum":["5m","15m","1h","1d"],"type":"string"},"status":{"description":"Computed relative to `as_of`; does not imply any constituent has a result.","enum":["upcoming","live","ended"],"type":"string"},"unmatched":{"items":{"properties":{"constituent":{"description":"One venue's native listing for a crypto window: its native IDs\n(`native_market_id`, `native_ref`, and `native_yes_token`/`native_no_token`\nwhen the venue exposes on-chain tokens) and, while the listing is quotable,\nan indicative `quote` from our one-minute poll. `result`/`resolved_at`/\n`end_price` are a pass-through of the venue's own settlement, never a\nSportsStack determination. Clients that need executable prices stream order\nbooks from the venue directly using the native IDs.\n","properties":{"end_price":{"format":"double","nullable":true,"type":"number"},"family_id":{"description":"Shared by every listing with the same window, reference source and tie rule.","format":"uuid","type":"string"},"last_changed_at":{"description":"Fetch time of the feed file that last changed this listing.","format":"date_time","type":"string"},"lifecycle":{"enum":["upcoming","live","closed","resolved","voided"],"type":"string"},"mirror_of":{"description":"For a Limitless listing, the Polymarket slug it mirrors.","nullable":true,"type":"string"},"native_market_id":{"description":"The venue's native market ID.","type":"string"},"native_no_token":{"description":"On-chain CLOB token ID for the Down/No side, when the venue exposes one.","nullable":true,"type":"string"},"native_ref":{"description":"The venue's ticker (Kalshi) or slug (Polymarket, Limitless).","type":"string"},"native_yes_token":{"description":"On-chain CLOB token ID for the Up/Yes side, when the venue exposes one.","nullable":true,"type":"string"},"quote":{"description":"The listing's indicative quote: our one-minute poll capture of the venue's\nprice (`observed_at` is OUR capture time, never a provider clock). `null`\nwhen the listing is not currently quotable: it is not `upcoming`/`live`, its\nwindow has ended, it has no quote, or the quote is older than 15 minutes.\nIndicative, not executable: `stale` is true once `age_ms` exceeds\n`stale_after_ms` (150 s for 5m/15m, 300 s for 1h, 600 s for 1d).\n","nullable":true,"properties":{"age_ms":{"minimum":0,"type":"integer"},"down":{"format":"double","maximum":1,"minimum":0,"type":"number"},"observed_at":{"format":"date_time","type":"string"},"source":{"enum":["kalshi_bid_ask_mid","kalshi_last","polymarket_clob_mid","polymarket_gamma","limitless_clob_mid","limitless_prices"],"type":"string"},"stale":{"type":"boolean"},"stale_after_ms":{"minimum":0,"type":"integer"},"up":{"format":"double","maximum":1,"minimum":0,"type":"number"}},"required":["up","down","source","observed_at","age_ms","stale_after_ms","stale"],"title":"CryptoWindowQuote","type":"object"},"reference_source":{"description":"The oracle/index this listing resolves against. Two listings of the\nsame window with different reference sources are the\n`same_window_different_reference` match class, not `exact` -- they\ncan and do disagree on start price and result even on a near-flat\nwindow. `binance_usdt_1m_noon` is the Binance USDT 1-minute candle at\n12:00 America/New_York, used by Polymarket's daily up/down markets.\n","enum":["cf_benchmarks_rti","chainlink_twap_60s","binance_usdt_1h_candle","binance_usdt_1m_noon"],"type":"string"},"resolved_at":{"format":"date_time","nullable":true,"type":"string"},"result":{"description":"The venue's own result, passed through unchanged. `null` does not\nmean \"no\": a window whose status is `ended` has not necessarily been\nresolved by the venue yet -- see the result-latency notes on the\nparent window.\n","enum":["up","down","split"],"nullable":true,"type":"string"},"result_revision":{"description":"Increments on every terminal-state correction (including voided -> resolved and back).","minimum":0,"type":"integer"},"settlement_value":{"format":"double","nullable":true,"type":"number"},"start_price":{"format":"double","nullable":true,"type":"number"},"tie_rule":{"enum":["up","split"],"type":"string"},"venue":{"enum":["kalshi","polymarket","limitless"],"type":"string"}},"required":["venue","native_market_id","native_ref","reference_source","tie_rule","family_id","lifecycle","result_revision","last_changed_at"],"title":"CryptoWindowConstituent","type":"object"},"reason":{"enum":["no_match","mirror_counterpart_missing","mirror_terms_disagree"],"type":"string"}},"required":["reason","constituent"],"title":"CryptoWindowUnmatched","type":"object"},"type":"array"},"window_end":{"format":"date_time","type":"string"},"window_id":{"format":"uuid","type":"string"},"window_start":{"format":"date_time","type":"string"}},"required":["window_id","asset","horizon","window_start","window_end","status","as_of","groups","unmatched"],"title":"CryptoWindow","type":"object"},"type":"array"},"page_size":{"maximum":200,"minimum":1,"type":"integer"}},"required":["data","after","page_size","as_of"],"title":"CryptoWindowPage","type":"object"},"ScoreboardDetailsV1Soccer":{"additionalProperties":false,"description":"Soccer. Every key is always present. A key whose value is not known is `null`, never `0`, `false` or an empty value.","properties":{"added_time_announced":{"description":"Announced stoppage time as `m:ss`. `null` when unknown.","nullable":true,"pattern":"^\\d{1,3}:[0-5]\\d$","type":"string"},"added_time_played":{"description":"Stoppage time played as `m:ss`. `null` when unknown.","nullable":true,"pattern":"^\\d{1,3}:[0-5]\\d$","type":"string"},"attendance":{"description":"Game attendance","maximum":1000000000,"minimum":0,"nullable":true,"type":"integer"},"away_corners":{"description":"Soccer away corner kicks","maximum":1000000000,"minimum":0,"nullable":true,"type":"integer"},"away_possession":{"description":"Soccer away ball possession percentage","maximum":100,"minimum":0,"nullable":true,"type":"number"},"away_red_cards":{"description":"Soccer away red cards (includes second-yellow dismissals)","maximum":1000000000,"minimum":0,"nullable":true,"type":"integer"},"away_shots":{"description":"Soccer away total shots","maximum":1000000000,"minimum":0,"nullable":true,"type":"integer"},"away_shots_on_target":{"description":"Soccer away shots on target","maximum":1000000000,"minimum":0,"nullable":true,"type":"integer"},"away_substitutions":{"description":"Soccer away substitutions made","maximum":1000000000,"minimum":0,"nullable":true,"type":"integer"},"away_yellow_cards":{"description":"Soccer away yellow cards","maximum":1000000000,"minimum":0,"nullable":true,"type":"integer"},"details_version":{"description":"Version of the details format. Always `1` in this format.","enum":[1],"type":"integer"},"home_corners":{"description":"Soccer home corner kicks","maximum":1000000000,"minimum":0,"nullable":true,"type":"integer"},"home_possession":{"description":"Soccer home ball possession percentage","maximum":100,"minimum":0,"nullable":true,"type":"number"},"home_red_cards":{"description":"Soccer home red cards (includes second-yellow dismissals)","maximum":1000000000,"minimum":0,"nullable":true,"type":"integer"},"home_shots":{"description":"Soccer home total shots","maximum":1000000000,"minimum":0,"nullable":true,"type":"integer"},"home_shots_on_target":{"description":"Soccer home shots on target","maximum":1000000000,"minimum":0,"nullable":true,"type":"integer"},"home_substitutions":{"description":"Soccer home substitutions made","maximum":1000000000,"minimum":0,"nullable":true,"type":"integer"},"home_yellow_cards":{"description":"Soccer home yellow cards","maximum":1000000000,"minimum":0,"nullable":true,"type":"integer"},"match_minute":{"description":"Elapsed match clock as `m:ss` (one to three digit minutes), stoppage time excluded. `null` when unknown.","nullable":true,"pattern":"^\\d{1,3}:[0-5]\\d$","type":"string"},"match_status":{"description":"Soccer match phase. `null` when the phase is not known or is not one of the listed values.","enum":["first_half","halftime","second_half","extra_time_first_half","extra_time_second_half","penalties","ended","not_started","postponed",null],"nullable":true,"type":"string"},"regulation_score":{"description":"Soccer score at the end of regulation. `null` until a match goes past regulation (extra time).","nullable":true,"properties":{"away_score":{"maximum":1000000000,"minimum":0,"type":"integer"},"home_score":{"maximum":1000000000,"minimum":0,"type":"integer"}},"required":["home_score","away_score"],"type":"object"},"shootout":{"description":"Soccer penalty shootout score. `null` until penalties are reached.","nullable":true,"properties":{"away_score":{"maximum":1000000000,"minimum":0,"type":"integer"},"home_score":{"maximum":1000000000,"minimum":0,"type":"integer"}},"required":["home_score","away_score"],"type":"object"}},"required":["added_time_announced","added_time_played","attendance","away_corners","away_possession","away_red_cards","away_shots","away_shots_on_target","away_substitutions","away_yellow_cards","details_version","home_corners","home_possession","home_red_cards","home_shots","home_shots_on_target","home_substitutions","home_yellow_cards","match_minute","match_status","regulation_score","shootout"],"type":"object"},"ScoreboardDetailsV1Baseball":{"additionalProperties":false,"description":"Baseball. Every key is always present. A key whose value is not known is `null`, never `0`, `false` or an empty value.","properties":{"balls":{"description":"Ball count (0-3)","maximum":1000000000,"minimum":0,"nullable":true,"type":"integer"},"details_version":{"description":"Version of the details format. Always `1` in this format.","enum":[1],"type":"integer"},"hitter_ab_over":{"description":"At-bat is complete","nullable":true,"type":"boolean"},"hitter_full_name":{"description":"Current batter name","nullable":true,"type":"string"},"outs":{"description":"Outs in inning (0-2)","maximum":1000000000,"minimum":0,"nullable":true,"type":"integer"},"pitcher_full_name":{"description":"Current pitcher name","nullable":true,"type":"string"},"pitcher_pitch_speed":{"description":"Last pitch speed (mph)","maximum":1.0e12,"minimum":0,"nullable":true,"type":"number"},"pitcher_pitch_type":{"description":"Last pitch type","nullable":true,"type":"string"},"pitcher_pitch_x":{"description":"Pitch location X coordinate","maximum":1.0e12,"minimum":-1.0e12,"nullable":true,"type":"number"},"pitcher_pitch_y":{"description":"Pitch location Y coordinate","maximum":1.0e12,"minimum":-1.0e12,"nullable":true,"type":"number"},"pitcher_pitch_zone":{"description":"Strike zone location","maximum":1000000000,"minimum":0,"nullable":true,"type":"integer"},"runners_count":{"description":"Number of runners on base","maximum":1000000000,"minimum":0,"nullable":true,"type":"integer"},"runners_on_base":{"description":"Runners on base, ordered by base. Each item has `base` (1-3) and, when the source reports a name, `full_name`. An empty list means the bases are empty; `null` means unknown.","items":{"properties":{"base":{"enum":[1,2,3],"type":"integer"},"full_name":{"type":"string"}},"required":["base"],"type":"object"},"nullable":true,"type":"array"},"strikes":{"description":"Strike count (0-2)","maximum":1000000000,"minimum":0,"nullable":true,"type":"integer"}},"required":["balls","details_version","hitter_ab_over","hitter_full_name","outs","pitcher_full_name","pitcher_pitch_speed","pitcher_pitch_type","pitcher_pitch_x","pitcher_pitch_y","pitcher_pitch_zone","runners_count","runners_on_base","strikes"],"type":"object"},"Player":{"description":"A player represents an individual athlete who competes in sports events.\n\nPlayers are fundamental entities in sports data, serving as the subject of performance\nstatistics, injury reports, roster information, and individual achievements. They can\nbe active or inactive, professional or amateur, and may change teams throughout their careers.\n\n## Core Information\n- **Identity**: Names, physical characteristics, and biographical data\n- **Career Details**: Draft information, experience level, educational background\n- **Current Status**: Active roster status, team affiliation, position\n- **Performance**: Historical and current statistics across multiple events/seasons\n\n## Key Relationships\n- **Team**: Current team affiliation (can change via trades/signings)\n- **Statistics**: Performance data across events and seasons\n- **Injuries**: Current and historical injury status affecting availability\n- **Events**: Games/matches the player participates in\n- **Draft**: Original draft selection details for professional leagues\n\n## Position Codes\nPosition abbreviations vary by sport:\n- **Football**: QB, RB, WR, TE, OL, DL, LB, CB, S, K, P\n- **Basketball**: PG, SG, SF, PF, C\n- **Baseball**: P, C, 1B, 2B, 3B, SS, LF, CF, RF, DH\n- **Hockey**: C, LW, RW, D, G\n\n## Status Management\nThe is_active flag indicates current roster status. Inactive players may return\nto active status, while retired players typically remain inactive permanently.\n","example":{"birthday":"December 30, 1984","common_model_id":"f1798a7e-4832-4a2c-8cb6-60d5afcb3d41","family_name":"James","first_name":"LeBron","full_name":"LeBron James","height_in":81,"image_url":"https://cdn.example.com/headshots/nba/1966.png","is_active":true,"league_id":"58e8c89b-72f8-4427-adbc-10f193c9b462","metadata":"[]","nickname":"","number":"6","position":"PF","team_id":"58e8c89b-72f8-4427-adbc-10f193c9b462","weight_lbs":250},"properties":{"birth_place":{"description":"City, state/province, country of birth","type":"string"},"birthday":{"description":"Date of birth (format may vary by data source)","type":"string"},"college":{"description":"College/university attended (important for draft analysis)","type":"string"},"college_conf":{"description":"College conference (e.g., 'SEC', 'Big 10', 'ACC')","type":"string"},"common_model_id":{"description":"Unique player identifier across all data sources","type":"string"},"draft_number":{"description":"Overall draft pick number (1-based)","type":"integer"},"draft_round":{"description":"Draft round selected (1-based)","type":"integer"},"draft_team_id":{"description":"Team that originally drafted the player","type":"string"},"draft_year":{"description":"Year player was drafted into professional league","type":"integer"},"experience":{"description":"Years of professional experience or rookie status","type":"string"},"family_name":{"description":"Surname/family name","type":"string"},"first_name":{"description":"Given/first name","type":"string"},"full_name":{"description":"Complete name as commonly known (e.g., 'LeBron James')","type":"string"},"height_in":{"description":"Height in inches (total inches, not feet/inches)","type":"integer"},"high_school":{"description":"High school attended","type":"string"},"image_url":{"description":"Player headshot or action photo","type":"string"},"is_active":{"description":"true if currently on active roster, false if inactive/retired","type":"boolean"},"league_id":{"description":"League the player currently competes in","type":"string"},"metadata":{"description":"Additional sport-specific or source-specific data","type":"object"},"nickname":{"description":"Common nickname or alternate name used in media","type":"string"},"number":{"description":"Jersey/uniform number (stored as string to handle formats like '6A')","type":"string"},"position":{"description":"Primary playing position using standard sport abbreviations","type":"string"},"roster_observed_at":{"description":"UTC timestamp of the effective complete roster census supporting the current team assignment","format":"date-time","nullable":true,"type":"string"},"source_mappings_by_source":{"additionalProperties":{"properties":{"event":{"description":"Event mapping rows for event endpoints.","items":{"properties":{"common_model_id":{"format":"uuid","type":"string"},"deprecated_at":{"format":"date-time","nullable":true,"type":"string"},"entity_type":{"type":"string"},"id_scheme":{"type":"string"},"ignored_pending":{"type":"boolean"},"league":{"type":"string"},"match_status":{"type":"string"},"overmapped_allowed":{"type":"boolean"},"provider":{"type":"string"},"source":{"type":"string"},"source_id":{"type":"string"},"tenant_id":{"format":"uuid","nullable":true,"type":"string"},"updated_at":{"format":"date-time","type":"string"}},"type":"object"},"type":"array"},"mappings":{"description":"Source mapping rows for non-event entity endpoints.","items":{"properties":{"common_model_id":{"format":"uuid","type":"string"},"deprecated_at":{"format":"date-time","nullable":true,"type":"string"},"entity_type":{"type":"string"},"id_scheme":{"type":"string"},"ignored_pending":{"type":"boolean"},"league":{"type":"string"},"match_status":{"type":"string"},"overmapped_allowed":{"type":"boolean"},"provider":{"type":"string"},"source":{"type":"string"},"source_id":{"type":"string"},"tenant_id":{"format":"uuid","nullable":true,"type":"string"},"updated_at":{"format":"date-time","type":"string"}},"type":"object"},"type":"array"},"participants":{"description":"Participant mapping rows for event endpoints.","items":{"properties":{"common_model_id":{"format":"uuid","type":"string"},"deprecated_at":{"format":"date-time","nullable":true,"type":"string"},"entity_type":{"type":"string"},"id_scheme":{"type":"string"},"ignored_pending":{"type":"boolean"},"league":{"type":"string"},"match_status":{"type":"string"},"overmapped_allowed":{"type":"boolean"},"participant_id":{"format":"uuid","type":"string"},"participant_role":{"type":"string"},"participant_side":{"enum":["home","away","neutral","unknown"],"type":"string"},"provider":{"type":"string"},"source":{"type":"string"},"source_id":{"type":"string"},"tenant_id":{"format":"uuid","nullable":true,"type":"string"},"updated_at":{"format":"date-time","type":"string"}},"type":"object"},"type":"array"},"unmapped_participants":{"description":"Event participants that could not be emitted as source mappings because they were placeholders/TBD or lacked a mapping for the requested source.","items":{"properties":{"display_name":{"type":"string"},"participant_id":{"type":"string"},"participant_role":{"type":"string"},"participant_side":{"enum":["home","away","neutral","unknown"],"type":"string"},"reason":{"enum":["placeholder_or_tbd","missing_source_mapping"],"type":"string"}},"type":"object"},"type":"array"}},"type":"object"},"description":"Optional enterprise mapping enrichment keyed by full normalized source. Added when include_source_mappings_by_source=true.","type":"object"},"team_id":{"description":"Current team affiliation (null if free agent or retired)","type":"string"},"weight_lbs":{"description":"Body weight in pounds","type":"integer"}},"required":["common_model_id","full_name"],"title":"Player","type":"object"},"PredictionNativeMatchPage":{"properties":{"cursor":{"nullable":true,"type":"string"},"data":{"items":{"description":"Human-reviewed cross-venue equivalence with exact canonical event, family, subject, scope, outcome/line, selection, and resolution-rule agreement.","properties":{"actual_scope":{"enum":["event","race","session","tournament","round","season"],"type":"string"},"canonical_event_id":{"format":"uuid","nullable":true,"type":"string"},"canonical_family_id":{"format":"uuid","type":"string"},"canonical_league_id":{"format":"uuid","nullable":true,"type":"string"},"canonical_subject_id":{"format":"uuid","type":"string"},"canonical_subject_type":{"type":"string"},"constituents":{"items":{"additionalProperties":true,"description":"Immutable venue-native snapshot retaining title, rules, scope, selections, native execution identifiers, and sanitized provenance.","properties":{"line":{"format":"double","nullable":true,"type":"number"},"native_selections":{"items":{"additionalProperties":true,"properties":{"canonical_subject":{"additionalProperties":false,"properties":{"id":{"format":"uuid","nullable":true,"type":"string"},"reasons":{"items":{"type":"string"},"type":"array"},"type":{"enum":["player"],"nullable":true,"type":"string"}},"required":["type","id","reasons"],"type":"object"},"execution_identifiers":{"additionalProperties":true,"type":"object"},"execution_readiness":{"enum":["ready","blocked","unknown"],"type":"string"},"execution_readiness_reasons":{"items":{"type":"string"},"type":"array"},"label":{"type":"string"},"lifecycle":{"type":"string"},"line":{"format":"double","nullable":true,"type":"number"},"native_selection_id":{"type":"string"},"native_subject":{"additionalProperties":true,"nullable":true,"type":"object"},"outcome_meaning":{"type":"string"},"quote_readiness":{"enum":["ready","blocked","unknown"],"type":"string"},"quote_readiness_reasons":{"items":{"type":"string"},"type":"array"}},"required":["native_selection_id","execution_identifiers","native_subject","canonical_subject","quote_readiness","quote_readiness_reasons","execution_readiness","execution_readiness_reasons"],"type":"object"},"type":"array"},"snapshot_version":{"nullable":true,"type":"integer"}},"type":"object"},"minItems":2,"type":"array"},"id":{"format":"uuid","type":"string"},"line":{"format":"double","nullable":true,"type":"number"},"outcome_meaning":{"type":"string"},"period":{"nullable":true,"type":"string"},"resolution_terms":{"additionalProperties":true,"type":"object"},"review_status":{"enum":["reviewed"],"type":"string"},"reviewed_at":{"format":"date_time","type":"string"},"round":{"nullable":true,"type":"string"},"scope_key":{"nullable":true,"type":"string"},"season":{"nullable":true,"type":"string"},"selection_semantics":{"items":{"additionalProperties":false,"properties":{"line":{"format":"double","nullable":true,"type":"number"},"outcome_meaning":{"type":"string"}},"type":"object"},"type":"array"},"session":{"nullable":true,"type":"string"}},"required":["id","review_status","canonical_subject_type","canonical_subject_id","canonical_family_id","actual_scope","outcome_meaning","resolution_terms","selection_semantics","reviewed_at","constituents"],"title":"PredictionNativeMatch","type":"object"},"type":"array"},"page_size":{"maximum":50,"minimum":1,"type":"integer"}},"required":["data","cursor","page_size"],"title":"PredictionNativeMatchPage","type":"object"},"FutureOutcome":{"properties":{"common_model_id":{"format":"uuid","type":"string"},"execution":{"additionalProperties":true,"description":"Venue-keyed execution blocks (`{\"kalshi\": {...}, \"polymarket\": {...}}`, the same shape event odds carry under metadata.execution) unioned from this outcome's quotes. Unlike metadata.execution, which holds one venue on a cross-venue outcome, this lists every venue that currently quotes the outcome. Empty when no quote carries a block.","type":"object"},"grouping_key":{"nullable":true,"type":"string"},"inserted_at":{"format":"date-time","nullable":true,"type":"string"},"is_main":{"nullable":true,"type":"boolean"},"line":{"nullable":true,"type":"number"},"metadata":{"description":"Provider metadata. For prediction markets this includes the \"execution\" block carrying the identifiers needed to place a trade on the originating venue (venue, ticker/token_id, condition_id, neg_risk, tick_size, venue contracts, url).","nullable":true,"type":"object"},"name":{"type":"string"},"normalized_selection":{"nullable":true,"type":"string"},"odds":{"description":"Current tenant-visible quotes for this canonical outcome, one per venue/position.","items":{"properties":{"aggregator":{"type":"string"},"canonical_outcome_id":{"description":"Cross-venue outcome identity; present only when the outcome identity is verified (same rule as GET /v1/odds), otherwise null. Never a per-venue fallback.","format":"uuid","nullable":true,"type":"string"},"clock_provenance":{"properties":{"evaluated_at":{"format":"date-time","type":"string"},"max_age_seconds":{"enum":[300],"type":"integer"},"quote_provenance":{"description":"Unmodified retained JSON provenance, including legacy or malformed evidence.","nullable":true},"source":{"enum":["timestamp",null],"nullable":true,"type":"string"}},"type":"object"},"common_model_id":{"format":"uuid","type":"string"},"deep_link":{"nullable":true,"type":"string"},"event_id":{"description":"Always null for a future market; present for parity with GET /v1/odds.","format":"uuid","nullable":true,"type":"string"},"execution_readiness":{"description":"Requires exact native source-ID binding, active parent/outcome lifecycle and proven fresh provider clock; not order-fill certification. ProphetX additionally requires one atomic native strike/price/size/time observation matching its documented submit-order fields. ready=null means unknown. Native IDs remain separate from common_model_id.","example":{"available_size":{"state":"unknown","value":null},"depth":{"state":"unknown","value":null},"executable":{"reason":"catalog_is_not_a_book","state":"unknown"},"identifiers_valid":true,"liquidity":{"state":"unknown","value":null},"ready":null,"reasons":["provider_clock_provenance_downgrade"],"scope":"outcome_identifiers_and_provider_clock","venue":"limitless"},"properties":{"available_size":{"additionalProperties":true,"description":"Retained evidence; absent measurements have state unknown and value null.","type":"object"},"depth":{"additionalProperties":true,"description":"Retained evidence; absent measurements have state unknown and value null.","type":"object"},"executable":{"additionalProperties":true,"description":"Retained evidence; absent measurements have state unknown and value null.","type":"object"},"identifiers_valid":{"type":"boolean"},"liquidity":{"additionalProperties":true,"description":"Retained evidence; absent measurements have state unknown and value null.","type":"object"},"ready":{"nullable":true,"type":"boolean"},"reasons":{"items":{"type":"string"},"type":"array"},"scope":{"enum":["outcome_identifiers_and_provider_clock"],"type":"string"},"venue":{"type":"string"}},"type":"object"},"fetched_at":{"description":"Timestamp when SportsStack fetched or observed this quote","format":"date-time","nullable":true,"type":"string"},"freshness_reasons":{"description":"Deterministic provider_clock_* or lifecycle_* reasons; empty when fresh.","items":{"type":"string"},"type":"array"},"is_main":{"nullable":true,"type":"boolean"},"limits":{"nullable":true,"type":"object"},"market_id":{"description":"The future market this quote belongs to (its common_model_id, which is the canonical family id for a classified family). Same field as GET /v1/odds.","format":"uuid","nullable":true,"type":"string"},"market_name":{"nullable":true,"type":"string"},"market_type":{"nullable":true,"type":"string"},"metadata":{"description":"Provider quote metadata, including venue execution identifiers.","nullable":true,"type":"object"},"outcome_id":{"description":"The outcome common_model_id this quote is nested under. Same field as GET /v1/odds.","format":"uuid","nullable":true,"type":"string"},"platform_observed_at":{"description":"Prediction quotes only. Row observed_at, independently of provider freshness.","format":"date-time","nullable":true,"type":"string"},"points":{"description":"Line value distinguishing alternate positions, when applicable","nullable":true,"type":"number"},"price":{"type":"number"},"price_type":{"type":"string"},"provider_freshness":{"description":"Prediction quotes only. Fresh requires a proven nonfuture provider clock at most 300 seconds old and proven active exact-parent/outcome lifecycle. Standalone odds report unknown without lifecycle proof.","enum":["fresh","stale","unknown"],"type":"string"},"provider_observed_at":{"description":"Prediction quotes only. Authoritative provider quote timestamp; never receipt/observation time. Requires matching observed quote_provenance.provider_updated_at; null for absent, synthetic or downgraded authority.","format":"date-time","nullable":true,"type":"string"},"selection_line":{"description":"Provider label for the selected line position, when applicable","nullable":true,"type":"string"},"source_id":{"nullable":true,"type":"string"},"source_market_id":{"nullable":true,"type":"string"},"source_selection_id":{"nullable":true,"type":"string"},"sportsbook":{"type":"string"},"timestamp":{"format":"date-time","nullable":true,"type":"string"},"trading_fees":{"description":"Prediction quotes only (absent on sportsbook rows and on venues whose fees are not captured yet: Limitless, ProphetX, Polymarket US, SX Bet). Computed at read time; no order-fill or account-specific guarantee (per-account discounts, maker rebates and balance-precision rounding are not modelled). Kalshi: rates from a versioned snapshot of Kalshi's public series metadata, event fee overrides and fee schedule; `observed_at` is the snapshot time. Series with event-level fee overrides (MLB) resolve per event: an override in force reports `scope: event` (with `event_ticker`, `effective_from`), before its `scheduled_ts` the series fee is reported with the pending change under `scheduled_override`, and an event missing from the snapshot reports `unknown` (`event_fee_override_not_in_snapshot`). Predict.fun: derived from the stored market `fee_rate_bps`; `observed_at` is the quote observation time. Polymarket: the market's own Gamma `feesEnabled`/`feeSchedule` captured with the quote (`fee = shares x rate x P x (1 - P)`, taker only, makers pay nothing; `maker.rebate_rate` is the fraction of taker fees returned to makers through a daily rebate program, not a per-fill credit; fees round to 5 decimal places with no published direction, so `rounding.direction` is absent); `observed_at` is the quote observation time, and quotes whose fee data is missing, has an exponent other than 1, or is not taker-only report `unknown`. The rate is per market (`sports_fees_v3` 0.05, `sports_fees_v2` 0.03, `zero_fees` 0 are all live on sports), never a category default.","example":{"availability":"published","charge_basis":"fill","fee_multiplier":1.0,"fee_type":"quadratic_with_maker_fees","maker":{"exponent":1,"model":"quadratic","multiplier":1.0,"rate":0.0175,"rounding":{"applies_to":"fee_plus_position_cost","direction":"up","increment":0.0001}},"observed_at":"2026-09-30T15:33:45Z","scope":"series","series_ticker":"KXNBAGAME","source":"kalshi_series_snapshot","taker":{"exponent":1,"model":"quadratic","multiplier":1.0,"rate":0.07,"rounding":{"applies_to":"fee_plus_position_cost","direction":"up","increment":0.0001}}},"properties":{"availability":{"enum":["published","unavailable","unknown"],"type":"string"},"charge_basis":{"description":"Fees are charged per fill, not per order or per settlement.","enum":["fill"],"type":"string"},"effective_from":{"description":"Kalshi, `scope: event`: the override's `scheduled_ts`, from which these rates apply.","format":"date-time","type":"string"},"event_ticker":{"description":"Kalshi: the market ticker minus its last `-` segment. Present for series with event-level fee overrides.","type":"string"},"fee_multiplier":{"type":"number"},"fee_rate_bps":{"type":"integer"},"fee_type":{"type":"string"},"fees_enabled":{"description":"Polymarket: the market's Gamma `feesEnabled` flag.","type":"boolean"},"maker":{"description":"One side of the fee. `quadratic`: fee = rate x contracts x (P x (1 - P)) ^ exponent. `linear_min_price`: fee = rate x min(P, 1 - P) x shares. `none`: no fee. `rate` already includes any venue multiplier.","properties":{"exponent":{"type":"integer"},"formula":{"type":"string"},"model":{"enum":["quadratic","linear_min_price","none"],"type":"string"},"multiplier":{"type":"number"},"rate":{"type":"number"},"rebate_rate":{"description":"Polymarket maker side: fraction of taker fees rebated to resting makers by the daily rebate program (context only, not a per-fill credit).","type":"number"},"rounding":{"properties":{"applies_to":{"type":"string"},"direction":{"enum":["up"],"type":"string"},"increment":{"type":"number"}},"type":"object"}},"type":"object"},"observed_at":{"format":"date-time","nullable":true,"type":"string"},"reason":{"description":"Present when availability is unknown; deterministic snake_case reason.","type":"string"},"scheduled_override":{"description":"Kalshi, `scope: series`: an event-level override that is not yet in force. Charged from `effective_from`; carries `fee_type`, `fee_multiplier`, `taker` and `maker` like the top-level object.","properties":{"effective_from":{"format":"date-time","type":"string"},"fee_multiplier":{"type":"number"},"fee_type":{"type":"string"},"maker":{"description":"One side of the fee. `quadratic`: fee = rate x contracts x (P x (1 - P)) ^ exponent. `linear_min_price`: fee = rate x min(P, 1 - P) x shares. `none`: no fee. `rate` already includes any venue multiplier.","properties":{"exponent":{"type":"integer"},"formula":{"type":"string"},"model":{"enum":["quadratic","linear_min_price","none"],"type":"string"},"multiplier":{"type":"number"},"rate":{"type":"number"},"rebate_rate":{"description":"Polymarket maker side: fraction of taker fees rebated to resting makers by the daily rebate program (context only, not a per-fill credit).","type":"number"},"rounding":{"properties":{"applies_to":{"type":"string"},"direction":{"enum":["up"],"type":"string"},"increment":{"type":"number"}},"type":"object"}},"type":"object"},"taker":{"description":"One side of the fee. `quadratic`: fee = rate x contracts x (P x (1 - P)) ^ exponent. `linear_min_price`: fee = rate x min(P, 1 - P) x shares. `none`: no fee. `rate` already includes any venue multiplier.","properties":{"exponent":{"type":"integer"},"formula":{"type":"string"},"model":{"enum":["quadratic","linear_min_price","none"],"type":"string"},"multiplier":{"type":"number"},"rate":{"type":"number"},"rebate_rate":{"description":"Polymarket maker side: fraction of taker fees rebated to resting makers by the daily rebate program (context only, not a per-fill credit).","type":"number"},"rounding":{"properties":{"applies_to":{"type":"string"},"direction":{"enum":["up"],"type":"string"},"increment":{"type":"number"}},"type":"object"}},"type":"object"}},"type":"object"},"scope":{"enum":["series","event","market"],"type":"string"},"series_ticker":{"type":"string"},"source":{"description":"kalshi_series_snapshot | kalshi_event_fee_snapshot | kalshi_fee_schedule_default | venue_record. `kalshi_event_fee_snapshot` is a Kalshi event-level override in force; `kalshi_fee_schedule_default` is the schedule default (quadratic x 1) inferred for a KX series not in the exception snapshot.","type":"string"},"taker":{"description":"One side of the fee. `quadratic`: fee = rate x contracts x (P x (1 - P)) ^ exponent. `linear_min_price`: fee = rate x min(P, 1 - P) x shares. `none`: no fee. `rate` already includes any venue multiplier.","properties":{"exponent":{"type":"integer"},"formula":{"type":"string"},"model":{"enum":["quadratic","linear_min_price","none"],"type":"string"},"multiplier":{"type":"number"},"rate":{"type":"number"},"rebate_rate":{"description":"Polymarket maker side: fraction of taker fees rebated to resting makers by the daily rebate program (context only, not a per-fill credit).","type":"number"},"rounding":{"properties":{"applies_to":{"type":"string"},"direction":{"enum":["up"],"type":"string"},"increment":{"type":"number"}},"type":"object"}},"type":"object"}},"type":"object"}},"required":["common_model_id","price","price_type","sportsbook","aggregator"],"title":"FutureOutcomeOdd","type":"object"},"type":"array"},"player_id":{"format":"uuid","nullable":true,"type":"string"},"selection":{"nullable":true,"type":"string"},"selection_line":{"nullable":true,"type":"string"},"status":{"nullable":true,"type":"string"},"team_id":{"format":"uuid","nullable":true,"type":"string"},"updated_at":{"format":"date-time","nullable":true,"type":"string"}},"required":["common_model_id","name"],"title":"FutureOutcome","type":"object"},"SeasonScopedStats":{"description":"Season-level performance statistics aggregated across all events within a specific season.\n\nThese statistics represent cumulative or averaged performance metrics for players and teams\nover an entire season period. Unlike EventScopedStats which capture single-game performance,\nSeasonScopedStats provide the broader context of sustained performance and seasonal trends.\n\n## Key Concepts\n- **Aggregation Period**: Full season statistics (regular season, playoffs, or combined)\n- **Entity Scope**: Both individual players and team-level aggregations\n- **Data Sources**: Official league stats, advanced analytics, projections\n- **Historical Value**: Season stats enable year-over-year comparisons and career tracking\n\n## Statistical Categories\nSeason stats typically include:\n- **Volume Stats**: Total accumulations (total yards, points, games played)\n- **Rate Stats**: Per-game or per-attempt averages (batting average, completion percentage)\n- **Advanced Metrics**: Efficiency ratings, advanced analytics (PER, QBR, OPS)\n- **Projections**: Forecasted season totals based on current pace or modeling\n\n## Applications\n- **Fantasy Sports**: Season-long player evaluation and projections\n- **Team Analysis**: Roster evaluation and performance trends\n- **Historical Comparison**: Career trajectories and milestone tracking\n- **Contract Negotiations**: Performance-based contract evaluations\n","example":{"common_model_id":"a1b2c3d4-e5f6-7890-abcd-ef1234567890","data":{"defensive_yards":16,"offensive_rushing_yards":12},"for_entity_id":"59291391-0c7e-442b-9496-33074647384e","for_entity_type":"player","inserted_at":"2024-08-26T22:03:16-04:00","is_projection":true,"season_year":2024,"source":"example_provider","team_id":"b3f7a1c2-9d4e-4f8a-b5c6-1a2b3c4d5e6f","updated_at":"2024-08-26T22:03:16-04:00"},"properties":{"common_model_id":{"description":"Unique identifier for this season stats record","format":"uuid","type":"string"},"data":{"additionalProperties":false,"description":"Season-aggregated statistics using canonical field names from our stat registry.\n\n## Season-Level Aggregation\nThese statistics represent cumulative or averaged performance across all events\nwithin a season. Values are typically totals, averages, or rate statistics that\nprovide season-long performance context.\n\n## Standardized Stat Names\nAll statistics use our unified canonical naming system. Season stats commonly include:\n- **Volume Stats**: Total accumulations (passing_yards, rushing_attempts, receptions)\n- **Rate Stats**: Per-game or efficiency metrics (completion_percentage, yards_per_carry)\n- **Advanced Metrics**: Calculated performance indicators (quarterback_rating, passer_rating)\n- **Projections**: Forecasted season totals based on pace or modeling\n\n## Data Sources\n- **Official Stats**: League-provided season totals and averages\n- **Calculated Stats**: Derived metrics from event-level data aggregation\n- **Projections**: Forecasted performance based on current pace\n\n## Provider Translation\nSeason data from various providers is normalized to canonical names:\n- **Official feeds**: Season totals and averages\n- **Projection providers**: Projected season statistics and pace-based forecasts\n- **Ranking providers**: Season performance metrics and rankings\n\nSee the complete stat registry for all supported seasonal statistics.\n","example":{"completion_percentage":67.5,"games_played":16,"interceptions":8,"passing_touchdowns":28,"passing_yards":4200,"quarterback_rating":102.3},"properties":{"def_interception_touchdowns":{"description":"Defensive interception touchdowns","example":5,"type":"integer"},"throwaways":{"description":"Number of throw away passes","example":5,"type":"integer"},"fanduel_fantasy_points_ceiling":{"description":"FanDuel fantasy points ceiling","example":18.5,"type":"number"},"on_target_throws":{"description":"Number of on-target throws","example":5,"type":"integer"},"interception_returns":{"description":"Number of interception returns","example":5,"type":"integer"},"kickoff_return_touchdowns":{"description":"Kickoff return touchdowns","example":5,"type":"integer"},"extra_points_attempted":{"description":"Number of extra point attempts","example":5,"type":"integer"},"redzone_rushing_attempts":{"description":"Rush attempts in the red zone","example":15,"type":"integer"},"is_motion":{"description":"Whether player was in motion during play","example":"example_value","type":"boolean"},"passing_attempts":{"description":"Total number of pass attempts","example":15,"type":"integer"},"punt_long":{"description":"Longest punt","example":5,"type":"integer"},"fumble_return_yards":{"description":"Yards gained on fumble returns","example":250,"type":"integer"},"first_read_receptions":{"description":"Number of first read receptions","example":5,"type":"integer"},"red_zone_pass_attempts":{"description":"Pass attempts in red zone","example":15,"type":"integer"},"points":{"description":"Total points scored by team","example":5,"type":"integer"},"depth_of_target":{"description":"Average depth of target","example":12.3,"type":"number"},"defensive_interceptions":{"description":"Defensive interceptions","example":5,"type":"integer"},"receiving_two_point_conversions":{"description":"Receiving two-point conversions","example":5,"type":"integer"},"field_goal_yards":{"description":"Yards gained on field goals","example":250,"type":"integer"},"conversion_defense_successes":{"description":"Two-point conversion defensive successes","example":5,"type":"integer"},"blocked_kick_return_touchdowns":{"description":"Touchdowns scored on blocked kick returns","example":5,"type":"integer"},"fanduel_ownership":{"description":"FanDuel ownership percentage","example":12.3,"type":"number"},"draftkings_fantasy_points_ceiling":{"description":"DraftKings fantasy points ceiling","example":18.5,"type":"number"},"first_read_targets":{"description":"Number of first read targets","example":5,"type":"integer"},"special_teams_snap_count":{"description":"Number of special teams snaps played","example":5,"type":"integer"},"out_of_pocket_reason":{"description":"Reason quarterback left the pocket","example":"example_value","type":"string"},"goal_line_touches":{"description":"Number of goal line touches","example":5,"type":"integer"},"receiving_yards_100_plus":{"description":"Number of 100+ yard receiving games","example":250,"type":"integer"},"total_pocket_time":{"description":"Total time spent in pocket","example":12.3,"type":"number"},"interception_return_longest_touchdown":{"description":"Longest interception return for touchdown","example":5,"type":"integer"},"field_goals_attempts":{"description":"Number of field goal attempts","example":15,"type":"integer"},"safeties":{"description":"Number of safeties","example":5,"type":"integer"},"pass_first_downs":{"description":"First downs gained via passing","example":5,"type":"integer"},"red_zone_passing_completions":{"description":"Passing completions in red zone","example":10,"type":"integer"},"net_punt_yards":{"description":"Net punt yards","example":250,"type":"integer"},"kneel_downs":{"description":"Number of kneel downs","example":5,"type":"integer"},"cushion_yards":{"description":"Cushion yards","example":250,"type":"integer"},"punt_yards":{"description":"Total punt yards","example":250,"type":"integer"},"challenges_remaining":{"description":"Number of challenges remaining","example":5,"type":"integer"},"passing_gross_yards":{"description":"Gross passing yards before sacks","example":250,"type":"integer"},"avg_pocket_time":{"description":"Average time in pocket per pass attempt","example":12.3,"type":"number"},"defended_passes":{"description":"Passes defended by defenders","example":5,"type":"integer"},"dropped_pass":{"description":"Number of dropped passes","example":5,"type":"integer"},"rushing_direction":{"description":"Direction of rushing attempt","example":"example_value","type":"string"},"sacks_taken":{"description":"Number of sacks taken by quarterback","example":5,"type":"integer"},"rec_long":{"description":"Longest reception","example":5,"type":"integer"},"yards_after_catch":{"description":"Yards gained after catch","example":250,"type":"integer"},"activated":{"description":"Player was activated to the game-day roster (shipped as 0/1)","example":5,"type":"integer"},"passing_yards":{"description":"Total passing yards thrown by the player/team","example":250,"type":"integer"},"touchdowns":{"description":"Total touchdowns scored","example":5,"type":"integer"},"rushing_fumbles":{"description":"Number of fumbles while rushing","example":5,"type":"integer"},"pre_snap_motion":{"description":"Player pre-snap motion type","example":"example_value","type":"boolean"},"nfl_fantasy_points":{"description":"NFL fantasy points","example":18.5,"type":"number"},"assisted_tackles":{"description":"Number of assisted tackles","example":5,"type":"integer"},"passing_completions":{"description":"Number of completed passes","example":10,"type":"integer"},"sacks":{"description":"Number of sacks (as QB or defensive player)","example":12.3,"type":"number"},"passing_40_plus":{"description":"Passing completions of 40+ yards","example":5,"type":"integer"},"missed_tackle_location":{"description":"Location of missed tackle","example":"example_value","type":"string"},"rushing_longest_touchdown":{"description":"Longest touchdown rush","example":5,"type":"integer"},"penalty_yards":{"description":"Penalty yards assessed","example":250,"type":"integer"},"rushing_tds_40_plus_yards":{"description":"Rushing touchdowns of 40+ yards","example":250,"type":"integer"},"penalties":{"description":"Number of penalties committed","example":5,"type":"integer"},"rushing_yards":{"description":"Total rushing yards gained","example":250,"type":"integer"},"punt_return_yards":{"description":"Punt return yards","example":250,"type":"integer"},"blocked_kicks":{"description":"Number of blocked kicks","example":5,"type":"integer"},"position":{"description":"Player position","example":"example_value","type":"string"},"sack_yards_lost":{"description":"Yards lost on sacks","example":250,"type":"integer"},"kickoff_touchbacks":{"description":"Number of kickoff touchbacks","example":5,"type":"integer"},"def_interception_yards":{"description":"Defensive interception return yards","example":250,"type":"integer"},"rush_long":{"description":"Longest rush","example":5,"type":"integer"},"played":{"description":"Whether the player appeared in the game","example":"example_value","type":"boolean"},"two_point_conversions":{"description":"Number of two-point conversions","example":5,"type":"integer"},"conversion_defense_attempts":{"description":"Two-point conversion defensive attempts","example":15,"type":"integer"},"tackles":{"description":"Total tackles (solo + assisted)","example":5,"type":"integer"},"return_yards":{"description":"Total return yards (kick/punt combined)","example":250,"type":"integer"},"kickoff_return_yards":{"description":"Total yards on kickoff returns (opponent)","example":250,"type":"integer"},"games_played":{"description":"Number of games played in","example":5,"type":"integer"},"receiving_20_plus":{"description":"Receptions of 20+ yards","example":5,"type":"integer"},"field_goals_missed":{"description":"Field goals missed","example":5,"type":"integer"},"draftkings_rating":{"description":"DraftKings player rating","example":98.7,"type":"number"},"pre_snap_alignment":{"description":"Player pre-snap alignment","example":"example_value","type":"string"},"kickoff_inside_20":{"description":"Kickoffs downed inside the 20 yard line","example":5,"type":"integer"},"batted_passes":{"description":"Passes batted down at line of scrimmage","example":5,"type":"integer"},"rushing_avg_yards":{"description":"Average yards per carry","example":12.3,"type":"number"},"interception_long":{"description":"Longest interception return","example":5,"type":"integer"},"special_teams_assisted_tackles":{"description":"Assisted tackles made on special-teams plays (kick and punt coverage)","example":5,"type":"integer"},"time_to_throw":{"description":"Time from snap to ball release in seconds","example":12.3,"type":"number"},"player_id":{"description":"Player identifier","example":"example_value","type":"string"},"kickoff_out_of_bounds":{"description":"Kickoffs out of bounds","example":5,"type":"integer"},"pass_long":{"description":"Longest pass completion","example":5,"type":"integer"},"fanduel_fantasy_points":{"description":"FanDuel fantasy points","example":18.5,"type":"number"},"def_tackles_assisted":{"description":"Defensive assisted tackles","example":5,"type":"integer"},"punts_inside_20":{"description":"Number of punts inside the 20-yard line","example":5,"type":"integer"},"solo_tackles":{"description":"Number of solo tackles","example":5,"type":"integer"},"redzone_passing_attempts":{"description":"Pass attempts in the red zone","example":15,"type":"integer"},"poor_throws":{"description":"Number of poor throws","example":5,"type":"integer"},"opponent_fumble_recovery_touchdowns":{"description":"Touchdowns on opponent fumble recoveries","example":5,"type":"integer"},"opponent_fumble_recoveries":{"description":"Opponent fumble recoveries","example":5,"type":"integer"},"deep_pass_attempts":{"description":"Deep pass attempts","example":15,"type":"integer"},"gross_kickoff_yards":{"description":"Yards gained on gross kickoffs","example":250,"type":"integer"},"qb_knockdowns":{"description":"Times quarterback was knocked down","example":5,"type":"integer"},"passing_attempts_allowed":{"description":"Passing attempts allowed by defense","example":15,"type":"integer"},"misc_solo_tackles":{"description":"Solo tackles made on change-of-possession plays (interception and fumble returns)","example":5,"type":"integer"},"total_tackles":{"description":"Total tackles across every phase of the game -- scrimmage defense plus special teams plus change-of-possession (misc) plays. This is the quantity NFL tackle props are priced and graded on.","example":5,"type":"integer"},"deep_targets":{"description":"Number of deep targets (20+ yards)","example":5,"type":"integer"},"fumbles":{"description":"Total number of fumbles","example":5,"type":"integer"},"fourth_down_stops":{"description":"Fourth down stops recorded by defense","example":5,"type":"integer"},"rushing_two_point_conversions":{"description":"Rushing two-point conversions","example":5,"type":"integer"},"missed_or_broken_tackles":{"description":"Number of missed or broken tackles","example":5,"type":"integer"},"receiving_yards":{"description":"Total receiving yards gained","example":250,"type":"integer"},"fanduel_rating":{"description":"FanDuel player rating","example":98.7,"type":"number"},"separation_type":{"description":"Type of separation","example":"example_value","type":"string"},"pressure_type":{"description":"Pressure type","example":"example_value","type":"string"},"timeouts_used":{"description":"Number of timeouts used","example":5,"type":"integer"},"returns":{"description":"Number of return attempts (kick/punt)","example":5,"type":"integer"},"conversion_passing_attempts":{"description":"Two-point conversion passing attempts","example":15,"type":"integer"},"net_kickoff_yards":{"description":"Yards gained on net kickoffs","example":250,"type":"integer"},"receiving_targets":{"description":"Number of times targeted for a pass","example":5,"type":"integer"},"extra_points_blocked":{"description":"Number of extra points blocked","example":5,"type":"integer"},"receptions":{"description":"Number of receptions/catches","example":5,"type":"integer"},"snap_counts_confirmed":{"description":"Provider confirms the snap counts for this game are final","example":"example_value","type":"boolean"},"motion_at_snap":{"description":"Player motion status at snap","example":"example_value","type":"boolean"},"receiving_fumbles":{"description":"Number of fumbles while receiving","example":5,"type":"integer"},"explosive_runs":{"description":"Number of explosive rushing attempts (10+ yards)","example":5,"type":"integer"},"rushing_40_plus":{"description":"Rushing attempts of 40+ yards","example":5,"type":"integer"},"interceptions":{"description":"Number of interceptions thrown","example":5,"type":"integer"},"quarterback_hits":{"description":"Number of quarterback hits","example":5,"type":"integer"},"interception_return_yards":{"description":"Yards gained on interception returns","example":250,"type":"integer"},"yahoo_fantasy_points_ceiling":{"description":"Yahoo fantasy points ceiling","example":18.5,"type":"number"},"primary_coverage":{"description":"Primary coverage","example":"example_value","type":"boolean"},"secondary_coverage":{"description":"Secondary coverage","example":"example_value","type":"boolean"},"fumbles_recovered":{"description":"Number of fumbles recovered","example":5,"type":"integer"},"rushing_20_plus":{"description":"Rushing attempts of 20+ yards","example":5,"type":"integer"},"throw_away":{"description":"Whether the pass was intentionally thrown away","example":"example_value","type":"boolean"},"field_goal_percentage":{"description":"Field goal percentage (made/attempted)","example":12.3,"type":"number"},"receiving_tds":{"description":"Number of receiving touchdowns","example":2,"type":"integer"},"passes_defended":{"description":"Number of passes defended","example":5,"type":"integer"},"fumble_return_touchdowns":{"description":"Touchdowns scored on fumble returns","example":5,"type":"integer"},"completion_percentage":{"description":"Pass completion percentage","example":12.3,"type":"number"},"interception_worthy_throws":{"description":"Interception worthy throws","example":5,"type":"integer"},"red_zone_targets":{"description":"Number of targets in the red zone","example":5,"type":"integer"},"allowed_pressure":{"description":"Allowed pressure","example":"example_value","type":"boolean"},"kickoff_yards":{"description":"Total kickoff yards","example":250,"type":"integer"},"qb_hurries":{"description":"Times quarterback was hurried","example":5,"type":"integer"},"kickoff_returns":{"description":"Number of kickoff returns by opponents","example":5,"type":"integer"},"passing_two_point_conversions":{"description":"Passing two-point conversions","example":5,"type":"integer"},"first_downs":{"description":"Total first downs (used for passing first downs in SR)","example":5,"type":"integer"},"defensive_touchdowns":{"description":"Number of defensive touchdowns","example":5,"type":"integer"},"opponent_fumble_recovery_yards":{"description":"Yards gained on opponent fumble recoveries","example":250,"type":"integer"},"blocked_kick_returns":{"description":"Number of blocked kick returns","example":5,"type":"integer"},"conversion_rushing_attempts":{"description":"Two-point conversion rushing attempts","example":15,"type":"integer"},"extra_point_return_touchdowns":{"description":"Extra point attempts returned for a touchdown by the defense","example":5,"type":"integer"},"own_fumble_recoveries":{"description":"Own fumble recoveries","example":5,"type":"integer"},"punts_blocked":{"description":"Number of punts blocked","example":5,"type":"integer"},"rush_rate":{"description":"Rush rate (rushing attempts per play)","example":12.3,"type":"number"},"passing_avg_yards":{"description":"Average yards per pass attempt","example":12.3,"type":"number"},"special_teams_solo_tackles":{"description":"Solo tackles made on special-teams plays (kick and punt coverage)","example":5,"type":"integer"},"red_zone_passing_attempts":{"description":"Passing attempts in red zone","example":15,"type":"integer"},"conversion_rushing_successes":{"description":"Two-point conversion rushing successes","example":5,"type":"integer"},"dropped_passes":{"description":"Passes dropped by receivers","example":5,"type":"integer"},"passing_net_yards":{"description":"Net passing yards (gross yards minus sack yards lost)","example":250,"type":"integer"},"rushing_first_downs":{"description":"First downs gained via rushing","example":5,"type":"integer"},"passing_yards_allowed":{"description":"Passing yards allowed by defense","example":250,"type":"integer"},"tackles_for_loss_yards":{"description":"Yards lost on tackles for loss","example":250,"type":"integer"},"punt_touchbacks":{"description":"Number of punt touchbacks","example":5,"type":"integer"},"missed_tackle_cause":{"description":"Cause of missed tackle","example":"example_value","type":"string"},"missed_tackle":{"description":"Number of missed tackles","example":5,"type":"integer"},"own_fumble_recovery_touchdowns":{"description":"Touchdowns on own fumble recoveries","example":5,"type":"integer"},"auction_value":{"description":"Auction draft value","example":12.3,"type":"number"},"rushing_attempts_allowed":{"description":"Rushing attempts allowed by defense","example":15,"type":"integer"},"receiving_first_downs":{"description":"First downs gained via receiving","example":5,"type":"integer"},"fg_long":{"description":"Longest field goal made","example":5,"type":"integer"},"own_fumble_recovery_yards":{"description":"Yards gained on own fumble recoveries","example":250,"type":"integer"},"player_kickoff_return_yards":{"description":"Kickoff return yards recorded by the returning player","example":250,"type":"integer"},"timeouts_remaining":{"description":"Number of timeouts remaining","example":5,"type":"integer"},"defensive_tackles_combined":{"description":"Tackles (solo + assisted) made on scrimmage defense only, excluding special teams and change-of-possession plays","example":5,"type":"integer"},"tackles_for_loss":{"description":"Rushes resulting in tackles for loss","example":5,"type":"integer"},"rushing_attempts":{"description":"Number of rushing attempts","example":15,"type":"integer"},"games_started":{"description":"Number of games started","example":5,"type":"integer"},"rank":{"description":"Player ranking","example":5,"type":"integer"},"fielding_e":{"description":"Fielding errors","example":5,"type":"integer"},"kickoff_onside_successes":{"description":"Successful onside kicks","example":5,"type":"integer"},"scrambles":{"description":"Number of quarterback scrambles","example":5,"type":"integer"},"passing_touchdowns_allowed":{"description":"Passing touchdowns allowed by defense","example":5,"type":"integer"},"passing_tds":{"description":"Number of passing touchdowns","example":2,"type":"integer"},"spikes":{"description":"Number of spiked passes","example":5,"type":"integer"},"punt_return_attempts":{"description":"Punt return attempts","example":15,"type":"integer"},"conversion_passing_successes":{"description":"Two-point conversion passing successes","example":5,"type":"integer"},"deep_pass_completions":{"description":"Deep pass completions (20+ yards)","example":10,"type":"integer"},"forced_fumbles":{"description":"Number of fumbles forced by defender","example":5,"type":"integer"},"interception_touchdowns_thrown":{"description":"Interceptions returned for touchdowns (pick-6s)","example":5,"type":"integer"},"punt_return_touchdowns":{"description":"Punt return touchdowns","example":5,"type":"integer"},"is_out_of_pocket":{"description":"Whether quarterback left the pocket","example":"example_value","type":"boolean"},"passing_yards_300_plus":{"description":"Passing yards over 300","example":250,"type":"integer"},"kickoff_return_attempts":{"description":"Kickoff return attempts","example":15,"type":"integer"},"rushing_yards_allowed":{"description":"Rushing yards allowed by defense","example":250,"type":"integer"},"jersey":{"description":"Player jersey number","example":"example_value","type":"string"},"passing_rating":{"description":"Quarterback passer rating","example":98.7,"type":"number"},"contested_ball":{"description":"Whether the targeted receiver's pass was contested","example":"example_value","type":"boolean"},"field_goals_made":{"description":"Number of field goals made","example":5,"type":"integer"},"interception_return_average":{"description":"Average yards per interception return","example":12.3,"type":"number"},"extra_points_missed":{"description":"Extra points missed","example":5,"type":"integer"},"yahoo_fantasy_points":{"description":"Yahoo fantasy points","example":18.5,"type":"number"},"defensive_snap_count":{"description":"Number of defensive snaps played","example":5,"type":"integer"},"endzone_fumble_recovery_touchdowns":{"description":"Touchdowns from end zone fumble recoveries","example":5,"type":"integer"},"rushing_touchdowns_allowed":{"description":"Rushing touchdowns allowed by defense","example":5,"type":"integer"},"return_tds":{"description":"Number of return touchdowns","example":2,"type":"integer"},"kickoff_endzone":{"description":"Kickoffs reaching the end zone","example":5,"type":"integer"},"snap_count":{"description":"Number of offensive snaps played","example":5,"type":"integer"},"def_sack_yards":{"description":"Defensive sack yards","example":250,"type":"integer"},"batted_pass":{"description":"Number of passes batted down by defense","example":5,"type":"integer"},"route_type":{"description":"Type of route run by receiver","example":"example_value","type":"string"},"receiving_40_plus":{"description":"Receptions of 40+ yards","example":5,"type":"integer"},"passing_tds_40_plus_yards":{"description":"Passing touchdowns of 40+ yards","example":250,"type":"integer"},"fumbles_out_of_bounds":{"description":"Number of fumbles that went out of bounds","example":5,"type":"integer"},"deep_pass_receptions":{"description":"Deep pass receptions","example":5,"type":"integer"},"fumbles_lost":{"description":"Number of fumbles lost to opponent","example":5,"type":"integer"},"fumble_long":{"description":"Longest fumble return","example":5,"type":"integer"},"punt_fair_catch":{"description":"Number of punt fair catches","example":5,"type":"integer"},"is_successful_play":{"description":"Whether the play was successful","example":"example_value","type":"boolean"},"total":{"description":"Over/under total for betting","example":12.3,"type":"number"},"applied_pressure":{"description":"Applied pressure","example":"example_value","type":"boolean"},"rushing_tds":{"description":"Number of rushing touchdowns","example":2,"type":"integer"},"passing_air_yards":{"description":"Total air yards on pass attempts","example":250,"type":"integer"},"punt_average":{"description":"Average yards per punt","example":12.3,"type":"number"},"field_goals_blocked":{"description":"Number of field goals blocked","example":5,"type":"integer"},"created_reception":{"description":"Whether the receiver created the reception through an exceptional play","example":"example_value","type":"boolean"},"shotgun":{"description":"Plays run from shotgun formation","example":5,"type":"integer"},"kickoff_attempts":{"description":"Total kickoff attempts","example":15,"type":"integer"},"yards_after_contact":{"description":"Yards gained after contact","example":250,"type":"integer"},"kickoff_onside_attempts":{"description":"Onside kick attempts","example":15,"type":"integer"},"receiving_tds_40_plus_yards":{"description":"Receiving touchdowns of 40+ yards","example":250,"type":"integer"},"catchable_ball":{"description":"Whether the targeted receiver's pass was catchable","example":"example_value","type":"boolean"},"passing_longest_touchdown":{"description":"Longest touchdown pass","example":5,"type":"integer"},"separation_yards":{"description":"Separation distance in yards from defender","example":12.3,"type":"number"},"spread":{"description":"Point spread for betting","example":12.3,"type":"number"},"draftkings_ownership":{"description":"DraftKings ownership percentage","example":12.3,"type":"number"},"conversion_receiving_successes":{"description":"Two-point conversion receiving successes","example":5,"type":"integer"},"extra_points_made":{"description":"Number of extra points made","example":5,"type":"integer"},"blocked_kick_return_yards":{"description":"Yards gained on blocked kick returns","example":250,"type":"integer"},"passing_completions_allowed":{"description":"Passing completions allowed by defense","example":10,"type":"integer"},"interception_return_touchdowns":{"description":"Touchdowns scored on interception returns","example":5,"type":"integer"},"successful_rush_attempts":{"description":"Number of successful rushing attempts","example":15,"type":"integer"},"passing_20_plus":{"description":"Passing completions of 20+ yards","example":5,"type":"integer"},"broken_tackles":{"description":"Number of broken tackles","example":5,"type":"integer"},"conversion_receiving_attempts":{"description":"Two-point conversion receiving attempts","example":15,"type":"integer"},"deep_receptions":{"description":"Deep receptions (20+ yards)","example":5,"type":"integer"},"misc_assisted_tackles":{"description":"Assisted tackles made on change-of-possession plays (interception and fumble returns)","example":5,"type":"integer"},"rushing_yards_100_plus":{"description":"Number of 100+ yard rushing games","example":250,"type":"integer"},"draftkings_fantasy_points":{"description":"DraftKings fantasy points","example":18.5,"type":"number"},"challenges_used":{"description":"Number of challenges used","example":5,"type":"integer"},"blitzes_faced":{"description":"Number of blitzes faced","example":5,"type":"integer"},"punt_attempts":{"description":"Number of punt attempts","example":15,"type":"integer"},"penalty_first_downs":{"description":"First downs gained via opponent penalties","example":5,"type":"integer"},"declared_inactive":{"description":"Player was on the officially declared inactive list for this game","example":"example_value","type":"boolean"},"kneels":{"description":"Number of quarterback kneels","example":5,"type":"integer"},"fantasy_points_half_ppr":{"description":"Fantasy points in half-PPR scoring","example":18.5,"type":"number"}},"type":"object"},"for_entity_id":{"description":"Common model ID of the player or team these stats belong to","type":"string"},"for_entity_type":{"description":"Type of entity: 'player' for individual athletes, 'team' for team aggregations","type":"string"},"inserted_at":{"description":"Timestamp when this statistics record was first created","format":"date-time","type":"string"},"is_projection":{"description":"true for forecasted/projected stats, false for actual recorded performance","type":"boolean"},"league_id":{"description":"League/competition context for the statistics","type":"string"},"season_stage":{"description":"Stage of the season (e.g., 'REG', 'PRE', 'POST', 'IST', 'PIT', 'SC', 'EX', 'CC', 'CT', 'ALL_STAR')","type":"string"},"season_year":{"description":"Calendar year the season primarily occurs in (e.g., 2024 for 2024-25 NBA season)","type":"integer"},"source":{"description":"Data provider or calculation method (e.g., 'calculated')","type":"string"},"team_id":{"description":"Common model ID of the team (set for player season stats)","format":"uuid","type":"string"},"updated_at":{"description":"Timestamp of the most recent update to these statistics","format":"date-time","type":"string"}},"title":"SeasonScopedStats","type":"object"},"EventScopedStats":{"description":"Performance statistics for players and teams within a specific event.\n\nContains both actual game results and projected/fantasy statistics from various data providers.\nFor comprehensive sport-specific stat definitions, see the EventScopedStats model documentation.\n\n## Core Concepts\n- **Entity Types**: \"player\" (individual stats) or \"team\" (team-level stats)\n- **Data Sources**: official feeds and projection providers (see `source`)\n- **Projections vs Actuals**: is_projection distinguishes forecasts from results\n- **Sport Variation**: data field contains sport/league-specific statistics\n\n## Sample Stats by Sport\n- **Football**: passing_yards, rushing_touchdowns, receptions, sacks, field_goals_made\n- **Basketball**: points, rebounds, assists, field_goals_made, three_pointers_made\n- **Baseball**: hits, home_runs, rbis, strikeouts, earned_run_average, saves\n- **Hockey**: goals, assists, shots, penalty_minutes, save_percentage, wins\n- **Golf**: score, position, money_earned, eagles, birdies, made_cut\n","example":{"common_model_id":"49306211-7b48-4b5e-88e9-a4190189dbea","data":{"completion_percentage":68.2,"interceptions":0.8,"passing_touchdowns":2.1,"passing_yards":285.5,"rushing_yards":22.3},"event_id":"a96af633-aee6-48a0-bf72-0865a4419772","for_entity_id":"59291391-0c7e-442b-9496-33074647384e","for_entity_type":"player","inserted_at":"2024-08-26T22:03:16-04:00","is_projection":true,"scheduled_start_time":"2024-11-17T13:00:00Z","season_year":2024,"source":"ftn","team_id":"b3f7a1c2-9d4e-4f8a-b5c6-1a2b3c4d5e6f","updated_at":"2024-08-26T22:03:16-04:00","week":12},"properties":{"common_model_id":{"description":"EventScopedStats ID","format":"uuid","type":"string"},"data":{"additionalProperties":false,"description":"Sport and position-specific performance statistics with canonical field names.\n\n## Standardized Stat Names\nAll statistics use our unified canonical naming system to ensure consistency across data providers.\nFor example, passing yards from two different providers (\"pass_yds\" and \"py\") both map to \"passing_yards\".\n\n## Current Football Stats (Auto-Generated)\nThis schema is automatically synchronized with our stat registry to include:\n- **Passing**: passing_yards, passing_attempts, passing_completions, passing_tds, interceptions, sacks, deep_pass_completions, pass_long, interception_worthy_throws, pass_first_downs, passing_yards_300_plus, passing_tds_40_plus_yards, deep_pass_attempts, depth_of_target, spikes, passing_rating, completion_percentage, passing_avg_yards, passing_air_yards, passing_net_yards, passing_gross_yards, redzone_passing_attempts, passing_longest_touchdown, on_target_throws, poor_throws, defended_passes, dropped_passes, batted_passes, qb_hurries, qb_knockdowns, avg_pocket_time, total_pocket_time, blitzes_faced, throwaways, spikes, interception_touchdowns_thrown, sacks_taken, sack_yards_lost, passing_20_plus, passing_40_plus, time_to_throw, throw_away, is_out_of_pocket, passing_two_point_conversions\n- **Rushing**: rushing_yards, rushing_attempts, rushing_tds, successful_rush_attempts, explosive_runs, rush_rate, rush_long, goal_line_touches, rushing_first_downs, rushing_yards_100_plus, rushing_tds_40_plus_yards, rushing_direction, kneels, rushing_fumbles, rushing_20_plus, rushing_40_plus, rushing_avg_yards, rushing_longest_touchdown, redzone_rushing_attempts, broken_tackles, yards_after_contact, kneel_downs, scrambles, tackles_for_loss, tackles_for_loss_yards, rushing_two_point_conversions\n- **Receiving**: receiving_yards, receptions, receiving_targets, receiving_tds, dropped_pass, first_read_targets, first_read_receptions, contested_ball, catchable_ball, created_reception, deep_targets, deep_receptions, rec_long, cushion_yards, receiving_first_downs, receiving_yards_100_plus, receiving_tds_40_plus_yards, deep_pass_receptions, receiving_20_plus, receiving_40_plus, receiving_fumbles, separation_yards, separation_type, yards_after_catch, route_type, receiving_two_point_conversions\n- **Defense**: fumbles, forced_fumbles, fumbles_recovered, assisted_tackles, solo_tackles, total_tackles, defensive_tackles_combined, special_teams_solo_tackles, special_teams_assisted_tackles, misc_solo_tackles, misc_assisted_tackles, passes_defended, safeties, blocked_kicks, defensive_touchdowns, tackles, def_sack_yards, def_tackles_assisted, def_interception_touchdowns, def_interception_yards, defensive_interceptions, tackles_for_loss, tackles_for_loss_yards, quarterback_hits, fumble_return_yards, fumble_return_touchdowns, interception_return_yards, interception_return_touchdowns, interception_long, interception_return_average, interception_returns, interception_return_longest_touchdown, fumble_long, missed_tackle, missed_tackle_cause, missed_or_broken_tackles, missed_tackle_location, batted_pass, passing_attempts_allowed, passing_completions_allowed, passing_yards_allowed, rushing_attempts_allowed, rushing_yards_allowed, passing_touchdowns_allowed, rushing_touchdowns_allowed, fourth_down_stops, extra_point_return_touchdowns\n- **Kicking**: field_goals_made, field_goals_attempts, field_goal_yards, field_goal_percentage, fg_long, extra_points_made, extra_points_attempted, extra_points_blocked, field_goals_blocked, field_goals_missed, extra_points_missed\n- **Fantasy**: fantasy_points_half_ppr, nfl_fantasy_points, draftkings_fantasy_points, fanduel_fantasy_points, rank, yahoo_fantasy_points, fanduel_fantasy_points_ceiling, draftkings_fantasy_points_ceiling, yahoo_fantasy_points_ceiling, draftkings_ownership, fanduel_ownership, fanduel_rating, draftkings_rating\n\n## Provider Mapping\nOur system automatically translates provider-specific stat names to these canonical names:\n- **Provider A**: \"pass_yds\" → \"passing_yards\"\n- **Provider B**: \"py\" → \"passing_yards\"\n- **Provider C**: \"pass_yd\" → \"passing_yards\"\n\nSee the complete stat registry documentation for all supported stats and provider mappings.\n","example":{"fantasy_points_half_ppr":18.5,"passing_attempts":35,"passing_completions":22,"passing_tds":2,"passing_yards":250,"receiving_tds":1,"receiving_yards":95,"receptions":6,"rushing_attempts":18,"rushing_tds":1,"rushing_yards":85},"properties":{"def_interception_touchdowns":{"description":"Defensive interception touchdowns","example":5,"type":"integer"},"throwaways":{"description":"Number of throw away passes","example":5,"type":"integer"},"fanduel_fantasy_points_ceiling":{"description":"FanDuel fantasy points ceiling","example":18.5,"type":"number"},"on_target_throws":{"description":"Number of on-target throws","example":5,"type":"integer"},"interception_returns":{"description":"Number of interception returns","example":5,"type":"integer"},"kickoff_return_touchdowns":{"description":"Kickoff return touchdowns","example":5,"type":"integer"},"extra_points_attempted":{"description":"Number of extra point attempts","example":5,"type":"integer"},"redzone_rushing_attempts":{"description":"Rush attempts in the red zone","example":15,"type":"integer"},"is_motion":{"description":"Whether player was in motion during play","example":"example_value","type":"boolean"},"passing_attempts":{"description":"Total number of pass attempts","example":15,"type":"integer"},"punt_long":{"description":"Longest punt","example":5,"type":"integer"},"fumble_return_yards":{"description":"Yards gained on fumble returns","example":250,"type":"integer"},"first_read_receptions":{"description":"Number of first read receptions","example":5,"type":"integer"},"red_zone_pass_attempts":{"description":"Pass attempts in red zone","example":15,"type":"integer"},"points":{"description":"Total points scored by team","example":5,"type":"integer"},"depth_of_target":{"description":"Average depth of target","example":12.3,"type":"number"},"defensive_interceptions":{"description":"Defensive interceptions","example":5,"type":"integer"},"receiving_two_point_conversions":{"description":"Receiving two-point conversions","example":5,"type":"integer"},"field_goal_yards":{"description":"Yards gained on field goals","example":250,"type":"integer"},"conversion_defense_successes":{"description":"Two-point conversion defensive successes","example":5,"type":"integer"},"blocked_kick_return_touchdowns":{"description":"Touchdowns scored on blocked kick returns","example":5,"type":"integer"},"fanduel_ownership":{"description":"FanDuel ownership percentage","example":12.3,"type":"number"},"draftkings_fantasy_points_ceiling":{"description":"DraftKings fantasy points ceiling","example":18.5,"type":"number"},"first_read_targets":{"description":"Number of first read targets","example":5,"type":"integer"},"special_teams_snap_count":{"description":"Number of special teams snaps played","example":5,"type":"integer"},"out_of_pocket_reason":{"description":"Reason quarterback left the pocket","example":"example_value","type":"string"},"goal_line_touches":{"description":"Number of goal line touches","example":5,"type":"integer"},"receiving_yards_100_plus":{"description":"Number of 100+ yard receiving games","example":250,"type":"integer"},"total_pocket_time":{"description":"Total time spent in pocket","example":12.3,"type":"number"},"interception_return_longest_touchdown":{"description":"Longest interception return for touchdown","example":5,"type":"integer"},"field_goals_attempts":{"description":"Number of field goal attempts","example":15,"type":"integer"},"safeties":{"description":"Number of safeties","example":5,"type":"integer"},"pass_first_downs":{"description":"First downs gained via passing","example":5,"type":"integer"},"red_zone_passing_completions":{"description":"Passing completions in red zone","example":10,"type":"integer"},"net_punt_yards":{"description":"Net punt yards","example":250,"type":"integer"},"kneel_downs":{"description":"Number of kneel downs","example":5,"type":"integer"},"cushion_yards":{"description":"Cushion yards","example":250,"type":"integer"},"punt_yards":{"description":"Total punt yards","example":250,"type":"integer"},"challenges_remaining":{"description":"Number of challenges remaining","example":5,"type":"integer"},"passing_gross_yards":{"description":"Gross passing yards before sacks","example":250,"type":"integer"},"avg_pocket_time":{"description":"Average time in pocket per pass attempt","example":12.3,"type":"number"},"defended_passes":{"description":"Passes defended by defenders","example":5,"type":"integer"},"dropped_pass":{"description":"Number of dropped passes","example":5,"type":"integer"},"rushing_direction":{"description":"Direction of rushing attempt","example":"example_value","type":"string"},"sacks_taken":{"description":"Number of sacks taken by quarterback","example":5,"type":"integer"},"rec_long":{"description":"Longest reception","example":5,"type":"integer"},"yards_after_catch":{"description":"Yards gained after catch","example":250,"type":"integer"},"activated":{"description":"Player was activated to the game-day roster (shipped as 0/1)","example":5,"type":"integer"},"passing_yards":{"description":"Total passing yards thrown by the player/team","example":250,"type":"integer"},"touchdowns":{"description":"Total touchdowns scored","example":5,"type":"integer"},"rushing_fumbles":{"description":"Number of fumbles while rushing","example":5,"type":"integer"},"pre_snap_motion":{"description":"Player pre-snap motion type","example":"example_value","type":"boolean"},"nfl_fantasy_points":{"description":"NFL fantasy points","example":18.5,"type":"number"},"assisted_tackles":{"description":"Number of assisted tackles","example":5,"type":"integer"},"passing_completions":{"description":"Number of completed passes","example":10,"type":"integer"},"sacks":{"description":"Number of sacks (as QB or defensive player)","example":12.3,"type":"number"},"passing_40_plus":{"description":"Passing completions of 40+ yards","example":5,"type":"integer"},"missed_tackle_location":{"description":"Location of missed tackle","example":"example_value","type":"string"},"rushing_longest_touchdown":{"description":"Longest touchdown rush","example":5,"type":"integer"},"penalty_yards":{"description":"Penalty yards assessed","example":250,"type":"integer"},"rushing_tds_40_plus_yards":{"description":"Rushing touchdowns of 40+ yards","example":250,"type":"integer"},"penalties":{"description":"Number of penalties committed","example":5,"type":"integer"},"rushing_yards":{"description":"Total rushing yards gained","example":250,"type":"integer"},"punt_return_yards":{"description":"Punt return yards","example":250,"type":"integer"},"blocked_kicks":{"description":"Number of blocked kicks","example":5,"type":"integer"},"position":{"description":"Player position","example":"example_value","type":"string"},"sack_yards_lost":{"description":"Yards lost on sacks","example":250,"type":"integer"},"kickoff_touchbacks":{"description":"Number of kickoff touchbacks","example":5,"type":"integer"},"def_interception_yards":{"description":"Defensive interception return yards","example":250,"type":"integer"},"rush_long":{"description":"Longest rush","example":5,"type":"integer"},"played":{"description":"Whether the player appeared in the game","example":"example_value","type":"boolean"},"two_point_conversions":{"description":"Number of two-point conversions","example":5,"type":"integer"},"conversion_defense_attempts":{"description":"Two-point conversion defensive attempts","example":15,"type":"integer"},"tackles":{"description":"Total tackles (solo + assisted)","example":5,"type":"integer"},"return_yards":{"description":"Total return yards (kick/punt combined)","example":250,"type":"integer"},"kickoff_return_yards":{"description":"Total yards on kickoff returns (opponent)","example":250,"type":"integer"},"games_played":{"description":"Number of games played in","example":5,"type":"integer"},"receiving_20_plus":{"description":"Receptions of 20+ yards","example":5,"type":"integer"},"field_goals_missed":{"description":"Field goals missed","example":5,"type":"integer"},"draftkings_rating":{"description":"DraftKings player rating","example":98.7,"type":"number"},"pre_snap_alignment":{"description":"Player pre-snap alignment","example":"example_value","type":"string"},"kickoff_inside_20":{"description":"Kickoffs downed inside the 20 yard line","example":5,"type":"integer"},"batted_passes":{"description":"Passes batted down at line of scrimmage","example":5,"type":"integer"},"rushing_avg_yards":{"description":"Average yards per carry","example":12.3,"type":"number"},"interception_long":{"description":"Longest interception return","example":5,"type":"integer"},"special_teams_assisted_tackles":{"description":"Assisted tackles made on special-teams plays (kick and punt coverage)","example":5,"type":"integer"},"time_to_throw":{"description":"Time from snap to ball release in seconds","example":12.3,"type":"number"},"player_id":{"description":"Player identifier","example":"example_value","type":"string"},"kickoff_out_of_bounds":{"description":"Kickoffs out of bounds","example":5,"type":"integer"},"pass_long":{"description":"Longest pass completion","example":5,"type":"integer"},"fanduel_fantasy_points":{"description":"FanDuel fantasy points","example":18.5,"type":"number"},"def_tackles_assisted":{"description":"Defensive assisted tackles","example":5,"type":"integer"},"punts_inside_20":{"description":"Number of punts inside the 20-yard line","example":5,"type":"integer"},"solo_tackles":{"description":"Number of solo tackles","example":5,"type":"integer"},"redzone_passing_attempts":{"description":"Pass attempts in the red zone","example":15,"type":"integer"},"poor_throws":{"description":"Number of poor throws","example":5,"type":"integer"},"opponent_fumble_recovery_touchdowns":{"description":"Touchdowns on opponent fumble recoveries","example":5,"type":"integer"},"opponent_fumble_recoveries":{"description":"Opponent fumble recoveries","example":5,"type":"integer"},"deep_pass_attempts":{"description":"Deep pass attempts","example":15,"type":"integer"},"gross_kickoff_yards":{"description":"Yards gained on gross kickoffs","example":250,"type":"integer"},"qb_knockdowns":{"description":"Times quarterback was knocked down","example":5,"type":"integer"},"passing_attempts_allowed":{"description":"Passing attempts allowed by defense","example":15,"type":"integer"},"misc_solo_tackles":{"description":"Solo tackles made on change-of-possession plays (interception and fumble returns)","example":5,"type":"integer"},"total_tackles":{"description":"Total tackles across every phase of the game -- scrimmage defense plus special teams plus change-of-possession (misc) plays. This is the quantity NFL tackle props are priced and graded on.","example":5,"type":"integer"},"deep_targets":{"description":"Number of deep targets (20+ yards)","example":5,"type":"integer"},"fumbles":{"description":"Total number of fumbles","example":5,"type":"integer"},"fourth_down_stops":{"description":"Fourth down stops recorded by defense","example":5,"type":"integer"},"rushing_two_point_conversions":{"description":"Rushing two-point conversions","example":5,"type":"integer"},"missed_or_broken_tackles":{"description":"Number of missed or broken tackles","example":5,"type":"integer"},"receiving_yards":{"description":"Total receiving yards gained","example":250,"type":"integer"},"fanduel_rating":{"description":"FanDuel player rating","example":98.7,"type":"number"},"separation_type":{"description":"Type of separation","example":"example_value","type":"string"},"pressure_type":{"description":"Pressure type","example":"example_value","type":"string"},"timeouts_used":{"description":"Number of timeouts used","example":5,"type":"integer"},"returns":{"description":"Number of return attempts (kick/punt)","example":5,"type":"integer"},"conversion_passing_attempts":{"description":"Two-point conversion passing attempts","example":15,"type":"integer"},"net_kickoff_yards":{"description":"Yards gained on net kickoffs","example":250,"type":"integer"},"receiving_targets":{"description":"Number of times targeted for a pass","example":5,"type":"integer"},"extra_points_blocked":{"description":"Number of extra points blocked","example":5,"type":"integer"},"receptions":{"description":"Number of receptions/catches","example":5,"type":"integer"},"snap_counts_confirmed":{"description":"Provider confirms the snap counts for this game are final","example":"example_value","type":"boolean"},"motion_at_snap":{"description":"Player motion status at snap","example":"example_value","type":"boolean"},"receiving_fumbles":{"description":"Number of fumbles while receiving","example":5,"type":"integer"},"explosive_runs":{"description":"Number of explosive rushing attempts (10+ yards)","example":5,"type":"integer"},"rushing_40_plus":{"description":"Rushing attempts of 40+ yards","example":5,"type":"integer"},"interceptions":{"description":"Number of interceptions thrown","example":5,"type":"integer"},"quarterback_hits":{"description":"Number of quarterback hits","example":5,"type":"integer"},"interception_return_yards":{"description":"Yards gained on interception returns","example":250,"type":"integer"},"yahoo_fantasy_points_ceiling":{"description":"Yahoo fantasy points ceiling","example":18.5,"type":"number"},"primary_coverage":{"description":"Primary coverage","example":"example_value","type":"boolean"},"secondary_coverage":{"description":"Secondary coverage","example":"example_value","type":"boolean"},"fumbles_recovered":{"description":"Number of fumbles recovered","example":5,"type":"integer"},"rushing_20_plus":{"description":"Rushing attempts of 20+ yards","example":5,"type":"integer"},"throw_away":{"description":"Whether the pass was intentionally thrown away","example":"example_value","type":"boolean"},"field_goal_percentage":{"description":"Field goal percentage (made/attempted)","example":12.3,"type":"number"},"receiving_tds":{"description":"Number of receiving touchdowns","example":2,"type":"integer"},"passes_defended":{"description":"Number of passes defended","example":5,"type":"integer"},"fumble_return_touchdowns":{"description":"Touchdowns scored on fumble returns","example":5,"type":"integer"},"completion_percentage":{"description":"Pass completion percentage","example":12.3,"type":"number"},"interception_worthy_throws":{"description":"Interception worthy throws","example":5,"type":"integer"},"red_zone_targets":{"description":"Number of targets in the red zone","example":5,"type":"integer"},"allowed_pressure":{"description":"Allowed pressure","example":"example_value","type":"boolean"},"kickoff_yards":{"description":"Total kickoff yards","example":250,"type":"integer"},"qb_hurries":{"description":"Times quarterback was hurried","example":5,"type":"integer"},"kickoff_returns":{"description":"Number of kickoff returns by opponents","example":5,"type":"integer"},"passing_two_point_conversions":{"description":"Passing two-point conversions","example":5,"type":"integer"},"first_downs":{"description":"Total first downs (used for passing first downs in SR)","example":5,"type":"integer"},"defensive_touchdowns":{"description":"Number of defensive touchdowns","example":5,"type":"integer"},"opponent_fumble_recovery_yards":{"description":"Yards gained on opponent fumble recoveries","example":250,"type":"integer"},"blocked_kick_returns":{"description":"Number of blocked kick returns","example":5,"type":"integer"},"conversion_rushing_attempts":{"description":"Two-point conversion rushing attempts","example":15,"type":"integer"},"extra_point_return_touchdowns":{"description":"Extra point attempts returned for a touchdown by the defense","example":5,"type":"integer"},"own_fumble_recoveries":{"description":"Own fumble recoveries","example":5,"type":"integer"},"punts_blocked":{"description":"Number of punts blocked","example":5,"type":"integer"},"rush_rate":{"description":"Rush rate (rushing attempts per play)","example":12.3,"type":"number"},"passing_avg_yards":{"description":"Average yards per pass attempt","example":12.3,"type":"number"},"special_teams_solo_tackles":{"description":"Solo tackles made on special-teams plays (kick and punt coverage)","example":5,"type":"integer"},"red_zone_passing_attempts":{"description":"Passing attempts in red zone","example":15,"type":"integer"},"conversion_rushing_successes":{"description":"Two-point conversion rushing successes","example":5,"type":"integer"},"dropped_passes":{"description":"Passes dropped by receivers","example":5,"type":"integer"},"passing_net_yards":{"description":"Net passing yards (gross yards minus sack yards lost)","example":250,"type":"integer"},"rushing_first_downs":{"description":"First downs gained via rushing","example":5,"type":"integer"},"passing_yards_allowed":{"description":"Passing yards allowed by defense","example":250,"type":"integer"},"tackles_for_loss_yards":{"description":"Yards lost on tackles for loss","example":250,"type":"integer"},"punt_touchbacks":{"description":"Number of punt touchbacks","example":5,"type":"integer"},"missed_tackle_cause":{"description":"Cause of missed tackle","example":"example_value","type":"string"},"missed_tackle":{"description":"Number of missed tackles","example":5,"type":"integer"},"own_fumble_recovery_touchdowns":{"description":"Touchdowns on own fumble recoveries","example":5,"type":"integer"},"auction_value":{"description":"Auction draft value","example":12.3,"type":"number"},"rushing_attempts_allowed":{"description":"Rushing attempts allowed by defense","example":15,"type":"integer"},"receiving_first_downs":{"description":"First downs gained via receiving","example":5,"type":"integer"},"fg_long":{"description":"Longest field goal made","example":5,"type":"integer"},"own_fumble_recovery_yards":{"description":"Yards gained on own fumble recoveries","example":250,"type":"integer"},"player_kickoff_return_yards":{"description":"Kickoff return yards recorded by the returning player","example":250,"type":"integer"},"timeouts_remaining":{"description":"Number of timeouts remaining","example":5,"type":"integer"},"defensive_tackles_combined":{"description":"Tackles (solo + assisted) made on scrimmage defense only, excluding special teams and change-of-possession plays","example":5,"type":"integer"},"tackles_for_loss":{"description":"Rushes resulting in tackles for loss","example":5,"type":"integer"},"rushing_attempts":{"description":"Number of rushing attempts","example":15,"type":"integer"},"games_started":{"description":"Number of games started","example":5,"type":"integer"},"rank":{"description":"Player ranking","example":5,"type":"integer"},"fielding_e":{"description":"Fielding errors","example":5,"type":"integer"},"kickoff_onside_successes":{"description":"Successful onside kicks","example":5,"type":"integer"},"scrambles":{"description":"Number of quarterback scrambles","example":5,"type":"integer"},"passing_touchdowns_allowed":{"description":"Passing touchdowns allowed by defense","example":5,"type":"integer"},"passing_tds":{"description":"Number of passing touchdowns","example":2,"type":"integer"},"spikes":{"description":"Number of spiked passes","example":5,"type":"integer"},"punt_return_attempts":{"description":"Punt return attempts","example":15,"type":"integer"},"conversion_passing_successes":{"description":"Two-point conversion passing successes","example":5,"type":"integer"},"deep_pass_completions":{"description":"Deep pass completions (20+ yards)","example":10,"type":"integer"},"forced_fumbles":{"description":"Number of fumbles forced by defender","example":5,"type":"integer"},"interception_touchdowns_thrown":{"description":"Interceptions returned for touchdowns (pick-6s)","example":5,"type":"integer"},"punt_return_touchdowns":{"description":"Punt return touchdowns","example":5,"type":"integer"},"is_out_of_pocket":{"description":"Whether quarterback left the pocket","example":"example_value","type":"boolean"},"passing_yards_300_plus":{"description":"Passing yards over 300","example":250,"type":"integer"},"kickoff_return_attempts":{"description":"Kickoff return attempts","example":15,"type":"integer"},"rushing_yards_allowed":{"description":"Rushing yards allowed by defense","example":250,"type":"integer"},"jersey":{"description":"Player jersey number","example":"example_value","type":"string"},"passing_rating":{"description":"Quarterback passer rating","example":98.7,"type":"number"},"contested_ball":{"description":"Whether the targeted receiver's pass was contested","example":"example_value","type":"boolean"},"field_goals_made":{"description":"Number of field goals made","example":5,"type":"integer"},"interception_return_average":{"description":"Average yards per interception return","example":12.3,"type":"number"},"extra_points_missed":{"description":"Extra points missed","example":5,"type":"integer"},"yahoo_fantasy_points":{"description":"Yahoo fantasy points","example":18.5,"type":"number"},"defensive_snap_count":{"description":"Number of defensive snaps played","example":5,"type":"integer"},"endzone_fumble_recovery_touchdowns":{"description":"Touchdowns from end zone fumble recoveries","example":5,"type":"integer"},"rushing_touchdowns_allowed":{"description":"Rushing touchdowns allowed by defense","example":5,"type":"integer"},"return_tds":{"description":"Number of return touchdowns","example":2,"type":"integer"},"kickoff_endzone":{"description":"Kickoffs reaching the end zone","example":5,"type":"integer"},"snap_count":{"description":"Number of offensive snaps played","example":5,"type":"integer"},"def_sack_yards":{"description":"Defensive sack yards","example":250,"type":"integer"},"batted_pass":{"description":"Number of passes batted down by defense","example":5,"type":"integer"},"route_type":{"description":"Type of route run by receiver","example":"example_value","type":"string"},"receiving_40_plus":{"description":"Receptions of 40+ yards","example":5,"type":"integer"},"passing_tds_40_plus_yards":{"description":"Passing touchdowns of 40+ yards","example":250,"type":"integer"},"fumbles_out_of_bounds":{"description":"Number of fumbles that went out of bounds","example":5,"type":"integer"},"deep_pass_receptions":{"description":"Deep pass receptions","example":5,"type":"integer"},"fumbles_lost":{"description":"Number of fumbles lost to opponent","example":5,"type":"integer"},"fumble_long":{"description":"Longest fumble return","example":5,"type":"integer"},"punt_fair_catch":{"description":"Number of punt fair catches","example":5,"type":"integer"},"is_successful_play":{"description":"Whether the play was successful","example":"example_value","type":"boolean"},"total":{"description":"Over/under total for betting","example":12.3,"type":"number"},"applied_pressure":{"description":"Applied pressure","example":"example_value","type":"boolean"},"rushing_tds":{"description":"Number of rushing touchdowns","example":2,"type":"integer"},"passing_air_yards":{"description":"Total air yards on pass attempts","example":250,"type":"integer"},"punt_average":{"description":"Average yards per punt","example":12.3,"type":"number"},"field_goals_blocked":{"description":"Number of field goals blocked","example":5,"type":"integer"},"created_reception":{"description":"Whether the receiver created the reception through an exceptional play","example":"example_value","type":"boolean"},"shotgun":{"description":"Plays run from shotgun formation","example":5,"type":"integer"},"kickoff_attempts":{"description":"Total kickoff attempts","example":15,"type":"integer"},"yards_after_contact":{"description":"Yards gained after contact","example":250,"type":"integer"},"kickoff_onside_attempts":{"description":"Onside kick attempts","example":15,"type":"integer"},"receiving_tds_40_plus_yards":{"description":"Receiving touchdowns of 40+ yards","example":250,"type":"integer"},"catchable_ball":{"description":"Whether the targeted receiver's pass was catchable","example":"example_value","type":"boolean"},"passing_longest_touchdown":{"description":"Longest touchdown pass","example":5,"type":"integer"},"separation_yards":{"description":"Separation distance in yards from defender","example":12.3,"type":"number"},"spread":{"description":"Point spread for betting","example":12.3,"type":"number"},"draftkings_ownership":{"description":"DraftKings ownership percentage","example":12.3,"type":"number"},"conversion_receiving_successes":{"description":"Two-point conversion receiving successes","example":5,"type":"integer"},"extra_points_made":{"description":"Number of extra points made","example":5,"type":"integer"},"blocked_kick_return_yards":{"description":"Yards gained on blocked kick returns","example":250,"type":"integer"},"passing_completions_allowed":{"description":"Passing completions allowed by defense","example":10,"type":"integer"},"interception_return_touchdowns":{"description":"Touchdowns scored on interception returns","example":5,"type":"integer"},"successful_rush_attempts":{"description":"Number of successful rushing attempts","example":15,"type":"integer"},"passing_20_plus":{"description":"Passing completions of 20+ yards","example":5,"type":"integer"},"broken_tackles":{"description":"Number of broken tackles","example":5,"type":"integer"},"conversion_receiving_attempts":{"description":"Two-point conversion receiving attempts","example":15,"type":"integer"},"deep_receptions":{"description":"Deep receptions (20+ yards)","example":5,"type":"integer"},"misc_assisted_tackles":{"description":"Assisted tackles made on change-of-possession plays (interception and fumble returns)","example":5,"type":"integer"},"rushing_yards_100_plus":{"description":"Number of 100+ yard rushing games","example":250,"type":"integer"},"draftkings_fantasy_points":{"description":"DraftKings fantasy points","example":18.5,"type":"number"},"challenges_used":{"description":"Number of challenges used","example":5,"type":"integer"},"blitzes_faced":{"description":"Number of blitzes faced","example":5,"type":"integer"},"punt_attempts":{"description":"Number of punt attempts","example":15,"type":"integer"},"penalty_first_downs":{"description":"First downs gained via opponent penalties","example":5,"type":"integer"},"declared_inactive":{"description":"Player was on the officially declared inactive list for this game","example":"example_value","type":"boolean"},"kneels":{"description":"Number of quarterback kneels","example":5,"type":"integer"},"fantasy_points_half_ppr":{"description":"Fantasy points in half-PPR scoring","example":18.5,"type":"number"}},"type":"object"},"event_id":{"description":"Common model ID of the event","example":"a96af633-aee6-48a0-bf72-0865a4419772","format":"uuid","type":"string"},"for_entity_id":{"description":"Common model ID of the entity (player or team)","example":"59291391-0c7e-442b-9496-33074647384e","format":"uuid","type":"string"},"for_entity_type":{"description":"Type of entity the stats belong to","enum":["player","team"],"example":"player","type":"string"},"inserted_at":{"description":"Creation timestamp","format":"date-time","type":"string"},"is_projection":{"description":"true = projected/forecasted stats, false = actual game results","example":true,"type":"boolean"},"scheduled_start_time":{"description":"Event scheduled start time","example":"2024-11-17T13:00:00Z","format":"date-time","type":"string"},"season_year":{"description":"Season year","example":2024,"type":"integer"},"source":{"description":"Data provider/source of the statistics","enum":["sportradar","ftn","espn","fantasylabs","awesemo"],"example":"ftn","type":"string"},"superseded_from_id":{"description":"Originally requested SportsStack ID when this response was resolved through a superseded identity. Omitted for canonical lookups.","format":"uuid","nullable":true,"type":"string"},"team_id":{"description":"Common model ID of the team the player belongs to for this event (only set for player stats)","format":"uuid","type":"string"},"updated_at":{"description":"Last update timestamp","format":"date-time","type":"string"},"week":{"description":"Week number (for weekly sports like NFL)","example":12,"type":"integer"}},"required":["common_model_id","for_entity_type","for_entity_id","event_id","source"],"title":"EventScopedStats","type":"object"},"MarketOdds":{"description":"Optimized betting markets with outcomes and odds data for high-performance scenarios.\n\nThis schema represents the response from the `/api/v1/market_odds` endpoint, which is the\nrecommended way to access market data with odds. It automatically includes outcomes and\nodds data using an optimized structure that provides approximately 80% faster\nresponse times compared to the deprecated `/api/v1/markets` endpoint.\n\n## Performance Characteristics\n- **Query Time**: ~386ms (28% faster than standard)\n- **Render Time**: ~500ms (90% faster than standard)\n- **Total Response**: ~1.2s (80% faster than standard)\n\n## Migration from Deprecated Endpoint\n\n**Old**: `GET /api/v1/markets?include_outcomes_and_odds=true`\n**New**: `GET /api/v1/market_odds`\n\nThe new endpoint provides the same data with better performance and cleaner API design.\n","example":{"common_model_id":"5c4e8fe4-5bc9-49e1-aa84-aaa975900703","event_id":"abc-123-def","is_future":false,"league_id":"league-456","market_type":"moneyline","name":"Moneyline","outcomes":[{"common_model_id":"abc123","line":null,"name":"Team A","odds":[{"aggregator":"sportsstack","common_model_id":"def456","is_main":true,"price":-110,"price_type":"american","sportsbook":"draftkings","timestamp":"2024-01-15T20:30:00Z"}],"player_id":null,"selection":"Team A","status":"ACTIVE","team_id":"58e8c89b-72f8-4427-adbc-10f193c9b462"}],"start_date":null,"status":"active","updated_at":"2024-01-15T20:30:00Z"},"properties":{"common_model_id":{"description":"Market ID","type":"string"},"event_id":{"description":"Event ID","type":"string"},"is_future":{"description":"Whether this is a future market","type":"boolean"},"league_id":{"description":"League ID","type":"string"},"market_type":{"description":"Market type","type":"string"},"name":{"description":"Market name","type":"string"},"outcomes":{"description":"Market outcomes with odds","items":{"description":"A specific betting outcome within a market, representing one possible result that bettors can wager on.\n\n## Outcome Standardization\n\nOutcomes undergo market-type-specific standardization to ensure consistent field formats:\n\n### Total Points Markets (Over/Under)\n```\nname: \"Over 228.5\"              # Human-readable with line value\nline: 228.5                     # Numeric line value\nselection: nil                  # No specific entity selection\nselection_line: \"over\"          # Direction (over/under)\nnormalized_selection: nil       # No entity to normalize\ngrouping_key: \"default:-228.5\" # Groups over/under for same line\n```\n\n### Point Spread Markets (Handicap)\n```\nname: \"Indiana Pacers +11\"           # Team name + formatted spread\nline: 11.0                           # Absolute line value\nselection: \"Indiana Pacers\"          # Team name\nselection_line: nil                  # Not applicable for spreads\nnormalized_selection: \"indiana_pacers\" # Lowercase, underscores\ngrouping_key: \"default:-11.0\"       # Groups home/away for same spread\n```\n\n### Moneyline Markets (Winner)\n```\nname: \"Oklahoma City Thunder\"               # Team name\nline: nil                                   # No line for moneyline\nselection: \"Oklahoma City Thunder\"          # Team name\nselection_line: nil                         # Not applicable\nnormalized_selection: \"oklahoma_city_thunder\" # Lowercase, underscores\ngrouping_key: \"default:Oklahoma City Thunder\" # Groups by team\n```\n\n### Field Standardization\n- **name**: Human-readable outcome description with context\n- **selection**: Entity being selected (team/player name or null)\n- **normalized_selection**: Lowercase, underscore-separated for consistent querying\n- **line**: Numeric betting line (spread/total value, null for moneyline)\n- **selection_line**: Direction for totals (\"over\"/\"under\"), null otherwise\n- **grouping_key**: Groups related outcomes (same spread/total different sides)\n","example":{"common_model_id":"123e4567-e89b-12d3-a456-426614174010","event_id":"30568865","grouping_key":"DraftKings-30568865-h2h","inserted_at":"2024-09-10T14:30:00Z","is_alternate_line":false,"is_main":true,"line":1.5,"market_id":"123e4567-e89b-12d3-a456-426614174011","market_type":"h2h","metadata":{"source":"draftkings","source_event_id":"30568865","source_market_id":"DraftKings-30568865-h2h"},"name":"DraftKings - 30568865 - h2h - Seattle Seahawks","normalized_selection":"Seattle Seahawks","player_id":"59291391-0c7e-442b-9496-33074647384e","selection":"Seattle Seahawks","selection_line":"1.5","stat_type":"points","status":"active","team_id":"58e8c89b-72f8-4427-adbc-10f193c9b462","tenant_id":"ff6332b6-8151-4a13-b20c-bd7b2ab45452","updated_at":"2024-09-11T09:15:00Z"},"properties":{"common_model_id":{"description":"Market ID","type":"string"},"event_id":{"description":"Event ID","type":"string"},"grouping_key":{"description":"Grouping Key","type":"string"},"inserted_at":{"description":"Timestamp of creation","format":"date-time","type":"string"},"is_alternate_line":{"description":"Is Alternate Line","type":"boolean"},"is_main":{"description":"Is Main","type":"boolean"},"line":{"description":"Line (if applicable)","type":"number"},"market_id":{"description":"Market ID","type":"string"},"market_type":{"description":"Market Type","type":"string"},"metadata":{"description":"Metadata. For prediction markets this includes an \"execution\" block carrying the trade-execution identifiers for the originating venue (venue, ticker/token_id, side, condition_id, neg_risk, tick_size, venue contracts, url). See the Prediction-Market Execution integration guide.","type":"object"},"name":{"description":"Name","type":"string"},"normalized_selection":{"description":"Normalized Selection","type":"string"},"odds":{"description":"Odds","items":{"description":"Betting odds from a specific sportsbook for a particular outcome, representing the price and probability.\n\n## Odds Standardization\n\nOdds undergo standardization to ensure consistent pricing representation and source attribution:\n\n### Source Selection Name Standardization\nThe `source_selection_name` field identifies what the sportsbook is offering odds on:\n\n#### Total Points Markets\n```\nsource_selection_name: nil  # No specific team/player selection\n```\n\n#### Point Spread Markets\n```\nsource_selection_name: \"Indiana Pacers\"     # Team receiving the spread\n# Derived from event.participants based on outcome selection\n```\n\n#### Moneyline Markets\n```\nsource_selection_name: \"Oklahoma City Thunder\"  # Team to win\n# Derived from event.participants based on outcome selection\n```\n\n### Price Standardization\n- **price**: Standardized to American odds format (-110, +150, etc.)\n- **price_type**: Always \"american\" for consistency\n- **timestamp**: UTC timestamp when current odds were observed. When the\n  response comes from the durable line-summary fallback, this is the time\n  the returned closing price last changed; same-price provider\n  reaffirmations do not advance it.\n\n### Sportsbook Attribution\n- **sportsbook**: Standardized sportsbook name (DraftKings, FanDuel, etc.)\n- **aggregator**: Upstream provider key or `sportsstack` for the canonical SportsStack board\n- **aggregator_event_id**: Provider's event identifier for traceability\n\n### Historical Tracking\nOdds include both current and opening lines for trend analysis:\n- Current odds: Real-time pricing from sportsbooks\n- Opening odds: Initial lines when market opened\n- Movement tracking: Compare current vs opening for line movement insights\n","example":{"aggregator":"sportsstack","aggregator_event_id":null,"fetched_at":"2026-04-21T17:40:00Z","metadata":{"aggregator":"sportsstack","id":"0HC75256377P350_1","link":"https://sportsbook.draftkings.com/event/30568865?outcomes=0HC75256377P350_1","selected_source":"example_provider.football.nfl","selection_reason":"trust_then_freshness","selection_tier":1,"source":"sportsstack","source_event_id":"30568865","source_market_id":"DraftKings-30568865-spreads","sportsstack_kind":"canonical_book_quote"},"price":-110,"price_type":"american","source_event_id":"30568865","source_id":"0HC75256377P350_1","source_market_id":"DraftKings-30568865-spreads","source_selection_id":"0HC75256377P350_1","source_selection_name":"Seattle Seahawks","sportsbook":"draftkings"},"properties":{"aggregator":{"description":"Upstream provider name or 'sportsstack' for the canonical SportsStack sportsbook board","type":"string"},"aggregator_event_id":{"description":"Aggregator event ID","type":"string"},"canonical_outcome_id":{"description":"Verified cross-venue economic outcome ID. Null when outcome equivalence is unresolved, push-capable, three-way, or ambiguous.","format":"uuid","nullable":true,"type":"string"},"clock_provenance":{"properties":{"evaluated_at":{"format":"date-time","type":"string"},"max_age_seconds":{"enum":[300],"type":"integer"},"quote_provenance":{"description":"Unmodified retained JSON provenance, including legacy or malformed evidence.","nullable":true},"source":{"enum":["timestamp",null],"nullable":true,"type":"string"}},"type":"object"},"common_model_id":{"description":"Market ID","type":"string"},"deep_link":{"description":"Desktop sportsbook deep link URL","type":"string"},"execution_readiness":{"description":"Requires exact native source-ID binding, active parent/outcome lifecycle and proven fresh provider clock; not order-fill certification. ProphetX additionally requires one atomic native strike/price/size/time observation matching its documented submit-order fields. ready=null means unknown. Native IDs remain separate from common_model_id.","example":{"available_size":{"state":"unknown","value":null},"depth":{"state":"unknown","value":null},"executable":{"reason":"catalog_is_not_a_book","state":"unknown"},"identifiers_valid":true,"liquidity":{"state":"unknown","value":null},"ready":null,"reasons":["provider_clock_provenance_downgrade"],"scope":"outcome_identifiers_and_provider_clock","venue":"limitless"},"properties":{"available_size":{"additionalProperties":true,"description":"Retained evidence; absent measurements have state unknown and value null.","type":"object"},"depth":{"additionalProperties":true,"description":"Retained evidence; absent measurements have state unknown and value null.","type":"object"},"executable":{"additionalProperties":true,"description":"Retained evidence; absent measurements have state unknown and value null.","type":"object"},"identifiers_valid":{"type":"boolean"},"liquidity":{"additionalProperties":true,"description":"Retained evidence; absent measurements have state unknown and value null.","type":"object"},"ready":{"nullable":true,"type":"boolean"},"reasons":{"items":{"type":"string"},"type":"array"},"scope":{"enum":["outcome_identifiers_and_provider_clock"],"type":"string"},"venue":{"type":"string"}},"type":"object"},"fetched_at":{"description":"Timestamp when SportsStack fetched or observed this quote","format":"date-time","nullable":true,"type":"string"},"freshness_reasons":{"description":"Deterministic provider_clock_* or lifecycle_* reasons; empty when fresh.","items":{"type":"string"},"type":"array"},"inserted_at":{"description":"Timestamp of creation","format":"date-time","type":"string"},"line_alignment":{"description":"SS main-line ladder plan Phase D. Present only for event-scoped, `latest_only=true` `/v1/odds` requests (`event_id` given) -- the key itself is absent from the response row (not present with a null body) for non-event-scoped `league_id`/list requests, since computing it there would mean an unbounded per-request ladder fetch across many events. Read-time derived from CommonModel.Betting.PredictionMarkets.LineLadder; never renames, removes, or reinterprets the sibling `is_main` field (the stored, write-time value) -- purely additive. All three sub-fields are null together when this row was not matched into a ranked ladder slot (e.g. a moneyline row, which has no alt-strike ladder, or a real-sportsbook row, which LineLadder never covers).","example":{"alignment_group":{"family":"spread","market_type":"point_spread","side":{"sign":"negative","team_id":null}},"is_main_derived":true,"sibling_line_count":2},"nullable":true,"properties":{"alignment_group":{"additionalProperties":true,"description":"The {market_type, family, side} ladder slot this row was matched into.","nullable":true,"type":"object"},"is_main_derived":{"description":"Whether LineLadder derived this row as the closest-to-even main line for its venue/slot, independent of the stored `is_main` column.","nullable":true,"type":"boolean"},"sibling_line_count":{"description":"Number of lines this row's own venue quotes within the same ladder slot.","nullable":true,"type":"integer"}},"type":"object"},"metadata":{"additionalProperties":true,"description":"Metadata. For prediction markets this includes an \"execution\" block carrying the trade-execution identifiers for the originating venue (venue, ticker/token_id, side, condition_id, neg_risk, tick_size, venue contracts, url). See the Prediction-Market Execution integration guide. UFC conditional markets expose \"probability_semantics\": \"conditional\", a structured \"condition\" object, and a plain-language \"void_condition\".","properties":{"condition":{"additionalProperties":true,"nullable":true,"properties":{"fight_result":{"description":"Fight-result condition for a conditional UFC market.","enum":["finish","decision"],"type":"string"},"round":{"description":"Optional round constraint for the conditional market.","minimum":1,"nullable":true,"type":"integer"}},"required":["fight_result"],"type":"object"},"probability_semantics":{"description":"Set to \"conditional\" when this price is conditional on the described fight result.","enum":["conditional"],"nullable":true,"type":"string"},"void_condition":{"description":"Plain-language condition under which a conditional UFC market is voided.","nullable":true,"type":"string"}},"type":"object"},"mobile_deep_link":{"description":"Mobile/native app deep link URL","type":"string"},"outcome_id":{"description":"Venue-backed SportsStack outcome ID","type":"string"},"platform_observed_at":{"description":"Prediction quotes only. Row observed_at, independently of provider freshness.","format":"date-time","nullable":true,"type":"string"},"price":{"description":"Price","type":"number"},"price_type":{"description":"Price format ('decimal', 'american')","type":"string"},"provider_freshness":{"description":"Prediction quotes only. Fresh requires a proven nonfuture provider clock at most 300 seconds old and proven active exact-parent/outcome lifecycle. Standalone odds report unknown without lifecycle proof.","enum":["fresh","stale","unknown"],"type":"string"},"provider_observed_at":{"description":"Prediction quotes only. Authoritative provider quote timestamp; never receipt/observation time. Requires matching observed quote_provenance.provider_updated_at; null for absent, synthetic or downgraded authority.","format":"date-time","nullable":true,"type":"string"},"reference_alignment":{"description":"Present only on crypto odds rows (omitted on sports rows; `line_alignment` is the\nsports ladder analogue and is omitted on crypto rows). `alignment` is `exact` (this\nmarket spans two or more venues), `single_venue`, or `unverified_mirror`.\n`different_reference_market_ids` lists the OTHER `market_id`s of the same window\n(any reference source), symmetrically.\n","properties":{"alignment":{"enum":["exact","single_venue","unverified_mirror"],"type":"string"},"alignment_group":{"description":"The window (event) id.","format":"uuid","type":"string"},"different_reference_market_ids":{"items":{"format":"uuid","type":"string"},"type":"array"},"reference_source":{"type":"string"},"tie_rule":{"enum":["up","split"],"type":"string"},"venue_count":{"minimum":1,"type":"integer"}},"title":"CryptoReferenceAlignment","type":"object"},"sgp_token":{"description":"Opaque same-game-parlay token supplied by the sportsbook. Null when the provider does not offer one.","nullable":true,"type":"string"},"source_event_id":{"description":"Source event ID","type":"string"},"source_id":{"description":"Source ID","type":"string"},"source_market_id":{"description":"Source market ID","type":"string"},"source_selection_id":{"description":"Source selection ID","type":"string"},"source_selection_name":{"description":"Source selection name","type":"string"},"sportsbook":{"description":"Sportsbook","type":"string"},"timestamp":{"description":"Provider quote timestamp","format":"date-time","nullable":true,"type":"string"},"trading_fees":{"description":"Prediction quotes only (absent on sportsbook rows and on venues whose fees are not captured yet: Limitless, ProphetX, Polymarket US, SX Bet). Computed at read time; no order-fill or account-specific guarantee (per-account discounts, maker rebates and balance-precision rounding are not modelled). Kalshi: rates from a versioned snapshot of Kalshi's public series metadata, event fee overrides and fee schedule; `observed_at` is the snapshot time. Series with event-level fee overrides (MLB) resolve per event: an override in force reports `scope: event` (with `event_ticker`, `effective_from`), before its `scheduled_ts` the series fee is reported with the pending change under `scheduled_override`, and an event missing from the snapshot reports `unknown` (`event_fee_override_not_in_snapshot`). Predict.fun: derived from the stored market `fee_rate_bps`; `observed_at` is the quote observation time. Polymarket: the market's own Gamma `feesEnabled`/`feeSchedule` captured with the quote (`fee = shares x rate x P x (1 - P)`, taker only, makers pay nothing; `maker.rebate_rate` is the fraction of taker fees returned to makers through a daily rebate program, not a per-fill credit; fees round to 5 decimal places with no published direction, so `rounding.direction` is absent); `observed_at` is the quote observation time, and quotes whose fee data is missing, has an exponent other than 1, or is not taker-only report `unknown`. The rate is per market (`sports_fees_v3` 0.05, `sports_fees_v2` 0.03, `zero_fees` 0 are all live on sports), never a category default.","example":{"availability":"published","charge_basis":"fill","fee_multiplier":1.0,"fee_type":"quadratic_with_maker_fees","maker":{"exponent":1,"model":"quadratic","multiplier":1.0,"rate":0.0175,"rounding":{"applies_to":"fee_plus_position_cost","direction":"up","increment":0.0001}},"observed_at":"2026-09-30T15:33:45Z","scope":"series","series_ticker":"KXNBAGAME","source":"kalshi_series_snapshot","taker":{"exponent":1,"model":"quadratic","multiplier":1.0,"rate":0.07,"rounding":{"applies_to":"fee_plus_position_cost","direction":"up","increment":0.0001}}},"properties":{"availability":{"enum":["published","unavailable","unknown"],"type":"string"},"charge_basis":{"description":"Fees are charged per fill, not per order or per settlement.","enum":["fill"],"type":"string"},"effective_from":{"description":"Kalshi, `scope: event`: the override's `scheduled_ts`, from which these rates apply.","format":"date-time","type":"string"},"event_ticker":{"description":"Kalshi: the market ticker minus its last `-` segment. Present for series with event-level fee overrides.","type":"string"},"fee_multiplier":{"type":"number"},"fee_rate_bps":{"type":"integer"},"fee_type":{"type":"string"},"fees_enabled":{"description":"Polymarket: the market's Gamma `feesEnabled` flag.","type":"boolean"},"maker":{"description":"One side of the fee. `quadratic`: fee = rate x contracts x (P x (1 - P)) ^ exponent. `linear_min_price`: fee = rate x min(P, 1 - P) x shares. `none`: no fee. `rate` already includes any venue multiplier.","properties":{"exponent":{"type":"integer"},"formula":{"type":"string"},"model":{"enum":["quadratic","linear_min_price","none"],"type":"string"},"multiplier":{"type":"number"},"rate":{"type":"number"},"rebate_rate":{"description":"Polymarket maker side: fraction of taker fees rebated to resting makers by the daily rebate program (context only, not a per-fill credit).","type":"number"},"rounding":{"properties":{"applies_to":{"type":"string"},"direction":{"enum":["up"],"type":"string"},"increment":{"type":"number"}},"type":"object"}},"type":"object"},"observed_at":{"format":"date-time","nullable":true,"type":"string"},"reason":{"description":"Present when availability is unknown; deterministic snake_case reason.","type":"string"},"scheduled_override":{"description":"Kalshi, `scope: series`: an event-level override that is not yet in force. Charged from `effective_from`; carries `fee_type`, `fee_multiplier`, `taker` and `maker` like the top-level object.","properties":{"effective_from":{"format":"date-time","type":"string"},"fee_multiplier":{"type":"number"},"fee_type":{"type":"string"},"maker":{"description":"One side of the fee. `quadratic`: fee = rate x contracts x (P x (1 - P)) ^ exponent. `linear_min_price`: fee = rate x min(P, 1 - P) x shares. `none`: no fee. `rate` already includes any venue multiplier.","properties":{"exponent":{"type":"integer"},"formula":{"type":"string"},"model":{"enum":["quadratic","linear_min_price","none"],"type":"string"},"multiplier":{"type":"number"},"rate":{"type":"number"},"rebate_rate":{"description":"Polymarket maker side: fraction of taker fees rebated to resting makers by the daily rebate program (context only, not a per-fill credit).","type":"number"},"rounding":{"properties":{"applies_to":{"type":"string"},"direction":{"enum":["up"],"type":"string"},"increment":{"type":"number"}},"type":"object"}},"type":"object"},"taker":{"description":"One side of the fee. `quadratic`: fee = rate x contracts x (P x (1 - P)) ^ exponent. `linear_min_price`: fee = rate x min(P, 1 - P) x shares. `none`: no fee. `rate` already includes any venue multiplier.","properties":{"exponent":{"type":"integer"},"formula":{"type":"string"},"model":{"enum":["quadratic","linear_min_price","none"],"type":"string"},"multiplier":{"type":"number"},"rate":{"type":"number"},"rebate_rate":{"description":"Polymarket maker side: fraction of taker fees rebated to resting makers by the daily rebate program (context only, not a per-fill credit).","type":"number"},"rounding":{"properties":{"applies_to":{"type":"string"},"direction":{"enum":["up"],"type":"string"},"increment":{"type":"number"}},"type":"object"}},"type":"object"}},"type":"object"},"scope":{"enum":["series","event","market"],"type":"string"},"series_ticker":{"type":"string"},"source":{"description":"kalshi_series_snapshot | kalshi_event_fee_snapshot | kalshi_fee_schedule_default | venue_record. `kalshi_event_fee_snapshot` is a Kalshi event-level override in force; `kalshi_fee_schedule_default` is the schedule default (quadratic x 1) inferred for a KX series not in the exception snapshot.","type":"string"},"taker":{"description":"One side of the fee. `quadratic`: fee = rate x contracts x (P x (1 - P)) ^ exponent. `linear_min_price`: fee = rate x min(P, 1 - P) x shares. `none`: no fee. `rate` already includes any venue multiplier.","properties":{"exponent":{"type":"integer"},"formula":{"type":"string"},"model":{"enum":["quadratic","linear_min_price","none"],"type":"string"},"multiplier":{"type":"number"},"rate":{"type":"number"},"rebate_rate":{"description":"Polymarket maker side: fraction of taker fees rebated to resting makers by the daily rebate program (context only, not a per-fill credit).","type":"number"},"rounding":{"properties":{"applies_to":{"type":"string"},"direction":{"enum":["up"],"type":"string"},"increment":{"type":"number"}},"type":"object"}},"type":"object"}},"type":"object"},"updated_at":{"description":"Timestamp when SportsStack last wrote this row","format":"date-time","type":"string"}},"required":["common_model_id","name"],"title":"Odds","type":"object"},"type":"array"},"player_id":{"description":"Player ID","type":"string"},"selection":{"description":"Selection","type":"string"},"selection_line":{"description":"Selection Line","type":"string"},"stat_type":{"description":"Stat type (if applicable)","type":"string"},"status":{"description":"Status","type":"string"},"team_id":{"description":"Team ID","type":"string"},"tenant_id":{"description":"Tenant ID","type":"string"},"updated_at":{"description":"Timestamp of last update","format":"date-time","type":"string"}},"required":["common_model_id","name"],"title":"Outcome","type":"object"},"type":"array"},"start_date":{"description":"Start date for future markets","format":"date-time","type":"string"},"status":{"description":"Market status","type":"string"},"tournament_id":{"description":"Tournament ID","type":"string"},"updated_at":{"description":"Timestamp of last market update","format":"date-time","type":"string"}},"required":["common_model_id","name","outcomes"],"title":"MarketOdds","type":"object"},"ScoreboardDetailsV1Football":{"additionalProperties":false,"description":"Football. Every key is always present. A key whose value is not known is `null`, never `0`, `false` or an empty value.","properties":{"attendance":{"description":"Game attendance","maximum":1000000000,"minimum":0,"nullable":true,"type":"integer"},"away_timeouts":{"description":"Away team timeouts remaining","maximum":1000000000,"minimum":0,"nullable":true,"type":"integer"},"clock_running":{"description":"Whether game clock is running","nullable":true,"type":"boolean"},"details_version":{"description":"Version of the details format. Always `1` in this format.","enum":[1],"type":"integer"},"distance":{"description":"Yards to go for first down","maximum":1000000000,"minimum":0,"nullable":true,"type":"integer"},"down":{"description":"Current down (1-4)","maximum":1000000000,"minimum":0,"nullable":true,"type":"integer"},"duration":{"description":"Game duration","nullable":true,"type":"string"},"field_goal_range":{"description":"Within field goal range","nullable":true,"type":"boolean"},"game_clock":{"description":"Current game clock time","nullable":true,"pattern":"^\\d{1,3}:[0-5]\\d(\\.\\d+)?$","type":"string"},"goal_to_go":{"description":"Goal line is closer than first down marker","nullable":true,"type":"boolean"},"home_timeouts":{"description":"Home team timeouts remaining","maximum":1000000000,"minimum":0,"nullable":true,"type":"integer"},"inside_two_minutes":{"description":"Less than two minutes remaining","nullable":true,"type":"boolean"},"neutral_site":{"description":"Neutral site game","nullable":true,"type":"boolean"},"play_clock":{"description":"Seconds on play clock","maximum":1000000000,"minimum":0,"nullable":true,"type":"integer"},"possession_team_id":{"description":"SportsStack team ID of the team with possession, or `null`.","format":"uuid","nullable":true,"type":"string"},"precipitation":{"description":"Active precipitation","nullable":true,"type":"boolean"},"red_zone":{"description":"In red zone (20 yards or less)","nullable":true,"type":"boolean"},"touchdown_probability":{"description":"Probability of touchdown (0.0-1.0)","maximum":1.0e12,"minimum":0,"nullable":true,"type":"number"},"turnover_on_downs_risk":{"description":"Probability of turnover on downs (0.0-1.0)","maximum":1.0e12,"minimum":0,"nullable":true,"type":"number"},"two_minute_warning":{"description":"Two minute warning called","nullable":true,"type":"boolean"},"wall_clock":{"description":"Provider wall-clock timestamp for the most recent game event","nullable":true,"type":"string"},"weather_condition":{"description":"Weather condition","nullable":true,"type":"string"},"weather_humidity":{"description":"Humidity percentage","maximum":1000000000,"minimum":0,"nullable":true,"type":"integer"},"weather_precipitation":{"description":"Is it precipitating","nullable":true,"type":"boolean"},"weather_temperature":{"description":"Temperature (Fahrenheit)","maximum":1.0e12,"minimum":-1.0e12,"nullable":true,"type":"number"},"weather_wind_direction":{"description":"Wind direction","nullable":true,"type":"string"},"weather_wind_speed":{"description":"Wind speed (mph)","maximum":1.0e12,"minimum":0,"nullable":true,"type":"number"},"wind_affecting_kicking":{"description":"Wind affecting field goals/punts","nullable":true,"type":"boolean"},"yard_line":{"description":"Field position (0-100)","maximum":1000000000,"minimum":0,"nullable":true,"type":"integer"}},"required":["attendance","away_timeouts","clock_running","details_version","distance","down","duration","field_goal_range","game_clock","goal_to_go","home_timeouts","inside_two_minutes","neutral_site","play_clock","possession_team_id","precipitation","red_zone","touchdown_probability","turnover_on_downs_risk","two_minute_warning","wall_clock","weather_condition","weather_humidity","weather_precipitation","weather_temperature","weather_wind_direction","weather_wind_speed","wind_affecting_kicking","yard_line"],"type":"object"},"CryptoEventWindow":{"description":"Additive detail on a crypto event (`league_id=CRYPTO`). `groups` is a disjoint\npartition by `family_id`: `alignment` is `exact` (two or more distinct venues\nsharing one family: same window, reference source and tie rule, safe to treat as\none contract), or `single_venue`. A Limitless listing whose mirrored Polymarket\nlisting is missing or disagrees is in `unmatched` (`unverified_mirror`) with its own\n`market_id`, never presented as the shared contract. Markets of the same window on a\ndifferent reference (for example Kalshi's CF Benchmarks RTI vs Polymarket/Limitless's\nChainlink 60s TWAP) are other `market_id`s on the same event, listed per odds row in\n`reference_alignment.different_reference_market_ids`; they can disagree on start price\nand result even on a near-flat window.\n","properties":{"asset":{"enum":["BTC","ETH","SOL","DOGE"],"type":"string"},"groups":{"items":{"properties":{"alignment":{"enum":["exact","single_venue"],"type":"string"},"constituents":{"description":"Present on `/v1/events/{id}` only; list responses omit the constituent detail.","items":{"description":"One venue's native listing for a crypto window: its native IDs\n(`native_market_id`, `native_ref`, and `native_yes_token`/`native_no_token`\nwhen the venue exposes on-chain tokens) and, while the listing is quotable,\nan indicative `quote` from our one-minute poll. `result`/`resolved_at`/\n`end_price` are a pass-through of the venue's own settlement, never a\nSportsStack determination. Clients that need executable prices stream order\nbooks from the venue directly using the native IDs.\n","properties":{"end_price":{"format":"double","nullable":true,"type":"number"},"family_id":{"description":"Shared by every listing with the same window, reference source and tie rule.","format":"uuid","type":"string"},"last_changed_at":{"description":"Fetch time of the feed file that last changed this listing.","format":"date_time","type":"string"},"lifecycle":{"enum":["upcoming","live","closed","resolved","voided"],"type":"string"},"mirror_of":{"description":"For a Limitless listing, the Polymarket slug it mirrors.","nullable":true,"type":"string"},"native_market_id":{"description":"The venue's native market ID.","type":"string"},"native_no_token":{"description":"On-chain CLOB token ID for the Down/No side, when the venue exposes one.","nullable":true,"type":"string"},"native_ref":{"description":"The venue's ticker (Kalshi) or slug (Polymarket, Limitless).","type":"string"},"native_yes_token":{"description":"On-chain CLOB token ID for the Up/Yes side, when the venue exposes one.","nullable":true,"type":"string"},"quote":{"description":"The listing's indicative quote: our one-minute poll capture of the venue's\nprice (`observed_at` is OUR capture time, never a provider clock). `null`\nwhen the listing is not currently quotable: it is not `upcoming`/`live`, its\nwindow has ended, it has no quote, or the quote is older than 15 minutes.\nIndicative, not executable: `stale` is true once `age_ms` exceeds\n`stale_after_ms` (150 s for 5m/15m, 300 s for 1h, 600 s for 1d).\n","nullable":true,"properties":{"age_ms":{"minimum":0,"type":"integer"},"down":{"format":"double","maximum":1,"minimum":0,"type":"number"},"observed_at":{"format":"date_time","type":"string"},"source":{"enum":["kalshi_bid_ask_mid","kalshi_last","polymarket_clob_mid","polymarket_gamma","limitless_clob_mid","limitless_prices"],"type":"string"},"stale":{"type":"boolean"},"stale_after_ms":{"minimum":0,"type":"integer"},"up":{"format":"double","maximum":1,"minimum":0,"type":"number"}},"required":["up","down","source","observed_at","age_ms","stale_after_ms","stale"],"title":"CryptoWindowQuote","type":"object"},"reference_source":{"description":"The oracle/index this listing resolves against. Two listings of the\nsame window with different reference sources are the\n`same_window_different_reference` match class, not `exact` -- they\ncan and do disagree on start price and result even on a near-flat\nwindow. `binance_usdt_1m_noon` is the Binance USDT 1-minute candle at\n12:00 America/New_York, used by Polymarket's daily up/down markets.\n","enum":["cf_benchmarks_rti","chainlink_twap_60s","binance_usdt_1h_candle","binance_usdt_1m_noon"],"type":"string"},"resolved_at":{"format":"date_time","nullable":true,"type":"string"},"result":{"description":"The venue's own result, passed through unchanged. `null` does not\nmean \"no\": a window whose status is `ended` has not necessarily been\nresolved by the venue yet -- see the result-latency notes on the\nparent window.\n","enum":["up","down","split"],"nullable":true,"type":"string"},"result_revision":{"description":"Increments on every terminal-state correction (including voided -> resolved and back).","minimum":0,"type":"integer"},"settlement_value":{"format":"double","nullable":true,"type":"number"},"start_price":{"format":"double","nullable":true,"type":"number"},"tie_rule":{"enum":["up","split"],"type":"string"},"venue":{"enum":["kalshi","polymarket","limitless"],"type":"string"}},"required":["venue","native_market_id","native_ref","reference_source","tie_rule","family_id","lifecycle","result_revision","last_changed_at"],"title":"CryptoWindowConstituent","type":"object"},"type":"array"},"family_id":{"format":"uuid","type":"string"},"market_id":{"format":"uuid","type":"string"},"reference_source":{"type":"string"},"tie_rule":{"enum":["up","split"],"type":"string"},"venues":{"items":{"type":"string"},"type":"array"}},"required":["market_id","venues","alignment"],"type":"object"},"type":"array"},"horizon":{"enum":["5m","15m","1h","1d"],"type":"string"},"unmatched":{"items":{"properties":{"alignment":{"enum":["unverified_mirror"],"type":"string"},"constituent":{"description":"One venue's native listing for a crypto window: its native IDs\n(`native_market_id`, `native_ref`, and `native_yes_token`/`native_no_token`\nwhen the venue exposes on-chain tokens) and, while the listing is quotable,\nan indicative `quote` from our one-minute poll. `result`/`resolved_at`/\n`end_price` are a pass-through of the venue's own settlement, never a\nSportsStack determination. Clients that need executable prices stream order\nbooks from the venue directly using the native IDs.\n","properties":{"end_price":{"format":"double","nullable":true,"type":"number"},"family_id":{"description":"Shared by every listing with the same window, reference source and tie rule.","format":"uuid","type":"string"},"last_changed_at":{"description":"Fetch time of the feed file that last changed this listing.","format":"date_time","type":"string"},"lifecycle":{"enum":["upcoming","live","closed","resolved","voided"],"type":"string"},"mirror_of":{"description":"For a Limitless listing, the Polymarket slug it mirrors.","nullable":true,"type":"string"},"native_market_id":{"description":"The venue's native market ID.","type":"string"},"native_no_token":{"description":"On-chain CLOB token ID for the Down/No side, when the venue exposes one.","nullable":true,"type":"string"},"native_ref":{"description":"The venue's ticker (Kalshi) or slug (Polymarket, Limitless).","type":"string"},"native_yes_token":{"description":"On-chain CLOB token ID for the Up/Yes side, when the venue exposes one.","nullable":true,"type":"string"},"quote":{"description":"The listing's indicative quote: our one-minute poll capture of the venue's\nprice (`observed_at` is OUR capture time, never a provider clock). `null`\nwhen the listing is not currently quotable: it is not `upcoming`/`live`, its\nwindow has ended, it has no quote, or the quote is older than 15 minutes.\nIndicative, not executable: `stale` is true once `age_ms` exceeds\n`stale_after_ms` (150 s for 5m/15m, 300 s for 1h, 600 s for 1d).\n","nullable":true,"properties":{"age_ms":{"minimum":0,"type":"integer"},"down":{"format":"double","maximum":1,"minimum":0,"type":"number"},"observed_at":{"format":"date_time","type":"string"},"source":{"enum":["kalshi_bid_ask_mid","kalshi_last","polymarket_clob_mid","polymarket_gamma","limitless_clob_mid","limitless_prices"],"type":"string"},"stale":{"type":"boolean"},"stale_after_ms":{"minimum":0,"type":"integer"},"up":{"format":"double","maximum":1,"minimum":0,"type":"number"}},"required":["up","down","source","observed_at","age_ms","stale_after_ms","stale"],"title":"CryptoWindowQuote","type":"object"},"reference_source":{"description":"The oracle/index this listing resolves against. Two listings of the\nsame window with different reference sources are the\n`same_window_different_reference` match class, not `exact` -- they\ncan and do disagree on start price and result even on a near-flat\nwindow. `binance_usdt_1m_noon` is the Binance USDT 1-minute candle at\n12:00 America/New_York, used by Polymarket's daily up/down markets.\n","enum":["cf_benchmarks_rti","chainlink_twap_60s","binance_usdt_1h_candle","binance_usdt_1m_noon"],"type":"string"},"resolved_at":{"format":"date_time","nullable":true,"type":"string"},"result":{"description":"The venue's own result, passed through unchanged. `null` does not\nmean \"no\": a window whose status is `ended` has not necessarily been\nresolved by the venue yet -- see the result-latency notes on the\nparent window.\n","enum":["up","down","split"],"nullable":true,"type":"string"},"result_revision":{"description":"Increments on every terminal-state correction (including voided -> resolved and back).","minimum":0,"type":"integer"},"settlement_value":{"format":"double","nullable":true,"type":"number"},"start_price":{"format":"double","nullable":true,"type":"number"},"tie_rule":{"enum":["up","split"],"type":"string"},"venue":{"enum":["kalshi","polymarket","limitless"],"type":"string"}},"required":["venue","native_market_id","native_ref","reference_source","tie_rule","family_id","lifecycle","result_revision","last_changed_at"],"title":"CryptoWindowConstituent","type":"object"},"market_id":{"format":"uuid","type":"string"},"reason":{"enum":["mirror_counterpart_missing","mirror_terms_disagree"],"type":"string"},"venues":{"items":{"type":"string"},"type":"array"}},"required":["market_id","alignment","reason"],"type":"object"},"type":"array"},"window_end":{"format":"date_time","type":"string"},"window_start":{"format":"date_time","type":"string"}},"required":["asset","horizon","window_start","window_end","groups","unmatched"],"title":"CryptoEventWindow","type":"object"},"Team":{"description":"A team represents an organized group of players competing together under a common identity.\n\nTeams are the primary competing entities in team-based sports. They maintain rosters,\nhave historical records, geographic associations, and fan bases. Teams can change leagues,\nrelocate cities, or rebrand while maintaining continuity of their competitive history.\n\n## Team Structure\n- **Identity**: Name, abbreviation, colors, logos, and branding\n- **Location**: City/region association and home venue\n- **Roster**: Current and historical player affiliations\n- **Performance**: Win-loss records, championships, statistics\n- **Organization**: Coaching staff, management, ownership\n\n## Key Relationships\n- **League**: Organizational membership and competitive framework\n- **Players**: Current roster and historical affiliations\n- **Events**: Games played as home or away team\n- **Statistics**: Team-level performance metrics\n- **Markets**: Team-specific betting opportunities\n\n## Franchise Continuity\nTeams may undergo changes while maintaining data continuity:\n- **Relocation**: Moving cities (e.g., St. Louis Rams → Los Angeles Rams)\n- **Rebranding**: Name changes (e.g., Washington Redskins → Commanders)\n- **League Changes**: Moving between divisions or conferences\n\n## Geographic Significance\nTeam location affects scheduling, fan base, media coverage, and betting markets.\nHome field advantage is a measurable factor in performance analysis.\n","example":{"abbreviation":"PHI","colors":[{"type":"primary","value":"#004C54"},{"type":"secondary","value":"#A5ACAF"}],"common_model_id":"e2790078-ec3a-4c45-8dc4-5cf173960b2b","image_url":"https://cdn.example.com/logos/nba/lal.png","league_id":"58e8c89b-72f8-4427-adbc-10f193c9b462","market":"Philadelphia","metadata":{"conference":"NFC","division":"NFC East"},"name":"Philadelphia Eagles","nickname":"Eagles","status":"ACTIVE"},"properties":{"abbreviation":{"description":"Standard short form used in schedules and stats (e.g., 'LAL')","type":"string"},"colors":{"description":"Team brand colors as array of color objects with type and hex value","items":{"properties":{"type":{"description":"Color type: 'primary', 'secondary', or 'accent_N'","example":"primary","type":"string"},"value":{"description":"Color value in hex format","example":"#004C54","type":"string"}},"type":"object"},"type":"array"},"common_model_id":{"description":"Unique team identifier preserving historical continuity","type":"string"},"conference":{"description":"Conference name (e.g., 'NFC', 'Eastern Conference'), hoisted from team metadata for convenience. Null when unavailable; see GET /api/v1/standings for the authoritative grouping.","nullable":true,"type":"string"},"division":{"description":"Division name (e.g., 'NFC East', 'AL West'), hoisted from team metadata for convenience. Null when no provider or standings data supplies it — GET /api/v1/standings?primary_group_type=division is the authoritative source.","nullable":true,"type":"string"},"image_url":{"description":"Team logo, helmet, or primary branding image","type":"string"},"league_id":{"description":"League/competition the team currently competes in","type":"string"},"market":{"description":"Geographic market/city name (e.g., 'Los Angeles', 'Philadelphia')","type":"string"},"metadata":{"additionalProperties":true,"description":"Additional team metadata including division, conference, and other organizational information","properties":{"away_loss":{"description":"Away losses recorded in the current standings snapshot","type":"integer"},"conference":{"description":"Conference name (e.g., 'NFC', 'AFC', 'Eastern Conference')","type":"string"},"division":{"description":"Division name (e.g., 'NFC East', 'AL West')","type":"string"},"division_rank":{"description":"Current division rank (1 = first place) from the latest standings pull","type":"integer"},"home_loss":{"description":"Home losses recorded in the current standings snapshot","type":"integer"},"last_10_lost":{"description":"Losses over the last ten games according to the latest standings import","type":"integer"},"last_10_won":{"description":"Wins over the last ten games according to the latest standings import","type":"integer"},"league_rank":{"description":"Overall league rank from the most recent standings snapshot","type":"integer"},"loss":{"description":"Latest regular-season loss total","type":"integer"},"standing_season_type":{"description":"Season segment (PRE, REG, PST, etc.) for the current standings data","type":"string"},"standing_season_year":{"description":"Season year for the latest standings snapshot applied to this team","type":"integer"},"streak":{"description":"Current streak text (e.g., 'W3', 'L2') sourced from standings metadata","type":"string"},"wild_card_back":{"description":"Games behind the wildcard leader in the most recent standings snapshot","format":"float","type":"number"},"win":{"description":"Latest regular-season win total synced from the authoritative provider","type":"integer"},"win_percentage":{"description":"Decimal win percentage (0-1) from the standings feed","format":"float","type":"number"}},"type":"object"},"name":{"description":"Full team name including city (e.g., 'Los Angeles Lakers')","type":"string"},"nickname":{"description":"Team nickname or mascot name (e.g., 'Lakers', 'Eagles')","type":"string"},"source_mappings_by_source":{"additionalProperties":{"properties":{"event":{"description":"Event mapping rows for event endpoints.","items":{"properties":{"common_model_id":{"format":"uuid","type":"string"},"deprecated_at":{"format":"date-time","nullable":true,"type":"string"},"entity_type":{"type":"string"},"id_scheme":{"type":"string"},"ignored_pending":{"type":"boolean"},"league":{"type":"string"},"match_status":{"type":"string"},"overmapped_allowed":{"type":"boolean"},"provider":{"type":"string"},"source":{"type":"string"},"source_id":{"type":"string"},"tenant_id":{"format":"uuid","nullable":true,"type":"string"},"updated_at":{"format":"date-time","type":"string"}},"type":"object"},"type":"array"},"mappings":{"description":"Source mapping rows for non-event entity endpoints.","items":{"properties":{"common_model_id":{"format":"uuid","type":"string"},"deprecated_at":{"format":"date-time","nullable":true,"type":"string"},"entity_type":{"type":"string"},"id_scheme":{"type":"string"},"ignored_pending":{"type":"boolean"},"league":{"type":"string"},"match_status":{"type":"string"},"overmapped_allowed":{"type":"boolean"},"provider":{"type":"string"},"source":{"type":"string"},"source_id":{"type":"string"},"tenant_id":{"format":"uuid","nullable":true,"type":"string"},"updated_at":{"format":"date-time","type":"string"}},"type":"object"},"type":"array"},"participants":{"description":"Participant mapping rows for event endpoints.","items":{"properties":{"common_model_id":{"format":"uuid","type":"string"},"deprecated_at":{"format":"date-time","nullable":true,"type":"string"},"entity_type":{"type":"string"},"id_scheme":{"type":"string"},"ignored_pending":{"type":"boolean"},"league":{"type":"string"},"match_status":{"type":"string"},"overmapped_allowed":{"type":"boolean"},"participant_id":{"format":"uuid","type":"string"},"participant_role":{"type":"string"},"participant_side":{"enum":["home","away","neutral","unknown"],"type":"string"},"provider":{"type":"string"},"source":{"type":"string"},"source_id":{"type":"string"},"tenant_id":{"format":"uuid","nullable":true,"type":"string"},"updated_at":{"format":"date-time","type":"string"}},"type":"object"},"type":"array"},"unmapped_participants":{"description":"Event participants that could not be emitted as source mappings because they were placeholders/TBD or lacked a mapping for the requested source.","items":{"properties":{"display_name":{"type":"string"},"participant_id":{"type":"string"},"participant_role":{"type":"string"},"participant_side":{"enum":["home","away","neutral","unknown"],"type":"string"},"reason":{"enum":["placeholder_or_tbd","missing_source_mapping"],"type":"string"}},"type":"object"},"type":"array"}},"type":"object"},"description":"Optional enterprise mapping enrichment keyed by full normalized source. Added when include_source_mappings_by_source=true.","type":"object"},"status":{"description":"Team status: ACTIVE for official league teams, INACTIVE for exhibition/minor league teams not in league hierarchy","enum":["ACTIVE","INACTIVE"],"type":"string"}},"required":["common_model_id","name"],"title":"Team","type":"object"},"CryptoWindowConstituent":{"description":"One venue's native listing for a crypto window: its native IDs\n(`native_market_id`, `native_ref`, and `native_yes_token`/`native_no_token`\nwhen the venue exposes on-chain tokens) and, while the listing is quotable,\nan indicative `quote` from our one-minute poll. `result`/`resolved_at`/\n`end_price` are a pass-through of the venue's own settlement, never a\nSportsStack determination. Clients that need executable prices stream order\nbooks from the venue directly using the native IDs.\n","properties":{"end_price":{"format":"double","nullable":true,"type":"number"},"family_id":{"description":"Shared by every listing with the same window, reference source and tie rule.","format":"uuid","type":"string"},"last_changed_at":{"description":"Fetch time of the feed file that last changed this listing.","format":"date_time","type":"string"},"lifecycle":{"enum":["upcoming","live","closed","resolved","voided"],"type":"string"},"mirror_of":{"description":"For a Limitless listing, the Polymarket slug it mirrors.","nullable":true,"type":"string"},"native_market_id":{"description":"The venue's native market ID.","type":"string"},"native_no_token":{"description":"On-chain CLOB token ID for the Down/No side, when the venue exposes one.","nullable":true,"type":"string"},"native_ref":{"description":"The venue's ticker (Kalshi) or slug (Polymarket, Limitless).","type":"string"},"native_yes_token":{"description":"On-chain CLOB token ID for the Up/Yes side, when the venue exposes one.","nullable":true,"type":"string"},"quote":{"description":"The listing's indicative quote: our one-minute poll capture of the venue's\nprice (`observed_at` is OUR capture time, never a provider clock). `null`\nwhen the listing is not currently quotable: it is not `upcoming`/`live`, its\nwindow has ended, it has no quote, or the quote is older than 15 minutes.\nIndicative, not executable: `stale` is true once `age_ms` exceeds\n`stale_after_ms` (150 s for 5m/15m, 300 s for 1h, 600 s for 1d).\n","nullable":true,"properties":{"age_ms":{"minimum":0,"type":"integer"},"down":{"format":"double","maximum":1,"minimum":0,"type":"number"},"observed_at":{"format":"date_time","type":"string"},"source":{"enum":["kalshi_bid_ask_mid","kalshi_last","polymarket_clob_mid","polymarket_gamma","limitless_clob_mid","limitless_prices"],"type":"string"},"stale":{"type":"boolean"},"stale_after_ms":{"minimum":0,"type":"integer"},"up":{"format":"double","maximum":1,"minimum":0,"type":"number"}},"required":["up","down","source","observed_at","age_ms","stale_after_ms","stale"],"title":"CryptoWindowQuote","type":"object"},"reference_source":{"description":"The oracle/index this listing resolves against. Two listings of the\nsame window with different reference sources are the\n`same_window_different_reference` match class, not `exact` -- they\ncan and do disagree on start price and result even on a near-flat\nwindow. `binance_usdt_1m_noon` is the Binance USDT 1-minute candle at\n12:00 America/New_York, used by Polymarket's daily up/down markets.\n","enum":["cf_benchmarks_rti","chainlink_twap_60s","binance_usdt_1h_candle","binance_usdt_1m_noon"],"type":"string"},"resolved_at":{"format":"date_time","nullable":true,"type":"string"},"result":{"description":"The venue's own result, passed through unchanged. `null` does not\nmean \"no\": a window whose status is `ended` has not necessarily been\nresolved by the venue yet -- see the result-latency notes on the\nparent window.\n","enum":["up","down","split"],"nullable":true,"type":"string"},"result_revision":{"description":"Increments on every terminal-state correction (including voided -> resolved and back).","minimum":0,"type":"integer"},"settlement_value":{"format":"double","nullable":true,"type":"number"},"start_price":{"format":"double","nullable":true,"type":"number"},"tie_rule":{"enum":["up","split"],"type":"string"},"venue":{"enum":["kalshi","polymarket","limitless"],"type":"string"}},"required":["venue","native_market_id","native_ref","reference_source","tie_rule","family_id","lifecycle","result_revision","last_changed_at"],"title":"CryptoWindowConstituent","type":"object"},"TournamentMatchup":{"description":"A matchup represents a single game or series within a tournament round.\n\nMatchups connect teams/participants with game results, scores, and advancement status.\nEach matchup can be either a single game (elimination) or a series (best-of-N).\n\n## Matchup States\n\n- **Scheduled**: Game/series not yet started\n- **In Progress**: Currently being played\n- **Completed**: Finished with final results\n- **Pending**: Placeholder matchup (e.g., waiting for previous round results)\n\n## Team Information\n\nTeams in matchups include:\n- **team_id**: Our unified team identifier (resolved via identity mapping)\n- **source_id**: Provider's team identifier (before mapping)\n- **seed**: Tournament seed number (1-16 for NCAA, null for non-seeded tournaments)\n- **name/abbreviation**: Team display information\n\n## Winner Determination\n\n- **winner_id**: \"home\", \"away\", or null (if not yet determined)\n- **home_score/away_score**: Final scores (null if game not completed)\n- For series: `series_score` object with home/away wins instead of single game scores\n\n## Event Linking\n\n- **event_id**: Links to actual Event entity (populated when events are created)\n- **matchup_source_id**: Provider's game ID (before event creation)\n- When both exist, `event_id` takes precedence for detailed game data\n","example":{"away_score":72,"away_team":{"abbreviation":"TMB","name":"Team B","seed":16,"source_id":"competitor_67890","team_id":"f1798a7e-4832-4a2c-8cb6-60d5afcb3d41"},"event_id":"a96af633-aee6-48a0-bf72-0865a4419772","home_score":85,"home_team":{"abbreviation":"TMA","name":"Team A","seed":1,"source_id":"competitor_12345","team_id":"e2790078-ec3a-4c45-8dc4-5cf173960b2b"},"matchup_source_id":"event_12345678","position":0,"region":"East","scheduled_time":"2025-03-20T12:00:00Z","series_score":null,"status":"completed","winner_id":"home"},"properties":{"away_score":{"description":"Away team score (null if game not completed or for series rounds)","example":72,"type":"integer"},"away_team":{"description":"Away team information (same structure as home_team)","properties":{"abbreviation":{"type":"string"},"name":{"type":"string"},"seed":{"type":"integer"},"source_id":{"type":"string"},"team_id":{"format":"uuid","type":"string"}},"type":"object"},"event_id":{"description":"Event entity common_model_id (populated when events are created)","example":"a96af633-aee6-48a0-bf72-0865a4419772","format":"uuid","type":"string"},"home_score":{"description":"Home team score (null if game not completed or for series rounds)","example":85,"type":"integer"},"home_team":{"description":"Home team information","properties":{"abbreviation":{"description":"Team abbreviation","type":"string"},"name":{"description":"Team full name","type":"string"},"seed":{"description":"Tournament seed (1-16 for NCAA, null for non-seeded)","type":"integer"},"source_id":{"description":"Provider's team identifier","type":"string"},"team_id":{"description":"Team common_model_id (resolved via identity mapping)","format":"uuid","type":"string"}},"type":"object"},"matchup_source_id":{"description":"Provider's game/series ID (before event entity is created)","example":"event_12345678","type":"string"},"position":{"description":"Position/order of matchup within the round","example":0,"type":"integer"},"region":{"description":"Region/bracket name (for NCAA tournaments: East, West, South, Midwest)","example":"East","type":"string"},"scheduled_time":{"description":"Scheduled start time for the game/series","example":"2025-03-20T12:00:00Z","format":"date-time","type":"string"},"series_score":{"description":"Series score for best-of-series rounds (null for single elimination)","example":{"away":2,"home":4},"properties":{"away":{"description":"Away team wins in series","type":"integer"},"home":{"description":"Home team wins in series","type":"integer"}},"type":"object"},"status":{"description":"Matchup status","enum":["scheduled","in_progress","completed","pending"],"type":"string"},"winner_id":{"description":"Winner designation: 'home', 'away', or null if not determined","enum":["home","away",null],"type":"string"}},"required":["position","home_team","away_team","status"],"title":"TournamentMatchup","type":"object"},"Event":{"description":"A sporting event represents a single game, match, or competition between participants.\n\nEvents are the core entity around which most sports data revolves. They connect teams/players,\ncontain statistics, betting markets, and live game state information. Events can be scheduled\ngames, ongoing matches, or completed competitions.\n\n## Key Relationships\n- **Participants**: Teams (NFL, NBA) or individual players (Golf, Tennis) competing\n- **Statistics**: Player and team performance data (EventScopedStats)\n- **Markets**: Betting opportunities and odds associated with the event\n- **Live Data**: Real-time scores and game state (EventScoreboard)\n- **Plays**: Individual game actions and play-by-play data\n- **Tournament**: Tournament/playoff structure (tournament_id, tournament_round) for bracket reconstruction\n\n## Event Lifecycle\nEvents progress through various states from scheduling to completion. The status field\nindicates the current phase, while EventScoreboard provides live updates during play.\n\n## Status Values\n- `\"scheduled\"` - Future event, not yet started\n- `\"in_progress\"` - Currently being played with live updates\n- `\"completed\"` - Event finished with final results\n- `\"cancelled\"` - Event cancelled and will not be played\n- `\"postponed\"` - Event delayed/rescheduled to future date\n- `\"time_tbd\"` - Scheduled but specific time not yet determined\n\n## Sport Variations\nParticipant structure varies by sport:\n- **Team Sports** (NFL, NBA, NHL): Two teams with home/away designation\n- **Individual Sports** (Golf, Tennis): Multiple individual players\n- **Head-to-Head** (Tennis, Boxing): Two individual competitors\n","example":{"common_model_id":"4af4c296-6fbc-4705-8660-3b587c252e16","image_url":"https://cdn.example.com/photos/events/lakers-warriors.jpg","league_id":"58e8c89b-72f8-4427-adbc-10f193c9b462","participants":"[]","scheduled_start_time":"2017-10-12T12:00:00Z","season_year":2024,"title":"LAL @ GS","week":1},"properties":{"actual_scope":{"description":"Proven native contract scope, independent of the compatibility endpoint.","enum":["event","race","session","tournament","round","season"],"nullable":true,"type":"string"},"common_model_id":{"description":"Unique event identifier in our unified system","type":"string"},"crypto_window":{"description":"Additive detail on a crypto event (`league_id=CRYPTO`). `groups` is a disjoint\npartition by `family_id`: `alignment` is `exact` (two or more distinct venues\nsharing one family: same window, reference source and tie rule, safe to treat as\none contract), or `single_venue`. A Limitless listing whose mirrored Polymarket\nlisting is missing or disagrees is in `unmatched` (`unverified_mirror`) with its own\n`market_id`, never presented as the shared contract. Markets of the same window on a\ndifferent reference (for example Kalshi's CF Benchmarks RTI vs Polymarket/Limitless's\nChainlink 60s TWAP) are other `market_id`s on the same event, listed per odds row in\n`reference_alignment.different_reference_market_ids`; they can disagree on start price\nand result even on a near-flat window.\n","properties":{"asset":{"enum":["BTC","ETH","SOL","DOGE"],"type":"string"},"groups":{"items":{"properties":{"alignment":{"enum":["exact","single_venue"],"type":"string"},"constituents":{"description":"Present on `/v1/events/{id}` only; list responses omit the constituent detail.","items":{"description":"One venue's native listing for a crypto window: its native IDs\n(`native_market_id`, `native_ref`, and `native_yes_token`/`native_no_token`\nwhen the venue exposes on-chain tokens) and, while the listing is quotable,\nan indicative `quote` from our one-minute poll. `result`/`resolved_at`/\n`end_price` are a pass-through of the venue's own settlement, never a\nSportsStack determination. Clients that need executable prices stream order\nbooks from the venue directly using the native IDs.\n","properties":{"end_price":{"format":"double","nullable":true,"type":"number"},"family_id":{"description":"Shared by every listing with the same window, reference source and tie rule.","format":"uuid","type":"string"},"last_changed_at":{"description":"Fetch time of the feed file that last changed this listing.","format":"date_time","type":"string"},"lifecycle":{"enum":["upcoming","live","closed","resolved","voided"],"type":"string"},"mirror_of":{"description":"For a Limitless listing, the Polymarket slug it mirrors.","nullable":true,"type":"string"},"native_market_id":{"description":"The venue's native market ID.","type":"string"},"native_no_token":{"description":"On-chain CLOB token ID for the Down/No side, when the venue exposes one.","nullable":true,"type":"string"},"native_ref":{"description":"The venue's ticker (Kalshi) or slug (Polymarket, Limitless).","type":"string"},"native_yes_token":{"description":"On-chain CLOB token ID for the Up/Yes side, when the venue exposes one.","nullable":true,"type":"string"},"quote":{"description":"The listing's indicative quote: our one-minute poll capture of the venue's\nprice (`observed_at` is OUR capture time, never a provider clock). `null`\nwhen the listing is not currently quotable: it is not `upcoming`/`live`, its\nwindow has ended, it has no quote, or the quote is older than 15 minutes.\nIndicative, not executable: `stale` is true once `age_ms` exceeds\n`stale_after_ms` (150 s for 5m/15m, 300 s for 1h, 600 s for 1d).\n","nullable":true,"properties":{"age_ms":{"minimum":0,"type":"integer"},"down":{"format":"double","maximum":1,"minimum":0,"type":"number"},"observed_at":{"format":"date_time","type":"string"},"source":{"enum":["kalshi_bid_ask_mid","kalshi_last","polymarket_clob_mid","polymarket_gamma","limitless_clob_mid","limitless_prices"],"type":"string"},"stale":{"type":"boolean"},"stale_after_ms":{"minimum":0,"type":"integer"},"up":{"format":"double","maximum":1,"minimum":0,"type":"number"}},"required":["up","down","source","observed_at","age_ms","stale_after_ms","stale"],"title":"CryptoWindowQuote","type":"object"},"reference_source":{"description":"The oracle/index this listing resolves against. Two listings of the\nsame window with different reference sources are the\n`same_window_different_reference` match class, not `exact` -- they\ncan and do disagree on start price and result even on a near-flat\nwindow. `binance_usdt_1m_noon` is the Binance USDT 1-minute candle at\n12:00 America/New_York, used by Polymarket's daily up/down markets.\n","enum":["cf_benchmarks_rti","chainlink_twap_60s","binance_usdt_1h_candle","binance_usdt_1m_noon"],"type":"string"},"resolved_at":{"format":"date_time","nullable":true,"type":"string"},"result":{"description":"The venue's own result, passed through unchanged. `null` does not\nmean \"no\": a window whose status is `ended` has not necessarily been\nresolved by the venue yet -- see the result-latency notes on the\nparent window.\n","enum":["up","down","split"],"nullable":true,"type":"string"},"result_revision":{"description":"Increments on every terminal-state correction (including voided -> resolved and back).","minimum":0,"type":"integer"},"settlement_value":{"format":"double","nullable":true,"type":"number"},"start_price":{"format":"double","nullable":true,"type":"number"},"tie_rule":{"enum":["up","split"],"type":"string"},"venue":{"enum":["kalshi","polymarket","limitless"],"type":"string"}},"required":["venue","native_market_id","native_ref","reference_source","tie_rule","family_id","lifecycle","result_revision","last_changed_at"],"title":"CryptoWindowConstituent","type":"object"},"type":"array"},"family_id":{"format":"uuid","type":"string"},"market_id":{"format":"uuid","type":"string"},"reference_source":{"type":"string"},"tie_rule":{"enum":["up","split"],"type":"string"},"venues":{"items":{"type":"string"},"type":"array"}},"required":["market_id","venues","alignment"],"type":"object"},"type":"array"},"horizon":{"enum":["5m","15m","1h","1d"],"type":"string"},"unmatched":{"items":{"properties":{"alignment":{"enum":["unverified_mirror"],"type":"string"},"constituent":{"description":"One venue's native listing for a crypto window: its native IDs\n(`native_market_id`, `native_ref`, and `native_yes_token`/`native_no_token`\nwhen the venue exposes on-chain tokens) and, while the listing is quotable,\nan indicative `quote` from our one-minute poll. `result`/`resolved_at`/\n`end_price` are a pass-through of the venue's own settlement, never a\nSportsStack determination. Clients that need executable prices stream order\nbooks from the venue directly using the native IDs.\n","properties":{"end_price":{"format":"double","nullable":true,"type":"number"},"family_id":{"description":"Shared by every listing with the same window, reference source and tie rule.","format":"uuid","type":"string"},"last_changed_at":{"description":"Fetch time of the feed file that last changed this listing.","format":"date_time","type":"string"},"lifecycle":{"enum":["upcoming","live","closed","resolved","voided"],"type":"string"},"mirror_of":{"description":"For a Limitless listing, the Polymarket slug it mirrors.","nullable":true,"type":"string"},"native_market_id":{"description":"The venue's native market ID.","type":"string"},"native_no_token":{"description":"On-chain CLOB token ID for the Down/No side, when the venue exposes one.","nullable":true,"type":"string"},"native_ref":{"description":"The venue's ticker (Kalshi) or slug (Polymarket, Limitless).","type":"string"},"native_yes_token":{"description":"On-chain CLOB token ID for the Up/Yes side, when the venue exposes one.","nullable":true,"type":"string"},"quote":{"description":"The listing's indicative quote: our one-minute poll capture of the venue's\nprice (`observed_at` is OUR capture time, never a provider clock). `null`\nwhen the listing is not currently quotable: it is not `upcoming`/`live`, its\nwindow has ended, it has no quote, or the quote is older than 15 minutes.\nIndicative, not executable: `stale` is true once `age_ms` exceeds\n`stale_after_ms` (150 s for 5m/15m, 300 s for 1h, 600 s for 1d).\n","nullable":true,"properties":{"age_ms":{"minimum":0,"type":"integer"},"down":{"format":"double","maximum":1,"minimum":0,"type":"number"},"observed_at":{"format":"date_time","type":"string"},"source":{"enum":["kalshi_bid_ask_mid","kalshi_last","polymarket_clob_mid","polymarket_gamma","limitless_clob_mid","limitless_prices"],"type":"string"},"stale":{"type":"boolean"},"stale_after_ms":{"minimum":0,"type":"integer"},"up":{"format":"double","maximum":1,"minimum":0,"type":"number"}},"required":["up","down","source","observed_at","age_ms","stale_after_ms","stale"],"title":"CryptoWindowQuote","type":"object"},"reference_source":{"description":"The oracle/index this listing resolves against. Two listings of the\nsame window with different reference sources are the\n`same_window_different_reference` match class, not `exact` -- they\ncan and do disagree on start price and result even on a near-flat\nwindow. `binance_usdt_1m_noon` is the Binance USDT 1-minute candle at\n12:00 America/New_York, used by Polymarket's daily up/down markets.\n","enum":["cf_benchmarks_rti","chainlink_twap_60s","binance_usdt_1h_candle","binance_usdt_1m_noon"],"type":"string"},"resolved_at":{"format":"date_time","nullable":true,"type":"string"},"result":{"description":"The venue's own result, passed through unchanged. `null` does not\nmean \"no\": a window whose status is `ended` has not necessarily been\nresolved by the venue yet -- see the result-latency notes on the\nparent window.\n","enum":["up","down","split"],"nullable":true,"type":"string"},"result_revision":{"description":"Increments on every terminal-state correction (including voided -> resolved and back).","minimum":0,"type":"integer"},"settlement_value":{"format":"double","nullable":true,"type":"number"},"start_price":{"format":"double","nullable":true,"type":"number"},"tie_rule":{"enum":["up","split"],"type":"string"},"venue":{"enum":["kalshi","polymarket","limitless"],"type":"string"}},"required":["venue","native_market_id","native_ref","reference_source","tie_rule","family_id","lifecycle","result_revision","last_changed_at"],"title":"CryptoWindowConstituent","type":"object"},"market_id":{"format":"uuid","type":"string"},"reason":{"enum":["mirror_counterpart_missing","mirror_terms_disagree"],"type":"string"},"venues":{"items":{"type":"string"},"type":"array"}},"required":["market_id","alignment","reason"],"type":"object"},"type":"array"},"window_end":{"format":"date_time","type":"string"},"window_start":{"format":"date_time","type":"string"}},"required":["asset","horizon","window_start","window_end","groups","unmatched"],"title":"CryptoEventWindow","type":"object"},"event_scoreboard":{"description":"Live event status with real-time scores, period, and game state information.\n\nContains dynamic/live game data that updates throughout the event. For comprehensive\nsport-specific details and field explanations, see the EventScoreboard model documentation.\n\n## Core Fields\n- **Basic Info**: sport, league, event_id\n- **Game State**: period, time_on_clock, period_half (sport-specific), status\n- **Scoring**: home_score, away_score (for team sports), periods (linescore)\n- **Details**: Sport-specific data in JSONB format\n- **Freshness**: response_received_at — when the provider observed this state\n- **Serving provenance** (additive): observed_at, served_at, source_rank — which provider\n  row was served, its rank in the live primary order, and why it won\n\n## Rendering a live clock\n`time_on_clock` is a point-in-time observation, not a ticking value; we refresh\nit as fast as the provider reports it. To render a smooth clock, tick locally\nfrom `time_on_clock` using `response_received_at` as the anchor and resync on\neach response. For timed sports `details.clock_running` says whether the clock\nshould be advancing — `null` means the provider did not tell us, which is\ndistinct from a known-stopped clock.\n\n## Period Numbering by Sport\n- **Football**: 1-4 (quarters), 5+ (overtime)\n- **Basketball**: 1-4 (quarters), 5+ (overtime)\n- **Baseball**: 1-9+ (innings)\n- **Hockey**: 1-3 (periods), 4+ (overtime)\n- **Golf**: 1-4 (rounds)\n","example":{"away_score":10,"common_model_id":"123e4567-e89b-12d3-a456-426614174000","details":{"away_timeouts":2,"distance":8,"down":2,"home_timeouts":3,"possession_team_id":"123e4567-e89b-12d3-a456-426614174002","red_zone":false,"wall_clock":"2024-01-15T15:32:08Z","yard_line":35},"event_id":"123e4567-e89b-12d3-a456-426614174001","home_score":14,"inserted_at":"2024-01-15T15:30:00Z","league":"NFL","observed_at":"2024-01-15T15:32:09Z","period":2,"response_received_at":"2024-01-15T15:32:10Z","served_at":"2024-01-15T15:32:11Z","source_rank":{"provider":"sportsstack","rank":null,"reason":null},"sport":"football","status":"in_progress","time_on_clock":"14:30","updated_at":"2024-01-15T15:32:15Z"},"properties":{"away_score":{"description":"Away team total score (null for individual sports like golf)","example":10,"type":"integer"},"common_model_id":{"description":"Event Status ID","format":"uuid","type":"string"},"details":{"additionalProperties":true,"description":"Sport-specific game state for a served scoreboard. Two formats exist.\n\n## Current format (what is served today)\n\nThe keys, nesting and value types of `details` depend on the data source that\nprovided the scoreboard row. For one event, `details` can be an object from one\nsource and `null` from another, and a key can be absent, `null` or populated\ndepending on the source. Treat every field as optional. Responses in this format\ndo not contain `details_version`. The property list below describes the keys that\ncan appear; not every source provides every key, and the same key can have a\ndifferent shape for different sources.\n\n## Current format reference\n\n### Dynamic game state\nThe details field contains live, sport-specific information that changes throughout\nthe game. Unlike static event information, this data updates in real-time as the\ngame progresses.\n\n### Sport-specific structures\nEach sport has its own set of relevant game state data:\n\n#### Football (Flattened Fields)\n- **Game State**: down, distance, yard_line, possession_team_id, red_zone, goal_to_go\n- **Clock Management**: play_clock, game_clock, clock_running, two_minute_warning, inside_two_minutes\n- **Timeouts**: home_timeouts, away_timeouts\n- **Weather (Flattened)**: weather_temperature, weather_condition, weather_wind_speed, weather_wind_direction, weather_humidity, weather_precipitation, wind_affecting_kicking, precipitation\n- **Analytics**: field_goal_range, touchdown_probability, turnover_on_downs_risk\n- **Game Info**: attendance, neutral_site, duration\n\n#### Basketball (Flattened Fields)\n- **Clock State**: shot_clock, shot_clock_running, game_clock, clock_running\n- **Fouls & Bonus**: home_team_fouls, away_team_fouls, home_bonus, away_bonus, home_double_bonus, away_double_bonus\n- **Timeouts**: home_timeouts, away_timeouts\n- **Free Throws (Flattened)**: free_throw_shooter_id, free_throw_shooter_name, free_throw_shots_awarded, free_throw_shots_made, free_throw_shots_attempted, free_throw_technical_foul, free_throw_flagrant_foul, free_throw_and_one, free_throw_clear_path_foul, free_throw_bonus_situation, free_throw_current_attempt\n- **Game Flow**: intermission, overtime_number, last_play, last_score_team_id, last_score_time, possession_arrow\n- **Analytics**: pace, lead_changes, times_tied, home_biggest_lead, away_biggest_lead, home_shooting_foul_trouble, away_shooting_foul_trouble\n- **Game Info**: attendance\n\n#### Baseball (Flattened Fields)\n- **Count**: balls, strikes, outs\n- **Hitter (Flattened)**: hitter_id, hitter_full_name, hitter_ab_over, hitter_outcome_id\n- **Pitcher (Flattened)**: pitcher_id, pitcher_full_name, pitcher_pitch_speed, pitcher_pitch_type, pitcher_pitch_x, pitcher_pitch_y, pitcher_pitch_zone\n- **Baserunners**: runners_on_base (array of maps), runners_count\n\n#### Hockey (Flattened Fields)\n- **Power Play**: man_advantage, power_play_time_remaining, home_on_power_play, away_on_power_play, penalty_kill_percentage\n- **Goalies**: home_goalie_pulled, away_goalie_pulled, empty_net, home_goalie_id, away_goalie_id\n- **Clock**: game_clock, clock_running, intermission, overtime_type\n- **Shootout**: in_shootout, shootout_round, home_shootout_goals, away_shootout_goals, shootout_attempts, shootout_attempts_count\n- **Penalties**: active_penalties (array of maps), active_penalties_count\n- **Game Flow**: last_faceoff_winner, faceoff_location, last_goal_time, last_goal_team_id, last_penalty_time\n- **Team Stats**: shots_on_goal_home, shots_on_goal_away, face_off_wins_home, face_off_wins_away, hits_home, hits_away, blocked_shots_home, blocked_shots_away\n\n#### Soccer (Flattened Fields)\n- **State**: match_status (`first_half`, `halftime`, `second_half`, `extra_time_first_half`, `extra_time_second_half`, `penalties`, `ended`; `not_started` and `postponed` also occur in both formats), match_minute (elapsed clock, `\"MM:SS\"`, stoppage time excluded)\n- **Stoppage Time**: added_time_announced, added_time_played (`\"MM:SS\"`)\n- **Cards**: home_yellow_cards, away_yellow_cards, home_red_cards, away_red_cards (red cards include second-yellow dismissals)\n- **Substitutions**: home_substitutions, away_substitutions\n- **Team Stats**: home_possession, away_possession (percent, 0-100), home_shots, away_shots, home_shots_on_target, away_shots_on_target, home_corners, away_corners\n- **Shootout**: shootout (`{home_score, away_score}`), present only once a penalty shootout has been reached\n- **Regulation Score**: regulation_score (`{home_score, away_score}`), the 90-minute score, present only once a match goes past regulation (top-level `home_score`/`away_score` include extra time but not the shootout)\n\n#### Golf (Embedded Objects)\n- **Tournament State**: round_number, total_rounds, holes_completed, current_hole, cut_line, cut_made, playoff_status, playoff_type, tournament_complete\n- **Course Conditions**: par_for_course, course_length, wind_speed, wind_direction, temperature, weather_condition, course_conditions\n- **Field Info**: field_size, players_made_cut, scoring_average\n- **Leaders**: driving_distance_leader, greens_in_regulation_leader, putting_average_leader\n- **Detailed Data**: leaderboard (array), featured_players (array), featured_hole (object)\n\n### Data structure strategy\nMost fields are flattened, with nested objects used where noted.\n\n### Array fields for complex data\nSome complex data structures use arrays of maps:\n- **runners_on_base**: Baseball baserunner positions and details (array of maps)\n- **active_penalties**: Hockey penalty details and timing information (array of maps)\n- **shootout_attempts**: Hockey shootout attempt details (array of maps)\n- **leaderboard**: Golf leaderboard entries (array of embedded objects)\n\n## `details_version` 1 format (selected per account)\n\nAccounts can be switched to a fixed per-sport format that does not depend on the\ndata source. Until an account is switched it receives the current format. A response\nin the new format is recognised by `details_version` = `1`. The exact keys for each\nsport are the component schemas `ScoreboardDetailsV1Football`,\n`ScoreboardDetailsV1Basketball`, `ScoreboardDetailsV1Baseball`,\n`ScoreboardDetailsV1Hockey` (also used for `ice_hockey`), `ScoreboardDetailsV1Soccer`,\n`ScoreboardDetailsV1Tennis` and `ScoreboardDetailsV1Other`.\n\n1. For every sport except golf and motorsports (see 8), `details` is always a JSON object\n   when a scoreboard is returned; it is never `null`.\n2. For football, basketball, baseball, hockey, ice_hockey, soccer and tennis, every key of that\n   sport's schema is present in every response.\n3. A key whose value is not known is `null`. `null` means \"not reported\". It never\n   stands for `0`, `false`, an empty string or an empty list; those values appear only\n   when the source reported them (an empty string is itself returned as `null`). A\n   source that itself reports a default value, for example a zero count before play\n   starts, has that value passed through: the format does not guess which zeros are\n   real. A baseball runner map in which every base is empty is returned as an empty\n   list with a count of `0`.\n4. Each key has one type. Values are taken from the source, with these normalizations:\n   a source's status text is mapped to the `match_status` values; clock text is read\n   into `match_minute` and the added-time keys; baseball runners that a source gives as\n   a map by base are returned as a list and `runners_count` is computed from it; and the\n   shootout and regulation scores are read from period scores where a source reports\n   them that way. A value that cannot be expressed as the key's type is returned as\n   `null`. That includes: a number that is negative (except temperature and pitch\n   location, which may be negative) or above 1e12; a count that is not a whole JSON\n   integer (text such as `\"2\"`, or any number with a decimal point such as `2.9` or\n   `2.0`) or that is above 1,000,000,000; numeric text in a number key; a possession\n   percentage above 100; a score pair with a side that is negative, above 1,000,000,000\n   or not a whole integer; a runner list or map with an entry that has no valid base,\n   repeats a base, or (in map form) holds a value that is neither text nor empty, in which case the\n   runners are `null` together with their count; a game clock that is not `m:ss` text\n   (minutes of one to three digits, seconds 00-59, and an optional fraction on the\n   seconds), and a soccer match minute or added time that is not exactly `m:ss`;\n   text of the form `prefix:type:value`; and an empty or blank string. Runners are\n   returned in base order. In a runner list, a name that is not text, or that has the\n   `prefix:type:value` form, is left out of that runner and the runner is kept. A\n   runner map by base carries player identifiers, so no names are returned from it; a\n   base that holds blank text counts as empty.\n5. Only the keys listed in the sport's schema are returned. For football, basketball,\n   baseball, hockey, ice_hockey and soccer, every key of that sport in the property list\n   below that does not carry a source identifier is in the schema. Tennis has one key,\n   `retirement_info`, which is not in the property list. Not returned in this format:\n   keys that carry a source identifier (player, team and goalie IDs, and similar), and\n   keys of the current format that are not in the property list (for example nested\n   baseball count and runner details, per-period linescores, match situation and\n   referee detail). Switching an account removes them from its responses.\n6. Changing the data source for an event does not change the key set, the types or the\n   meaning of `null`. Values can change.\n7. The format has no keys that carry a source identifier, and text of the form\n   `prefix:type:value` (one to ten ASCII letters, a colon, ASCII letters or underscores, a colon,\n   then text without whitespace; case-insensitive; surrounding whitespace ignored) is\n   `null`. Free text is not inspected beyond that. `possession_team_id` is a UUID in its\n   36-character text form (returned in lower case) or `null`; it is not checked against\n   the team list. Golf and motorsports are served as stored (see 8) and can contain\n   source identifiers.\n8. Golf and motorsports are not shaped by this format: their `details` are the stored\n   object, carry no `details_version`, and can contain source identifiers (an account\n   that holds no provider-data entitlement may have provider-id values removed from them\n   by a separate step). A scoreboard whose sport is not one of the sports named above,\n   including a sport stored as an identifier instead of a name, is treated as any other\n   sport. Sport names are matched ignoring case and surrounding whitespace (any Unicode space). For any other sport\n   (for example MMA) the object is exactly `{\"details_version\": 1}`.\n\n## When no scoreboard is available\n\nThe scoreboard object is absent as a whole; it is not returned with empty `details`:\n\n* `GET /api/v1/events/{id}/event-scoreboard` and `GET /api/v1/events/{id}/linescore`\n  return `404`.\n* `GET /api/v1/events` and `GET /api/v1/events/{id}` omit `event_scoreboard`.\n* `GET /api/v1/tournaments/{id}/bracket` returns `event_scoreboard: null`.\n\nA scoreboard is returned only from data you are entitled to receive. Data you are not\nentitled to is treated as if it did not exist.\n\nThis is different from an unknown value inside a returned scoreboard, which is a\n`null` key in the `details_version` 1 format.\n","example":{"goal_to_go":false,"away_yellow_cards":1,"runners_count":2,"home_timeouts":2,"match_status":"second_half","weather_wind_speed":8.0,"yard_line":25,"hitter_id":"player-123","possession_team_id":"123e4567-e89b-12d3-a456-426614174002","away_timeouts":3,"home_on_power_play":true,"touchdown_probability":0.35,"added_time_played":"00:00","weather_temperature":45.0,"active_penalties_count":1,"away_corners":2,"wind_affecting_kicking":false,"regulation_score":{"away_score":3,"home_score":0},"away_red_cards":1,"runners_on_base":[{"base":1,"ending_base":2,"id":"player-789"},{"base":3,"ending_base":3,"id":"player-012"}],"pitcher_id":"player-456","pitcher_full_name":"Jane Smith","shootout":{"away_score":4,"home_score":3},"home_substitutions":3,"away_substitutions":2,"added_time_announced":"04:00","home_possession":56,"strikes":1,"away_shots":7,"shots_on_goal_home":15,"home_yellow_cards":2,"balls":2,"home_corners":6,"away_possession":44,"home_shots_on_target":5,"details_version":1,"weather_humidity":65,"neutral_site":false,"attendance":72000,"hitter_full_name":"John Doe","outs":2,"distance":7,"play_clock":25,"inside_two_minutes":false,"away_on_power_play":false,"red_zone":true,"game_clock":"8:42","man_advantage":"5v4","power_play_time_remaining":82,"weather_wind_direction":"NW","two_minute_warning":false,"pitcher_pitch_speed":95.5,"home_red_cards":0,"weather_condition":"clear","down":3,"clock_running":true,"match_minute":"67:12","precipitation":false,"home_shots":11,"shots_on_goal_away":12,"away_shots_on_target":3,"turnover_on_downs_risk":0.15,"active_penalties":[{"major_penalty":false,"penalty_type":"Cross-checking","player_id":"player-789","time_remaining":82}],"field_goal_range":true,"weather_precipitation":false},"properties":{"penalty_kill_percentage":{"description":"Current penalty kill success rate","type":"number"},"holes_completed":{"description":"Holes finished in current round","type":"integer"},"course_conditions":{"description":"Course conditions","type":"string"},"home_biggest_lead":{"description":"Biggest home team lead","type":"integer"},"pitcher_pitch_x":{"description":"Pitch location X coordinate","type":"number"},"shootout_attempts_count":{"description":"Total shootout attempts","type":"integer"},"away_shooting_foul_trouble":{"description":"Away team in foul trouble","type":"boolean"},"goal_to_go":{"description":"Goal line is closer than first down marker","type":"boolean"},"away_yellow_cards":{"description":"Soccer away yellow cards","type":"integer"},"shootout_round":{"description":"Current shootout round","type":"integer"},"runners_count":{"description":"Number of runners on base","type":"integer"},"home_timeouts":{"description":"Home team timeouts remaining","type":"integer"},"wall_clock":{"description":"Provider wall-clock timestamp for the most recent game event","format":"date-time","type":"string"},"home_bonus":{"description":"Home team in bonus situation","type":"boolean"},"match_status":{"description":"Soccer match phase","enum":["first_half","halftime","second_half","extra_time_first_half","extra_time_second_half","penalties","ended"],"type":"string"},"last_play":{"description":"Description of last play","type":"string"},"hitter_ab_over":{"description":"At-bat is complete","type":"boolean"},"weather_wind_speed":{"description":"Wind speed (mph)","type":"number"},"home_double_bonus":{"description":"Home team in double bonus","type":"boolean"},"yard_line":{"description":"Field position (0-100)","type":"integer"},"hitter_id":{"description":"Current batter player ID","type":"string"},"times_tied":{"description":"Number of times tied","type":"integer"},"last_goal_time":{"description":"Time of last goal","type":"string"},"home_goalie_pulled":{"description":"Home goalie pulled","type":"boolean"},"lead_changes":{"description":"Number of lead changes","type":"integer"},"tournament_complete":{"description":"Tournament finished","type":"boolean"},"possession_team_id":{"description":"Common-model team ID with possession","format":"uuid","type":"string"},"wind_direction":{"description":"Wind direction","type":"string"},"away_timeouts":{"description":"Away team timeouts remaining","type":"integer"},"free_throw_shots_awarded":{"description":"Number of free throws awarded","type":"integer"},"home_on_power_play":{"description":"Home team on power play","type":"boolean"},"home_team_fouls":{"description":"Home team fouls this period/half","type":"integer"},"touchdown_probability":{"description":"Probability of touchdown (0.0-1.0)","type":"number"},"added_time_played":{"description":"Soccer stoppage time played so far in the current period (MM:SS)","example":"01:26","type":"string"},"weather_temperature":{"description":"Temperature (Fahrenheit)","type":"number"},"duration":{"description":"Game duration","type":"string"},"overtime_type":{"description":"Type of overtime","enum":["3v3","4v4","shootout"],"type":"string"},"course_length":{"description":"Course length in yards","type":"integer"},"shot_clock_running":{"description":"Whether shot clock is running","type":"boolean"},"active_penalties_count":{"description":"Number of active penalties","type":"integer"},"current_hole":{"description":"Hole currently being played","type":"integer"},"away_corners":{"description":"Soccer away corner kicks","type":"integer"},"wind_affecting_kicking":{"description":"Wind affecting field goals/punts","type":"boolean"},"regulation_score":{"description":"Soccer 90-minute score. Present only once a match goes past regulation (extra time).","properties":{"away_score":{"type":"integer"},"home_score":{"type":"integer"}},"type":"object"},"free_throw_clear_path_foul":{"description":"Free throws from clear path foul","type":"boolean"},"hits_home":{"description":"Home team hits","type":"integer"},"shootout_attempts":{"description":"Shootout attempts with details","items":{"properties":{"goalie_id":{"description":"Goalie player ID","type":"string"},"is_deciding_goal":{"description":"Was the deciding goal","type":"boolean"},"result":{"description":"Shot result","type":"string"},"round":{"description":"Shootout round","type":"integer"},"shooter_id":{"description":"Shooter player ID","type":"string"},"shooter_name":{"description":"Shooter name","type":"string"},"shooter_team_id":{"description":"Shooter's team","type":"string"}},"type":"object"},"type":"array"},"playoff_type":{"description":"Type of playoff","enum":["sudden_death","aggregate","match_play"],"type":"string"},"away_red_cards":{"description":"Soccer away red cards (includes second-yellow dismissals)","type":"integer"},"free_throw_current_attempt":{"description":"Current free throw attempt number","type":"integer"},"runners_on_base":{"description":"Baserunners with positions and details","items":{"properties":{"base":{"description":"Starting base (1, 2, 3)","type":"integer"},"ending_base":{"description":"Ending base after play","type":"integer"},"full_name":{"description":"Runner name, when known","type":"string"},"id":{"description":"Player ID","type":"string"}},"type":"object"},"type":"array"},"cut_made":{"description":"Has cut been applied","type":"boolean"},"pitcher_id":{"description":"Current pitcher player ID","type":"string"},"pitcher_full_name":{"description":"Current pitcher name","type":"string"},"shootout":{"description":"Soccer penalty shootout score. Present only once penalties are reached.","properties":{"away_score":{"type":"integer"},"home_score":{"type":"integer"}},"type":"object"},"faceoff_location":{"description":"Location of last faceoff","type":"string"},"home_substitutions":{"description":"Soccer home substitutions made","type":"integer"},"wind_speed":{"description":"Wind speed (mph)","type":"number"},"shot_clock":{"description":"Shot clock seconds remaining","type":"integer"},"away_substitutions":{"description":"Soccer away substitutions made","type":"integer"},"pitcher_pitch_zone":{"description":"Strike zone location","type":"integer"},"added_time_announced":{"description":"Soccer stoppage time announced by the fourth official (MM:SS)","example":"02:00","type":"string"},"free_throw_technical_foul":{"description":"Free throws from technical foul","type":"boolean"},"home_possession":{"description":"Soccer home ball possession percentage","maximum":100,"minimum":0,"type":"number"},"putting_average_leader":{"description":"Putting average leader player ID","type":"string"},"home_shooting_foul_trouble":{"description":"Home team in foul trouble","type":"boolean"},"strikes":{"description":"Strike count (0-2)","type":"integer"},"greens_in_regulation_leader":{"description":"GIR leader player ID","type":"string"},"away_biggest_lead":{"description":"Biggest away team lead","type":"integer"},"face_off_wins_away":{"description":"Away team faceoff wins","type":"integer"},"last_goal_team_id":{"description":"Team that scored last goal","type":"string"},"away_double_bonus":{"description":"Away team in double bonus","type":"boolean"},"away_shots":{"description":"Soccer away total shots","type":"integer"},"temperature":{"description":"Temperature (Fahrenheit)","type":"integer"},"last_penalty_time":{"description":"Time of last penalty","type":"string"},"last_score_team_id":{"description":"Team that scored last","type":"string"},"free_throw_and_one":{"description":"And-one free throw situation","type":"boolean"},"shots_on_goal_home":{"description":"Home team shots on goal","type":"integer"},"home_yellow_cards":{"description":"Soccer home yellow cards","type":"integer"},"free_throw_flagrant_foul":{"description":"Free throws from flagrant foul","type":"boolean"},"in_shootout":{"description":"Currently in shootout","type":"boolean"},"playoff_status":{"description":"Tournament in playoff","type":"boolean"},"away_goalie_id":{"description":"Current away goalie player ID","type":"string"},"balls":{"description":"Ball count (0-3)","type":"integer"},"home_corners":{"description":"Soccer home corner kicks","type":"integer"},"home_shootout_goals":{"description":"Home team shootout goals","type":"integer"},"pitcher_pitch_type":{"description":"Last pitch type","type":"string"},"away_possession":{"description":"Soccer away ball possession percentage","maximum":100,"minimum":0,"type":"number"},"scoring_average":{"description":"Current round scoring average","type":"number"},"empty_net":{"description":"Empty net situation","type":"boolean"},"home_shots_on_target":{"description":"Soccer home shots on target","type":"integer"},"away_bonus":{"description":"Away team in bonus situation","type":"boolean"},"details_version":{"description":"Version of the details contract. Present and `1` in the contract format; absent in legacy provider-shaped objects.","example":1,"type":"integer"},"weather_humidity":{"description":"Humidity percentage","type":"integer"},"neutral_site":{"description":"Neutral site game","type":"boolean"},"free_throw_shots_made":{"description":"Free throws made so far","type":"integer"},"attendance":{"description":"Game attendance","type":"integer"},"total_rounds":{"description":"Total tournament rounds","type":"integer"},"hitter_full_name":{"description":"Current batter name","type":"string"},"pace":{"description":"Possessions per 48 minutes","type":"number"},"outs":{"description":"Outs in inning (0-2)","type":"integer"},"round_number":{"description":"Current round (1-4+)","type":"integer"},"free_throw_shooter_name":{"description":"Name of free throw shooter","type":"string"},"cut_line":{"description":"Score needed to make cut","type":"integer"},"distance":{"description":"Yards to go for first down","type":"integer"},"free_throw_shooter_id":{"description":"Player ID shooting free throws","type":"string"},"field_size":{"description":"Total number of players","type":"integer"},"play_clock":{"description":"Seconds on play clock","type":"integer"},"hits_away":{"description":"Away team hits","type":"integer"},"inside_two_minutes":{"description":"Less than two minutes remaining","type":"boolean"},"driving_distance_leader":{"description":"Driving distance leader player ID","type":"string"},"home_goalie_id":{"description":"Current home goalie player ID","type":"string"},"intermission":{"description":"Between periods/halves","type":"boolean"},"hitter_outcome_id":{"description":"At-bat outcome identifier","type":"string"},"blocked_shots_away":{"description":"Away team blocked shots","type":"integer"},"away_on_power_play":{"description":"Away team on power play","type":"boolean"},"last_faceoff_winner":{"description":"Team that won last faceoff","enum":["home","away"],"type":"string"},"red_zone":{"description":"In red zone (20 yards or less)","type":"boolean"},"game_clock":{"description":"Current game clock time","type":"string"},"man_advantage":{"description":"Current man advantage (e.g., '5v4', 'even')","type":"string"},"blocked_shots_home":{"description":"Home team blocked shots","type":"integer"},"away_goalie_pulled":{"description":"Away goalie pulled","type":"boolean"},"power_play_time_remaining":{"description":"Seconds remaining on power play","type":"integer"},"weather_wind_direction":{"description":"Wind direction","type":"string"},"players_made_cut":{"description":"Players making the cut","type":"integer"},"par_for_course":{"description":"Course par","type":"integer"},"two_minute_warning":{"description":"Two minute warning called","type":"boolean"},"pitcher_pitch_speed":{"description":"Last pitch speed (mph)","type":"number"},"possession_arrow":{"description":"Possession arrow (college)","enum":["home","away"],"type":"string"},"away_shootout_goals":{"description":"Away team shootout goals","type":"integer"},"free_throw_shots_attempted":{"description":"Free throws attempted so far","type":"integer"},"home_red_cards":{"description":"Soccer home red cards (includes second-yellow dismissals)","type":"integer"},"weather_condition":{"description":"Weather condition","type":"string"},"away_team_fouls":{"description":"Away team fouls this period/half","type":"integer"},"pitcher_pitch_y":{"description":"Pitch location Y coordinate","type":"number"},"down":{"description":"Current down (1-4)","type":"integer"},"last_score_time":{"description":"When last score occurred","type":"string"},"clock_running":{"description":"Whether game clock is running","type":"boolean"},"overtime_number":{"description":"Which overtime period","type":"integer"},"match_minute":{"description":"Soccer elapsed match clock as MM:SS (stoppage time excluded). Tick locally between updates.","example":"45:00","type":"string"},"precipitation":{"description":"Active precipitation","type":"boolean"},"home_shots":{"description":"Soccer home total shots","type":"integer"},"shots_on_goal_away":{"description":"Away team shots on goal","type":"integer"},"away_shots_on_target":{"description":"Soccer away shots on target","type":"integer"},"turnover_on_downs_risk":{"description":"Probability of turnover on downs (0.0-1.0)","type":"number"},"active_penalties":{"description":"Currently active penalties with details","items":{"properties":{"duration":{"description":"Penalty duration in minutes","type":"integer"},"major_penalty":{"description":"Is major penalty","type":"boolean"},"misconduct":{"description":"Is misconduct penalty","type":"boolean"},"penalty_start_time":{"description":"When penalty started","type":"string"},"penalty_type":{"description":"Type of penalty","type":"string"},"player_id":{"description":"Penalized player ID","type":"string"},"player_name":{"description":"Penalized player name","type":"string"},"team_id":{"description":"Team of penalized player","type":"string"},"time_remaining":{"description":"Time remaining in seconds","type":"integer"}},"type":"object"},"type":"array"},"field_goal_range":{"description":"Within field goal range","type":"boolean"},"free_throw_bonus_situation":{"description":"Free throws from bonus","type":"boolean"},"weather_precipitation":{"description":"Is it precipitating","type":"boolean"},"face_off_wins_home":{"description":"Home team faceoff wins","type":"integer"}},"type":"object"},"event_id":{"description":"Event ID","format":"uuid","type":"string"},"home_score":{"description":"Home team total score (null for individual sports like golf)","example":14,"type":"integer"},"inserted_at":{"description":"Creation timestamp","format":"date-time","type":"string"},"league":{"description":"League abbreviation","example":"NFL","type":"string"},"observed_at":{"description":"Provider observation time of the served row (the elected row's own observation; unlike response_received_at it is never taken from a clock donor). Null when unknown.","example":"2024-01-15T15:32:09Z","format":"date-time","nullable":true,"type":"string"},"period":{"description":"Current period/quarter/inning (1-based, sport-specific numbering)","example":2,"type":"integer"},"period_half":{"description":"Period subdivision (e.g., 'top'/'bottom' for baseball innings)","enum":["top","bottom"],"example":"bottom","type":"string"},"period_half_over":{"description":"Whether the current period half is complete","type":"boolean"},"periods":{"description":"Per-period linescore, in period order. This is what `/v1/events/{id}/linescore` returns.","example":[{"away_score":3,"home_score":7,"number":1,"type":"regular_period"}],"items":{"additionalProperties":true,"type":"object"},"type":"array"},"response_received_at":{"description":"When we received this state from the upstream provider. This is the observation time, and it is the field to use to judge freshness or to interpolate a running clock — `updated_at` is a storage timestamp and moves even when the observation did not.","example":"2024-01-15T15:32:10Z","format":"date-time","type":"string"},"served_at":{"description":"When this response was assembled (UTC, whole seconds).","example":"2024-01-15T15:32:11Z","format":"date-time","nullable":true,"type":"string"},"source_rank":{"description":"Which provider's row was served and why it was chosen. `provider` is the provider family (`sportsstack` for a canonical row, whose backing vendor is not disclosed); `rank` is its position in the league's live primary order (0 = primary, null = outside the order or canonical); `reason` is `primary` (highest-ranked provider present), `fallback_stale` (a higher-ranked provider's row was older than the stale window), `single_provider` (only one provider reported), `freshest` (a fresher lower-ranked row was served), or null when the election's candidates are not visible to the tenant.","nullable":true,"properties":{"provider":{"example":"sportsstack","type":"string"},"rank":{"example":0,"nullable":true,"type":"integer"},"reason":{"enum":["primary","fallback_stale","single_provider","freshest"],"nullable":true,"type":"string"}},"type":"object"},"sport":{"description":"Sport name","enum":["football","basketball","baseball","hockey","ice_hockey","soccer","golf"],"example":"football","type":"string"},"status":{"description":"Lifecycle state of the event as reported by the provider (e.g. 'live', 'in_progress', 'halftime', 'closed', 'final'). Values are provider vocabulary and are not normalized across providers — use this to tell a live scoreboard from a finished one, not for settlement decisions.","example":"in_progress","type":"string"},"time_on_clock":{"description":"Time remaining in period - format varies by sport (MM:SS for timed sports, null for baseball/golf)","example":"14:30","type":"string"},"updated_at":{"description":"Last update timestamp","format":"date-time","type":"string"}},"required":["common_model_id","event_id","sport","league"],"title":"EventStatus","type":"object"},"image_url":{"description":"Event promotional image or logo","type":"string"},"league_id":{"description":"League/competition this event belongs to","type":"string"},"market_count":{"description":"Number of distinct open markets (provider status active; suspended, closed, settled and unknown statuses are not counted) for this event, in sources visible to the tenant (the visibility `GET /markets` applies); each market counts once across venues. Finished events report 0. An open market is not necessarily priced right now. null means the count could not be computed right now (never 0). Present on `GET /events`.","minimum":0,"nullable":true,"type":"integer"},"market_counts_by_venue":{"additionalProperties":{"minimum":0,"type":"integer"},"description":"Per-venue (aggregator, e.g. `polymarket`, `kalshi`, `prophetx`, `predict_fun`, `limitless`, `polymarket_us`, `sxbet`) breakdown of `market_count`, with the same rules. Venues with no open market are omitted. Values can sum to more than `market_count`. null means the count could not be computed right now. Present on `GET /events`.","nullable":true,"type":"object"},"metadata":{"additionalProperties":true,"description":"Provider-specific event metadata. Playoff-series and named games expose `subtitle`, a short label such as `\"Game 3\"`, `\"Monday Night Football\"` or `\"AFC Championship\"`; where the game is part of a best-of series, `series_game_number` (1-9) and, when a provider states it, `series_games_total` are also present. The game number does not change when a game is rescheduled. UFC bout events expose `card_ufcstats_id` and, once completed, `result` with parsed `method`, `details`, `end_round`, `end_time`, `time_format`, and `referee`. For FIFA-family tournament events (FIFA World Cup, Women's World Cup, Club World Cup, U20, U17), these keys are emitted in addition to any existing provider fields:\n\n- `round` — verbatim provider round object. Group stage: `{number: <matchday>}`. Knockout: `{name: <snake_case>, cup_round_id: <sr_id>, type: <round_type>}`. Present on all soccer events (backward-compatible).\n- `round_name` — human-readable round display string. Group stage: `\"Round 1\" | \"Round 2\" | \"Round 3\"`. Knockout: `\"Round of 32\" | \"Round of 16\" | \"Quarterfinals\" | \"Semifinals\" | \"3rd Place Playoff\" | \"Final\"`. FIFA-family only.\n- `stage` — the stage object this event belongs to: `{order, type, phase, start_date, end_date, year}`. `type` is `\"league\"` for group stage, `\"cup\"` for knockouts. FIFA-family only.\n- `group` — for FIFA group-stage events only: `{id, name, group_name}` where `group_name` is the short label (`\"A\"`, `\"B\"`, etc.).\n- `cup_round_id` — for FIFA knockout events only: stable provider identifier shared by all matches in the same cup round. Use this to group the 4 quarterfinal matches, the 2 semifinals, etc. Final and 3rd Place Playoff have distinct `cup_round_id`s despite sharing the same `stage`.\n\nNon-FIFA soccer events (MLS, EPL, UEFA, etc.) only carry `metadata.round` from the provider.","type":"object"},"participant_type":{"description":"Participant shape classification for the event: 'team_v_team' for team sports, 'player_v_player' for individual head-to-head, 'players_v_players' for side-vs-side player groups, or 'players_pool' for pooled field formats.","enum":["team_v_team","player_v_player","players_v_players","players_pool"],"type":"string"},"participants":{"description":"Competing entities - teams for team sports, individual players for individual sports","items":{"properties":{"id":{"description":"Participant common_model_id (references the corresponding Team or Player)","format":"uuid","type":"string"},"is_home":{"description":"true if home team/player, false if away (null for neutral sites)","type":"boolean"},"points":{"description":"Participant's score in this event. Sport-specific semantics: for team sports with a single numeric score (NBA/NFL/MLB/NHL/soccer) this is the score (goals for soccer). This is NOT FIFA match result points (3-1-0). For FIFA/soccer standings points, query GET /api/v1/standings?league_id=<id>&season_year=<yr>&primary_group_type=group and read ranking_points. On knockout matches tournament_round is populated and points continues to reflect the score (extra time/penalties result available via event_scoreboard).","type":"integer"},"team":{"description":"Tenant-visible team details when type=team. team.id matches the participant id.","properties":{"abbreviation":{"type":"string"},"id":{"format":"uuid","type":"string"},"image_url":{"type":"string"},"market":{"type":"string"},"name":{"type":"string"},"nickname":{"type":"string"}},"type":"object"},"type":{"description":"Entity type: 'team' or 'player'","type":"string"}},"type":"object"},"type":"array"},"scheduled_start_time":{"description":"When the event is scheduled to begin (ISO 8601 UTC timestamp)","format":"date-time","type":"string"},"season_id":{"description":"Season Common Model ID. For UFC bouts, this is the UFC fight-card season ID; metadata.card_ufcstats_id carries the provider card identifier when available.","format":"uuid","type":"string"},"season_type":{"description":"Season phase: 'PRE' (preseason), 'REG' (regular), 'POST' (playoffs), 'IST' (in-season tournament), 'PIT' (play-in tournament), 'SC' (showcase cup), 'EX' (exhibition), 'CC' (commissioners cup), 'CT' (conference tournament), 'ALL_STAR' (all-star)","type":"string"},"season_type_agnostic_week":{"description":"Week number agnostic of season type (only for NFL/NCAAF). This is a continuous week number across the entire season: regular season weeks are 1-18 (NFL) or 1-16 (NCAAF), and postseason weeks continue from there (e.g., NFL postseason week 1 = 19, week 2 = 20, etc.). This field is only present for NFL and NCAAF events.","type":"integer"},"season_year":{"description":"Calendar year the season primarily takes place","type":"integer"},"source_mappings_by_source":{"additionalProperties":{"properties":{"event":{"description":"Event mapping rows for event endpoints.","items":{"properties":{"common_model_id":{"format":"uuid","type":"string"},"deprecated_at":{"format":"date-time","nullable":true,"type":"string"},"entity_type":{"type":"string"},"id_scheme":{"type":"string"},"ignored_pending":{"type":"boolean"},"league":{"type":"string"},"match_status":{"type":"string"},"overmapped_allowed":{"type":"boolean"},"provider":{"type":"string"},"source":{"type":"string"},"source_id":{"type":"string"},"tenant_id":{"format":"uuid","nullable":true,"type":"string"},"updated_at":{"format":"date-time","type":"string"}},"type":"object"},"type":"array"},"mappings":{"description":"Source mapping rows for non-event entity endpoints.","items":{"properties":{"common_model_id":{"format":"uuid","type":"string"},"deprecated_at":{"format":"date-time","nullable":true,"type":"string"},"entity_type":{"type":"string"},"id_scheme":{"type":"string"},"ignored_pending":{"type":"boolean"},"league":{"type":"string"},"match_status":{"type":"string"},"overmapped_allowed":{"type":"boolean"},"provider":{"type":"string"},"source":{"type":"string"},"source_id":{"type":"string"},"tenant_id":{"format":"uuid","nullable":true,"type":"string"},"updated_at":{"format":"date-time","type":"string"}},"type":"object"},"type":"array"},"participants":{"description":"Participant mapping rows for event endpoints.","items":{"properties":{"common_model_id":{"format":"uuid","type":"string"},"deprecated_at":{"format":"date-time","nullable":true,"type":"string"},"entity_type":{"type":"string"},"id_scheme":{"type":"string"},"ignored_pending":{"type":"boolean"},"league":{"type":"string"},"match_status":{"type":"string"},"overmapped_allowed":{"type":"boolean"},"participant_id":{"format":"uuid","type":"string"},"participant_role":{"type":"string"},"participant_side":{"enum":["home","away","neutral","unknown"],"type":"string"},"provider":{"type":"string"},"source":{"type":"string"},"source_id":{"type":"string"},"tenant_id":{"format":"uuid","nullable":true,"type":"string"},"updated_at":{"format":"date-time","type":"string"}},"type":"object"},"type":"array"},"unmapped_participants":{"description":"Event participants that could not be emitted as source mappings because they were placeholders/TBD or lacked a mapping for the requested source.","items":{"properties":{"display_name":{"type":"string"},"participant_id":{"type":"string"},"participant_role":{"type":"string"},"participant_side":{"enum":["home","away","neutral","unknown"],"type":"string"},"reason":{"enum":["placeholder_or_tbd","missing_source_mapping"],"type":"string"}},"type":"object"},"type":"array"}},"type":"object"},"description":"Optional enterprise mapping enrichment keyed by full normalized source. Added when include_source_mappings_by_source=true.","type":"object"},"status":{"description":"Status of the event: 'scheduled', 'in_progress', 'completed', 'cancelled', 'postponed', 'time_tbd'. A live event does not move back to 'scheduled' or 'time_tbd' on one provider's report while another still reports it live; 'completed' is reached when one provider reports a final and 'cancelled' when two do.","enum":["scheduled","in_progress","completed","cancelled","postponed","time_tbd"],"type":"string"},"title":{"description":"Human-readable event name (e.g., 'LAL @ GS', 'Super Bowl LVIII')","type":"string"},"tournament_id":{"description":"Tournament this event belongs to (for tournament/playoff events). Used to reconstruct bracket structure from events.","format":"uuid","type":"string"},"tournament_round":{"description":"Round position within the tournament. Semantics vary by sport: (1) FIFA-family soccer group-stage matches: `0` — the match is part of a tournament group phase. Matchday number (1/2/3) lives in `metadata.round.number` with a humanized string in `metadata.round_name`. (2) FIFA-family soccer knockout matches: `null` — the provider does not expose a sequential round number for knockouts (the 3rd-place playoff and Final share the same stage with distinct cup rounds, and no knockout leads into another). Use `metadata.round_name` for display and `metadata.cup_round_id` as the stable grouping key — the 4 quarterfinal matches share one `cup_round_id`; Final and 3rd Place Playoff have distinct ids. (3) Non-tournament soccer events (MLS regular-season, EPL league match with no cup context): `null` with `tournament_id: null` — not a tournament match. (4) Other tournament sports (NCAAB, etc.): 1-based bracket position aligned with `Tournament.rounds[*].round_number`.","type":"integer"},"weather":{"description":"Weather conditions for outdoor events (affects player performance and betting)","properties":{"condition":{"description":"Weather condition description (e.g., Sunny, Cloudy, Rainy, Snow)","type":"string"},"humidity":{"description":"Humidity percentage (0-100)","type":"integer"},"pressure":{"description":"Atmospheric pressure in hectopascals (hPa)","type":"integer"},"temperature":{"description":"Temperature in Celsius","type":"number"},"wind_direction":{"description":"Cardinal wind direction (N, S, E, W, NE, NW, SE, SW)","type":"string"},"wind_speed":{"description":"Wind speed in kilometers per hour","type":"number"}},"required":["temperature","condition"],"type":"object"},"week":{"description":"Week number within the season (for weekly sports like NFL)","type":"integer"}},"required":["common_model_id","title"],"title":"Event","type":"object"},"Odds":{"description":"Betting odds from a specific sportsbook for a particular outcome, representing the price and probability.\n\n## Odds Standardization\n\nOdds undergo standardization to ensure consistent pricing representation and source attribution:\n\n### Source Selection Name Standardization\nThe `source_selection_name` field identifies what the sportsbook is offering odds on:\n\n#### Total Points Markets\n```\nsource_selection_name: nil  # No specific team/player selection\n```\n\n#### Point Spread Markets\n```\nsource_selection_name: \"Indiana Pacers\"     # Team receiving the spread\n# Derived from event.participants based on outcome selection\n```\n\n#### Moneyline Markets\n```\nsource_selection_name: \"Oklahoma City Thunder\"  # Team to win\n# Derived from event.participants based on outcome selection\n```\n\n### Price Standardization\n- **price**: Standardized to American odds format (-110, +150, etc.)\n- **price_type**: Always \"american\" for consistency\n- **timestamp**: UTC timestamp when current odds were observed. When the\n  response comes from the durable line-summary fallback, this is the time\n  the returned closing price last changed; same-price provider\n  reaffirmations do not advance it.\n\n### Sportsbook Attribution\n- **sportsbook**: Standardized sportsbook name (DraftKings, FanDuel, etc.)\n- **aggregator**: Upstream provider key or `sportsstack` for the canonical SportsStack board\n- **aggregator_event_id**: Provider's event identifier for traceability\n\n### Historical Tracking\nOdds include both current and opening lines for trend analysis:\n- Current odds: Real-time pricing from sportsbooks\n- Opening odds: Initial lines when market opened\n- Movement tracking: Compare current vs opening for line movement insights\n","example":{"aggregator":"sportsstack","aggregator_event_id":null,"fetched_at":"2026-04-21T17:40:00Z","metadata":{"aggregator":"sportsstack","id":"0HC75256377P350_1","link":"https://sportsbook.draftkings.com/event/30568865?outcomes=0HC75256377P350_1","selected_source":"example_provider.football.nfl","selection_reason":"trust_then_freshness","selection_tier":1,"source":"sportsstack","source_event_id":"30568865","source_market_id":"DraftKings-30568865-spreads","sportsstack_kind":"canonical_book_quote"},"price":-110,"price_type":"american","source_event_id":"30568865","source_id":"0HC75256377P350_1","source_market_id":"DraftKings-30568865-spreads","source_selection_id":"0HC75256377P350_1","source_selection_name":"Seattle Seahawks","sportsbook":"draftkings"},"properties":{"aggregator":{"description":"Upstream provider name or 'sportsstack' for the canonical SportsStack sportsbook board","type":"string"},"aggregator_event_id":{"description":"Aggregator event ID","type":"string"},"canonical_outcome_id":{"description":"Verified cross-venue economic outcome ID. Null when outcome equivalence is unresolved, push-capable, three-way, or ambiguous.","format":"uuid","nullable":true,"type":"string"},"clock_provenance":{"properties":{"evaluated_at":{"format":"date-time","type":"string"},"max_age_seconds":{"enum":[300],"type":"integer"},"quote_provenance":{"description":"Unmodified retained JSON provenance, including legacy or malformed evidence.","nullable":true},"source":{"enum":["timestamp",null],"nullable":true,"type":"string"}},"type":"object"},"common_model_id":{"description":"Market ID","type":"string"},"deep_link":{"description":"Desktop sportsbook deep link URL","type":"string"},"execution_readiness":{"description":"Requires exact native source-ID binding, active parent/outcome lifecycle and proven fresh provider clock; not order-fill certification. ProphetX additionally requires one atomic native strike/price/size/time observation matching its documented submit-order fields. ready=null means unknown. Native IDs remain separate from common_model_id.","example":{"available_size":{"state":"unknown","value":null},"depth":{"state":"unknown","value":null},"executable":{"reason":"catalog_is_not_a_book","state":"unknown"},"identifiers_valid":true,"liquidity":{"state":"unknown","value":null},"ready":null,"reasons":["provider_clock_provenance_downgrade"],"scope":"outcome_identifiers_and_provider_clock","venue":"limitless"},"properties":{"available_size":{"additionalProperties":true,"description":"Retained evidence; absent measurements have state unknown and value null.","type":"object"},"depth":{"additionalProperties":true,"description":"Retained evidence; absent measurements have state unknown and value null.","type":"object"},"executable":{"additionalProperties":true,"description":"Retained evidence; absent measurements have state unknown and value null.","type":"object"},"identifiers_valid":{"type":"boolean"},"liquidity":{"additionalProperties":true,"description":"Retained evidence; absent measurements have state unknown and value null.","type":"object"},"ready":{"nullable":true,"type":"boolean"},"reasons":{"items":{"type":"string"},"type":"array"},"scope":{"enum":["outcome_identifiers_and_provider_clock"],"type":"string"},"venue":{"type":"string"}},"type":"object"},"fetched_at":{"description":"Timestamp when SportsStack fetched or observed this quote","format":"date-time","nullable":true,"type":"string"},"freshness_reasons":{"description":"Deterministic provider_clock_* or lifecycle_* reasons; empty when fresh.","items":{"type":"string"},"type":"array"},"inserted_at":{"description":"Timestamp of creation","format":"date-time","type":"string"},"line_alignment":{"description":"SS main-line ladder plan Phase D. Present only for event-scoped, `latest_only=true` `/v1/odds` requests (`event_id` given) -- the key itself is absent from the response row (not present with a null body) for non-event-scoped `league_id`/list requests, since computing it there would mean an unbounded per-request ladder fetch across many events. Read-time derived from CommonModel.Betting.PredictionMarkets.LineLadder; never renames, removes, or reinterprets the sibling `is_main` field (the stored, write-time value) -- purely additive. All three sub-fields are null together when this row was not matched into a ranked ladder slot (e.g. a moneyline row, which has no alt-strike ladder, or a real-sportsbook row, which LineLadder never covers).","example":{"alignment_group":{"family":"spread","market_type":"point_spread","side":{"sign":"negative","team_id":null}},"is_main_derived":true,"sibling_line_count":2},"nullable":true,"properties":{"alignment_group":{"additionalProperties":true,"description":"The {market_type, family, side} ladder slot this row was matched into.","nullable":true,"type":"object"},"is_main_derived":{"description":"Whether LineLadder derived this row as the closest-to-even main line for its venue/slot, independent of the stored `is_main` column.","nullable":true,"type":"boolean"},"sibling_line_count":{"description":"Number of lines this row's own venue quotes within the same ladder slot.","nullable":true,"type":"integer"}},"type":"object"},"metadata":{"additionalProperties":true,"description":"Metadata. For prediction markets this includes an \"execution\" block carrying the trade-execution identifiers for the originating venue (venue, ticker/token_id, side, condition_id, neg_risk, tick_size, venue contracts, url). See the Prediction-Market Execution integration guide. UFC conditional markets expose \"probability_semantics\": \"conditional\", a structured \"condition\" object, and a plain-language \"void_condition\".","properties":{"condition":{"additionalProperties":true,"nullable":true,"properties":{"fight_result":{"description":"Fight-result condition for a conditional UFC market.","enum":["finish","decision"],"type":"string"},"round":{"description":"Optional round constraint for the conditional market.","minimum":1,"nullable":true,"type":"integer"}},"required":["fight_result"],"type":"object"},"probability_semantics":{"description":"Set to \"conditional\" when this price is conditional on the described fight result.","enum":["conditional"],"nullable":true,"type":"string"},"void_condition":{"description":"Plain-language condition under which a conditional UFC market is voided.","nullable":true,"type":"string"}},"type":"object"},"mobile_deep_link":{"description":"Mobile/native app deep link URL","type":"string"},"outcome_id":{"description":"Venue-backed SportsStack outcome ID","type":"string"},"platform_observed_at":{"description":"Prediction quotes only. Row observed_at, independently of provider freshness.","format":"date-time","nullable":true,"type":"string"},"price":{"description":"Price","type":"number"},"price_type":{"description":"Price format ('decimal', 'american')","type":"string"},"provider_freshness":{"description":"Prediction quotes only. Fresh requires a proven nonfuture provider clock at most 300 seconds old and proven active exact-parent/outcome lifecycle. Standalone odds report unknown without lifecycle proof.","enum":["fresh","stale","unknown"],"type":"string"},"provider_observed_at":{"description":"Prediction quotes only. Authoritative provider quote timestamp; never receipt/observation time. Requires matching observed quote_provenance.provider_updated_at; null for absent, synthetic or downgraded authority.","format":"date-time","nullable":true,"type":"string"},"reference_alignment":{"description":"Present only on crypto odds rows (omitted on sports rows; `line_alignment` is the\nsports ladder analogue and is omitted on crypto rows). `alignment` is `exact` (this\nmarket spans two or more venues), `single_venue`, or `unverified_mirror`.\n`different_reference_market_ids` lists the OTHER `market_id`s of the same window\n(any reference source), symmetrically.\n","properties":{"alignment":{"enum":["exact","single_venue","unverified_mirror"],"type":"string"},"alignment_group":{"description":"The window (event) id.","format":"uuid","type":"string"},"different_reference_market_ids":{"items":{"format":"uuid","type":"string"},"type":"array"},"reference_source":{"type":"string"},"tie_rule":{"enum":["up","split"],"type":"string"},"venue_count":{"minimum":1,"type":"integer"}},"title":"CryptoReferenceAlignment","type":"object"},"sgp_token":{"description":"Opaque same-game-parlay token supplied by the sportsbook. Null when the provider does not offer one.","nullable":true,"type":"string"},"source_event_id":{"description":"Source event ID","type":"string"},"source_id":{"description":"Source ID","type":"string"},"source_market_id":{"description":"Source market ID","type":"string"},"source_selection_id":{"description":"Source selection ID","type":"string"},"source_selection_name":{"description":"Source selection name","type":"string"},"sportsbook":{"description":"Sportsbook","type":"string"},"timestamp":{"description":"Provider quote timestamp","format":"date-time","nullable":true,"type":"string"},"trading_fees":{"description":"Prediction quotes only (absent on sportsbook rows and on venues whose fees are not captured yet: Limitless, ProphetX, Polymarket US, SX Bet). Computed at read time; no order-fill or account-specific guarantee (per-account discounts, maker rebates and balance-precision rounding are not modelled). Kalshi: rates from a versioned snapshot of Kalshi's public series metadata, event fee overrides and fee schedule; `observed_at` is the snapshot time. Series with event-level fee overrides (MLB) resolve per event: an override in force reports `scope: event` (with `event_ticker`, `effective_from`), before its `scheduled_ts` the series fee is reported with the pending change under `scheduled_override`, and an event missing from the snapshot reports `unknown` (`event_fee_override_not_in_snapshot`). Predict.fun: derived from the stored market `fee_rate_bps`; `observed_at` is the quote observation time. Polymarket: the market's own Gamma `feesEnabled`/`feeSchedule` captured with the quote (`fee = shares x rate x P x (1 - P)`, taker only, makers pay nothing; `maker.rebate_rate` is the fraction of taker fees returned to makers through a daily rebate program, not a per-fill credit; fees round to 5 decimal places with no published direction, so `rounding.direction` is absent); `observed_at` is the quote observation time, and quotes whose fee data is missing, has an exponent other than 1, or is not taker-only report `unknown`. The rate is per market (`sports_fees_v3` 0.05, `sports_fees_v2` 0.03, `zero_fees` 0 are all live on sports), never a category default.","example":{"availability":"published","charge_basis":"fill","fee_multiplier":1.0,"fee_type":"quadratic_with_maker_fees","maker":{"exponent":1,"model":"quadratic","multiplier":1.0,"rate":0.0175,"rounding":{"applies_to":"fee_plus_position_cost","direction":"up","increment":0.0001}},"observed_at":"2026-09-30T15:33:45Z","scope":"series","series_ticker":"KXNBAGAME","source":"kalshi_series_snapshot","taker":{"exponent":1,"model":"quadratic","multiplier":1.0,"rate":0.07,"rounding":{"applies_to":"fee_plus_position_cost","direction":"up","increment":0.0001}}},"properties":{"availability":{"enum":["published","unavailable","unknown"],"type":"string"},"charge_basis":{"description":"Fees are charged per fill, not per order or per settlement.","enum":["fill"],"type":"string"},"effective_from":{"description":"Kalshi, `scope: event`: the override's `scheduled_ts`, from which these rates apply.","format":"date-time","type":"string"},"event_ticker":{"description":"Kalshi: the market ticker minus its last `-` segment. Present for series with event-level fee overrides.","type":"string"},"fee_multiplier":{"type":"number"},"fee_rate_bps":{"type":"integer"},"fee_type":{"type":"string"},"fees_enabled":{"description":"Polymarket: the market's Gamma `feesEnabled` flag.","type":"boolean"},"maker":{"description":"One side of the fee. `quadratic`: fee = rate x contracts x (P x (1 - P)) ^ exponent. `linear_min_price`: fee = rate x min(P, 1 - P) x shares. `none`: no fee. `rate` already includes any venue multiplier.","properties":{"exponent":{"type":"integer"},"formula":{"type":"string"},"model":{"enum":["quadratic","linear_min_price","none"],"type":"string"},"multiplier":{"type":"number"},"rate":{"type":"number"},"rebate_rate":{"description":"Polymarket maker side: fraction of taker fees rebated to resting makers by the daily rebate program (context only, not a per-fill credit).","type":"number"},"rounding":{"properties":{"applies_to":{"type":"string"},"direction":{"enum":["up"],"type":"string"},"increment":{"type":"number"}},"type":"object"}},"type":"object"},"observed_at":{"format":"date-time","nullable":true,"type":"string"},"reason":{"description":"Present when availability is unknown; deterministic snake_case reason.","type":"string"},"scheduled_override":{"description":"Kalshi, `scope: series`: an event-level override that is not yet in force. Charged from `effective_from`; carries `fee_type`, `fee_multiplier`, `taker` and `maker` like the top-level object.","properties":{"effective_from":{"format":"date-time","type":"string"},"fee_multiplier":{"type":"number"},"fee_type":{"type":"string"},"maker":{"description":"One side of the fee. `quadratic`: fee = rate x contracts x (P x (1 - P)) ^ exponent. `linear_min_price`: fee = rate x min(P, 1 - P) x shares. `none`: no fee. `rate` already includes any venue multiplier.","properties":{"exponent":{"type":"integer"},"formula":{"type":"string"},"model":{"enum":["quadratic","linear_min_price","none"],"type":"string"},"multiplier":{"type":"number"},"rate":{"type":"number"},"rebate_rate":{"description":"Polymarket maker side: fraction of taker fees rebated to resting makers by the daily rebate program (context only, not a per-fill credit).","type":"number"},"rounding":{"properties":{"applies_to":{"type":"string"},"direction":{"enum":["up"],"type":"string"},"increment":{"type":"number"}},"type":"object"}},"type":"object"},"taker":{"description":"One side of the fee. `quadratic`: fee = rate x contracts x (P x (1 - P)) ^ exponent. `linear_min_price`: fee = rate x min(P, 1 - P) x shares. `none`: no fee. `rate` already includes any venue multiplier.","properties":{"exponent":{"type":"integer"},"formula":{"type":"string"},"model":{"enum":["quadratic","linear_min_price","none"],"type":"string"},"multiplier":{"type":"number"},"rate":{"type":"number"},"rebate_rate":{"description":"Polymarket maker side: fraction of taker fees rebated to resting makers by the daily rebate program (context only, not a per-fill credit).","type":"number"},"rounding":{"properties":{"applies_to":{"type":"string"},"direction":{"enum":["up"],"type":"string"},"increment":{"type":"number"}},"type":"object"}},"type":"object"}},"type":"object"},"scope":{"enum":["series","event","market"],"type":"string"},"series_ticker":{"type":"string"},"source":{"description":"kalshi_series_snapshot | kalshi_event_fee_snapshot | kalshi_fee_schedule_default | venue_record. `kalshi_event_fee_snapshot` is a Kalshi event-level override in force; `kalshi_fee_schedule_default` is the schedule default (quadratic x 1) inferred for a KX series not in the exception snapshot.","type":"string"},"taker":{"description":"One side of the fee. `quadratic`: fee = rate x contracts x (P x (1 - P)) ^ exponent. `linear_min_price`: fee = rate x min(P, 1 - P) x shares. `none`: no fee. `rate` already includes any venue multiplier.","properties":{"exponent":{"type":"integer"},"formula":{"type":"string"},"model":{"enum":["quadratic","linear_min_price","none"],"type":"string"},"multiplier":{"type":"number"},"rate":{"type":"number"},"rebate_rate":{"description":"Polymarket maker side: fraction of taker fees rebated to resting makers by the daily rebate program (context only, not a per-fill credit).","type":"number"},"rounding":{"properties":{"applies_to":{"type":"string"},"direction":{"enum":["up"],"type":"string"},"increment":{"type":"number"}},"type":"object"}},"type":"object"}},"type":"object"},"updated_at":{"description":"Timestamp when SportsStack last wrote this row","format":"date-time","type":"string"}},"required":["common_model_id","name"],"title":"Odds","type":"object"},"Market":{"description":"A betting market represents a specific wagering opportunity associated with a sporting event.\n\nMarkets define the framework for betting by establishing what can be wagered on, such as\ngame outcomes, player performances, or statistical achievements. Each market contains\nmultiple outcomes that bettors can choose from, with associated odds from various sportsbooks.\n\n## Market Standardization\n\nAll market data undergoes a comprehensive standardization process to ensure consistency\nacross data providers:\n\n### Name Standardization\nMarket names are standardized using our MarketTypesRegistry:\n- **Raw Provider**: `market_id: \"market_8010\", name: \"winning margin\"`\n- **Standardized**: `name: \"1st Half Winning Margin\"` (from registry display_name)\n\n### Market Type Classification\nMarkets are classified into standardized types:\n- **Moneyline**: Game winner (home/away)\n- **Point Spread**: Handicap betting with point advantages\n- **Total Points**: Over/under betting on combined scores\n- **Player Props**: Individual player performance metrics\n- **Team Props**: Team-specific statistical achievements\n\n## Market Types\n- **Game Outcomes**: Moneyline (winner), point spreads, totals (over/under)\n- **Player Props**: Individual player statistics (passing yards, points scored)\n- **Team Props**: Team-specific achievements (total touchdowns, team assists)\n- **Game Props**: Event-specific occurrences (first scorer, longest field goal)\n- **Futures**: Long-term bets (championship winners, season awards)\n\n## Market Structure\n- **Primary Markets**: Main betting options (moneyline, spread, total)\n- **Alternate Lines**: Non-standard lines offering different risk/reward\n- **Live Markets**: In-game betting opportunities that update during play\n- **Future Markets**: Season-long or tournament-wide betting opportunities\n\n## Key Relationships\n- **Event**: Most markets tied to specific games/matches\n- **Outcomes**: Multiple betting options within each market\n- **Odds**: Current betting lines from various sportsbooks\n- **Sportsbooks**: Multiple operators offering odds on the same market\n\n## Performance Optimized Response\n\nWhen `include_outcomes_and_odds=true` is specified, the API returns an optimized flattened structure\nfor improved performance. This structure reduces response time by approximately 80% compared to\nthe standard nested structure.\n\n### Optimized Structure\n```json\n{\n  \"market_id\": \"5c4e8fe4-5bc9-49e1-aa84-aaa975900703\",\n  \"market_name\": \"Moneyline\",\n  \"market_status\": \"active\",\n  \"market_type\": \"moneyline\",\n  \"market_updated_at\": \"2024-01-15T20:30:00Z\",\n  \"outcomes\": [\n    {\n      \"outcome_id\": \"abc123\",\n      \"outcome_name\": \"Team A\",\n      \"outcome_selection\": \"Team A\",\n      \"outcome_line\": null,\n      \"outcome_status\": \"ACTIVE\",\n      \"odds\": [\n        {\n          \"odds_id\": \"def456\",\n          \"odds_price\": -110,\n          \"odds_price_type\": \"american\",\n          \"odds_sportsbook\": \"draftkings\",\n          \"odds_is_main\": true,\n          \"odds_aggregator\": \"sportsstack\"\n        }\n      ]\n    }\n  ]\n}\n```\n\n### Performance Benefits\n- **Query Time**: Reduced from 536ms to ~386ms (28% improvement)\n- **Render Time**: Reduced from 4.8s to ~500ms (90% improvement)\n- **Total Response Time**: Reduced from 6.1s to ~1.2s (80% improvement)\n- **Database Load**: Single optimized query instead of multiple queries\n- **Memory Usage**: Efficient flattened structure with reduced nesting\n","example":{"canonical_status":"open","common_model_id":"123e4567-e89b-12d3-a456-426614174010","is_main":true,"market_type_id":null,"metadata":{"source":"draftkings","source_event_id":"30568865","source_market_id":"DraftKings-30568865-h2h"},"name":"(0dac14546d6008893a8b3b6c417472a6) DraftKings - 30568865 - h2h","status":"active","timestamp":"2024-09-10T14:30:00Z"},"properties":{"actual_scope":{"description":"Proven native contract scope, independent of the compatibility endpoint.","enum":["event","race","session","tournament","round","season"],"nullable":true,"type":"string"},"canonical_status":{"description":"Canonical market status (SS-2270), derived from the raw provider-native\n`status` string via a fixed open|suspended|resolved mapping. `null` when\nthe provider never sets a status (e.g. some aggregators) or writes\na value outside the known vocabulary — this field never guesses.\n","enum":["open","suspended","resolved"],"nullable":true,"type":"string"},"common_model_id":{"description":"Market ID","type":"string"},"event_id":{"description":"Event ID","type":"string"},"future_type":{"description":"Future type (if applicable)","type":"string"},"inserted_at":{"description":"Timestamp of creation","format":"date-time","type":"string"},"is_future":{"description":"Whether this is a future market","type":"boolean"},"is_main":{"description":"Whether this is a main vs alternate market","type":"boolean"},"league_id":{"description":"League ID","format":"uuid","type":"string"},"market_type":{"description":"Market type","type":"string"},"market_type_id":{"description":"Market type ID","type":"string"},"metadata":{"description":"Metadata. For prediction markets (Kalshi, Polymarket, Predict.fun, Limitless) this includes an \"execution\" block with the identifiers needed to place a trade on the originating venue: venue, condition_id, neg_risk, tick_size, venue contract addresses, slug and url. See the Prediction-Market Execution integration guide.","type":"object"},"name":{"description":"Name","type":"string"},"outcomes":{"description":"Outcomes","items":{"description":"A specific betting outcome within a market, representing one possible result that bettors can wager on.\n\n## Outcome Standardization\n\nOutcomes undergo market-type-specific standardization to ensure consistent field formats:\n\n### Total Points Markets (Over/Under)\n```\nname: \"Over 228.5\"              # Human-readable with line value\nline: 228.5                     # Numeric line value\nselection: nil                  # No specific entity selection\nselection_line: \"over\"          # Direction (over/under)\nnormalized_selection: nil       # No entity to normalize\ngrouping_key: \"default:-228.5\" # Groups over/under for same line\n```\n\n### Point Spread Markets (Handicap)\n```\nname: \"Indiana Pacers +11\"           # Team name + formatted spread\nline: 11.0                           # Absolute line value\nselection: \"Indiana Pacers\"          # Team name\nselection_line: nil                  # Not applicable for spreads\nnormalized_selection: \"indiana_pacers\" # Lowercase, underscores\ngrouping_key: \"default:-11.0\"       # Groups home/away for same spread\n```\n\n### Moneyline Markets (Winner)\n```\nname: \"Oklahoma City Thunder\"               # Team name\nline: nil                                   # No line for moneyline\nselection: \"Oklahoma City Thunder\"          # Team name\nselection_line: nil                         # Not applicable\nnormalized_selection: \"oklahoma_city_thunder\" # Lowercase, underscores\ngrouping_key: \"default:Oklahoma City Thunder\" # Groups by team\n```\n\n### Field Standardization\n- **name**: Human-readable outcome description with context\n- **selection**: Entity being selected (team/player name or null)\n- **normalized_selection**: Lowercase, underscore-separated for consistent querying\n- **line**: Numeric betting line (spread/total value, null for moneyline)\n- **selection_line**: Direction for totals (\"over\"/\"under\"), null otherwise\n- **grouping_key**: Groups related outcomes (same spread/total different sides)\n","example":{"common_model_id":"123e4567-e89b-12d3-a456-426614174010","event_id":"30568865","grouping_key":"DraftKings-30568865-h2h","inserted_at":"2024-09-10T14:30:00Z","is_alternate_line":false,"is_main":true,"line":1.5,"market_id":"123e4567-e89b-12d3-a456-426614174011","market_type":"h2h","metadata":{"source":"draftkings","source_event_id":"30568865","source_market_id":"DraftKings-30568865-h2h"},"name":"DraftKings - 30568865 - h2h - Seattle Seahawks","normalized_selection":"Seattle Seahawks","player_id":"59291391-0c7e-442b-9496-33074647384e","selection":"Seattle Seahawks","selection_line":"1.5","stat_type":"points","status":"active","team_id":"58e8c89b-72f8-4427-adbc-10f193c9b462","tenant_id":"ff6332b6-8151-4a13-b20c-bd7b2ab45452","updated_at":"2024-09-11T09:15:00Z"},"properties":{"common_model_id":{"description":"Market ID","type":"string"},"event_id":{"description":"Event ID","type":"string"},"grouping_key":{"description":"Grouping Key","type":"string"},"inserted_at":{"description":"Timestamp of creation","format":"date-time","type":"string"},"is_alternate_line":{"description":"Is Alternate Line","type":"boolean"},"is_main":{"description":"Is Main","type":"boolean"},"line":{"description":"Line (if applicable)","type":"number"},"market_id":{"description":"Market ID","type":"string"},"market_type":{"description":"Market Type","type":"string"},"metadata":{"description":"Metadata. For prediction markets this includes an \"execution\" block carrying the trade-execution identifiers for the originating venue (venue, ticker/token_id, side, condition_id, neg_risk, tick_size, venue contracts, url). See the Prediction-Market Execution integration guide.","type":"object"},"name":{"description":"Name","type":"string"},"normalized_selection":{"description":"Normalized Selection","type":"string"},"odds":{"description":"Odds","items":{"description":"Betting odds from a specific sportsbook for a particular outcome, representing the price and probability.\n\n## Odds Standardization\n\nOdds undergo standardization to ensure consistent pricing representation and source attribution:\n\n### Source Selection Name Standardization\nThe `source_selection_name` field identifies what the sportsbook is offering odds on:\n\n#### Total Points Markets\n```\nsource_selection_name: nil  # No specific team/player selection\n```\n\n#### Point Spread Markets\n```\nsource_selection_name: \"Indiana Pacers\"     # Team receiving the spread\n# Derived from event.participants based on outcome selection\n```\n\n#### Moneyline Markets\n```\nsource_selection_name: \"Oklahoma City Thunder\"  # Team to win\n# Derived from event.participants based on outcome selection\n```\n\n### Price Standardization\n- **price**: Standardized to American odds format (-110, +150, etc.)\n- **price_type**: Always \"american\" for consistency\n- **timestamp**: UTC timestamp when current odds were observed. When the\n  response comes from the durable line-summary fallback, this is the time\n  the returned closing price last changed; same-price provider\n  reaffirmations do not advance it.\n\n### Sportsbook Attribution\n- **sportsbook**: Standardized sportsbook name (DraftKings, FanDuel, etc.)\n- **aggregator**: Upstream provider key or `sportsstack` for the canonical SportsStack board\n- **aggregator_event_id**: Provider's event identifier for traceability\n\n### Historical Tracking\nOdds include both current and opening lines for trend analysis:\n- Current odds: Real-time pricing from sportsbooks\n- Opening odds: Initial lines when market opened\n- Movement tracking: Compare current vs opening for line movement insights\n","example":{"aggregator":"sportsstack","aggregator_event_id":null,"fetched_at":"2026-04-21T17:40:00Z","metadata":{"aggregator":"sportsstack","id":"0HC75256377P350_1","link":"https://sportsbook.draftkings.com/event/30568865?outcomes=0HC75256377P350_1","selected_source":"example_provider.football.nfl","selection_reason":"trust_then_freshness","selection_tier":1,"source":"sportsstack","source_event_id":"30568865","source_market_id":"DraftKings-30568865-spreads","sportsstack_kind":"canonical_book_quote"},"price":-110,"price_type":"american","source_event_id":"30568865","source_id":"0HC75256377P350_1","source_market_id":"DraftKings-30568865-spreads","source_selection_id":"0HC75256377P350_1","source_selection_name":"Seattle Seahawks","sportsbook":"draftkings"},"properties":{"aggregator":{"description":"Upstream provider name or 'sportsstack' for the canonical SportsStack sportsbook board","type":"string"},"aggregator_event_id":{"description":"Aggregator event ID","type":"string"},"canonical_outcome_id":{"description":"Verified cross-venue economic outcome ID. Null when outcome equivalence is unresolved, push-capable, three-way, or ambiguous.","format":"uuid","nullable":true,"type":"string"},"clock_provenance":{"properties":{"evaluated_at":{"format":"date-time","type":"string"},"max_age_seconds":{"enum":[300],"type":"integer"},"quote_provenance":{"description":"Unmodified retained JSON provenance, including legacy or malformed evidence.","nullable":true},"source":{"enum":["timestamp",null],"nullable":true,"type":"string"}},"type":"object"},"common_model_id":{"description":"Market ID","type":"string"},"deep_link":{"description":"Desktop sportsbook deep link URL","type":"string"},"execution_readiness":{"description":"Requires exact native source-ID binding, active parent/outcome lifecycle and proven fresh provider clock; not order-fill certification. ProphetX additionally requires one atomic native strike/price/size/time observation matching its documented submit-order fields. ready=null means unknown. Native IDs remain separate from common_model_id.","example":{"available_size":{"state":"unknown","value":null},"depth":{"state":"unknown","value":null},"executable":{"reason":"catalog_is_not_a_book","state":"unknown"},"identifiers_valid":true,"liquidity":{"state":"unknown","value":null},"ready":null,"reasons":["provider_clock_provenance_downgrade"],"scope":"outcome_identifiers_and_provider_clock","venue":"limitless"},"properties":{"available_size":{"additionalProperties":true,"description":"Retained evidence; absent measurements have state unknown and value null.","type":"object"},"depth":{"additionalProperties":true,"description":"Retained evidence; absent measurements have state unknown and value null.","type":"object"},"executable":{"additionalProperties":true,"description":"Retained evidence; absent measurements have state unknown and value null.","type":"object"},"identifiers_valid":{"type":"boolean"},"liquidity":{"additionalProperties":true,"description":"Retained evidence; absent measurements have state unknown and value null.","type":"object"},"ready":{"nullable":true,"type":"boolean"},"reasons":{"items":{"type":"string"},"type":"array"},"scope":{"enum":["outcome_identifiers_and_provider_clock"],"type":"string"},"venue":{"type":"string"}},"type":"object"},"fetched_at":{"description":"Timestamp when SportsStack fetched or observed this quote","format":"date-time","nullable":true,"type":"string"},"freshness_reasons":{"description":"Deterministic provider_clock_* or lifecycle_* reasons; empty when fresh.","items":{"type":"string"},"type":"array"},"inserted_at":{"description":"Timestamp of creation","format":"date-time","type":"string"},"line_alignment":{"description":"SS main-line ladder plan Phase D. Present only for event-scoped, `latest_only=true` `/v1/odds` requests (`event_id` given) -- the key itself is absent from the response row (not present with a null body) for non-event-scoped `league_id`/list requests, since computing it there would mean an unbounded per-request ladder fetch across many events. Read-time derived from CommonModel.Betting.PredictionMarkets.LineLadder; never renames, removes, or reinterprets the sibling `is_main` field (the stored, write-time value) -- purely additive. All three sub-fields are null together when this row was not matched into a ranked ladder slot (e.g. a moneyline row, which has no alt-strike ladder, or a real-sportsbook row, which LineLadder never covers).","example":{"alignment_group":{"family":"spread","market_type":"point_spread","side":{"sign":"negative","team_id":null}},"is_main_derived":true,"sibling_line_count":2},"nullable":true,"properties":{"alignment_group":{"additionalProperties":true,"description":"The {market_type, family, side} ladder slot this row was matched into.","nullable":true,"type":"object"},"is_main_derived":{"description":"Whether LineLadder derived this row as the closest-to-even main line for its venue/slot, independent of the stored `is_main` column.","nullable":true,"type":"boolean"},"sibling_line_count":{"description":"Number of lines this row's own venue quotes within the same ladder slot.","nullable":true,"type":"integer"}},"type":"object"},"metadata":{"additionalProperties":true,"description":"Metadata. For prediction markets this includes an \"execution\" block carrying the trade-execution identifiers for the originating venue (venue, ticker/token_id, side, condition_id, neg_risk, tick_size, venue contracts, url). See the Prediction-Market Execution integration guide. UFC conditional markets expose \"probability_semantics\": \"conditional\", a structured \"condition\" object, and a plain-language \"void_condition\".","properties":{"condition":{"additionalProperties":true,"nullable":true,"properties":{"fight_result":{"description":"Fight-result condition for a conditional UFC market.","enum":["finish","decision"],"type":"string"},"round":{"description":"Optional round constraint for the conditional market.","minimum":1,"nullable":true,"type":"integer"}},"required":["fight_result"],"type":"object"},"probability_semantics":{"description":"Set to \"conditional\" when this price is conditional on the described fight result.","enum":["conditional"],"nullable":true,"type":"string"},"void_condition":{"description":"Plain-language condition under which a conditional UFC market is voided.","nullable":true,"type":"string"}},"type":"object"},"mobile_deep_link":{"description":"Mobile/native app deep link URL","type":"string"},"outcome_id":{"description":"Venue-backed SportsStack outcome ID","type":"string"},"platform_observed_at":{"description":"Prediction quotes only. Row observed_at, independently of provider freshness.","format":"date-time","nullable":true,"type":"string"},"price":{"description":"Price","type":"number"},"price_type":{"description":"Price format ('decimal', 'american')","type":"string"},"provider_freshness":{"description":"Prediction quotes only. Fresh requires a proven nonfuture provider clock at most 300 seconds old and proven active exact-parent/outcome lifecycle. Standalone odds report unknown without lifecycle proof.","enum":["fresh","stale","unknown"],"type":"string"},"provider_observed_at":{"description":"Prediction quotes only. Authoritative provider quote timestamp; never receipt/observation time. Requires matching observed quote_provenance.provider_updated_at; null for absent, synthetic or downgraded authority.","format":"date-time","nullable":true,"type":"string"},"reference_alignment":{"description":"Present only on crypto odds rows (omitted on sports rows; `line_alignment` is the\nsports ladder analogue and is omitted on crypto rows). `alignment` is `exact` (this\nmarket spans two or more venues), `single_venue`, or `unverified_mirror`.\n`different_reference_market_ids` lists the OTHER `market_id`s of the same window\n(any reference source), symmetrically.\n","properties":{"alignment":{"enum":["exact","single_venue","unverified_mirror"],"type":"string"},"alignment_group":{"description":"The window (event) id.","format":"uuid","type":"string"},"different_reference_market_ids":{"items":{"format":"uuid","type":"string"},"type":"array"},"reference_source":{"type":"string"},"tie_rule":{"enum":["up","split"],"type":"string"},"venue_count":{"minimum":1,"type":"integer"}},"title":"CryptoReferenceAlignment","type":"object"},"sgp_token":{"description":"Opaque same-game-parlay token supplied by the sportsbook. Null when the provider does not offer one.","nullable":true,"type":"string"},"source_event_id":{"description":"Source event ID","type":"string"},"source_id":{"description":"Source ID","type":"string"},"source_market_id":{"description":"Source market ID","type":"string"},"source_selection_id":{"description":"Source selection ID","type":"string"},"source_selection_name":{"description":"Source selection name","type":"string"},"sportsbook":{"description":"Sportsbook","type":"string"},"timestamp":{"description":"Provider quote timestamp","format":"date-time","nullable":true,"type":"string"},"trading_fees":{"description":"Prediction quotes only (absent on sportsbook rows and on venues whose fees are not captured yet: Limitless, ProphetX, Polymarket US, SX Bet). Computed at read time; no order-fill or account-specific guarantee (per-account discounts, maker rebates and balance-precision rounding are not modelled). Kalshi: rates from a versioned snapshot of Kalshi's public series metadata, event fee overrides and fee schedule; `observed_at` is the snapshot time. Series with event-level fee overrides (MLB) resolve per event: an override in force reports `scope: event` (with `event_ticker`, `effective_from`), before its `scheduled_ts` the series fee is reported with the pending change under `scheduled_override`, and an event missing from the snapshot reports `unknown` (`event_fee_override_not_in_snapshot`). Predict.fun: derived from the stored market `fee_rate_bps`; `observed_at` is the quote observation time. Polymarket: the market's own Gamma `feesEnabled`/`feeSchedule` captured with the quote (`fee = shares x rate x P x (1 - P)`, taker only, makers pay nothing; `maker.rebate_rate` is the fraction of taker fees returned to makers through a daily rebate program, not a per-fill credit; fees round to 5 decimal places with no published direction, so `rounding.direction` is absent); `observed_at` is the quote observation time, and quotes whose fee data is missing, has an exponent other than 1, or is not taker-only report `unknown`. The rate is per market (`sports_fees_v3` 0.05, `sports_fees_v2` 0.03, `zero_fees` 0 are all live on sports), never a category default.","example":{"availability":"published","charge_basis":"fill","fee_multiplier":1.0,"fee_type":"quadratic_with_maker_fees","maker":{"exponent":1,"model":"quadratic","multiplier":1.0,"rate":0.0175,"rounding":{"applies_to":"fee_plus_position_cost","direction":"up","increment":0.0001}},"observed_at":"2026-09-30T15:33:45Z","scope":"series","series_ticker":"KXNBAGAME","source":"kalshi_series_snapshot","taker":{"exponent":1,"model":"quadratic","multiplier":1.0,"rate":0.07,"rounding":{"applies_to":"fee_plus_position_cost","direction":"up","increment":0.0001}}},"properties":{"availability":{"enum":["published","unavailable","unknown"],"type":"string"},"charge_basis":{"description":"Fees are charged per fill, not per order or per settlement.","enum":["fill"],"type":"string"},"effective_from":{"description":"Kalshi, `scope: event`: the override's `scheduled_ts`, from which these rates apply.","format":"date-time","type":"string"},"event_ticker":{"description":"Kalshi: the market ticker minus its last `-` segment. Present for series with event-level fee overrides.","type":"string"},"fee_multiplier":{"type":"number"},"fee_rate_bps":{"type":"integer"},"fee_type":{"type":"string"},"fees_enabled":{"description":"Polymarket: the market's Gamma `feesEnabled` flag.","type":"boolean"},"maker":{"description":"One side of the fee. `quadratic`: fee = rate x contracts x (P x (1 - P)) ^ exponent. `linear_min_price`: fee = rate x min(P, 1 - P) x shares. `none`: no fee. `rate` already includes any venue multiplier.","properties":{"exponent":{"type":"integer"},"formula":{"type":"string"},"model":{"enum":["quadratic","linear_min_price","none"],"type":"string"},"multiplier":{"type":"number"},"rate":{"type":"number"},"rebate_rate":{"description":"Polymarket maker side: fraction of taker fees rebated to resting makers by the daily rebate program (context only, not a per-fill credit).","type":"number"},"rounding":{"properties":{"applies_to":{"type":"string"},"direction":{"enum":["up"],"type":"string"},"increment":{"type":"number"}},"type":"object"}},"type":"object"},"observed_at":{"format":"date-time","nullable":true,"type":"string"},"reason":{"description":"Present when availability is unknown; deterministic snake_case reason.","type":"string"},"scheduled_override":{"description":"Kalshi, `scope: series`: an event-level override that is not yet in force. Charged from `effective_from`; carries `fee_type`, `fee_multiplier`, `taker` and `maker` like the top-level object.","properties":{"effective_from":{"format":"date-time","type":"string"},"fee_multiplier":{"type":"number"},"fee_type":{"type":"string"},"maker":{"description":"One side of the fee. `quadratic`: fee = rate x contracts x (P x (1 - P)) ^ exponent. `linear_min_price`: fee = rate x min(P, 1 - P) x shares. `none`: no fee. `rate` already includes any venue multiplier.","properties":{"exponent":{"type":"integer"},"formula":{"type":"string"},"model":{"enum":["quadratic","linear_min_price","none"],"type":"string"},"multiplier":{"type":"number"},"rate":{"type":"number"},"rebate_rate":{"description":"Polymarket maker side: fraction of taker fees rebated to resting makers by the daily rebate program (context only, not a per-fill credit).","type":"number"},"rounding":{"properties":{"applies_to":{"type":"string"},"direction":{"enum":["up"],"type":"string"},"increment":{"type":"number"}},"type":"object"}},"type":"object"},"taker":{"description":"One side of the fee. `quadratic`: fee = rate x contracts x (P x (1 - P)) ^ exponent. `linear_min_price`: fee = rate x min(P, 1 - P) x shares. `none`: no fee. `rate` already includes any venue multiplier.","properties":{"exponent":{"type":"integer"},"formula":{"type":"string"},"model":{"enum":["quadratic","linear_min_price","none"],"type":"string"},"multiplier":{"type":"number"},"rate":{"type":"number"},"rebate_rate":{"description":"Polymarket maker side: fraction of taker fees rebated to resting makers by the daily rebate program (context only, not a per-fill credit).","type":"number"},"rounding":{"properties":{"applies_to":{"type":"string"},"direction":{"enum":["up"],"type":"string"},"increment":{"type":"number"}},"type":"object"}},"type":"object"}},"type":"object"},"scope":{"enum":["series","event","market"],"type":"string"},"series_ticker":{"type":"string"},"source":{"description":"kalshi_series_snapshot | kalshi_event_fee_snapshot | kalshi_fee_schedule_default | venue_record. `kalshi_event_fee_snapshot` is a Kalshi event-level override in force; `kalshi_fee_schedule_default` is the schedule default (quadratic x 1) inferred for a KX series not in the exception snapshot.","type":"string"},"taker":{"description":"One side of the fee. `quadratic`: fee = rate x contracts x (P x (1 - P)) ^ exponent. `linear_min_price`: fee = rate x min(P, 1 - P) x shares. `none`: no fee. `rate` already includes any venue multiplier.","properties":{"exponent":{"type":"integer"},"formula":{"type":"string"},"model":{"enum":["quadratic","linear_min_price","none"],"type":"string"},"multiplier":{"type":"number"},"rate":{"type":"number"},"rebate_rate":{"description":"Polymarket maker side: fraction of taker fees rebated to resting makers by the daily rebate program (context only, not a per-fill credit).","type":"number"},"rounding":{"properties":{"applies_to":{"type":"string"},"direction":{"enum":["up"],"type":"string"},"increment":{"type":"number"}},"type":"object"}},"type":"object"}},"type":"object"},"updated_at":{"description":"Timestamp when SportsStack last wrote this row","format":"date-time","type":"string"}},"required":["common_model_id","name"],"title":"Odds","type":"object"},"type":"array"},"player_id":{"description":"Player ID","type":"string"},"selection":{"description":"Selection","type":"string"},"selection_line":{"description":"Selection Line","type":"string"},"stat_type":{"description":"Stat type (if applicable)","type":"string"},"status":{"description":"Status","type":"string"},"team_id":{"description":"Team ID","type":"string"},"tenant_id":{"description":"Tenant ID","type":"string"},"updated_at":{"description":"Timestamp of last update","format":"date-time","type":"string"}},"required":["common_model_id","name"],"title":"Outcome","type":"object"},"type":"array"},"sport_id":{"description":"Sport ID","format":"uuid","type":"string"},"start_date":{"description":"Start date (if applicable)","format":"date-time","type":"string"},"updated_at":{"description":"Timestamp of last update","format":"date-time","type":"string"}},"required":["common_model_id","name"],"title":"Market","type":"object"},"News":{"description":"News and insights about sports entities including players, teams, events, and leagues.\n\nNews items provide automated analysis, commentary, and insights based on performance data,\nstatistical trends, and recent activity. Each news item contains multiple types of analysis\ntailored for different audiences including media, fantasy sports, and betting markets.\n","example":{"analysis":"Allen's recent rushing success stems from the Bills' increased use of designed quarterback runs in the red zone, capitalizing on his 6'5\" frame and surprising mobility. This strategic shift has coincided with the team's push for playoff positioning, as the coaching staff recognizes Allen's unique ability to create mismatches against smaller linebackers and defensive backs in short-yardage situations.","author":"Matthew Berry","betting_analysis":"Allen's rushing touchdown prop has moved from +125 to -110 over the past two weeks, reflecting bookmakers' adjustment to his recent red zone usage. The over on his rushing yards has hit in 8 of his last 10 games, creating value for bettors who recognize this trend early.","date":"2024-01-15","edit_history":[{"changes":{"tags":["fantasy_football","playoff_implications","rushing_qb","red_zone"]},"editor_id":"user-456","timestamp":"2024-01-15T12:00:00Z"}],"event_id":"456e7890-f12b-34c5-d678-901234567890","for_entity_id":"123e4567-e89b-12d3-a456-426614174000","for_entity_type":"player","headline":"Josh Allen's Rushing Touchdowns Fuel Fantasy Surge Ahead of Playoffs","id":"123e4567-e89b-12d3-a456-426614174000","inserted_at":"2024-01-15T10:30:00Z","league_id":"32fa944f-b1bd-41b4-bec2-7ab269fde6fc","metadata":{"confidence_score":0.89,"data_sources":["example_provider_a","example_provider_b"],"generation_model":"gpt-4-turbo","processing_time":3.2},"original_content":{"analysis":"Allen's recent rushing success stems from...","headline":"Josh Allen's Rushing Touchdowns Fuel Fantasy Surge Ahead of Playoffs","summary":"Josh Allen has scored 4 rushing touchdowns in his last 3 games...","tags":["fantasy_football","playoff_implications"]},"priority":2,"source":"Example News","summary":"Josh Allen has scored 4 rushing touchdowns in his last 3 games, significantly boosting his fantasy value ahead of the playoffs. His dual-threat ability makes him a premium option for championship weeks, especially with the Bills' favorable upcoming schedule.","tags":["fantasy_football","playoff_implications","rushing_qb","red_zone"],"tenant_id":"ff6332b6-8151-4a13-b20c-bd7b2ab45452","updated_at":"2024-01-15T14:45:00Z"},"properties":{"analysis":{"description":"Detailed breakdown and commentary providing deeper insights","example":"Allen's recent rushing success stems from the Bills' increased use of designed quarterback runs in the red zone, capitalizing on his 6'5\" frame and surprising mobility. This strategic shift has coincided with the team's push for playoff positioning...","type":"string"},"author":{"description":"Content creator attribution","example":"Matthew Berry","type":"string"},"betting_analysis":{"description":"Analysis focused on betting markets, odds, and wagering implications","example":"Allen's rushing touchdown prop has moved from +125 to -110 over the past two weeks, reflecting bookmakers' adjustment to his recent red zone usage. The over on his rushing yards has hit in 8 of his last 10 games...","type":"string"},"date":{"description":"Publication date (typically the date of the analyzed performance or event)","example":"2024-01-15","format":"date","type":"string"},"edit_history":{"description":"Chronological record of manual edits made to the content","items":{"properties":{"changes":{"additionalProperties":true,"description":"Fields that were modified in this edit","type":"object"},"editor_id":{"description":"ID of the person who made the edit","type":"string"},"timestamp":{"description":"When the edit was made","format":"date-time","type":"string"}},"type":"object"},"type":"array"},"entity_tags":{"description":"Entity tags identifying potential entity mentions in the content.\nOnly included when include_entity_tags=true is specified in the request.\n","items":{"properties":{"confidence":{"description":"Confidence score (0.0-1.0) indicating how confident we are this is the right entity","maximum":1.0,"minimum":0.0,"type":"number"},"context":{"description":"Surrounding text context where entity was mentioned","type":"string"},"entity_id":{"description":"Reference to the actual entity","format":"uuid","type":"string"},"entity_name":{"description":"Display name of the entity","type":"string"},"entity_type":{"description":"Type of entity being tagged","enum":["player","team","coach","league","venue"],"type":"string"},"id":{"description":"Unique identifier for this entity tag","format":"uuid","type":"string"},"inserted_at":{"description":"When this entity tag was created","format":"date-time","type":"string"},"mentioned_as":{"description":"The actual text that referenced the entity in the content","type":"string"},"reasoning":{"description":"AI/algorithm reasoning for the tag","type":"string"},"relevance":{"description":"Relevance score (0.0-1.0) indicating how relevant/prominent this entity is in the content","maximum":1.0,"minimum":0.0,"type":"number"},"tag_method":{"description":"Specific method used for tagging (e.g., 'gpt4', 'regex', 'user_edit')","type":"string"},"tag_source":{"description":"Source of the tag (AI analysis, manual tagging, etc.)","enum":["ai","manual","rule_based","hybrid"],"type":"string"}},"required":["id","entity_type","entity_id","entity_name","mentioned_as","confidence","relevance","tag_source","tag_method"],"type":"object"},"type":"array"},"event_id":{"description":"Related event ID (for game recaps and event-specific news)","example":"456e7890-f12b-34c5-d678-901234567890","format":"uuid","type":"string"},"for_entity_id":{"description":"ID of the specific entity (player, team, event, or league) this news covers","example":"123e4567-e89b-12d3-a456-426614174000","format":"uuid","type":"string"},"for_entity_type":{"description":"Type of entity this news item is about","enum":["player","team","event","league"],"example":"player","type":"string"},"headline":{"description":"Headline summarizing the main story or insight","example":"Josh Allen's Rushing Touchdowns Fuel Fantasy Surge Ahead of Playoffs","type":"string"},"id":{"description":"Unique identifier for this news item","format":"uuid","type":"string"},"inserted_at":{"description":"When this news item was created in the system","example":"2024-01-15T10:30:00Z","format":"date-time","type":"string"},"league_id":{"description":"League context for this news item","example":"32fa944f-b1bd-41b4-bec2-7ab269fde6fc","format":"uuid","type":"string"},"metadata":{"additionalProperties":true,"description":"Additional context and system metadata","type":"object"},"original_content":{"additionalProperties":true,"description":"Preserved original content before any manual edits","properties":{"analysis":{"description":"Original analysis","type":"string"},"betting_analysis":{"description":"Original betting analysis","type":"string"},"headline":{"description":"Original headline","type":"string"},"summary":{"description":"Original summary","type":"string"},"tags":{"description":"Original tags","items":{"type":"string"},"type":"array"}},"type":"object"},"priority":{"default":3,"description":"Content priority level (1=breaking news/urgent, 5=routine update)","example":3,"maximum":5,"minimum":1,"type":"integer"},"source":{"description":"Publishing source or platform","example":"Example News","type":"string"},"summary":{"description":"Concise overview of the main points, typically 2-3 sentences","example":"Josh Allen has scored 4 rushing touchdowns in his last 3 games, significantly boosting his fantasy value ahead of the playoffs. His dual-threat ability makes him a premium option for championship weeks, especially with the Bills' favorable upcoming schedule.","type":"string"},"tags":{"description":"Content categorization tags for discovery and filtering","example":["game_recap","fantasy_football","playoff_implications","rushing_qb"],"items":{"type":"string"},"type":"array"},"tenant_id":{"description":"Client tenant this news item belongs to","format":"uuid","type":"string"},"tournament_id":{"description":"Related tournament ID (for tournament-specific news)","format":"uuid","type":"string"},"updated_at":{"description":"When this news item was last modified","example":"2024-01-15T14:45:00Z","format":"date-time","type":"string"}},"required":["id","headline","summary","for_entity_type","for_entity_id","league_id","date"],"title":"News","type":"object"},"EventStatus":{"description":"Live event status with real-time scores, period, and game state information.\n\nContains dynamic/live game data that updates throughout the event. For comprehensive\nsport-specific details and field explanations, see the EventScoreboard model documentation.\n\n## Core Fields\n- **Basic Info**: sport, league, event_id\n- **Game State**: period, time_on_clock, period_half (sport-specific), status\n- **Scoring**: home_score, away_score (for team sports), periods (linescore)\n- **Details**: Sport-specific data in JSONB format\n- **Freshness**: response_received_at — when the provider observed this state\n- **Serving provenance** (additive): observed_at, served_at, source_rank — which provider\n  row was served, its rank in the live primary order, and why it won\n\n## Rendering a live clock\n`time_on_clock` is a point-in-time observation, not a ticking value; we refresh\nit as fast as the provider reports it. To render a smooth clock, tick locally\nfrom `time_on_clock` using `response_received_at` as the anchor and resync on\neach response. For timed sports `details.clock_running` says whether the clock\nshould be advancing — `null` means the provider did not tell us, which is\ndistinct from a known-stopped clock.\n\n## Period Numbering by Sport\n- **Football**: 1-4 (quarters), 5+ (overtime)\n- **Basketball**: 1-4 (quarters), 5+ (overtime)\n- **Baseball**: 1-9+ (innings)\n- **Hockey**: 1-3 (periods), 4+ (overtime)\n- **Golf**: 1-4 (rounds)\n","example":{"away_score":10,"common_model_id":"123e4567-e89b-12d3-a456-426614174000","details":{"away_timeouts":2,"distance":8,"down":2,"home_timeouts":3,"possession_team_id":"123e4567-e89b-12d3-a456-426614174002","red_zone":false,"wall_clock":"2024-01-15T15:32:08Z","yard_line":35},"event_id":"123e4567-e89b-12d3-a456-426614174001","home_score":14,"inserted_at":"2024-01-15T15:30:00Z","league":"NFL","observed_at":"2024-01-15T15:32:09Z","period":2,"response_received_at":"2024-01-15T15:32:10Z","served_at":"2024-01-15T15:32:11Z","source_rank":{"provider":"sportsstack","rank":null,"reason":null},"sport":"football","status":"in_progress","time_on_clock":"14:30","updated_at":"2024-01-15T15:32:15Z"},"properties":{"away_score":{"description":"Away team total score (null for individual sports like golf)","example":10,"type":"integer"},"common_model_id":{"description":"Event Status ID","format":"uuid","type":"string"},"details":{"additionalProperties":true,"description":"Sport-specific game state for a served scoreboard. Two formats exist.\n\n## Current format (what is served today)\n\nThe keys, nesting and value types of `details` depend on the data source that\nprovided the scoreboard row. For one event, `details` can be an object from one\nsource and `null` from another, and a key can be absent, `null` or populated\ndepending on the source. Treat every field as optional. Responses in this format\ndo not contain `details_version`. The property list below describes the keys that\ncan appear; not every source provides every key, and the same key can have a\ndifferent shape for different sources.\n\n## Current format reference\n\n### Dynamic game state\nThe details field contains live, sport-specific information that changes throughout\nthe game. Unlike static event information, this data updates in real-time as the\ngame progresses.\n\n### Sport-specific structures\nEach sport has its own set of relevant game state data:\n\n#### Football (Flattened Fields)\n- **Game State**: down, distance, yard_line, possession_team_id, red_zone, goal_to_go\n- **Clock Management**: play_clock, game_clock, clock_running, two_minute_warning, inside_two_minutes\n- **Timeouts**: home_timeouts, away_timeouts\n- **Weather (Flattened)**: weather_temperature, weather_condition, weather_wind_speed, weather_wind_direction, weather_humidity, weather_precipitation, wind_affecting_kicking, precipitation\n- **Analytics**: field_goal_range, touchdown_probability, turnover_on_downs_risk\n- **Game Info**: attendance, neutral_site, duration\n\n#### Basketball (Flattened Fields)\n- **Clock State**: shot_clock, shot_clock_running, game_clock, clock_running\n- **Fouls & Bonus**: home_team_fouls, away_team_fouls, home_bonus, away_bonus, home_double_bonus, away_double_bonus\n- **Timeouts**: home_timeouts, away_timeouts\n- **Free Throws (Flattened)**: free_throw_shooter_id, free_throw_shooter_name, free_throw_shots_awarded, free_throw_shots_made, free_throw_shots_attempted, free_throw_technical_foul, free_throw_flagrant_foul, free_throw_and_one, free_throw_clear_path_foul, free_throw_bonus_situation, free_throw_current_attempt\n- **Game Flow**: intermission, overtime_number, last_play, last_score_team_id, last_score_time, possession_arrow\n- **Analytics**: pace, lead_changes, times_tied, home_biggest_lead, away_biggest_lead, home_shooting_foul_trouble, away_shooting_foul_trouble\n- **Game Info**: attendance\n\n#### Baseball (Flattened Fields)\n- **Count**: balls, strikes, outs\n- **Hitter (Flattened)**: hitter_id, hitter_full_name, hitter_ab_over, hitter_outcome_id\n- **Pitcher (Flattened)**: pitcher_id, pitcher_full_name, pitcher_pitch_speed, pitcher_pitch_type, pitcher_pitch_x, pitcher_pitch_y, pitcher_pitch_zone\n- **Baserunners**: runners_on_base (array of maps), runners_count\n\n#### Hockey (Flattened Fields)\n- **Power Play**: man_advantage, power_play_time_remaining, home_on_power_play, away_on_power_play, penalty_kill_percentage\n- **Goalies**: home_goalie_pulled, away_goalie_pulled, empty_net, home_goalie_id, away_goalie_id\n- **Clock**: game_clock, clock_running, intermission, overtime_type\n- **Shootout**: in_shootout, shootout_round, home_shootout_goals, away_shootout_goals, shootout_attempts, shootout_attempts_count\n- **Penalties**: active_penalties (array of maps), active_penalties_count\n- **Game Flow**: last_faceoff_winner, faceoff_location, last_goal_time, last_goal_team_id, last_penalty_time\n- **Team Stats**: shots_on_goal_home, shots_on_goal_away, face_off_wins_home, face_off_wins_away, hits_home, hits_away, blocked_shots_home, blocked_shots_away\n\n#### Soccer (Flattened Fields)\n- **State**: match_status (`first_half`, `halftime`, `second_half`, `extra_time_first_half`, `extra_time_second_half`, `penalties`, `ended`; `not_started` and `postponed` also occur in both formats), match_minute (elapsed clock, `\"MM:SS\"`, stoppage time excluded)\n- **Stoppage Time**: added_time_announced, added_time_played (`\"MM:SS\"`)\n- **Cards**: home_yellow_cards, away_yellow_cards, home_red_cards, away_red_cards (red cards include second-yellow dismissals)\n- **Substitutions**: home_substitutions, away_substitutions\n- **Team Stats**: home_possession, away_possession (percent, 0-100), home_shots, away_shots, home_shots_on_target, away_shots_on_target, home_corners, away_corners\n- **Shootout**: shootout (`{home_score, away_score}`), present only once a penalty shootout has been reached\n- **Regulation Score**: regulation_score (`{home_score, away_score}`), the 90-minute score, present only once a match goes past regulation (top-level `home_score`/`away_score` include extra time but not the shootout)\n\n#### Golf (Embedded Objects)\n- **Tournament State**: round_number, total_rounds, holes_completed, current_hole, cut_line, cut_made, playoff_status, playoff_type, tournament_complete\n- **Course Conditions**: par_for_course, course_length, wind_speed, wind_direction, temperature, weather_condition, course_conditions\n- **Field Info**: field_size, players_made_cut, scoring_average\n- **Leaders**: driving_distance_leader, greens_in_regulation_leader, putting_average_leader\n- **Detailed Data**: leaderboard (array), featured_players (array), featured_hole (object)\n\n### Data structure strategy\nMost fields are flattened, with nested objects used where noted.\n\n### Array fields for complex data\nSome complex data structures use arrays of maps:\n- **runners_on_base**: Baseball baserunner positions and details (array of maps)\n- **active_penalties**: Hockey penalty details and timing information (array of maps)\n- **shootout_attempts**: Hockey shootout attempt details (array of maps)\n- **leaderboard**: Golf leaderboard entries (array of embedded objects)\n\n## `details_version` 1 format (selected per account)\n\nAccounts can be switched to a fixed per-sport format that does not depend on the\ndata source. Until an account is switched it receives the current format. A response\nin the new format is recognised by `details_version` = `1`. The exact keys for each\nsport are the component schemas `ScoreboardDetailsV1Football`,\n`ScoreboardDetailsV1Basketball`, `ScoreboardDetailsV1Baseball`,\n`ScoreboardDetailsV1Hockey` (also used for `ice_hockey`), `ScoreboardDetailsV1Soccer`,\n`ScoreboardDetailsV1Tennis` and `ScoreboardDetailsV1Other`.\n\n1. For every sport except golf and motorsports (see 8), `details` is always a JSON object\n   when a scoreboard is returned; it is never `null`.\n2. For football, basketball, baseball, hockey, ice_hockey, soccer and tennis, every key of that\n   sport's schema is present in every response.\n3. A key whose value is not known is `null`. `null` means \"not reported\". It never\n   stands for `0`, `false`, an empty string or an empty list; those values appear only\n   when the source reported them (an empty string is itself returned as `null`). A\n   source that itself reports a default value, for example a zero count before play\n   starts, has that value passed through: the format does not guess which zeros are\n   real. A baseball runner map in which every base is empty is returned as an empty\n   list with a count of `0`.\n4. Each key has one type. Values are taken from the source, with these normalizations:\n   a source's status text is mapped to the `match_status` values; clock text is read\n   into `match_minute` and the added-time keys; baseball runners that a source gives as\n   a map by base are returned as a list and `runners_count` is computed from it; and the\n   shootout and regulation scores are read from period scores where a source reports\n   them that way. A value that cannot be expressed as the key's type is returned as\n   `null`. That includes: a number that is negative (except temperature and pitch\n   location, which may be negative) or above 1e12; a count that is not a whole JSON\n   integer (text such as `\"2\"`, or any number with a decimal point such as `2.9` or\n   `2.0`) or that is above 1,000,000,000; numeric text in a number key; a possession\n   percentage above 100; a score pair with a side that is negative, above 1,000,000,000\n   or not a whole integer; a runner list or map with an entry that has no valid base,\n   repeats a base, or (in map form) holds a value that is neither text nor empty, in which case the\n   runners are `null` together with their count; a game clock that is not `m:ss` text\n   (minutes of one to three digits, seconds 00-59, and an optional fraction on the\n   seconds), and a soccer match minute or added time that is not exactly `m:ss`;\n   text of the form `prefix:type:value`; and an empty or blank string. Runners are\n   returned in base order. In a runner list, a name that is not text, or that has the\n   `prefix:type:value` form, is left out of that runner and the runner is kept. A\n   runner map by base carries player identifiers, so no names are returned from it; a\n   base that holds blank text counts as empty.\n5. Only the keys listed in the sport's schema are returned. For football, basketball,\n   baseball, hockey, ice_hockey and soccer, every key of that sport in the property list\n   below that does not carry a source identifier is in the schema. Tennis has one key,\n   `retirement_info`, which is not in the property list. Not returned in this format:\n   keys that carry a source identifier (player, team and goalie IDs, and similar), and\n   keys of the current format that are not in the property list (for example nested\n   baseball count and runner details, per-period linescores, match situation and\n   referee detail). Switching an account removes them from its responses.\n6. Changing the data source for an event does not change the key set, the types or the\n   meaning of `null`. Values can change.\n7. The format has no keys that carry a source identifier, and text of the form\n   `prefix:type:value` (one to ten ASCII letters, a colon, ASCII letters or underscores, a colon,\n   then text without whitespace; case-insensitive; surrounding whitespace ignored) is\n   `null`. Free text is not inspected beyond that. `possession_team_id` is a UUID in its\n   36-character text form (returned in lower case) or `null`; it is not checked against\n   the team list. Golf and motorsports are served as stored (see 8) and can contain\n   source identifiers.\n8. Golf and motorsports are not shaped by this format: their `details` are the stored\n   object, carry no `details_version`, and can contain source identifiers (an account\n   that holds no provider-data entitlement may have provider-id values removed from them\n   by a separate step). A scoreboard whose sport is not one of the sports named above,\n   including a sport stored as an identifier instead of a name, is treated as any other\n   sport. Sport names are matched ignoring case and surrounding whitespace (any Unicode space). For any other sport\n   (for example MMA) the object is exactly `{\"details_version\": 1}`.\n\n## When no scoreboard is available\n\nThe scoreboard object is absent as a whole; it is not returned with empty `details`:\n\n* `GET /api/v1/events/{id}/event-scoreboard` and `GET /api/v1/events/{id}/linescore`\n  return `404`.\n* `GET /api/v1/events` and `GET /api/v1/events/{id}` omit `event_scoreboard`.\n* `GET /api/v1/tournaments/{id}/bracket` returns `event_scoreboard: null`.\n\nA scoreboard is returned only from data you are entitled to receive. Data you are not\nentitled to is treated as if it did not exist.\n\nThis is different from an unknown value inside a returned scoreboard, which is a\n`null` key in the `details_version` 1 format.\n","example":{"goal_to_go":false,"away_yellow_cards":1,"runners_count":2,"home_timeouts":2,"match_status":"second_half","weather_wind_speed":8.0,"yard_line":25,"hitter_id":"player-123","possession_team_id":"123e4567-e89b-12d3-a456-426614174002","away_timeouts":3,"home_on_power_play":true,"touchdown_probability":0.35,"added_time_played":"00:00","weather_temperature":45.0,"active_penalties_count":1,"away_corners":2,"wind_affecting_kicking":false,"regulation_score":{"away_score":3,"home_score":0},"away_red_cards":1,"runners_on_base":[{"base":1,"ending_base":2,"id":"player-789"},{"base":3,"ending_base":3,"id":"player-012"}],"pitcher_id":"player-456","pitcher_full_name":"Jane Smith","shootout":{"away_score":4,"home_score":3},"home_substitutions":3,"away_substitutions":2,"added_time_announced":"04:00","home_possession":56,"strikes":1,"away_shots":7,"shots_on_goal_home":15,"home_yellow_cards":2,"balls":2,"home_corners":6,"away_possession":44,"home_shots_on_target":5,"details_version":1,"weather_humidity":65,"neutral_site":false,"attendance":72000,"hitter_full_name":"John Doe","outs":2,"distance":7,"play_clock":25,"inside_two_minutes":false,"away_on_power_play":false,"red_zone":true,"game_clock":"8:42","man_advantage":"5v4","power_play_time_remaining":82,"weather_wind_direction":"NW","two_minute_warning":false,"pitcher_pitch_speed":95.5,"home_red_cards":0,"weather_condition":"clear","down":3,"clock_running":true,"match_minute":"67:12","precipitation":false,"home_shots":11,"shots_on_goal_away":12,"away_shots_on_target":3,"turnover_on_downs_risk":0.15,"active_penalties":[{"major_penalty":false,"penalty_type":"Cross-checking","player_id":"player-789","time_remaining":82}],"field_goal_range":true,"weather_precipitation":false},"properties":{"penalty_kill_percentage":{"description":"Current penalty kill success rate","type":"number"},"holes_completed":{"description":"Holes finished in current round","type":"integer"},"course_conditions":{"description":"Course conditions","type":"string"},"home_biggest_lead":{"description":"Biggest home team lead","type":"integer"},"pitcher_pitch_x":{"description":"Pitch location X coordinate","type":"number"},"shootout_attempts_count":{"description":"Total shootout attempts","type":"integer"},"away_shooting_foul_trouble":{"description":"Away team in foul trouble","type":"boolean"},"goal_to_go":{"description":"Goal line is closer than first down marker","type":"boolean"},"away_yellow_cards":{"description":"Soccer away yellow cards","type":"integer"},"shootout_round":{"description":"Current shootout round","type":"integer"},"runners_count":{"description":"Number of runners on base","type":"integer"},"home_timeouts":{"description":"Home team timeouts remaining","type":"integer"},"wall_clock":{"description":"Provider wall-clock timestamp for the most recent game event","format":"date-time","type":"string"},"home_bonus":{"description":"Home team in bonus situation","type":"boolean"},"match_status":{"description":"Soccer match phase","enum":["first_half","halftime","second_half","extra_time_first_half","extra_time_second_half","penalties","ended"],"type":"string"},"last_play":{"description":"Description of last play","type":"string"},"hitter_ab_over":{"description":"At-bat is complete","type":"boolean"},"weather_wind_speed":{"description":"Wind speed (mph)","type":"number"},"home_double_bonus":{"description":"Home team in double bonus","type":"boolean"},"yard_line":{"description":"Field position (0-100)","type":"integer"},"hitter_id":{"description":"Current batter player ID","type":"string"},"times_tied":{"description":"Number of times tied","type":"integer"},"last_goal_time":{"description":"Time of last goal","type":"string"},"home_goalie_pulled":{"description":"Home goalie pulled","type":"boolean"},"lead_changes":{"description":"Number of lead changes","type":"integer"},"tournament_complete":{"description":"Tournament finished","type":"boolean"},"possession_team_id":{"description":"Common-model team ID with possession","format":"uuid","type":"string"},"wind_direction":{"description":"Wind direction","type":"string"},"away_timeouts":{"description":"Away team timeouts remaining","type":"integer"},"free_throw_shots_awarded":{"description":"Number of free throws awarded","type":"integer"},"home_on_power_play":{"description":"Home team on power play","type":"boolean"},"home_team_fouls":{"description":"Home team fouls this period/half","type":"integer"},"touchdown_probability":{"description":"Probability of touchdown (0.0-1.0)","type":"number"},"added_time_played":{"description":"Soccer stoppage time played so far in the current period (MM:SS)","example":"01:26","type":"string"},"weather_temperature":{"description":"Temperature (Fahrenheit)","type":"number"},"duration":{"description":"Game duration","type":"string"},"overtime_type":{"description":"Type of overtime","enum":["3v3","4v4","shootout"],"type":"string"},"course_length":{"description":"Course length in yards","type":"integer"},"shot_clock_running":{"description":"Whether shot clock is running","type":"boolean"},"active_penalties_count":{"description":"Number of active penalties","type":"integer"},"current_hole":{"description":"Hole currently being played","type":"integer"},"away_corners":{"description":"Soccer away corner kicks","type":"integer"},"wind_affecting_kicking":{"description":"Wind affecting field goals/punts","type":"boolean"},"regulation_score":{"description":"Soccer 90-minute score. Present only once a match goes past regulation (extra time).","properties":{"away_score":{"type":"integer"},"home_score":{"type":"integer"}},"type":"object"},"free_throw_clear_path_foul":{"description":"Free throws from clear path foul","type":"boolean"},"hits_home":{"description":"Home team hits","type":"integer"},"shootout_attempts":{"description":"Shootout attempts with details","items":{"properties":{"goalie_id":{"description":"Goalie player ID","type":"string"},"is_deciding_goal":{"description":"Was the deciding goal","type":"boolean"},"result":{"description":"Shot result","type":"string"},"round":{"description":"Shootout round","type":"integer"},"shooter_id":{"description":"Shooter player ID","type":"string"},"shooter_name":{"description":"Shooter name","type":"string"},"shooter_team_id":{"description":"Shooter's team","type":"string"}},"type":"object"},"type":"array"},"playoff_type":{"description":"Type of playoff","enum":["sudden_death","aggregate","match_play"],"type":"string"},"away_red_cards":{"description":"Soccer away red cards (includes second-yellow dismissals)","type":"integer"},"free_throw_current_attempt":{"description":"Current free throw attempt number","type":"integer"},"runners_on_base":{"description":"Baserunners with positions and details","items":{"properties":{"base":{"description":"Starting base (1, 2, 3)","type":"integer"},"ending_base":{"description":"Ending base after play","type":"integer"},"full_name":{"description":"Runner name, when known","type":"string"},"id":{"description":"Player ID","type":"string"}},"type":"object"},"type":"array"},"cut_made":{"description":"Has cut been applied","type":"boolean"},"pitcher_id":{"description":"Current pitcher player ID","type":"string"},"pitcher_full_name":{"description":"Current pitcher name","type":"string"},"shootout":{"description":"Soccer penalty shootout score. Present only once penalties are reached.","properties":{"away_score":{"type":"integer"},"home_score":{"type":"integer"}},"type":"object"},"faceoff_location":{"description":"Location of last faceoff","type":"string"},"home_substitutions":{"description":"Soccer home substitutions made","type":"integer"},"wind_speed":{"description":"Wind speed (mph)","type":"number"},"shot_clock":{"description":"Shot clock seconds remaining","type":"integer"},"away_substitutions":{"description":"Soccer away substitutions made","type":"integer"},"pitcher_pitch_zone":{"description":"Strike zone location","type":"integer"},"added_time_announced":{"description":"Soccer stoppage time announced by the fourth official (MM:SS)","example":"02:00","type":"string"},"free_throw_technical_foul":{"description":"Free throws from technical foul","type":"boolean"},"home_possession":{"description":"Soccer home ball possession percentage","maximum":100,"minimum":0,"type":"number"},"putting_average_leader":{"description":"Putting average leader player ID","type":"string"},"home_shooting_foul_trouble":{"description":"Home team in foul trouble","type":"boolean"},"strikes":{"description":"Strike count (0-2)","type":"integer"},"greens_in_regulation_leader":{"description":"GIR leader player ID","type":"string"},"away_biggest_lead":{"description":"Biggest away team lead","type":"integer"},"face_off_wins_away":{"description":"Away team faceoff wins","type":"integer"},"last_goal_team_id":{"description":"Team that scored last goal","type":"string"},"away_double_bonus":{"description":"Away team in double bonus","type":"boolean"},"away_shots":{"description":"Soccer away total shots","type":"integer"},"temperature":{"description":"Temperature (Fahrenheit)","type":"integer"},"last_penalty_time":{"description":"Time of last penalty","type":"string"},"last_score_team_id":{"description":"Team that scored last","type":"string"},"free_throw_and_one":{"description":"And-one free throw situation","type":"boolean"},"shots_on_goal_home":{"description":"Home team shots on goal","type":"integer"},"home_yellow_cards":{"description":"Soccer home yellow cards","type":"integer"},"free_throw_flagrant_foul":{"description":"Free throws from flagrant foul","type":"boolean"},"in_shootout":{"description":"Currently in shootout","type":"boolean"},"playoff_status":{"description":"Tournament in playoff","type":"boolean"},"away_goalie_id":{"description":"Current away goalie player ID","type":"string"},"balls":{"description":"Ball count (0-3)","type":"integer"},"home_corners":{"description":"Soccer home corner kicks","type":"integer"},"home_shootout_goals":{"description":"Home team shootout goals","type":"integer"},"pitcher_pitch_type":{"description":"Last pitch type","type":"string"},"away_possession":{"description":"Soccer away ball possession percentage","maximum":100,"minimum":0,"type":"number"},"scoring_average":{"description":"Current round scoring average","type":"number"},"empty_net":{"description":"Empty net situation","type":"boolean"},"home_shots_on_target":{"description":"Soccer home shots on target","type":"integer"},"away_bonus":{"description":"Away team in bonus situation","type":"boolean"},"details_version":{"description":"Version of the details contract. Present and `1` in the contract format; absent in legacy provider-shaped objects.","example":1,"type":"integer"},"weather_humidity":{"description":"Humidity percentage","type":"integer"},"neutral_site":{"description":"Neutral site game","type":"boolean"},"free_throw_shots_made":{"description":"Free throws made so far","type":"integer"},"attendance":{"description":"Game attendance","type":"integer"},"total_rounds":{"description":"Total tournament rounds","type":"integer"},"hitter_full_name":{"description":"Current batter name","type":"string"},"pace":{"description":"Possessions per 48 minutes","type":"number"},"outs":{"description":"Outs in inning (0-2)","type":"integer"},"round_number":{"description":"Current round (1-4+)","type":"integer"},"free_throw_shooter_name":{"description":"Name of free throw shooter","type":"string"},"cut_line":{"description":"Score needed to make cut","type":"integer"},"distance":{"description":"Yards to go for first down","type":"integer"},"free_throw_shooter_id":{"description":"Player ID shooting free throws","type":"string"},"field_size":{"description":"Total number of players","type":"integer"},"play_clock":{"description":"Seconds on play clock","type":"integer"},"hits_away":{"description":"Away team hits","type":"integer"},"inside_two_minutes":{"description":"Less than two minutes remaining","type":"boolean"},"driving_distance_leader":{"description":"Driving distance leader player ID","type":"string"},"home_goalie_id":{"description":"Current home goalie player ID","type":"string"},"intermission":{"description":"Between periods/halves","type":"boolean"},"hitter_outcome_id":{"description":"At-bat outcome identifier","type":"string"},"blocked_shots_away":{"description":"Away team blocked shots","type":"integer"},"away_on_power_play":{"description":"Away team on power play","type":"boolean"},"last_faceoff_winner":{"description":"Team that won last faceoff","enum":["home","away"],"type":"string"},"red_zone":{"description":"In red zone (20 yards or less)","type":"boolean"},"game_clock":{"description":"Current game clock time","type":"string"},"man_advantage":{"description":"Current man advantage (e.g., '5v4', 'even')","type":"string"},"blocked_shots_home":{"description":"Home team blocked shots","type":"integer"},"away_goalie_pulled":{"description":"Away goalie pulled","type":"boolean"},"power_play_time_remaining":{"description":"Seconds remaining on power play","type":"integer"},"weather_wind_direction":{"description":"Wind direction","type":"string"},"players_made_cut":{"description":"Players making the cut","type":"integer"},"par_for_course":{"description":"Course par","type":"integer"},"two_minute_warning":{"description":"Two minute warning called","type":"boolean"},"pitcher_pitch_speed":{"description":"Last pitch speed (mph)","type":"number"},"possession_arrow":{"description":"Possession arrow (college)","enum":["home","away"],"type":"string"},"away_shootout_goals":{"description":"Away team shootout goals","type":"integer"},"free_throw_shots_attempted":{"description":"Free throws attempted so far","type":"integer"},"home_red_cards":{"description":"Soccer home red cards (includes second-yellow dismissals)","type":"integer"},"weather_condition":{"description":"Weather condition","type":"string"},"away_team_fouls":{"description":"Away team fouls this period/half","type":"integer"},"pitcher_pitch_y":{"description":"Pitch location Y coordinate","type":"number"},"down":{"description":"Current down (1-4)","type":"integer"},"last_score_time":{"description":"When last score occurred","type":"string"},"clock_running":{"description":"Whether game clock is running","type":"boolean"},"overtime_number":{"description":"Which overtime period","type":"integer"},"match_minute":{"description":"Soccer elapsed match clock as MM:SS (stoppage time excluded). Tick locally between updates.","example":"45:00","type":"string"},"precipitation":{"description":"Active precipitation","type":"boolean"},"home_shots":{"description":"Soccer home total shots","type":"integer"},"shots_on_goal_away":{"description":"Away team shots on goal","type":"integer"},"away_shots_on_target":{"description":"Soccer away shots on target","type":"integer"},"turnover_on_downs_risk":{"description":"Probability of turnover on downs (0.0-1.0)","type":"number"},"active_penalties":{"description":"Currently active penalties with details","items":{"properties":{"duration":{"description":"Penalty duration in minutes","type":"integer"},"major_penalty":{"description":"Is major penalty","type":"boolean"},"misconduct":{"description":"Is misconduct penalty","type":"boolean"},"penalty_start_time":{"description":"When penalty started","type":"string"},"penalty_type":{"description":"Type of penalty","type":"string"},"player_id":{"description":"Penalized player ID","type":"string"},"player_name":{"description":"Penalized player name","type":"string"},"team_id":{"description":"Team of penalized player","type":"string"},"time_remaining":{"description":"Time remaining in seconds","type":"integer"}},"type":"object"},"type":"array"},"field_goal_range":{"description":"Within field goal range","type":"boolean"},"free_throw_bonus_situation":{"description":"Free throws from bonus","type":"boolean"},"weather_precipitation":{"description":"Is it precipitating","type":"boolean"},"face_off_wins_home":{"description":"Home team faceoff wins","type":"integer"}},"type":"object"},"event_id":{"description":"Event ID","format":"uuid","type":"string"},"home_score":{"description":"Home team total score (null for individual sports like golf)","example":14,"type":"integer"},"inserted_at":{"description":"Creation timestamp","format":"date-time","type":"string"},"league":{"description":"League abbreviation","example":"NFL","type":"string"},"observed_at":{"description":"Provider observation time of the served row (the elected row's own observation; unlike response_received_at it is never taken from a clock donor). Null when unknown.","example":"2024-01-15T15:32:09Z","format":"date-time","nullable":true,"type":"string"},"period":{"description":"Current period/quarter/inning (1-based, sport-specific numbering)","example":2,"type":"integer"},"period_half":{"description":"Period subdivision (e.g., 'top'/'bottom' for baseball innings)","enum":["top","bottom"],"example":"bottom","type":"string"},"period_half_over":{"description":"Whether the current period half is complete","type":"boolean"},"periods":{"description":"Per-period linescore, in period order. This is what `/v1/events/{id}/linescore` returns.","example":[{"away_score":3,"home_score":7,"number":1,"type":"regular_period"}],"items":{"additionalProperties":true,"type":"object"},"type":"array"},"response_received_at":{"description":"When we received this state from the upstream provider. This is the observation time, and it is the field to use to judge freshness or to interpolate a running clock — `updated_at` is a storage timestamp and moves even when the observation did not.","example":"2024-01-15T15:32:10Z","format":"date-time","type":"string"},"served_at":{"description":"When this response was assembled (UTC, whole seconds).","example":"2024-01-15T15:32:11Z","format":"date-time","nullable":true,"type":"string"},"source_rank":{"description":"Which provider's row was served and why it was chosen. `provider` is the provider family (`sportsstack` for a canonical row, whose backing vendor is not disclosed); `rank` is its position in the league's live primary order (0 = primary, null = outside the order or canonical); `reason` is `primary` (highest-ranked provider present), `fallback_stale` (a higher-ranked provider's row was older than the stale window), `single_provider` (only one provider reported), `freshest` (a fresher lower-ranked row was served), or null when the election's candidates are not visible to the tenant.","nullable":true,"properties":{"provider":{"example":"sportsstack","type":"string"},"rank":{"example":0,"nullable":true,"type":"integer"},"reason":{"enum":["primary","fallback_stale","single_provider","freshest"],"nullable":true,"type":"string"}},"type":"object"},"sport":{"description":"Sport name","enum":["football","basketball","baseball","hockey","ice_hockey","soccer","golf"],"example":"football","type":"string"},"status":{"description":"Lifecycle state of the event as reported by the provider (e.g. 'live', 'in_progress', 'halftime', 'closed', 'final'). Values are provider vocabulary and are not normalized across providers — use this to tell a live scoreboard from a finished one, not for settlement decisions.","example":"in_progress","type":"string"},"time_on_clock":{"description":"Time remaining in period - format varies by sport (MM:SS for timed sports, null for baseball/golf)","example":"14:30","type":"string"},"updated_at":{"description":"Last update timestamp","format":"date-time","type":"string"}},"required":["common_model_id","event_id","sport","league"],"title":"EventStatus","type":"object"},"ScoreboardDetailsV1Basketball":{"additionalProperties":false,"description":"Basketball. Every key is always present. A key whose value is not known is `null`, never `0`, `false` or an empty value.","properties":{"home_biggest_lead":{"description":"Biggest home team lead","maximum":1000000000,"minimum":0,"nullable":true,"type":"integer"},"away_shooting_foul_trouble":{"description":"Away team in foul trouble","nullable":true,"type":"boolean"},"home_timeouts":{"description":"Home team timeouts remaining","maximum":1000000000,"minimum":0,"nullable":true,"type":"integer"},"home_bonus":{"description":"Home team in bonus situation","nullable":true,"type":"boolean"},"last_play":{"description":"Description of last play","nullable":true,"type":"string"},"home_double_bonus":{"description":"Home team in double bonus","nullable":true,"type":"boolean"},"times_tied":{"description":"Number of times tied","maximum":1000000000,"minimum":0,"nullable":true,"type":"integer"},"lead_changes":{"description":"Number of lead changes","maximum":1000000000,"minimum":0,"nullable":true,"type":"integer"},"away_timeouts":{"description":"Away team timeouts remaining","maximum":1000000000,"minimum":0,"nullable":true,"type":"integer"},"free_throw_shots_awarded":{"description":"Number of free throws awarded","maximum":1000000000,"minimum":0,"nullable":true,"type":"integer"},"home_team_fouls":{"description":"Home team fouls this period/half","maximum":1000000000,"minimum":0,"nullable":true,"type":"integer"},"shot_clock_running":{"description":"Whether shot clock is running","nullable":true,"type":"boolean"},"free_throw_clear_path_foul":{"description":"Free throws from clear path foul","nullable":true,"type":"boolean"},"free_throw_current_attempt":{"description":"Current free throw attempt number","maximum":1000000000,"minimum":0,"nullable":true,"type":"integer"},"shot_clock":{"description":"Shot clock seconds remaining","maximum":1000000000,"minimum":0,"nullable":true,"type":"integer"},"free_throw_technical_foul":{"description":"Free throws from technical foul","nullable":true,"type":"boolean"},"home_shooting_foul_trouble":{"description":"Home team in foul trouble","nullable":true,"type":"boolean"},"away_biggest_lead":{"description":"Biggest away team lead","maximum":1000000000,"minimum":0,"nullable":true,"type":"integer"},"away_double_bonus":{"description":"Away team in double bonus","nullable":true,"type":"boolean"},"free_throw_and_one":{"description":"And-one free throw situation","nullable":true,"type":"boolean"},"free_throw_flagrant_foul":{"description":"Free throws from flagrant foul","nullable":true,"type":"boolean"},"away_bonus":{"description":"Away team in bonus situation","nullable":true,"type":"boolean"},"details_version":{"description":"Version of the details format. Always `1` in this format.","enum":[1],"type":"integer"},"free_throw_shots_made":{"description":"Free throws made so far","maximum":1000000000,"minimum":0,"nullable":true,"type":"integer"},"attendance":{"description":"Game attendance","maximum":1000000000,"minimum":0,"nullable":true,"type":"integer"},"pace":{"description":"Possessions per 48 minutes","maximum":1.0e12,"minimum":0,"nullable":true,"type":"number"},"free_throw_shooter_name":{"description":"Name of free throw shooter","nullable":true,"type":"string"},"intermission":{"description":"Between periods/halves","nullable":true,"type":"boolean"},"game_clock":{"description":"Current game clock time","nullable":true,"pattern":"^\\d{1,3}:[0-5]\\d(\\.\\d+)?$","type":"string"},"possession_arrow":{"description":"Possession arrow (college)","enum":["home","away",null],"nullable":true,"type":"string"},"free_throw_shots_attempted":{"description":"Free throws attempted so far","maximum":1000000000,"minimum":0,"nullable":true,"type":"integer"},"away_team_fouls":{"description":"Away team fouls this period/half","maximum":1000000000,"minimum":0,"nullable":true,"type":"integer"},"last_score_time":{"description":"When last score occurred","nullable":true,"type":"string"},"clock_running":{"description":"Whether game clock is running","nullable":true,"type":"boolean"},"overtime_number":{"description":"Which overtime period","maximum":1000000000,"minimum":0,"nullable":true,"type":"integer"},"free_throw_bonus_situation":{"description":"Free throws from bonus","nullable":true,"type":"boolean"}},"required":["attendance","away_biggest_lead","away_bonus","away_double_bonus","away_shooting_foul_trouble","away_team_fouls","away_timeouts","clock_running","details_version","free_throw_and_one","free_throw_bonus_situation","free_throw_clear_path_foul","free_throw_current_attempt","free_throw_flagrant_foul","free_throw_shooter_name","free_throw_shots_attempted","free_throw_shots_awarded","free_throw_shots_made","free_throw_technical_foul","game_clock","home_biggest_lead","home_bonus","home_double_bonus","home_shooting_foul_trouble","home_team_fouls","home_timeouts","intermission","last_play","last_score_time","lead_changes","overtime_number","pace","possession_arrow","shot_clock","shot_clock_running","times_tied"],"type":"object"},"PredictionAcceptance":{"description":"Fail-closed 14-day scheduled acceptance. Missing, stale, unknown or revision-mismatched days break the streak; sparse racing and golf leagues remain provisional below three distinct competitions.","properties":{"cohort":{"items":{"type":"string"},"type":"array"},"current_streak_days":{"maximum":14,"minimum":0,"type":"integer"},"days":{"items":{"properties":{"checkpoint_window_start":{"format":"date_time","nullable":true,"type":"string"},"completed_at":{"format":"date_time","nullable":true,"type":"string"},"date":{"format":"date","type":"string"},"deployed_sha":{"nullable":true,"type":"string"},"live_activity":{"properties":{"listing_count":{"minimum":0,"type":"integer"},"observed_at":{"format":"date_time","nullable":true,"type":"string"}},"required":["listing_count","observed_at"],"type":"object"},"reason_codes":{"items":{"type":"string"},"type":"array"},"report_id":{"format":"uuid","nullable":true,"type":"string"},"report_revision":{"nullable":true,"type":"integer"},"status":{"enum":["PASS","UNKNOWN","ACTION_REQUIRED"],"type":"string"}},"required":["date","status","report_id","report_revision","deployed_sha","checkpoint_window_start","completed_at","live_activity","reason_codes"],"type":"object"},"maxItems":14,"minItems":14,"type":"array"},"evaluated_at":{"format":"date_time","type":"string"},"last_scheduled_checkpoint":{"nullable":true,"properties":{"checkpoint_date":{"format":"date","type":"string"},"checkpoint_window_start":{"format":"date_time","nullable":true,"type":"string"},"completed_at":{"format":"date_time","nullable":true,"type":"string"},"deployed_sha":{"nullable":true,"type":"string"},"inserted_at":{"format":"date_time","nullable":true,"type":"string"},"reason_codes":{"items":{"type":"string"},"type":"array"},"report_id":{"format":"uuid","type":"string"},"report_revision":{"type":"integer"},"status":{"enum":["queued","running","completed","failed"],"type":"string"},"updated_at":{"format":"date_time","nullable":true,"type":"string"}},"required":["report_id","status","report_revision","deployed_sha","checkpoint_date","checkpoint_window_start","completed_at","inserted_at","updated_at","reason_codes"],"type":"object"},"reason_codes":{"items":{"type":"string"},"type":"array"},"report_revision":{"enum":[1],"type":"integer"},"required_streak_days":{"enum":[14],"type":"integer"},"sparse_competitions":{"items":{"properties":{"buckets":{"items":{"properties":{"distinct_competition_count":{"minimum":0,"type":"integer"},"minimum_required":{"enum":[3],"type":"integer"},"scope":{"enum":["events","futures"],"type":"string"},"state":{"enum":["PASS","PROVISIONAL"],"type":"string"},"venue":{"enum":["kalshi","limitless","polymarket","predict_fun","prophetx"],"type":"string"}},"required":["venue","scope","distinct_competition_count","minimum_required","state"],"type":"object"},"maxItems":10,"minItems":8,"type":"array"},"canonical_id":{"format":"uuid","type":"string"},"distinct_competition_count":{"minimum":0,"type":"integer"},"league":{"type":"string"},"minimum_required":{"enum":[3],"type":"integer"},"state":{"enum":["PASS","PROVISIONAL"],"type":"string"}},"required":["league","canonical_id","distinct_competition_count","minimum_required","state","buckets"],"type":"object"},"maxItems":6,"minItems":6,"type":"array"},"status":{"enum":["PASS","PROVISIONAL","ACTION_REQUIRED"],"type":"string"},"tenant_fingerprint":{"maxLength":64,"minLength":64,"type":"string"}},"required":["status","report_revision","tenant_fingerprint","cohort","current_streak_days","required_streak_days","days","sparse_competitions","reason_codes","evaluated_at","last_scheduled_checkpoint"],"title":"PredictionAcceptance","type":"object"},"ScoreboardDetailsV1Tennis":{"additionalProperties":false,"description":"Tennis. Every key is always present. A key whose value is not known is `null`, never `0`, `false` or an empty value.","properties":{"details_version":{"description":"Version of the details format. Always `1` in this format.","enum":[1],"type":"integer"},"retirement_info":{"description":"The source's retirement or walkover record: `null` unless the source reports an object, and a field the source does not report is `null`. `winner` is the winner as the source reports it; text of the form `prefix:type:value` is returned as `null`.","nullable":true,"properties":{"walkover":{"nullable":true,"type":"boolean"},"winner":{"nullable":true,"type":"string"}},"required":["walkover","winner"],"type":"object"}},"required":["details_version","retirement_info"],"type":"object"},"League":{"description":"A league represents an organized sports competition or governing body for a specific sport.\n\nLeagues group teams and players under common rules, schedules, and administrative structure.\nThey serve as the organizational framework that governs seasons, playoffs, and championships.\nEach league belongs to a specific sport and has its own unique characteristics, rules, and format.\n\n## Examples by Sport\n- **Football**: NFL (National Football League), NCAA (College Football)\n- **Basketball**: NBA (National Basketball Association), WNBA, NCAA Basketball\n- **Baseball**: MLB (Major League Baseball), MiLB (Minor League Baseball)\n- **Hockey**: NHL (National Hockey League), AHL (American Hockey League)\n- **Golf**: PGA Tour, European Tour, LPGA Tour\n- **Soccer**: Premier League, La Liga, MLS, Champions League\n\n## Key Relationships\n- **Sport**: Each league belongs to exactly one sport\n- **Teams**: Professional leagues contain teams that compete\n- **Events**: All games/matches within the league structure\n- **Players**: Athletes who participate in the league\n- **Seasons**: Time-bound competitive periods within the league\n\n## League Hierarchies\nSome sports have multiple tiers (e.g., MLB/MiLB, Premier League/Championship)\nor different divisions (AFC/NFC in NFL, Eastern/Western Conference in NBA).\n","example":{"abbreviation":"NBA","common_model_id":"8019d4db-7854-4542-b4af-7265d4b57105","futures_count":12,"image_url":"https://cdn.example.com/logos/nfl/pit.png","name":"National Basketball Association","sport_id":"58e8c89b-72f8-4427-adbc-10f193c9b462"},"properties":{"abbreviation":{"description":"Common short form or acronym (e.g., 'NFL', 'NBA', 'EPL')","type":"string"},"common_model_id":{"description":"Unique league identifier in our unified system","type":"string"},"futures_count":{"description":"Number of tenant-visible future markets (outrights, season totals, awards) in this league: the same set `GET /futures?league_id=<league>` returns. 0 means none; null means the count could not be computed right now. Discovery flow: `GET /sports` -> `GET /leagues` -> `GET /futures?league_id&season_year&aggregator`. Present on `GET /leagues` and `GET /leagues/{id}`.","minimum":0,"nullable":true,"type":"integer"},"image_url":{"description":"League logo or official branding image","type":"string"},"market_count":{"description":"Number of distinct open markets (provider status active; suspended, closed, settled and unknown statuses are not counted) across this league's current events (tenant-visible, not finished, started within the last 36 hours or starting within the next 14 days), in sources visible to the tenant (the visibility `GET /markets` applies); each market counts once across venues. Values can be up to 60 seconds old. An open market is not necessarily priced right now. null means the count could not be computed right now (never 0). Present on `GET /leagues` and `GET /leagues/{id}`; null for the synthetic `CRYPTO` league.","minimum":0,"nullable":true,"type":"integer"},"market_counts_by_venue":{"additionalProperties":{"minimum":0,"type":"integer"},"description":"Per-venue (aggregator, e.g. `polymarket`, `kalshi`, `prophetx`, `predict_fun`, `limitless`, `polymarket_us`, `sxbet`) breakdown of `market_count`, with the same rules. Venues with no open market are omitted. Values can sum to more than `market_count`. null means the count could not be computed right now. Present on `GET /leagues` and `GET /leagues/{id}`; null for the synthetic `CRYPTO` league.","nullable":true,"type":"object"},"name":{"description":"Full official name of the league","type":"string"},"sport_id":{"description":"Reference to the sport this league governs","type":"string"}},"required":["name","abbreviation"],"title":"League","type":"object"},"Standings":{"description":"Historical standings or rankings snapshot for a specific tenant, entity, season, and season type.\n\nRecords nightly provider imports so you can query past ranks,\ngames-back deltas, and splits while the most recent regular-season snapshot is surfaced\non `Team.metadata`.\n","example":{"for_entity_id":"01c7133f-2999-4803-9872-8c2ab1ba63ac","for_entity_type":"team","league_id":"32fa944f-b1bd-41b4-bec2-7ab269fde6fc","metadata":{"conference_name":"NFC","division_name":"NFC East"},"primary_group":"NFC East","primary_group_type":"division","ranking_overall":3,"ranking_primary_context":"division","ranking_primary_value":1,"record_losses":2,"record_ties":0,"record_wins":11,"season_type":"REG","season_year":2024,"secondary_group":"NFC","secondary_group_type":"conference","source_for_entity_id":"competitor_4422","table_type":"standings","team_id":"01c7133f-2999-4803-9872-8c2ab1ba63ac"},"properties":{"status_streak_type":{"description":"Identifier for the current streak (WIN, LOSS, TIE)","type":"string"},"split_away_ties":{"description":"Away ties","type":"integer"},"scoring_against":{"description":"Total scoring against","type":"integer"},"ranking_points":{"description":"Table points (soccer/rugby/etc.)","type":"integer"},"secondary_group_type":{"description":"Type of secondary grouping.\nValues: conference, league, null\n","enum":["conference","league"],"nullable":true,"type":"string"},"split_division_losses":{"description":"Division losses","type":"integer"},"scoring_unit":{"description":"Unit for scoring metrics (points, runs, goals, etc.)","type":"string"},"source_for_entity_id":{"description":"Provider source identifier for the ranked/standing entity.","nullable":true,"type":"string"},"record_games_played":{"description":"Total games played","type":"integer"},"ranking_overall":{"description":"Overall/league rank","type":"integer"},"ranking_primary_value":{"type":"integer"},"split_last10_ties":{"description":"Ties over last 10","type":"integer"},"ranking_group":{"description":"Group/Pool rank","type":"integer"},"split_away_wins":{"description":"Away wins","type":"integer"},"split_home_ties":{"description":"Home ties","type":"integer"},"split_last10_wins":{"description":"Wins over last 10","type":"integer"},"season_type":{"description":"Season segment (PRE, REG, PST, etc.)","type":"string"},"record_losses":{"description":"Total losses","type":"integer"},"record_ties":{"description":"Total ties","type":"integer"},"record_games_back":{"description":"Games behind the division leader","format":"float","type":"number"},"status_streak_text":{"description":"Human-readable streak text","type":"string"},"record_win_pct":{"description":"Win percentage","format":"float","type":"number"},"league_id":{"description":"League this snapshot belongs to","type":"string"},"ranking_secondary_value":{"type":"integer"},"split_division_wins":{"description":"Division wins","type":"integer"},"for_entity_id":{"description":"Common Model ID of the team or player represented by this row.","type":"string"},"id":{"description":"Standings record identifier","type":"string"},"split_home_losses":{"description":"Home losses","type":"integer"},"record_wildcard_back":{"description":"Games behind the wildcard leader","format":"float","type":"number"},"split_conference_wins":{"description":"Conference wins","type":"integer"},"tenant_id":{"description":"Tenant that owns this standings snapshot","type":"string"},"primary_group":{"description":"Most granular organizational grouping name. Works across all sports.\nExamples: \"NFC East\" (NFL), \"Group E\" (World Cup), \"Atlantic\" (NBA).\n","nullable":true,"type":"string"},"split_last10_losses":{"description":"Losses over last 10","type":"integer"},"status_clinched":{"description":"Clinched qualifier (division, wildcard, playoff, etc.)","type":"string"},"ranking_primary_context":{"description":"Context for the primary rank value (division, conference, etc.)","type":"string"},"record_wins":{"description":"Total wins","type":"integer"},"scoring_diff":{"description":"Scoring differential","type":"integer"},"for_entity_type":{"description":"Entity type represented by this row.","enum":["team","player"],"type":"string"},"split_conference_losses":{"description":"Conference losses","type":"integer"},"ranking_secondary_context":{"description":"Context for the secondary rank value","type":"string"},"season_id":{"description":"Season Common Model ID","type":"string"},"split_home_wins":{"description":"Home wins","type":"integer"},"season_year":{"description":"Season year","type":"integer"},"ranking_wildcard":{"description":"Wildcard rank","type":"integer"},"split_conference_ties":{"description":"Conference ties","type":"integer"},"status_elimination_number":{"description":"Elimination number for the current race","type":"integer"},"team_id":{"description":"Legacy compatibility field. Mirrors `for_entity_id` when `for_entity_type=team`.","nullable":true,"type":"string"},"split_away_losses":{"description":"Away losses","type":"integer"},"secondary_group":{"description":"Parent/higher-level organizational grouping if exists.\nExamples: \"NFC\" (NFL), \"Eastern Conference\" (NBA), null (World Cup).\n","nullable":true,"type":"string"},"status_streak_length":{"description":"Length of the streak","type":"integer"},"scoring_for":{"description":"Total scoring for","type":"integer"},"standings_date":{"description":"Date/time for when the standings payload was generated","format":"date-time","type":"string"},"metadata":{"additionalProperties":true,"description":"Provider payload fragments plus sport-specific splits/rankings.\n\nNote: Universal organizational hierarchy is now available as top-level fields\n(`primary_group`, `primary_group_type`, `secondary_group`, `secondary_group_type`).\n\n## Sport-Specific Fields (Legacy/Backward Compatibility)\n\n- `division_name` (string): Division name (NFL, NBA, MLB)\n- `conference_name` (string): Conference name (NFL, NBA)\n- `group_name` (string): Group name (World Cup, Champions League)\n\n## Additional Metadata\n\n- `rankings` - Additional ranking breakdowns\n- `split` - Game split details (home/away/division/conference)\n- `scoring_secondary` - Secondary scoring metrics\n- `advanced_metrics` - Provider-specific advanced stats\n","type":"object"},"table_type":{"description":"Distinguishes standings tables from rankings tables.","enum":["standings","ranking"],"type":"string"},"primary_group_type":{"description":"Type of primary grouping. Use this to determine UI labels.\nValues: division, group, conference, region, pool\n","enum":["division","group","conference","region","pool"],"nullable":true,"type":"string"},"split_division_ties":{"description":"Division ties","type":"integer"}},"required":["for_entity_type","for_entity_id","table_type","season_id","season_year","season_type"],"title":"Standings","type":"object"},"Outcome":{"description":"A specific betting outcome within a market, representing one possible result that bettors can wager on.\n\n## Outcome Standardization\n\nOutcomes undergo market-type-specific standardization to ensure consistent field formats:\n\n### Total Points Markets (Over/Under)\n```\nname: \"Over 228.5\"              # Human-readable with line value\nline: 228.5                     # Numeric line value\nselection: nil                  # No specific entity selection\nselection_line: \"over\"          # Direction (over/under)\nnormalized_selection: nil       # No entity to normalize\ngrouping_key: \"default:-228.5\" # Groups over/under for same line\n```\n\n### Point Spread Markets (Handicap)\n```\nname: \"Indiana Pacers +11\"           # Team name + formatted spread\nline: 11.0                           # Absolute line value\nselection: \"Indiana Pacers\"          # Team name\nselection_line: nil                  # Not applicable for spreads\nnormalized_selection: \"indiana_pacers\" # Lowercase, underscores\ngrouping_key: \"default:-11.0\"       # Groups home/away for same spread\n```\n\n### Moneyline Markets (Winner)\n```\nname: \"Oklahoma City Thunder\"               # Team name\nline: nil                                   # No line for moneyline\nselection: \"Oklahoma City Thunder\"          # Team name\nselection_line: nil                         # Not applicable\nnormalized_selection: \"oklahoma_city_thunder\" # Lowercase, underscores\ngrouping_key: \"default:Oklahoma City Thunder\" # Groups by team\n```\n\n### Field Standardization\n- **name**: Human-readable outcome description with context\n- **selection**: Entity being selected (team/player name or null)\n- **normalized_selection**: Lowercase, underscore-separated for consistent querying\n- **line**: Numeric betting line (spread/total value, null for moneyline)\n- **selection_line**: Direction for totals (\"over\"/\"under\"), null otherwise\n- **grouping_key**: Groups related outcomes (same spread/total different sides)\n","example":{"common_model_id":"123e4567-e89b-12d3-a456-426614174010","event_id":"30568865","grouping_key":"DraftKings-30568865-h2h","inserted_at":"2024-09-10T14:30:00Z","is_alternate_line":false,"is_main":true,"line":1.5,"market_id":"123e4567-e89b-12d3-a456-426614174011","market_type":"h2h","metadata":{"source":"draftkings","source_event_id":"30568865","source_market_id":"DraftKings-30568865-h2h"},"name":"DraftKings - 30568865 - h2h - Seattle Seahawks","normalized_selection":"Seattle Seahawks","player_id":"59291391-0c7e-442b-9496-33074647384e","selection":"Seattle Seahawks","selection_line":"1.5","stat_type":"points","status":"active","team_id":"58e8c89b-72f8-4427-adbc-10f193c9b462","tenant_id":"ff6332b6-8151-4a13-b20c-bd7b2ab45452","updated_at":"2024-09-11T09:15:00Z"},"properties":{"common_model_id":{"description":"Market ID","type":"string"},"event_id":{"description":"Event ID","type":"string"},"grouping_key":{"description":"Grouping Key","type":"string"},"inserted_at":{"description":"Timestamp of creation","format":"date-time","type":"string"},"is_alternate_line":{"description":"Is Alternate Line","type":"boolean"},"is_main":{"description":"Is Main","type":"boolean"},"line":{"description":"Line (if applicable)","type":"number"},"market_id":{"description":"Market ID","type":"string"},"market_type":{"description":"Market Type","type":"string"},"metadata":{"description":"Metadata. For prediction markets this includes an \"execution\" block carrying the trade-execution identifiers for the originating venue (venue, ticker/token_id, side, condition_id, neg_risk, tick_size, venue contracts, url). See the Prediction-Market Execution integration guide.","type":"object"},"name":{"description":"Name","type":"string"},"normalized_selection":{"description":"Normalized Selection","type":"string"},"odds":{"description":"Odds","items":{"description":"Betting odds from a specific sportsbook for a particular outcome, representing the price and probability.\n\n## Odds Standardization\n\nOdds undergo standardization to ensure consistent pricing representation and source attribution:\n\n### Source Selection Name Standardization\nThe `source_selection_name` field identifies what the sportsbook is offering odds on:\n\n#### Total Points Markets\n```\nsource_selection_name: nil  # No specific team/player selection\n```\n\n#### Point Spread Markets\n```\nsource_selection_name: \"Indiana Pacers\"     # Team receiving the spread\n# Derived from event.participants based on outcome selection\n```\n\n#### Moneyline Markets\n```\nsource_selection_name: \"Oklahoma City Thunder\"  # Team to win\n# Derived from event.participants based on outcome selection\n```\n\n### Price Standardization\n- **price**: Standardized to American odds format (-110, +150, etc.)\n- **price_type**: Always \"american\" for consistency\n- **timestamp**: UTC timestamp when current odds were observed. When the\n  response comes from the durable line-summary fallback, this is the time\n  the returned closing price last changed; same-price provider\n  reaffirmations do not advance it.\n\n### Sportsbook Attribution\n- **sportsbook**: Standardized sportsbook name (DraftKings, FanDuel, etc.)\n- **aggregator**: Upstream provider key or `sportsstack` for the canonical SportsStack board\n- **aggregator_event_id**: Provider's event identifier for traceability\n\n### Historical Tracking\nOdds include both current and opening lines for trend analysis:\n- Current odds: Real-time pricing from sportsbooks\n- Opening odds: Initial lines when market opened\n- Movement tracking: Compare current vs opening for line movement insights\n","example":{"aggregator":"sportsstack","aggregator_event_id":null,"fetched_at":"2026-04-21T17:40:00Z","metadata":{"aggregator":"sportsstack","id":"0HC75256377P350_1","link":"https://sportsbook.draftkings.com/event/30568865?outcomes=0HC75256377P350_1","selected_source":"example_provider.football.nfl","selection_reason":"trust_then_freshness","selection_tier":1,"source":"sportsstack","source_event_id":"30568865","source_market_id":"DraftKings-30568865-spreads","sportsstack_kind":"canonical_book_quote"},"price":-110,"price_type":"american","source_event_id":"30568865","source_id":"0HC75256377P350_1","source_market_id":"DraftKings-30568865-spreads","source_selection_id":"0HC75256377P350_1","source_selection_name":"Seattle Seahawks","sportsbook":"draftkings"},"properties":{"aggregator":{"description":"Upstream provider name or 'sportsstack' for the canonical SportsStack sportsbook board","type":"string"},"aggregator_event_id":{"description":"Aggregator event ID","type":"string"},"canonical_outcome_id":{"description":"Verified cross-venue economic outcome ID. Null when outcome equivalence is unresolved, push-capable, three-way, or ambiguous.","format":"uuid","nullable":true,"type":"string"},"clock_provenance":{"properties":{"evaluated_at":{"format":"date-time","type":"string"},"max_age_seconds":{"enum":[300],"type":"integer"},"quote_provenance":{"description":"Unmodified retained JSON provenance, including legacy or malformed evidence.","nullable":true},"source":{"enum":["timestamp",null],"nullable":true,"type":"string"}},"type":"object"},"common_model_id":{"description":"Market ID","type":"string"},"deep_link":{"description":"Desktop sportsbook deep link URL","type":"string"},"execution_readiness":{"description":"Requires exact native source-ID binding, active parent/outcome lifecycle and proven fresh provider clock; not order-fill certification. ProphetX additionally requires one atomic native strike/price/size/time observation matching its documented submit-order fields. ready=null means unknown. Native IDs remain separate from common_model_id.","example":{"available_size":{"state":"unknown","value":null},"depth":{"state":"unknown","value":null},"executable":{"reason":"catalog_is_not_a_book","state":"unknown"},"identifiers_valid":true,"liquidity":{"state":"unknown","value":null},"ready":null,"reasons":["provider_clock_provenance_downgrade"],"scope":"outcome_identifiers_and_provider_clock","venue":"limitless"},"properties":{"available_size":{"additionalProperties":true,"description":"Retained evidence; absent measurements have state unknown and value null.","type":"object"},"depth":{"additionalProperties":true,"description":"Retained evidence; absent measurements have state unknown and value null.","type":"object"},"executable":{"additionalProperties":true,"description":"Retained evidence; absent measurements have state unknown and value null.","type":"object"},"identifiers_valid":{"type":"boolean"},"liquidity":{"additionalProperties":true,"description":"Retained evidence; absent measurements have state unknown and value null.","type":"object"},"ready":{"nullable":true,"type":"boolean"},"reasons":{"items":{"type":"string"},"type":"array"},"scope":{"enum":["outcome_identifiers_and_provider_clock"],"type":"string"},"venue":{"type":"string"}},"type":"object"},"fetched_at":{"description":"Timestamp when SportsStack fetched or observed this quote","format":"date-time","nullable":true,"type":"string"},"freshness_reasons":{"description":"Deterministic provider_clock_* or lifecycle_* reasons; empty when fresh.","items":{"type":"string"},"type":"array"},"inserted_at":{"description":"Timestamp of creation","format":"date-time","type":"string"},"line_alignment":{"description":"SS main-line ladder plan Phase D. Present only for event-scoped, `latest_only=true` `/v1/odds` requests (`event_id` given) -- the key itself is absent from the response row (not present with a null body) for non-event-scoped `league_id`/list requests, since computing it there would mean an unbounded per-request ladder fetch across many events. Read-time derived from CommonModel.Betting.PredictionMarkets.LineLadder; never renames, removes, or reinterprets the sibling `is_main` field (the stored, write-time value) -- purely additive. All three sub-fields are null together when this row was not matched into a ranked ladder slot (e.g. a moneyline row, which has no alt-strike ladder, or a real-sportsbook row, which LineLadder never covers).","example":{"alignment_group":{"family":"spread","market_type":"point_spread","side":{"sign":"negative","team_id":null}},"is_main_derived":true,"sibling_line_count":2},"nullable":true,"properties":{"alignment_group":{"additionalProperties":true,"description":"The {market_type, family, side} ladder slot this row was matched into.","nullable":true,"type":"object"},"is_main_derived":{"description":"Whether LineLadder derived this row as the closest-to-even main line for its venue/slot, independent of the stored `is_main` column.","nullable":true,"type":"boolean"},"sibling_line_count":{"description":"Number of lines this row's own venue quotes within the same ladder slot.","nullable":true,"type":"integer"}},"type":"object"},"metadata":{"additionalProperties":true,"description":"Metadata. For prediction markets this includes an \"execution\" block carrying the trade-execution identifiers for the originating venue (venue, ticker/token_id, side, condition_id, neg_risk, tick_size, venue contracts, url). See the Prediction-Market Execution integration guide. UFC conditional markets expose \"probability_semantics\": \"conditional\", a structured \"condition\" object, and a plain-language \"void_condition\".","properties":{"condition":{"additionalProperties":true,"nullable":true,"properties":{"fight_result":{"description":"Fight-result condition for a conditional UFC market.","enum":["finish","decision"],"type":"string"},"round":{"description":"Optional round constraint for the conditional market.","minimum":1,"nullable":true,"type":"integer"}},"required":["fight_result"],"type":"object"},"probability_semantics":{"description":"Set to \"conditional\" when this price is conditional on the described fight result.","enum":["conditional"],"nullable":true,"type":"string"},"void_condition":{"description":"Plain-language condition under which a conditional UFC market is voided.","nullable":true,"type":"string"}},"type":"object"},"mobile_deep_link":{"description":"Mobile/native app deep link URL","type":"string"},"outcome_id":{"description":"Venue-backed SportsStack outcome ID","type":"string"},"platform_observed_at":{"description":"Prediction quotes only. Row observed_at, independently of provider freshness.","format":"date-time","nullable":true,"type":"string"},"price":{"description":"Price","type":"number"},"price_type":{"description":"Price format ('decimal', 'american')","type":"string"},"provider_freshness":{"description":"Prediction quotes only. Fresh requires a proven nonfuture provider clock at most 300 seconds old and proven active exact-parent/outcome lifecycle. Standalone odds report unknown without lifecycle proof.","enum":["fresh","stale","unknown"],"type":"string"},"provider_observed_at":{"description":"Prediction quotes only. Authoritative provider quote timestamp; never receipt/observation time. Requires matching observed quote_provenance.provider_updated_at; null for absent, synthetic or downgraded authority.","format":"date-time","nullable":true,"type":"string"},"reference_alignment":{"description":"Present only on crypto odds rows (omitted on sports rows; `line_alignment` is the\nsports ladder analogue and is omitted on crypto rows). `alignment` is `exact` (this\nmarket spans two or more venues), `single_venue`, or `unverified_mirror`.\n`different_reference_market_ids` lists the OTHER `market_id`s of the same window\n(any reference source), symmetrically.\n","properties":{"alignment":{"enum":["exact","single_venue","unverified_mirror"],"type":"string"},"alignment_group":{"description":"The window (event) id.","format":"uuid","type":"string"},"different_reference_market_ids":{"items":{"format":"uuid","type":"string"},"type":"array"},"reference_source":{"type":"string"},"tie_rule":{"enum":["up","split"],"type":"string"},"venue_count":{"minimum":1,"type":"integer"}},"title":"CryptoReferenceAlignment","type":"object"},"sgp_token":{"description":"Opaque same-game-parlay token supplied by the sportsbook. Null when the provider does not offer one.","nullable":true,"type":"string"},"source_event_id":{"description":"Source event ID","type":"string"},"source_id":{"description":"Source ID","type":"string"},"source_market_id":{"description":"Source market ID","type":"string"},"source_selection_id":{"description":"Source selection ID","type":"string"},"source_selection_name":{"description":"Source selection name","type":"string"},"sportsbook":{"description":"Sportsbook","type":"string"},"timestamp":{"description":"Provider quote timestamp","format":"date-time","nullable":true,"type":"string"},"trading_fees":{"description":"Prediction quotes only (absent on sportsbook rows and on venues whose fees are not captured yet: Limitless, ProphetX, Polymarket US, SX Bet). Computed at read time; no order-fill or account-specific guarantee (per-account discounts, maker rebates and balance-precision rounding are not modelled). Kalshi: rates from a versioned snapshot of Kalshi's public series metadata, event fee overrides and fee schedule; `observed_at` is the snapshot time. Series with event-level fee overrides (MLB) resolve per event: an override in force reports `scope: event` (with `event_ticker`, `effective_from`), before its `scheduled_ts` the series fee is reported with the pending change under `scheduled_override`, and an event missing from the snapshot reports `unknown` (`event_fee_override_not_in_snapshot`). Predict.fun: derived from the stored market `fee_rate_bps`; `observed_at` is the quote observation time. Polymarket: the market's own Gamma `feesEnabled`/`feeSchedule` captured with the quote (`fee = shares x rate x P x (1 - P)`, taker only, makers pay nothing; `maker.rebate_rate` is the fraction of taker fees returned to makers through a daily rebate program, not a per-fill credit; fees round to 5 decimal places with no published direction, so `rounding.direction` is absent); `observed_at` is the quote observation time, and quotes whose fee data is missing, has an exponent other than 1, or is not taker-only report `unknown`. The rate is per market (`sports_fees_v3` 0.05, `sports_fees_v2` 0.03, `zero_fees` 0 are all live on sports), never a category default.","example":{"availability":"published","charge_basis":"fill","fee_multiplier":1.0,"fee_type":"quadratic_with_maker_fees","maker":{"exponent":1,"model":"quadratic","multiplier":1.0,"rate":0.0175,"rounding":{"applies_to":"fee_plus_position_cost","direction":"up","increment":0.0001}},"observed_at":"2026-09-30T15:33:45Z","scope":"series","series_ticker":"KXNBAGAME","source":"kalshi_series_snapshot","taker":{"exponent":1,"model":"quadratic","multiplier":1.0,"rate":0.07,"rounding":{"applies_to":"fee_plus_position_cost","direction":"up","increment":0.0001}}},"properties":{"availability":{"enum":["published","unavailable","unknown"],"type":"string"},"charge_basis":{"description":"Fees are charged per fill, not per order or per settlement.","enum":["fill"],"type":"string"},"effective_from":{"description":"Kalshi, `scope: event`: the override's `scheduled_ts`, from which these rates apply.","format":"date-time","type":"string"},"event_ticker":{"description":"Kalshi: the market ticker minus its last `-` segment. Present for series with event-level fee overrides.","type":"string"},"fee_multiplier":{"type":"number"},"fee_rate_bps":{"type":"integer"},"fee_type":{"type":"string"},"fees_enabled":{"description":"Polymarket: the market's Gamma `feesEnabled` flag.","type":"boolean"},"maker":{"description":"One side of the fee. `quadratic`: fee = rate x contracts x (P x (1 - P)) ^ exponent. `linear_min_price`: fee = rate x min(P, 1 - P) x shares. `none`: no fee. `rate` already includes any venue multiplier.","properties":{"exponent":{"type":"integer"},"formula":{"type":"string"},"model":{"enum":["quadratic","linear_min_price","none"],"type":"string"},"multiplier":{"type":"number"},"rate":{"type":"number"},"rebate_rate":{"description":"Polymarket maker side: fraction of taker fees rebated to resting makers by the daily rebate program (context only, not a per-fill credit).","type":"number"},"rounding":{"properties":{"applies_to":{"type":"string"},"direction":{"enum":["up"],"type":"string"},"increment":{"type":"number"}},"type":"object"}},"type":"object"},"observed_at":{"format":"date-time","nullable":true,"type":"string"},"reason":{"description":"Present when availability is unknown; deterministic snake_case reason.","type":"string"},"scheduled_override":{"description":"Kalshi, `scope: series`: an event-level override that is not yet in force. Charged from `effective_from`; carries `fee_type`, `fee_multiplier`, `taker` and `maker` like the top-level object.","properties":{"effective_from":{"format":"date-time","type":"string"},"fee_multiplier":{"type":"number"},"fee_type":{"type":"string"},"maker":{"description":"One side of the fee. `quadratic`: fee = rate x contracts x (P x (1 - P)) ^ exponent. `linear_min_price`: fee = rate x min(P, 1 - P) x shares. `none`: no fee. `rate` already includes any venue multiplier.","properties":{"exponent":{"type":"integer"},"formula":{"type":"string"},"model":{"enum":["quadratic","linear_min_price","none"],"type":"string"},"multiplier":{"type":"number"},"rate":{"type":"number"},"rebate_rate":{"description":"Polymarket maker side: fraction of taker fees rebated to resting makers by the daily rebate program (context only, not a per-fill credit).","type":"number"},"rounding":{"properties":{"applies_to":{"type":"string"},"direction":{"enum":["up"],"type":"string"},"increment":{"type":"number"}},"type":"object"}},"type":"object"},"taker":{"description":"One side of the fee. `quadratic`: fee = rate x contracts x (P x (1 - P)) ^ exponent. `linear_min_price`: fee = rate x min(P, 1 - P) x shares. `none`: no fee. `rate` already includes any venue multiplier.","properties":{"exponent":{"type":"integer"},"formula":{"type":"string"},"model":{"enum":["quadratic","linear_min_price","none"],"type":"string"},"multiplier":{"type":"number"},"rate":{"type":"number"},"rebate_rate":{"description":"Polymarket maker side: fraction of taker fees rebated to resting makers by the daily rebate program (context only, not a per-fill credit).","type":"number"},"rounding":{"properties":{"applies_to":{"type":"string"},"direction":{"enum":["up"],"type":"string"},"increment":{"type":"number"}},"type":"object"}},"type":"object"}},"type":"object"},"scope":{"enum":["series","event","market"],"type":"string"},"series_ticker":{"type":"string"},"source":{"description":"kalshi_series_snapshot | kalshi_event_fee_snapshot | kalshi_fee_schedule_default | venue_record. `kalshi_event_fee_snapshot` is a Kalshi event-level override in force; `kalshi_fee_schedule_default` is the schedule default (quadratic x 1) inferred for a KX series not in the exception snapshot.","type":"string"},"taker":{"description":"One side of the fee. `quadratic`: fee = rate x contracts x (P x (1 - P)) ^ exponent. `linear_min_price`: fee = rate x min(P, 1 - P) x shares. `none`: no fee. `rate` already includes any venue multiplier.","properties":{"exponent":{"type":"integer"},"formula":{"type":"string"},"model":{"enum":["quadratic","linear_min_price","none"],"type":"string"},"multiplier":{"type":"number"},"rate":{"type":"number"},"rebate_rate":{"description":"Polymarket maker side: fraction of taker fees rebated to resting makers by the daily rebate program (context only, not a per-fill credit).","type":"number"},"rounding":{"properties":{"applies_to":{"type":"string"},"direction":{"enum":["up"],"type":"string"},"increment":{"type":"number"}},"type":"object"}},"type":"object"}},"type":"object"},"updated_at":{"description":"Timestamp when SportsStack last wrote this row","format":"date-time","type":"string"}},"required":["common_model_id","name"],"title":"Odds","type":"object"},"type":"array"},"player_id":{"description":"Player ID","type":"string"},"selection":{"description":"Selection","type":"string"},"selection_line":{"description":"Selection Line","type":"string"},"stat_type":{"description":"Stat type (if applicable)","type":"string"},"status":{"description":"Status","type":"string"},"team_id":{"description":"Team ID","type":"string"},"tenant_id":{"description":"Tenant ID","type":"string"},"updated_at":{"description":"Timestamp of last update","format":"date-time","type":"string"}},"required":["common_model_id","name"],"title":"Outcome","type":"object"},"CryptoWindow":{"description":"A calendar-grid crypto up/down window matched across Kalshi, Polymarket\nand Limitless (ParlayX). Identity, cross-venue match classes, each\nconstituent's native IDs, the venue's own lifecycle/result and an\nindicative per-constituent `quote`; SportsStack never computes settlement.\nPrefer the unified `CRYPTO` league surface (`/v1/events`, `/v1/odds`) for new\nintegrations; this endpoint is a documented alias of it.\n\nDiscovery lag (R1): Kalshi and Polymarket pre-list windows, so the next\nwindow is readable before `window_start`. Limitless creates 5m/15m\nmarkets 1-2 windows ahead but creates hourly/daily markets only at\n`window_start` itself, so a missing Limitless hourly/daily constituent\nfor up to 3 minutes after `window_start` is expected lag, not a gap.\n\n`status` is a window-clock computation (`upcoming`/`live`/`ended`\nrelative to `as_of`) and is independent of any constituent's result --\n`ended` does not imply any venue has posted a result yet; check each\nconstituent's own `lifecycle`/`result`.\n\nResult latency and correction bounds, measured from `window_end` (R6):\n\n| Venue | Published within 30 min of window_end | Later |\n|---|---|---|\n| Kalshi, Polymarket | visible within 5 min (live poll) | visible within 20 min (15-min sweep, up to window_end + 24h) |\n| Limitless | visible within 5 min during the first hour (3-min re-checks) | visible within 35 min (30-min re-checks) up to window_end + 24h |\n\nA later or different venue result, or a venue void, corrects the stored\nstate (bumping `result_revision`) up to `window_end` + 24h. A result is\nnever overwritten by a null except by an explicit venue void.\n\nData is retained for 30 days from `window_end`.\n","properties":{"as_of":{"description":"Frozen at the first page of a cursor walk so status stays stable.","format":"date_time","type":"string"},"asset":{"enum":["BTC","ETH","SOL","DOGE"],"type":"string"},"groups":{"items":{"description":"A cross-venue match class for this window. `exact` groups share one\n`family_id` (same window, reference source and tie rule) and are safe to\ntreat as one contract. `same_window_different_reference` groups share a\n`tie_rule` across two or more distinct `reference_source`s (for example\nKalshi's `cf_benchmarks_rti` vs Polymarket/Limitless's\n`chainlink_twap_60s`) -- same window and side convention, different\noracle, and must never be collapsed into `exact`.\n","properties":{"constituents":{"items":{"description":"One venue's native listing for a crypto window: its native IDs\n(`native_market_id`, `native_ref`, and `native_yes_token`/`native_no_token`\nwhen the venue exposes on-chain tokens) and, while the listing is quotable,\nan indicative `quote` from our one-minute poll. `result`/`resolved_at`/\n`end_price` are a pass-through of the venue's own settlement, never a\nSportsStack determination. Clients that need executable prices stream order\nbooks from the venue directly using the native IDs.\n","properties":{"end_price":{"format":"double","nullable":true,"type":"number"},"family_id":{"description":"Shared by every listing with the same window, reference source and tie rule.","format":"uuid","type":"string"},"last_changed_at":{"description":"Fetch time of the feed file that last changed this listing.","format":"date_time","type":"string"},"lifecycle":{"enum":["upcoming","live","closed","resolved","voided"],"type":"string"},"mirror_of":{"description":"For a Limitless listing, the Polymarket slug it mirrors.","nullable":true,"type":"string"},"native_market_id":{"description":"The venue's native market ID.","type":"string"},"native_no_token":{"description":"On-chain CLOB token ID for the Down/No side, when the venue exposes one.","nullable":true,"type":"string"},"native_ref":{"description":"The venue's ticker (Kalshi) or slug (Polymarket, Limitless).","type":"string"},"native_yes_token":{"description":"On-chain CLOB token ID for the Up/Yes side, when the venue exposes one.","nullable":true,"type":"string"},"quote":{"description":"The listing's indicative quote: our one-minute poll capture of the venue's\nprice (`observed_at` is OUR capture time, never a provider clock). `null`\nwhen the listing is not currently quotable: it is not `upcoming`/`live`, its\nwindow has ended, it has no quote, or the quote is older than 15 minutes.\nIndicative, not executable: `stale` is true once `age_ms` exceeds\n`stale_after_ms` (150 s for 5m/15m, 300 s for 1h, 600 s for 1d).\n","nullable":true,"properties":{"age_ms":{"minimum":0,"type":"integer"},"down":{"format":"double","maximum":1,"minimum":0,"type":"number"},"observed_at":{"format":"date_time","type":"string"},"source":{"enum":["kalshi_bid_ask_mid","kalshi_last","polymarket_clob_mid","polymarket_gamma","limitless_clob_mid","limitless_prices"],"type":"string"},"stale":{"type":"boolean"},"stale_after_ms":{"minimum":0,"type":"integer"},"up":{"format":"double","maximum":1,"minimum":0,"type":"number"}},"required":["up","down","source","observed_at","age_ms","stale_after_ms","stale"],"title":"CryptoWindowQuote","type":"object"},"reference_source":{"description":"The oracle/index this listing resolves against. Two listings of the\nsame window with different reference sources are the\n`same_window_different_reference` match class, not `exact` -- they\ncan and do disagree on start price and result even on a near-flat\nwindow. `binance_usdt_1m_noon` is the Binance USDT 1-minute candle at\n12:00 America/New_York, used by Polymarket's daily up/down markets.\n","enum":["cf_benchmarks_rti","chainlink_twap_60s","binance_usdt_1h_candle","binance_usdt_1m_noon"],"type":"string"},"resolved_at":{"format":"date_time","nullable":true,"type":"string"},"result":{"description":"The venue's own result, passed through unchanged. `null` does not\nmean \"no\": a window whose status is `ended` has not necessarily been\nresolved by the venue yet -- see the result-latency notes on the\nparent window.\n","enum":["up","down","split"],"nullable":true,"type":"string"},"result_revision":{"description":"Increments on every terminal-state correction (including voided -> resolved and back).","minimum":0,"type":"integer"},"settlement_value":{"format":"double","nullable":true,"type":"number"},"start_price":{"format":"double","nullable":true,"type":"number"},"tie_rule":{"enum":["up","split"],"type":"string"},"venue":{"enum":["kalshi","polymarket","limitless"],"type":"string"}},"required":["venue","native_market_id","native_ref","reference_source","tie_rule","family_id","lifecycle","result_revision","last_changed_at"],"title":"CryptoWindowConstituent","type":"object"},"minItems":2,"type":"array"},"family_id":{"description":"Set for `exact` groups; null for `same_window_different_reference`.","format":"uuid","nullable":true,"type":"string"},"match_class":{"enum":["exact","same_window_different_reference"],"type":"string"},"tie_rule":{"description":"Set for `same_window_different_reference` groups; null for `exact`.","nullable":true,"type":"string"}},"required":["match_class","constituents"],"title":"CryptoWindowGroup","type":"object"},"type":"array"},"horizon":{"enum":["5m","15m","1h","1d"],"type":"string"},"status":{"description":"Computed relative to `as_of`; does not imply any constituent has a result.","enum":["upcoming","live","ended"],"type":"string"},"unmatched":{"items":{"properties":{"constituent":{"description":"One venue's native listing for a crypto window: its native IDs\n(`native_market_id`, `native_ref`, and `native_yes_token`/`native_no_token`\nwhen the venue exposes on-chain tokens) and, while the listing is quotable,\nan indicative `quote` from our one-minute poll. `result`/`resolved_at`/\n`end_price` are a pass-through of the venue's own settlement, never a\nSportsStack determination. Clients that need executable prices stream order\nbooks from the venue directly using the native IDs.\n","properties":{"end_price":{"format":"double","nullable":true,"type":"number"},"family_id":{"description":"Shared by every listing with the same window, reference source and tie rule.","format":"uuid","type":"string"},"last_changed_at":{"description":"Fetch time of the feed file that last changed this listing.","format":"date_time","type":"string"},"lifecycle":{"enum":["upcoming","live","closed","resolved","voided"],"type":"string"},"mirror_of":{"description":"For a Limitless listing, the Polymarket slug it mirrors.","nullable":true,"type":"string"},"native_market_id":{"description":"The venue's native market ID.","type":"string"},"native_no_token":{"description":"On-chain CLOB token ID for the Down/No side, when the venue exposes one.","nullable":true,"type":"string"},"native_ref":{"description":"The venue's ticker (Kalshi) or slug (Polymarket, Limitless).","type":"string"},"native_yes_token":{"description":"On-chain CLOB token ID for the Up/Yes side, when the venue exposes one.","nullable":true,"type":"string"},"quote":{"description":"The listing's indicative quote: our one-minute poll capture of the venue's\nprice (`observed_at` is OUR capture time, never a provider clock). `null`\nwhen the listing is not currently quotable: it is not `upcoming`/`live`, its\nwindow has ended, it has no quote, or the quote is older than 15 minutes.\nIndicative, not executable: `stale` is true once `age_ms` exceeds\n`stale_after_ms` (150 s for 5m/15m, 300 s for 1h, 600 s for 1d).\n","nullable":true,"properties":{"age_ms":{"minimum":0,"type":"integer"},"down":{"format":"double","maximum":1,"minimum":0,"type":"number"},"observed_at":{"format":"date_time","type":"string"},"source":{"enum":["kalshi_bid_ask_mid","kalshi_last","polymarket_clob_mid","polymarket_gamma","limitless_clob_mid","limitless_prices"],"type":"string"},"stale":{"type":"boolean"},"stale_after_ms":{"minimum":0,"type":"integer"},"up":{"format":"double","maximum":1,"minimum":0,"type":"number"}},"required":["up","down","source","observed_at","age_ms","stale_after_ms","stale"],"title":"CryptoWindowQuote","type":"object"},"reference_source":{"description":"The oracle/index this listing resolves against. Two listings of the\nsame window with different reference sources are the\n`same_window_different_reference` match class, not `exact` -- they\ncan and do disagree on start price and result even on a near-flat\nwindow. `binance_usdt_1m_noon` is the Binance USDT 1-minute candle at\n12:00 America/New_York, used by Polymarket's daily up/down markets.\n","enum":["cf_benchmarks_rti","chainlink_twap_60s","binance_usdt_1h_candle","binance_usdt_1m_noon"],"type":"string"},"resolved_at":{"format":"date_time","nullable":true,"type":"string"},"result":{"description":"The venue's own result, passed through unchanged. `null` does not\nmean \"no\": a window whose status is `ended` has not necessarily been\nresolved by the venue yet -- see the result-latency notes on the\nparent window.\n","enum":["up","down","split"],"nullable":true,"type":"string"},"result_revision":{"description":"Increments on every terminal-state correction (including voided -> resolved and back).","minimum":0,"type":"integer"},"settlement_value":{"format":"double","nullable":true,"type":"number"},"start_price":{"format":"double","nullable":true,"type":"number"},"tie_rule":{"enum":["up","split"],"type":"string"},"venue":{"enum":["kalshi","polymarket","limitless"],"type":"string"}},"required":["venue","native_market_id","native_ref","reference_source","tie_rule","family_id","lifecycle","result_revision","last_changed_at"],"title":"CryptoWindowConstituent","type":"object"},"reason":{"enum":["no_match","mirror_counterpart_missing","mirror_terms_disagree"],"type":"string"}},"required":["reason","constituent"],"title":"CryptoWindowUnmatched","type":"object"},"type":"array"},"window_end":{"format":"date_time","type":"string"},"window_id":{"format":"uuid","type":"string"},"window_start":{"format":"date_time","type":"string"}},"required":["window_id","asset","horizon","window_start","window_end","status","as_of","groups","unmatched"],"title":"CryptoWindow","type":"object"},"CryptoReferenceAlignment":{"description":"Present only on crypto odds rows (omitted on sports rows; `line_alignment` is the\nsports ladder analogue and is omitted on crypto rows). `alignment` is `exact` (this\nmarket spans two or more venues), `single_venue`, or `unverified_mirror`.\n`different_reference_market_ids` lists the OTHER `market_id`s of the same window\n(any reference source), symmetrically.\n","properties":{"alignment":{"enum":["exact","single_venue","unverified_mirror"],"type":"string"},"alignment_group":{"description":"The window (event) id.","format":"uuid","type":"string"},"different_reference_market_ids":{"items":{"format":"uuid","type":"string"},"type":"array"},"reference_source":{"type":"string"},"tie_rule":{"enum":["up","split"],"type":"string"},"venue_count":{"minimum":1,"type":"integer"}},"title":"CryptoReferenceAlignment","type":"object"},"CryptoWindowGroup":{"description":"A cross-venue match class for this window. `exact` groups share one\n`family_id` (same window, reference source and tie rule) and are safe to\ntreat as one contract. `same_window_different_reference` groups share a\n`tie_rule` across two or more distinct `reference_source`s (for example\nKalshi's `cf_benchmarks_rti` vs Polymarket/Limitless's\n`chainlink_twap_60s`) -- same window and side convention, different\noracle, and must never be collapsed into `exact`.\n","properties":{"constituents":{"items":{"description":"One venue's native listing for a crypto window: its native IDs\n(`native_market_id`, `native_ref`, and `native_yes_token`/`native_no_token`\nwhen the venue exposes on-chain tokens) and, while the listing is quotable,\nan indicative `quote` from our one-minute poll. `result`/`resolved_at`/\n`end_price` are a pass-through of the venue's own settlement, never a\nSportsStack determination. Clients that need executable prices stream order\nbooks from the venue directly using the native IDs.\n","properties":{"end_price":{"format":"double","nullable":true,"type":"number"},"family_id":{"description":"Shared by every listing with the same window, reference source and tie rule.","format":"uuid","type":"string"},"last_changed_at":{"description":"Fetch time of the feed file that last changed this listing.","format":"date_time","type":"string"},"lifecycle":{"enum":["upcoming","live","closed","resolved","voided"],"type":"string"},"mirror_of":{"description":"For a Limitless listing, the Polymarket slug it mirrors.","nullable":true,"type":"string"},"native_market_id":{"description":"The venue's native market ID.","type":"string"},"native_no_token":{"description":"On-chain CLOB token ID for the Down/No side, when the venue exposes one.","nullable":true,"type":"string"},"native_ref":{"description":"The venue's ticker (Kalshi) or slug (Polymarket, Limitless).","type":"string"},"native_yes_token":{"description":"On-chain CLOB token ID for the Up/Yes side, when the venue exposes one.","nullable":true,"type":"string"},"quote":{"description":"The listing's indicative quote: our one-minute poll capture of the venue's\nprice (`observed_at` is OUR capture time, never a provider clock). `null`\nwhen the listing is not currently quotable: it is not `upcoming`/`live`, its\nwindow has ended, it has no quote, or the quote is older than 15 minutes.\nIndicative, not executable: `stale` is true once `age_ms` exceeds\n`stale_after_ms` (150 s for 5m/15m, 300 s for 1h, 600 s for 1d).\n","nullable":true,"properties":{"age_ms":{"minimum":0,"type":"integer"},"down":{"format":"double","maximum":1,"minimum":0,"type":"number"},"observed_at":{"format":"date_time","type":"string"},"source":{"enum":["kalshi_bid_ask_mid","kalshi_last","polymarket_clob_mid","polymarket_gamma","limitless_clob_mid","limitless_prices"],"type":"string"},"stale":{"type":"boolean"},"stale_after_ms":{"minimum":0,"type":"integer"},"up":{"format":"double","maximum":1,"minimum":0,"type":"number"}},"required":["up","down","source","observed_at","age_ms","stale_after_ms","stale"],"title":"CryptoWindowQuote","type":"object"},"reference_source":{"description":"The oracle/index this listing resolves against. Two listings of the\nsame window with different reference sources are the\n`same_window_different_reference` match class, not `exact` -- they\ncan and do disagree on start price and result even on a near-flat\nwindow. `binance_usdt_1m_noon` is the Binance USDT 1-minute candle at\n12:00 America/New_York, used by Polymarket's daily up/down markets.\n","enum":["cf_benchmarks_rti","chainlink_twap_60s","binance_usdt_1h_candle","binance_usdt_1m_noon"],"type":"string"},"resolved_at":{"format":"date_time","nullable":true,"type":"string"},"result":{"description":"The venue's own result, passed through unchanged. `null` does not\nmean \"no\": a window whose status is `ended` has not necessarily been\nresolved by the venue yet -- see the result-latency notes on the\nparent window.\n","enum":["up","down","split"],"nullable":true,"type":"string"},"result_revision":{"description":"Increments on every terminal-state correction (including voided -> resolved and back).","minimum":0,"type":"integer"},"settlement_value":{"format":"double","nullable":true,"type":"number"},"start_price":{"format":"double","nullable":true,"type":"number"},"tie_rule":{"enum":["up","split"],"type":"string"},"venue":{"enum":["kalshi","polymarket","limitless"],"type":"string"}},"required":["venue","native_market_id","native_ref","reference_source","tie_rule","family_id","lifecycle","result_revision","last_changed_at"],"title":"CryptoWindowConstituent","type":"object"},"minItems":2,"type":"array"},"family_id":{"description":"Set for `exact` groups; null for `same_window_different_reference`.","format":"uuid","nullable":true,"type":"string"},"match_class":{"enum":["exact","same_window_different_reference"],"type":"string"},"tie_rule":{"description":"Set for `same_window_different_reference` groups; null for `exact`.","nullable":true,"type":"string"}},"required":["match_class","constituents"],"title":"CryptoWindowGroup","type":"object"},"WebhookChangeLogBatch":{"description":"Batched change-log webhook payload. A request carries an `events` array (1–50), never a single `event` object. All events share `resource_type`. Delivery is all-or-nothing: a 4xx rejects every event in the request and SportsStack does not re-send them — prefer 2xx plus server-side filtering.","example":{"batch_size":2,"entity_ids":["9f1c0b1e-7d3a-4a6f-9f0e-2b8c1d4e5a67",null],"events":[{"changed_at":"2026-08-04T10:30:00Z","common_model_id":"550e8400-e29b-41d4-a716-446655440000","hash":"a1b2c3d4e5f6789012345678901234567890abcdef1234567890abcdef123456","league_id":"7c9e6679-7425-40de-944b-e07fc1f90ae7","resource_type":"team"},{"changed_at":"2026-08-04T10:30:01Z","common_model_id":"660e8400-e29b-41d4-a716-446655440001","hash":"b2c3d4e5f6789012345678901234567890abcdef1234567890abcdef12345678","league_id":"7c9e6679-7425-40de-944b-e07fc1f90ae7","resource_type":"team"}],"resource_type":"team","stream":"change_log","tenant_id":"b79afb82-36b0-44f2-9102-494fa8e3c52f"},"properties":{"batch_size":{"description":"Number of entries in `events` (equals `events.length`).","type":"integer"},"delivery_id":{"description":"Idempotency key — replay/journal deliveries only; absent on live traffic.","type":"string"},"entity_ids":{"description":"Internal entity IDs, positionally aligned with `events`. An element may be null for an entity first seen in this batch. Omitted when all would be null.","items":{"format":"uuid","nullable":true,"type":"string"},"type":"array"},"events":{"description":"1–50 change events. Never empty.","items":{"$ref":"#/components/schemas/WebhookChangeEvent"},"maxItems":50,"minItems":1,"type":"array"},"replay_generation":{"description":"Replay batch generation — replay/journal deliveries only.","type":"integer"},"resource_type":{"description":"The entity type shared by every event in this batch.","type":"string"},"sent_at":{"description":"When the delivery was emitted (UTC) — replay/journal deliveries only.","format":"date-time","type":"string"},"stream":{"description":"Always `change_log` for change-log webhooks.","enum":["change_log"],"type":"string"},"tenant_id":{"description":"Your tenant identifier.","format":"uuid","type":"string"}},"required":["stream","resource_type","tenant_id","events","batch_size"],"title":"WebhookChangeLogBatch","type":"object"},"Injury":{"description":"Current injury status and health information for a player affecting their availability.\n\nInjury records track both active injuries and ongoing health conditions that impact\na player's ability to participate in games and practices. This information is critical\nfor fantasy sports, betting markets, team planning, and fan engagement.\n\n## Status Classifications\nInjury status follows standard sports medicine and league reporting guidelines:\n- **out**: Definitely will not play in upcoming game(s)\n- **questionable**: Uncertain availability, game-time decision likely\n- **doubtful**: Unlikely to play but not definitively ruled out\n- **probable**: Expected to play, but still listed on injury report\n- **day_to_day**: Short-term injury designation without a firm game status\n- **ir**: Injured Reserve, extended absence with structured return process\n- **suspended**: League disciplinary action, not injury-related\n- **pup**: Physically Unable to Perform list (often preseason/training camp)\n\n## Practice Participation\nDaily practice status provides insight into injury severity and recovery progress:\n- **full_participation**: No restrictions, normal workload\n- **limited_participation**: Modified workload or specific restrictions\n- **did_not_practice**: Injury-related absence from practice\n- **did_not_practice_non_injury**: Rest day or non-injury related absence\n\n## Impact on Performance\nInjury status affects:\n- **Game Availability**: Whether player can participate\n- **Performance Level**: Reduced effectiveness due to injury\n- **Fantasy Value**: Player selection and projection adjustments\n- **Betting Markets**: Line movements and prop bet availability\n","example":{"common_model_id":"49306211-7b48-4b5e-88e9-a4190189dbea","confidence":0.65,"description":"Questionable with a knee injury","injury_type":"Knee","inserted_at":"2024-09-10T14:30:00Z","language_certainty":1.0,"league_id":"58e8c89b-72f8-4427-adbc-10f193c9b462","metadata":{},"player_id":"59291391-0c7e-442b-9496-33074647384e","practice_participation":{"friday":null,"monday":"did_not_practice","saturday":null,"sunday":null,"thursday":"limited_participation","tuesday":"did_not_practice","wednesday":"limited_participation"},"recent_practice_status":"limited_participation","reported_at":"2024-09-11T08:30:00Z","return_date":"2024-09-15","source":"example_provider","source_tier":3,"status":"questionable","tenant_id":"ff6332b6-8151-4a13-b20c-bd7b2ab45452","updated_at":"2024-09-11T09:15:00Z"},"properties":{"common_model_id":{"description":"Unique injury record identifier","type":"string"},"confidence":{"description":"Not populated on the aggregated injury report (null)","type":"number"},"description":{"description":"Free-text description from the source about the injury","type":"string"},"injury_type":{"description":"Body part or condition affected (e.g., 'Knee', 'Shoulder', 'Concussion')","type":"string"},"inserted_at":{"description":"When this injury record was first created in our system","format":"date-time","type":"string"},"language_certainty":{"description":"Not populated on the aggregated injury report (null)","type":"number"},"league_id":{"description":"League context for injury reporting standards","type":"string"},"metadata":{"description":"Vendor-neutral detail only (injury side and location, designation kind, team code)","type":"object"},"player_id":{"description":"Player affected by this injury","type":"string"},"practice_participation":{"description":"Weekly practice participation tracking injury recovery (follows league injury report schedule)","properties":{"friday":{"enum":["full_participation","limited_participation","did_not_practice","did_not_practice_non_injury"],"type":"string"},"monday":{"enum":["full_participation","limited_participation","did_not_practice","did_not_practice_non_injury"],"type":"string"},"saturday":{"enum":["full_participation","limited_participation","did_not_practice","did_not_practice_non_injury"],"type":"string"},"sunday":{"enum":["full_participation","limited_participation","did_not_practice","did_not_practice_non_injury"],"type":"string"},"thursday":{"enum":["full_participation","limited_participation","did_not_practice","did_not_practice_non_injury"],"type":"string"},"tuesday":{"enum":["full_participation","limited_participation","did_not_practice","did_not_practice_non_injury"],"type":"string"},"wednesday":{"enum":["full_participation","limited_participation","did_not_practice","did_not_practice_non_injury"],"type":"string"}},"type":"object"},"recent_practice_status":{"description":"Most recent practice participation level indicating recovery progress","enum":["full_participation","limited_participation","did_not_practice","did_not_practice_non_injury"],"type":"string"},"reported_at":{"description":"When the source originally reported this status (distinct from inserted_at)","format":"date-time","type":"string"},"return_date":{"description":"Projected or estimated return to play date (if available)","format":"date","type":"string"},"source":{"description":"Always 'sportsstack': injuries are one aggregated status per player, and the report does not expose which providers contributed","type":"string"},"source_tier":{"description":"Not populated on the aggregated injury report (null); the contributing providers are not exposed","enum":[1,2,3,4],"type":"integer"},"status":{"description":"Current injury designation following league injury report standards","enum":["out","questionable","doubtful","probable","day_to_day","ir","suspended","pup"],"type":"string"},"tenant_id":{"description":"Client tenant accessing this injury data","type":"string"},"updated_at":{"description":"Most recent update to injury status or practice participation","format":"date-time","type":"string"}},"required":["common_model_id","player_id","source"],"title":"Injury","type":"object"},"Mapping":{"description":"Identity mapping that links external data provider IDs to our unified common model IDs.\n\nEntityIdentity records are the foundation of our data normalization system, enabling us\nto aggregate data from multiple providers about the same real-world entity (player, team,\nevent, etc.) into a single unified representation.\n\n## Core Concept\nDifferent data providers use different ID systems for the same entities:\n- **Provider A**: Player ID \"A_123456\"\n- **Provider B**: Player ID \"B_45678\"\n- **Provider C**: Player ID \"C_987654\"\n\nOur system maps these to a single common_model_id representing that player.\n\n## Mapping States\n- **Mapped**: source_id linked to valid common_model_id (ready for data aggregation)\n- **Pending**: source_id exists but common_model_id is null (needs manual/AI resolution)\n- **Conflicted**: Multiple potential matches requiring human review\n\n## Resolution Process\n1. **Automatic Matching**: Algorithm/AI attempts to link source_id to existing entity\n2. **Fuzzy Matching**: Name/attribute similarity matching when exact match fails\n3. **Manual Review**: Human verification for ambiguous cases\n4. **New Entity Creation**: Generate new common_model_id when no match exists\n\n## Data Quality Impact\nProper identity mapping ensures:\n- **Complete Data**: All provider data aggregated under single entity\n- **Accuracy**: No duplicate or missing entities\n- **Consistency**: Unified view across all data sources\n","example":{"entity_id":"59291391-0c7e-442b-9496-33074647384e","entity_type":"player","id":"49306211-7b48-4b5e-88e9-a4190189dbea","integration":"example_provider","league":"nfl","source_id":"123456"},"properties":{"all_mappings":{"description":"Optional enrichment containing all known provider mappings for this entity when include_all_mappings=true","items":{"properties":{"integration":{"description":"Provider name for this additional mapping","type":"string"},"source_id":{"description":"Provider-specific ID for this entity","type":"string"}},"type":"object"},"type":"array"},"common_model_id":{"description":"Our unified identifier for this entity - null indicates unmapped/pending status","type":"string"},"deprecated_at":{"description":"Set after two distinct complete catalog misses. Deprecated mappings are hidden by default.","format":"date-time","nullable":true,"type":"string"},"entity_type":{"description":"Category of entity being mapped (player, team, event, league, market, etc.)","type":"string"},"id":{"description":"Unique identifier for this specific mapping record","type":"string"},"inserted_at":{"description":"When this mapping was first created","format":"date-time","type":"string"},"integration":{"description":"External data provider key","type":"string"},"league":{"description":"League context for the mapping (nfl, nba, mlb) - same entity may have different IDs per league","type":"string"},"source_id":{"description":"Entity identifier from the external data provider's system","type":"string"},"source_mappings":{"additionalProperties":{"type":"string"},"description":"Optional provider-to-source_id map added when return_source_id_format is supplied","type":"object"},"source_mappings_by_source":{"additionalProperties":{"properties":{"event":{"description":"Event mapping rows for event endpoints.","items":{"properties":{"common_model_id":{"format":"uuid","type":"string"},"deprecated_at":{"format":"date-time","nullable":true,"type":"string"},"entity_type":{"type":"string"},"id_scheme":{"type":"string"},"ignored_pending":{"type":"boolean"},"league":{"type":"string"},"match_status":{"type":"string"},"overmapped_allowed":{"type":"boolean"},"provider":{"type":"string"},"source":{"type":"string"},"source_id":{"type":"string"},"tenant_id":{"format":"uuid","nullable":true,"type":"string"},"updated_at":{"format":"date-time","type":"string"}},"type":"object"},"type":"array"},"mappings":{"description":"Source mapping rows for non-event entity endpoints.","items":{"properties":{"common_model_id":{"format":"uuid","type":"string"},"deprecated_at":{"format":"date-time","nullable":true,"type":"string"},"entity_type":{"type":"string"},"id_scheme":{"type":"string"},"ignored_pending":{"type":"boolean"},"league":{"type":"string"},"match_status":{"type":"string"},"overmapped_allowed":{"type":"boolean"},"provider":{"type":"string"},"source":{"type":"string"},"source_id":{"type":"string"},"tenant_id":{"format":"uuid","nullable":true,"type":"string"},"updated_at":{"format":"date-time","type":"string"}},"type":"object"},"type":"array"},"participants":{"description":"Participant mapping rows for event endpoints.","items":{"properties":{"common_model_id":{"format":"uuid","type":"string"},"deprecated_at":{"format":"date-time","nullable":true,"type":"string"},"entity_type":{"type":"string"},"id_scheme":{"type":"string"},"ignored_pending":{"type":"boolean"},"league":{"type":"string"},"match_status":{"type":"string"},"overmapped_allowed":{"type":"boolean"},"participant_id":{"format":"uuid","type":"string"},"participant_role":{"type":"string"},"participant_side":{"enum":["home","away","neutral","unknown"],"type":"string"},"provider":{"type":"string"},"source":{"type":"string"},"source_id":{"type":"string"},"tenant_id":{"format":"uuid","nullable":true,"type":"string"},"updated_at":{"format":"date-time","type":"string"}},"type":"object"},"type":"array"},"unmapped_participants":{"description":"Event participants that could not be emitted as source mappings because they were placeholders/TBD or lacked a mapping for the requested source.","items":{"properties":{"display_name":{"type":"string"},"participant_id":{"type":"string"},"participant_role":{"type":"string"},"participant_side":{"enum":["home","away","neutral","unknown"],"type":"string"},"reason":{"enum":["placeholder_or_tbd","missing_source_mapping"],"type":"string"}},"type":"object"},"type":"array"}},"type":"object"},"description":"Optional enterprise mapping enrichment keyed by full normalized source. Added when include_source_mappings_by_source=true.","type":"object"},"updated_at":{"description":"When this mapping was last updated","format":"date-time","type":"string"}},"required":["id","entity_type","integration","league","source_id"],"title":"Mapping","type":"object"},"InjuryTimeline":{"description":"A single report in a player's injury history, newest first. A report with a null\n`status` carries no active designation (the player was cleared, or the designation\nwas not recognised). Like the injury list, the history is\none aggregated, vendor-neutral view: `source` is always `sportsstack` and\n`source_tier` and `confidence` are null.\n","example":{"confidence":null,"description":"Questionable with a knee injury, limited practice Wednesday","id":"a1b2c3d4-e5f6-7890-abcd-ef1234567890","injury_id":"49306211-7b48-4b5e-88e9-a4190189dbea","injury_type":"Knee","inserted_at":"2024-09-11T09:00:00Z","league_id":"58e8c89b-72f8-4427-adbc-10f193c9b462","metadata":{},"player_id":"59291391-0c7e-442b-9496-33074647384e","reported_at":"2024-09-11T08:30:00Z","source":"sportsstack","source_tier":null,"status":"questionable","tenant_id":"ff6332b6-8151-4a13-b20c-bd7b2ab45452","updated_at":"2024-09-11T09:00:00Z"},"properties":{"confidence":{"description":"Always null: the aggregate does not expose a confidence score","nullable":true,"type":"number"},"description":{"description":"Free-text from the source","nullable":true,"type":"string"},"id":{"description":"Injury report ID (common_model_id)","type":"string"},"injury_id":{"description":"Injury report ID (same as id)","type":"string"},"injury_type":{"description":"Body part or condition","nullable":true,"type":"string"},"inserted_at":{"description":"When this report was first recorded","format":"date-time","type":"string"},"league_id":{"description":"League context","nullable":true,"type":"string"},"metadata":{"description":"Additional source metadata","type":"object"},"player_id":{"description":"Player this observation is about","type":"string"},"reported_at":{"description":"When the source reported this status","format":"date-time","nullable":true,"type":"string"},"source":{"description":"Always `sportsstack`","type":"string"},"source_tier":{"description":"Always null: the aggregate does not expose source tiers","nullable":true,"type":"integer"},"status":{"description":"Reported injury status; null when the report carries no active designation","nullable":true,"type":"string"},"tenant_id":{"description":"Tenant ID","type":"string"},"updated_at":{"format":"date-time","type":"string"}},"required":["id","tenant_id","player_id","source"],"title":"InjuryTimeline","type":"object"},"Play":{"description":"Individual play-by-play action within a sporting event providing granular game analysis.\n\nPlays represent the finest level of detail in sports event tracking, capturing each\ndiscrete action that occurs during a game. This data enables advanced analytics,\nsituational analysis, and detailed performance evaluation beyond basic statistics.\n\n## Play Scope\nPlay data granularity varies by sport:\n- **Football**: Every snap, including penalties, timeouts, and scoring plays\n- **Basketball**: Possessions, shots, fouls, substitutions, timeouts\n- **Baseball**: Each pitch, at-bat outcome, defensive plays, baserunning\n- **Hockey**: Faceoffs, shots, saves, penalties, line changes\n\n## Analytical Value\n- **Situational Analysis**: Performance in specific game contexts (red zone, 3rd down)\n- **Momentum Tracking**: How individual plays affect game flow and outcomes\n- **Player Evaluation**: Context-aware performance beyond box score statistics\n- **Strategy Analysis**: Play calling patterns and effectiveness\n\n## Data Structure\nEach play contains multiple data layers:\n- **Basic Info**: Description, timing, participants involved\n- **Game Context**: Score, field position, down/distance (football)\n- **Play Details**: Specific outcomes and measurements\n- **Player Roles**: Individual contributions and responsibilities\n","example":{"common_model_id":"123e4567-e89b-12d3-a456-426614174007","defense_id":"123e4567-e89b-12d3-a456-426614174003","description":"Quarterback throws a 20-yard pass for a touchdown","event_id":"123e4567-e89b-12d3-a456-426614174001","game_context":{"defense_timeouts":3,"final_defense_score":0,"final_distance":10,"final_down":1,"final_offense_score":6,"final_yards_from_scoring":0,"initial_defense_score":0,"initial_distance":10,"initial_down":1,"initial_offense_score":0,"initial_yards_from_scoring":20,"offense_timeouts":3,"zone":"red zone"},"id":"123e4567-e89b-12d3-a456-426614174000","league_id":"123e4567-e89b-12d3-a456-426614174008","minutes_remaining":10,"offense_id":"123e4567-e89b-12d3-a456-426614174002","period":1,"play_details":{"depth_of_target":20,"formation":"shotgun","is_first_down":true,"is_no_huddle":false,"pass_location":"deep right","points_scored":6,"successful_play":true,"yards_gained":20},"play_number":1,"play_type":"pass","seconds_remaining":30,"source":"official","tenant_id":"123e4567-e89b-12d3-a456-426614174006","time_on_clock":"14:30"},"properties":{"common_model_id":{"description":"Stable, cross-request-safe identifier for this play — unlike `id`, this does not change when the play is re-observed by the same feed. Recommended as the join key for correlating this play across separate API calls.","type":"string"},"defense_id":{"description":"Team or player in defensive role","type":"string"},"description":{"description":"Human-readable narrative description of what occurred","type":"string"},"event_id":{"description":"Parent event/game this play belongs to","format":"uuid","type":"string"},"game_context":{"additionalProperties":true,"description":"Situational game state when play occurred","example":{"defense_score":7,"initial_distance":8,"initial_down":2,"initial_yards_from_scoring":25,"offense_score":14,"quarter":3,"time_remaining":"8:42"},"type":"object"},"id":{"description":"Per-observation record identifier — regenerates on re-ingestion of the same real-world play, so it is NOT stable across requests. Use `common_model_id` for a stable, cross-request-safe identifier.","format":"uuid","type":"string"},"league_id":{"description":"League context for sport-specific play rules and interpretation","format":"uuid","type":"string"},"minutes_remaining":{"description":"Minutes remaining in current period when play started","type":"integer"},"offense_id":{"description":"Team or player with possession/offensive role","type":"string"},"period":{"description":"Game period when play occurred (quarter, inning, period)","type":"integer"},"play_details":{"additionalProperties":true,"description":"Sport-specific detailed measurements and outcomes","example":{"event_type":"single","is_out":false,"pitches":[{"pitch_number":1,"pitch_type":"FF","release_x":-1.9,"release_z":4.95,"start_speed":96.6},{"coord_x":89.8,"coord_y":111.48,"hardness":"medium","hit_location":7,"pitch_number":2,"release_x":-2.0,"release_z":4.97,"trajectory":"ground_ball"}],"play_category":"at_bat"},"type":"object"},"play_number":{"description":"Play number within the event, scoped to `source` — NOT globally unique per event. Multiple feeds (from different providers) can each number their own plays starting from 1, so the same play_number on two different sources refers to two different plays. Always join on (event_id, source, play_number), never (event_id, play_number) alone. For a single opaque cross-request identifier, use `common_model_id` instead.","type":"integer"},"play_type":{"description":"Classification of play action (pass, run, shot, penalty, etc.)","type":"string"},"seconds_remaining":{"description":"Seconds remaining in current period when play started","type":"integer"},"source":{"description":"Data provider or official source of play-by-play information","type":"string"},"tenant_id":{"description":"Client tenant accessing this play data","format":"uuid","type":"string"},"time_on_clock":{"description":"Game clock time in MM:SS format (for timed sports)","type":"string"}},"required":["description","common_model_id"],"title":"Play","type":"object"},"TournamentBracketResponse":{"description":"Complete tournament bracket structure returned by GET /api/v1/tournaments/:id/bracket.\n\nThis response provides the full tournament structure including metadata, groups (if applicable),\nrounds with matchups, and optionally related events. The bracket can be built from either\nthe tournament's rounds field or reconstructed from events.\n\n## Response Structure\n\n- **tournament**: Core tournament metadata\n- **groups**: Group stage divisions (for group_knockout tournaments)\n- **rounds**: Bracket rounds with matchups (for all bracket types)\n- **events**: Related event entities (if include_events=true)\n- **metadata**: Summary statistics about the bracket\n\n## Building Bracket from Events\n\nIf tournament.rounds is empty or incomplete, the bracket can be reconstructed from events:\n- Events are grouped by `tournament_round` field\n- Matchups built from event participants and scores\n- Rounds created from grouped events\n\nThis dual-source approach ensures brackets display correctly whether data comes from:\n- Tournament Summary (initial bracket with seeds)\n- Tournament Schedule (actual games)\n- Events (reconstructed from event entities)\n","example":{"events":null,"groups":[],"metadata":{"bracket_type_display":"Single Elimination","total_events":0,"total_groups":0,"total_rounds":6},"rounds":[],"tournament":{"bracket_type":"single_elimination","common_model_id":"01c7133f-2999-4803-9872-8c2ab1ba63ac","end_date":"2025-04-08","league_id":"31c65553-2f05-4ef7-993c-9e91c583afc8","name":"2025 NCAA Tournament","season_year":2025,"start_date":"2025-03-20","status":"in_progress","tournament_type":"championship"}},"properties":{"events":{"description":"Related event entities (included when include_events=true)","items":{"properties":{"common_model_id":{"format":"uuid","type":"string"},"event_scoreboard":{"description":"Live event status with real-time scores, period, and game state information.\n\nContains dynamic/live game data that updates throughout the event. For comprehensive\nsport-specific details and field explanations, see the EventScoreboard model documentation.\n\n## Core Fields\n- **Basic Info**: sport, league, event_id\n- **Game State**: period, time_on_clock, period_half (sport-specific), status\n- **Scoring**: home_score, away_score (for team sports), periods (linescore)\n- **Details**: Sport-specific data in JSONB format\n- **Freshness**: response_received_at — when the provider observed this state\n- **Serving provenance** (additive): observed_at, served_at, source_rank — which provider\n  row was served, its rank in the live primary order, and why it won\n\n## Rendering a live clock\n`time_on_clock` is a point-in-time observation, not a ticking value; we refresh\nit as fast as the provider reports it. To render a smooth clock, tick locally\nfrom `time_on_clock` using `response_received_at` as the anchor and resync on\neach response. For timed sports `details.clock_running` says whether the clock\nshould be advancing — `null` means the provider did not tell us, which is\ndistinct from a known-stopped clock.\n\n## Period Numbering by Sport\n- **Football**: 1-4 (quarters), 5+ (overtime)\n- **Basketball**: 1-4 (quarters), 5+ (overtime)\n- **Baseball**: 1-9+ (innings)\n- **Hockey**: 1-3 (periods), 4+ (overtime)\n- **Golf**: 1-4 (rounds)\n","example":{"away_score":10,"common_model_id":"123e4567-e89b-12d3-a456-426614174000","details":{"away_timeouts":2,"distance":8,"down":2,"home_timeouts":3,"possession_team_id":"123e4567-e89b-12d3-a456-426614174002","red_zone":false,"wall_clock":"2024-01-15T15:32:08Z","yard_line":35},"event_id":"123e4567-e89b-12d3-a456-426614174001","home_score":14,"inserted_at":"2024-01-15T15:30:00Z","league":"NFL","observed_at":"2024-01-15T15:32:09Z","period":2,"response_received_at":"2024-01-15T15:32:10Z","served_at":"2024-01-15T15:32:11Z","source_rank":{"provider":"sportsstack","rank":null,"reason":null},"sport":"football","status":"in_progress","time_on_clock":"14:30","updated_at":"2024-01-15T15:32:15Z"},"properties":{"away_score":{"description":"Away team total score (null for individual sports like golf)","example":10,"type":"integer"},"common_model_id":{"description":"Event Status ID","format":"uuid","type":"string"},"details":{"additionalProperties":true,"description":"Sport-specific game state for a served scoreboard. Two formats exist.\n\n## Current format (what is served today)\n\nThe keys, nesting and value types of `details` depend on the data source that\nprovided the scoreboard row. For one event, `details` can be an object from one\nsource and `null` from another, and a key can be absent, `null` or populated\ndepending on the source. Treat every field as optional. Responses in this format\ndo not contain `details_version`. The property list below describes the keys that\ncan appear; not every source provides every key, and the same key can have a\ndifferent shape for different sources.\n\n## Current format reference\n\n### Dynamic game state\nThe details field contains live, sport-specific information that changes throughout\nthe game. Unlike static event information, this data updates in real-time as the\ngame progresses.\n\n### Sport-specific structures\nEach sport has its own set of relevant game state data:\n\n#### Football (Flattened Fields)\n- **Game State**: down, distance, yard_line, possession_team_id, red_zone, goal_to_go\n- **Clock Management**: play_clock, game_clock, clock_running, two_minute_warning, inside_two_minutes\n- **Timeouts**: home_timeouts, away_timeouts\n- **Weather (Flattened)**: weather_temperature, weather_condition, weather_wind_speed, weather_wind_direction, weather_humidity, weather_precipitation, wind_affecting_kicking, precipitation\n- **Analytics**: field_goal_range, touchdown_probability, turnover_on_downs_risk\n- **Game Info**: attendance, neutral_site, duration\n\n#### Basketball (Flattened Fields)\n- **Clock State**: shot_clock, shot_clock_running, game_clock, clock_running\n- **Fouls & Bonus**: home_team_fouls, away_team_fouls, home_bonus, away_bonus, home_double_bonus, away_double_bonus\n- **Timeouts**: home_timeouts, away_timeouts\n- **Free Throws (Flattened)**: free_throw_shooter_id, free_throw_shooter_name, free_throw_shots_awarded, free_throw_shots_made, free_throw_shots_attempted, free_throw_technical_foul, free_throw_flagrant_foul, free_throw_and_one, free_throw_clear_path_foul, free_throw_bonus_situation, free_throw_current_attempt\n- **Game Flow**: intermission, overtime_number, last_play, last_score_team_id, last_score_time, possession_arrow\n- **Analytics**: pace, lead_changes, times_tied, home_biggest_lead, away_biggest_lead, home_shooting_foul_trouble, away_shooting_foul_trouble\n- **Game Info**: attendance\n\n#### Baseball (Flattened Fields)\n- **Count**: balls, strikes, outs\n- **Hitter (Flattened)**: hitter_id, hitter_full_name, hitter_ab_over, hitter_outcome_id\n- **Pitcher (Flattened)**: pitcher_id, pitcher_full_name, pitcher_pitch_speed, pitcher_pitch_type, pitcher_pitch_x, pitcher_pitch_y, pitcher_pitch_zone\n- **Baserunners**: runners_on_base (array of maps), runners_count\n\n#### Hockey (Flattened Fields)\n- **Power Play**: man_advantage, power_play_time_remaining, home_on_power_play, away_on_power_play, penalty_kill_percentage\n- **Goalies**: home_goalie_pulled, away_goalie_pulled, empty_net, home_goalie_id, away_goalie_id\n- **Clock**: game_clock, clock_running, intermission, overtime_type\n- **Shootout**: in_shootout, shootout_round, home_shootout_goals, away_shootout_goals, shootout_attempts, shootout_attempts_count\n- **Penalties**: active_penalties (array of maps), active_penalties_count\n- **Game Flow**: last_faceoff_winner, faceoff_location, last_goal_time, last_goal_team_id, last_penalty_time\n- **Team Stats**: shots_on_goal_home, shots_on_goal_away, face_off_wins_home, face_off_wins_away, hits_home, hits_away, blocked_shots_home, blocked_shots_away\n\n#### Soccer (Flattened Fields)\n- **State**: match_status (`first_half`, `halftime`, `second_half`, `extra_time_first_half`, `extra_time_second_half`, `penalties`, `ended`; `not_started` and `postponed` also occur in both formats), match_minute (elapsed clock, `\"MM:SS\"`, stoppage time excluded)\n- **Stoppage Time**: added_time_announced, added_time_played (`\"MM:SS\"`)\n- **Cards**: home_yellow_cards, away_yellow_cards, home_red_cards, away_red_cards (red cards include second-yellow dismissals)\n- **Substitutions**: home_substitutions, away_substitutions\n- **Team Stats**: home_possession, away_possession (percent, 0-100), home_shots, away_shots, home_shots_on_target, away_shots_on_target, home_corners, away_corners\n- **Shootout**: shootout (`{home_score, away_score}`), present only once a penalty shootout has been reached\n- **Regulation Score**: regulation_score (`{home_score, away_score}`), the 90-minute score, present only once a match goes past regulation (top-level `home_score`/`away_score` include extra time but not the shootout)\n\n#### Golf (Embedded Objects)\n- **Tournament State**: round_number, total_rounds, holes_completed, current_hole, cut_line, cut_made, playoff_status, playoff_type, tournament_complete\n- **Course Conditions**: par_for_course, course_length, wind_speed, wind_direction, temperature, weather_condition, course_conditions\n- **Field Info**: field_size, players_made_cut, scoring_average\n- **Leaders**: driving_distance_leader, greens_in_regulation_leader, putting_average_leader\n- **Detailed Data**: leaderboard (array), featured_players (array), featured_hole (object)\n\n### Data structure strategy\nMost fields are flattened, with nested objects used where noted.\n\n### Array fields for complex data\nSome complex data structures use arrays of maps:\n- **runners_on_base**: Baseball baserunner positions and details (array of maps)\n- **active_penalties**: Hockey penalty details and timing information (array of maps)\n- **shootout_attempts**: Hockey shootout attempt details (array of maps)\n- **leaderboard**: Golf leaderboard entries (array of embedded objects)\n\n## `details_version` 1 format (selected per account)\n\nAccounts can be switched to a fixed per-sport format that does not depend on the\ndata source. Until an account is switched it receives the current format. A response\nin the new format is recognised by `details_version` = `1`. The exact keys for each\nsport are the component schemas `ScoreboardDetailsV1Football`,\n`ScoreboardDetailsV1Basketball`, `ScoreboardDetailsV1Baseball`,\n`ScoreboardDetailsV1Hockey` (also used for `ice_hockey`), `ScoreboardDetailsV1Soccer`,\n`ScoreboardDetailsV1Tennis` and `ScoreboardDetailsV1Other`.\n\n1. For every sport except golf and motorsports (see 8), `details` is always a JSON object\n   when a scoreboard is returned; it is never `null`.\n2. For football, basketball, baseball, hockey, ice_hockey, soccer and tennis, every key of that\n   sport's schema is present in every response.\n3. A key whose value is not known is `null`. `null` means \"not reported\". It never\n   stands for `0`, `false`, an empty string or an empty list; those values appear only\n   when the source reported them (an empty string is itself returned as `null`). A\n   source that itself reports a default value, for example a zero count before play\n   starts, has that value passed through: the format does not guess which zeros are\n   real. A baseball runner map in which every base is empty is returned as an empty\n   list with a count of `0`.\n4. Each key has one type. Values are taken from the source, with these normalizations:\n   a source's status text is mapped to the `match_status` values; clock text is read\n   into `match_minute` and the added-time keys; baseball runners that a source gives as\n   a map by base are returned as a list and `runners_count` is computed from it; and the\n   shootout and regulation scores are read from period scores where a source reports\n   them that way. A value that cannot be expressed as the key's type is returned as\n   `null`. That includes: a number that is negative (except temperature and pitch\n   location, which may be negative) or above 1e12; a count that is not a whole JSON\n   integer (text such as `\"2\"`, or any number with a decimal point such as `2.9` or\n   `2.0`) or that is above 1,000,000,000; numeric text in a number key; a possession\n   percentage above 100; a score pair with a side that is negative, above 1,000,000,000\n   or not a whole integer; a runner list or map with an entry that has no valid base,\n   repeats a base, or (in map form) holds a value that is neither text nor empty, in which case the\n   runners are `null` together with their count; a game clock that is not `m:ss` text\n   (minutes of one to three digits, seconds 00-59, and an optional fraction on the\n   seconds), and a soccer match minute or added time that is not exactly `m:ss`;\n   text of the form `prefix:type:value`; and an empty or blank string. Runners are\n   returned in base order. In a runner list, a name that is not text, or that has the\n   `prefix:type:value` form, is left out of that runner and the runner is kept. A\n   runner map by base carries player identifiers, so no names are returned from it; a\n   base that holds blank text counts as empty.\n5. Only the keys listed in the sport's schema are returned. For football, basketball,\n   baseball, hockey, ice_hockey and soccer, every key of that sport in the property list\n   below that does not carry a source identifier is in the schema. Tennis has one key,\n   `retirement_info`, which is not in the property list. Not returned in this format:\n   keys that carry a source identifier (player, team and goalie IDs, and similar), and\n   keys of the current format that are not in the property list (for example nested\n   baseball count and runner details, per-period linescores, match situation and\n   referee detail). Switching an account removes them from its responses.\n6. Changing the data source for an event does not change the key set, the types or the\n   meaning of `null`. Values can change.\n7. The format has no keys that carry a source identifier, and text of the form\n   `prefix:type:value` (one to ten ASCII letters, a colon, ASCII letters or underscores, a colon,\n   then text without whitespace; case-insensitive; surrounding whitespace ignored) is\n   `null`. Free text is not inspected beyond that. `possession_team_id` is a UUID in its\n   36-character text form (returned in lower case) or `null`; it is not checked against\n   the team list. Golf and motorsports are served as stored (see 8) and can contain\n   source identifiers.\n8. Golf and motorsports are not shaped by this format: their `details` are the stored\n   object, carry no `details_version`, and can contain source identifiers (an account\n   that holds no provider-data entitlement may have provider-id values removed from them\n   by a separate step). A scoreboard whose sport is not one of the sports named above,\n   including a sport stored as an identifier instead of a name, is treated as any other\n   sport. Sport names are matched ignoring case and surrounding whitespace (any Unicode space). For any other sport\n   (for example MMA) the object is exactly `{\"details_version\": 1}`.\n\n## When no scoreboard is available\n\nThe scoreboard object is absent as a whole; it is not returned with empty `details`:\n\n* `GET /api/v1/events/{id}/event-scoreboard` and `GET /api/v1/events/{id}/linescore`\n  return `404`.\n* `GET /api/v1/events` and `GET /api/v1/events/{id}` omit `event_scoreboard`.\n* `GET /api/v1/tournaments/{id}/bracket` returns `event_scoreboard: null`.\n\nA scoreboard is returned only from data you are entitled to receive. Data you are not\nentitled to is treated as if it did not exist.\n\nThis is different from an unknown value inside a returned scoreboard, which is a\n`null` key in the `details_version` 1 format.\n","example":{"goal_to_go":false,"away_yellow_cards":1,"runners_count":2,"home_timeouts":2,"match_status":"second_half","weather_wind_speed":8.0,"yard_line":25,"hitter_id":"player-123","possession_team_id":"123e4567-e89b-12d3-a456-426614174002","away_timeouts":3,"home_on_power_play":true,"touchdown_probability":0.35,"added_time_played":"00:00","weather_temperature":45.0,"active_penalties_count":1,"away_corners":2,"wind_affecting_kicking":false,"regulation_score":{"away_score":3,"home_score":0},"away_red_cards":1,"runners_on_base":[{"base":1,"ending_base":2,"id":"player-789"},{"base":3,"ending_base":3,"id":"player-012"}],"pitcher_id":"player-456","pitcher_full_name":"Jane Smith","shootout":{"away_score":4,"home_score":3},"home_substitutions":3,"away_substitutions":2,"added_time_announced":"04:00","home_possession":56,"strikes":1,"away_shots":7,"shots_on_goal_home":15,"home_yellow_cards":2,"balls":2,"home_corners":6,"away_possession":44,"home_shots_on_target":5,"details_version":1,"weather_humidity":65,"neutral_site":false,"attendance":72000,"hitter_full_name":"John Doe","outs":2,"distance":7,"play_clock":25,"inside_two_minutes":false,"away_on_power_play":false,"red_zone":true,"game_clock":"8:42","man_advantage":"5v4","power_play_time_remaining":82,"weather_wind_direction":"NW","two_minute_warning":false,"pitcher_pitch_speed":95.5,"home_red_cards":0,"weather_condition":"clear","down":3,"clock_running":true,"match_minute":"67:12","precipitation":false,"home_shots":11,"shots_on_goal_away":12,"away_shots_on_target":3,"turnover_on_downs_risk":0.15,"active_penalties":[{"major_penalty":false,"penalty_type":"Cross-checking","player_id":"player-789","time_remaining":82}],"field_goal_range":true,"weather_precipitation":false},"properties":{"penalty_kill_percentage":{"description":"Current penalty kill success rate","type":"number"},"holes_completed":{"description":"Holes finished in current round","type":"integer"},"course_conditions":{"description":"Course conditions","type":"string"},"home_biggest_lead":{"description":"Biggest home team lead","type":"integer"},"pitcher_pitch_x":{"description":"Pitch location X coordinate","type":"number"},"shootout_attempts_count":{"description":"Total shootout attempts","type":"integer"},"away_shooting_foul_trouble":{"description":"Away team in foul trouble","type":"boolean"},"goal_to_go":{"description":"Goal line is closer than first down marker","type":"boolean"},"away_yellow_cards":{"description":"Soccer away yellow cards","type":"integer"},"shootout_round":{"description":"Current shootout round","type":"integer"},"runners_count":{"description":"Number of runners on base","type":"integer"},"home_timeouts":{"description":"Home team timeouts remaining","type":"integer"},"wall_clock":{"description":"Provider wall-clock timestamp for the most recent game event","format":"date-time","type":"string"},"home_bonus":{"description":"Home team in bonus situation","type":"boolean"},"match_status":{"description":"Soccer match phase","enum":["first_half","halftime","second_half","extra_time_first_half","extra_time_second_half","penalties","ended"],"type":"string"},"last_play":{"description":"Description of last play","type":"string"},"hitter_ab_over":{"description":"At-bat is complete","type":"boolean"},"weather_wind_speed":{"description":"Wind speed (mph)","type":"number"},"home_double_bonus":{"description":"Home team in double bonus","type":"boolean"},"yard_line":{"description":"Field position (0-100)","type":"integer"},"hitter_id":{"description":"Current batter player ID","type":"string"},"times_tied":{"description":"Number of times tied","type":"integer"},"last_goal_time":{"description":"Time of last goal","type":"string"},"home_goalie_pulled":{"description":"Home goalie pulled","type":"boolean"},"lead_changes":{"description":"Number of lead changes","type":"integer"},"tournament_complete":{"description":"Tournament finished","type":"boolean"},"possession_team_id":{"description":"Common-model team ID with possession","format":"uuid","type":"string"},"wind_direction":{"description":"Wind direction","type":"string"},"away_timeouts":{"description":"Away team timeouts remaining","type":"integer"},"free_throw_shots_awarded":{"description":"Number of free throws awarded","type":"integer"},"home_on_power_play":{"description":"Home team on power play","type":"boolean"},"home_team_fouls":{"description":"Home team fouls this period/half","type":"integer"},"touchdown_probability":{"description":"Probability of touchdown (0.0-1.0)","type":"number"},"added_time_played":{"description":"Soccer stoppage time played so far in the current period (MM:SS)","example":"01:26","type":"string"},"weather_temperature":{"description":"Temperature (Fahrenheit)","type":"number"},"duration":{"description":"Game duration","type":"string"},"overtime_type":{"description":"Type of overtime","enum":["3v3","4v4","shootout"],"type":"string"},"course_length":{"description":"Course length in yards","type":"integer"},"shot_clock_running":{"description":"Whether shot clock is running","type":"boolean"},"active_penalties_count":{"description":"Number of active penalties","type":"integer"},"current_hole":{"description":"Hole currently being played","type":"integer"},"away_corners":{"description":"Soccer away corner kicks","type":"integer"},"wind_affecting_kicking":{"description":"Wind affecting field goals/punts","type":"boolean"},"regulation_score":{"description":"Soccer 90-minute score. Present only once a match goes past regulation (extra time).","properties":{"away_score":{"type":"integer"},"home_score":{"type":"integer"}},"type":"object"},"free_throw_clear_path_foul":{"description":"Free throws from clear path foul","type":"boolean"},"hits_home":{"description":"Home team hits","type":"integer"},"shootout_attempts":{"description":"Shootout attempts with details","items":{"properties":{"goalie_id":{"description":"Goalie player ID","type":"string"},"is_deciding_goal":{"description":"Was the deciding goal","type":"boolean"},"result":{"description":"Shot result","type":"string"},"round":{"description":"Shootout round","type":"integer"},"shooter_id":{"description":"Shooter player ID","type":"string"},"shooter_name":{"description":"Shooter name","type":"string"},"shooter_team_id":{"description":"Shooter's team","type":"string"}},"type":"object"},"type":"array"},"playoff_type":{"description":"Type of playoff","enum":["sudden_death","aggregate","match_play"],"type":"string"},"away_red_cards":{"description":"Soccer away red cards (includes second-yellow dismissals)","type":"integer"},"free_throw_current_attempt":{"description":"Current free throw attempt number","type":"integer"},"runners_on_base":{"description":"Baserunners with positions and details","items":{"properties":{"base":{"description":"Starting base (1, 2, 3)","type":"integer"},"ending_base":{"description":"Ending base after play","type":"integer"},"full_name":{"description":"Runner name, when known","type":"string"},"id":{"description":"Player ID","type":"string"}},"type":"object"},"type":"array"},"cut_made":{"description":"Has cut been applied","type":"boolean"},"pitcher_id":{"description":"Current pitcher player ID","type":"string"},"pitcher_full_name":{"description":"Current pitcher name","type":"string"},"shootout":{"description":"Soccer penalty shootout score. Present only once penalties are reached.","properties":{"away_score":{"type":"integer"},"home_score":{"type":"integer"}},"type":"object"},"faceoff_location":{"description":"Location of last faceoff","type":"string"},"home_substitutions":{"description":"Soccer home substitutions made","type":"integer"},"wind_speed":{"description":"Wind speed (mph)","type":"number"},"shot_clock":{"description":"Shot clock seconds remaining","type":"integer"},"away_substitutions":{"description":"Soccer away substitutions made","type":"integer"},"pitcher_pitch_zone":{"description":"Strike zone location","type":"integer"},"added_time_announced":{"description":"Soccer stoppage time announced by the fourth official (MM:SS)","example":"02:00","type":"string"},"free_throw_technical_foul":{"description":"Free throws from technical foul","type":"boolean"},"home_possession":{"description":"Soccer home ball possession percentage","maximum":100,"minimum":0,"type":"number"},"putting_average_leader":{"description":"Putting average leader player ID","type":"string"},"home_shooting_foul_trouble":{"description":"Home team in foul trouble","type":"boolean"},"strikes":{"description":"Strike count (0-2)","type":"integer"},"greens_in_regulation_leader":{"description":"GIR leader player ID","type":"string"},"away_biggest_lead":{"description":"Biggest away team lead","type":"integer"},"face_off_wins_away":{"description":"Away team faceoff wins","type":"integer"},"last_goal_team_id":{"description":"Team that scored last goal","type":"string"},"away_double_bonus":{"description":"Away team in double bonus","type":"boolean"},"away_shots":{"description":"Soccer away total shots","type":"integer"},"temperature":{"description":"Temperature (Fahrenheit)","type":"integer"},"last_penalty_time":{"description":"Time of last penalty","type":"string"},"last_score_team_id":{"description":"Team that scored last","type":"string"},"free_throw_and_one":{"description":"And-one free throw situation","type":"boolean"},"shots_on_goal_home":{"description":"Home team shots on goal","type":"integer"},"home_yellow_cards":{"description":"Soccer home yellow cards","type":"integer"},"free_throw_flagrant_foul":{"description":"Free throws from flagrant foul","type":"boolean"},"in_shootout":{"description":"Currently in shootout","type":"boolean"},"playoff_status":{"description":"Tournament in playoff","type":"boolean"},"away_goalie_id":{"description":"Current away goalie player ID","type":"string"},"balls":{"description":"Ball count (0-3)","type":"integer"},"home_corners":{"description":"Soccer home corner kicks","type":"integer"},"home_shootout_goals":{"description":"Home team shootout goals","type":"integer"},"pitcher_pitch_type":{"description":"Last pitch type","type":"string"},"away_possession":{"description":"Soccer away ball possession percentage","maximum":100,"minimum":0,"type":"number"},"scoring_average":{"description":"Current round scoring average","type":"number"},"empty_net":{"description":"Empty net situation","type":"boolean"},"home_shots_on_target":{"description":"Soccer home shots on target","type":"integer"},"away_bonus":{"description":"Away team in bonus situation","type":"boolean"},"details_version":{"description":"Version of the details contract. Present and `1` in the contract format; absent in legacy provider-shaped objects.","example":1,"type":"integer"},"weather_humidity":{"description":"Humidity percentage","type":"integer"},"neutral_site":{"description":"Neutral site game","type":"boolean"},"free_throw_shots_made":{"description":"Free throws made so far","type":"integer"},"attendance":{"description":"Game attendance","type":"integer"},"total_rounds":{"description":"Total tournament rounds","type":"integer"},"hitter_full_name":{"description":"Current batter name","type":"string"},"pace":{"description":"Possessions per 48 minutes","type":"number"},"outs":{"description":"Outs in inning (0-2)","type":"integer"},"round_number":{"description":"Current round (1-4+)","type":"integer"},"free_throw_shooter_name":{"description":"Name of free throw shooter","type":"string"},"cut_line":{"description":"Score needed to make cut","type":"integer"},"distance":{"description":"Yards to go for first down","type":"integer"},"free_throw_shooter_id":{"description":"Player ID shooting free throws","type":"string"},"field_size":{"description":"Total number of players","type":"integer"},"play_clock":{"description":"Seconds on play clock","type":"integer"},"hits_away":{"description":"Away team hits","type":"integer"},"inside_two_minutes":{"description":"Less than two minutes remaining","type":"boolean"},"driving_distance_leader":{"description":"Driving distance leader player ID","type":"string"},"home_goalie_id":{"description":"Current home goalie player ID","type":"string"},"intermission":{"description":"Between periods/halves","type":"boolean"},"hitter_outcome_id":{"description":"At-bat outcome identifier","type":"string"},"blocked_shots_away":{"description":"Away team blocked shots","type":"integer"},"away_on_power_play":{"description":"Away team on power play","type":"boolean"},"last_faceoff_winner":{"description":"Team that won last faceoff","enum":["home","away"],"type":"string"},"red_zone":{"description":"In red zone (20 yards or less)","type":"boolean"},"game_clock":{"description":"Current game clock time","type":"string"},"man_advantage":{"description":"Current man advantage (e.g., '5v4', 'even')","type":"string"},"blocked_shots_home":{"description":"Home team blocked shots","type":"integer"},"away_goalie_pulled":{"description":"Away goalie pulled","type":"boolean"},"power_play_time_remaining":{"description":"Seconds remaining on power play","type":"integer"},"weather_wind_direction":{"description":"Wind direction","type":"string"},"players_made_cut":{"description":"Players making the cut","type":"integer"},"par_for_course":{"description":"Course par","type":"integer"},"two_minute_warning":{"description":"Two minute warning called","type":"boolean"},"pitcher_pitch_speed":{"description":"Last pitch speed (mph)","type":"number"},"possession_arrow":{"description":"Possession arrow (college)","enum":["home","away"],"type":"string"},"away_shootout_goals":{"description":"Away team shootout goals","type":"integer"},"free_throw_shots_attempted":{"description":"Free throws attempted so far","type":"integer"},"home_red_cards":{"description":"Soccer home red cards (includes second-yellow dismissals)","type":"integer"},"weather_condition":{"description":"Weather condition","type":"string"},"away_team_fouls":{"description":"Away team fouls this period/half","type":"integer"},"pitcher_pitch_y":{"description":"Pitch location Y coordinate","type":"number"},"down":{"description":"Current down (1-4)","type":"integer"},"last_score_time":{"description":"When last score occurred","type":"string"},"clock_running":{"description":"Whether game clock is running","type":"boolean"},"overtime_number":{"description":"Which overtime period","type":"integer"},"match_minute":{"description":"Soccer elapsed match clock as MM:SS (stoppage time excluded). Tick locally between updates.","example":"45:00","type":"string"},"precipitation":{"description":"Active precipitation","type":"boolean"},"home_shots":{"description":"Soccer home total shots","type":"integer"},"shots_on_goal_away":{"description":"Away team shots on goal","type":"integer"},"away_shots_on_target":{"description":"Soccer away shots on target","type":"integer"},"turnover_on_downs_risk":{"description":"Probability of turnover on downs (0.0-1.0)","type":"number"},"active_penalties":{"description":"Currently active penalties with details","items":{"properties":{"duration":{"description":"Penalty duration in minutes","type":"integer"},"major_penalty":{"description":"Is major penalty","type":"boolean"},"misconduct":{"description":"Is misconduct penalty","type":"boolean"},"penalty_start_time":{"description":"When penalty started","type":"string"},"penalty_type":{"description":"Type of penalty","type":"string"},"player_id":{"description":"Penalized player ID","type":"string"},"player_name":{"description":"Penalized player name","type":"string"},"team_id":{"description":"Team of penalized player","type":"string"},"time_remaining":{"description":"Time remaining in seconds","type":"integer"}},"type":"object"},"type":"array"},"field_goal_range":{"description":"Within field goal range","type":"boolean"},"free_throw_bonus_situation":{"description":"Free throws from bonus","type":"boolean"},"weather_precipitation":{"description":"Is it precipitating","type":"boolean"},"face_off_wins_home":{"description":"Home team faceoff wins","type":"integer"}},"type":"object"},"event_id":{"description":"Event ID","format":"uuid","type":"string"},"home_score":{"description":"Home team total score (null for individual sports like golf)","example":14,"type":"integer"},"inserted_at":{"description":"Creation timestamp","format":"date-time","type":"string"},"league":{"description":"League abbreviation","example":"NFL","type":"string"},"observed_at":{"description":"Provider observation time of the served row (the elected row's own observation; unlike response_received_at it is never taken from a clock donor). Null when unknown.","example":"2024-01-15T15:32:09Z","format":"date-time","nullable":true,"type":"string"},"period":{"description":"Current period/quarter/inning (1-based, sport-specific numbering)","example":2,"type":"integer"},"period_half":{"description":"Period subdivision (e.g., 'top'/'bottom' for baseball innings)","enum":["top","bottom"],"example":"bottom","type":"string"},"period_half_over":{"description":"Whether the current period half is complete","type":"boolean"},"periods":{"description":"Per-period linescore, in period order. This is what `/v1/events/{id}/linescore` returns.","example":[{"away_score":3,"home_score":7,"number":1,"type":"regular_period"}],"items":{"additionalProperties":true,"type":"object"},"type":"array"},"response_received_at":{"description":"When we received this state from the upstream provider. This is the observation time, and it is the field to use to judge freshness or to interpolate a running clock — `updated_at` is a storage timestamp and moves even when the observation did not.","example":"2024-01-15T15:32:10Z","format":"date-time","type":"string"},"served_at":{"description":"When this response was assembled (UTC, whole seconds).","example":"2024-01-15T15:32:11Z","format":"date-time","nullable":true,"type":"string"},"source_rank":{"description":"Which provider's row was served and why it was chosen. `provider` is the provider family (`sportsstack` for a canonical row, whose backing vendor is not disclosed); `rank` is its position in the league's live primary order (0 = primary, null = outside the order or canonical); `reason` is `primary` (highest-ranked provider present), `fallback_stale` (a higher-ranked provider's row was older than the stale window), `single_provider` (only one provider reported), `freshest` (a fresher lower-ranked row was served), or null when the election's candidates are not visible to the tenant.","nullable":true,"properties":{"provider":{"example":"sportsstack","type":"string"},"rank":{"example":0,"nullable":true,"type":"integer"},"reason":{"enum":["primary","fallback_stale","single_provider","freshest"],"nullable":true,"type":"string"}},"type":"object"},"sport":{"description":"Sport name","enum":["football","basketball","baseball","hockey","ice_hockey","soccer","golf"],"example":"football","type":"string"},"status":{"description":"Lifecycle state of the event as reported by the provider (e.g. 'live', 'in_progress', 'halftime', 'closed', 'final'). Values are provider vocabulary and are not normalized across providers — use this to tell a live scoreboard from a finished one, not for settlement decisions.","example":"in_progress","type":"string"},"time_on_clock":{"description":"Time remaining in period - format varies by sport (MM:SS for timed sports, null for baseball/golf)","example":"14:30","type":"string"},"updated_at":{"description":"Last update timestamp","format":"date-time","type":"string"}},"required":["common_model_id","event_id","sport","league"],"title":"EventStatus","type":"object"},"metadata":{"type":"object"},"participants":{"type":"array"},"scheduled_start_time":{"format":"date-time","type":"string"},"status":{"type":"string"},"title":{"type":"string"},"tournament_round":{"type":"integer"}},"type":"object"},"type":"array"},"groups":{"description":"Group stage divisions (for group_knockout tournaments)","items":{"description":"A group represents a division within the group stage of a tournament (World Cup, UEFA Champions League).\n\nGroups organize teams into round-robin competition pools where teams play each other\nand standings determine advancement to knockout rounds. Each group has its own standings\ntable tracking wins, losses, goals, and points.\n\n## Group Stage Structure\n\n- **Teams**: 3-4 teams per group (varies by tournament)\n- **Format**: Round-robin (each team plays every other team in group)\n- **Advancement**: Top teams (typically top 2) advance to knockout stage\n- **Standings**: Points, goal differential, head-to-head determine rankings\n\n## Standings Calculation\n\nStandings are calculated from group stage events:\n- **Points**: Win = 3, Draw = 1, Loss = 0 (varies by sport)\n- **Goal Differential**: Goals for - Goals against\n- **Head-to-Head**: Direct matchup results for tiebreaking\n","example":{"group_name":"Group A","standings":[{"drawn":1,"goal_difference":3,"goals_against":2,"goals_for":5,"lost":0,"played":3,"points":7,"position":1,"team_id":"e2790078-ec3a-4c45-8dc4-5cf173960b2b","won":2}],"teams":[{"abbreviation":"TMA","country_code":"USA","name":"Team A","team_id":"e2790078-ec3a-4c45-8dc4-5cf173960b2b"}]},"properties":{"group_name":{"description":"Group identifier (e.g., 'Group A', 'Group B')","example":"Group A","type":"string"},"standings":{"description":"Current group standings ordered by position","items":{"properties":{"drawn":{"description":"Draws","type":"integer"},"goal_difference":{"description":"Goal differential","type":"integer"},"goals_against":{"description":"Goals conceded","type":"integer"},"goals_for":{"description":"Goals scored","type":"integer"},"lost":{"description":"Losses","type":"integer"},"played":{"description":"Games played","type":"integer"},"points":{"description":"Total points","type":"integer"},"position":{"description":"Current position in group (1-based)","type":"integer"},"team_id":{"format":"uuid","type":"string"},"won":{"description":"Wins","type":"integer"}},"type":"object"},"type":"array"},"teams":{"description":"Teams participating in this group","items":{"properties":{"abbreviation":{"description":"Team abbreviation","type":"string"},"country_code":{"description":"Country code (for international tournaments)","type":"string"},"name":{"description":"Team name","type":"string"},"team_id":{"description":"Team common_model_id","format":"uuid","type":"string"}},"type":"object"},"type":"array"}},"required":["group_name","teams","standings"],"title":"TournamentGroup","type":"object"},"type":"array"},"metadata":{"description":"Bracket summary statistics","properties":{"bracket_type_display":{"description":"Human-readable bracket type","type":"string"},"total_events":{"description":"Number of events","type":"integer"},"total_groups":{"description":"Number of groups","type":"integer"},"total_rounds":{"description":"Number of rounds","type":"integer"}},"type":"object"},"rounds":{"description":"Bracket rounds with matchups","items":{"description":"A round represents a stage of competition within a tournament bracket.\n\nRounds organize matchups into progressive stages of elimination or series competition.\nEach round contains multiple matchups (games or series) that determine advancement.\n\n## Round Structure by Bracket Type\n\n### Single Elimination Rounds\n- **Round 1**: First Round (64 teams → 32 teams)\n- **Round 2**: Second Round (32 teams → 16 teams)\n- **Round 3**: Sweet 16 (16 teams → 8 teams)\n- **Round 4**: Elite 8 (8 teams → 4 teams)\n- **Round 5**: Final Four (4 teams → 2 teams)\n- **Round 6**: Championship (2 teams → 1 champion)\n\n### Best-of-Series Rounds\n- **Round 1**: First Round (e.g., 16 teams → 8 teams via best-of-7 series)\n- **Round 2**: Conference Semifinals\n- **Round 3**: Conference Finals\n- **Round 4**: Finals\n\n### Group + Knockout Rounds\n- **Groups**: Round-robin play (not numbered rounds)\n- **Round 1**: Round of 16 (knockout stage begins)\n- **Round 2**: Quarterfinals\n- **Round 3**: Semifinals\n- **Round 4**: Final\n","example":{"best_of":null,"matchups":[{"away_score":72,"away_team":{"abbreviation":"TMB","name":"Team B","seed":16,"source_id":"competitor_67890","team_id":"f1798a7e-4832-4a2c-8cb6-60d5afcb3d41"},"event_id":"a96af633-aee6-48a0-bf72-0865a4419772","home_score":85,"home_team":{"abbreviation":"TMA","name":"Team A","seed":1,"source_id":"competitor_12345","team_id":"e2790078-ec3a-4c45-8dc4-5cf173960b2b"},"matchup_source_id":"event_12345678","position":0,"region":"East","scheduled_time":"2025-03-20T12:00:00Z","status":"completed","winner_id":"home"}],"round_name":"First Round","round_number":1,"round_type":"elimination"},"properties":{"best_of":{"description":"Best-of-N value for series rounds (3, 5, or 7 games). Null for single elimination.","example":7,"type":"integer"},"matchups":{"description":"Games or series in this round (see TournamentMatchup schema)","items":{"description":"A matchup represents a single game or series within a tournament round.\n\nMatchups connect teams/participants with game results, scores, and advancement status.\nEach matchup can be either a single game (elimination) or a series (best-of-N).\n\n## Matchup States\n\n- **Scheduled**: Game/series not yet started\n- **In Progress**: Currently being played\n- **Completed**: Finished with final results\n- **Pending**: Placeholder matchup (e.g., waiting for previous round results)\n\n## Team Information\n\nTeams in matchups include:\n- **team_id**: Our unified team identifier (resolved via identity mapping)\n- **source_id**: Provider's team identifier (before mapping)\n- **seed**: Tournament seed number (1-16 for NCAA, null for non-seeded tournaments)\n- **name/abbreviation**: Team display information\n\n## Winner Determination\n\n- **winner_id**: \"home\", \"away\", or null (if not yet determined)\n- **home_score/away_score**: Final scores (null if game not completed)\n- For series: `series_score` object with home/away wins instead of single game scores\n\n## Event Linking\n\n- **event_id**: Links to actual Event entity (populated when events are created)\n- **matchup_source_id**: Provider's game ID (before event creation)\n- When both exist, `event_id` takes precedence for detailed game data\n","example":{"away_score":72,"away_team":{"abbreviation":"TMB","name":"Team B","seed":16,"source_id":"competitor_67890","team_id":"f1798a7e-4832-4a2c-8cb6-60d5afcb3d41"},"event_id":"a96af633-aee6-48a0-bf72-0865a4419772","home_score":85,"home_team":{"abbreviation":"TMA","name":"Team A","seed":1,"source_id":"competitor_12345","team_id":"e2790078-ec3a-4c45-8dc4-5cf173960b2b"},"matchup_source_id":"event_12345678","position":0,"region":"East","scheduled_time":"2025-03-20T12:00:00Z","series_score":null,"status":"completed","winner_id":"home"},"properties":{"away_score":{"description":"Away team score (null if game not completed or for series rounds)","example":72,"type":"integer"},"away_team":{"description":"Away team information (same structure as home_team)","properties":{"abbreviation":{"type":"string"},"name":{"type":"string"},"seed":{"type":"integer"},"source_id":{"type":"string"},"team_id":{"format":"uuid","type":"string"}},"type":"object"},"event_id":{"description":"Event entity common_model_id (populated when events are created)","example":"a96af633-aee6-48a0-bf72-0865a4419772","format":"uuid","type":"string"},"home_score":{"description":"Home team score (null if game not completed or for series rounds)","example":85,"type":"integer"},"home_team":{"description":"Home team information","properties":{"abbreviation":{"description":"Team abbreviation","type":"string"},"name":{"description":"Team full name","type":"string"},"seed":{"description":"Tournament seed (1-16 for NCAA, null for non-seeded)","type":"integer"},"source_id":{"description":"Provider's team identifier","type":"string"},"team_id":{"description":"Team common_model_id (resolved via identity mapping)","format":"uuid","type":"string"}},"type":"object"},"matchup_source_id":{"description":"Provider's game/series ID (before event entity is created)","example":"event_12345678","type":"string"},"position":{"description":"Position/order of matchup within the round","example":0,"type":"integer"},"region":{"description":"Region/bracket name (for NCAA tournaments: East, West, South, Midwest)","example":"East","type":"string"},"scheduled_time":{"description":"Scheduled start time for the game/series","example":"2025-03-20T12:00:00Z","format":"date-time","type":"string"},"series_score":{"description":"Series score for best-of-series rounds (null for single elimination)","example":{"away":2,"home":4},"properties":{"away":{"description":"Away team wins in series","type":"integer"},"home":{"description":"Home team wins in series","type":"integer"}},"type":"object"},"status":{"description":"Matchup status","enum":["scheduled","in_progress","completed","pending"],"type":"string"},"winner_id":{"description":"Winner designation: 'home', 'away', or null if not determined","enum":["home","away",null],"type":"string"}},"required":["position","home_team","away_team","status"],"title":"TournamentMatchup","type":"object"},"type":"array"},"round_name":{"description":"Human-readable round name (e.g., 'First Round', 'Sweet 16', 'Conference Finals')","example":"First Round","type":"string"},"round_number":{"description":"Sequential round number (1-based, lower numbers = earlier rounds)","example":1,"type":"integer"},"round_type":{"description":"Type of round: elimination (single game), best_of_series (multi-game), knockout (post-group stage)","enum":["elimination","best_of_series","knockout"],"type":"string"}},"required":["round_number","round_name","round_type","matchups"],"title":"TournamentRound","type":"object"},"type":"array"},"tournament":{"description":"Tournament metadata","properties":{"bracket_type":{"type":"string"},"common_model_id":{"format":"uuid","type":"string"},"end_date":{"format":"date","type":"string"},"league_id":{"format":"uuid","type":"string"},"name":{"type":"string"},"season_year":{"type":"integer"},"start_date":{"format":"date","type":"string"},"status":{"type":"string"},"tournament_type":{"type":"string"}},"type":"object"}},"required":["tournament","groups","rounds","metadata"],"title":"TournamentBracketResponse","type":"object"},"TournamentRound":{"description":"A round represents a stage of competition within a tournament bracket.\n\nRounds organize matchups into progressive stages of elimination or series competition.\nEach round contains multiple matchups (games or series) that determine advancement.\n\n## Round Structure by Bracket Type\n\n### Single Elimination Rounds\n- **Round 1**: First Round (64 teams → 32 teams)\n- **Round 2**: Second Round (32 teams → 16 teams)\n- **Round 3**: Sweet 16 (16 teams → 8 teams)\n- **Round 4**: Elite 8 (8 teams → 4 teams)\n- **Round 5**: Final Four (4 teams → 2 teams)\n- **Round 6**: Championship (2 teams → 1 champion)\n\n### Best-of-Series Rounds\n- **Round 1**: First Round (e.g., 16 teams → 8 teams via best-of-7 series)\n- **Round 2**: Conference Semifinals\n- **Round 3**: Conference Finals\n- **Round 4**: Finals\n\n### Group + Knockout Rounds\n- **Groups**: Round-robin play (not numbered rounds)\n- **Round 1**: Round of 16 (knockout stage begins)\n- **Round 2**: Quarterfinals\n- **Round 3**: Semifinals\n- **Round 4**: Final\n","example":{"best_of":null,"matchups":[{"away_score":72,"away_team":{"abbreviation":"TMB","name":"Team B","seed":16,"source_id":"competitor_67890","team_id":"f1798a7e-4832-4a2c-8cb6-60d5afcb3d41"},"event_id":"a96af633-aee6-48a0-bf72-0865a4419772","home_score":85,"home_team":{"abbreviation":"TMA","name":"Team A","seed":1,"source_id":"competitor_12345","team_id":"e2790078-ec3a-4c45-8dc4-5cf173960b2b"},"matchup_source_id":"event_12345678","position":0,"region":"East","scheduled_time":"2025-03-20T12:00:00Z","status":"completed","winner_id":"home"}],"round_name":"First Round","round_number":1,"round_type":"elimination"},"properties":{"best_of":{"description":"Best-of-N value for series rounds (3, 5, or 7 games). Null for single elimination.","example":7,"type":"integer"},"matchups":{"description":"Games or series in this round (see TournamentMatchup schema)","items":{"description":"A matchup represents a single game or series within a tournament round.\n\nMatchups connect teams/participants with game results, scores, and advancement status.\nEach matchup can be either a single game (elimination) or a series (best-of-N).\n\n## Matchup States\n\n- **Scheduled**: Game/series not yet started\n- **In Progress**: Currently being played\n- **Completed**: Finished with final results\n- **Pending**: Placeholder matchup (e.g., waiting for previous round results)\n\n## Team Information\n\nTeams in matchups include:\n- **team_id**: Our unified team identifier (resolved via identity mapping)\n- **source_id**: Provider's team identifier (before mapping)\n- **seed**: Tournament seed number (1-16 for NCAA, null for non-seeded tournaments)\n- **name/abbreviation**: Team display information\n\n## Winner Determination\n\n- **winner_id**: \"home\", \"away\", or null (if not yet determined)\n- **home_score/away_score**: Final scores (null if game not completed)\n- For series: `series_score` object with home/away wins instead of single game scores\n\n## Event Linking\n\n- **event_id**: Links to actual Event entity (populated when events are created)\n- **matchup_source_id**: Provider's game ID (before event creation)\n- When both exist, `event_id` takes precedence for detailed game data\n","example":{"away_score":72,"away_team":{"abbreviation":"TMB","name":"Team B","seed":16,"source_id":"competitor_67890","team_id":"f1798a7e-4832-4a2c-8cb6-60d5afcb3d41"},"event_id":"a96af633-aee6-48a0-bf72-0865a4419772","home_score":85,"home_team":{"abbreviation":"TMA","name":"Team A","seed":1,"source_id":"competitor_12345","team_id":"e2790078-ec3a-4c45-8dc4-5cf173960b2b"},"matchup_source_id":"event_12345678","position":0,"region":"East","scheduled_time":"2025-03-20T12:00:00Z","series_score":null,"status":"completed","winner_id":"home"},"properties":{"away_score":{"description":"Away team score (null if game not completed or for series rounds)","example":72,"type":"integer"},"away_team":{"description":"Away team information (same structure as home_team)","properties":{"abbreviation":{"type":"string"},"name":{"type":"string"},"seed":{"type":"integer"},"source_id":{"type":"string"},"team_id":{"format":"uuid","type":"string"}},"type":"object"},"event_id":{"description":"Event entity common_model_id (populated when events are created)","example":"a96af633-aee6-48a0-bf72-0865a4419772","format":"uuid","type":"string"},"home_score":{"description":"Home team score (null if game not completed or for series rounds)","example":85,"type":"integer"},"home_team":{"description":"Home team information","properties":{"abbreviation":{"description":"Team abbreviation","type":"string"},"name":{"description":"Team full name","type":"string"},"seed":{"description":"Tournament seed (1-16 for NCAA, null for non-seeded)","type":"integer"},"source_id":{"description":"Provider's team identifier","type":"string"},"team_id":{"description":"Team common_model_id (resolved via identity mapping)","format":"uuid","type":"string"}},"type":"object"},"matchup_source_id":{"description":"Provider's game/series ID (before event entity is created)","example":"event_12345678","type":"string"},"position":{"description":"Position/order of matchup within the round","example":0,"type":"integer"},"region":{"description":"Region/bracket name (for NCAA tournaments: East, West, South, Midwest)","example":"East","type":"string"},"scheduled_time":{"description":"Scheduled start time for the game/series","example":"2025-03-20T12:00:00Z","format":"date-time","type":"string"},"series_score":{"description":"Series score for best-of-series rounds (null for single elimination)","example":{"away":2,"home":4},"properties":{"away":{"description":"Away team wins in series","type":"integer"},"home":{"description":"Home team wins in series","type":"integer"}},"type":"object"},"status":{"description":"Matchup status","enum":["scheduled","in_progress","completed","pending"],"type":"string"},"winner_id":{"description":"Winner designation: 'home', 'away', or null if not determined","enum":["home","away",null],"type":"string"}},"required":["position","home_team","away_team","status"],"title":"TournamentMatchup","type":"object"},"type":"array"},"round_name":{"description":"Human-readable round name (e.g., 'First Round', 'Sweet 16', 'Conference Finals')","example":"First Round","type":"string"},"round_number":{"description":"Sequential round number (1-based, lower numbers = earlier rounds)","example":1,"type":"integer"},"round_type":{"description":"Type of round: elimination (single game), best_of_series (multi-game), knockout (post-group stage)","enum":["elimination","best_of_series","knockout"],"type":"string"}},"required":["round_number","round_name","round_type","matchups"],"title":"TournamentRound","type":"object"},"WebhookChangeEvent":{"description":"A single entity change carried inside a change-log webhook batch. Every event in a batch shares the batch's `resource_type`.","example":{"changed_at":"2026-08-04T10:30:00Z","common_model_id":"550e8400-e29b-41d4-a716-446655440000","hash":"a1b2c3d4e5f6789012345678901234567890abcdef1234567890abcdef123456","league_id":"7c9e6679-7425-40de-944b-e07fc1f90ae7","resource_type":"team"},"properties":{"changed_at":{"description":"When the change was detected (UTC, ISO 8601).","format":"date-time","type":"string"},"common_model_id":{"description":"Stable identifier across all tenants — re-fetch by this.","format":"uuid","type":"string"},"event_id":{"description":"Parent event — present on `event_scoreboard` only.","format":"uuid","type":"string"},"hash":{"description":"SHA-256 (64 hex chars) of the persisted entity shape, for deduplication.","type":"string"},"league_id":{"description":"League the entity belongs to — present when the entity carries one.","format":"uuid","type":"string"},"resource_type":{"description":"Entity type — duplicate of the batch-level `resource_type`.","type":"string"}},"required":["resource_type","common_model_id","hash","changed_at"],"title":"WebhookChangeEvent","type":"object"},"SearchResponse":{"properties":{"data":{"properties":{"events":{"items":{"properties":{"common_model_id":{"format":"uuid","type":"string"},"league":{"additionalProperties":false,"nullable":true,"properties":{"abbreviation":{"type":"string"},"common_model_id":{"format":"uuid","type":"string"},"name":{"type":"string"}},"type":"object"},"league_id":{"format":"uuid","type":"string"},"market_count":{"description":"Distinct OPEN markets of the whole event in tenant-visible sources, the same value `GET /v1/events` carries (not limited to the markets matched by `q`, unlike `total_markets`). 0 for a finished event; `null` when the count could not be computed.","minimum":0,"nullable":true,"type":"integer"},"market_counts_by_venue":{"additionalProperties":{"minimum":0,"type":"integer"},"description":"Open markets per venue (`polymarket`, `kalshi`, `prophetx`, ...), the names `GET /v1/odds` calls `aggregator`. A market listed on two venues counts once per venue, so the values can sum above `market_count`. Venues with none are absent; `null` when unknown.","nullable":true,"type":"object"},"markets":{"items":{"properties":{"category":{"nullable":true,"type":"string"},"common_model_id":{"format":"uuid","nullable":true,"type":"string"},"is_main":{"type":"boolean"},"market_name":{"nullable":true,"type":"string"},"market_type":{"type":"string"},"outcomes":{"items":{"properties":{"common_model_id":{"format":"uuid","nullable":true,"type":"string"},"line":{"nullable":true,"type":"number"},"name":{"nullable":true,"type":"string"},"player_id":{"format":"uuid","nullable":true,"type":"string"},"quotes":{"items":{"additionalProperties":true,"description":"A latest quote as `GET /v1/odds` renders it (same serializer), including `metadata.execution`, `deep_link`, `limits` and `canonical_outcome_id`. The prediction-market `line_alignment` block is not included in v1.","type":"object"},"type":"array"},"selection":{"nullable":true,"type":"string"},"team_id":{"format":"uuid","nullable":true,"type":"string"}},"type":"object"},"type":"array"}},"type":"object"},"type":"array"},"participants":{"description":"Same participant contract as `GET /v1/events`.","items":{"additionalProperties":true,"type":"object"},"type":"array"},"scheduled_time":{"format":"date-time","nullable":true,"type":"string"},"status":{"nullable":true,"type":"string"},"title":{"nullable":true,"type":"string"},"total_markets":{"description":"Markets found in the rows read; a partial count when `truncated.rows` is true.","type":"integer"},"truncated":{"description":"Which per-event caps cut the board. `rows` is true when board rows were left unread: a read pass is cut at 3,000 rows in `market_type` order, and the types it did not reach are read again (at most 3 passes) before markets are chosen.","properties":{"markets":{"type":"boolean"},"outcomes":{"type":"boolean"},"quotes":{"type":"boolean"},"rows":{"type":"boolean"}},"type":"object"}},"required":["common_model_id"],"type":"object"},"type":"array"},"players":{"items":{"properties":{"common_model_id":{"format":"uuid","type":"string"},"family_name":{"nullable":true,"type":"string"},"first_name":{"nullable":true,"type":"string"},"image_url":{"nullable":true,"type":"string"},"league":{"nullable":true,"type":"string"},"league_id":{"format":"uuid","type":"string"},"match_quality":{"description":"Lower is better: 1 exact full name, 2 full-name prefix, 3 exact family name, 4 family-name prefix, 5 the name in another word order or without a middle name, 6 a one-edit misspelling, 7 a two-edit misspelling (misspellings are tried only when no player the tenant can see matched exactly or by prefix).","type":"integer"},"name":{"type":"string"},"position":{"nullable":true,"type":"string"},"team_id":{"format":"uuid","nullable":true,"type":"string"}},"required":["common_model_id","name"],"type":"object"},"type":"array"},"teams":{"items":{"properties":{"abbreviation":{"nullable":true,"type":"string"},"common_model_id":{"format":"uuid","type":"string"},"image_url":{"nullable":true,"type":"string"},"league":{"description":"League abbreviation","type":"string"},"league_id":{"format":"uuid","type":"string"},"market":{"nullable":true,"type":"string"},"match_quality":{"description":"Lower is better: 1 exact name, 2 exact market+nickname, 3 exact nickname, abbreviation or alias, 4 exact market, 5 prefix, 6 a whole word of the name or a one-edit typo, 7+ a larger typo.","type":"integer"},"name":{"type":"string"},"nickname":{"nullable":true,"type":"string"}},"required":["common_model_id","name"],"type":"object"},"type":"array"}},"type":"object"},"meta":{"properties":{"candidates_truncated":{"description":"A documented candidate cap cut the set (teams, events, players).","type":"boolean"},"has_next_page":{"type":"boolean"},"incomplete_event_ids":{"items":{"format":"uuid","type":"string"},"type":"array"},"incomplete_resolution":{"description":"A resolution read failed or timed out; entities or events may be missing.","type":"boolean"},"next_cursor":{"nullable":true,"type":"string"},"page_size":{"type":"integer"},"query":{"properties":{"entity_phrase":{"type":"string"},"fallback_used":{"type":"boolean"},"market_intent":{"properties":{"categories":{"items":{"type":"string"},"type":"array"},"class":{"enum":["entity_only","market_only","entity_market"],"type":"string"},"default_scope":{"description":"`core` when the query carried no market intent.","nullable":true,"type":"string"},"market_types":{"items":{"type":"string"},"type":"array"},"overridden":{"type":"boolean"},"phrases":{"items":{"type":"string"},"type":"array"}},"type":"object"}},"type":"object"},"stale_quotes_dropped":{"description":"Quotes removed from the boards because they are older than the maximum quote age (24 hours by default), counted across the returned events. `GET /v1/odds` is unaffected.","minimum":0,"type":"integer"},"truncated_event_ids":{"items":{"format":"uuid","type":"string"},"type":"array"},"unscoped_event_ids":{"description":"Events whose player-props board could not be scoped to the player or team roster in `q` (the roster is missing or over the per-team cap for a participating team, or no ranked player plays in the event), or whose scoped read found no rows and was read again unscoped, so their board is unscoped and may include other teams' players.","items":{"format":"uuid","type":"string"},"type":"array"}},"type":"object"}},"required":["data","meta"],"title":"SearchResponse","type":"object"},"TournamentGroup":{"description":"A group represents a division within the group stage of a tournament (World Cup, UEFA Champions League).\n\nGroups organize teams into round-robin competition pools where teams play each other\nand standings determine advancement to knockout rounds. Each group has its own standings\ntable tracking wins, losses, goals, and points.\n\n## Group Stage Structure\n\n- **Teams**: 3-4 teams per group (varies by tournament)\n- **Format**: Round-robin (each team plays every other team in group)\n- **Advancement**: Top teams (typically top 2) advance to knockout stage\n- **Standings**: Points, goal differential, head-to-head determine rankings\n\n## Standings Calculation\n\nStandings are calculated from group stage events:\n- **Points**: Win = 3, Draw = 1, Loss = 0 (varies by sport)\n- **Goal Differential**: Goals for - Goals against\n- **Head-to-Head**: Direct matchup results for tiebreaking\n","example":{"group_name":"Group A","standings":[{"drawn":1,"goal_difference":3,"goals_against":2,"goals_for":5,"lost":0,"played":3,"points":7,"position":1,"team_id":"e2790078-ec3a-4c45-8dc4-5cf173960b2b","won":2}],"teams":[{"abbreviation":"TMA","country_code":"USA","name":"Team A","team_id":"e2790078-ec3a-4c45-8dc4-5cf173960b2b"}]},"properties":{"group_name":{"description":"Group identifier (e.g., 'Group A', 'Group B')","example":"Group A","type":"string"},"standings":{"description":"Current group standings ordered by position","items":{"properties":{"drawn":{"description":"Draws","type":"integer"},"goal_difference":{"description":"Goal differential","type":"integer"},"goals_against":{"description":"Goals conceded","type":"integer"},"goals_for":{"description":"Goals scored","type":"integer"},"lost":{"description":"Losses","type":"integer"},"played":{"description":"Games played","type":"integer"},"points":{"description":"Total points","type":"integer"},"position":{"description":"Current position in group (1-based)","type":"integer"},"team_id":{"format":"uuid","type":"string"},"won":{"description":"Wins","type":"integer"}},"type":"object"},"type":"array"},"teams":{"description":"Teams participating in this group","items":{"properties":{"abbreviation":{"description":"Team abbreviation","type":"string"},"country_code":{"description":"Country code (for international tournaments)","type":"string"},"name":{"description":"Team name","type":"string"},"team_id":{"description":"Team common_model_id","format":"uuid","type":"string"}},"type":"object"},"type":"array"}},"required":["group_name","teams","standings"],"title":"TournamentGroup","type":"object"},"PlayStat":{"description":"Individual player statistics and involvement details for a specific play within an event.\n\nPlayStat records capture how individual players contributed to or were affected by\nspecific plays. This granular data enables advanced player evaluation, situational\nperformance analysis, and detailed coaching insights beyond traditional box scores.\n\n## Player-Play Relationship\nEach PlayStat links a player to a specific play, recording:\n- **Role**: How the player was involved (quarterback, receiver, defender, etc.)\n- **Performance**: Measurable outcomes (yards gained, tackles made, shots taken)\n- **Context**: Situational factors affecting the player's involvement\n\n## Use Cases\n- **Advanced Analytics**: Context-aware player performance evaluation\n- **Coaching Analysis**: Individual performance in specific situations\n- **Fantasy Sports**: Granular scoring and projection models\n- **Player Development**: Detailed performance tracking and improvement areas\n\n## Data Inheritance\nPlayStat inherits contextual information from the parent Play record while adding\nplayer-specific details about involvement and statistical outcomes.\n","example":{"common_model_id":"123e4567-e89b-12d3-a456-426614174000","event_id":"123e4567-e89b-12d3-a456-426614174003","play_number":1,"player_id":"123e4567-e89b-12d3-a456-426614174001","player_info":{"role":"quarterback","statistics":{"completion":true,"passing_touchdowns":1,"passing_yards":20}}},"properties":{"common_model_id":{"description":"Unique identifier for this player-play statistical record","type":"string"},"defense_id":{"description":"Team or player in defensive role during this play","type":"string"},"description":{"description":"Human-readable description of what happened (inherited from Play)","type":"string"},"event_id":{"description":"Parent event/game containing this play","type":"string"},"game_context":{"additionalProperties":true,"description":"Situational game state when play occurred (inherited from parent Play)","type":"object"},"inserted_at":{"description":"When this player-play statistic record was created","format":"date-time","type":"string"},"league_id":{"description":"League context for sport-specific statistical interpretation","format":"uuid","type":"string"},"minutes_remaining":{"description":"Minutes remaining in period when play started (inherited from Play)","type":"integer"},"offense_id":{"description":"Team or player with possession during this play","type":"string"},"period":{"description":"Game period when this play occurred (inherited from Play)","type":"integer"},"play_details":{"additionalProperties":true,"description":"General play outcome details (inherited from parent Play record)","type":"object"},"play_number":{"description":"Play number within the event, scoped to `source` — NOT globally unique per event. Multiple feeds (from different providers) can each number their own plays starting from 1, so the same play_number on two different sources refers to two different plays. Always join on (event_id, source, play_number), never (event_id, play_number) alone.","type":"integer"},"play_type":{"description":"Classification of play action (inherited from parent Play)","type":"string"},"player_id":{"description":"Player who participated in or was affected by this play","type":"string"},"player_info":{"additionalProperties":true,"description":"Player-specific role, involvement, and statistical outcomes for this play","properties":{"external_player_id":{"description":"Provider-specific player identifier","type":"string"},"role":{"description":"Player's role(s) in this specific play (e.g., 'quarterback', 'receiver', 'tackler')","items":{"type":"string"},"type":"array"},"statistics":{"additionalProperties":false,"description":"Play-level player statistics using canonical field names from our stat registry.\n\n## Play-Specific Context\nThese statistics represent individual player performance within a single play. Unlike\nevent-scoped or season-scoped stats, these capture momentary contributions to specific\ngame actions.\n\n## Standardized Stat Names\nAll statistics use our unified canonical naming system to ensure consistency across data providers.\nCommon play-level stats include:\n- **Passing**: passing_yards, passing_touchdowns, completion, interception\n- **Rushing**: rushing_yards, rushing_touchdowns, fumble\n- **Receiving**: receiving_yards, receiving_touchdowns, reception, target\n- **Defense**: tackle, assist, sack, pass_defended, interception\n- **Kicking**: field_goal_made, field_goal_yards, extra_point_made\n\n## Provider Translation\nRaw provider data is automatically translated to canonical names:\n- **Provider A**: \"py\" → \"passing_yards\", \"car\" → \"rushing_attempts\"\n- **Provider B**: \"pass_yds\" → \"passing_yards\", \"rush_att\" → \"rushing_attempts\"\n\nNote: Not all stats are applicable to every play. Only relevant stats for the player's\nrole in that specific play will be present.\n","example":{"completion":true,"passing_yards":15,"target_depth":12},"properties":{"def_interception_touchdowns":{"description":"Defensive interception touchdowns","example":5,"type":"integer"},"throwaways":{"description":"Number of throw away passes","example":5,"type":"integer"},"fanduel_fantasy_points_ceiling":{"description":"FanDuel fantasy points ceiling","example":18.5,"type":"number"},"on_target_throws":{"description":"Number of on-target throws","example":5,"type":"integer"},"interception_returns":{"description":"Number of interception returns","example":5,"type":"integer"},"kickoff_return_touchdowns":{"description":"Kickoff return touchdowns","example":5,"type":"integer"},"extra_points_attempted":{"description":"Number of extra point attempts","example":5,"type":"integer"},"redzone_rushing_attempts":{"description":"Rush attempts in the red zone","example":15,"type":"integer"},"is_motion":{"description":"Whether player was in motion during play","example":"example_value","type":"boolean"},"passing_attempts":{"description":"Total number of pass attempts","example":15,"type":"integer"},"punt_long":{"description":"Longest punt","example":5,"type":"integer"},"fumble_return_yards":{"description":"Yards gained on fumble returns","example":250,"type":"integer"},"first_read_receptions":{"description":"Number of first read receptions","example":5,"type":"integer"},"red_zone_pass_attempts":{"description":"Pass attempts in red zone","example":15,"type":"integer"},"points":{"description":"Total points scored by team","example":5,"type":"integer"},"depth_of_target":{"description":"Average depth of target","example":12.3,"type":"number"},"defensive_interceptions":{"description":"Defensive interceptions","example":5,"type":"integer"},"receiving_two_point_conversions":{"description":"Receiving two-point conversions","example":5,"type":"integer"},"field_goal_yards":{"description":"Yards gained on field goals","example":250,"type":"integer"},"conversion_defense_successes":{"description":"Two-point conversion defensive successes","example":5,"type":"integer"},"blocked_kick_return_touchdowns":{"description":"Touchdowns scored on blocked kick returns","example":5,"type":"integer"},"fanduel_ownership":{"description":"FanDuel ownership percentage","example":12.3,"type":"number"},"draftkings_fantasy_points_ceiling":{"description":"DraftKings fantasy points ceiling","example":18.5,"type":"number"},"first_read_targets":{"description":"Number of first read targets","example":5,"type":"integer"},"special_teams_snap_count":{"description":"Number of special teams snaps played","example":5,"type":"integer"},"out_of_pocket_reason":{"description":"Reason quarterback left the pocket","example":"example_value","type":"string"},"goal_line_touches":{"description":"Number of goal line touches","example":5,"type":"integer"},"receiving_yards_100_plus":{"description":"Number of 100+ yard receiving games","example":250,"type":"integer"},"total_pocket_time":{"description":"Total time spent in pocket","example":12.3,"type":"number"},"interception_return_longest_touchdown":{"description":"Longest interception return for touchdown","example":5,"type":"integer"},"field_goals_attempts":{"description":"Number of field goal attempts","example":15,"type":"integer"},"safeties":{"description":"Number of safeties","example":5,"type":"integer"},"pass_first_downs":{"description":"First downs gained via passing","example":5,"type":"integer"},"red_zone_passing_completions":{"description":"Passing completions in red zone","example":10,"type":"integer"},"net_punt_yards":{"description":"Net punt yards","example":250,"type":"integer"},"kneel_downs":{"description":"Number of kneel downs","example":5,"type":"integer"},"cushion_yards":{"description":"Cushion yards","example":250,"type":"integer"},"punt_yards":{"description":"Total punt yards","example":250,"type":"integer"},"challenges_remaining":{"description":"Number of challenges remaining","example":5,"type":"integer"},"passing_gross_yards":{"description":"Gross passing yards before sacks","example":250,"type":"integer"},"avg_pocket_time":{"description":"Average time in pocket per pass attempt","example":12.3,"type":"number"},"defended_passes":{"description":"Passes defended by defenders","example":5,"type":"integer"},"dropped_pass":{"description":"Number of dropped passes","example":5,"type":"integer"},"rushing_direction":{"description":"Direction of rushing attempt","example":"example_value","type":"string"},"sacks_taken":{"description":"Number of sacks taken by quarterback","example":5,"type":"integer"},"rec_long":{"description":"Longest reception","example":5,"type":"integer"},"yards_after_catch":{"description":"Yards gained after catch","example":250,"type":"integer"},"activated":{"description":"Player was activated to the game-day roster (shipped as 0/1)","example":5,"type":"integer"},"passing_yards":{"description":"Total passing yards thrown by the player/team","example":250,"type":"integer"},"touchdowns":{"description":"Total touchdowns scored","example":5,"type":"integer"},"rushing_fumbles":{"description":"Number of fumbles while rushing","example":5,"type":"integer"},"pre_snap_motion":{"description":"Player pre-snap motion type","example":"example_value","type":"boolean"},"nfl_fantasy_points":{"description":"NFL fantasy points","example":18.5,"type":"number"},"assisted_tackles":{"description":"Number of assisted tackles","example":5,"type":"integer"},"passing_completions":{"description":"Number of completed passes","example":10,"type":"integer"},"sacks":{"description":"Number of sacks (as QB or defensive player)","example":12.3,"type":"number"},"passing_40_plus":{"description":"Passing completions of 40+ yards","example":5,"type":"integer"},"missed_tackle_location":{"description":"Location of missed tackle","example":"example_value","type":"string"},"rushing_longest_touchdown":{"description":"Longest touchdown rush","example":5,"type":"integer"},"penalty_yards":{"description":"Penalty yards assessed","example":250,"type":"integer"},"rushing_tds_40_plus_yards":{"description":"Rushing touchdowns of 40+ yards","example":250,"type":"integer"},"penalties":{"description":"Number of penalties committed","example":5,"type":"integer"},"rushing_yards":{"description":"Total rushing yards gained","example":250,"type":"integer"},"punt_return_yards":{"description":"Punt return yards","example":250,"type":"integer"},"blocked_kicks":{"description":"Number of blocked kicks","example":5,"type":"integer"},"position":{"description":"Player position","example":"example_value","type":"string"},"sack_yards_lost":{"description":"Yards lost on sacks","example":250,"type":"integer"},"kickoff_touchbacks":{"description":"Number of kickoff touchbacks","example":5,"type":"integer"},"def_interception_yards":{"description":"Defensive interception return yards","example":250,"type":"integer"},"rush_long":{"description":"Longest rush","example":5,"type":"integer"},"played":{"description":"Whether the player appeared in the game","example":"example_value","type":"boolean"},"two_point_conversions":{"description":"Number of two-point conversions","example":5,"type":"integer"},"conversion_defense_attempts":{"description":"Two-point conversion defensive attempts","example":15,"type":"integer"},"tackles":{"description":"Total tackles (solo + assisted)","example":5,"type":"integer"},"return_yards":{"description":"Total return yards (kick/punt combined)","example":250,"type":"integer"},"kickoff_return_yards":{"description":"Total yards on kickoff returns (opponent)","example":250,"type":"integer"},"games_played":{"description":"Number of games played in","example":5,"type":"integer"},"receiving_20_plus":{"description":"Receptions of 20+ yards","example":5,"type":"integer"},"field_goals_missed":{"description":"Field goals missed","example":5,"type":"integer"},"draftkings_rating":{"description":"DraftKings player rating","example":98.7,"type":"number"},"pre_snap_alignment":{"description":"Player pre-snap alignment","example":"example_value","type":"string"},"kickoff_inside_20":{"description":"Kickoffs downed inside the 20 yard line","example":5,"type":"integer"},"batted_passes":{"description":"Passes batted down at line of scrimmage","example":5,"type":"integer"},"rushing_avg_yards":{"description":"Average yards per carry","example":12.3,"type":"number"},"interception_long":{"description":"Longest interception return","example":5,"type":"integer"},"special_teams_assisted_tackles":{"description":"Assisted tackles made on special-teams plays (kick and punt coverage)","example":5,"type":"integer"},"time_to_throw":{"description":"Time from snap to ball release in seconds","example":12.3,"type":"number"},"player_id":{"description":"Player identifier","example":"example_value","type":"string"},"kickoff_out_of_bounds":{"description":"Kickoffs out of bounds","example":5,"type":"integer"},"pass_long":{"description":"Longest pass completion","example":5,"type":"integer"},"fanduel_fantasy_points":{"description":"FanDuel fantasy points","example":18.5,"type":"number"},"def_tackles_assisted":{"description":"Defensive assisted tackles","example":5,"type":"integer"},"punts_inside_20":{"description":"Number of punts inside the 20-yard line","example":5,"type":"integer"},"solo_tackles":{"description":"Number of solo tackles","example":5,"type":"integer"},"redzone_passing_attempts":{"description":"Pass attempts in the red zone","example":15,"type":"integer"},"poor_throws":{"description":"Number of poor throws","example":5,"type":"integer"},"opponent_fumble_recovery_touchdowns":{"description":"Touchdowns on opponent fumble recoveries","example":5,"type":"integer"},"opponent_fumble_recoveries":{"description":"Opponent fumble recoveries","example":5,"type":"integer"},"deep_pass_attempts":{"description":"Deep pass attempts","example":15,"type":"integer"},"gross_kickoff_yards":{"description":"Yards gained on gross kickoffs","example":250,"type":"integer"},"qb_knockdowns":{"description":"Times quarterback was knocked down","example":5,"type":"integer"},"passing_attempts_allowed":{"description":"Passing attempts allowed by defense","example":15,"type":"integer"},"misc_solo_tackles":{"description":"Solo tackles made on change-of-possession plays (interception and fumble returns)","example":5,"type":"integer"},"total_tackles":{"description":"Total tackles across every phase of the game -- scrimmage defense plus special teams plus change-of-possession (misc) plays. This is the quantity NFL tackle props are priced and graded on.","example":5,"type":"integer"},"deep_targets":{"description":"Number of deep targets (20+ yards)","example":5,"type":"integer"},"fumbles":{"description":"Total number of fumbles","example":5,"type":"integer"},"fourth_down_stops":{"description":"Fourth down stops recorded by defense","example":5,"type":"integer"},"rushing_two_point_conversions":{"description":"Rushing two-point conversions","example":5,"type":"integer"},"missed_or_broken_tackles":{"description":"Number of missed or broken tackles","example":5,"type":"integer"},"receiving_yards":{"description":"Total receiving yards gained","example":250,"type":"integer"},"fanduel_rating":{"description":"FanDuel player rating","example":98.7,"type":"number"},"separation_type":{"description":"Type of separation","example":"example_value","type":"string"},"pressure_type":{"description":"Pressure type","example":"example_value","type":"string"},"timeouts_used":{"description":"Number of timeouts used","example":5,"type":"integer"},"returns":{"description":"Number of return attempts (kick/punt)","example":5,"type":"integer"},"conversion_passing_attempts":{"description":"Two-point conversion passing attempts","example":15,"type":"integer"},"net_kickoff_yards":{"description":"Yards gained on net kickoffs","example":250,"type":"integer"},"receiving_targets":{"description":"Number of times targeted for a pass","example":5,"type":"integer"},"extra_points_blocked":{"description":"Number of extra points blocked","example":5,"type":"integer"},"receptions":{"description":"Number of receptions/catches","example":5,"type":"integer"},"snap_counts_confirmed":{"description":"Provider confirms the snap counts for this game are final","example":"example_value","type":"boolean"},"motion_at_snap":{"description":"Player motion status at snap","example":"example_value","type":"boolean"},"receiving_fumbles":{"description":"Number of fumbles while receiving","example":5,"type":"integer"},"explosive_runs":{"description":"Number of explosive rushing attempts (10+ yards)","example":5,"type":"integer"},"rushing_40_plus":{"description":"Rushing attempts of 40+ yards","example":5,"type":"integer"},"interceptions":{"description":"Number of interceptions thrown","example":5,"type":"integer"},"quarterback_hits":{"description":"Number of quarterback hits","example":5,"type":"integer"},"interception_return_yards":{"description":"Yards gained on interception returns","example":250,"type":"integer"},"yahoo_fantasy_points_ceiling":{"description":"Yahoo fantasy points ceiling","example":18.5,"type":"number"},"primary_coverage":{"description":"Primary coverage","example":"example_value","type":"boolean"},"secondary_coverage":{"description":"Secondary coverage","example":"example_value","type":"boolean"},"fumbles_recovered":{"description":"Number of fumbles recovered","example":5,"type":"integer"},"rushing_20_plus":{"description":"Rushing attempts of 20+ yards","example":5,"type":"integer"},"throw_away":{"description":"Whether the pass was intentionally thrown away","example":"example_value","type":"boolean"},"field_goal_percentage":{"description":"Field goal percentage (made/attempted)","example":12.3,"type":"number"},"receiving_tds":{"description":"Number of receiving touchdowns","example":2,"type":"integer"},"passes_defended":{"description":"Number of passes defended","example":5,"type":"integer"},"fumble_return_touchdowns":{"description":"Touchdowns scored on fumble returns","example":5,"type":"integer"},"completion_percentage":{"description":"Pass completion percentage","example":12.3,"type":"number"},"interception_worthy_throws":{"description":"Interception worthy throws","example":5,"type":"integer"},"red_zone_targets":{"description":"Number of targets in the red zone","example":5,"type":"integer"},"allowed_pressure":{"description":"Allowed pressure","example":"example_value","type":"boolean"},"kickoff_yards":{"description":"Total kickoff yards","example":250,"type":"integer"},"qb_hurries":{"description":"Times quarterback was hurried","example":5,"type":"integer"},"kickoff_returns":{"description":"Number of kickoff returns by opponents","example":5,"type":"integer"},"passing_two_point_conversions":{"description":"Passing two-point conversions","example":5,"type":"integer"},"first_downs":{"description":"Total first downs (used for passing first downs in SR)","example":5,"type":"integer"},"defensive_touchdowns":{"description":"Number of defensive touchdowns","example":5,"type":"integer"},"opponent_fumble_recovery_yards":{"description":"Yards gained on opponent fumble recoveries","example":250,"type":"integer"},"blocked_kick_returns":{"description":"Number of blocked kick returns","example":5,"type":"integer"},"conversion_rushing_attempts":{"description":"Two-point conversion rushing attempts","example":15,"type":"integer"},"extra_point_return_touchdowns":{"description":"Extra point attempts returned for a touchdown by the defense","example":5,"type":"integer"},"own_fumble_recoveries":{"description":"Own fumble recoveries","example":5,"type":"integer"},"punts_blocked":{"description":"Number of punts blocked","example":5,"type":"integer"},"rush_rate":{"description":"Rush rate (rushing attempts per play)","example":12.3,"type":"number"},"passing_avg_yards":{"description":"Average yards per pass attempt","example":12.3,"type":"number"},"special_teams_solo_tackles":{"description":"Solo tackles made on special-teams plays (kick and punt coverage)","example":5,"type":"integer"},"red_zone_passing_attempts":{"description":"Passing attempts in red zone","example":15,"type":"integer"},"conversion_rushing_successes":{"description":"Two-point conversion rushing successes","example":5,"type":"integer"},"dropped_passes":{"description":"Passes dropped by receivers","example":5,"type":"integer"},"passing_net_yards":{"description":"Net passing yards (gross yards minus sack yards lost)","example":250,"type":"integer"},"rushing_first_downs":{"description":"First downs gained via rushing","example":5,"type":"integer"},"passing_yards_allowed":{"description":"Passing yards allowed by defense","example":250,"type":"integer"},"tackles_for_loss_yards":{"description":"Yards lost on tackles for loss","example":250,"type":"integer"},"punt_touchbacks":{"description":"Number of punt touchbacks","example":5,"type":"integer"},"missed_tackle_cause":{"description":"Cause of missed tackle","example":"example_value","type":"string"},"missed_tackle":{"description":"Number of missed tackles","example":5,"type":"integer"},"own_fumble_recovery_touchdowns":{"description":"Touchdowns on own fumble recoveries","example":5,"type":"integer"},"auction_value":{"description":"Auction draft value","example":12.3,"type":"number"},"rushing_attempts_allowed":{"description":"Rushing attempts allowed by defense","example":15,"type":"integer"},"receiving_first_downs":{"description":"First downs gained via receiving","example":5,"type":"integer"},"fg_long":{"description":"Longest field goal made","example":5,"type":"integer"},"own_fumble_recovery_yards":{"description":"Yards gained on own fumble recoveries","example":250,"type":"integer"},"player_kickoff_return_yards":{"description":"Kickoff return yards recorded by the returning player","example":250,"type":"integer"},"timeouts_remaining":{"description":"Number of timeouts remaining","example":5,"type":"integer"},"defensive_tackles_combined":{"description":"Tackles (solo + assisted) made on scrimmage defense only, excluding special teams and change-of-possession plays","example":5,"type":"integer"},"tackles_for_loss":{"description":"Rushes resulting in tackles for loss","example":5,"type":"integer"},"rushing_attempts":{"description":"Number of rushing attempts","example":15,"type":"integer"},"games_started":{"description":"Number of games started","example":5,"type":"integer"},"rank":{"description":"Player ranking","example":5,"type":"integer"},"fielding_e":{"description":"Fielding errors","example":5,"type":"integer"},"kickoff_onside_successes":{"description":"Successful onside kicks","example":5,"type":"integer"},"scrambles":{"description":"Number of quarterback scrambles","example":5,"type":"integer"},"passing_touchdowns_allowed":{"description":"Passing touchdowns allowed by defense","example":5,"type":"integer"},"passing_tds":{"description":"Number of passing touchdowns","example":2,"type":"integer"},"spikes":{"description":"Number of spiked passes","example":5,"type":"integer"},"punt_return_attempts":{"description":"Punt return attempts","example":15,"type":"integer"},"conversion_passing_successes":{"description":"Two-point conversion passing successes","example":5,"type":"integer"},"deep_pass_completions":{"description":"Deep pass completions (20+ yards)","example":10,"type":"integer"},"forced_fumbles":{"description":"Number of fumbles forced by defender","example":5,"type":"integer"},"interception_touchdowns_thrown":{"description":"Interceptions returned for touchdowns (pick-6s)","example":5,"type":"integer"},"punt_return_touchdowns":{"description":"Punt return touchdowns","example":5,"type":"integer"},"is_out_of_pocket":{"description":"Whether quarterback left the pocket","example":"example_value","type":"boolean"},"passing_yards_300_plus":{"description":"Passing yards over 300","example":250,"type":"integer"},"kickoff_return_attempts":{"description":"Kickoff return attempts","example":15,"type":"integer"},"rushing_yards_allowed":{"description":"Rushing yards allowed by defense","example":250,"type":"integer"},"jersey":{"description":"Player jersey number","example":"example_value","type":"string"},"passing_rating":{"description":"Quarterback passer rating","example":98.7,"type":"number"},"contested_ball":{"description":"Whether the targeted receiver's pass was contested","example":"example_value","type":"boolean"},"field_goals_made":{"description":"Number of field goals made","example":5,"type":"integer"},"interception_return_average":{"description":"Average yards per interception return","example":12.3,"type":"number"},"extra_points_missed":{"description":"Extra points missed","example":5,"type":"integer"},"yahoo_fantasy_points":{"description":"Yahoo fantasy points","example":18.5,"type":"number"},"defensive_snap_count":{"description":"Number of defensive snaps played","example":5,"type":"integer"},"endzone_fumble_recovery_touchdowns":{"description":"Touchdowns from end zone fumble recoveries","example":5,"type":"integer"},"rushing_touchdowns_allowed":{"description":"Rushing touchdowns allowed by defense","example":5,"type":"integer"},"return_tds":{"description":"Number of return touchdowns","example":2,"type":"integer"},"kickoff_endzone":{"description":"Kickoffs reaching the end zone","example":5,"type":"integer"},"snap_count":{"description":"Number of offensive snaps played","example":5,"type":"integer"},"def_sack_yards":{"description":"Defensive sack yards","example":250,"type":"integer"},"batted_pass":{"description":"Number of passes batted down by defense","example":5,"type":"integer"},"route_type":{"description":"Type of route run by receiver","example":"example_value","type":"string"},"receiving_40_plus":{"description":"Receptions of 40+ yards","example":5,"type":"integer"},"passing_tds_40_plus_yards":{"description":"Passing touchdowns of 40+ yards","example":250,"type":"integer"},"fumbles_out_of_bounds":{"description":"Number of fumbles that went out of bounds","example":5,"type":"integer"},"deep_pass_receptions":{"description":"Deep pass receptions","example":5,"type":"integer"},"fumbles_lost":{"description":"Number of fumbles lost to opponent","example":5,"type":"integer"},"fumble_long":{"description":"Longest fumble return","example":5,"type":"integer"},"punt_fair_catch":{"description":"Number of punt fair catches","example":5,"type":"integer"},"is_successful_play":{"description":"Whether the play was successful","example":"example_value","type":"boolean"},"total":{"description":"Over/under total for betting","example":12.3,"type":"number"},"applied_pressure":{"description":"Applied pressure","example":"example_value","type":"boolean"},"rushing_tds":{"description":"Number of rushing touchdowns","example":2,"type":"integer"},"passing_air_yards":{"description":"Total air yards on pass attempts","example":250,"type":"integer"},"punt_average":{"description":"Average yards per punt","example":12.3,"type":"number"},"field_goals_blocked":{"description":"Number of field goals blocked","example":5,"type":"integer"},"created_reception":{"description":"Whether the receiver created the reception through an exceptional play","example":"example_value","type":"boolean"},"shotgun":{"description":"Plays run from shotgun formation","example":5,"type":"integer"},"kickoff_attempts":{"description":"Total kickoff attempts","example":15,"type":"integer"},"yards_after_contact":{"description":"Yards gained after contact","example":250,"type":"integer"},"kickoff_onside_attempts":{"description":"Onside kick attempts","example":15,"type":"integer"},"receiving_tds_40_plus_yards":{"description":"Receiving touchdowns of 40+ yards","example":250,"type":"integer"},"catchable_ball":{"description":"Whether the targeted receiver's pass was catchable","example":"example_value","type":"boolean"},"passing_longest_touchdown":{"description":"Longest touchdown pass","example":5,"type":"integer"},"separation_yards":{"description":"Separation distance in yards from defender","example":12.3,"type":"number"},"spread":{"description":"Point spread for betting","example":12.3,"type":"number"},"draftkings_ownership":{"description":"DraftKings ownership percentage","example":12.3,"type":"number"},"conversion_receiving_successes":{"description":"Two-point conversion receiving successes","example":5,"type":"integer"},"extra_points_made":{"description":"Number of extra points made","example":5,"type":"integer"},"blocked_kick_return_yards":{"description":"Yards gained on blocked kick returns","example":250,"type":"integer"},"passing_completions_allowed":{"description":"Passing completions allowed by defense","example":10,"type":"integer"},"interception_return_touchdowns":{"description":"Touchdowns scored on interception returns","example":5,"type":"integer"},"successful_rush_attempts":{"description":"Number of successful rushing attempts","example":15,"type":"integer"},"passing_20_plus":{"description":"Passing completions of 20+ yards","example":5,"type":"integer"},"broken_tackles":{"description":"Number of broken tackles","example":5,"type":"integer"},"conversion_receiving_attempts":{"description":"Two-point conversion receiving attempts","example":15,"type":"integer"},"deep_receptions":{"description":"Deep receptions (20+ yards)","example":5,"type":"integer"},"misc_assisted_tackles":{"description":"Assisted tackles made on change-of-possession plays (interception and fumble returns)","example":5,"type":"integer"},"rushing_yards_100_plus":{"description":"Number of 100+ yard rushing games","example":250,"type":"integer"},"draftkings_fantasy_points":{"description":"DraftKings fantasy points","example":18.5,"type":"number"},"challenges_used":{"description":"Number of challenges used","example":5,"type":"integer"},"blitzes_faced":{"description":"Number of blitzes faced","example":5,"type":"integer"},"punt_attempts":{"description":"Number of punt attempts","example":15,"type":"integer"},"penalty_first_downs":{"description":"First downs gained via opponent penalties","example":5,"type":"integer"},"declared_inactive":{"description":"Player was on the officially declared inactive list for this game","example":"example_value","type":"boolean"},"kneels":{"description":"Number of quarterback kneels","example":5,"type":"integer"},"fantasy_points_half_ppr":{"description":"Fantasy points in half-PPR scoring","example":18.5,"type":"number"}},"type":"object"},"team_id":{"description":"Team the player was representing during this play","format":"uuid","type":"string"}},"type":"object"},"seconds_remaining":{"description":"Seconds remaining in period when play started (inherited from Play)","type":"integer"},"source":{"description":"Data provider source for this player-play statistic","type":"string"},"team_id":{"description":"Team this play stat belongs to","type":"string"},"tenant_id":{"description":"Client tenant accessing this player statistic data","format":"uuid","type":"string"},"time_on_clock":{"description":"Game clock time when play occurred (inherited from Play)","type":"string"},"updated_at":{"description":"Most recent update to this player's play involvement data","format":"date-time","type":"string"}},"required":["common_model_id","player_id","play_number","event_id"],"title":"PlayStat","type":"object"},"Sport":{"description":"A sport represents a distinct category of competitive physical activity with standardized rules.\n\nSports serve as the highest-level organizational category in our data hierarchy. Each sport\nhas unique characteristics including scoring systems, game duration, participant types,\nand statistical categories. Sports contain multiple leagues and competitions worldwide.\n\n## Supported Sports\nOur platform covers major professional and amateur sports:\n- **Team Sports**: Football (American), Basketball, Baseball, Hockey, Soccer\n- **Individual Sports**: Golf, Tennis, Boxing, MMA, Track & Field\n- **Motor Sports**: Formula 1, NASCAR, IndyCar\n- **Olympic Sports**: Swimming, Gymnastics, Wrestling\n\n## Sport Characteristics\nEach sport has distinct features that affect data structure:\n- **Scoring**: Points, goals, runs, strokes, time-based\n- **Duration**: Timed periods, innings, rounds, holes\n- **Participants**: Teams vs. individuals, roster sizes\n- **Seasons**: Annual cycles, tournament formats, continuous competition\n\n## Data Implications\nSport type determines:\n- Available statistical categories\n- Event structure and participant types\n- Betting market types and options\n- Performance measurement standards\n","example":{"abbreviation":"bball","common_model_id":"4af4c296-6fbc-4705-8660-3b587c252e16","image_url":"https://cdn.example.com/icons/basketball.png","name":"basketball"},"properties":{"abbreviation":{"description":"Common abbreviation or short code","type":"string"},"common_model_id":{"description":"Unique sport identifier in our classification system","type":"string"},"image_url":{"description":"Sport icon or representative image","type":"string"},"name":{"description":"Standard sport name (e.g., 'basketball', 'football', 'golf')","type":"string"}},"required":["name","abbreviation"],"title":"Sport","type":"object"},"FutureOutcomeOdd":{"properties":{"aggregator":{"type":"string"},"canonical_outcome_id":{"description":"Cross-venue outcome identity; present only when the outcome identity is verified (same rule as GET /v1/odds), otherwise null. Never a per-venue fallback.","format":"uuid","nullable":true,"type":"string"},"clock_provenance":{"properties":{"evaluated_at":{"format":"date-time","type":"string"},"max_age_seconds":{"enum":[300],"type":"integer"},"quote_provenance":{"description":"Unmodified retained JSON provenance, including legacy or malformed evidence.","nullable":true},"source":{"enum":["timestamp",null],"nullable":true,"type":"string"}},"type":"object"},"common_model_id":{"format":"uuid","type":"string"},"deep_link":{"nullable":true,"type":"string"},"event_id":{"description":"Always null for a future market; present for parity with GET /v1/odds.","format":"uuid","nullable":true,"type":"string"},"execution_readiness":{"description":"Requires exact native source-ID binding, active parent/outcome lifecycle and proven fresh provider clock; not order-fill certification. ProphetX additionally requires one atomic native strike/price/size/time observation matching its documented submit-order fields. ready=null means unknown. Native IDs remain separate from common_model_id.","example":{"available_size":{"state":"unknown","value":null},"depth":{"state":"unknown","value":null},"executable":{"reason":"catalog_is_not_a_book","state":"unknown"},"identifiers_valid":true,"liquidity":{"state":"unknown","value":null},"ready":null,"reasons":["provider_clock_provenance_downgrade"],"scope":"outcome_identifiers_and_provider_clock","venue":"limitless"},"properties":{"available_size":{"additionalProperties":true,"description":"Retained evidence; absent measurements have state unknown and value null.","type":"object"},"depth":{"additionalProperties":true,"description":"Retained evidence; absent measurements have state unknown and value null.","type":"object"},"executable":{"additionalProperties":true,"description":"Retained evidence; absent measurements have state unknown and value null.","type":"object"},"identifiers_valid":{"type":"boolean"},"liquidity":{"additionalProperties":true,"description":"Retained evidence; absent measurements have state unknown and value null.","type":"object"},"ready":{"nullable":true,"type":"boolean"},"reasons":{"items":{"type":"string"},"type":"array"},"scope":{"enum":["outcome_identifiers_and_provider_clock"],"type":"string"},"venue":{"type":"string"}},"type":"object"},"fetched_at":{"description":"Timestamp when SportsStack fetched or observed this quote","format":"date-time","nullable":true,"type":"string"},"freshness_reasons":{"description":"Deterministic provider_clock_* or lifecycle_* reasons; empty when fresh.","items":{"type":"string"},"type":"array"},"is_main":{"nullable":true,"type":"boolean"},"limits":{"nullable":true,"type":"object"},"market_id":{"description":"The future market this quote belongs to (its common_model_id, which is the canonical family id for a classified family). Same field as GET /v1/odds.","format":"uuid","nullable":true,"type":"string"},"market_name":{"nullable":true,"type":"string"},"market_type":{"nullable":true,"type":"string"},"metadata":{"description":"Provider quote metadata, including venue execution identifiers.","nullable":true,"type":"object"},"outcome_id":{"description":"The outcome common_model_id this quote is nested under. Same field as GET /v1/odds.","format":"uuid","nullable":true,"type":"string"},"platform_observed_at":{"description":"Prediction quotes only. Row observed_at, independently of provider freshness.","format":"date-time","nullable":true,"type":"string"},"points":{"description":"Line value distinguishing alternate positions, when applicable","nullable":true,"type":"number"},"price":{"type":"number"},"price_type":{"type":"string"},"provider_freshness":{"description":"Prediction quotes only. Fresh requires a proven nonfuture provider clock at most 300 seconds old and proven active exact-parent/outcome lifecycle. Standalone odds report unknown without lifecycle proof.","enum":["fresh","stale","unknown"],"type":"string"},"provider_observed_at":{"description":"Prediction quotes only. Authoritative provider quote timestamp; never receipt/observation time. Requires matching observed quote_provenance.provider_updated_at; null for absent, synthetic or downgraded authority.","format":"date-time","nullable":true,"type":"string"},"selection_line":{"description":"Provider label for the selected line position, when applicable","nullable":true,"type":"string"},"source_id":{"nullable":true,"type":"string"},"source_market_id":{"nullable":true,"type":"string"},"source_selection_id":{"nullable":true,"type":"string"},"sportsbook":{"type":"string"},"timestamp":{"format":"date-time","nullable":true,"type":"string"},"trading_fees":{"description":"Prediction quotes only (absent on sportsbook rows and on venues whose fees are not captured yet: Limitless, ProphetX, Polymarket US, SX Bet). Computed at read time; no order-fill or account-specific guarantee (per-account discounts, maker rebates and balance-precision rounding are not modelled). Kalshi: rates from a versioned snapshot of Kalshi's public series metadata, event fee overrides and fee schedule; `observed_at` is the snapshot time. Series with event-level fee overrides (MLB) resolve per event: an override in force reports `scope: event` (with `event_ticker`, `effective_from`), before its `scheduled_ts` the series fee is reported with the pending change under `scheduled_override`, and an event missing from the snapshot reports `unknown` (`event_fee_override_not_in_snapshot`). Predict.fun: derived from the stored market `fee_rate_bps`; `observed_at` is the quote observation time. Polymarket: the market's own Gamma `feesEnabled`/`feeSchedule` captured with the quote (`fee = shares x rate x P x (1 - P)`, taker only, makers pay nothing; `maker.rebate_rate` is the fraction of taker fees returned to makers through a daily rebate program, not a per-fill credit; fees round to 5 decimal places with no published direction, so `rounding.direction` is absent); `observed_at` is the quote observation time, and quotes whose fee data is missing, has an exponent other than 1, or is not taker-only report `unknown`. The rate is per market (`sports_fees_v3` 0.05, `sports_fees_v2` 0.03, `zero_fees` 0 are all live on sports), never a category default.","example":{"availability":"published","charge_basis":"fill","fee_multiplier":1.0,"fee_type":"quadratic_with_maker_fees","maker":{"exponent":1,"model":"quadratic","multiplier":1.0,"rate":0.0175,"rounding":{"applies_to":"fee_plus_position_cost","direction":"up","increment":0.0001}},"observed_at":"2026-09-30T15:33:45Z","scope":"series","series_ticker":"KXNBAGAME","source":"kalshi_series_snapshot","taker":{"exponent":1,"model":"quadratic","multiplier":1.0,"rate":0.07,"rounding":{"applies_to":"fee_plus_position_cost","direction":"up","increment":0.0001}}},"properties":{"availability":{"enum":["published","unavailable","unknown"],"type":"string"},"charge_basis":{"description":"Fees are charged per fill, not per order or per settlement.","enum":["fill"],"type":"string"},"effective_from":{"description":"Kalshi, `scope: event`: the override's `scheduled_ts`, from which these rates apply.","format":"date-time","type":"string"},"event_ticker":{"description":"Kalshi: the market ticker minus its last `-` segment. Present for series with event-level fee overrides.","type":"string"},"fee_multiplier":{"type":"number"},"fee_rate_bps":{"type":"integer"},"fee_type":{"type":"string"},"fees_enabled":{"description":"Polymarket: the market's Gamma `feesEnabled` flag.","type":"boolean"},"maker":{"description":"One side of the fee. `quadratic`: fee = rate x contracts x (P x (1 - P)) ^ exponent. `linear_min_price`: fee = rate x min(P, 1 - P) x shares. `none`: no fee. `rate` already includes any venue multiplier.","properties":{"exponent":{"type":"integer"},"formula":{"type":"string"},"model":{"enum":["quadratic","linear_min_price","none"],"type":"string"},"multiplier":{"type":"number"},"rate":{"type":"number"},"rebate_rate":{"description":"Polymarket maker side: fraction of taker fees rebated to resting makers by the daily rebate program (context only, not a per-fill credit).","type":"number"},"rounding":{"properties":{"applies_to":{"type":"string"},"direction":{"enum":["up"],"type":"string"},"increment":{"type":"number"}},"type":"object"}},"type":"object"},"observed_at":{"format":"date-time","nullable":true,"type":"string"},"reason":{"description":"Present when availability is unknown; deterministic snake_case reason.","type":"string"},"scheduled_override":{"description":"Kalshi, `scope: series`: an event-level override that is not yet in force. Charged from `effective_from`; carries `fee_type`, `fee_multiplier`, `taker` and `maker` like the top-level object.","properties":{"effective_from":{"format":"date-time","type":"string"},"fee_multiplier":{"type":"number"},"fee_type":{"type":"string"},"maker":{"description":"One side of the fee. `quadratic`: fee = rate x contracts x (P x (1 - P)) ^ exponent. `linear_min_price`: fee = rate x min(P, 1 - P) x shares. `none`: no fee. `rate` already includes any venue multiplier.","properties":{"exponent":{"type":"integer"},"formula":{"type":"string"},"model":{"enum":["quadratic","linear_min_price","none"],"type":"string"},"multiplier":{"type":"number"},"rate":{"type":"number"},"rebate_rate":{"description":"Polymarket maker side: fraction of taker fees rebated to resting makers by the daily rebate program (context only, not a per-fill credit).","type":"number"},"rounding":{"properties":{"applies_to":{"type":"string"},"direction":{"enum":["up"],"type":"string"},"increment":{"type":"number"}},"type":"object"}},"type":"object"},"taker":{"description":"One side of the fee. `quadratic`: fee = rate x contracts x (P x (1 - P)) ^ exponent. `linear_min_price`: fee = rate x min(P, 1 - P) x shares. `none`: no fee. `rate` already includes any venue multiplier.","properties":{"exponent":{"type":"integer"},"formula":{"type":"string"},"model":{"enum":["quadratic","linear_min_price","none"],"type":"string"},"multiplier":{"type":"number"},"rate":{"type":"number"},"rebate_rate":{"description":"Polymarket maker side: fraction of taker fees rebated to resting makers by the daily rebate program (context only, not a per-fill credit).","type":"number"},"rounding":{"properties":{"applies_to":{"type":"string"},"direction":{"enum":["up"],"type":"string"},"increment":{"type":"number"}},"type":"object"}},"type":"object"}},"type":"object"},"scope":{"enum":["series","event","market"],"type":"string"},"series_ticker":{"type":"string"},"source":{"description":"kalshi_series_snapshot | kalshi_event_fee_snapshot | kalshi_fee_schedule_default | venue_record. `kalshi_event_fee_snapshot` is a Kalshi event-level override in force; `kalshi_fee_schedule_default` is the schedule default (quadratic x 1) inferred for a KX series not in the exception snapshot.","type":"string"},"taker":{"description":"One side of the fee. `quadratic`: fee = rate x contracts x (P x (1 - P)) ^ exponent. `linear_min_price`: fee = rate x min(P, 1 - P) x shares. `none`: no fee. `rate` already includes any venue multiplier.","properties":{"exponent":{"type":"integer"},"formula":{"type":"string"},"model":{"enum":["quadratic","linear_min_price","none"],"type":"string"},"multiplier":{"type":"number"},"rate":{"type":"number"},"rebate_rate":{"description":"Polymarket maker side: fraction of taker fees rebated to resting makers by the daily rebate program (context only, not a per-fill credit).","type":"number"},"rounding":{"properties":{"applies_to":{"type":"string"},"direction":{"enum":["up"],"type":"string"},"increment":{"type":"number"}},"type":"object"}},"type":"object"}},"type":"object"}},"required":["common_model_id","price","price_type","sportsbook","aggregator"],"title":"FutureOutcomeOdd","type":"object"},"PredictionNativeMatch":{"description":"Human-reviewed cross-venue equivalence with exact canonical event, family, subject, scope, outcome/line, selection, and resolution-rule agreement.","properties":{"actual_scope":{"enum":["event","race","session","tournament","round","season"],"type":"string"},"canonical_event_id":{"format":"uuid","nullable":true,"type":"string"},"canonical_family_id":{"format":"uuid","type":"string"},"canonical_league_id":{"format":"uuid","nullable":true,"type":"string"},"canonical_subject_id":{"format":"uuid","type":"string"},"canonical_subject_type":{"type":"string"},"constituents":{"items":{"additionalProperties":true,"description":"Immutable venue-native snapshot retaining title, rules, scope, selections, native execution identifiers, and sanitized provenance.","properties":{"line":{"format":"double","nullable":true,"type":"number"},"native_selections":{"items":{"additionalProperties":true,"properties":{"canonical_subject":{"additionalProperties":false,"properties":{"id":{"format":"uuid","nullable":true,"type":"string"},"reasons":{"items":{"type":"string"},"type":"array"},"type":{"enum":["player"],"nullable":true,"type":"string"}},"required":["type","id","reasons"],"type":"object"},"execution_identifiers":{"additionalProperties":true,"type":"object"},"execution_readiness":{"enum":["ready","blocked","unknown"],"type":"string"},"execution_readiness_reasons":{"items":{"type":"string"},"type":"array"},"label":{"type":"string"},"lifecycle":{"type":"string"},"line":{"format":"double","nullable":true,"type":"number"},"native_selection_id":{"type":"string"},"native_subject":{"additionalProperties":true,"nullable":true,"type":"object"},"outcome_meaning":{"type":"string"},"quote_readiness":{"enum":["ready","blocked","unknown"],"type":"string"},"quote_readiness_reasons":{"items":{"type":"string"},"type":"array"}},"required":["native_selection_id","execution_identifiers","native_subject","canonical_subject","quote_readiness","quote_readiness_reasons","execution_readiness","execution_readiness_reasons"],"type":"object"},"type":"array"},"snapshot_version":{"nullable":true,"type":"integer"}},"type":"object"},"minItems":2,"type":"array"},"id":{"format":"uuid","type":"string"},"line":{"format":"double","nullable":true,"type":"number"},"outcome_meaning":{"type":"string"},"period":{"nullable":true,"type":"string"},"resolution_terms":{"additionalProperties":true,"type":"object"},"review_status":{"enum":["reviewed"],"type":"string"},"reviewed_at":{"format":"date_time","type":"string"},"round":{"nullable":true,"type":"string"},"scope_key":{"nullable":true,"type":"string"},"season":{"nullable":true,"type":"string"},"selection_semantics":{"items":{"additionalProperties":false,"properties":{"line":{"format":"double","nullable":true,"type":"number"},"outcome_meaning":{"type":"string"}},"type":"object"},"type":"array"},"session":{"nullable":true,"type":"string"}},"required":["id","review_status","canonical_subject_type","canonical_subject_id","canonical_family_id","actual_scope","outcome_meaning","resolution_terms","selection_semantics","reviewed_at","constituents"],"title":"PredictionNativeMatch","type":"object"},"ScoreboardDetailsV1Other":{"additionalProperties":false,"description":"MMA and other sports with no situational fields. Golf and motorsports are not in this format; they keep the current format.","properties":{"details_version":{"description":"Version of the details format. Always `1` in this format.","enum":[1],"type":"integer"}},"required":["details_version"],"type":"object"},"ScoreboardDetailsV1Hockey":{"additionalProperties":false,"description":"Hockey and ice_hockey. Every key is always present. A key whose value is not known is `null`, never `0`, `false` or an empty value.","properties":{"active_penalties":{"description":"Currently active penalties with details","items":{"additionalProperties":false,"properties":{"duration":{"maximum":1000000000,"minimum":0,"nullable":true,"type":"integer"},"game_misconduct":{"nullable":true,"type":"boolean"},"major_penalty":{"nullable":true,"type":"boolean"},"match_penalty":{"nullable":true,"type":"boolean"},"misconduct":{"nullable":true,"type":"boolean"},"penalty_shot_awarded":{"nullable":true,"type":"boolean"},"penalty_start_time":{"nullable":true,"type":"string"},"penalty_type":{"nullable":true,"type":"string"},"player_name":{"nullable":true,"type":"string"},"time_remaining":{"maximum":1000000000,"minimum":0,"nullable":true,"type":"integer"}},"required":["player_name","penalty_type","duration","time_remaining","major_penalty","misconduct","game_misconduct","match_penalty","penalty_shot_awarded","penalty_start_time"],"type":"object"},"nullable":true,"type":"array"},"active_penalties_count":{"description":"Number of active penalties","maximum":1000000000,"minimum":0,"nullable":true,"type":"integer"},"away_goalie_pulled":{"description":"Away goalie pulled","nullable":true,"type":"boolean"},"away_on_power_play":{"description":"Away team on power play","nullable":true,"type":"boolean"},"away_shootout_goals":{"description":"Away team shootout goals","maximum":1000000000,"minimum":0,"nullable":true,"type":"integer"},"blocked_shots_away":{"description":"Away team blocked shots","maximum":1000000000,"minimum":0,"nullable":true,"type":"integer"},"blocked_shots_home":{"description":"Home team blocked shots","maximum":1000000000,"minimum":0,"nullable":true,"type":"integer"},"clock_running":{"description":"Whether game clock is running","nullable":true,"type":"boolean"},"details_version":{"description":"Version of the details format. Always `1` in this format.","enum":[1],"type":"integer"},"empty_net":{"description":"Empty net situation","nullable":true,"type":"boolean"},"face_off_wins_away":{"description":"Away team faceoff wins","maximum":1000000000,"minimum":0,"nullable":true,"type":"integer"},"face_off_wins_home":{"description":"Home team faceoff wins","maximum":1000000000,"minimum":0,"nullable":true,"type":"integer"},"faceoff_location":{"description":"Location of last faceoff","nullable":true,"type":"string"},"game_clock":{"description":"Current game clock time","nullable":true,"pattern":"^\\d{1,3}:[0-5]\\d(\\.\\d+)?$","type":"string"},"hits_away":{"description":"Away team hits","maximum":1000000000,"minimum":0,"nullable":true,"type":"integer"},"hits_home":{"description":"Home team hits","maximum":1000000000,"minimum":0,"nullable":true,"type":"integer"},"home_goalie_pulled":{"description":"Home goalie pulled","nullable":true,"type":"boolean"},"home_on_power_play":{"description":"Home team on power play","nullable":true,"type":"boolean"},"home_shootout_goals":{"description":"Home team shootout goals","maximum":1000000000,"minimum":0,"nullable":true,"type":"integer"},"in_shootout":{"description":"Currently in shootout","nullable":true,"type":"boolean"},"intermission":{"description":"Between periods/halves","nullable":true,"type":"boolean"},"last_goal_time":{"description":"Time of last goal","nullable":true,"type":"string"},"last_penalty_time":{"description":"Time of last penalty","nullable":true,"type":"string"},"man_advantage":{"description":"Current man advantage (e.g., '5v4', 'even')","nullable":true,"type":"string"},"overtime_type":{"description":"Type of overtime","enum":["3v3","4v4","shootout",null],"nullable":true,"type":"string"},"penalty_kill_percentage":{"description":"Current penalty kill success rate","maximum":1.0e12,"minimum":0,"nullable":true,"type":"number"},"power_play_time_remaining":{"description":"Seconds remaining on power play","maximum":1000000000,"minimum":0,"nullable":true,"type":"integer"},"shootout_attempts":{"description":"Shootout attempts with details","items":{"additionalProperties":false,"properties":{"attempt_time":{"nullable":true,"type":"string"},"goalie_name":{"nullable":true,"type":"string"},"is_deciding_goal":{"nullable":true,"type":"boolean"},"result":{"nullable":true,"type":"string"},"round":{"maximum":1000000000,"minimum":0,"nullable":true,"type":"integer"},"shooter_name":{"nullable":true,"type":"string"},"shot_type":{"nullable":true,"type":"string"}},"required":["round","shooter_name","goalie_name","result","shot_type","attempt_time","is_deciding_goal"],"type":"object"},"nullable":true,"type":"array"},"shootout_attempts_count":{"description":"Total shootout attempts","maximum":1000000000,"minimum":0,"nullable":true,"type":"integer"},"shootout_round":{"description":"Current shootout round","maximum":1000000000,"minimum":0,"nullable":true,"type":"integer"},"shots_on_goal_away":{"description":"Away team shots on goal","maximum":1000000000,"minimum":0,"nullable":true,"type":"integer"},"shots_on_goal_home":{"description":"Home team shots on goal","maximum":1000000000,"minimum":0,"nullable":true,"type":"integer"}},"required":["active_penalties","active_penalties_count","away_goalie_pulled","away_on_power_play","away_shootout_goals","blocked_shots_away","blocked_shots_home","clock_running","details_version","empty_net","face_off_wins_away","face_off_wins_home","faceoff_location","game_clock","hits_away","hits_home","home_goalie_pulled","home_on_power_play","home_shootout_goals","in_shootout","intermission","last_goal_time","last_penalty_time","man_advantage","overtime_type","penalty_kill_percentage","power_play_time_remaining","shootout_attempts","shootout_attempts_count","shootout_round","shots_on_goal_away","shots_on_goal_home"],"type":"object"}},"securitySchemes":{"bearerAuth":{"scheme":"bearer","type":"http"}}},"info":{"title":"Sports Stack","version":"1.0"},"openapi":"3.0.0","paths":{"/api/v1/settlement/events/{id}/results":{"get":{"callbacks":{},"operationId":"ApiRestWeb.Settlement.ResultsController.show","parameters":[{"description":"Event ID (common_model_id)","in":"path","name":"id","required":true,"schema":{"type":"string"}},{"description":"League abbreviation (e.g., 'nba')","in":"query","name":"league","required":true,"schema":{"type":"string"}},{"description":"Response format: 'full' (default, one row per real outcome), 'flat' (legacy collapsed rows), or 'outcomes' (per-outcome confidence grouped by entity/stat)","in":"query","name":"format","required":false,"schema":{"type":"string"}},{"description":"Include alternate lines. Defaults to true for the full response mode, otherwise false unless explicitly enabled.","in":"query","name":"include_alt_lines","required":false,"schema":{"type":"boolean"}},{"description":"Generate computed settlement lines anchored to provider-offered ranges (default: false).","in":"query","name":"computed_lines","required":false,"schema":{"type":"boolean"}},{"description":"Include prediction market probabilities from Polymarket and Kalshi (default: false).","in":"query","name":"include_prediction_markets","required":false,"schema":{"type":"boolean"}},{"description":"Include provider source IDs (fixture and game identifiers) and provider-compatible grader API params per market (default: false).","in":"query","name":"include_source_ids","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"content":{"application/json":{}},"description":"Settlement Results Response"},"400":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"bad_request","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/bad_request","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"invalid_api_key","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/invalid_api_key","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"not_found","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/not_found","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Not Found"},"503":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"service_unavailable","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/service_unavailable","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Service Unavailable"}},"summary":"Get settlement results for an entire event","tags":["Settlement"]}},"/api/v1/self-service/enrich":{"post":{"callbacks":{},"description":"Accepts allowlisted scraper rows, document rows, JSON, or text and returns enriched mapping results. Text/document_rows items without explicit mentions or player_name extract every exact player name (and, when \"team\" is requested, every team name, nickname, or uppercase abbreviation), returning decisive scores, margins, UTF-8 byte spans, and relevance signals that separate an article's subjects from passing mentions. Stable source IDs without a common_model_id create pending identity mappings.","operationId":"ApiRestWeb.SelfServiceController.enrich","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"example":{"dataset":"news","entity_types":["player"],"external_batch_id":"rotobot-mlb-2026-06-27T12:00:00Z","items":[{"context":{"league":"MLB","season_year":2026,"team":{"abbreviation":"LAD","name":"Los Angeles Dodgers"}},"row_id":"article-1","text":"Will Smith homered after Mookie Betts doubled for the Dodgers."}],"mode":"text","source":"mlb.baseball.mlb"},"properties":{"dataset":{"example":"injuries","type":"string"},"declared_min_rows":{"nullable":true,"type":"integer"},"entity_types":{"items":{"type":"string"},"type":"array"},"external_batch_id":{"example":"cbs-nba-2026-06-27T12:00:00Z","type":"string"},"items":{"items":{"description":"An enrichment item. For contextual player resolution, supply player_name and/or text plus an optional context.team hint; the player name is matched even when it is not the first token of text.","properties":{"context":{"nullable":true,"properties":{"league":{"description":"League abbreviation; must match the request source suffix.","nullable":true,"type":"string"},"season_year":{"nullable":true,"type":"integer"},"team":{"description":"Optional team hint for contextual player resolution. Provide common_model_id or source_id (canonical/provider IDs), or a name/abbreviation resolved within the request's source league. May also be supplied as a plain string (\"LAL\", \"Lakers\", or \"Los Angeles Lakers\"), which is matched against abbreviation, name, nickname, and market+nickname. An unqualified team_id is not accepted. A hint that matches no team in the source league is reported per item as resolution.state == \"invalid_context\" with reason \"team_not_found\"; it does not fail the request.","nullable":true,"properties":{"abbreviation":{"nullable":true,"type":"string"},"common_model_id":{"format":"uuid","nullable":true,"type":"string"},"name":{"nullable":true,"type":"string"},"source_id":{"nullable":true,"type":"string"}},"type":"object"}},"type":"object"},"payload":{"type":"object"},"player_name":{"nullable":true,"type":"string"},"row_id":{"nullable":true,"type":"string"},"team":{"description":"Shorthand for context.team. Accepts an abbreviation, nickname, or full name.","example":"LAL","nullable":true,"type":"string"},"text":{"nullable":true,"type":"string"},"title":{"description":"Optional headline. Scored separately for relevance.in_title; it never shifts the byte offsets reported in mentions, which stay anchored to text as submitted.","example":"Dodgers rally behind Will Smith","nullable":true,"type":"string"}},"type":"object"},"type":"array"},"mode":{"enum":["rows","document_rows","json","text"],"type":"string"},"report_timestamp":{"format":"date_time","nullable":true,"type":"string"},"roster_scope":{"description":"Breadth of the player corpus for text/document extraction. \"active_roster\" (default) matches team-sport roster semantics; a player is eligible when any tenant-visible provider feed reports them active. \"league\" additionally admits inactive identities such as prospects, call-ups, and retirees. Individual-sport leagues (UFC, boxing, tennis, golf) have no roster concept and always use the full league corpus. Both scopes remain subject to a 30,000-identity corpus cap, which fails closed with 503 rather than truncating.","enum":["active_roster","league"],"nullable":true,"type":"string"},"row_count":{"nullable":true,"type":"integer"},"source":{"example":"cbs.basketball.nba","type":"string"},"source_url":{"nullable":true,"type":"string"}},"required":["source","dataset","external_batch_id","mode","items"],"type":"object"}}},"description":"Self-service enrichment request","required":false},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"count":{"type":"integer"},"data":{"items":{"description":"The submitted item and all enrichments extracted or resolved from it.","properties":{"enrichments":{"items":{"description":"One enrichment result. Source-ID mappings carry mapping fields (unchanged); a name/text-only player mention additionally carries resolution + candidates.","properties":{"candidates":{"items":{"description":"A ranked suggestion. confidence is a deterministic match score in [0,1], not a calibrated probability. A candidate is advisory and is never an implied tag.","properties":{"common_model_id":{"format":"uuid","type":"string"},"confidence":{"format":"float","nullable":true,"type":"number"},"display_name":{"type":"string"},"entity_type":{"enum":["player","team","event"],"type":"string"},"team":{"nullable":true,"properties":{"abbreviation":{"nullable":true,"type":"string"},"common_model_id":{"format":"uuid","type":"string"},"display_name":{"type":"string"}},"type":"object"}},"type":"object"},"type":"array"},"common_model_id":{"format":"uuid","nullable":true,"type":"string"},"entity":{"nullable":true,"type":"object"},"entity_type":{"enum":["player","team","event"],"type":"string"},"mapping_state":{"description":"Persistent identity-mapping state. \"mapped\"/\"pending\"/\"ignored\" describe a stored mapping row, and \"error\" reports that writing one failed for this mention. Text enrichment persists nothing and reports \"resolved\" when resolution.state is \"resolved\", otherwise \"candidates_only\" — the two fields no longer disagree.","enum":["mapped","pending","ignored","candidates_only","resolved","error"],"type":"string"},"mentions":{"description":"All literal occurrences, with zero-based UTF-8 byte offsets.","items":{"properties":{"end_byte":{"minimum":0,"type":"integer"},"start_byte":{"minimum":0,"type":"integer"},"text":{"type":"string"}},"required":["text","start_byte","end_byte"],"type":"object"},"nullable":true,"type":"array"},"relevance":{"description":"How central the entity is to the document, as opposed to how confidently it was identified. resolution.confidence answers \"is this the right entity?\"; relevance answers \"is the article about it?\". Returned only for text/document extraction.","nullable":true,"properties":{"first_mention_byte":{"minimum":0,"nullable":true,"type":"integer"},"in_lede":{"description":"First mention within the opening 400 bytes.","type":"boolean"},"in_title":{"description":"Whether the entity was matched in the item's title field.","type":"boolean"},"mention_count":{"minimum":0,"type":"integer"},"role":{"description":"primary: a subject of the article. secondary: substantively covered. mention: named in passing. Derived from score alone; a title match is strong evidence but not decisive, so a headline naming two entities does not mark both primary.","enum":["primary","secondary","mention"],"type":"string"},"score":{"description":"Aboutness score in [0,1], read as the fraction of available aboutness evidence the entity holds: document coverage (mention share and standing relative to the average named entity), position, lede, and title.","format":"float","type":"number"},"snippet":{"description":"Text surrounding the first mention.","nullable":true,"type":"string"}},"type":"object"},"resolution":{"description":"Non-persisted contextual resolution outcome. Distinct from mapping_state, which describes persistent identity-mapping state. Consume state == \"resolved\" (decisive == true) as the decision; candidates are advisory suggestions returned in every state.","properties":{"confidence":{"format":"float","nullable":true,"type":"number"},"decisive":{"description":"true only when state == resolved","type":"boolean"},"reason":{"nullable":true,"type":"string"},"runner_up_gap":{"description":"Score gap between the top candidate and the runner-up.","format":"float","nullable":true,"type":"number"},"state":{"enum":["resolved","ambiguous","not_found","invalid_context"],"type":"string"},"strategy":{"nullable":true,"type":"string"}},"type":"object"},"source_id":{"nullable":true,"type":"string"}},"type":"object"},"type":"array"},"index":{"type":"integer"},"item_ref":{"nullable":true,"type":"string"},"payload":{"type":"object"}},"type":"object"},"type":"array"},"dataset":{"type":"string"},"external_batch_id":{"type":"string"},"mode":{"type":"string"},"source":{"type":"string"}},"type":"object"}}},"description":"Self-service enrichment response"},"400":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"bad_request","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/bad_request","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"invalid_api_key","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/invalid_api_key","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"forbidden","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/forbidden","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"not_found","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/not_found","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Not Found"},"409":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"conflict","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/conflict","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Conflict"},"422":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"validation_error","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/validation_error","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Validation Error"},"503":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"service_unavailable","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/service_unavailable","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Service Unavailable"}},"summary":"Enrich scraper output with SportsStack IDs","tags":["Self-Service"]}},"/api/v1/events/{id}/linescore":{"get":{"callbacks":{},"description":"Alias of event-scoreboard that returns the latest event_scoreboard row for an event.","operationId":"ApiRestWeb.EventScoreboardController.linescore","parameters":[{"description":"Event ID (UUID)","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"description":"Live event status with real-time scores, period, and game state information.\n\nContains dynamic/live game data that updates throughout the event. For comprehensive\nsport-specific details and field explanations, see the EventScoreboard model documentation.\n\n## Core Fields\n- **Basic Info**: sport, league, event_id\n- **Game State**: period, time_on_clock, period_half (sport-specific), status\n- **Scoring**: home_score, away_score (for team sports), periods (linescore)\n- **Details**: Sport-specific data in JSONB format\n- **Freshness**: response_received_at — when the provider observed this state\n- **Serving provenance** (additive): observed_at, served_at, source_rank — which provider\n  row was served, its rank in the live primary order, and why it won\n\n## Rendering a live clock\n`time_on_clock` is a point-in-time observation, not a ticking value; we refresh\nit as fast as the provider reports it. To render a smooth clock, tick locally\nfrom `time_on_clock` using `response_received_at` as the anchor and resync on\neach response. For timed sports `details.clock_running` says whether the clock\nshould be advancing — `null` means the provider did not tell us, which is\ndistinct from a known-stopped clock.\n\n## Period Numbering by Sport\n- **Football**: 1-4 (quarters), 5+ (overtime)\n- **Basketball**: 1-4 (quarters), 5+ (overtime)\n- **Baseball**: 1-9+ (innings)\n- **Hockey**: 1-3 (periods), 4+ (overtime)\n- **Golf**: 1-4 (rounds)\n","example":{"away_score":10,"common_model_id":"123e4567-e89b-12d3-a456-426614174000","details":{"away_timeouts":2,"distance":8,"down":2,"home_timeouts":3,"possession_team_id":"123e4567-e89b-12d3-a456-426614174002","red_zone":false,"wall_clock":"2024-01-15T15:32:08Z","yard_line":35},"event_id":"123e4567-e89b-12d3-a456-426614174001","home_score":14,"inserted_at":"2024-01-15T15:30:00Z","league":"NFL","observed_at":"2024-01-15T15:32:09Z","period":2,"response_received_at":"2024-01-15T15:32:10Z","served_at":"2024-01-15T15:32:11Z","source_rank":{"provider":"sportsstack","rank":null,"reason":null},"sport":"football","status":"in_progress","time_on_clock":"14:30","updated_at":"2024-01-15T15:32:15Z"},"properties":{"away_score":{"description":"Away team total score (null for individual sports like golf)","example":10,"type":"integer"},"common_model_id":{"description":"Event Status ID","format":"uuid","type":"string"},"details":{"additionalProperties":true,"description":"Sport-specific game state for a served scoreboard. Two formats exist.\n\n## Current format (what is served today)\n\nThe keys, nesting and value types of `details` depend on the data source that\nprovided the scoreboard row. For one event, `details` can be an object from one\nsource and `null` from another, and a key can be absent, `null` or populated\ndepending on the source. Treat every field as optional. Responses in this format\ndo not contain `details_version`. The property list below describes the keys that\ncan appear; not every source provides every key, and the same key can have a\ndifferent shape for different sources.\n\n## Current format reference\n\n### Dynamic game state\nThe details field contains live, sport-specific information that changes throughout\nthe game. Unlike static event information, this data updates in real-time as the\ngame progresses.\n\n### Sport-specific structures\nEach sport has its own set of relevant game state data:\n\n#### Football (Flattened Fields)\n- **Game State**: down, distance, yard_line, possession_team_id, red_zone, goal_to_go\n- **Clock Management**: play_clock, game_clock, clock_running, two_minute_warning, inside_two_minutes\n- **Timeouts**: home_timeouts, away_timeouts\n- **Weather (Flattened)**: weather_temperature, weather_condition, weather_wind_speed, weather_wind_direction, weather_humidity, weather_precipitation, wind_affecting_kicking, precipitation\n- **Analytics**: field_goal_range, touchdown_probability, turnover_on_downs_risk\n- **Game Info**: attendance, neutral_site, duration\n\n#### Basketball (Flattened Fields)\n- **Clock State**: shot_clock, shot_clock_running, game_clock, clock_running\n- **Fouls & Bonus**: home_team_fouls, away_team_fouls, home_bonus, away_bonus, home_double_bonus, away_double_bonus\n- **Timeouts**: home_timeouts, away_timeouts\n- **Free Throws (Flattened)**: free_throw_shooter_id, free_throw_shooter_name, free_throw_shots_awarded, free_throw_shots_made, free_throw_shots_attempted, free_throw_technical_foul, free_throw_flagrant_foul, free_throw_and_one, free_throw_clear_path_foul, free_throw_bonus_situation, free_throw_current_attempt\n- **Game Flow**: intermission, overtime_number, last_play, last_score_team_id, last_score_time, possession_arrow\n- **Analytics**: pace, lead_changes, times_tied, home_biggest_lead, away_biggest_lead, home_shooting_foul_trouble, away_shooting_foul_trouble\n- **Game Info**: attendance\n\n#### Baseball (Flattened Fields)\n- **Count**: balls, strikes, outs\n- **Hitter (Flattened)**: hitter_id, hitter_full_name, hitter_ab_over, hitter_outcome_id\n- **Pitcher (Flattened)**: pitcher_id, pitcher_full_name, pitcher_pitch_speed, pitcher_pitch_type, pitcher_pitch_x, pitcher_pitch_y, pitcher_pitch_zone\n- **Baserunners**: runners_on_base (array of maps), runners_count\n\n#### Hockey (Flattened Fields)\n- **Power Play**: man_advantage, power_play_time_remaining, home_on_power_play, away_on_power_play, penalty_kill_percentage\n- **Goalies**: home_goalie_pulled, away_goalie_pulled, empty_net, home_goalie_id, away_goalie_id\n- **Clock**: game_clock, clock_running, intermission, overtime_type\n- **Shootout**: in_shootout, shootout_round, home_shootout_goals, away_shootout_goals, shootout_attempts, shootout_attempts_count\n- **Penalties**: active_penalties (array of maps), active_penalties_count\n- **Game Flow**: last_faceoff_winner, faceoff_location, last_goal_time, last_goal_team_id, last_penalty_time\n- **Team Stats**: shots_on_goal_home, shots_on_goal_away, face_off_wins_home, face_off_wins_away, hits_home, hits_away, blocked_shots_home, blocked_shots_away\n\n#### Soccer (Flattened Fields)\n- **State**: match_status (`first_half`, `halftime`, `second_half`, `extra_time_first_half`, `extra_time_second_half`, `penalties`, `ended`; `not_started` and `postponed` also occur in both formats), match_minute (elapsed clock, `\"MM:SS\"`, stoppage time excluded)\n- **Stoppage Time**: added_time_announced, added_time_played (`\"MM:SS\"`)\n- **Cards**: home_yellow_cards, away_yellow_cards, home_red_cards, away_red_cards (red cards include second-yellow dismissals)\n- **Substitutions**: home_substitutions, away_substitutions\n- **Team Stats**: home_possession, away_possession (percent, 0-100), home_shots, away_shots, home_shots_on_target, away_shots_on_target, home_corners, away_corners\n- **Shootout**: shootout (`{home_score, away_score}`), present only once a penalty shootout has been reached\n- **Regulation Score**: regulation_score (`{home_score, away_score}`), the 90-minute score, present only once a match goes past regulation (top-level `home_score`/`away_score` include extra time but not the shootout)\n\n#### Golf (Embedded Objects)\n- **Tournament State**: round_number, total_rounds, holes_completed, current_hole, cut_line, cut_made, playoff_status, playoff_type, tournament_complete\n- **Course Conditions**: par_for_course, course_length, wind_speed, wind_direction, temperature, weather_condition, course_conditions\n- **Field Info**: field_size, players_made_cut, scoring_average\n- **Leaders**: driving_distance_leader, greens_in_regulation_leader, putting_average_leader\n- **Detailed Data**: leaderboard (array), featured_players (array), featured_hole (object)\n\n### Data structure strategy\nMost fields are flattened, with nested objects used where noted.\n\n### Array fields for complex data\nSome complex data structures use arrays of maps:\n- **runners_on_base**: Baseball baserunner positions and details (array of maps)\n- **active_penalties**: Hockey penalty details and timing information (array of maps)\n- **shootout_attempts**: Hockey shootout attempt details (array of maps)\n- **leaderboard**: Golf leaderboard entries (array of embedded objects)\n\n## `details_version` 1 format (selected per account)\n\nAccounts can be switched to a fixed per-sport format that does not depend on the\ndata source. Until an account is switched it receives the current format. A response\nin the new format is recognised by `details_version` = `1`. The exact keys for each\nsport are the component schemas `ScoreboardDetailsV1Football`,\n`ScoreboardDetailsV1Basketball`, `ScoreboardDetailsV1Baseball`,\n`ScoreboardDetailsV1Hockey` (also used for `ice_hockey`), `ScoreboardDetailsV1Soccer`,\n`ScoreboardDetailsV1Tennis` and `ScoreboardDetailsV1Other`.\n\n1. For every sport except golf and motorsports (see 8), `details` is always a JSON object\n   when a scoreboard is returned; it is never `null`.\n2. For football, basketball, baseball, hockey, ice_hockey, soccer and tennis, every key of that\n   sport's schema is present in every response.\n3. A key whose value is not known is `null`. `null` means \"not reported\". It never\n   stands for `0`, `false`, an empty string or an empty list; those values appear only\n   when the source reported them (an empty string is itself returned as `null`). A\n   source that itself reports a default value, for example a zero count before play\n   starts, has that value passed through: the format does not guess which zeros are\n   real. A baseball runner map in which every base is empty is returned as an empty\n   list with a count of `0`.\n4. Each key has one type. Values are taken from the source, with these normalizations:\n   a source's status text is mapped to the `match_status` values; clock text is read\n   into `match_minute` and the added-time keys; baseball runners that a source gives as\n   a map by base are returned as a list and `runners_count` is computed from it; and the\n   shootout and regulation scores are read from period scores where a source reports\n   them that way. A value that cannot be expressed as the key's type is returned as\n   `null`. That includes: a number that is negative (except temperature and pitch\n   location, which may be negative) or above 1e12; a count that is not a whole JSON\n   integer (text such as `\"2\"`, or any number with a decimal point such as `2.9` or\n   `2.0`) or that is above 1,000,000,000; numeric text in a number key; a possession\n   percentage above 100; a score pair with a side that is negative, above 1,000,000,000\n   or not a whole integer; a runner list or map with an entry that has no valid base,\n   repeats a base, or (in map form) holds a value that is neither text nor empty, in which case the\n   runners are `null` together with their count; a game clock that is not `m:ss` text\n   (minutes of one to three digits, seconds 00-59, and an optional fraction on the\n   seconds), and a soccer match minute or added time that is not exactly `m:ss`;\n   text of the form `prefix:type:value`; and an empty or blank string. Runners are\n   returned in base order. In a runner list, a name that is not text, or that has the\n   `prefix:type:value` form, is left out of that runner and the runner is kept. A\n   runner map by base carries player identifiers, so no names are returned from it; a\n   base that holds blank text counts as empty.\n5. Only the keys listed in the sport's schema are returned. For football, basketball,\n   baseball, hockey, ice_hockey and soccer, every key of that sport in the property list\n   below that does not carry a source identifier is in the schema. Tennis has one key,\n   `retirement_info`, which is not in the property list. Not returned in this format:\n   keys that carry a source identifier (player, team and goalie IDs, and similar), and\n   keys of the current format that are not in the property list (for example nested\n   baseball count and runner details, per-period linescores, match situation and\n   referee detail). Switching an account removes them from its responses.\n6. Changing the data source for an event does not change the key set, the types or the\n   meaning of `null`. Values can change.\n7. The format has no keys that carry a source identifier, and text of the form\n   `prefix:type:value` (one to ten ASCII letters, a colon, ASCII letters or underscores, a colon,\n   then text without whitespace; case-insensitive; surrounding whitespace ignored) is\n   `null`. Free text is not inspected beyond that. `possession_team_id` is a UUID in its\n   36-character text form (returned in lower case) or `null`; it is not checked against\n   the team list. Golf and motorsports are served as stored (see 8) and can contain\n   source identifiers.\n8. Golf and motorsports are not shaped by this format: their `details` are the stored\n   object, carry no `details_version`, and can contain source identifiers (an account\n   that holds no provider-data entitlement may have provider-id values removed from them\n   by a separate step). A scoreboard whose sport is not one of the sports named above,\n   including a sport stored as an identifier instead of a name, is treated as any other\n   sport. Sport names are matched ignoring case and surrounding whitespace (any Unicode space). For any other sport\n   (for example MMA) the object is exactly `{\"details_version\": 1}`.\n\n## When no scoreboard is available\n\nThe scoreboard object is absent as a whole; it is not returned with empty `details`:\n\n* `GET /api/v1/events/{id}/event-scoreboard` and `GET /api/v1/events/{id}/linescore`\n  return `404`.\n* `GET /api/v1/events` and `GET /api/v1/events/{id}` omit `event_scoreboard`.\n* `GET /api/v1/tournaments/{id}/bracket` returns `event_scoreboard: null`.\n\nA scoreboard is returned only from data you are entitled to receive. Data you are not\nentitled to is treated as if it did not exist.\n\nThis is different from an unknown value inside a returned scoreboard, which is a\n`null` key in the `details_version` 1 format.\n","example":{"goal_to_go":false,"away_yellow_cards":1,"runners_count":2,"home_timeouts":2,"match_status":"second_half","weather_wind_speed":8.0,"yard_line":25,"hitter_id":"player-123","possession_team_id":"123e4567-e89b-12d3-a456-426614174002","away_timeouts":3,"home_on_power_play":true,"touchdown_probability":0.35,"added_time_played":"00:00","weather_temperature":45.0,"active_penalties_count":1,"away_corners":2,"wind_affecting_kicking":false,"regulation_score":{"away_score":3,"home_score":0},"away_red_cards":1,"runners_on_base":[{"base":1,"ending_base":2,"id":"player-789"},{"base":3,"ending_base":3,"id":"player-012"}],"pitcher_id":"player-456","pitcher_full_name":"Jane Smith","shootout":{"away_score":4,"home_score":3},"home_substitutions":3,"away_substitutions":2,"added_time_announced":"04:00","home_possession":56,"strikes":1,"away_shots":7,"shots_on_goal_home":15,"home_yellow_cards":2,"balls":2,"home_corners":6,"away_possession":44,"home_shots_on_target":5,"details_version":1,"weather_humidity":65,"neutral_site":false,"attendance":72000,"hitter_full_name":"John Doe","outs":2,"distance":7,"play_clock":25,"inside_two_minutes":false,"away_on_power_play":false,"red_zone":true,"game_clock":"8:42","man_advantage":"5v4","power_play_time_remaining":82,"weather_wind_direction":"NW","two_minute_warning":false,"pitcher_pitch_speed":95.5,"home_red_cards":0,"weather_condition":"clear","down":3,"clock_running":true,"match_minute":"67:12","precipitation":false,"home_shots":11,"shots_on_goal_away":12,"away_shots_on_target":3,"turnover_on_downs_risk":0.15,"active_penalties":[{"major_penalty":false,"penalty_type":"Cross-checking","player_id":"player-789","time_remaining":82}],"field_goal_range":true,"weather_precipitation":false},"properties":{"penalty_kill_percentage":{"description":"Current penalty kill success rate","type":"number"},"holes_completed":{"description":"Holes finished in current round","type":"integer"},"course_conditions":{"description":"Course conditions","type":"string"},"home_biggest_lead":{"description":"Biggest home team lead","type":"integer"},"pitcher_pitch_x":{"description":"Pitch location X coordinate","type":"number"},"shootout_attempts_count":{"description":"Total shootout attempts","type":"integer"},"away_shooting_foul_trouble":{"description":"Away team in foul trouble","type":"boolean"},"goal_to_go":{"description":"Goal line is closer than first down marker","type":"boolean"},"away_yellow_cards":{"description":"Soccer away yellow cards","type":"integer"},"shootout_round":{"description":"Current shootout round","type":"integer"},"runners_count":{"description":"Number of runners on base","type":"integer"},"home_timeouts":{"description":"Home team timeouts remaining","type":"integer"},"wall_clock":{"description":"Provider wall-clock timestamp for the most recent game event","format":"date-time","type":"string"},"home_bonus":{"description":"Home team in bonus situation","type":"boolean"},"match_status":{"description":"Soccer match phase","enum":["first_half","halftime","second_half","extra_time_first_half","extra_time_second_half","penalties","ended"],"type":"string"},"last_play":{"description":"Description of last play","type":"string"},"hitter_ab_over":{"description":"At-bat is complete","type":"boolean"},"weather_wind_speed":{"description":"Wind speed (mph)","type":"number"},"home_double_bonus":{"description":"Home team in double bonus","type":"boolean"},"yard_line":{"description":"Field position (0-100)","type":"integer"},"hitter_id":{"description":"Current batter player ID","type":"string"},"times_tied":{"description":"Number of times tied","type":"integer"},"last_goal_time":{"description":"Time of last goal","type":"string"},"home_goalie_pulled":{"description":"Home goalie pulled","type":"boolean"},"lead_changes":{"description":"Number of lead changes","type":"integer"},"tournament_complete":{"description":"Tournament finished","type":"boolean"},"possession_team_id":{"description":"Common-model team ID with possession","format":"uuid","type":"string"},"wind_direction":{"description":"Wind direction","type":"string"},"away_timeouts":{"description":"Away team timeouts remaining","type":"integer"},"free_throw_shots_awarded":{"description":"Number of free throws awarded","type":"integer"},"home_on_power_play":{"description":"Home team on power play","type":"boolean"},"home_team_fouls":{"description":"Home team fouls this period/half","type":"integer"},"touchdown_probability":{"description":"Probability of touchdown (0.0-1.0)","type":"number"},"added_time_played":{"description":"Soccer stoppage time played so far in the current period (MM:SS)","example":"01:26","type":"string"},"weather_temperature":{"description":"Temperature (Fahrenheit)","type":"number"},"duration":{"description":"Game duration","type":"string"},"overtime_type":{"description":"Type of overtime","enum":["3v3","4v4","shootout"],"type":"string"},"course_length":{"description":"Course length in yards","type":"integer"},"shot_clock_running":{"description":"Whether shot clock is running","type":"boolean"},"active_penalties_count":{"description":"Number of active penalties","type":"integer"},"current_hole":{"description":"Hole currently being played","type":"integer"},"away_corners":{"description":"Soccer away corner kicks","type":"integer"},"wind_affecting_kicking":{"description":"Wind affecting field goals/punts","type":"boolean"},"regulation_score":{"description":"Soccer 90-minute score. Present only once a match goes past regulation (extra time).","properties":{"away_score":{"type":"integer"},"home_score":{"type":"integer"}},"type":"object"},"free_throw_clear_path_foul":{"description":"Free throws from clear path foul","type":"boolean"},"hits_home":{"description":"Home team hits","type":"integer"},"shootout_attempts":{"description":"Shootout attempts with details","items":{"properties":{"goalie_id":{"description":"Goalie player ID","type":"string"},"is_deciding_goal":{"description":"Was the deciding goal","type":"boolean"},"result":{"description":"Shot result","type":"string"},"round":{"description":"Shootout round","type":"integer"},"shooter_id":{"description":"Shooter player ID","type":"string"},"shooter_name":{"description":"Shooter name","type":"string"},"shooter_team_id":{"description":"Shooter's team","type":"string"}},"type":"object"},"type":"array"},"playoff_type":{"description":"Type of playoff","enum":["sudden_death","aggregate","match_play"],"type":"string"},"away_red_cards":{"description":"Soccer away red cards (includes second-yellow dismissals)","type":"integer"},"free_throw_current_attempt":{"description":"Current free throw attempt number","type":"integer"},"runners_on_base":{"description":"Baserunners with positions and details","items":{"properties":{"base":{"description":"Starting base (1, 2, 3)","type":"integer"},"ending_base":{"description":"Ending base after play","type":"integer"},"full_name":{"description":"Runner name, when known","type":"string"},"id":{"description":"Player ID","type":"string"}},"type":"object"},"type":"array"},"cut_made":{"description":"Has cut been applied","type":"boolean"},"pitcher_id":{"description":"Current pitcher player ID","type":"string"},"pitcher_full_name":{"description":"Current pitcher name","type":"string"},"shootout":{"description":"Soccer penalty shootout score. Present only once penalties are reached.","properties":{"away_score":{"type":"integer"},"home_score":{"type":"integer"}},"type":"object"},"faceoff_location":{"description":"Location of last faceoff","type":"string"},"home_substitutions":{"description":"Soccer home substitutions made","type":"integer"},"wind_speed":{"description":"Wind speed (mph)","type":"number"},"shot_clock":{"description":"Shot clock seconds remaining","type":"integer"},"away_substitutions":{"description":"Soccer away substitutions made","type":"integer"},"pitcher_pitch_zone":{"description":"Strike zone location","type":"integer"},"added_time_announced":{"description":"Soccer stoppage time announced by the fourth official (MM:SS)","example":"02:00","type":"string"},"free_throw_technical_foul":{"description":"Free throws from technical foul","type":"boolean"},"home_possession":{"description":"Soccer home ball possession percentage","maximum":100,"minimum":0,"type":"number"},"putting_average_leader":{"description":"Putting average leader player ID","type":"string"},"home_shooting_foul_trouble":{"description":"Home team in foul trouble","type":"boolean"},"strikes":{"description":"Strike count (0-2)","type":"integer"},"greens_in_regulation_leader":{"description":"GIR leader player ID","type":"string"},"away_biggest_lead":{"description":"Biggest away team lead","type":"integer"},"face_off_wins_away":{"description":"Away team faceoff wins","type":"integer"},"last_goal_team_id":{"description":"Team that scored last goal","type":"string"},"away_double_bonus":{"description":"Away team in double bonus","type":"boolean"},"away_shots":{"description":"Soccer away total shots","type":"integer"},"temperature":{"description":"Temperature (Fahrenheit)","type":"integer"},"last_penalty_time":{"description":"Time of last penalty","type":"string"},"last_score_team_id":{"description":"Team that scored last","type":"string"},"free_throw_and_one":{"description":"And-one free throw situation","type":"boolean"},"shots_on_goal_home":{"description":"Home team shots on goal","type":"integer"},"home_yellow_cards":{"description":"Soccer home yellow cards","type":"integer"},"free_throw_flagrant_foul":{"description":"Free throws from flagrant foul","type":"boolean"},"in_shootout":{"description":"Currently in shootout","type":"boolean"},"playoff_status":{"description":"Tournament in playoff","type":"boolean"},"away_goalie_id":{"description":"Current away goalie player ID","type":"string"},"balls":{"description":"Ball count (0-3)","type":"integer"},"home_corners":{"description":"Soccer home corner kicks","type":"integer"},"home_shootout_goals":{"description":"Home team shootout goals","type":"integer"},"pitcher_pitch_type":{"description":"Last pitch type","type":"string"},"away_possession":{"description":"Soccer away ball possession percentage","maximum":100,"minimum":0,"type":"number"},"scoring_average":{"description":"Current round scoring average","type":"number"},"empty_net":{"description":"Empty net situation","type":"boolean"},"home_shots_on_target":{"description":"Soccer home shots on target","type":"integer"},"away_bonus":{"description":"Away team in bonus situation","type":"boolean"},"details_version":{"description":"Version of the details contract. Present and `1` in the contract format; absent in legacy provider-shaped objects.","example":1,"type":"integer"},"weather_humidity":{"description":"Humidity percentage","type":"integer"},"neutral_site":{"description":"Neutral site game","type":"boolean"},"free_throw_shots_made":{"description":"Free throws made so far","type":"integer"},"attendance":{"description":"Game attendance","type":"integer"},"total_rounds":{"description":"Total tournament rounds","type":"integer"},"hitter_full_name":{"description":"Current batter name","type":"string"},"pace":{"description":"Possessions per 48 minutes","type":"number"},"outs":{"description":"Outs in inning (0-2)","type":"integer"},"round_number":{"description":"Current round (1-4+)","type":"integer"},"free_throw_shooter_name":{"description":"Name of free throw shooter","type":"string"},"cut_line":{"description":"Score needed to make cut","type":"integer"},"distance":{"description":"Yards to go for first down","type":"integer"},"free_throw_shooter_id":{"description":"Player ID shooting free throws","type":"string"},"field_size":{"description":"Total number of players","type":"integer"},"play_clock":{"description":"Seconds on play clock","type":"integer"},"hits_away":{"description":"Away team hits","type":"integer"},"inside_two_minutes":{"description":"Less than two minutes remaining","type":"boolean"},"driving_distance_leader":{"description":"Driving distance leader player ID","type":"string"},"home_goalie_id":{"description":"Current home goalie player ID","type":"string"},"intermission":{"description":"Between periods/halves","type":"boolean"},"hitter_outcome_id":{"description":"At-bat outcome identifier","type":"string"},"blocked_shots_away":{"description":"Away team blocked shots","type":"integer"},"away_on_power_play":{"description":"Away team on power play","type":"boolean"},"last_faceoff_winner":{"description":"Team that won last faceoff","enum":["home","away"],"type":"string"},"red_zone":{"description":"In red zone (20 yards or less)","type":"boolean"},"game_clock":{"description":"Current game clock time","type":"string"},"man_advantage":{"description":"Current man advantage (e.g., '5v4', 'even')","type":"string"},"blocked_shots_home":{"description":"Home team blocked shots","type":"integer"},"away_goalie_pulled":{"description":"Away goalie pulled","type":"boolean"},"power_play_time_remaining":{"description":"Seconds remaining on power play","type":"integer"},"weather_wind_direction":{"description":"Wind direction","type":"string"},"players_made_cut":{"description":"Players making the cut","type":"integer"},"par_for_course":{"description":"Course par","type":"integer"},"two_minute_warning":{"description":"Two minute warning called","type":"boolean"},"pitcher_pitch_speed":{"description":"Last pitch speed (mph)","type":"number"},"possession_arrow":{"description":"Possession arrow (college)","enum":["home","away"],"type":"string"},"away_shootout_goals":{"description":"Away team shootout goals","type":"integer"},"free_throw_shots_attempted":{"description":"Free throws attempted so far","type":"integer"},"home_red_cards":{"description":"Soccer home red cards (includes second-yellow dismissals)","type":"integer"},"weather_condition":{"description":"Weather condition","type":"string"},"away_team_fouls":{"description":"Away team fouls this period/half","type":"integer"},"pitcher_pitch_y":{"description":"Pitch location Y coordinate","type":"number"},"down":{"description":"Current down (1-4)","type":"integer"},"last_score_time":{"description":"When last score occurred","type":"string"},"clock_running":{"description":"Whether game clock is running","type":"boolean"},"overtime_number":{"description":"Which overtime period","type":"integer"},"match_minute":{"description":"Soccer elapsed match clock as MM:SS (stoppage time excluded). Tick locally between updates.","example":"45:00","type":"string"},"precipitation":{"description":"Active precipitation","type":"boolean"},"home_shots":{"description":"Soccer home total shots","type":"integer"},"shots_on_goal_away":{"description":"Away team shots on goal","type":"integer"},"away_shots_on_target":{"description":"Soccer away shots on target","type":"integer"},"turnover_on_downs_risk":{"description":"Probability of turnover on downs (0.0-1.0)","type":"number"},"active_penalties":{"description":"Currently active penalties with details","items":{"properties":{"duration":{"description":"Penalty duration in minutes","type":"integer"},"major_penalty":{"description":"Is major penalty","type":"boolean"},"misconduct":{"description":"Is misconduct penalty","type":"boolean"},"penalty_start_time":{"description":"When penalty started","type":"string"},"penalty_type":{"description":"Type of penalty","type":"string"},"player_id":{"description":"Penalized player ID","type":"string"},"player_name":{"description":"Penalized player name","type":"string"},"team_id":{"description":"Team of penalized player","type":"string"},"time_remaining":{"description":"Time remaining in seconds","type":"integer"}},"type":"object"},"type":"array"},"field_goal_range":{"description":"Within field goal range","type":"boolean"},"free_throw_bonus_situation":{"description":"Free throws from bonus","type":"boolean"},"weather_precipitation":{"description":"Is it precipitating","type":"boolean"},"face_off_wins_home":{"description":"Home team faceoff wins","type":"integer"}},"type":"object"},"event_id":{"description":"Event ID","format":"uuid","type":"string"},"home_score":{"description":"Home team total score (null for individual sports like golf)","example":14,"type":"integer"},"inserted_at":{"description":"Creation timestamp","format":"date-time","type":"string"},"league":{"description":"League abbreviation","example":"NFL","type":"string"},"observed_at":{"description":"Provider observation time of the served row (the elected row's own observation; unlike response_received_at it is never taken from a clock donor). Null when unknown.","example":"2024-01-15T15:32:09Z","format":"date-time","nullable":true,"type":"string"},"period":{"description":"Current period/quarter/inning (1-based, sport-specific numbering)","example":2,"type":"integer"},"period_half":{"description":"Period subdivision (e.g., 'top'/'bottom' for baseball innings)","enum":["top","bottom"],"example":"bottom","type":"string"},"period_half_over":{"description":"Whether the current period half is complete","type":"boolean"},"periods":{"description":"Per-period linescore, in period order. This is what `/v1/events/{id}/linescore` returns.","example":[{"away_score":3,"home_score":7,"number":1,"type":"regular_period"}],"items":{"additionalProperties":true,"type":"object"},"type":"array"},"response_received_at":{"description":"When we received this state from the upstream provider. This is the observation time, and it is the field to use to judge freshness or to interpolate a running clock — `updated_at` is a storage timestamp and moves even when the observation did not.","example":"2024-01-15T15:32:10Z","format":"date-time","type":"string"},"served_at":{"description":"When this response was assembled (UTC, whole seconds).","example":"2024-01-15T15:32:11Z","format":"date-time","nullable":true,"type":"string"},"source_rank":{"description":"Which provider's row was served and why it was chosen. `provider` is the provider family (`sportsstack` for a canonical row, whose backing vendor is not disclosed); `rank` is its position in the league's live primary order (0 = primary, null = outside the order or canonical); `reason` is `primary` (highest-ranked provider present), `fallback_stale` (a higher-ranked provider's row was older than the stale window), `single_provider` (only one provider reported), `freshest` (a fresher lower-ranked row was served), or null when the election's candidates are not visible to the tenant.","nullable":true,"properties":{"provider":{"example":"sportsstack","type":"string"},"rank":{"example":0,"nullable":true,"type":"integer"},"reason":{"enum":["primary","fallback_stale","single_provider","freshest"],"nullable":true,"type":"string"}},"type":"object"},"sport":{"description":"Sport name","enum":["football","basketball","baseball","hockey","ice_hockey","soccer","golf"],"example":"football","type":"string"},"status":{"description":"Lifecycle state of the event as reported by the provider (e.g. 'live', 'in_progress', 'halftime', 'closed', 'final'). Values are provider vocabulary and are not normalized across providers — use this to tell a live scoreboard from a finished one, not for settlement decisions.","example":"in_progress","type":"string"},"time_on_clock":{"description":"Time remaining in period - format varies by sport (MM:SS for timed sports, null for baseball/golf)","example":"14:30","type":"string"},"updated_at":{"description":"Last update timestamp","format":"date-time","type":"string"}},"required":["common_model_id","event_id","sport","league"],"title":"EventStatus","type":"object"}}},"description":"EventScoreboard Response"},"401":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"invalid_api_key","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/invalid_api_key","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"not_found","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/not_found","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Not Found"}},"summary":"Get Event Linescore","tags":["Events"]}},"/api/v1/settlement/events/{id}/gradeable-props":{"get":{"callbacks":{},"operationId":"ApiRestWeb.Settlement.GradeablePropsController.show","parameters":[{"description":"Event ID (common_model_id)","in":"path","name":"id","required":true,"schema":{"type":"string"}},{"description":"League abbreviation (e.g., 'nba')","in":"query","name":"league","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{}},"description":"Gradeable Props Response"},"401":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"invalid_api_key","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/invalid_api_key","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Unauthorized"}},"summary":"List gradeable stat types and entities for an event","tags":["Settlement"]}},"/api/v1/standings":{"get":{"callbacks":{},"operationId":"ApiRestWeb.StandingsController.index","parameters":[{"description":"Filter by league ID — accepts a UUID or league abbreviation (e.g., 'NFL', 'NBA'). See GET /api/v1/leagues for all leagues.","in":"query","name":"league_id","required":true,"schema":{"example":"NFL","type":"string"}},{"description":"Compatibility alias for team standings (`for_entity_type=team`, `for_entity_id=<team_id>`)","example":"01c7133f-2999-4803-9872-8c2ab1ba63ac","in":"query","name":"team_id","required":false,"schema":{"type":"string"}},{"description":"Filter by entity type (`team` or `player`)","in":"query","name":"for_entity_type","required":false,"schema":{"enum":["team","player"],"example":"team","type":"string"}},{"description":"Filter by target entity ID (team or player)","example":"01c7133f-2999-4803-9872-8c2ab1ba63ac","in":"query","name":"for_entity_id","required":false,"schema":{"type":"string"}},{"description":"Filter by season year","in":"query","name":"season_year","required":false,"schema":{"example":2024,"type":"integer"}},{"description":"Filter by season type (PRE, REG, PST, etc.)","in":"query","name":"season_type","required":false,"schema":{"example":"REG","type":"string"}},{"description":"Filter by source provider (e.g., 'provider.football.nfl')","in":"query","name":"source","required":false,"schema":{"type":"string"}},{"description":"Filter by primary organizational group (e.g., 'NFC East', 'Group A'). Works across all sports.","example":"NFC East","in":"query","name":"primary_group","required":false,"schema":{"type":"string"}},{"description":"Filter by primary group type: 'division', 'group', 'conference', 'region', 'pool'","in":"query","name":"primary_group_type","required":false,"schema":{"enum":["division","group","conference","region","pool"],"example":"division","type":"string"}},{"description":"Filter by secondary/parent group (e.g., 'NFC', 'Eastern Conference')","example":"NFC","in":"query","name":"secondary_group","required":false,"schema":{"type":"string"}},{"description":"Page number for page/per_page pagination. Do not combine with limit/offset.","in":"query","name":"page","required":false,"schema":{"default":1,"minimum":1,"type":"integer"}},{"description":"Number of items per page (max 1000). Do not combine with limit/offset.","in":"query","name":"per_page","required":false,"schema":{"default":100,"maximum":1000,"minimum":1,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"description":"Historical standings or rankings snapshot for a specific tenant, entity, season, and season type.\n\nRecords nightly provider imports so you can query past ranks,\ngames-back deltas, and splits while the most recent regular-season snapshot is surfaced\non `Team.metadata`.\n","example":{"for_entity_id":"01c7133f-2999-4803-9872-8c2ab1ba63ac","for_entity_type":"team","league_id":"32fa944f-b1bd-41b4-bec2-7ab269fde6fc","metadata":{"conference_name":"NFC","division_name":"NFC East"},"primary_group":"NFC East","primary_group_type":"division","ranking_overall":3,"ranking_primary_context":"division","ranking_primary_value":1,"record_losses":2,"record_ties":0,"record_wins":11,"season_type":"REG","season_year":2024,"secondary_group":"NFC","secondary_group_type":"conference","source_for_entity_id":"competitor_4422","table_type":"standings","team_id":"01c7133f-2999-4803-9872-8c2ab1ba63ac"},"properties":{"status_streak_type":{"description":"Identifier for the current streak (WIN, LOSS, TIE)","type":"string"},"split_away_ties":{"description":"Away ties","type":"integer"},"scoring_against":{"description":"Total scoring against","type":"integer"},"ranking_points":{"description":"Table points (soccer/rugby/etc.)","type":"integer"},"secondary_group_type":{"description":"Type of secondary grouping.\nValues: conference, league, null\n","enum":["conference","league"],"nullable":true,"type":"string"},"split_division_losses":{"description":"Division losses","type":"integer"},"scoring_unit":{"description":"Unit for scoring metrics (points, runs, goals, etc.)","type":"string"},"source_for_entity_id":{"description":"Provider source identifier for the ranked/standing entity.","nullable":true,"type":"string"},"record_games_played":{"description":"Total games played","type":"integer"},"ranking_overall":{"description":"Overall/league rank","type":"integer"},"ranking_primary_value":{"type":"integer"},"split_last10_ties":{"description":"Ties over last 10","type":"integer"},"ranking_group":{"description":"Group/Pool rank","type":"integer"},"split_away_wins":{"description":"Away wins","type":"integer"},"split_home_ties":{"description":"Home ties","type":"integer"},"split_last10_wins":{"description":"Wins over last 10","type":"integer"},"season_type":{"description":"Season segment (PRE, REG, PST, etc.)","type":"string"},"record_losses":{"description":"Total losses","type":"integer"},"record_ties":{"description":"Total ties","type":"integer"},"record_games_back":{"description":"Games behind the division leader","format":"float","type":"number"},"status_streak_text":{"description":"Human-readable streak text","type":"string"},"record_win_pct":{"description":"Win percentage","format":"float","type":"number"},"league_id":{"description":"League this snapshot belongs to","type":"string"},"ranking_secondary_value":{"type":"integer"},"split_division_wins":{"description":"Division wins","type":"integer"},"for_entity_id":{"description":"Common Model ID of the team or player represented by this row.","type":"string"},"id":{"description":"Standings record identifier","type":"string"},"split_home_losses":{"description":"Home losses","type":"integer"},"record_wildcard_back":{"description":"Games behind the wildcard leader","format":"float","type":"number"},"split_conference_wins":{"description":"Conference wins","type":"integer"},"tenant_id":{"description":"Tenant that owns this standings snapshot","type":"string"},"primary_group":{"description":"Most granular organizational grouping name. Works across all sports.\nExamples: \"NFC East\" (NFL), \"Group E\" (World Cup), \"Atlantic\" (NBA).\n","nullable":true,"type":"string"},"split_last10_losses":{"description":"Losses over last 10","type":"integer"},"status_clinched":{"description":"Clinched qualifier (division, wildcard, playoff, etc.)","type":"string"},"ranking_primary_context":{"description":"Context for the primary rank value (division, conference, etc.)","type":"string"},"record_wins":{"description":"Total wins","type":"integer"},"scoring_diff":{"description":"Scoring differential","type":"integer"},"for_entity_type":{"description":"Entity type represented by this row.","enum":["team","player"],"type":"string"},"split_conference_losses":{"description":"Conference losses","type":"integer"},"ranking_secondary_context":{"description":"Context for the secondary rank value","type":"string"},"season_id":{"description":"Season Common Model ID","type":"string"},"split_home_wins":{"description":"Home wins","type":"integer"},"season_year":{"description":"Season year","type":"integer"},"ranking_wildcard":{"description":"Wildcard rank","type":"integer"},"split_conference_ties":{"description":"Conference ties","type":"integer"},"status_elimination_number":{"description":"Elimination number for the current race","type":"integer"},"team_id":{"description":"Legacy compatibility field. Mirrors `for_entity_id` when `for_entity_type=team`.","nullable":true,"type":"string"},"split_away_losses":{"description":"Away losses","type":"integer"},"secondary_group":{"description":"Parent/higher-level organizational grouping if exists.\nExamples: \"NFC\" (NFL), \"Eastern Conference\" (NBA), null (World Cup).\n","nullable":true,"type":"string"},"status_streak_length":{"description":"Length of the streak","type":"integer"},"scoring_for":{"description":"Total scoring for","type":"integer"},"standings_date":{"description":"Date/time for when the standings payload was generated","format":"date-time","type":"string"},"metadata":{"additionalProperties":true,"description":"Provider payload fragments plus sport-specific splits/rankings.\n\nNote: Universal organizational hierarchy is now available as top-level fields\n(`primary_group`, `primary_group_type`, `secondary_group`, `secondary_group_type`).\n\n## Sport-Specific Fields (Legacy/Backward Compatibility)\n\n- `division_name` (string): Division name (NFL, NBA, MLB)\n- `conference_name` (string): Conference name (NFL, NBA)\n- `group_name` (string): Group name (World Cup, Champions League)\n\n## Additional Metadata\n\n- `rankings` - Additional ranking breakdowns\n- `split` - Game split details (home/away/division/conference)\n- `scoring_secondary` - Secondary scoring metrics\n- `advanced_metrics` - Provider-specific advanced stats\n","type":"object"},"table_type":{"description":"Distinguishes standings tables from rankings tables.","enum":["standings","ranking"],"type":"string"},"primary_group_type":{"description":"Type of primary grouping. Use this to determine UI labels.\nValues: division, group, conference, region, pool\n","enum":["division","group","conference","region","pool"],"nullable":true,"type":"string"},"split_division_ties":{"description":"Division ties","type":"integer"}},"required":["for_entity_type","for_entity_id","table_type","season_id","season_year","season_type"],"title":"Standings","type":"object"}}},"description":"Standings Response"},"401":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"invalid_api_key","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/invalid_api_key","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"not_found","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/not_found","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Not Found"}},"summary":"List Standings","tags":["Stats & Data"]}},"/api/v1/tournaments/{id}/bracket":{"get":{"callbacks":{},"description":"Returns the complete bracket structure for a tournament.\n\nThis endpoint provides the full tournament bracket including:\n- **Tournament Metadata**: Name, type, status, dates, league\n- **Groups**: Group stage divisions with standings (for group_knockout tournaments)\n- **Rounds**: Bracket rounds with matchups, scores, and advancement status\n- **Events**: Related event entities (optional, when include_events=true)\n\n## Bracket Data Sources\n\nThe bracket can be built from two sources:\n1. **Tournament Entity**: Uses `tournament.rounds` field if populated with complete data\n2. **Events**: Reconstructs bracket from events with `tournament_id` and `tournament_round`\n\nThe endpoint automatically uses whichever source provides the most complete bracket structure.\n\n## Bracket Types\n\n### Single Elimination (March Madness, CFP)\n- Rounds progress: First Round → Second Round → Sweet 16 → Elite 8 → Final Four → Championship\n- Each matchup is a single game\n- Winner advances, loser eliminated\n\n### Best-of-Series (NBA, NHL, MLB, NFL Playoffs)\n- Rounds represent playoff series (First Round, Conference Semifinals, etc.)\n- Each matchup is a best-of-N series (best of 7, best of 5)\n- Series score tracked in `series_score` field\n- Individual games tracked as separate events\n\n### Group + Knockout (World Cup, UEFA Champions League)\n- **Groups**: Round-robin play with standings\n- **Rounds**: Knockout stage after group play (Round of 16, Quarterfinals, etc.)\n- Top teams from groups advance to knockout rounds\n\n## Matchup Information\n\nEach matchup includes:\n- Team information (name, abbreviation, seed)\n- Scores (home_score, away_score for games, series_score for series)\n- Winner designation (home/away)\n- Status (scheduled, in_progress, completed, pending)\n- Event linking (event_id when game events are created)\n","operationId":"ApiRestWeb.TournamentController.bracket","parameters":[{"description":"Tournament ID (common_model_id UUID)","in":"path","name":"id","required":true,"schema":{"example":"01c7133f-2999-4803-9872-8c2ab1ba63ac","format":"uuid","type":"string"}},{"description":"Include related event entities in response. Events provide detailed game information including participants, statistics, and live scoreboard data.","in":"query","name":"include_events","required":false,"schema":{"example":true,"type":"boolean"}}],"responses":{"200":{"content":{"application/json":{"schema":{"description":"Complete tournament bracket structure returned by GET /api/v1/tournaments/:id/bracket.\n\nThis response provides the full tournament structure including metadata, groups (if applicable),\nrounds with matchups, and optionally related events. The bracket can be built from either\nthe tournament's rounds field or reconstructed from events.\n\n## Response Structure\n\n- **tournament**: Core tournament metadata\n- **groups**: Group stage divisions (for group_knockout tournaments)\n- **rounds**: Bracket rounds with matchups (for all bracket types)\n- **events**: Related event entities (if include_events=true)\n- **metadata**: Summary statistics about the bracket\n\n## Building Bracket from Events\n\nIf tournament.rounds is empty or incomplete, the bracket can be reconstructed from events:\n- Events are grouped by `tournament_round` field\n- Matchups built from event participants and scores\n- Rounds created from grouped events\n\nThis dual-source approach ensures brackets display correctly whether data comes from:\n- Tournament Summary (initial bracket with seeds)\n- Tournament Schedule (actual games)\n- Events (reconstructed from event entities)\n","example":{"events":null,"groups":[],"metadata":{"bracket_type_display":"Single Elimination","total_events":0,"total_groups":0,"total_rounds":6},"rounds":[],"tournament":{"bracket_type":"single_elimination","common_model_id":"01c7133f-2999-4803-9872-8c2ab1ba63ac","end_date":"2025-04-08","league_id":"31c65553-2f05-4ef7-993c-9e91c583afc8","name":"2025 NCAA Tournament","season_year":2025,"start_date":"2025-03-20","status":"in_progress","tournament_type":"championship"}},"properties":{"events":{"description":"Related event entities (included when include_events=true)","items":{"properties":{"common_model_id":{"format":"uuid","type":"string"},"event_scoreboard":{"description":"Live event status with real-time scores, period, and game state information.\n\nContains dynamic/live game data that updates throughout the event. For comprehensive\nsport-specific details and field explanations, see the EventScoreboard model documentation.\n\n## Core Fields\n- **Basic Info**: sport, league, event_id\n- **Game State**: period, time_on_clock, period_half (sport-specific), status\n- **Scoring**: home_score, away_score (for team sports), periods (linescore)\n- **Details**: Sport-specific data in JSONB format\n- **Freshness**: response_received_at — when the provider observed this state\n- **Serving provenance** (additive): observed_at, served_at, source_rank — which provider\n  row was served, its rank in the live primary order, and why it won\n\n## Rendering a live clock\n`time_on_clock` is a point-in-time observation, not a ticking value; we refresh\nit as fast as the provider reports it. To render a smooth clock, tick locally\nfrom `time_on_clock` using `response_received_at` as the anchor and resync on\neach response. For timed sports `details.clock_running` says whether the clock\nshould be advancing — `null` means the provider did not tell us, which is\ndistinct from a known-stopped clock.\n\n## Period Numbering by Sport\n- **Football**: 1-4 (quarters), 5+ (overtime)\n- **Basketball**: 1-4 (quarters), 5+ (overtime)\n- **Baseball**: 1-9+ (innings)\n- **Hockey**: 1-3 (periods), 4+ (overtime)\n- **Golf**: 1-4 (rounds)\n","example":{"away_score":10,"common_model_id":"123e4567-e89b-12d3-a456-426614174000","details":{"away_timeouts":2,"distance":8,"down":2,"home_timeouts":3,"possession_team_id":"123e4567-e89b-12d3-a456-426614174002","red_zone":false,"wall_clock":"2024-01-15T15:32:08Z","yard_line":35},"event_id":"123e4567-e89b-12d3-a456-426614174001","home_score":14,"inserted_at":"2024-01-15T15:30:00Z","league":"NFL","observed_at":"2024-01-15T15:32:09Z","period":2,"response_received_at":"2024-01-15T15:32:10Z","served_at":"2024-01-15T15:32:11Z","source_rank":{"provider":"sportsstack","rank":null,"reason":null},"sport":"football","status":"in_progress","time_on_clock":"14:30","updated_at":"2024-01-15T15:32:15Z"},"properties":{"away_score":{"description":"Away team total score (null for individual sports like golf)","example":10,"type":"integer"},"common_model_id":{"description":"Event Status ID","format":"uuid","type":"string"},"details":{"additionalProperties":true,"description":"Sport-specific game state for a served scoreboard. Two formats exist.\n\n## Current format (what is served today)\n\nThe keys, nesting and value types of `details` depend on the data source that\nprovided the scoreboard row. For one event, `details` can be an object from one\nsource and `null` from another, and a key can be absent, `null` or populated\ndepending on the source. Treat every field as optional. Responses in this format\ndo not contain `details_version`. The property list below describes the keys that\ncan appear; not every source provides every key, and the same key can have a\ndifferent shape for different sources.\n\n## Current format reference\n\n### Dynamic game state\nThe details field contains live, sport-specific information that changes throughout\nthe game. Unlike static event information, this data updates in real-time as the\ngame progresses.\n\n### Sport-specific structures\nEach sport has its own set of relevant game state data:\n\n#### Football (Flattened Fields)\n- **Game State**: down, distance, yard_line, possession_team_id, red_zone, goal_to_go\n- **Clock Management**: play_clock, game_clock, clock_running, two_minute_warning, inside_two_minutes\n- **Timeouts**: home_timeouts, away_timeouts\n- **Weather (Flattened)**: weather_temperature, weather_condition, weather_wind_speed, weather_wind_direction, weather_humidity, weather_precipitation, wind_affecting_kicking, precipitation\n- **Analytics**: field_goal_range, touchdown_probability, turnover_on_downs_risk\n- **Game Info**: attendance, neutral_site, duration\n\n#### Basketball (Flattened Fields)\n- **Clock State**: shot_clock, shot_clock_running, game_clock, clock_running\n- **Fouls & Bonus**: home_team_fouls, away_team_fouls, home_bonus, away_bonus, home_double_bonus, away_double_bonus\n- **Timeouts**: home_timeouts, away_timeouts\n- **Free Throws (Flattened)**: free_throw_shooter_id, free_throw_shooter_name, free_throw_shots_awarded, free_throw_shots_made, free_throw_shots_attempted, free_throw_technical_foul, free_throw_flagrant_foul, free_throw_and_one, free_throw_clear_path_foul, free_throw_bonus_situation, free_throw_current_attempt\n- **Game Flow**: intermission, overtime_number, last_play, last_score_team_id, last_score_time, possession_arrow\n- **Analytics**: pace, lead_changes, times_tied, home_biggest_lead, away_biggest_lead, home_shooting_foul_trouble, away_shooting_foul_trouble\n- **Game Info**: attendance\n\n#### Baseball (Flattened Fields)\n- **Count**: balls, strikes, outs\n- **Hitter (Flattened)**: hitter_id, hitter_full_name, hitter_ab_over, hitter_outcome_id\n- **Pitcher (Flattened)**: pitcher_id, pitcher_full_name, pitcher_pitch_speed, pitcher_pitch_type, pitcher_pitch_x, pitcher_pitch_y, pitcher_pitch_zone\n- **Baserunners**: runners_on_base (array of maps), runners_count\n\n#### Hockey (Flattened Fields)\n- **Power Play**: man_advantage, power_play_time_remaining, home_on_power_play, away_on_power_play, penalty_kill_percentage\n- **Goalies**: home_goalie_pulled, away_goalie_pulled, empty_net, home_goalie_id, away_goalie_id\n- **Clock**: game_clock, clock_running, intermission, overtime_type\n- **Shootout**: in_shootout, shootout_round, home_shootout_goals, away_shootout_goals, shootout_attempts, shootout_attempts_count\n- **Penalties**: active_penalties (array of maps), active_penalties_count\n- **Game Flow**: last_faceoff_winner, faceoff_location, last_goal_time, last_goal_team_id, last_penalty_time\n- **Team Stats**: shots_on_goal_home, shots_on_goal_away, face_off_wins_home, face_off_wins_away, hits_home, hits_away, blocked_shots_home, blocked_shots_away\n\n#### Soccer (Flattened Fields)\n- **State**: match_status (`first_half`, `halftime`, `second_half`, `extra_time_first_half`, `extra_time_second_half`, `penalties`, `ended`; `not_started` and `postponed` also occur in both formats), match_minute (elapsed clock, `\"MM:SS\"`, stoppage time excluded)\n- **Stoppage Time**: added_time_announced, added_time_played (`\"MM:SS\"`)\n- **Cards**: home_yellow_cards, away_yellow_cards, home_red_cards, away_red_cards (red cards include second-yellow dismissals)\n- **Substitutions**: home_substitutions, away_substitutions\n- **Team Stats**: home_possession, away_possession (percent, 0-100), home_shots, away_shots, home_shots_on_target, away_shots_on_target, home_corners, away_corners\n- **Shootout**: shootout (`{home_score, away_score}`), present only once a penalty shootout has been reached\n- **Regulation Score**: regulation_score (`{home_score, away_score}`), the 90-minute score, present only once a match goes past regulation (top-level `home_score`/`away_score` include extra time but not the shootout)\n\n#### Golf (Embedded Objects)\n- **Tournament State**: round_number, total_rounds, holes_completed, current_hole, cut_line, cut_made, playoff_status, playoff_type, tournament_complete\n- **Course Conditions**: par_for_course, course_length, wind_speed, wind_direction, temperature, weather_condition, course_conditions\n- **Field Info**: field_size, players_made_cut, scoring_average\n- **Leaders**: driving_distance_leader, greens_in_regulation_leader, putting_average_leader\n- **Detailed Data**: leaderboard (array), featured_players (array), featured_hole (object)\n\n### Data structure strategy\nMost fields are flattened, with nested objects used where noted.\n\n### Array fields for complex data\nSome complex data structures use arrays of maps:\n- **runners_on_base**: Baseball baserunner positions and details (array of maps)\n- **active_penalties**: Hockey penalty details and timing information (array of maps)\n- **shootout_attempts**: Hockey shootout attempt details (array of maps)\n- **leaderboard**: Golf leaderboard entries (array of embedded objects)\n\n## `details_version` 1 format (selected per account)\n\nAccounts can be switched to a fixed per-sport format that does not depend on the\ndata source. Until an account is switched it receives the current format. A response\nin the new format is recognised by `details_version` = `1`. The exact keys for each\nsport are the component schemas `ScoreboardDetailsV1Football`,\n`ScoreboardDetailsV1Basketball`, `ScoreboardDetailsV1Baseball`,\n`ScoreboardDetailsV1Hockey` (also used for `ice_hockey`), `ScoreboardDetailsV1Soccer`,\n`ScoreboardDetailsV1Tennis` and `ScoreboardDetailsV1Other`.\n\n1. For every sport except golf and motorsports (see 8), `details` is always a JSON object\n   when a scoreboard is returned; it is never `null`.\n2. For football, basketball, baseball, hockey, ice_hockey, soccer and tennis, every key of that\n   sport's schema is present in every response.\n3. A key whose value is not known is `null`. `null` means \"not reported\". It never\n   stands for `0`, `false`, an empty string or an empty list; those values appear only\n   when the source reported them (an empty string is itself returned as `null`). A\n   source that itself reports a default value, for example a zero count before play\n   starts, has that value passed through: the format does not guess which zeros are\n   real. A baseball runner map in which every base is empty is returned as an empty\n   list with a count of `0`.\n4. Each key has one type. Values are taken from the source, with these normalizations:\n   a source's status text is mapped to the `match_status` values; clock text is read\n   into `match_minute` and the added-time keys; baseball runners that a source gives as\n   a map by base are returned as a list and `runners_count` is computed from it; and the\n   shootout and regulation scores are read from period scores where a source reports\n   them that way. A value that cannot be expressed as the key's type is returned as\n   `null`. That includes: a number that is negative (except temperature and pitch\n   location, which may be negative) or above 1e12; a count that is not a whole JSON\n   integer (text such as `\"2\"`, or any number with a decimal point such as `2.9` or\n   `2.0`) or that is above 1,000,000,000; numeric text in a number key; a possession\n   percentage above 100; a score pair with a side that is negative, above 1,000,000,000\n   or not a whole integer; a runner list or map with an entry that has no valid base,\n   repeats a base, or (in map form) holds a value that is neither text nor empty, in which case the\n   runners are `null` together with their count; a game clock that is not `m:ss` text\n   (minutes of one to three digits, seconds 00-59, and an optional fraction on the\n   seconds), and a soccer match minute or added time that is not exactly `m:ss`;\n   text of the form `prefix:type:value`; and an empty or blank string. Runners are\n   returned in base order. In a runner list, a name that is not text, or that has the\n   `prefix:type:value` form, is left out of that runner and the runner is kept. A\n   runner map by base carries player identifiers, so no names are returned from it; a\n   base that holds blank text counts as empty.\n5. Only the keys listed in the sport's schema are returned. For football, basketball,\n   baseball, hockey, ice_hockey and soccer, every key of that sport in the property list\n   below that does not carry a source identifier is in the schema. Tennis has one key,\n   `retirement_info`, which is not in the property list. Not returned in this format:\n   keys that carry a source identifier (player, team and goalie IDs, and similar), and\n   keys of the current format that are not in the property list (for example nested\n   baseball count and runner details, per-period linescores, match situation and\n   referee detail). Switching an account removes them from its responses.\n6. Changing the data source for an event does not change the key set, the types or the\n   meaning of `null`. Values can change.\n7. The format has no keys that carry a source identifier, and text of the form\n   `prefix:type:value` (one to ten ASCII letters, a colon, ASCII letters or underscores, a colon,\n   then text without whitespace; case-insensitive; surrounding whitespace ignored) is\n   `null`. Free text is not inspected beyond that. `possession_team_id` is a UUID in its\n   36-character text form (returned in lower case) or `null`; it is not checked against\n   the team list. Golf and motorsports are served as stored (see 8) and can contain\n   source identifiers.\n8. Golf and motorsports are not shaped by this format: their `details` are the stored\n   object, carry no `details_version`, and can contain source identifiers (an account\n   that holds no provider-data entitlement may have provider-id values removed from them\n   by a separate step). A scoreboard whose sport is not one of the sports named above,\n   including a sport stored as an identifier instead of a name, is treated as any other\n   sport. Sport names are matched ignoring case and surrounding whitespace (any Unicode space). For any other sport\n   (for example MMA) the object is exactly `{\"details_version\": 1}`.\n\n## When no scoreboard is available\n\nThe scoreboard object is absent as a whole; it is not returned with empty `details`:\n\n* `GET /api/v1/events/{id}/event-scoreboard` and `GET /api/v1/events/{id}/linescore`\n  return `404`.\n* `GET /api/v1/events` and `GET /api/v1/events/{id}` omit `event_scoreboard`.\n* `GET /api/v1/tournaments/{id}/bracket` returns `event_scoreboard: null`.\n\nA scoreboard is returned only from data you are entitled to receive. Data you are not\nentitled to is treated as if it did not exist.\n\nThis is different from an unknown value inside a returned scoreboard, which is a\n`null` key in the `details_version` 1 format.\n","example":{"goal_to_go":false,"away_yellow_cards":1,"runners_count":2,"home_timeouts":2,"match_status":"second_half","weather_wind_speed":8.0,"yard_line":25,"hitter_id":"player-123","possession_team_id":"123e4567-e89b-12d3-a456-426614174002","away_timeouts":3,"home_on_power_play":true,"touchdown_probability":0.35,"added_time_played":"00:00","weather_temperature":45.0,"active_penalties_count":1,"away_corners":2,"wind_affecting_kicking":false,"regulation_score":{"away_score":3,"home_score":0},"away_red_cards":1,"runners_on_base":[{"base":1,"ending_base":2,"id":"player-789"},{"base":3,"ending_base":3,"id":"player-012"}],"pitcher_id":"player-456","pitcher_full_name":"Jane Smith","shootout":{"away_score":4,"home_score":3},"home_substitutions":3,"away_substitutions":2,"added_time_announced":"04:00","home_possession":56,"strikes":1,"away_shots":7,"shots_on_goal_home":15,"home_yellow_cards":2,"balls":2,"home_corners":6,"away_possession":44,"home_shots_on_target":5,"details_version":1,"weather_humidity":65,"neutral_site":false,"attendance":72000,"hitter_full_name":"John Doe","outs":2,"distance":7,"play_clock":25,"inside_two_minutes":false,"away_on_power_play":false,"red_zone":true,"game_clock":"8:42","man_advantage":"5v4","power_play_time_remaining":82,"weather_wind_direction":"NW","two_minute_warning":false,"pitcher_pitch_speed":95.5,"home_red_cards":0,"weather_condition":"clear","down":3,"clock_running":true,"match_minute":"67:12","precipitation":false,"home_shots":11,"shots_on_goal_away":12,"away_shots_on_target":3,"turnover_on_downs_risk":0.15,"active_penalties":[{"major_penalty":false,"penalty_type":"Cross-checking","player_id":"player-789","time_remaining":82}],"field_goal_range":true,"weather_precipitation":false},"properties":{"penalty_kill_percentage":{"description":"Current penalty kill success rate","type":"number"},"holes_completed":{"description":"Holes finished in current round","type":"integer"},"course_conditions":{"description":"Course conditions","type":"string"},"home_biggest_lead":{"description":"Biggest home team lead","type":"integer"},"pitcher_pitch_x":{"description":"Pitch location X coordinate","type":"number"},"shootout_attempts_count":{"description":"Total shootout attempts","type":"integer"},"away_shooting_foul_trouble":{"description":"Away team in foul trouble","type":"boolean"},"goal_to_go":{"description":"Goal line is closer than first down marker","type":"boolean"},"away_yellow_cards":{"description":"Soccer away yellow cards","type":"integer"},"shootout_round":{"description":"Current shootout round","type":"integer"},"runners_count":{"description":"Number of runners on base","type":"integer"},"home_timeouts":{"description":"Home team timeouts remaining","type":"integer"},"wall_clock":{"description":"Provider wall-clock timestamp for the most recent game event","format":"date-time","type":"string"},"home_bonus":{"description":"Home team in bonus situation","type":"boolean"},"match_status":{"description":"Soccer match phase","enum":["first_half","halftime","second_half","extra_time_first_half","extra_time_second_half","penalties","ended"],"type":"string"},"last_play":{"description":"Description of last play","type":"string"},"hitter_ab_over":{"description":"At-bat is complete","type":"boolean"},"weather_wind_speed":{"description":"Wind speed (mph)","type":"number"},"home_double_bonus":{"description":"Home team in double bonus","type":"boolean"},"yard_line":{"description":"Field position (0-100)","type":"integer"},"hitter_id":{"description":"Current batter player ID","type":"string"},"times_tied":{"description":"Number of times tied","type":"integer"},"last_goal_time":{"description":"Time of last goal","type":"string"},"home_goalie_pulled":{"description":"Home goalie pulled","type":"boolean"},"lead_changes":{"description":"Number of lead changes","type":"integer"},"tournament_complete":{"description":"Tournament finished","type":"boolean"},"possession_team_id":{"description":"Common-model team ID with possession","format":"uuid","type":"string"},"wind_direction":{"description":"Wind direction","type":"string"},"away_timeouts":{"description":"Away team timeouts remaining","type":"integer"},"free_throw_shots_awarded":{"description":"Number of free throws awarded","type":"integer"},"home_on_power_play":{"description":"Home team on power play","type":"boolean"},"home_team_fouls":{"description":"Home team fouls this period/half","type":"integer"},"touchdown_probability":{"description":"Probability of touchdown (0.0-1.0)","type":"number"},"added_time_played":{"description":"Soccer stoppage time played so far in the current period (MM:SS)","example":"01:26","type":"string"},"weather_temperature":{"description":"Temperature (Fahrenheit)","type":"number"},"duration":{"description":"Game duration","type":"string"},"overtime_type":{"description":"Type of overtime","enum":["3v3","4v4","shootout"],"type":"string"},"course_length":{"description":"Course length in yards","type":"integer"},"shot_clock_running":{"description":"Whether shot clock is running","type":"boolean"},"active_penalties_count":{"description":"Number of active penalties","type":"integer"},"current_hole":{"description":"Hole currently being played","type":"integer"},"away_corners":{"description":"Soccer away corner kicks","type":"integer"},"wind_affecting_kicking":{"description":"Wind affecting field goals/punts","type":"boolean"},"regulation_score":{"description":"Soccer 90-minute score. Present only once a match goes past regulation (extra time).","properties":{"away_score":{"type":"integer"},"home_score":{"type":"integer"}},"type":"object"},"free_throw_clear_path_foul":{"description":"Free throws from clear path foul","type":"boolean"},"hits_home":{"description":"Home team hits","type":"integer"},"shootout_attempts":{"description":"Shootout attempts with details","items":{"properties":{"goalie_id":{"description":"Goalie player ID","type":"string"},"is_deciding_goal":{"description":"Was the deciding goal","type":"boolean"},"result":{"description":"Shot result","type":"string"},"round":{"description":"Shootout round","type":"integer"},"shooter_id":{"description":"Shooter player ID","type":"string"},"shooter_name":{"description":"Shooter name","type":"string"},"shooter_team_id":{"description":"Shooter's team","type":"string"}},"type":"object"},"type":"array"},"playoff_type":{"description":"Type of playoff","enum":["sudden_death","aggregate","match_play"],"type":"string"},"away_red_cards":{"description":"Soccer away red cards (includes second-yellow dismissals)","type":"integer"},"free_throw_current_attempt":{"description":"Current free throw attempt number","type":"integer"},"runners_on_base":{"description":"Baserunners with positions and details","items":{"properties":{"base":{"description":"Starting base (1, 2, 3)","type":"integer"},"ending_base":{"description":"Ending base after play","type":"integer"},"full_name":{"description":"Runner name, when known","type":"string"},"id":{"description":"Player ID","type":"string"}},"type":"object"},"type":"array"},"cut_made":{"description":"Has cut been applied","type":"boolean"},"pitcher_id":{"description":"Current pitcher player ID","type":"string"},"pitcher_full_name":{"description":"Current pitcher name","type":"string"},"shootout":{"description":"Soccer penalty shootout score. Present only once penalties are reached.","properties":{"away_score":{"type":"integer"},"home_score":{"type":"integer"}},"type":"object"},"faceoff_location":{"description":"Location of last faceoff","type":"string"},"home_substitutions":{"description":"Soccer home substitutions made","type":"integer"},"wind_speed":{"description":"Wind speed (mph)","type":"number"},"shot_clock":{"description":"Shot clock seconds remaining","type":"integer"},"away_substitutions":{"description":"Soccer away substitutions made","type":"integer"},"pitcher_pitch_zone":{"description":"Strike zone location","type":"integer"},"added_time_announced":{"description":"Soccer stoppage time announced by the fourth official (MM:SS)","example":"02:00","type":"string"},"free_throw_technical_foul":{"description":"Free throws from technical foul","type":"boolean"},"home_possession":{"description":"Soccer home ball possession percentage","maximum":100,"minimum":0,"type":"number"},"putting_average_leader":{"description":"Putting average leader player ID","type":"string"},"home_shooting_foul_trouble":{"description":"Home team in foul trouble","type":"boolean"},"strikes":{"description":"Strike count (0-2)","type":"integer"},"greens_in_regulation_leader":{"description":"GIR leader player ID","type":"string"},"away_biggest_lead":{"description":"Biggest away team lead","type":"integer"},"face_off_wins_away":{"description":"Away team faceoff wins","type":"integer"},"last_goal_team_id":{"description":"Team that scored last goal","type":"string"},"away_double_bonus":{"description":"Away team in double bonus","type":"boolean"},"away_shots":{"description":"Soccer away total shots","type":"integer"},"temperature":{"description":"Temperature (Fahrenheit)","type":"integer"},"last_penalty_time":{"description":"Time of last penalty","type":"string"},"last_score_team_id":{"description":"Team that scored last","type":"string"},"free_throw_and_one":{"description":"And-one free throw situation","type":"boolean"},"shots_on_goal_home":{"description":"Home team shots on goal","type":"integer"},"home_yellow_cards":{"description":"Soccer home yellow cards","type":"integer"},"free_throw_flagrant_foul":{"description":"Free throws from flagrant foul","type":"boolean"},"in_shootout":{"description":"Currently in shootout","type":"boolean"},"playoff_status":{"description":"Tournament in playoff","type":"boolean"},"away_goalie_id":{"description":"Current away goalie player ID","type":"string"},"balls":{"description":"Ball count (0-3)","type":"integer"},"home_corners":{"description":"Soccer home corner kicks","type":"integer"},"home_shootout_goals":{"description":"Home team shootout goals","type":"integer"},"pitcher_pitch_type":{"description":"Last pitch type","type":"string"},"away_possession":{"description":"Soccer away ball possession percentage","maximum":100,"minimum":0,"type":"number"},"scoring_average":{"description":"Current round scoring average","type":"number"},"empty_net":{"description":"Empty net situation","type":"boolean"},"home_shots_on_target":{"description":"Soccer home shots on target","type":"integer"},"away_bonus":{"description":"Away team in bonus situation","type":"boolean"},"details_version":{"description":"Version of the details contract. Present and `1` in the contract format; absent in legacy provider-shaped objects.","example":1,"type":"integer"},"weather_humidity":{"description":"Humidity percentage","type":"integer"},"neutral_site":{"description":"Neutral site game","type":"boolean"},"free_throw_shots_made":{"description":"Free throws made so far","type":"integer"},"attendance":{"description":"Game attendance","type":"integer"},"total_rounds":{"description":"Total tournament rounds","type":"integer"},"hitter_full_name":{"description":"Current batter name","type":"string"},"pace":{"description":"Possessions per 48 minutes","type":"number"},"outs":{"description":"Outs in inning (0-2)","type":"integer"},"round_number":{"description":"Current round (1-4+)","type":"integer"},"free_throw_shooter_name":{"description":"Name of free throw shooter","type":"string"},"cut_line":{"description":"Score needed to make cut","type":"integer"},"distance":{"description":"Yards to go for first down","type":"integer"},"free_throw_shooter_id":{"description":"Player ID shooting free throws","type":"string"},"field_size":{"description":"Total number of players","type":"integer"},"play_clock":{"description":"Seconds on play clock","type":"integer"},"hits_away":{"description":"Away team hits","type":"integer"},"inside_two_minutes":{"description":"Less than two minutes remaining","type":"boolean"},"driving_distance_leader":{"description":"Driving distance leader player ID","type":"string"},"home_goalie_id":{"description":"Current home goalie player ID","type":"string"},"intermission":{"description":"Between periods/halves","type":"boolean"},"hitter_outcome_id":{"description":"At-bat outcome identifier","type":"string"},"blocked_shots_away":{"description":"Away team blocked shots","type":"integer"},"away_on_power_play":{"description":"Away team on power play","type":"boolean"},"last_faceoff_winner":{"description":"Team that won last faceoff","enum":["home","away"],"type":"string"},"red_zone":{"description":"In red zone (20 yards or less)","type":"boolean"},"game_clock":{"description":"Current game clock time","type":"string"},"man_advantage":{"description":"Current man advantage (e.g., '5v4', 'even')","type":"string"},"blocked_shots_home":{"description":"Home team blocked shots","type":"integer"},"away_goalie_pulled":{"description":"Away goalie pulled","type":"boolean"},"power_play_time_remaining":{"description":"Seconds remaining on power play","type":"integer"},"weather_wind_direction":{"description":"Wind direction","type":"string"},"players_made_cut":{"description":"Players making the cut","type":"integer"},"par_for_course":{"description":"Course par","type":"integer"},"two_minute_warning":{"description":"Two minute warning called","type":"boolean"},"pitcher_pitch_speed":{"description":"Last pitch speed (mph)","type":"number"},"possession_arrow":{"description":"Possession arrow (college)","enum":["home","away"],"type":"string"},"away_shootout_goals":{"description":"Away team shootout goals","type":"integer"},"free_throw_shots_attempted":{"description":"Free throws attempted so far","type":"integer"},"home_red_cards":{"description":"Soccer home red cards (includes second-yellow dismissals)","type":"integer"},"weather_condition":{"description":"Weather condition","type":"string"},"away_team_fouls":{"description":"Away team fouls this period/half","type":"integer"},"pitcher_pitch_y":{"description":"Pitch location Y coordinate","type":"number"},"down":{"description":"Current down (1-4)","type":"integer"},"last_score_time":{"description":"When last score occurred","type":"string"},"clock_running":{"description":"Whether game clock is running","type":"boolean"},"overtime_number":{"description":"Which overtime period","type":"integer"},"match_minute":{"description":"Soccer elapsed match clock as MM:SS (stoppage time excluded). Tick locally between updates.","example":"45:00","type":"string"},"precipitation":{"description":"Active precipitation","type":"boolean"},"home_shots":{"description":"Soccer home total shots","type":"integer"},"shots_on_goal_away":{"description":"Away team shots on goal","type":"integer"},"away_shots_on_target":{"description":"Soccer away shots on target","type":"integer"},"turnover_on_downs_risk":{"description":"Probability of turnover on downs (0.0-1.0)","type":"number"},"active_penalties":{"description":"Currently active penalties with details","items":{"properties":{"duration":{"description":"Penalty duration in minutes","type":"integer"},"major_penalty":{"description":"Is major penalty","type":"boolean"},"misconduct":{"description":"Is misconduct penalty","type":"boolean"},"penalty_start_time":{"description":"When penalty started","type":"string"},"penalty_type":{"description":"Type of penalty","type":"string"},"player_id":{"description":"Penalized player ID","type":"string"},"player_name":{"description":"Penalized player name","type":"string"},"team_id":{"description":"Team of penalized player","type":"string"},"time_remaining":{"description":"Time remaining in seconds","type":"integer"}},"type":"object"},"type":"array"},"field_goal_range":{"description":"Within field goal range","type":"boolean"},"free_throw_bonus_situation":{"description":"Free throws from bonus","type":"boolean"},"weather_precipitation":{"description":"Is it precipitating","type":"boolean"},"face_off_wins_home":{"description":"Home team faceoff wins","type":"integer"}},"type":"object"},"event_id":{"description":"Event ID","format":"uuid","type":"string"},"home_score":{"description":"Home team total score (null for individual sports like golf)","example":14,"type":"integer"},"inserted_at":{"description":"Creation timestamp","format":"date-time","type":"string"},"league":{"description":"League abbreviation","example":"NFL","type":"string"},"observed_at":{"description":"Provider observation time of the served row (the elected row's own observation; unlike response_received_at it is never taken from a clock donor). Null when unknown.","example":"2024-01-15T15:32:09Z","format":"date-time","nullable":true,"type":"string"},"period":{"description":"Current period/quarter/inning (1-based, sport-specific numbering)","example":2,"type":"integer"},"period_half":{"description":"Period subdivision (e.g., 'top'/'bottom' for baseball innings)","enum":["top","bottom"],"example":"bottom","type":"string"},"period_half_over":{"description":"Whether the current period half is complete","type":"boolean"},"periods":{"description":"Per-period linescore, in period order. This is what `/v1/events/{id}/linescore` returns.","example":[{"away_score":3,"home_score":7,"number":1,"type":"regular_period"}],"items":{"additionalProperties":true,"type":"object"},"type":"array"},"response_received_at":{"description":"When we received this state from the upstream provider. This is the observation time, and it is the field to use to judge freshness or to interpolate a running clock — `updated_at` is a storage timestamp and moves even when the observation did not.","example":"2024-01-15T15:32:10Z","format":"date-time","type":"string"},"served_at":{"description":"When this response was assembled (UTC, whole seconds).","example":"2024-01-15T15:32:11Z","format":"date-time","nullable":true,"type":"string"},"source_rank":{"description":"Which provider's row was served and why it was chosen. `provider` is the provider family (`sportsstack` for a canonical row, whose backing vendor is not disclosed); `rank` is its position in the league's live primary order (0 = primary, null = outside the order or canonical); `reason` is `primary` (highest-ranked provider present), `fallback_stale` (a higher-ranked provider's row was older than the stale window), `single_provider` (only one provider reported), `freshest` (a fresher lower-ranked row was served), or null when the election's candidates are not visible to the tenant.","nullable":true,"properties":{"provider":{"example":"sportsstack","type":"string"},"rank":{"example":0,"nullable":true,"type":"integer"},"reason":{"enum":["primary","fallback_stale","single_provider","freshest"],"nullable":true,"type":"string"}},"type":"object"},"sport":{"description":"Sport name","enum":["football","basketball","baseball","hockey","ice_hockey","soccer","golf"],"example":"football","type":"string"},"status":{"description":"Lifecycle state of the event as reported by the provider (e.g. 'live', 'in_progress', 'halftime', 'closed', 'final'). Values are provider vocabulary and are not normalized across providers — use this to tell a live scoreboard from a finished one, not for settlement decisions.","example":"in_progress","type":"string"},"time_on_clock":{"description":"Time remaining in period - format varies by sport (MM:SS for timed sports, null for baseball/golf)","example":"14:30","type":"string"},"updated_at":{"description":"Last update timestamp","format":"date-time","type":"string"}},"required":["common_model_id","event_id","sport","league"],"title":"EventStatus","type":"object"},"metadata":{"type":"object"},"participants":{"type":"array"},"scheduled_start_time":{"format":"date-time","type":"string"},"status":{"type":"string"},"title":{"type":"string"},"tournament_round":{"type":"integer"}},"type":"object"},"type":"array"},"groups":{"description":"Group stage divisions (for group_knockout tournaments)","items":{"description":"A group represents a division within the group stage of a tournament (World Cup, UEFA Champions League).\n\nGroups organize teams into round-robin competition pools where teams play each other\nand standings determine advancement to knockout rounds. Each group has its own standings\ntable tracking wins, losses, goals, and points.\n\n## Group Stage Structure\n\n- **Teams**: 3-4 teams per group (varies by tournament)\n- **Format**: Round-robin (each team plays every other team in group)\n- **Advancement**: Top teams (typically top 2) advance to knockout stage\n- **Standings**: Points, goal differential, head-to-head determine rankings\n\n## Standings Calculation\n\nStandings are calculated from group stage events:\n- **Points**: Win = 3, Draw = 1, Loss = 0 (varies by sport)\n- **Goal Differential**: Goals for - Goals against\n- **Head-to-Head**: Direct matchup results for tiebreaking\n","example":{"group_name":"Group A","standings":[{"drawn":1,"goal_difference":3,"goals_against":2,"goals_for":5,"lost":0,"played":3,"points":7,"position":1,"team_id":"e2790078-ec3a-4c45-8dc4-5cf173960b2b","won":2}],"teams":[{"abbreviation":"TMA","country_code":"USA","name":"Team A","team_id":"e2790078-ec3a-4c45-8dc4-5cf173960b2b"}]},"properties":{"group_name":{"description":"Group identifier (e.g., 'Group A', 'Group B')","example":"Group A","type":"string"},"standings":{"description":"Current group standings ordered by position","items":{"properties":{"drawn":{"description":"Draws","type":"integer"},"goal_difference":{"description":"Goal differential","type":"integer"},"goals_against":{"description":"Goals conceded","type":"integer"},"goals_for":{"description":"Goals scored","type":"integer"},"lost":{"description":"Losses","type":"integer"},"played":{"description":"Games played","type":"integer"},"points":{"description":"Total points","type":"integer"},"position":{"description":"Current position in group (1-based)","type":"integer"},"team_id":{"format":"uuid","type":"string"},"won":{"description":"Wins","type":"integer"}},"type":"object"},"type":"array"},"teams":{"description":"Teams participating in this group","items":{"properties":{"abbreviation":{"description":"Team abbreviation","type":"string"},"country_code":{"description":"Country code (for international tournaments)","type":"string"},"name":{"description":"Team name","type":"string"},"team_id":{"description":"Team common_model_id","format":"uuid","type":"string"}},"type":"object"},"type":"array"}},"required":["group_name","teams","standings"],"title":"TournamentGroup","type":"object"},"type":"array"},"metadata":{"description":"Bracket summary statistics","properties":{"bracket_type_display":{"description":"Human-readable bracket type","type":"string"},"total_events":{"description":"Number of events","type":"integer"},"total_groups":{"description":"Number of groups","type":"integer"},"total_rounds":{"description":"Number of rounds","type":"integer"}},"type":"object"},"rounds":{"description":"Bracket rounds with matchups","items":{"description":"A round represents a stage of competition within a tournament bracket.\n\nRounds organize matchups into progressive stages of elimination or series competition.\nEach round contains multiple matchups (games or series) that determine advancement.\n\n## Round Structure by Bracket Type\n\n### Single Elimination Rounds\n- **Round 1**: First Round (64 teams → 32 teams)\n- **Round 2**: Second Round (32 teams → 16 teams)\n- **Round 3**: Sweet 16 (16 teams → 8 teams)\n- **Round 4**: Elite 8 (8 teams → 4 teams)\n- **Round 5**: Final Four (4 teams → 2 teams)\n- **Round 6**: Championship (2 teams → 1 champion)\n\n### Best-of-Series Rounds\n- **Round 1**: First Round (e.g., 16 teams → 8 teams via best-of-7 series)\n- **Round 2**: Conference Semifinals\n- **Round 3**: Conference Finals\n- **Round 4**: Finals\n\n### Group + Knockout Rounds\n- **Groups**: Round-robin play (not numbered rounds)\n- **Round 1**: Round of 16 (knockout stage begins)\n- **Round 2**: Quarterfinals\n- **Round 3**: Semifinals\n- **Round 4**: Final\n","example":{"best_of":null,"matchups":[{"away_score":72,"away_team":{"abbreviation":"TMB","name":"Team B","seed":16,"source_id":"competitor_67890","team_id":"f1798a7e-4832-4a2c-8cb6-60d5afcb3d41"},"event_id":"a96af633-aee6-48a0-bf72-0865a4419772","home_score":85,"home_team":{"abbreviation":"TMA","name":"Team A","seed":1,"source_id":"competitor_12345","team_id":"e2790078-ec3a-4c45-8dc4-5cf173960b2b"},"matchup_source_id":"event_12345678","position":0,"region":"East","scheduled_time":"2025-03-20T12:00:00Z","status":"completed","winner_id":"home"}],"round_name":"First Round","round_number":1,"round_type":"elimination"},"properties":{"best_of":{"description":"Best-of-N value for series rounds (3, 5, or 7 games). Null for single elimination.","example":7,"type":"integer"},"matchups":{"description":"Games or series in this round (see TournamentMatchup schema)","items":{"description":"A matchup represents a single game or series within a tournament round.\n\nMatchups connect teams/participants with game results, scores, and advancement status.\nEach matchup can be either a single game (elimination) or a series (best-of-N).\n\n## Matchup States\n\n- **Scheduled**: Game/series not yet started\n- **In Progress**: Currently being played\n- **Completed**: Finished with final results\n- **Pending**: Placeholder matchup (e.g., waiting for previous round results)\n\n## Team Information\n\nTeams in matchups include:\n- **team_id**: Our unified team identifier (resolved via identity mapping)\n- **source_id**: Provider's team identifier (before mapping)\n- **seed**: Tournament seed number (1-16 for NCAA, null for non-seeded tournaments)\n- **name/abbreviation**: Team display information\n\n## Winner Determination\n\n- **winner_id**: \"home\", \"away\", or null (if not yet determined)\n- **home_score/away_score**: Final scores (null if game not completed)\n- For series: `series_score` object with home/away wins instead of single game scores\n\n## Event Linking\n\n- **event_id**: Links to actual Event entity (populated when events are created)\n- **matchup_source_id**: Provider's game ID (before event creation)\n- When both exist, `event_id` takes precedence for detailed game data\n","example":{"away_score":72,"away_team":{"abbreviation":"TMB","name":"Team B","seed":16,"source_id":"competitor_67890","team_id":"f1798a7e-4832-4a2c-8cb6-60d5afcb3d41"},"event_id":"a96af633-aee6-48a0-bf72-0865a4419772","home_score":85,"home_team":{"abbreviation":"TMA","name":"Team A","seed":1,"source_id":"competitor_12345","team_id":"e2790078-ec3a-4c45-8dc4-5cf173960b2b"},"matchup_source_id":"event_12345678","position":0,"region":"East","scheduled_time":"2025-03-20T12:00:00Z","series_score":null,"status":"completed","winner_id":"home"},"properties":{"away_score":{"description":"Away team score (null if game not completed or for series rounds)","example":72,"type":"integer"},"away_team":{"description":"Away team information (same structure as home_team)","properties":{"abbreviation":{"type":"string"},"name":{"type":"string"},"seed":{"type":"integer"},"source_id":{"type":"string"},"team_id":{"format":"uuid","type":"string"}},"type":"object"},"event_id":{"description":"Event entity common_model_id (populated when events are created)","example":"a96af633-aee6-48a0-bf72-0865a4419772","format":"uuid","type":"string"},"home_score":{"description":"Home team score (null if game not completed or for series rounds)","example":85,"type":"integer"},"home_team":{"description":"Home team information","properties":{"abbreviation":{"description":"Team abbreviation","type":"string"},"name":{"description":"Team full name","type":"string"},"seed":{"description":"Tournament seed (1-16 for NCAA, null for non-seeded)","type":"integer"},"source_id":{"description":"Provider's team identifier","type":"string"},"team_id":{"description":"Team common_model_id (resolved via identity mapping)","format":"uuid","type":"string"}},"type":"object"},"matchup_source_id":{"description":"Provider's game/series ID (before event entity is created)","example":"event_12345678","type":"string"},"position":{"description":"Position/order of matchup within the round","example":0,"type":"integer"},"region":{"description":"Region/bracket name (for NCAA tournaments: East, West, South, Midwest)","example":"East","type":"string"},"scheduled_time":{"description":"Scheduled start time for the game/series","example":"2025-03-20T12:00:00Z","format":"date-time","type":"string"},"series_score":{"description":"Series score for best-of-series rounds (null for single elimination)","example":{"away":2,"home":4},"properties":{"away":{"description":"Away team wins in series","type":"integer"},"home":{"description":"Home team wins in series","type":"integer"}},"type":"object"},"status":{"description":"Matchup status","enum":["scheduled","in_progress","completed","pending"],"type":"string"},"winner_id":{"description":"Winner designation: 'home', 'away', or null if not determined","enum":["home","away",null],"type":"string"}},"required":["position","home_team","away_team","status"],"title":"TournamentMatchup","type":"object"},"type":"array"},"round_name":{"description":"Human-readable round name (e.g., 'First Round', 'Sweet 16', 'Conference Finals')","example":"First Round","type":"string"},"round_number":{"description":"Sequential round number (1-based, lower numbers = earlier rounds)","example":1,"type":"integer"},"round_type":{"description":"Type of round: elimination (single game), best_of_series (multi-game), knockout (post-group stage)","enum":["elimination","best_of_series","knockout"],"type":"string"}},"required":["round_number","round_name","round_type","matchups"],"title":"TournamentRound","type":"object"},"type":"array"},"tournament":{"description":"Tournament metadata","properties":{"bracket_type":{"type":"string"},"common_model_id":{"format":"uuid","type":"string"},"end_date":{"format":"date","type":"string"},"league_id":{"format":"uuid","type":"string"},"name":{"type":"string"},"season_year":{"type":"integer"},"start_date":{"format":"date","type":"string"},"status":{"type":"string"},"tournament_type":{"type":"string"}},"type":"object"}},"required":["tournament","groups","rounds","metadata"],"title":"TournamentBracketResponse","type":"object"}}},"description":"Tournament Bracket Response"},"401":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"invalid_api_key","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/invalid_api_key","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"not_found","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/not_found","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Not Found"}},"summary":"Get Tournament Bracket","tags":["Reference"]}},"/api/v1/prediction-markets/listings":{"get":{"callbacks":{},"description":"Returns bounded tenant-entitled native contracts, including unmatched canonical references and quarantine/readiness reasons. Known leagues require both venue and league entitlement. Unknown leagues require an explicit venue-wide prediction-catalog entitlement.","operationId":"ApiRestWeb.PredictionMarketsController.listings","parameters":[{"description":"","in":"query","name":"cursor","required":false,"schema":{"type":"string"}},{"description":"","in":"query","name":"limit","required":false,"schema":{"default":50,"maximum":100,"minimum":1,"type":"integer"}},{"description":"","in":"query","name":"venue","required":false,"schema":{"type":"string"}},{"description":"","in":"query","name":"league","required":false,"schema":{"type":"string"}},{"description":"","in":"query","name":"actual_scope","required":false,"schema":{"type":"string"}},{"description":"","in":"query","name":"lifecycle","required":false,"schema":{"type":"string"}},{"description":"","in":"query","name":"quote_readiness","required":false,"schema":{"type":"string"}},{"description":"","in":"query","name":"execution_readiness","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"cursor":{"nullable":true,"type":"string"},"data":{"items":{"$ref":"#/components/schemas/PredictionNativeListing"},"type":"array"},"page_size":{"maximum":100,"minimum":1,"type":"integer"}},"required":["data","cursor","page_size"],"title":"PredictionNativeListingPage","type":"object"}}},"description":"Native listing page"},"400":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"bad_request","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/bad_request","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"invalid_api_key","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/invalid_api_key","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"forbidden","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/forbidden","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Forbidden"},"503":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"service_unavailable","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/service_unavailable","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Service Unavailable"}},"summary":"List provider-native prediction contracts","tags":["Prediction Markets"]}},"/api/v1/players/{id}":{"get":{"callbacks":{},"operationId":"ApiRestWeb.PlayerController.show","parameters":[{"description":"Player ID (UUID)","example":"01c7133f-2999-4803-9872-8c2ab1ba63ac","in":"path","name":"id","required":true,"schema":{"type":"string"}},{"description":"Include source mappings from the specific integration (i.e. a provider key) will return a source_mappings object with the mappings for the respective objects","in":"query","name":"return_source_id_format","required":false,"schema":{"type":"string"}},{"description":"When true, add source_mappings_by_source keyed by full normalized source (for example, provider.football.nfl).","in":"query","name":"include_source_mappings_by_source","required":false,"schema":{"default":false,"type":"boolean"}},{"description":"Optional provider-family filter for source_mappings_by_source (for example, a provider key).","in":"query","name":"source_mapping_provider","required":false,"schema":{"type":"string"}},{"description":"Optional full-source filter for source_mappings_by_source in provider.sport.league format.","in":"query","name":"source_mapping_source","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"description":"A player represents an individual athlete who competes in sports events.\n\nPlayers are fundamental entities in sports data, serving as the subject of performance\nstatistics, injury reports, roster information, and individual achievements. They can\nbe active or inactive, professional or amateur, and may change teams throughout their careers.\n\n## Core Information\n- **Identity**: Names, physical characteristics, and biographical data\n- **Career Details**: Draft information, experience level, educational background\n- **Current Status**: Active roster status, team affiliation, position\n- **Performance**: Historical and current statistics across multiple events/seasons\n\n## Key Relationships\n- **Team**: Current team affiliation (can change via trades/signings)\n- **Statistics**: Performance data across events and seasons\n- **Injuries**: Current and historical injury status affecting availability\n- **Events**: Games/matches the player participates in\n- **Draft**: Original draft selection details for professional leagues\n\n## Position Codes\nPosition abbreviations vary by sport:\n- **Football**: QB, RB, WR, TE, OL, DL, LB, CB, S, K, P\n- **Basketball**: PG, SG, SF, PF, C\n- **Baseball**: P, C, 1B, 2B, 3B, SS, LF, CF, RF, DH\n- **Hockey**: C, LW, RW, D, G\n\n## Status Management\nThe is_active flag indicates current roster status. Inactive players may return\nto active status, while retired players typically remain inactive permanently.\n","example":{"birthday":"December 30, 1984","common_model_id":"f1798a7e-4832-4a2c-8cb6-60d5afcb3d41","family_name":"James","first_name":"LeBron","full_name":"LeBron James","height_in":81,"image_url":"https://cdn.example.com/headshots/nba/1966.png","is_active":true,"league_id":"58e8c89b-72f8-4427-adbc-10f193c9b462","metadata":"[]","nickname":"","number":"6","position":"PF","team_id":"58e8c89b-72f8-4427-adbc-10f193c9b462","weight_lbs":250},"properties":{"birth_place":{"description":"City, state/province, country of birth","type":"string"},"birthday":{"description":"Date of birth (format may vary by data source)","type":"string"},"college":{"description":"College/university attended (important for draft analysis)","type":"string"},"college_conf":{"description":"College conference (e.g., 'SEC', 'Big 10', 'ACC')","type":"string"},"common_model_id":{"description":"Unique player identifier across all data sources","type":"string"},"draft_number":{"description":"Overall draft pick number (1-based)","type":"integer"},"draft_round":{"description":"Draft round selected (1-based)","type":"integer"},"draft_team_id":{"description":"Team that originally drafted the player","type":"string"},"draft_year":{"description":"Year player was drafted into professional league","type":"integer"},"experience":{"description":"Years of professional experience or rookie status","type":"string"},"family_name":{"description":"Surname/family name","type":"string"},"first_name":{"description":"Given/first name","type":"string"},"full_name":{"description":"Complete name as commonly known (e.g., 'LeBron James')","type":"string"},"height_in":{"description":"Height in inches (total inches, not feet/inches)","type":"integer"},"high_school":{"description":"High school attended","type":"string"},"image_url":{"description":"Player headshot or action photo","type":"string"},"is_active":{"description":"true if currently on active roster, false if inactive/retired","type":"boolean"},"league_id":{"description":"League the player currently competes in","type":"string"},"metadata":{"description":"Additional sport-specific or source-specific data","type":"object"},"nickname":{"description":"Common nickname or alternate name used in media","type":"string"},"number":{"description":"Jersey/uniform number (stored as string to handle formats like '6A')","type":"string"},"position":{"description":"Primary playing position using standard sport abbreviations","type":"string"},"roster_observed_at":{"description":"UTC timestamp of the effective complete roster census supporting the current team assignment","format":"date-time","nullable":true,"type":"string"},"source_mappings_by_source":{"additionalProperties":{"properties":{"event":{"description":"Event mapping rows for event endpoints.","items":{"properties":{"common_model_id":{"format":"uuid","type":"string"},"deprecated_at":{"format":"date-time","nullable":true,"type":"string"},"entity_type":{"type":"string"},"id_scheme":{"type":"string"},"ignored_pending":{"type":"boolean"},"league":{"type":"string"},"match_status":{"type":"string"},"overmapped_allowed":{"type":"boolean"},"provider":{"type":"string"},"source":{"type":"string"},"source_id":{"type":"string"},"tenant_id":{"format":"uuid","nullable":true,"type":"string"},"updated_at":{"format":"date-time","type":"string"}},"type":"object"},"type":"array"},"mappings":{"description":"Source mapping rows for non-event entity endpoints.","items":{"properties":{"common_model_id":{"format":"uuid","type":"string"},"deprecated_at":{"format":"date-time","nullable":true,"type":"string"},"entity_type":{"type":"string"},"id_scheme":{"type":"string"},"ignored_pending":{"type":"boolean"},"league":{"type":"string"},"match_status":{"type":"string"},"overmapped_allowed":{"type":"boolean"},"provider":{"type":"string"},"source":{"type":"string"},"source_id":{"type":"string"},"tenant_id":{"format":"uuid","nullable":true,"type":"string"},"updated_at":{"format":"date-time","type":"string"}},"type":"object"},"type":"array"},"participants":{"description":"Participant mapping rows for event endpoints.","items":{"properties":{"common_model_id":{"format":"uuid","type":"string"},"deprecated_at":{"format":"date-time","nullable":true,"type":"string"},"entity_type":{"type":"string"},"id_scheme":{"type":"string"},"ignored_pending":{"type":"boolean"},"league":{"type":"string"},"match_status":{"type":"string"},"overmapped_allowed":{"type":"boolean"},"participant_id":{"format":"uuid","type":"string"},"participant_role":{"type":"string"},"participant_side":{"enum":["home","away","neutral","unknown"],"type":"string"},"provider":{"type":"string"},"source":{"type":"string"},"source_id":{"type":"string"},"tenant_id":{"format":"uuid","nullable":true,"type":"string"},"updated_at":{"format":"date-time","type":"string"}},"type":"object"},"type":"array"},"unmapped_participants":{"description":"Event participants that could not be emitted as source mappings because they were placeholders/TBD or lacked a mapping for the requested source.","items":{"properties":{"display_name":{"type":"string"},"participant_id":{"type":"string"},"participant_role":{"type":"string"},"participant_side":{"enum":["home","away","neutral","unknown"],"type":"string"},"reason":{"enum":["placeholder_or_tbd","missing_source_mapping"],"type":"string"}},"type":"object"},"type":"array"}},"type":"object"},"description":"Optional enterprise mapping enrichment keyed by full normalized source. Added when include_source_mappings_by_source=true.","type":"object"},"team_id":{"description":"Current team affiliation (null if free agent or retired)","type":"string"},"weight_lbs":{"description":"Body weight in pounds","type":"integer"}},"required":["common_model_id","full_name"],"title":"Player","type":"object"}}},"description":"Player Response"},"400":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"bad_request","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/bad_request","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Bad Request"}},"summary":"Show Player","tags":["Reference"]}},"/api/v1/leagues":{"get":{"callbacks":{},"description":"List the leagues visible to the tenant. Tenants entitled to the `CRYPTO` league (a\n`sportsstack_feed` entitlement for `CRYPTO`) additionally see the synthetic `CRYPTO`\nleague, whose `sport_id` is the `crypto` sport, exactly once across all pages (it is the\nlast element of the list, so a full last page pushes it to the next page, and\n`x-total-count` includes it). Filter with `sport_id` set to the crypto sport to list it\nalone.\n\nEach item carries `futures_count`, the number of tenant-visible future\nmarkets in that league (the same set `GET /futures?league_id=<league>`\npages through); the synthetic `CRYPTO` league has no futures and reports `0`.\n\nEach item also carries `market_count` and `market_counts_by_venue`: how many\ndistinct OPEN markets (provider status `active`; suspended, closed, settled\nand unknown statuses are not counted) the league's current events have, in\ntotal and per venue (aggregator). Current events are the tenant-visible,\nnon-finished events that started within the last 36 hours or start within\nthe next 14 days. Only sources the tenant can read are counted (the visibility\n`GET /markets` applies). `market_count` counts each market once;\n`market_counts_by_venue` values can sum to more. An open market is not\nnecessarily priced right now. Values can be up to 60 seconds old. `null`\nmeans the count could not be computed right now (never `0`); the synthetic\n`CRYPTO` league reports `null`.\n\nDiscovery flow for outrights and season markets:\n`GET /sports` -> `GET /leagues` (skip leagues with `futures_count` 0) ->\n`GET /futures?league_id=<abbr>&season_year=<year>&aggregator=<venue>`.\n","operationId":"ApiRestWeb.LeagueController.index","parameters":[{"description":"Filter by sport ID (UUID)","example":"31c65553-2f05-4ef7-993c-9e91c583afc8","in":"query","name":"sport_id","required":false,"schema":{"type":"string"}},{"description":"When true, return only leagues with at least one OPEN market on a requested venue (see `venue`) across their window events: the leagues whose `market_counts_by_venue` is nonzero for one of them. Applied before pagination, so `x-total-count` describes the filtered set. The synthetic `CRYPTO` league is left out (read it through `GET /events?league_id=CRYPTO`). 503 when the discovery read is unavailable.","in":"query","name":"has_venue_markets","required":false,"schema":{"default":false,"type":"boolean"}},{"description":"Comma-separated prediction venues `has_venue_markets` considers (polymarket, kalshi, prophetx, predict_fun, limitless, polymarket_us, sxbet). Default: polymarket,kalshi,prophetx; `polymarket_us` and `sxbet` are opt-in and never part of the default. Requires `has_venue_markets=true`.","in":"query","name":"venue","required":false,"schema":{"example":"polymarket,kalshi","type":"string"}},{"description":"Page number for page/per_page pagination. Do not combine with limit/offset.","in":"query","name":"page","required":false,"schema":{"default":1,"minimum":1,"type":"integer"}},{"description":"Number of items per page (max 1000). Do not combine with limit/offset.","in":"query","name":"per_page","required":false,"schema":{"default":100,"maximum":1000,"minimum":1,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"description":"A league represents an organized sports competition or governing body for a specific sport.\n\nLeagues group teams and players under common rules, schedules, and administrative structure.\nThey serve as the organizational framework that governs seasons, playoffs, and championships.\nEach league belongs to a specific sport and has its own unique characteristics, rules, and format.\n\n## Examples by Sport\n- **Football**: NFL (National Football League), NCAA (College Football)\n- **Basketball**: NBA (National Basketball Association), WNBA, NCAA Basketball\n- **Baseball**: MLB (Major League Baseball), MiLB (Minor League Baseball)\n- **Hockey**: NHL (National Hockey League), AHL (American Hockey League)\n- **Golf**: PGA Tour, European Tour, LPGA Tour\n- **Soccer**: Premier League, La Liga, MLS, Champions League\n\n## Key Relationships\n- **Sport**: Each league belongs to exactly one sport\n- **Teams**: Professional leagues contain teams that compete\n- **Events**: All games/matches within the league structure\n- **Players**: Athletes who participate in the league\n- **Seasons**: Time-bound competitive periods within the league\n\n## League Hierarchies\nSome sports have multiple tiers (e.g., MLB/MiLB, Premier League/Championship)\nor different divisions (AFC/NFC in NFL, Eastern/Western Conference in NBA).\n","example":{"abbreviation":"NBA","common_model_id":"8019d4db-7854-4542-b4af-7265d4b57105","futures_count":12,"image_url":"https://cdn.example.com/logos/nfl/pit.png","name":"National Basketball Association","sport_id":"58e8c89b-72f8-4427-adbc-10f193c9b462"},"properties":{"abbreviation":{"description":"Common short form or acronym (e.g., 'NFL', 'NBA', 'EPL')","type":"string"},"common_model_id":{"description":"Unique league identifier in our unified system","type":"string"},"futures_count":{"description":"Number of tenant-visible future markets (outrights, season totals, awards) in this league: the same set `GET /futures?league_id=<league>` returns. 0 means none; null means the count could not be computed right now. Discovery flow: `GET /sports` -> `GET /leagues` -> `GET /futures?league_id&season_year&aggregator`. Present on `GET /leagues` and `GET /leagues/{id}`.","minimum":0,"nullable":true,"type":"integer"},"image_url":{"description":"League logo or official branding image","type":"string"},"market_count":{"description":"Number of distinct open markets (provider status active; suspended, closed, settled and unknown statuses are not counted) across this league's current events (tenant-visible, not finished, started within the last 36 hours or starting within the next 14 days), in sources visible to the tenant (the visibility `GET /markets` applies); each market counts once across venues. Values can be up to 60 seconds old. An open market is not necessarily priced right now. null means the count could not be computed right now (never 0). Present on `GET /leagues` and `GET /leagues/{id}`; null for the synthetic `CRYPTO` league.","minimum":0,"nullable":true,"type":"integer"},"market_counts_by_venue":{"additionalProperties":{"minimum":0,"type":"integer"},"description":"Per-venue (aggregator, e.g. `polymarket`, `kalshi`, `prophetx`, `predict_fun`, `limitless`, `polymarket_us`, `sxbet`) breakdown of `market_count`, with the same rules. Venues with no open market are omitted. Values can sum to more than `market_count`. null means the count could not be computed right now. Present on `GET /leagues` and `GET /leagues/{id}`; null for the synthetic `CRYPTO` league.","nullable":true,"type":"object"},"name":{"description":"Full official name of the league","type":"string"},"sport_id":{"description":"Reference to the sport this league governs","type":"string"}},"required":["name","abbreviation"],"title":"League","type":"object"}}},"description":"League Response"},"401":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"invalid_api_key","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/invalid_api_key","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"not_found","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/not_found","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Not Found"}},"summary":"List Leagues","tags":["Reference"]}},"/api/v1/self-service/mappings/pending":{"get":{"callbacks":{},"operationId":"ApiRestWeb.SelfServiceController.pending","parameters":[{"description":"","in":"query","name":"source","required":false,"schema":{"type":"string"}},{"description":"","in":"query","name":"entity_type","required":false,"schema":{"type":"string"}},{"description":"","in":"query","name":"limit","required":false,"schema":{"default":100,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"count":{"type":"integer"},"data":{"items":{"properties":{"action":{"nullable":true,"type":"string"},"common_model_id":{"format":"uuid","nullable":true,"type":"string"},"entity":{"type":"object"},"entity_type":{"enum":["player","team","event"],"type":"string"},"ignored_pending":{"type":"boolean"},"mapping_id":{"format":"uuid","type":"string"},"mapping_state":{"enum":["mapped","pending","ignored"],"type":"string"},"match_status":{"nullable":true,"type":"string"},"pending_mapping_id":{"format":"uuid","nullable":true,"type":"string"},"source":{"example":"cbs.basketball.nba","type":"string"},"source_id":{"example":"cbs-breanna-stewart","type":"string"}},"type":"object"},"type":"array"}},"type":"object"}}},"description":"Self-service pending mappings"},"400":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"bad_request","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/bad_request","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"invalid_api_key","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/invalid_api_key","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"forbidden","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/forbidden","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"not_found","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/not_found","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Not Found"},"409":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"conflict","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/conflict","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Conflict"},"422":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"validation_error","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/validation_error","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Validation Error"},"503":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"service_unavailable","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/service_unavailable","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Service Unavailable"}},"summary":"List pending self-service mappings","tags":["Self-Service"]}},"/api/v1/prediction-markets/crypto/windows/{window_id}":{"get":{"callbacks":{},"description":"Alias of the `CRYPTO` league surface (`GET /v1/events/{id}`). Requires the\ntenant-wide `crypto_windows` feature flag. Returns the same\n`CryptoWindow` shape as the list endpoint's `data` entries, evaluated at\nthe current time (not a frozen cursor `as_of`).\n","operationId":"ApiRestWeb.CryptoWindowsController.show","parameters":[{"description":"","in":"path","name":"window_id","required":true,"schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"description":"A calendar-grid crypto up/down window matched across Kalshi, Polymarket\nand Limitless (ParlayX). Identity, cross-venue match classes, each\nconstituent's native IDs, the venue's own lifecycle/result and an\nindicative per-constituent `quote`; SportsStack never computes settlement.\nPrefer the unified `CRYPTO` league surface (`/v1/events`, `/v1/odds`) for new\nintegrations; this endpoint is a documented alias of it.\n\nDiscovery lag (R1): Kalshi and Polymarket pre-list windows, so the next\nwindow is readable before `window_start`. Limitless creates 5m/15m\nmarkets 1-2 windows ahead but creates hourly/daily markets only at\n`window_start` itself, so a missing Limitless hourly/daily constituent\nfor up to 3 minutes after `window_start` is expected lag, not a gap.\n\n`status` is a window-clock computation (`upcoming`/`live`/`ended`\nrelative to `as_of`) and is independent of any constituent's result --\n`ended` does not imply any venue has posted a result yet; check each\nconstituent's own `lifecycle`/`result`.\n\nResult latency and correction bounds, measured from `window_end` (R6):\n\n| Venue | Published within 30 min of window_end | Later |\n|---|---|---|\n| Kalshi, Polymarket | visible within 5 min (live poll) | visible within 20 min (15-min sweep, up to window_end + 24h) |\n| Limitless | visible within 5 min during the first hour (3-min re-checks) | visible within 35 min (30-min re-checks) up to window_end + 24h |\n\nA later or different venue result, or a venue void, corrects the stored\nstate (bumping `result_revision`) up to `window_end` + 24h. A result is\nnever overwritten by a null except by an explicit venue void.\n\nData is retained for 30 days from `window_end`.\n","properties":{"as_of":{"description":"Frozen at the first page of a cursor walk so status stays stable.","format":"date_time","type":"string"},"asset":{"enum":["BTC","ETH","SOL","DOGE"],"type":"string"},"groups":{"items":{"description":"A cross-venue match class for this window. `exact` groups share one\n`family_id` (same window, reference source and tie rule) and are safe to\ntreat as one contract. `same_window_different_reference` groups share a\n`tie_rule` across two or more distinct `reference_source`s (for example\nKalshi's `cf_benchmarks_rti` vs Polymarket/Limitless's\n`chainlink_twap_60s`) -- same window and side convention, different\noracle, and must never be collapsed into `exact`.\n","properties":{"constituents":{"items":{"description":"One venue's native listing for a crypto window: its native IDs\n(`native_market_id`, `native_ref`, and `native_yes_token`/`native_no_token`\nwhen the venue exposes on-chain tokens) and, while the listing is quotable,\nan indicative `quote` from our one-minute poll. `result`/`resolved_at`/\n`end_price` are a pass-through of the venue's own settlement, never a\nSportsStack determination. Clients that need executable prices stream order\nbooks from the venue directly using the native IDs.\n","properties":{"end_price":{"format":"double","nullable":true,"type":"number"},"family_id":{"description":"Shared by every listing with the same window, reference source and tie rule.","format":"uuid","type":"string"},"last_changed_at":{"description":"Fetch time of the feed file that last changed this listing.","format":"date_time","type":"string"},"lifecycle":{"enum":["upcoming","live","closed","resolved","voided"],"type":"string"},"mirror_of":{"description":"For a Limitless listing, the Polymarket slug it mirrors.","nullable":true,"type":"string"},"native_market_id":{"description":"The venue's native market ID.","type":"string"},"native_no_token":{"description":"On-chain CLOB token ID for the Down/No side, when the venue exposes one.","nullable":true,"type":"string"},"native_ref":{"description":"The venue's ticker (Kalshi) or slug (Polymarket, Limitless).","type":"string"},"native_yes_token":{"description":"On-chain CLOB token ID for the Up/Yes side, when the venue exposes one.","nullable":true,"type":"string"},"quote":{"description":"The listing's indicative quote: our one-minute poll capture of the venue's\nprice (`observed_at` is OUR capture time, never a provider clock). `null`\nwhen the listing is not currently quotable: it is not `upcoming`/`live`, its\nwindow has ended, it has no quote, or the quote is older than 15 minutes.\nIndicative, not executable: `stale` is true once `age_ms` exceeds\n`stale_after_ms` (150 s for 5m/15m, 300 s for 1h, 600 s for 1d).\n","nullable":true,"properties":{"age_ms":{"minimum":0,"type":"integer"},"down":{"format":"double","maximum":1,"minimum":0,"type":"number"},"observed_at":{"format":"date_time","type":"string"},"source":{"enum":["kalshi_bid_ask_mid","kalshi_last","polymarket_clob_mid","polymarket_gamma","limitless_clob_mid","limitless_prices"],"type":"string"},"stale":{"type":"boolean"},"stale_after_ms":{"minimum":0,"type":"integer"},"up":{"format":"double","maximum":1,"minimum":0,"type":"number"}},"required":["up","down","source","observed_at","age_ms","stale_after_ms","stale"],"title":"CryptoWindowQuote","type":"object"},"reference_source":{"description":"The oracle/index this listing resolves against. Two listings of the\nsame window with different reference sources are the\n`same_window_different_reference` match class, not `exact` -- they\ncan and do disagree on start price and result even on a near-flat\nwindow. `binance_usdt_1m_noon` is the Binance USDT 1-minute candle at\n12:00 America/New_York, used by Polymarket's daily up/down markets.\n","enum":["cf_benchmarks_rti","chainlink_twap_60s","binance_usdt_1h_candle","binance_usdt_1m_noon"],"type":"string"},"resolved_at":{"format":"date_time","nullable":true,"type":"string"},"result":{"description":"The venue's own result, passed through unchanged. `null` does not\nmean \"no\": a window whose status is `ended` has not necessarily been\nresolved by the venue yet -- see the result-latency notes on the\nparent window.\n","enum":["up","down","split"],"nullable":true,"type":"string"},"result_revision":{"description":"Increments on every terminal-state correction (including voided -> resolved and back).","minimum":0,"type":"integer"},"settlement_value":{"format":"double","nullable":true,"type":"number"},"start_price":{"format":"double","nullable":true,"type":"number"},"tie_rule":{"enum":["up","split"],"type":"string"},"venue":{"enum":["kalshi","polymarket","limitless"],"type":"string"}},"required":["venue","native_market_id","native_ref","reference_source","tie_rule","family_id","lifecycle","result_revision","last_changed_at"],"title":"CryptoWindowConstituent","type":"object"},"minItems":2,"type":"array"},"family_id":{"description":"Set for `exact` groups; null for `same_window_different_reference`.","format":"uuid","nullable":true,"type":"string"},"match_class":{"enum":["exact","same_window_different_reference"],"type":"string"},"tie_rule":{"description":"Set for `same_window_different_reference` groups; null for `exact`.","nullable":true,"type":"string"}},"required":["match_class","constituents"],"title":"CryptoWindowGroup","type":"object"},"type":"array"},"horizon":{"enum":["5m","15m","1h","1d"],"type":"string"},"status":{"description":"Computed relative to `as_of`; does not imply any constituent has a result.","enum":["upcoming","live","ended"],"type":"string"},"unmatched":{"items":{"properties":{"constituent":{"description":"One venue's native listing for a crypto window: its native IDs\n(`native_market_id`, `native_ref`, and `native_yes_token`/`native_no_token`\nwhen the venue exposes on-chain tokens) and, while the listing is quotable,\nan indicative `quote` from our one-minute poll. `result`/`resolved_at`/\n`end_price` are a pass-through of the venue's own settlement, never a\nSportsStack determination. Clients that need executable prices stream order\nbooks from the venue directly using the native IDs.\n","properties":{"end_price":{"format":"double","nullable":true,"type":"number"},"family_id":{"description":"Shared by every listing with the same window, reference source and tie rule.","format":"uuid","type":"string"},"last_changed_at":{"description":"Fetch time of the feed file that last changed this listing.","format":"date_time","type":"string"},"lifecycle":{"enum":["upcoming","live","closed","resolved","voided"],"type":"string"},"mirror_of":{"description":"For a Limitless listing, the Polymarket slug it mirrors.","nullable":true,"type":"string"},"native_market_id":{"description":"The venue's native market ID.","type":"string"},"native_no_token":{"description":"On-chain CLOB token ID for the Down/No side, when the venue exposes one.","nullable":true,"type":"string"},"native_ref":{"description":"The venue's ticker (Kalshi) or slug (Polymarket, Limitless).","type":"string"},"native_yes_token":{"description":"On-chain CLOB token ID for the Up/Yes side, when the venue exposes one.","nullable":true,"type":"string"},"quote":{"description":"The listing's indicative quote: our one-minute poll capture of the venue's\nprice (`observed_at` is OUR capture time, never a provider clock). `null`\nwhen the listing is not currently quotable: it is not `upcoming`/`live`, its\nwindow has ended, it has no quote, or the quote is older than 15 minutes.\nIndicative, not executable: `stale` is true once `age_ms` exceeds\n`stale_after_ms` (150 s for 5m/15m, 300 s for 1h, 600 s for 1d).\n","nullable":true,"properties":{"age_ms":{"minimum":0,"type":"integer"},"down":{"format":"double","maximum":1,"minimum":0,"type":"number"},"observed_at":{"format":"date_time","type":"string"},"source":{"enum":["kalshi_bid_ask_mid","kalshi_last","polymarket_clob_mid","polymarket_gamma","limitless_clob_mid","limitless_prices"],"type":"string"},"stale":{"type":"boolean"},"stale_after_ms":{"minimum":0,"type":"integer"},"up":{"format":"double","maximum":1,"minimum":0,"type":"number"}},"required":["up","down","source","observed_at","age_ms","stale_after_ms","stale"],"title":"CryptoWindowQuote","type":"object"},"reference_source":{"description":"The oracle/index this listing resolves against. Two listings of the\nsame window with different reference sources are the\n`same_window_different_reference` match class, not `exact` -- they\ncan and do disagree on start price and result even on a near-flat\nwindow. `binance_usdt_1m_noon` is the Binance USDT 1-minute candle at\n12:00 America/New_York, used by Polymarket's daily up/down markets.\n","enum":["cf_benchmarks_rti","chainlink_twap_60s","binance_usdt_1h_candle","binance_usdt_1m_noon"],"type":"string"},"resolved_at":{"format":"date_time","nullable":true,"type":"string"},"result":{"description":"The venue's own result, passed through unchanged. `null` does not\nmean \"no\": a window whose status is `ended` has not necessarily been\nresolved by the venue yet -- see the result-latency notes on the\nparent window.\n","enum":["up","down","split"],"nullable":true,"type":"string"},"result_revision":{"description":"Increments on every terminal-state correction (including voided -> resolved and back).","minimum":0,"type":"integer"},"settlement_value":{"format":"double","nullable":true,"type":"number"},"start_price":{"format":"double","nullable":true,"type":"number"},"tie_rule":{"enum":["up","split"],"type":"string"},"venue":{"enum":["kalshi","polymarket","limitless"],"type":"string"}},"required":["venue","native_market_id","native_ref","reference_source","tie_rule","family_id","lifecycle","result_revision","last_changed_at"],"title":"CryptoWindowConstituent","type":"object"},"reason":{"enum":["no_match","mirror_counterpart_missing","mirror_terms_disagree"],"type":"string"}},"required":["reason","constituent"],"title":"CryptoWindowUnmatched","type":"object"},"type":"array"},"window_end":{"format":"date_time","type":"string"},"window_id":{"format":"uuid","type":"string"},"window_start":{"format":"date_time","type":"string"}},"required":["window_id","asset","horizon","window_start","window_end","status","as_of","groups","unmatched"],"title":"CryptoWindow","type":"object"}}},"description":"Crypto window"},"400":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"bad_request","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/bad_request","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"invalid_api_key","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/invalid_api_key","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"forbidden","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/forbidden","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"not_found","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/not_found","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Not Found"},"503":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"service_unavailable","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/service_unavailable","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Service Unavailable"}},"summary":"Get one crypto up/down window","tags":["Prediction Markets"]}},"/api/v1/seasons":{"get":{"callbacks":{},"operationId":"ApiRestWeb.SeasonController.index","parameters":[{"description":"Filter by league ID — accepts a UUID or league abbreviation (e.g., 'NFL', 'NBA')","in":"query","name":"league_id","required":false,"schema":{"type":"string"}},{"description":"Filter by season year","in":"query","name":"season_year","required":false,"schema":{"type":"integer"}},{"description":"Filter by season type (PRE, REG, PST)","in":"query","name":"season_type","required":false,"schema":{"example":"REG","type":"string"}},{"description":"Filter by season status (scheduled, in_progress, closed)","in":"query","name":"status","required":false,"schema":{"example":"closed","type":"string"}},{"description":"Include source mappings from the requested integration (for example, a provider key)","in":"query","name":"return_source_id_format","required":false,"schema":{"type":"string"}},{"description":"When true, add source_mappings_by_source keyed by full normalized source (for example, provider.football.nfl).","in":"query","name":"include_source_mappings_by_source","required":false,"schema":{"default":false,"type":"boolean"}},{"description":"Optional provider-family filter for source_mappings_by_source (for example, a provider key).","in":"query","name":"source_mapping_provider","required":false,"schema":{"type":"string"}},{"description":"Optional full-source filter for source_mappings_by_source in provider.sport.league format.","in":"query","name":"source_mapping_source","required":false,"schema":{"type":"string"}},{"description":"Page number for page/per_page pagination. Do not combine with limit/offset.","in":"query","name":"page","required":false,"schema":{"default":1,"minimum":1,"type":"integer"}},{"description":"Number of items per page (max 1000). Do not combine with limit/offset.","in":"query","name":"per_page","required":false,"schema":{"default":20,"maximum":1000,"minimum":1,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"description":"A season represents a specific time period of competition within a league.\n\nSeasons organize events into distinct time-bound periods with specific start and end dates.\nMost leagues have multiple seasons per year, including preseason, regular season, and postseason.\nSeasons are crucial for organizing statistics, determining standings, and structuring competition.\n\n## Season Types\n- **PRE**: Preseason - exhibition games before the official season starts\n- **REG**: Regular Season - standard competitive games counting toward standings\n- **PST**: Postseason/Playoffs - championship tournament after regular season\n\n## Key Characteristics\n- **Time-Bounded**: Each season has defined start and end dates\n- **League-Specific**: Seasons belong to a specific league\n- **Type-Categorized**: Different rules/importance based on season type\n\n## Examples\n- **NFL 2024 Regular Season**: September 2024 - January 2025\n- **NBA 2023-24 Playoffs**: April 2024 - June 2024\n- **MLB 2024 Preseason**: February 2024 - March 2024\n\n## Key Relationships\n- **League**: Each season belongs to exactly one league\n- **Events**: All games/matches played during the season\n- **Statistics**: Season-scoped performance data aggregated across events\n","example":{"abbreviation":"2024-REG","common_model_id":"a1b2c3d4-5678-90ab-cdef-123456789abc","end_date":"2025-01-05","league_id":"8019d4db-7854-4542-b4af-7265d4b57105","metadata":{"sportradar":{"season_code":"REG","status":"closed"}},"name":"2024 NFL Regular Season","season_type":"REG","season_year":2024,"start_date":"2024-09-05","status":"closed"},"properties":{"abbreviation":{"description":"Short form or code for the season","type":"string"},"common_model_id":{"description":"Unique season identifier in our unified system","type":"string"},"end_date":{"description":"Season end date in ISO 8601 format","example":"2025-01-05","format":"date","type":"string"},"image_url":{"description":"Season logo or branding image URL","type":"string"},"league_id":{"description":"Reference to the league this season belongs to","type":"string"},"metadata":{"description":"Provider-specific metadata and codes","example":{"sportradar":{"name":"2014 Season","season_code":"REG","status":"closed"}},"properties":{"sportradar":{"description":"Provider-specific season metadata","properties":{"name":{"description":"Original provider season name (may be generic like '2014 Season')","example":"2014 Season","type":"string"},"season_code":{"description":"Original provider season type code (REG, PST, AST, etc.)","example":"REG","type":"string"},"status":{"description":"Original provider status value","example":"closed","type":"string"}},"type":"object"}},"type":"object"},"name":{"description":"Human-readable season name (e.g., '2024 Regular Season', '2023-24 Playoffs')","type":"string"},"season_type":{"description":"Type of season: PRE (preseason), REG (regular), PST (postseason)","enum":["PRE","REG","PST","IST","PIT","SC","EX","CC","CT","ALL_STAR"],"example":"REG","type":"string"},"season_year":{"description":"Primary year of the season (e.g., 2024 for 2024-25 NBA season)","example":2024,"type":"integer"},"start_date":{"description":"Season start date in ISO 8601 format","example":"2024-09-05","format":"date","type":"string"},"status":{"description":"Season status (normalized across providers)","enum":["scheduled","in_progress","closed"],"example":"closed","type":"string"}},"required":["name","season_year"],"title":"Season","type":"object"}}},"description":"Season Response"},"401":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"invalid_api_key","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/invalid_api_key","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"not_found","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/not_found","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Not Found"}},"summary":"List Seasons","tags":["Reference"]}},"/api/v1/events/{id}":{"get":{"callbacks":{},"operationId":"ApiRestWeb.EventController.show","parameters":[{"description":"Event ID (UUID)","example":"01c7133f-2999-4803-9872-8c2ab1ba63ac","in":"path","name":"id","required":true,"schema":{"type":"string"}},{"description":"Include the latest event status information (scores, period, game state) for the event. Accepts 'true' or 'false'","in":"query","name":"include_event_status","required":false,"schema":{"default":false,"type":"boolean"}},{"description":"Include detailed scoreboard information for the event. Scoreboard is always included by default.","in":"query","name":"include_scoreboard","required":false,"schema":{"default":true,"type":"boolean"}},{"description":"Include source mappings from the specific integration (i.e. a provider key) will return a source_mappings object with the mappings for the respective objects","in":"query","name":"return_source_id_format","required":false,"schema":{"type":"string"}},{"description":"When true, add source_mappings_by_source keyed by full normalized source (for example, provider.football.nfl).","in":"query","name":"include_source_mappings_by_source","required":false,"schema":{"default":false,"type":"boolean"}},{"description":"Optional provider-family filter for source_mappings_by_source (for example, a provider key).","in":"query","name":"source_mapping_provider","required":false,"schema":{"type":"string"}},{"description":"Optional full-source filter for source_mappings_by_source in provider.sport.league format.","in":"query","name":"source_mapping_source","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"description":"A sporting event represents a single game, match, or competition between participants.\n\nEvents are the core entity around which most sports data revolves. They connect teams/players,\ncontain statistics, betting markets, and live game state information. Events can be scheduled\ngames, ongoing matches, or completed competitions.\n\n## Key Relationships\n- **Participants**: Teams (NFL, NBA) or individual players (Golf, Tennis) competing\n- **Statistics**: Player and team performance data (EventScopedStats)\n- **Markets**: Betting opportunities and odds associated with the event\n- **Live Data**: Real-time scores and game state (EventScoreboard)\n- **Plays**: Individual game actions and play-by-play data\n- **Tournament**: Tournament/playoff structure (tournament_id, tournament_round) for bracket reconstruction\n\n## Event Lifecycle\nEvents progress through various states from scheduling to completion. The status field\nindicates the current phase, while EventScoreboard provides live updates during play.\n\n## Status Values\n- `\"scheduled\"` - Future event, not yet started\n- `\"in_progress\"` - Currently being played with live updates\n- `\"completed\"` - Event finished with final results\n- `\"cancelled\"` - Event cancelled and will not be played\n- `\"postponed\"` - Event delayed/rescheduled to future date\n- `\"time_tbd\"` - Scheduled but specific time not yet determined\n\n## Sport Variations\nParticipant structure varies by sport:\n- **Team Sports** (NFL, NBA, NHL): Two teams with home/away designation\n- **Individual Sports** (Golf, Tennis): Multiple individual players\n- **Head-to-Head** (Tennis, Boxing): Two individual competitors\n","example":{"common_model_id":"4af4c296-6fbc-4705-8660-3b587c252e16","image_url":"https://cdn.example.com/photos/events/lakers-warriors.jpg","league_id":"58e8c89b-72f8-4427-adbc-10f193c9b462","participants":"[]","scheduled_start_time":"2017-10-12T12:00:00Z","season_year":2024,"title":"LAL @ GS","week":1},"properties":{"actual_scope":{"description":"Proven native contract scope, independent of the compatibility endpoint.","enum":["event","race","session","tournament","round","season"],"nullable":true,"type":"string"},"common_model_id":{"description":"Unique event identifier in our unified system","type":"string"},"crypto_window":{"description":"Additive detail on a crypto event (`league_id=CRYPTO`). `groups` is a disjoint\npartition by `family_id`: `alignment` is `exact` (two or more distinct venues\nsharing one family: same window, reference source and tie rule, safe to treat as\none contract), or `single_venue`. A Limitless listing whose mirrored Polymarket\nlisting is missing or disagrees is in `unmatched` (`unverified_mirror`) with its own\n`market_id`, never presented as the shared contract. Markets of the same window on a\ndifferent reference (for example Kalshi's CF Benchmarks RTI vs Polymarket/Limitless's\nChainlink 60s TWAP) are other `market_id`s on the same event, listed per odds row in\n`reference_alignment.different_reference_market_ids`; they can disagree on start price\nand result even on a near-flat window.\n","properties":{"asset":{"enum":["BTC","ETH","SOL","DOGE"],"type":"string"},"groups":{"items":{"properties":{"alignment":{"enum":["exact","single_venue"],"type":"string"},"constituents":{"description":"Present on `/v1/events/{id}` only; list responses omit the constituent detail.","items":{"description":"One venue's native listing for a crypto window: its native IDs\n(`native_market_id`, `native_ref`, and `native_yes_token`/`native_no_token`\nwhen the venue exposes on-chain tokens) and, while the listing is quotable,\nan indicative `quote` from our one-minute poll. `result`/`resolved_at`/\n`end_price` are a pass-through of the venue's own settlement, never a\nSportsStack determination. Clients that need executable prices stream order\nbooks from the venue directly using the native IDs.\n","properties":{"end_price":{"format":"double","nullable":true,"type":"number"},"family_id":{"description":"Shared by every listing with the same window, reference source and tie rule.","format":"uuid","type":"string"},"last_changed_at":{"description":"Fetch time of the feed file that last changed this listing.","format":"date_time","type":"string"},"lifecycle":{"enum":["upcoming","live","closed","resolved","voided"],"type":"string"},"mirror_of":{"description":"For a Limitless listing, the Polymarket slug it mirrors.","nullable":true,"type":"string"},"native_market_id":{"description":"The venue's native market ID.","type":"string"},"native_no_token":{"description":"On-chain CLOB token ID for the Down/No side, when the venue exposes one.","nullable":true,"type":"string"},"native_ref":{"description":"The venue's ticker (Kalshi) or slug (Polymarket, Limitless).","type":"string"},"native_yes_token":{"description":"On-chain CLOB token ID for the Up/Yes side, when the venue exposes one.","nullable":true,"type":"string"},"quote":{"description":"The listing's indicative quote: our one-minute poll capture of the venue's\nprice (`observed_at` is OUR capture time, never a provider clock). `null`\nwhen the listing is not currently quotable: it is not `upcoming`/`live`, its\nwindow has ended, it has no quote, or the quote is older than 15 minutes.\nIndicative, not executable: `stale` is true once `age_ms` exceeds\n`stale_after_ms` (150 s for 5m/15m, 300 s for 1h, 600 s for 1d).\n","nullable":true,"properties":{"age_ms":{"minimum":0,"type":"integer"},"down":{"format":"double","maximum":1,"minimum":0,"type":"number"},"observed_at":{"format":"date_time","type":"string"},"source":{"enum":["kalshi_bid_ask_mid","kalshi_last","polymarket_clob_mid","polymarket_gamma","limitless_clob_mid","limitless_prices"],"type":"string"},"stale":{"type":"boolean"},"stale_after_ms":{"minimum":0,"type":"integer"},"up":{"format":"double","maximum":1,"minimum":0,"type":"number"}},"required":["up","down","source","observed_at","age_ms","stale_after_ms","stale"],"title":"CryptoWindowQuote","type":"object"},"reference_source":{"description":"The oracle/index this listing resolves against. Two listings of the\nsame window with different reference sources are the\n`same_window_different_reference` match class, not `exact` -- they\ncan and do disagree on start price and result even on a near-flat\nwindow. `binance_usdt_1m_noon` is the Binance USDT 1-minute candle at\n12:00 America/New_York, used by Polymarket's daily up/down markets.\n","enum":["cf_benchmarks_rti","chainlink_twap_60s","binance_usdt_1h_candle","binance_usdt_1m_noon"],"type":"string"},"resolved_at":{"format":"date_time","nullable":true,"type":"string"},"result":{"description":"The venue's own result, passed through unchanged. `null` does not\nmean \"no\": a window whose status is `ended` has not necessarily been\nresolved by the venue yet -- see the result-latency notes on the\nparent window.\n","enum":["up","down","split"],"nullable":true,"type":"string"},"result_revision":{"description":"Increments on every terminal-state correction (including voided -> resolved and back).","minimum":0,"type":"integer"},"settlement_value":{"format":"double","nullable":true,"type":"number"},"start_price":{"format":"double","nullable":true,"type":"number"},"tie_rule":{"enum":["up","split"],"type":"string"},"venue":{"enum":["kalshi","polymarket","limitless"],"type":"string"}},"required":["venue","native_market_id","native_ref","reference_source","tie_rule","family_id","lifecycle","result_revision","last_changed_at"],"title":"CryptoWindowConstituent","type":"object"},"type":"array"},"family_id":{"format":"uuid","type":"string"},"market_id":{"format":"uuid","type":"string"},"reference_source":{"type":"string"},"tie_rule":{"enum":["up","split"],"type":"string"},"venues":{"items":{"type":"string"},"type":"array"}},"required":["market_id","venues","alignment"],"type":"object"},"type":"array"},"horizon":{"enum":["5m","15m","1h","1d"],"type":"string"},"unmatched":{"items":{"properties":{"alignment":{"enum":["unverified_mirror"],"type":"string"},"constituent":{"description":"One venue's native listing for a crypto window: its native IDs\n(`native_market_id`, `native_ref`, and `native_yes_token`/`native_no_token`\nwhen the venue exposes on-chain tokens) and, while the listing is quotable,\nan indicative `quote` from our one-minute poll. `result`/`resolved_at`/\n`end_price` are a pass-through of the venue's own settlement, never a\nSportsStack determination. Clients that need executable prices stream order\nbooks from the venue directly using the native IDs.\n","properties":{"end_price":{"format":"double","nullable":true,"type":"number"},"family_id":{"description":"Shared by every listing with the same window, reference source and tie rule.","format":"uuid","type":"string"},"last_changed_at":{"description":"Fetch time of the feed file that last changed this listing.","format":"date_time","type":"string"},"lifecycle":{"enum":["upcoming","live","closed","resolved","voided"],"type":"string"},"mirror_of":{"description":"For a Limitless listing, the Polymarket slug it mirrors.","nullable":true,"type":"string"},"native_market_id":{"description":"The venue's native market ID.","type":"string"},"native_no_token":{"description":"On-chain CLOB token ID for the Down/No side, when the venue exposes one.","nullable":true,"type":"string"},"native_ref":{"description":"The venue's ticker (Kalshi) or slug (Polymarket, Limitless).","type":"string"},"native_yes_token":{"description":"On-chain CLOB token ID for the Up/Yes side, when the venue exposes one.","nullable":true,"type":"string"},"quote":{"description":"The listing's indicative quote: our one-minute poll capture of the venue's\nprice (`observed_at` is OUR capture time, never a provider clock). `null`\nwhen the listing is not currently quotable: it is not `upcoming`/`live`, its\nwindow has ended, it has no quote, or the quote is older than 15 minutes.\nIndicative, not executable: `stale` is true once `age_ms` exceeds\n`stale_after_ms` (150 s for 5m/15m, 300 s for 1h, 600 s for 1d).\n","nullable":true,"properties":{"age_ms":{"minimum":0,"type":"integer"},"down":{"format":"double","maximum":1,"minimum":0,"type":"number"},"observed_at":{"format":"date_time","type":"string"},"source":{"enum":["kalshi_bid_ask_mid","kalshi_last","polymarket_clob_mid","polymarket_gamma","limitless_clob_mid","limitless_prices"],"type":"string"},"stale":{"type":"boolean"},"stale_after_ms":{"minimum":0,"type":"integer"},"up":{"format":"double","maximum":1,"minimum":0,"type":"number"}},"required":["up","down","source","observed_at","age_ms","stale_after_ms","stale"],"title":"CryptoWindowQuote","type":"object"},"reference_source":{"description":"The oracle/index this listing resolves against. Two listings of the\nsame window with different reference sources are the\n`same_window_different_reference` match class, not `exact` -- they\ncan and do disagree on start price and result even on a near-flat\nwindow. `binance_usdt_1m_noon` is the Binance USDT 1-minute candle at\n12:00 America/New_York, used by Polymarket's daily up/down markets.\n","enum":["cf_benchmarks_rti","chainlink_twap_60s","binance_usdt_1h_candle","binance_usdt_1m_noon"],"type":"string"},"resolved_at":{"format":"date_time","nullable":true,"type":"string"},"result":{"description":"The venue's own result, passed through unchanged. `null` does not\nmean \"no\": a window whose status is `ended` has not necessarily been\nresolved by the venue yet -- see the result-latency notes on the\nparent window.\n","enum":["up","down","split"],"nullable":true,"type":"string"},"result_revision":{"description":"Increments on every terminal-state correction (including voided -> resolved and back).","minimum":0,"type":"integer"},"settlement_value":{"format":"double","nullable":true,"type":"number"},"start_price":{"format":"double","nullable":true,"type":"number"},"tie_rule":{"enum":["up","split"],"type":"string"},"venue":{"enum":["kalshi","polymarket","limitless"],"type":"string"}},"required":["venue","native_market_id","native_ref","reference_source","tie_rule","family_id","lifecycle","result_revision","last_changed_at"],"title":"CryptoWindowConstituent","type":"object"},"market_id":{"format":"uuid","type":"string"},"reason":{"enum":["mirror_counterpart_missing","mirror_terms_disagree"],"type":"string"},"venues":{"items":{"type":"string"},"type":"array"}},"required":["market_id","alignment","reason"],"type":"object"},"type":"array"},"window_end":{"format":"date_time","type":"string"},"window_start":{"format":"date_time","type":"string"}},"required":["asset","horizon","window_start","window_end","groups","unmatched"],"title":"CryptoEventWindow","type":"object"},"event_scoreboard":{"description":"Live event status with real-time scores, period, and game state information.\n\nContains dynamic/live game data that updates throughout the event. For comprehensive\nsport-specific details and field explanations, see the EventScoreboard model documentation.\n\n## Core Fields\n- **Basic Info**: sport, league, event_id\n- **Game State**: period, time_on_clock, period_half (sport-specific), status\n- **Scoring**: home_score, away_score (for team sports), periods (linescore)\n- **Details**: Sport-specific data in JSONB format\n- **Freshness**: response_received_at — when the provider observed this state\n- **Serving provenance** (additive): observed_at, served_at, source_rank — which provider\n  row was served, its rank in the live primary order, and why it won\n\n## Rendering a live clock\n`time_on_clock` is a point-in-time observation, not a ticking value; we refresh\nit as fast as the provider reports it. To render a smooth clock, tick locally\nfrom `time_on_clock` using `response_received_at` as the anchor and resync on\neach response. For timed sports `details.clock_running` says whether the clock\nshould be advancing — `null` means the provider did not tell us, which is\ndistinct from a known-stopped clock.\n\n## Period Numbering by Sport\n- **Football**: 1-4 (quarters), 5+ (overtime)\n- **Basketball**: 1-4 (quarters), 5+ (overtime)\n- **Baseball**: 1-9+ (innings)\n- **Hockey**: 1-3 (periods), 4+ (overtime)\n- **Golf**: 1-4 (rounds)\n","example":{"away_score":10,"common_model_id":"123e4567-e89b-12d3-a456-426614174000","details":{"away_timeouts":2,"distance":8,"down":2,"home_timeouts":3,"possession_team_id":"123e4567-e89b-12d3-a456-426614174002","red_zone":false,"wall_clock":"2024-01-15T15:32:08Z","yard_line":35},"event_id":"123e4567-e89b-12d3-a456-426614174001","home_score":14,"inserted_at":"2024-01-15T15:30:00Z","league":"NFL","observed_at":"2024-01-15T15:32:09Z","period":2,"response_received_at":"2024-01-15T15:32:10Z","served_at":"2024-01-15T15:32:11Z","source_rank":{"provider":"sportsstack","rank":null,"reason":null},"sport":"football","status":"in_progress","time_on_clock":"14:30","updated_at":"2024-01-15T15:32:15Z"},"properties":{"away_score":{"description":"Away team total score (null for individual sports like golf)","example":10,"type":"integer"},"common_model_id":{"description":"Event Status ID","format":"uuid","type":"string"},"details":{"additionalProperties":true,"description":"Sport-specific game state for a served scoreboard. Two formats exist.\n\n## Current format (what is served today)\n\nThe keys, nesting and value types of `details` depend on the data source that\nprovided the scoreboard row. For one event, `details` can be an object from one\nsource and `null` from another, and a key can be absent, `null` or populated\ndepending on the source. Treat every field as optional. Responses in this format\ndo not contain `details_version`. The property list below describes the keys that\ncan appear; not every source provides every key, and the same key can have a\ndifferent shape for different sources.\n\n## Current format reference\n\n### Dynamic game state\nThe details field contains live, sport-specific information that changes throughout\nthe game. Unlike static event information, this data updates in real-time as the\ngame progresses.\n\n### Sport-specific structures\nEach sport has its own set of relevant game state data:\n\n#### Football (Flattened Fields)\n- **Game State**: down, distance, yard_line, possession_team_id, red_zone, goal_to_go\n- **Clock Management**: play_clock, game_clock, clock_running, two_minute_warning, inside_two_minutes\n- **Timeouts**: home_timeouts, away_timeouts\n- **Weather (Flattened)**: weather_temperature, weather_condition, weather_wind_speed, weather_wind_direction, weather_humidity, weather_precipitation, wind_affecting_kicking, precipitation\n- **Analytics**: field_goal_range, touchdown_probability, turnover_on_downs_risk\n- **Game Info**: attendance, neutral_site, duration\n\n#### Basketball (Flattened Fields)\n- **Clock State**: shot_clock, shot_clock_running, game_clock, clock_running\n- **Fouls & Bonus**: home_team_fouls, away_team_fouls, home_bonus, away_bonus, home_double_bonus, away_double_bonus\n- **Timeouts**: home_timeouts, away_timeouts\n- **Free Throws (Flattened)**: free_throw_shooter_id, free_throw_shooter_name, free_throw_shots_awarded, free_throw_shots_made, free_throw_shots_attempted, free_throw_technical_foul, free_throw_flagrant_foul, free_throw_and_one, free_throw_clear_path_foul, free_throw_bonus_situation, free_throw_current_attempt\n- **Game Flow**: intermission, overtime_number, last_play, last_score_team_id, last_score_time, possession_arrow\n- **Analytics**: pace, lead_changes, times_tied, home_biggest_lead, away_biggest_lead, home_shooting_foul_trouble, away_shooting_foul_trouble\n- **Game Info**: attendance\n\n#### Baseball (Flattened Fields)\n- **Count**: balls, strikes, outs\n- **Hitter (Flattened)**: hitter_id, hitter_full_name, hitter_ab_over, hitter_outcome_id\n- **Pitcher (Flattened)**: pitcher_id, pitcher_full_name, pitcher_pitch_speed, pitcher_pitch_type, pitcher_pitch_x, pitcher_pitch_y, pitcher_pitch_zone\n- **Baserunners**: runners_on_base (array of maps), runners_count\n\n#### Hockey (Flattened Fields)\n- **Power Play**: man_advantage, power_play_time_remaining, home_on_power_play, away_on_power_play, penalty_kill_percentage\n- **Goalies**: home_goalie_pulled, away_goalie_pulled, empty_net, home_goalie_id, away_goalie_id\n- **Clock**: game_clock, clock_running, intermission, overtime_type\n- **Shootout**: in_shootout, shootout_round, home_shootout_goals, away_shootout_goals, shootout_attempts, shootout_attempts_count\n- **Penalties**: active_penalties (array of maps), active_penalties_count\n- **Game Flow**: last_faceoff_winner, faceoff_location, last_goal_time, last_goal_team_id, last_penalty_time\n- **Team Stats**: shots_on_goal_home, shots_on_goal_away, face_off_wins_home, face_off_wins_away, hits_home, hits_away, blocked_shots_home, blocked_shots_away\n\n#### Soccer (Flattened Fields)\n- **State**: match_status (`first_half`, `halftime`, `second_half`, `extra_time_first_half`, `extra_time_second_half`, `penalties`, `ended`; `not_started` and `postponed` also occur in both formats), match_minute (elapsed clock, `\"MM:SS\"`, stoppage time excluded)\n- **Stoppage Time**: added_time_announced, added_time_played (`\"MM:SS\"`)\n- **Cards**: home_yellow_cards, away_yellow_cards, home_red_cards, away_red_cards (red cards include second-yellow dismissals)\n- **Substitutions**: home_substitutions, away_substitutions\n- **Team Stats**: home_possession, away_possession (percent, 0-100), home_shots, away_shots, home_shots_on_target, away_shots_on_target, home_corners, away_corners\n- **Shootout**: shootout (`{home_score, away_score}`), present only once a penalty shootout has been reached\n- **Regulation Score**: regulation_score (`{home_score, away_score}`), the 90-minute score, present only once a match goes past regulation (top-level `home_score`/`away_score` include extra time but not the shootout)\n\n#### Golf (Embedded Objects)\n- **Tournament State**: round_number, total_rounds, holes_completed, current_hole, cut_line, cut_made, playoff_status, playoff_type, tournament_complete\n- **Course Conditions**: par_for_course, course_length, wind_speed, wind_direction, temperature, weather_condition, course_conditions\n- **Field Info**: field_size, players_made_cut, scoring_average\n- **Leaders**: driving_distance_leader, greens_in_regulation_leader, putting_average_leader\n- **Detailed Data**: leaderboard (array), featured_players (array), featured_hole (object)\n\n### Data structure strategy\nMost fields are flattened, with nested objects used where noted.\n\n### Array fields for complex data\nSome complex data structures use arrays of maps:\n- **runners_on_base**: Baseball baserunner positions and details (array of maps)\n- **active_penalties**: Hockey penalty details and timing information (array of maps)\n- **shootout_attempts**: Hockey shootout attempt details (array of maps)\n- **leaderboard**: Golf leaderboard entries (array of embedded objects)\n\n## `details_version` 1 format (selected per account)\n\nAccounts can be switched to a fixed per-sport format that does not depend on the\ndata source. Until an account is switched it receives the current format. A response\nin the new format is recognised by `details_version` = `1`. The exact keys for each\nsport are the component schemas `ScoreboardDetailsV1Football`,\n`ScoreboardDetailsV1Basketball`, `ScoreboardDetailsV1Baseball`,\n`ScoreboardDetailsV1Hockey` (also used for `ice_hockey`), `ScoreboardDetailsV1Soccer`,\n`ScoreboardDetailsV1Tennis` and `ScoreboardDetailsV1Other`.\n\n1. For every sport except golf and motorsports (see 8), `details` is always a JSON object\n   when a scoreboard is returned; it is never `null`.\n2. For football, basketball, baseball, hockey, ice_hockey, soccer and tennis, every key of that\n   sport's schema is present in every response.\n3. A key whose value is not known is `null`. `null` means \"not reported\". It never\n   stands for `0`, `false`, an empty string or an empty list; those values appear only\n   when the source reported them (an empty string is itself returned as `null`). A\n   source that itself reports a default value, for example a zero count before play\n   starts, has that value passed through: the format does not guess which zeros are\n   real. A baseball runner map in which every base is empty is returned as an empty\n   list with a count of `0`.\n4. Each key has one type. Values are taken from the source, with these normalizations:\n   a source's status text is mapped to the `match_status` values; clock text is read\n   into `match_minute` and the added-time keys; baseball runners that a source gives as\n   a map by base are returned as a list and `runners_count` is computed from it; and the\n   shootout and regulation scores are read from period scores where a source reports\n   them that way. A value that cannot be expressed as the key's type is returned as\n   `null`. That includes: a number that is negative (except temperature and pitch\n   location, which may be negative) or above 1e12; a count that is not a whole JSON\n   integer (text such as `\"2\"`, or any number with a decimal point such as `2.9` or\n   `2.0`) or that is above 1,000,000,000; numeric text in a number key; a possession\n   percentage above 100; a score pair with a side that is negative, above 1,000,000,000\n   or not a whole integer; a runner list or map with an entry that has no valid base,\n   repeats a base, or (in map form) holds a value that is neither text nor empty, in which case the\n   runners are `null` together with their count; a game clock that is not `m:ss` text\n   (minutes of one to three digits, seconds 00-59, and an optional fraction on the\n   seconds), and a soccer match minute or added time that is not exactly `m:ss`;\n   text of the form `prefix:type:value`; and an empty or blank string. Runners are\n   returned in base order. In a runner list, a name that is not text, or that has the\n   `prefix:type:value` form, is left out of that runner and the runner is kept. A\n   runner map by base carries player identifiers, so no names are returned from it; a\n   base that holds blank text counts as empty.\n5. Only the keys listed in the sport's schema are returned. For football, basketball,\n   baseball, hockey, ice_hockey and soccer, every key of that sport in the property list\n   below that does not carry a source identifier is in the schema. Tennis has one key,\n   `retirement_info`, which is not in the property list. Not returned in this format:\n   keys that carry a source identifier (player, team and goalie IDs, and similar), and\n   keys of the current format that are not in the property list (for example nested\n   baseball count and runner details, per-period linescores, match situation and\n   referee detail). Switching an account removes them from its responses.\n6. Changing the data source for an event does not change the key set, the types or the\n   meaning of `null`. Values can change.\n7. The format has no keys that carry a source identifier, and text of the form\n   `prefix:type:value` (one to ten ASCII letters, a colon, ASCII letters or underscores, a colon,\n   then text without whitespace; case-insensitive; surrounding whitespace ignored) is\n   `null`. Free text is not inspected beyond that. `possession_team_id` is a UUID in its\n   36-character text form (returned in lower case) or `null`; it is not checked against\n   the team list. Golf and motorsports are served as stored (see 8) and can contain\n   source identifiers.\n8. Golf and motorsports are not shaped by this format: their `details` are the stored\n   object, carry no `details_version`, and can contain source identifiers (an account\n   that holds no provider-data entitlement may have provider-id values removed from them\n   by a separate step). A scoreboard whose sport is not one of the sports named above,\n   including a sport stored as an identifier instead of a name, is treated as any other\n   sport. Sport names are matched ignoring case and surrounding whitespace (any Unicode space). For any other sport\n   (for example MMA) the object is exactly `{\"details_version\": 1}`.\n\n## When no scoreboard is available\n\nThe scoreboard object is absent as a whole; it is not returned with empty `details`:\n\n* `GET /api/v1/events/{id}/event-scoreboard` and `GET /api/v1/events/{id}/linescore`\n  return `404`.\n* `GET /api/v1/events` and `GET /api/v1/events/{id}` omit `event_scoreboard`.\n* `GET /api/v1/tournaments/{id}/bracket` returns `event_scoreboard: null`.\n\nA scoreboard is returned only from data you are entitled to receive. Data you are not\nentitled to is treated as if it did not exist.\n\nThis is different from an unknown value inside a returned scoreboard, which is a\n`null` key in the `details_version` 1 format.\n","example":{"goal_to_go":false,"away_yellow_cards":1,"runners_count":2,"home_timeouts":2,"match_status":"second_half","weather_wind_speed":8.0,"yard_line":25,"hitter_id":"player-123","possession_team_id":"123e4567-e89b-12d3-a456-426614174002","away_timeouts":3,"home_on_power_play":true,"touchdown_probability":0.35,"added_time_played":"00:00","weather_temperature":45.0,"active_penalties_count":1,"away_corners":2,"wind_affecting_kicking":false,"regulation_score":{"away_score":3,"home_score":0},"away_red_cards":1,"runners_on_base":[{"base":1,"ending_base":2,"id":"player-789"},{"base":3,"ending_base":3,"id":"player-012"}],"pitcher_id":"player-456","pitcher_full_name":"Jane Smith","shootout":{"away_score":4,"home_score":3},"home_substitutions":3,"away_substitutions":2,"added_time_announced":"04:00","home_possession":56,"strikes":1,"away_shots":7,"shots_on_goal_home":15,"home_yellow_cards":2,"balls":2,"home_corners":6,"away_possession":44,"home_shots_on_target":5,"details_version":1,"weather_humidity":65,"neutral_site":false,"attendance":72000,"hitter_full_name":"John Doe","outs":2,"distance":7,"play_clock":25,"inside_two_minutes":false,"away_on_power_play":false,"red_zone":true,"game_clock":"8:42","man_advantage":"5v4","power_play_time_remaining":82,"weather_wind_direction":"NW","two_minute_warning":false,"pitcher_pitch_speed":95.5,"home_red_cards":0,"weather_condition":"clear","down":3,"clock_running":true,"match_minute":"67:12","precipitation":false,"home_shots":11,"shots_on_goal_away":12,"away_shots_on_target":3,"turnover_on_downs_risk":0.15,"active_penalties":[{"major_penalty":false,"penalty_type":"Cross-checking","player_id":"player-789","time_remaining":82}],"field_goal_range":true,"weather_precipitation":false},"properties":{"penalty_kill_percentage":{"description":"Current penalty kill success rate","type":"number"},"holes_completed":{"description":"Holes finished in current round","type":"integer"},"course_conditions":{"description":"Course conditions","type":"string"},"home_biggest_lead":{"description":"Biggest home team lead","type":"integer"},"pitcher_pitch_x":{"description":"Pitch location X coordinate","type":"number"},"shootout_attempts_count":{"description":"Total shootout attempts","type":"integer"},"away_shooting_foul_trouble":{"description":"Away team in foul trouble","type":"boolean"},"goal_to_go":{"description":"Goal line is closer than first down marker","type":"boolean"},"away_yellow_cards":{"description":"Soccer away yellow cards","type":"integer"},"shootout_round":{"description":"Current shootout round","type":"integer"},"runners_count":{"description":"Number of runners on base","type":"integer"},"home_timeouts":{"description":"Home team timeouts remaining","type":"integer"},"wall_clock":{"description":"Provider wall-clock timestamp for the most recent game event","format":"date-time","type":"string"},"home_bonus":{"description":"Home team in bonus situation","type":"boolean"},"match_status":{"description":"Soccer match phase","enum":["first_half","halftime","second_half","extra_time_first_half","extra_time_second_half","penalties","ended"],"type":"string"},"last_play":{"description":"Description of last play","type":"string"},"hitter_ab_over":{"description":"At-bat is complete","type":"boolean"},"weather_wind_speed":{"description":"Wind speed (mph)","type":"number"},"home_double_bonus":{"description":"Home team in double bonus","type":"boolean"},"yard_line":{"description":"Field position (0-100)","type":"integer"},"hitter_id":{"description":"Current batter player ID","type":"string"},"times_tied":{"description":"Number of times tied","type":"integer"},"last_goal_time":{"description":"Time of last goal","type":"string"},"home_goalie_pulled":{"description":"Home goalie pulled","type":"boolean"},"lead_changes":{"description":"Number of lead changes","type":"integer"},"tournament_complete":{"description":"Tournament finished","type":"boolean"},"possession_team_id":{"description":"Common-model team ID with possession","format":"uuid","type":"string"},"wind_direction":{"description":"Wind direction","type":"string"},"away_timeouts":{"description":"Away team timeouts remaining","type":"integer"},"free_throw_shots_awarded":{"description":"Number of free throws awarded","type":"integer"},"home_on_power_play":{"description":"Home team on power play","type":"boolean"},"home_team_fouls":{"description":"Home team fouls this period/half","type":"integer"},"touchdown_probability":{"description":"Probability of touchdown (0.0-1.0)","type":"number"},"added_time_played":{"description":"Soccer stoppage time played so far in the current period (MM:SS)","example":"01:26","type":"string"},"weather_temperature":{"description":"Temperature (Fahrenheit)","type":"number"},"duration":{"description":"Game duration","type":"string"},"overtime_type":{"description":"Type of overtime","enum":["3v3","4v4","shootout"],"type":"string"},"course_length":{"description":"Course length in yards","type":"integer"},"shot_clock_running":{"description":"Whether shot clock is running","type":"boolean"},"active_penalties_count":{"description":"Number of active penalties","type":"integer"},"current_hole":{"description":"Hole currently being played","type":"integer"},"away_corners":{"description":"Soccer away corner kicks","type":"integer"},"wind_affecting_kicking":{"description":"Wind affecting field goals/punts","type":"boolean"},"regulation_score":{"description":"Soccer 90-minute score. Present only once a match goes past regulation (extra time).","properties":{"away_score":{"type":"integer"},"home_score":{"type":"integer"}},"type":"object"},"free_throw_clear_path_foul":{"description":"Free throws from clear path foul","type":"boolean"},"hits_home":{"description":"Home team hits","type":"integer"},"shootout_attempts":{"description":"Shootout attempts with details","items":{"properties":{"goalie_id":{"description":"Goalie player ID","type":"string"},"is_deciding_goal":{"description":"Was the deciding goal","type":"boolean"},"result":{"description":"Shot result","type":"string"},"round":{"description":"Shootout round","type":"integer"},"shooter_id":{"description":"Shooter player ID","type":"string"},"shooter_name":{"description":"Shooter name","type":"string"},"shooter_team_id":{"description":"Shooter's team","type":"string"}},"type":"object"},"type":"array"},"playoff_type":{"description":"Type of playoff","enum":["sudden_death","aggregate","match_play"],"type":"string"},"away_red_cards":{"description":"Soccer away red cards (includes second-yellow dismissals)","type":"integer"},"free_throw_current_attempt":{"description":"Current free throw attempt number","type":"integer"},"runners_on_base":{"description":"Baserunners with positions and details","items":{"properties":{"base":{"description":"Starting base (1, 2, 3)","type":"integer"},"ending_base":{"description":"Ending base after play","type":"integer"},"full_name":{"description":"Runner name, when known","type":"string"},"id":{"description":"Player ID","type":"string"}},"type":"object"},"type":"array"},"cut_made":{"description":"Has cut been applied","type":"boolean"},"pitcher_id":{"description":"Current pitcher player ID","type":"string"},"pitcher_full_name":{"description":"Current pitcher name","type":"string"},"shootout":{"description":"Soccer penalty shootout score. Present only once penalties are reached.","properties":{"away_score":{"type":"integer"},"home_score":{"type":"integer"}},"type":"object"},"faceoff_location":{"description":"Location of last faceoff","type":"string"},"home_substitutions":{"description":"Soccer home substitutions made","type":"integer"},"wind_speed":{"description":"Wind speed (mph)","type":"number"},"shot_clock":{"description":"Shot clock seconds remaining","type":"integer"},"away_substitutions":{"description":"Soccer away substitutions made","type":"integer"},"pitcher_pitch_zone":{"description":"Strike zone location","type":"integer"},"added_time_announced":{"description":"Soccer stoppage time announced by the fourth official (MM:SS)","example":"02:00","type":"string"},"free_throw_technical_foul":{"description":"Free throws from technical foul","type":"boolean"},"home_possession":{"description":"Soccer home ball possession percentage","maximum":100,"minimum":0,"type":"number"},"putting_average_leader":{"description":"Putting average leader player ID","type":"string"},"home_shooting_foul_trouble":{"description":"Home team in foul trouble","type":"boolean"},"strikes":{"description":"Strike count (0-2)","type":"integer"},"greens_in_regulation_leader":{"description":"GIR leader player ID","type":"string"},"away_biggest_lead":{"description":"Biggest away team lead","type":"integer"},"face_off_wins_away":{"description":"Away team faceoff wins","type":"integer"},"last_goal_team_id":{"description":"Team that scored last goal","type":"string"},"away_double_bonus":{"description":"Away team in double bonus","type":"boolean"},"away_shots":{"description":"Soccer away total shots","type":"integer"},"temperature":{"description":"Temperature (Fahrenheit)","type":"integer"},"last_penalty_time":{"description":"Time of last penalty","type":"string"},"last_score_team_id":{"description":"Team that scored last","type":"string"},"free_throw_and_one":{"description":"And-one free throw situation","type":"boolean"},"shots_on_goal_home":{"description":"Home team shots on goal","type":"integer"},"home_yellow_cards":{"description":"Soccer home yellow cards","type":"integer"},"free_throw_flagrant_foul":{"description":"Free throws from flagrant foul","type":"boolean"},"in_shootout":{"description":"Currently in shootout","type":"boolean"},"playoff_status":{"description":"Tournament in playoff","type":"boolean"},"away_goalie_id":{"description":"Current away goalie player ID","type":"string"},"balls":{"description":"Ball count (0-3)","type":"integer"},"home_corners":{"description":"Soccer home corner kicks","type":"integer"},"home_shootout_goals":{"description":"Home team shootout goals","type":"integer"},"pitcher_pitch_type":{"description":"Last pitch type","type":"string"},"away_possession":{"description":"Soccer away ball possession percentage","maximum":100,"minimum":0,"type":"number"},"scoring_average":{"description":"Current round scoring average","type":"number"},"empty_net":{"description":"Empty net situation","type":"boolean"},"home_shots_on_target":{"description":"Soccer home shots on target","type":"integer"},"away_bonus":{"description":"Away team in bonus situation","type":"boolean"},"details_version":{"description":"Version of the details contract. Present and `1` in the contract format; absent in legacy provider-shaped objects.","example":1,"type":"integer"},"weather_humidity":{"description":"Humidity percentage","type":"integer"},"neutral_site":{"description":"Neutral site game","type":"boolean"},"free_throw_shots_made":{"description":"Free throws made so far","type":"integer"},"attendance":{"description":"Game attendance","type":"integer"},"total_rounds":{"description":"Total tournament rounds","type":"integer"},"hitter_full_name":{"description":"Current batter name","type":"string"},"pace":{"description":"Possessions per 48 minutes","type":"number"},"outs":{"description":"Outs in inning (0-2)","type":"integer"},"round_number":{"description":"Current round (1-4+)","type":"integer"},"free_throw_shooter_name":{"description":"Name of free throw shooter","type":"string"},"cut_line":{"description":"Score needed to make cut","type":"integer"},"distance":{"description":"Yards to go for first down","type":"integer"},"free_throw_shooter_id":{"description":"Player ID shooting free throws","type":"string"},"field_size":{"description":"Total number of players","type":"integer"},"play_clock":{"description":"Seconds on play clock","type":"integer"},"hits_away":{"description":"Away team hits","type":"integer"},"inside_two_minutes":{"description":"Less than two minutes remaining","type":"boolean"},"driving_distance_leader":{"description":"Driving distance leader player ID","type":"string"},"home_goalie_id":{"description":"Current home goalie player ID","type":"string"},"intermission":{"description":"Between periods/halves","type":"boolean"},"hitter_outcome_id":{"description":"At-bat outcome identifier","type":"string"},"blocked_shots_away":{"description":"Away team blocked shots","type":"integer"},"away_on_power_play":{"description":"Away team on power play","type":"boolean"},"last_faceoff_winner":{"description":"Team that won last faceoff","enum":["home","away"],"type":"string"},"red_zone":{"description":"In red zone (20 yards or less)","type":"boolean"},"game_clock":{"description":"Current game clock time","type":"string"},"man_advantage":{"description":"Current man advantage (e.g., '5v4', 'even')","type":"string"},"blocked_shots_home":{"description":"Home team blocked shots","type":"integer"},"away_goalie_pulled":{"description":"Away goalie pulled","type":"boolean"},"power_play_time_remaining":{"description":"Seconds remaining on power play","type":"integer"},"weather_wind_direction":{"description":"Wind direction","type":"string"},"players_made_cut":{"description":"Players making the cut","type":"integer"},"par_for_course":{"description":"Course par","type":"integer"},"two_minute_warning":{"description":"Two minute warning called","type":"boolean"},"pitcher_pitch_speed":{"description":"Last pitch speed (mph)","type":"number"},"possession_arrow":{"description":"Possession arrow (college)","enum":["home","away"],"type":"string"},"away_shootout_goals":{"description":"Away team shootout goals","type":"integer"},"free_throw_shots_attempted":{"description":"Free throws attempted so far","type":"integer"},"home_red_cards":{"description":"Soccer home red cards (includes second-yellow dismissals)","type":"integer"},"weather_condition":{"description":"Weather condition","type":"string"},"away_team_fouls":{"description":"Away team fouls this period/half","type":"integer"},"pitcher_pitch_y":{"description":"Pitch location Y coordinate","type":"number"},"down":{"description":"Current down (1-4)","type":"integer"},"last_score_time":{"description":"When last score occurred","type":"string"},"clock_running":{"description":"Whether game clock is running","type":"boolean"},"overtime_number":{"description":"Which overtime period","type":"integer"},"match_minute":{"description":"Soccer elapsed match clock as MM:SS (stoppage time excluded). Tick locally between updates.","example":"45:00","type":"string"},"precipitation":{"description":"Active precipitation","type":"boolean"},"home_shots":{"description":"Soccer home total shots","type":"integer"},"shots_on_goal_away":{"description":"Away team shots on goal","type":"integer"},"away_shots_on_target":{"description":"Soccer away shots on target","type":"integer"},"turnover_on_downs_risk":{"description":"Probability of turnover on downs (0.0-1.0)","type":"number"},"active_penalties":{"description":"Currently active penalties with details","items":{"properties":{"duration":{"description":"Penalty duration in minutes","type":"integer"},"major_penalty":{"description":"Is major penalty","type":"boolean"},"misconduct":{"description":"Is misconduct penalty","type":"boolean"},"penalty_start_time":{"description":"When penalty started","type":"string"},"penalty_type":{"description":"Type of penalty","type":"string"},"player_id":{"description":"Penalized player ID","type":"string"},"player_name":{"description":"Penalized player name","type":"string"},"team_id":{"description":"Team of penalized player","type":"string"},"time_remaining":{"description":"Time remaining in seconds","type":"integer"}},"type":"object"},"type":"array"},"field_goal_range":{"description":"Within field goal range","type":"boolean"},"free_throw_bonus_situation":{"description":"Free throws from bonus","type":"boolean"},"weather_precipitation":{"description":"Is it precipitating","type":"boolean"},"face_off_wins_home":{"description":"Home team faceoff wins","type":"integer"}},"type":"object"},"event_id":{"description":"Event ID","format":"uuid","type":"string"},"home_score":{"description":"Home team total score (null for individual sports like golf)","example":14,"type":"integer"},"inserted_at":{"description":"Creation timestamp","format":"date-time","type":"string"},"league":{"description":"League abbreviation","example":"NFL","type":"string"},"observed_at":{"description":"Provider observation time of the served row (the elected row's own observation; unlike response_received_at it is never taken from a clock donor). Null when unknown.","example":"2024-01-15T15:32:09Z","format":"date-time","nullable":true,"type":"string"},"period":{"description":"Current period/quarter/inning (1-based, sport-specific numbering)","example":2,"type":"integer"},"period_half":{"description":"Period subdivision (e.g., 'top'/'bottom' for baseball innings)","enum":["top","bottom"],"example":"bottom","type":"string"},"period_half_over":{"description":"Whether the current period half is complete","type":"boolean"},"periods":{"description":"Per-period linescore, in period order. This is what `/v1/events/{id}/linescore` returns.","example":[{"away_score":3,"home_score":7,"number":1,"type":"regular_period"}],"items":{"additionalProperties":true,"type":"object"},"type":"array"},"response_received_at":{"description":"When we received this state from the upstream provider. This is the observation time, and it is the field to use to judge freshness or to interpolate a running clock — `updated_at` is a storage timestamp and moves even when the observation did not.","example":"2024-01-15T15:32:10Z","format":"date-time","type":"string"},"served_at":{"description":"When this response was assembled (UTC, whole seconds).","example":"2024-01-15T15:32:11Z","format":"date-time","nullable":true,"type":"string"},"source_rank":{"description":"Which provider's row was served and why it was chosen. `provider` is the provider family (`sportsstack` for a canonical row, whose backing vendor is not disclosed); `rank` is its position in the league's live primary order (0 = primary, null = outside the order or canonical); `reason` is `primary` (highest-ranked provider present), `fallback_stale` (a higher-ranked provider's row was older than the stale window), `single_provider` (only one provider reported), `freshest` (a fresher lower-ranked row was served), or null when the election's candidates are not visible to the tenant.","nullable":true,"properties":{"provider":{"example":"sportsstack","type":"string"},"rank":{"example":0,"nullable":true,"type":"integer"},"reason":{"enum":["primary","fallback_stale","single_provider","freshest"],"nullable":true,"type":"string"}},"type":"object"},"sport":{"description":"Sport name","enum":["football","basketball","baseball","hockey","ice_hockey","soccer","golf"],"example":"football","type":"string"},"status":{"description":"Lifecycle state of the event as reported by the provider (e.g. 'live', 'in_progress', 'halftime', 'closed', 'final'). Values are provider vocabulary and are not normalized across providers — use this to tell a live scoreboard from a finished one, not for settlement decisions.","example":"in_progress","type":"string"},"time_on_clock":{"description":"Time remaining in period - format varies by sport (MM:SS for timed sports, null for baseball/golf)","example":"14:30","type":"string"},"updated_at":{"description":"Last update timestamp","format":"date-time","type":"string"}},"required":["common_model_id","event_id","sport","league"],"title":"EventStatus","type":"object"},"image_url":{"description":"Event promotional image or logo","type":"string"},"league_id":{"description":"League/competition this event belongs to","type":"string"},"market_count":{"description":"Number of distinct open markets (provider status active; suspended, closed, settled and unknown statuses are not counted) for this event, in sources visible to the tenant (the visibility `GET /markets` applies); each market counts once across venues. Finished events report 0. An open market is not necessarily priced right now. null means the count could not be computed right now (never 0). Present on `GET /events`.","minimum":0,"nullable":true,"type":"integer"},"market_counts_by_venue":{"additionalProperties":{"minimum":0,"type":"integer"},"description":"Per-venue (aggregator, e.g. `polymarket`, `kalshi`, `prophetx`, `predict_fun`, `limitless`, `polymarket_us`, `sxbet`) breakdown of `market_count`, with the same rules. Venues with no open market are omitted. Values can sum to more than `market_count`. null means the count could not be computed right now. Present on `GET /events`.","nullable":true,"type":"object"},"metadata":{"additionalProperties":true,"description":"Provider-specific event metadata. Playoff-series and named games expose `subtitle`, a short label such as `\"Game 3\"`, `\"Monday Night Football\"` or `\"AFC Championship\"`; where the game is part of a best-of series, `series_game_number` (1-9) and, when a provider states it, `series_games_total` are also present. The game number does not change when a game is rescheduled. UFC bout events expose `card_ufcstats_id` and, once completed, `result` with parsed `method`, `details`, `end_round`, `end_time`, `time_format`, and `referee`. For FIFA-family tournament events (FIFA World Cup, Women's World Cup, Club World Cup, U20, U17), these keys are emitted in addition to any existing provider fields:\n\n- `round` — verbatim provider round object. Group stage: `{number: <matchday>}`. Knockout: `{name: <snake_case>, cup_round_id: <sr_id>, type: <round_type>}`. Present on all soccer events (backward-compatible).\n- `round_name` — human-readable round display string. Group stage: `\"Round 1\" | \"Round 2\" | \"Round 3\"`. Knockout: `\"Round of 32\" | \"Round of 16\" | \"Quarterfinals\" | \"Semifinals\" | \"3rd Place Playoff\" | \"Final\"`. FIFA-family only.\n- `stage` — the stage object this event belongs to: `{order, type, phase, start_date, end_date, year}`. `type` is `\"league\"` for group stage, `\"cup\"` for knockouts. FIFA-family only.\n- `group` — for FIFA group-stage events only: `{id, name, group_name}` where `group_name` is the short label (`\"A\"`, `\"B\"`, etc.).\n- `cup_round_id` — for FIFA knockout events only: stable provider identifier shared by all matches in the same cup round. Use this to group the 4 quarterfinal matches, the 2 semifinals, etc. Final and 3rd Place Playoff have distinct `cup_round_id`s despite sharing the same `stage`.\n\nNon-FIFA soccer events (MLS, EPL, UEFA, etc.) only carry `metadata.round` from the provider.","type":"object"},"participant_type":{"description":"Participant shape classification for the event: 'team_v_team' for team sports, 'player_v_player' for individual head-to-head, 'players_v_players' for side-vs-side player groups, or 'players_pool' for pooled field formats.","enum":["team_v_team","player_v_player","players_v_players","players_pool"],"type":"string"},"participants":{"description":"Competing entities - teams for team sports, individual players for individual sports","items":{"properties":{"id":{"description":"Participant common_model_id (references the corresponding Team or Player)","format":"uuid","type":"string"},"is_home":{"description":"true if home team/player, false if away (null for neutral sites)","type":"boolean"},"points":{"description":"Participant's score in this event. Sport-specific semantics: for team sports with a single numeric score (NBA/NFL/MLB/NHL/soccer) this is the score (goals for soccer). This is NOT FIFA match result points (3-1-0). For FIFA/soccer standings points, query GET /api/v1/standings?league_id=<id>&season_year=<yr>&primary_group_type=group and read ranking_points. On knockout matches tournament_round is populated and points continues to reflect the score (extra time/penalties result available via event_scoreboard).","type":"integer"},"team":{"description":"Tenant-visible team details when type=team. team.id matches the participant id.","properties":{"abbreviation":{"type":"string"},"id":{"format":"uuid","type":"string"},"image_url":{"type":"string"},"market":{"type":"string"},"name":{"type":"string"},"nickname":{"type":"string"}},"type":"object"},"type":{"description":"Entity type: 'team' or 'player'","type":"string"}},"type":"object"},"type":"array"},"scheduled_start_time":{"description":"When the event is scheduled to begin (ISO 8601 UTC timestamp)","format":"date-time","type":"string"},"season_id":{"description":"Season Common Model ID. For UFC bouts, this is the UFC fight-card season ID; metadata.card_ufcstats_id carries the provider card identifier when available.","format":"uuid","type":"string"},"season_type":{"description":"Season phase: 'PRE' (preseason), 'REG' (regular), 'POST' (playoffs), 'IST' (in-season tournament), 'PIT' (play-in tournament), 'SC' (showcase cup), 'EX' (exhibition), 'CC' (commissioners cup), 'CT' (conference tournament), 'ALL_STAR' (all-star)","type":"string"},"season_type_agnostic_week":{"description":"Week number agnostic of season type (only for NFL/NCAAF). This is a continuous week number across the entire season: regular season weeks are 1-18 (NFL) or 1-16 (NCAAF), and postseason weeks continue from there (e.g., NFL postseason week 1 = 19, week 2 = 20, etc.). This field is only present for NFL and NCAAF events.","type":"integer"},"season_year":{"description":"Calendar year the season primarily takes place","type":"integer"},"source_mappings_by_source":{"additionalProperties":{"properties":{"event":{"description":"Event mapping rows for event endpoints.","items":{"properties":{"common_model_id":{"format":"uuid","type":"string"},"deprecated_at":{"format":"date-time","nullable":true,"type":"string"},"entity_type":{"type":"string"},"id_scheme":{"type":"string"},"ignored_pending":{"type":"boolean"},"league":{"type":"string"},"match_status":{"type":"string"},"overmapped_allowed":{"type":"boolean"},"provider":{"type":"string"},"source":{"type":"string"},"source_id":{"type":"string"},"tenant_id":{"format":"uuid","nullable":true,"type":"string"},"updated_at":{"format":"date-time","type":"string"}},"type":"object"},"type":"array"},"mappings":{"description":"Source mapping rows for non-event entity endpoints.","items":{"properties":{"common_model_id":{"format":"uuid","type":"string"},"deprecated_at":{"format":"date-time","nullable":true,"type":"string"},"entity_type":{"type":"string"},"id_scheme":{"type":"string"},"ignored_pending":{"type":"boolean"},"league":{"type":"string"},"match_status":{"type":"string"},"overmapped_allowed":{"type":"boolean"},"provider":{"type":"string"},"source":{"type":"string"},"source_id":{"type":"string"},"tenant_id":{"format":"uuid","nullable":true,"type":"string"},"updated_at":{"format":"date-time","type":"string"}},"type":"object"},"type":"array"},"participants":{"description":"Participant mapping rows for event endpoints.","items":{"properties":{"common_model_id":{"format":"uuid","type":"string"},"deprecated_at":{"format":"date-time","nullable":true,"type":"string"},"entity_type":{"type":"string"},"id_scheme":{"type":"string"},"ignored_pending":{"type":"boolean"},"league":{"type":"string"},"match_status":{"type":"string"},"overmapped_allowed":{"type":"boolean"},"participant_id":{"format":"uuid","type":"string"},"participant_role":{"type":"string"},"participant_side":{"enum":["home","away","neutral","unknown"],"type":"string"},"provider":{"type":"string"},"source":{"type":"string"},"source_id":{"type":"string"},"tenant_id":{"format":"uuid","nullable":true,"type":"string"},"updated_at":{"format":"date-time","type":"string"}},"type":"object"},"type":"array"},"unmapped_participants":{"description":"Event participants that could not be emitted as source mappings because they were placeholders/TBD or lacked a mapping for the requested source.","items":{"properties":{"display_name":{"type":"string"},"participant_id":{"type":"string"},"participant_role":{"type":"string"},"participant_side":{"enum":["home","away","neutral","unknown"],"type":"string"},"reason":{"enum":["placeholder_or_tbd","missing_source_mapping"],"type":"string"}},"type":"object"},"type":"array"}},"type":"object"},"description":"Optional enterprise mapping enrichment keyed by full normalized source. Added when include_source_mappings_by_source=true.","type":"object"},"status":{"description":"Status of the event: 'scheduled', 'in_progress', 'completed', 'cancelled', 'postponed', 'time_tbd'. A live event does not move back to 'scheduled' or 'time_tbd' on one provider's report while another still reports it live; 'completed' is reached when one provider reports a final and 'cancelled' when two do.","enum":["scheduled","in_progress","completed","cancelled","postponed","time_tbd"],"type":"string"},"title":{"description":"Human-readable event name (e.g., 'LAL @ GS', 'Super Bowl LVIII')","type":"string"},"tournament_id":{"description":"Tournament this event belongs to (for tournament/playoff events). Used to reconstruct bracket structure from events.","format":"uuid","type":"string"},"tournament_round":{"description":"Round position within the tournament. Semantics vary by sport: (1) FIFA-family soccer group-stage matches: `0` — the match is part of a tournament group phase. Matchday number (1/2/3) lives in `metadata.round.number` with a humanized string in `metadata.round_name`. (2) FIFA-family soccer knockout matches: `null` — the provider does not expose a sequential round number for knockouts (the 3rd-place playoff and Final share the same stage with distinct cup rounds, and no knockout leads into another). Use `metadata.round_name` for display and `metadata.cup_round_id` as the stable grouping key — the 4 quarterfinal matches share one `cup_round_id`; Final and 3rd Place Playoff have distinct ids. (3) Non-tournament soccer events (MLS regular-season, EPL league match with no cup context): `null` with `tournament_id: null` — not a tournament match. (4) Other tournament sports (NCAAB, etc.): 1-based bracket position aligned with `Tournament.rounds[*].round_number`.","type":"integer"},"weather":{"description":"Weather conditions for outdoor events (affects player performance and betting)","properties":{"condition":{"description":"Weather condition description (e.g., Sunny, Cloudy, Rainy, Snow)","type":"string"},"humidity":{"description":"Humidity percentage (0-100)","type":"integer"},"pressure":{"description":"Atmospheric pressure in hectopascals (hPa)","type":"integer"},"temperature":{"description":"Temperature in Celsius","type":"number"},"wind_direction":{"description":"Cardinal wind direction (N, S, E, W, NE, NW, SE, SW)","type":"string"},"wind_speed":{"description":"Wind speed in kilometers per hour","type":"number"}},"required":["temperature","condition"],"type":"object"},"week":{"description":"Week number within the season (for weekly sports like NFL)","type":"integer"}},"required":["common_model_id","title"],"title":"Event","type":"object"}}},"description":"Event Response"},"400":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"bad_request","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/bad_request","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"invalid_api_key","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/invalid_api_key","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"not_found","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/not_found","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Not Found"}},"summary":"Show Event","tags":["Reference"]}},"/api/v1/sports":{"get":{"callbacks":{},"description":"List the sports visible to the tenant. Tenants entitled to the `CRYPTO` league additionally\nsee the synthetic `crypto` sport exactly once across all pages (the last element of the\nlist; `x-total-count` includes it). First step of futures discovery:\n`GET /sports` -> `GET /leagues?sport_id=<sport>` (each league carries\n`futures_count`) -> `GET /futures?league_id=<abbr>&season_year=<year>&aggregator=<venue>`.\n","operationId":"ApiRestWeb.SportController.index","parameters":[{"description":"Filter by sport name","in":"query","name":"name","required":false,"schema":{"type":"string"}},{"description":"Page number for page/per_page pagination. Do not combine with limit/offset.","in":"query","name":"page","required":false,"schema":{"default":1,"minimum":1,"type":"integer"}},{"description":"Number of items per page (max 1000). Do not combine with limit/offset.","in":"query","name":"per_page","required":false,"schema":{"default":20,"maximum":1000,"minimum":1,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"description":"A sport represents a distinct category of competitive physical activity with standardized rules.\n\nSports serve as the highest-level organizational category in our data hierarchy. Each sport\nhas unique characteristics including scoring systems, game duration, participant types,\nand statistical categories. Sports contain multiple leagues and competitions worldwide.\n\n## Supported Sports\nOur platform covers major professional and amateur sports:\n- **Team Sports**: Football (American), Basketball, Baseball, Hockey, Soccer\n- **Individual Sports**: Golf, Tennis, Boxing, MMA, Track & Field\n- **Motor Sports**: Formula 1, NASCAR, IndyCar\n- **Olympic Sports**: Swimming, Gymnastics, Wrestling\n\n## Sport Characteristics\nEach sport has distinct features that affect data structure:\n- **Scoring**: Points, goals, runs, strokes, time-based\n- **Duration**: Timed periods, innings, rounds, holes\n- **Participants**: Teams vs. individuals, roster sizes\n- **Seasons**: Annual cycles, tournament formats, continuous competition\n\n## Data Implications\nSport type determines:\n- Available statistical categories\n- Event structure and participant types\n- Betting market types and options\n- Performance measurement standards\n","example":{"abbreviation":"bball","common_model_id":"4af4c296-6fbc-4705-8660-3b587c252e16","image_url":"https://cdn.example.com/icons/basketball.png","name":"basketball"},"properties":{"abbreviation":{"description":"Common abbreviation or short code","type":"string"},"common_model_id":{"description":"Unique sport identifier in our classification system","type":"string"},"image_url":{"description":"Sport icon or representative image","type":"string"},"name":{"description":"Standard sport name (e.g., 'basketball', 'football', 'golf')","type":"string"}},"required":["name","abbreviation"],"title":"Sport","type":"object"}}},"description":"Sport Response"},"401":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"invalid_api_key","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/invalid_api_key","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"not_found","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/not_found","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Not Found"}},"summary":"List Sports","tags":["Reference"]}},"/api/v1/injuries/league/{league_id}":{"get":{"callbacks":{},"description":"Returns all current injuries for a league, sorted by most recently reported.","operationId":"ApiRestWeb.InjuryController.league_injuries","parameters":[{"description":"League ID — accepts a UUID or league abbreviation (e.g., 'NFL', 'NBA')","in":"path","name":"league_id","required":true,"schema":{"type":"string"}},{"description":"Filter by injury status","in":"query","name":"status","required":false,"schema":{"type":"string"}},{"description":"Page number for page/per_page pagination. Do not combine with limit/offset.","in":"query","name":"page","required":false,"schema":{"default":1,"minimum":1,"type":"integer"}},{"description":"Number of items per page (max 1000). Do not combine with limit/offset.","in":"query","name":"per_page","required":false,"schema":{"default":100,"maximum":1000,"minimum":1,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"items":{"description":"Current injury status and health information for a player affecting their availability.\n\nInjury records track both active injuries and ongoing health conditions that impact\na player's ability to participate in games and practices. This information is critical\nfor fantasy sports, betting markets, team planning, and fan engagement.\n\n## Status Classifications\nInjury status follows standard sports medicine and league reporting guidelines:\n- **out**: Definitely will not play in upcoming game(s)\n- **questionable**: Uncertain availability, game-time decision likely\n- **doubtful**: Unlikely to play but not definitively ruled out\n- **probable**: Expected to play, but still listed on injury report\n- **day_to_day**: Short-term injury designation without a firm game status\n- **ir**: Injured Reserve, extended absence with structured return process\n- **suspended**: League disciplinary action, not injury-related\n- **pup**: Physically Unable to Perform list (often preseason/training camp)\n\n## Practice Participation\nDaily practice status provides insight into injury severity and recovery progress:\n- **full_participation**: No restrictions, normal workload\n- **limited_participation**: Modified workload or specific restrictions\n- **did_not_practice**: Injury-related absence from practice\n- **did_not_practice_non_injury**: Rest day or non-injury related absence\n\n## Impact on Performance\nInjury status affects:\n- **Game Availability**: Whether player can participate\n- **Performance Level**: Reduced effectiveness due to injury\n- **Fantasy Value**: Player selection and projection adjustments\n- **Betting Markets**: Line movements and prop bet availability\n","example":{"common_model_id":"49306211-7b48-4b5e-88e9-a4190189dbea","confidence":0.65,"description":"Questionable with a knee injury","injury_type":"Knee","inserted_at":"2024-09-10T14:30:00Z","language_certainty":1.0,"league_id":"58e8c89b-72f8-4427-adbc-10f193c9b462","metadata":{},"player_id":"59291391-0c7e-442b-9496-33074647384e","practice_participation":{"friday":null,"monday":"did_not_practice","saturday":null,"sunday":null,"thursday":"limited_participation","tuesday":"did_not_practice","wednesday":"limited_participation"},"recent_practice_status":"limited_participation","reported_at":"2024-09-11T08:30:00Z","return_date":"2024-09-15","source":"example_provider","source_tier":3,"status":"questionable","tenant_id":"ff6332b6-8151-4a13-b20c-bd7b2ab45452","updated_at":"2024-09-11T09:15:00Z"},"properties":{"common_model_id":{"description":"Unique injury record identifier","type":"string"},"confidence":{"description":"Not populated on the aggregated injury report (null)","type":"number"},"description":{"description":"Free-text description from the source about the injury","type":"string"},"injury_type":{"description":"Body part or condition affected (e.g., 'Knee', 'Shoulder', 'Concussion')","type":"string"},"inserted_at":{"description":"When this injury record was first created in our system","format":"date-time","type":"string"},"language_certainty":{"description":"Not populated on the aggregated injury report (null)","type":"number"},"league_id":{"description":"League context for injury reporting standards","type":"string"},"metadata":{"description":"Vendor-neutral detail only (injury side and location, designation kind, team code)","type":"object"},"player_id":{"description":"Player affected by this injury","type":"string"},"practice_participation":{"description":"Weekly practice participation tracking injury recovery (follows league injury report schedule)","properties":{"friday":{"enum":["full_participation","limited_participation","did_not_practice","did_not_practice_non_injury"],"type":"string"},"monday":{"enum":["full_participation","limited_participation","did_not_practice","did_not_practice_non_injury"],"type":"string"},"saturday":{"enum":["full_participation","limited_participation","did_not_practice","did_not_practice_non_injury"],"type":"string"},"sunday":{"enum":["full_participation","limited_participation","did_not_practice","did_not_practice_non_injury"],"type":"string"},"thursday":{"enum":["full_participation","limited_participation","did_not_practice","did_not_practice_non_injury"],"type":"string"},"tuesday":{"enum":["full_participation","limited_participation","did_not_practice","did_not_practice_non_injury"],"type":"string"},"wednesday":{"enum":["full_participation","limited_participation","did_not_practice","did_not_practice_non_injury"],"type":"string"}},"type":"object"},"recent_practice_status":{"description":"Most recent practice participation level indicating recovery progress","enum":["full_participation","limited_participation","did_not_practice","did_not_practice_non_injury"],"type":"string"},"reported_at":{"description":"When the source originally reported this status (distinct from inserted_at)","format":"date-time","type":"string"},"return_date":{"description":"Projected or estimated return to play date (if available)","format":"date","type":"string"},"source":{"description":"Always 'sportsstack': injuries are one aggregated status per player, and the report does not expose which providers contributed","type":"string"},"source_tier":{"description":"Not populated on the aggregated injury report (null); the contributing providers are not exposed","enum":[1,2,3,4],"type":"integer"},"status":{"description":"Current injury designation following league injury report standards","enum":["out","questionable","doubtful","probable","day_to_day","ir","suspended","pup"],"type":"string"},"tenant_id":{"description":"Client tenant accessing this injury data","type":"string"},"updated_at":{"description":"Most recent update to injury status or practice participation","format":"date-time","type":"string"}},"required":["common_model_id","player_id","source"],"title":"Injury","type":"object"},"type":"array"}},"required":["data"],"type":"object"}}},"description":"League Injuries"},"401":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"invalid_api_key","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/invalid_api_key","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"not_found","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/not_found","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Not Found"}},"summary":"League-wide Injury Report","tags":["Content"]}},"/api/v1/data_health":{"get":{"callbacks":{},"description":"Validates data completeness and health for a tenant/league combination.\n\nReturns validation results including:\n- Entity counts (teams, players, events, seasons)\n- Relative metrics (players per team, events per season)\n- Relationship completeness\n- Coverage percentages for stats and plays\n- Health score (0-100)\n- Issues list\n","operationId":"ApiRestWeb.DataHealthController.index","parameters":[{"description":"League ID — accepts a UUID or league abbreviation (e.g., 'NFL', 'NBA')","in":"query","name":"league_id","required":true,"schema":{"example":"NFL","type":"string"}},{"description":"Optional provider name to filter by","in":"query","name":"provider","required":false,"schema":{"example":"provider_key","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"availability_status":{"enum":["available","degraded"],"type":"string"},"health_score":{"format":"float","type":"number"},"issues":{"items":{"properties":{"count":{"type":"integer"},"message":{"type":"string"},"severity":{"type":"string"},"type":{"type":"string"}},"type":"object"},"type":"array"},"league_abbreviation":{"type":"string"},"league_id":{"format":"uuid","type":"string"},"provider":{"nullable":true,"type":"string"},"results":{"properties":{"completed_events_with_plays":{"type":"object"},"completed_events_with_stats":{"type":"object"},"events":{"type":"object"},"players":{"type":"object"},"players_with_season_stats":{"type":"object"},"relationships":{"type":"object"},"seasons":{"type":"object"},"teams":{"type":"object"}},"type":"object"},"tenant_id":{"format":"uuid","type":"string"},"validation_timestamp":{"format":"date_time","type":"string"}},"type":"object"}}},"description":"Data Health Response"},"400":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"bad_request","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/bad_request","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"invalid_api_key","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/invalid_api_key","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"not_found","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/not_found","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Not Found"}},"summary":"Get Data Health Status","tags":["SportsStack"]}},"/api/v1/players":{"get":{"callbacks":{},"operationId":"ApiRestWeb.PlayerController.index","parameters":[{"description":"Filter by league ID — accepts a UUID or league abbreviation (e.g., 'NFL', 'NBA'). See GET /api/v1/leagues for all leagues.","in":"query","name":"league_id","required":true,"schema":{"example":"NFL","type":"string"}},{"description":"[Translatable] Filter by team ID (set query_by_source_id to query by the integration source_id)","in":"query","name":"team_id","required":false,"schema":{"type":"string"}},{"description":"The format for which field to query by (i.e. a provider key will mean you can pass in that provider's id) for any [Translatable] field","in":"query","name":"query_source_id_format","required":false,"schema":{"type":"string"}},{"description":"Include source mappings from the specific integration (i.e. a provider key) will return a source_mappings object with the mappings for the respective objects","in":"query","name":"return_source_id_format","required":false,"schema":{"type":"string"}},{"description":"Search for players by name","in":"query","name":"search_phrase","required":false,"schema":{"type":"string"}},{"description":"Enable fuzzy matching via Levenshtein distance. Requires search_phrase and league_id. Tolerates typos and name variations.","in":"query","name":"fuzzy","required":false,"schema":{"example":"true","type":"string"}},{"description":"When true, compute exact total_count/total_pages pagination metadata. When false, omit the exact count. Defaults to true.","in":"query","name":"count","required":false,"schema":{"type":"boolean"}},{"description":"When true, add source_mappings_by_source keyed by full normalized source (for example, provider.football.nfl).","in":"query","name":"include_source_mappings_by_source","required":false,"schema":{"default":false,"type":"boolean"}},{"description":"Optional provider-family filter for source_mappings_by_source (for example, a provider key).","in":"query","name":"source_mapping_provider","required":false,"schema":{"type":"string"}},{"description":"Optional full-source filter for source_mappings_by_source in provider.sport.league format.","in":"query","name":"source_mapping_source","required":false,"schema":{"type":"string"}},{"description":"Page number for page/per_page pagination. Do not combine with limit/offset.","in":"query","name":"page","required":false,"schema":{"default":1,"minimum":1,"type":"integer"}},{"description":"Number of items per page (max 1000). Do not combine with limit/offset.","in":"query","name":"per_page","required":false,"schema":{"default":250,"maximum":1000,"minimum":1,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"description":"A player represents an individual athlete who competes in sports events.\n\nPlayers are fundamental entities in sports data, serving as the subject of performance\nstatistics, injury reports, roster information, and individual achievements. They can\nbe active or inactive, professional or amateur, and may change teams throughout their careers.\n\n## Core Information\n- **Identity**: Names, physical characteristics, and biographical data\n- **Career Details**: Draft information, experience level, educational background\n- **Current Status**: Active roster status, team affiliation, position\n- **Performance**: Historical and current statistics across multiple events/seasons\n\n## Key Relationships\n- **Team**: Current team affiliation (can change via trades/signings)\n- **Statistics**: Performance data across events and seasons\n- **Injuries**: Current and historical injury status affecting availability\n- **Events**: Games/matches the player participates in\n- **Draft**: Original draft selection details for professional leagues\n\n## Position Codes\nPosition abbreviations vary by sport:\n- **Football**: QB, RB, WR, TE, OL, DL, LB, CB, S, K, P\n- **Basketball**: PG, SG, SF, PF, C\n- **Baseball**: P, C, 1B, 2B, 3B, SS, LF, CF, RF, DH\n- **Hockey**: C, LW, RW, D, G\n\n## Status Management\nThe is_active flag indicates current roster status. Inactive players may return\nto active status, while retired players typically remain inactive permanently.\n","example":{"birthday":"December 30, 1984","common_model_id":"f1798a7e-4832-4a2c-8cb6-60d5afcb3d41","family_name":"James","first_name":"LeBron","full_name":"LeBron James","height_in":81,"image_url":"https://cdn.example.com/headshots/nba/1966.png","is_active":true,"league_id":"58e8c89b-72f8-4427-adbc-10f193c9b462","metadata":"[]","nickname":"","number":"6","position":"PF","team_id":"58e8c89b-72f8-4427-adbc-10f193c9b462","weight_lbs":250},"properties":{"birth_place":{"description":"City, state/province, country of birth","type":"string"},"birthday":{"description":"Date of birth (format may vary by data source)","type":"string"},"college":{"description":"College/university attended (important for draft analysis)","type":"string"},"college_conf":{"description":"College conference (e.g., 'SEC', 'Big 10', 'ACC')","type":"string"},"common_model_id":{"description":"Unique player identifier across all data sources","type":"string"},"draft_number":{"description":"Overall draft pick number (1-based)","type":"integer"},"draft_round":{"description":"Draft round selected (1-based)","type":"integer"},"draft_team_id":{"description":"Team that originally drafted the player","type":"string"},"draft_year":{"description":"Year player was drafted into professional league","type":"integer"},"experience":{"description":"Years of professional experience or rookie status","type":"string"},"family_name":{"description":"Surname/family name","type":"string"},"first_name":{"description":"Given/first name","type":"string"},"full_name":{"description":"Complete name as commonly known (e.g., 'LeBron James')","type":"string"},"height_in":{"description":"Height in inches (total inches, not feet/inches)","type":"integer"},"high_school":{"description":"High school attended","type":"string"},"image_url":{"description":"Player headshot or action photo","type":"string"},"is_active":{"description":"true if currently on active roster, false if inactive/retired","type":"boolean"},"league_id":{"description":"League the player currently competes in","type":"string"},"metadata":{"description":"Additional sport-specific or source-specific data","type":"object"},"nickname":{"description":"Common nickname or alternate name used in media","type":"string"},"number":{"description":"Jersey/uniform number (stored as string to handle formats like '6A')","type":"string"},"position":{"description":"Primary playing position using standard sport abbreviations","type":"string"},"roster_observed_at":{"description":"UTC timestamp of the effective complete roster census supporting the current team assignment","format":"date-time","nullable":true,"type":"string"},"source_mappings_by_source":{"additionalProperties":{"properties":{"event":{"description":"Event mapping rows for event endpoints.","items":{"properties":{"common_model_id":{"format":"uuid","type":"string"},"deprecated_at":{"format":"date-time","nullable":true,"type":"string"},"entity_type":{"type":"string"},"id_scheme":{"type":"string"},"ignored_pending":{"type":"boolean"},"league":{"type":"string"},"match_status":{"type":"string"},"overmapped_allowed":{"type":"boolean"},"provider":{"type":"string"},"source":{"type":"string"},"source_id":{"type":"string"},"tenant_id":{"format":"uuid","nullable":true,"type":"string"},"updated_at":{"format":"date-time","type":"string"}},"type":"object"},"type":"array"},"mappings":{"description":"Source mapping rows for non-event entity endpoints.","items":{"properties":{"common_model_id":{"format":"uuid","type":"string"},"deprecated_at":{"format":"date-time","nullable":true,"type":"string"},"entity_type":{"type":"string"},"id_scheme":{"type":"string"},"ignored_pending":{"type":"boolean"},"league":{"type":"string"},"match_status":{"type":"string"},"overmapped_allowed":{"type":"boolean"},"provider":{"type":"string"},"source":{"type":"string"},"source_id":{"type":"string"},"tenant_id":{"format":"uuid","nullable":true,"type":"string"},"updated_at":{"format":"date-time","type":"string"}},"type":"object"},"type":"array"},"participants":{"description":"Participant mapping rows for event endpoints.","items":{"properties":{"common_model_id":{"format":"uuid","type":"string"},"deprecated_at":{"format":"date-time","nullable":true,"type":"string"},"entity_type":{"type":"string"},"id_scheme":{"type":"string"},"ignored_pending":{"type":"boolean"},"league":{"type":"string"},"match_status":{"type":"string"},"overmapped_allowed":{"type":"boolean"},"participant_id":{"format":"uuid","type":"string"},"participant_role":{"type":"string"},"participant_side":{"enum":["home","away","neutral","unknown"],"type":"string"},"provider":{"type":"string"},"source":{"type":"string"},"source_id":{"type":"string"},"tenant_id":{"format":"uuid","nullable":true,"type":"string"},"updated_at":{"format":"date-time","type":"string"}},"type":"object"},"type":"array"},"unmapped_participants":{"description":"Event participants that could not be emitted as source mappings because they were placeholders/TBD or lacked a mapping for the requested source.","items":{"properties":{"display_name":{"type":"string"},"participant_id":{"type":"string"},"participant_role":{"type":"string"},"participant_side":{"enum":["home","away","neutral","unknown"],"type":"string"},"reason":{"enum":["placeholder_or_tbd","missing_source_mapping"],"type":"string"}},"type":"object"},"type":"array"}},"type":"object"},"description":"Optional enterprise mapping enrichment keyed by full normalized source. Added when include_source_mappings_by_source=true.","type":"object"},"team_id":{"description":"Current team affiliation (null if free agent or retired)","type":"string"},"weight_lbs":{"description":"Body weight in pounds","type":"integer"}},"required":["common_model_id","full_name"],"title":"Player","type":"object"}}},"description":"Player Response"},"401":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"invalid_api_key","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/invalid_api_key","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"not_found","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/not_found","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Not Found"}},"summary":"List Players","tags":["Reference"]}},"/api/v1/changes/checkpoint":{"get":{"callbacks":{},"operationId":"ApiRestWeb.ChangesController.checkpoint","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"cursor":{"description":"Opaque signed v2 cursor","type":"string"},"scope_digest":{"type":"string"},"sequence":{"minimum":0,"type":"integer"}},"required":["cursor","sequence"],"type":"object"}}},"description":"Checkpoint"},"401":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"invalid_api_key","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/invalid_api_key","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"forbidden","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/forbidden","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Forbidden"},"500":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"internal_error","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/internal_error","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Internal Server Error"}},"summary":"Create a changes checkpoint","tags":["SportsStack"]}},"/api/v1/tournaments":{"get":{"callbacks":{},"description":"Returns a paginated list of tournaments with optional filtering.\n\nSupports filtering by league, bracket type, season year, and status. Use this endpoint\nto discover tournaments for a specific league or season, or to find tournaments of a\nparticular bracket format (single elimination, best-of-series, or group + knockout).\n\n## Filtering Examples\n\n- Get all 2025 NCAA tournaments: `?league_id=...&season_year=2025`\n- Find active single elimination brackets: `?bracket_type=single_elimination&status=in_progress`\n- List all playoff series: `?bracket_type=best_of_series`\n","operationId":"ApiRestWeb.TournamentController.index","parameters":[{"description":"Filter by league ID — accepts a UUID or league abbreviation (e.g., 'NFL', 'NBA')","in":"query","name":"league_id","required":false,"schema":{"example":"NFL","type":"string"}},{"description":"Filter by bracket type","in":"query","name":"bracket_type","required":false,"schema":{"enum":["single_elimination","best_of_series","group_knockout"],"example":"single_elimination","type":"string"}},{"description":"Filter by season year (e.g., 2025 for 2024-25 season)","in":"query","name":"season_year","required":false,"schema":{"example":2025,"type":"integer"}},{"description":"Filter by tournament status","in":"query","name":"status","required":false,"schema":{"enum":["scheduled","in_progress","completed","cancelled"],"example":"in_progress","type":"string"}},{"description":"Page number for page/per_page pagination. Do not combine with limit/offset.","in":"query","name":"page","required":false,"schema":{"default":1,"minimum":1,"type":"integer"}},{"description":"Number of items per page (max 1000). Do not combine with limit/offset.","in":"query","name":"per_page","required":false,"schema":{"default":100,"maximum":1000,"minimum":1,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"items":{"description":"A tournament represents an organized competition structure with brackets, rounds, and matchups.\n\nTournaments organize events into structured competition formats including single elimination brackets,\nbest-of-series playoffs, and group stage + knockout combinations. They provide the framework for\ndetermining champions through progressive elimination or series-based competition.\n\n## Bracket Types\n\n### Single Elimination\nClassic bracket format where one loss eliminates a team (March Madness, CFP, Tennis Grand Slams).\n- Teams progress through rounds (First Round, Sweet 16, Elite 8, Final Four, Championship)\n- Each matchup is a single game\n- Winner advances, loser is eliminated\n\n### Best-of-Series\nPlayoff format where teams compete in multi-game series (NBA, NHL, MLB, NFL playoffs).\n- Each round is a best-of-N series (best of 7, best of 5, etc.)\n- Series winner determined by games won\n- Individual games tracked as separate events\n\n### Group + Knockout\nTwo-stage format with group play followed by knockout rounds (World Cup, UEFA Champions League).\n- **Groups**: Round-robin play within groups, top teams advance\n- **Knockout**: Single elimination bracket after group stage\n- Combines group standings with bracket progression\n\n## Data Sources\n\nTournament structure can be built from two sources:\n1. **Tournament Entity**: `rounds` field contains pre-structured bracket data\n2. **Events**: Individual game events with `tournament_id` and `tournament_round` can reconstruct brackets\n\nThe bracket endpoint intelligently uses whichever source provides the most complete data.\n\n### Soccer bracket reconstruction (FIFA-family tournaments)\nSoccer tournaments do not use 1-based `tournament_round` numbering. Reconstruct from events using:\n- **Group stage matches**: `tournament_id != null && tournament_round == 0`. Matchday in `metadata.round.number`, group identity in `metadata.group`.\n- **Knockout matches**: `tournament_id != null && tournament_round == null && metadata.cup_round_id != null`. The `metadata.cup_round_id` is the stable grouping key (4 quarterfinals share one id; Final and 3rd-place playoff have distinct ids despite sharing `metadata.stage`).\nNon-soccer tournaments (NCAAB, etc.) retain 1-based `tournament_round` bracket positions.\n\n## Key Relationships\n- **League**: Tournament belongs to a specific league\n- **Events**: Individual games/matches within the tournament\n- **Rounds**: Organized competition stages with matchups\n- **Groups**: Group stage divisions (for group_knockout tournaments)\n","example":{"abbreviation":"MM","bracket_type":"single_elimination","common_model_id":"01c7133f-2999-4803-9872-8c2ab1ba63ac","end_date":"2025-04-08","groups":[],"league_id":"31c65553-2f05-4ef7-993c-9e91c583afc8","name":"2025 NCAA Tournament","rounds":[],"season_year":2025,"start_date":"2025-03-20","status":"in_progress","tournament_type":"championship"},"properties":{"abbreviation":{"description":"Short form or acronym for the tournament","example":"MM","type":"string"},"bracket_type":{"description":"Bracket structure type: single_elimination (March Madness), best_of_series (NBA playoffs), group_knockout (World Cup)","enum":["single_elimination","best_of_series","group_knockout"],"type":"string"},"common_model_id":{"description":"Unique tournament identifier in our unified system","format":"uuid","type":"string"},"end_date":{"description":"Tournament end date","example":"2025-04-08","format":"date","type":"string"},"groups":{"description":"Group stage divisions (for group_knockout tournaments, see TournamentGroup schema)","items":{"description":"A group represents a division within the group stage of a tournament (World Cup, UEFA Champions League).\n\nGroups organize teams into round-robin competition pools where teams play each other\nand standings determine advancement to knockout rounds. Each group has its own standings\ntable tracking wins, losses, goals, and points.\n\n## Group Stage Structure\n\n- **Teams**: 3-4 teams per group (varies by tournament)\n- **Format**: Round-robin (each team plays every other team in group)\n- **Advancement**: Top teams (typically top 2) advance to knockout stage\n- **Standings**: Points, goal differential, head-to-head determine rankings\n\n## Standings Calculation\n\nStandings are calculated from group stage events:\n- **Points**: Win = 3, Draw = 1, Loss = 0 (varies by sport)\n- **Goal Differential**: Goals for - Goals against\n- **Head-to-Head**: Direct matchup results for tiebreaking\n","example":{"group_name":"Group A","standings":[{"drawn":1,"goal_difference":3,"goals_against":2,"goals_for":5,"lost":0,"played":3,"points":7,"position":1,"team_id":"e2790078-ec3a-4c45-8dc4-5cf173960b2b","won":2}],"teams":[{"abbreviation":"TMA","country_code":"USA","name":"Team A","team_id":"e2790078-ec3a-4c45-8dc4-5cf173960b2b"}]},"properties":{"group_name":{"description":"Group identifier (e.g., 'Group A', 'Group B')","example":"Group A","type":"string"},"standings":{"description":"Current group standings ordered by position","items":{"properties":{"drawn":{"description":"Draws","type":"integer"},"goal_difference":{"description":"Goal differential","type":"integer"},"goals_against":{"description":"Goals conceded","type":"integer"},"goals_for":{"description":"Goals scored","type":"integer"},"lost":{"description":"Losses","type":"integer"},"played":{"description":"Games played","type":"integer"},"points":{"description":"Total points","type":"integer"},"position":{"description":"Current position in group (1-based)","type":"integer"},"team_id":{"format":"uuid","type":"string"},"won":{"description":"Wins","type":"integer"}},"type":"object"},"type":"array"},"teams":{"description":"Teams participating in this group","items":{"properties":{"abbreviation":{"description":"Team abbreviation","type":"string"},"country_code":{"description":"Country code (for international tournaments)","type":"string"},"name":{"description":"Team name","type":"string"},"team_id":{"description":"Team common_model_id","format":"uuid","type":"string"}},"type":"object"},"type":"array"}},"required":["group_name","teams","standings"],"title":"TournamentGroup","type":"object"},"type":"array"},"league_id":{"description":"League this tournament belongs to","format":"uuid","type":"string"},"metadata":{"additionalProperties":true,"description":"Tournament metadata and provider-specific data. For soccer tournaments with multi-stage structure (World Cup family, and any future tournament sport adopting this shape), the following key is emitted:\n\n- `stages` — list of stage descriptors, each tagged with the provider that emitted it so multiple providers can coexist without clobbering each other. Each entry: `{source, order, type, phase, start_date, end_date, year, group_ids, matchdays, cup_round_ids}`. `group_ids` and `matchdays` populated for `type: \"league\"` (group) stages; `cup_round_ids` populated for `type: \"cup\"` (knockout) stages. The `source` field is the normalized provider source (e.g. `\"provider.soccer.fifa_world_cup\"`) — clients wanting a single provider's view filter `stages` by `source`.\n- `round_numbers` (where present) — flat list of all round numbers across stages. Kept for backward compatibility; prefer `stages[*].matchdays` and `stages[*].cup_round_ids` for navigable structure.\n\nThe flat `Tournament.rounds[]` and `Tournament.groups[]` arrays are unchanged; `metadata.stages` cross-references them by provider id.","type":"object"},"name":{"description":"Tournament name (e.g., '2025 NCAA Tournament', 'NBA Playoffs')","example":"2025 NCAA Tournament","type":"string"},"participants":{"description":"Initial seeded participants/teams in the tournament","items":{"properties":{"abbreviation":{"description":"Team abbreviation","type":"string"},"name":{"description":"Team name","type":"string"},"seed":{"description":"Tournament seed (1-16 for NCAA)","type":"integer"},"team_id":{"description":"Team common_model_id","type":"string"}},"type":"object"},"type":"array"},"rounds":{"description":"Bracket rounds with matchups (see TournamentRound schema)","items":{"description":"A round represents a stage of competition within a tournament bracket.\n\nRounds organize matchups into progressive stages of elimination or series competition.\nEach round contains multiple matchups (games or series) that determine advancement.\n\n## Round Structure by Bracket Type\n\n### Single Elimination Rounds\n- **Round 1**: First Round (64 teams → 32 teams)\n- **Round 2**: Second Round (32 teams → 16 teams)\n- **Round 3**: Sweet 16 (16 teams → 8 teams)\n- **Round 4**: Elite 8 (8 teams → 4 teams)\n- **Round 5**: Final Four (4 teams → 2 teams)\n- **Round 6**: Championship (2 teams → 1 champion)\n\n### Best-of-Series Rounds\n- **Round 1**: First Round (e.g., 16 teams → 8 teams via best-of-7 series)\n- **Round 2**: Conference Semifinals\n- **Round 3**: Conference Finals\n- **Round 4**: Finals\n\n### Group + Knockout Rounds\n- **Groups**: Round-robin play (not numbered rounds)\n- **Round 1**: Round of 16 (knockout stage begins)\n- **Round 2**: Quarterfinals\n- **Round 3**: Semifinals\n- **Round 4**: Final\n","example":{"best_of":null,"matchups":[{"away_score":72,"away_team":{"abbreviation":"TMB","name":"Team B","seed":16,"source_id":"competitor_67890","team_id":"f1798a7e-4832-4a2c-8cb6-60d5afcb3d41"},"event_id":"a96af633-aee6-48a0-bf72-0865a4419772","home_score":85,"home_team":{"abbreviation":"TMA","name":"Team A","seed":1,"source_id":"competitor_12345","team_id":"e2790078-ec3a-4c45-8dc4-5cf173960b2b"},"matchup_source_id":"event_12345678","position":0,"region":"East","scheduled_time":"2025-03-20T12:00:00Z","status":"completed","winner_id":"home"}],"round_name":"First Round","round_number":1,"round_type":"elimination"},"properties":{"best_of":{"description":"Best-of-N value for series rounds (3, 5, or 7 games). Null for single elimination.","example":7,"type":"integer"},"matchups":{"description":"Games or series in this round (see TournamentMatchup schema)","items":{"description":"A matchup represents a single game or series within a tournament round.\n\nMatchups connect teams/participants with game results, scores, and advancement status.\nEach matchup can be either a single game (elimination) or a series (best-of-N).\n\n## Matchup States\n\n- **Scheduled**: Game/series not yet started\n- **In Progress**: Currently being played\n- **Completed**: Finished with final results\n- **Pending**: Placeholder matchup (e.g., waiting for previous round results)\n\n## Team Information\n\nTeams in matchups include:\n- **team_id**: Our unified team identifier (resolved via identity mapping)\n- **source_id**: Provider's team identifier (before mapping)\n- **seed**: Tournament seed number (1-16 for NCAA, null for non-seeded tournaments)\n- **name/abbreviation**: Team display information\n\n## Winner Determination\n\n- **winner_id**: \"home\", \"away\", or null (if not yet determined)\n- **home_score/away_score**: Final scores (null if game not completed)\n- For series: `series_score` object with home/away wins instead of single game scores\n\n## Event Linking\n\n- **event_id**: Links to actual Event entity (populated when events are created)\n- **matchup_source_id**: Provider's game ID (before event creation)\n- When both exist, `event_id` takes precedence for detailed game data\n","example":{"away_score":72,"away_team":{"abbreviation":"TMB","name":"Team B","seed":16,"source_id":"competitor_67890","team_id":"f1798a7e-4832-4a2c-8cb6-60d5afcb3d41"},"event_id":"a96af633-aee6-48a0-bf72-0865a4419772","home_score":85,"home_team":{"abbreviation":"TMA","name":"Team A","seed":1,"source_id":"competitor_12345","team_id":"e2790078-ec3a-4c45-8dc4-5cf173960b2b"},"matchup_source_id":"event_12345678","position":0,"region":"East","scheduled_time":"2025-03-20T12:00:00Z","series_score":null,"status":"completed","winner_id":"home"},"properties":{"away_score":{"description":"Away team score (null if game not completed or for series rounds)","example":72,"type":"integer"},"away_team":{"description":"Away team information (same structure as home_team)","properties":{"abbreviation":{"type":"string"},"name":{"type":"string"},"seed":{"type":"integer"},"source_id":{"type":"string"},"team_id":{"format":"uuid","type":"string"}},"type":"object"},"event_id":{"description":"Event entity common_model_id (populated when events are created)","example":"a96af633-aee6-48a0-bf72-0865a4419772","format":"uuid","type":"string"},"home_score":{"description":"Home team score (null if game not completed or for series rounds)","example":85,"type":"integer"},"home_team":{"description":"Home team information","properties":{"abbreviation":{"description":"Team abbreviation","type":"string"},"name":{"description":"Team full name","type":"string"},"seed":{"description":"Tournament seed (1-16 for NCAA, null for non-seeded)","type":"integer"},"source_id":{"description":"Provider's team identifier","type":"string"},"team_id":{"description":"Team common_model_id (resolved via identity mapping)","format":"uuid","type":"string"}},"type":"object"},"matchup_source_id":{"description":"Provider's game/series ID (before event entity is created)","example":"event_12345678","type":"string"},"position":{"description":"Position/order of matchup within the round","example":0,"type":"integer"},"region":{"description":"Region/bracket name (for NCAA tournaments: East, West, South, Midwest)","example":"East","type":"string"},"scheduled_time":{"description":"Scheduled start time for the game/series","example":"2025-03-20T12:00:00Z","format":"date-time","type":"string"},"series_score":{"description":"Series score for best-of-series rounds (null for single elimination)","example":{"away":2,"home":4},"properties":{"away":{"description":"Away team wins in series","type":"integer"},"home":{"description":"Home team wins in series","type":"integer"}},"type":"object"},"status":{"description":"Matchup status","enum":["scheduled","in_progress","completed","pending"],"type":"string"},"winner_id":{"description":"Winner designation: 'home', 'away', or null if not determined","enum":["home","away",null],"type":"string"}},"required":["position","home_team","away_team","status"],"title":"TournamentMatchup","type":"object"},"type":"array"},"round_name":{"description":"Human-readable round name (e.g., 'First Round', 'Sweet 16', 'Conference Finals')","example":"First Round","type":"string"},"round_number":{"description":"Sequential round number (1-based, lower numbers = earlier rounds)","example":1,"type":"integer"},"round_type":{"description":"Type of round: elimination (single game), best_of_series (multi-game), knockout (post-group stage)","enum":["elimination","best_of_series","knockout"],"type":"string"}},"required":["round_number","round_name","round_type","matchups"],"title":"TournamentRound","type":"object"},"type":"array"},"season_year":{"description":"Primary year of the season (e.g., 2025 for 2024-25 season)","example":2025,"type":"integer"},"start_date":{"description":"Tournament start date","example":"2025-03-20","format":"date","type":"string"},"status":{"description":"Current tournament status","enum":["scheduled","in_progress","completed","cancelled"],"type":"string"},"tournament_type":{"description":"Type of tournament (championship, playoffs, tournament, etc.)","example":"championship","type":"string"}},"required":["common_model_id","name","league_id"],"title":"Tournament","type":"object"},"type":"array"},"meta":{"description":"Pagination metadata","properties":{"has_next_page":{"description":"Whether there is a next page","example":false,"type":"boolean"},"has_prev_page":{"description":"Whether there is a previous page","example":false,"type":"boolean"},"page":{"description":"Current page number","example":1,"type":"integer"},"per_page":{"description":"Number of items per page","example":100,"type":"integer"},"total_count":{"description":"Total number of tournaments matching the filters","example":42,"type":"integer"},"total_pages":{"description":"Total number of pages","example":1,"type":"integer"}},"type":"object"}},"type":"object"}}},"description":"Tournament List Response"},"401":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"invalid_api_key","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/invalid_api_key","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"not_found","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/not_found","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Not Found"}},"summary":"List Tournaments","tags":["Reference"]}},"/api/v1/changes":{"get":{"callbacks":{},"operationId":"ApiRestWeb.ChangesController.index","parameters":[{"description":"","in":"query","name":"cursor","required":false,"schema":{"type":"string"}},{"description":"","in":"query","name":"since","required":false,"schema":{"format":"date_time","type":"string"}},{"description":"","in":"query","name":"until","required":false,"schema":{"format":"date_time","type":"string"}},{"description":"","in":"query","name":"limit","required":false,"schema":{"default":500,"maximum":1000,"minimum":1,"type":"integer"}},{"description":"","in":"query","name":"entity_type","required":false,"schema":{"type":"string"}},{"description":"","in":"query","name":"league_id","required":false,"schema":{"format":"uuid","type":"string"}},{"description":"","in":"query","name":"change_type","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"cursor":{"description":"Opaque signed v2 cursor","type":"string"},"data":{"items":{"properties":{"change_types":{"items":{"enum":["entity","source_mappings"],"type":"string"},"type":"array"},"changed_fields":{"description":"Sorted public fields associated with this canonical change","items":{"type":"string"},"type":"array"},"common_model_id":{"format":"uuid","type":"string"},"data":{"properties":{"canonical":{"additionalProperties":true,"type":"object"},"common_model_id":{"format":"uuid","type":"string"},"entity_type":{"type":"string"},"source_mappings_by_source":{"additionalProperties":true,"type":"object"}},"required":["canonical","source_mappings_by_source","entity_type","common_model_id"],"type":"object"},"entity_type":{"type":"string"},"id":{"format":"uuid","type":"string"},"league_id":{"format":"uuid","nullable":true,"type":"string"},"occurred_at":{"format":"date_time","type":"string"},"operation":{"enum":["upsert","remove"],"type":"string"},"schema_version":{"enum":[2],"type":"integer"},"sequence":{"minimum":1,"type":"integer"},"source":{"type":"string"},"source_learned_at":{"format":"date_time","type":"string"},"source_observed_at":{"format":"date_time","nullable":true,"type":"string"},"transition":{"additionalProperties":true,"type":"object"}},"required":["id","sequence","operation","schema_version","entity_type","common_model_id","change_types","occurred_at","data"],"type":"object"},"type":"array"},"has_more":{"type":"boolean"},"scope_digest":{"type":"string"}},"required":["data","cursor","has_more"],"type":"object"}}},"description":"Changes"},"400":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"bad_request","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/bad_request","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"invalid_api_key","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/invalid_api_key","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"forbidden","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/forbidden","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Forbidden"},"409":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"conflict","type":"string"},"reason":{"enum":["scope_changed"],"type":"string"},"reset_required":{"enum":[true],"type":"boolean"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/conflict","type":"string"}},"required":["type","title","status","detail","error_code","reason","reset_required"],"type":"object"}}},"description":"Change-feed scope changed"},"410":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"gone","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/gone","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Gone"},"500":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"internal_error","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/internal_error","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Internal Server Error"}},"summary":"List schema-v2 entity changes","tags":["SportsStack"]}},"/api/v1/events/{id}/event-stats":{"get":{"callbacks":{},"operationId":"ApiRestWeb.EventController.index_related_event_stats","parameters":[{"description":"Event ID (UUID)","example":"01c7133f-2999-4803-9872-8c2ab1ba63ac","in":"path","name":"id","required":true,"schema":{"type":"string"}},{"description":"The type of stats to query (projections / boxscore)","example":"projections","in":"query","name":"type","required":false,"schema":{"type":"string"}},{"description":"Page number for page/per_page pagination. Do not combine with limit/offset.","in":"query","name":"page","required":false,"schema":{"default":1,"minimum":1,"type":"integer"}},{"description":"Number of items per page (max 1000). Do not combine with limit/offset.","in":"query","name":"per_page","required":false,"schema":{"default":100,"maximum":1000,"minimum":1,"type":"integer"}},{"description":"Include source mappings from the specific integration (i.e. a provider key) will return a source_mappings object with the mappings for the respective objects","in":"query","name":"return_source_id_format","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"description":"Performance statistics for players and teams within a specific event.\n\nContains both actual game results and projected/fantasy statistics from various data providers.\nFor comprehensive sport-specific stat definitions, see the EventScopedStats model documentation.\n\n## Core Concepts\n- **Entity Types**: \"player\" (individual stats) or \"team\" (team-level stats)\n- **Data Sources**: official feeds and projection providers (see `source`)\n- **Projections vs Actuals**: is_projection distinguishes forecasts from results\n- **Sport Variation**: data field contains sport/league-specific statistics\n\n## Sample Stats by Sport\n- **Football**: passing_yards, rushing_touchdowns, receptions, sacks, field_goals_made\n- **Basketball**: points, rebounds, assists, field_goals_made, three_pointers_made\n- **Baseball**: hits, home_runs, rbis, strikeouts, earned_run_average, saves\n- **Hockey**: goals, assists, shots, penalty_minutes, save_percentage, wins\n- **Golf**: score, position, money_earned, eagles, birdies, made_cut\n","example":{"common_model_id":"49306211-7b48-4b5e-88e9-a4190189dbea","data":{"completion_percentage":68.2,"interceptions":0.8,"passing_touchdowns":2.1,"passing_yards":285.5,"rushing_yards":22.3},"event_id":"a96af633-aee6-48a0-bf72-0865a4419772","for_entity_id":"59291391-0c7e-442b-9496-33074647384e","for_entity_type":"player","inserted_at":"2024-08-26T22:03:16-04:00","is_projection":true,"scheduled_start_time":"2024-11-17T13:00:00Z","season_year":2024,"source":"ftn","team_id":"b3f7a1c2-9d4e-4f8a-b5c6-1a2b3c4d5e6f","updated_at":"2024-08-26T22:03:16-04:00","week":12},"properties":{"common_model_id":{"description":"EventScopedStats ID","format":"uuid","type":"string"},"data":{"additionalProperties":false,"description":"Sport and position-specific performance statistics with canonical field names.\n\n## Standardized Stat Names\nAll statistics use our unified canonical naming system to ensure consistency across data providers.\nFor example, passing yards from two different providers (\"pass_yds\" and \"py\") both map to \"passing_yards\".\n\n## Current Football Stats (Auto-Generated)\nThis schema is automatically synchronized with our stat registry to include:\n- **Passing**: passing_yards, passing_attempts, passing_completions, passing_tds, interceptions, sacks, deep_pass_completions, pass_long, interception_worthy_throws, pass_first_downs, passing_yards_300_plus, passing_tds_40_plus_yards, deep_pass_attempts, depth_of_target, spikes, passing_rating, completion_percentage, passing_avg_yards, passing_air_yards, passing_net_yards, passing_gross_yards, redzone_passing_attempts, passing_longest_touchdown, on_target_throws, poor_throws, defended_passes, dropped_passes, batted_passes, qb_hurries, qb_knockdowns, avg_pocket_time, total_pocket_time, blitzes_faced, throwaways, spikes, interception_touchdowns_thrown, sacks_taken, sack_yards_lost, passing_20_plus, passing_40_plus, time_to_throw, throw_away, is_out_of_pocket, passing_two_point_conversions\n- **Rushing**: rushing_yards, rushing_attempts, rushing_tds, successful_rush_attempts, explosive_runs, rush_rate, rush_long, goal_line_touches, rushing_first_downs, rushing_yards_100_plus, rushing_tds_40_plus_yards, rushing_direction, kneels, rushing_fumbles, rushing_20_plus, rushing_40_plus, rushing_avg_yards, rushing_longest_touchdown, redzone_rushing_attempts, broken_tackles, yards_after_contact, kneel_downs, scrambles, tackles_for_loss, tackles_for_loss_yards, rushing_two_point_conversions\n- **Receiving**: receiving_yards, receptions, receiving_targets, receiving_tds, dropped_pass, first_read_targets, first_read_receptions, contested_ball, catchable_ball, created_reception, deep_targets, deep_receptions, rec_long, cushion_yards, receiving_first_downs, receiving_yards_100_plus, receiving_tds_40_plus_yards, deep_pass_receptions, receiving_20_plus, receiving_40_plus, receiving_fumbles, separation_yards, separation_type, yards_after_catch, route_type, receiving_two_point_conversions\n- **Defense**: fumbles, forced_fumbles, fumbles_recovered, assisted_tackles, solo_tackles, total_tackles, defensive_tackles_combined, special_teams_solo_tackles, special_teams_assisted_tackles, misc_solo_tackles, misc_assisted_tackles, passes_defended, safeties, blocked_kicks, defensive_touchdowns, tackles, def_sack_yards, def_tackles_assisted, def_interception_touchdowns, def_interception_yards, defensive_interceptions, tackles_for_loss, tackles_for_loss_yards, quarterback_hits, fumble_return_yards, fumble_return_touchdowns, interception_return_yards, interception_return_touchdowns, interception_long, interception_return_average, interception_returns, interception_return_longest_touchdown, fumble_long, missed_tackle, missed_tackle_cause, missed_or_broken_tackles, missed_tackle_location, batted_pass, passing_attempts_allowed, passing_completions_allowed, passing_yards_allowed, rushing_attempts_allowed, rushing_yards_allowed, passing_touchdowns_allowed, rushing_touchdowns_allowed, fourth_down_stops, extra_point_return_touchdowns\n- **Kicking**: field_goals_made, field_goals_attempts, field_goal_yards, field_goal_percentage, fg_long, extra_points_made, extra_points_attempted, extra_points_blocked, field_goals_blocked, field_goals_missed, extra_points_missed\n- **Fantasy**: fantasy_points_half_ppr, nfl_fantasy_points, draftkings_fantasy_points, fanduel_fantasy_points, rank, yahoo_fantasy_points, fanduel_fantasy_points_ceiling, draftkings_fantasy_points_ceiling, yahoo_fantasy_points_ceiling, draftkings_ownership, fanduel_ownership, fanduel_rating, draftkings_rating\n\n## Provider Mapping\nOur system automatically translates provider-specific stat names to these canonical names:\n- **Provider A**: \"pass_yds\" → \"passing_yards\"\n- **Provider B**: \"py\" → \"passing_yards\"\n- **Provider C**: \"pass_yd\" → \"passing_yards\"\n\nSee the complete stat registry documentation for all supported stats and provider mappings.\n","example":{"fantasy_points_half_ppr":18.5,"passing_attempts":35,"passing_completions":22,"passing_tds":2,"passing_yards":250,"receiving_tds":1,"receiving_yards":95,"receptions":6,"rushing_attempts":18,"rushing_tds":1,"rushing_yards":85},"properties":{"def_interception_touchdowns":{"description":"Defensive interception touchdowns","example":5,"type":"integer"},"throwaways":{"description":"Number of throw away passes","example":5,"type":"integer"},"fanduel_fantasy_points_ceiling":{"description":"FanDuel fantasy points ceiling","example":18.5,"type":"number"},"on_target_throws":{"description":"Number of on-target throws","example":5,"type":"integer"},"interception_returns":{"description":"Number of interception returns","example":5,"type":"integer"},"kickoff_return_touchdowns":{"description":"Kickoff return touchdowns","example":5,"type":"integer"},"extra_points_attempted":{"description":"Number of extra point attempts","example":5,"type":"integer"},"redzone_rushing_attempts":{"description":"Rush attempts in the red zone","example":15,"type":"integer"},"is_motion":{"description":"Whether player was in motion during play","example":"example_value","type":"boolean"},"passing_attempts":{"description":"Total number of pass attempts","example":15,"type":"integer"},"punt_long":{"description":"Longest punt","example":5,"type":"integer"},"fumble_return_yards":{"description":"Yards gained on fumble returns","example":250,"type":"integer"},"first_read_receptions":{"description":"Number of first read receptions","example":5,"type":"integer"},"red_zone_pass_attempts":{"description":"Pass attempts in red zone","example":15,"type":"integer"},"points":{"description":"Total points scored by team","example":5,"type":"integer"},"depth_of_target":{"description":"Average depth of target","example":12.3,"type":"number"},"defensive_interceptions":{"description":"Defensive interceptions","example":5,"type":"integer"},"receiving_two_point_conversions":{"description":"Receiving two-point conversions","example":5,"type":"integer"},"field_goal_yards":{"description":"Yards gained on field goals","example":250,"type":"integer"},"conversion_defense_successes":{"description":"Two-point conversion defensive successes","example":5,"type":"integer"},"blocked_kick_return_touchdowns":{"description":"Touchdowns scored on blocked kick returns","example":5,"type":"integer"},"fanduel_ownership":{"description":"FanDuel ownership percentage","example":12.3,"type":"number"},"draftkings_fantasy_points_ceiling":{"description":"DraftKings fantasy points ceiling","example":18.5,"type":"number"},"first_read_targets":{"description":"Number of first read targets","example":5,"type":"integer"},"special_teams_snap_count":{"description":"Number of special teams snaps played","example":5,"type":"integer"},"out_of_pocket_reason":{"description":"Reason quarterback left the pocket","example":"example_value","type":"string"},"goal_line_touches":{"description":"Number of goal line touches","example":5,"type":"integer"},"receiving_yards_100_plus":{"description":"Number of 100+ yard receiving games","example":250,"type":"integer"},"total_pocket_time":{"description":"Total time spent in pocket","example":12.3,"type":"number"},"interception_return_longest_touchdown":{"description":"Longest interception return for touchdown","example":5,"type":"integer"},"field_goals_attempts":{"description":"Number of field goal attempts","example":15,"type":"integer"},"safeties":{"description":"Number of safeties","example":5,"type":"integer"},"pass_first_downs":{"description":"First downs gained via passing","example":5,"type":"integer"},"red_zone_passing_completions":{"description":"Passing completions in red zone","example":10,"type":"integer"},"net_punt_yards":{"description":"Net punt yards","example":250,"type":"integer"},"kneel_downs":{"description":"Number of kneel downs","example":5,"type":"integer"},"cushion_yards":{"description":"Cushion yards","example":250,"type":"integer"},"punt_yards":{"description":"Total punt yards","example":250,"type":"integer"},"challenges_remaining":{"description":"Number of challenges remaining","example":5,"type":"integer"},"passing_gross_yards":{"description":"Gross passing yards before sacks","example":250,"type":"integer"},"avg_pocket_time":{"description":"Average time in pocket per pass attempt","example":12.3,"type":"number"},"defended_passes":{"description":"Passes defended by defenders","example":5,"type":"integer"},"dropped_pass":{"description":"Number of dropped passes","example":5,"type":"integer"},"rushing_direction":{"description":"Direction of rushing attempt","example":"example_value","type":"string"},"sacks_taken":{"description":"Number of sacks taken by quarterback","example":5,"type":"integer"},"rec_long":{"description":"Longest reception","example":5,"type":"integer"},"yards_after_catch":{"description":"Yards gained after catch","example":250,"type":"integer"},"activated":{"description":"Player was activated to the game-day roster (shipped as 0/1)","example":5,"type":"integer"},"passing_yards":{"description":"Total passing yards thrown by the player/team","example":250,"type":"integer"},"touchdowns":{"description":"Total touchdowns scored","example":5,"type":"integer"},"rushing_fumbles":{"description":"Number of fumbles while rushing","example":5,"type":"integer"},"pre_snap_motion":{"description":"Player pre-snap motion type","example":"example_value","type":"boolean"},"nfl_fantasy_points":{"description":"NFL fantasy points","example":18.5,"type":"number"},"assisted_tackles":{"description":"Number of assisted tackles","example":5,"type":"integer"},"passing_completions":{"description":"Number of completed passes","example":10,"type":"integer"},"sacks":{"description":"Number of sacks (as QB or defensive player)","example":12.3,"type":"number"},"passing_40_plus":{"description":"Passing completions of 40+ yards","example":5,"type":"integer"},"missed_tackle_location":{"description":"Location of missed tackle","example":"example_value","type":"string"},"rushing_longest_touchdown":{"description":"Longest touchdown rush","example":5,"type":"integer"},"penalty_yards":{"description":"Penalty yards assessed","example":250,"type":"integer"},"rushing_tds_40_plus_yards":{"description":"Rushing touchdowns of 40+ yards","example":250,"type":"integer"},"penalties":{"description":"Number of penalties committed","example":5,"type":"integer"},"rushing_yards":{"description":"Total rushing yards gained","example":250,"type":"integer"},"punt_return_yards":{"description":"Punt return yards","example":250,"type":"integer"},"blocked_kicks":{"description":"Number of blocked kicks","example":5,"type":"integer"},"position":{"description":"Player position","example":"example_value","type":"string"},"sack_yards_lost":{"description":"Yards lost on sacks","example":250,"type":"integer"},"kickoff_touchbacks":{"description":"Number of kickoff touchbacks","example":5,"type":"integer"},"def_interception_yards":{"description":"Defensive interception return yards","example":250,"type":"integer"},"rush_long":{"description":"Longest rush","example":5,"type":"integer"},"played":{"description":"Whether the player appeared in the game","example":"example_value","type":"boolean"},"two_point_conversions":{"description":"Number of two-point conversions","example":5,"type":"integer"},"conversion_defense_attempts":{"description":"Two-point conversion defensive attempts","example":15,"type":"integer"},"tackles":{"description":"Total tackles (solo + assisted)","example":5,"type":"integer"},"return_yards":{"description":"Total return yards (kick/punt combined)","example":250,"type":"integer"},"kickoff_return_yards":{"description":"Total yards on kickoff returns (opponent)","example":250,"type":"integer"},"games_played":{"description":"Number of games played in","example":5,"type":"integer"},"receiving_20_plus":{"description":"Receptions of 20+ yards","example":5,"type":"integer"},"field_goals_missed":{"description":"Field goals missed","example":5,"type":"integer"},"draftkings_rating":{"description":"DraftKings player rating","example":98.7,"type":"number"},"pre_snap_alignment":{"description":"Player pre-snap alignment","example":"example_value","type":"string"},"kickoff_inside_20":{"description":"Kickoffs downed inside the 20 yard line","example":5,"type":"integer"},"batted_passes":{"description":"Passes batted down at line of scrimmage","example":5,"type":"integer"},"rushing_avg_yards":{"description":"Average yards per carry","example":12.3,"type":"number"},"interception_long":{"description":"Longest interception return","example":5,"type":"integer"},"special_teams_assisted_tackles":{"description":"Assisted tackles made on special-teams plays (kick and punt coverage)","example":5,"type":"integer"},"time_to_throw":{"description":"Time from snap to ball release in seconds","example":12.3,"type":"number"},"player_id":{"description":"Player identifier","example":"example_value","type":"string"},"kickoff_out_of_bounds":{"description":"Kickoffs out of bounds","example":5,"type":"integer"},"pass_long":{"description":"Longest pass completion","example":5,"type":"integer"},"fanduel_fantasy_points":{"description":"FanDuel fantasy points","example":18.5,"type":"number"},"def_tackles_assisted":{"description":"Defensive assisted tackles","example":5,"type":"integer"},"punts_inside_20":{"description":"Number of punts inside the 20-yard line","example":5,"type":"integer"},"solo_tackles":{"description":"Number of solo tackles","example":5,"type":"integer"},"redzone_passing_attempts":{"description":"Pass attempts in the red zone","example":15,"type":"integer"},"poor_throws":{"description":"Number of poor throws","example":5,"type":"integer"},"opponent_fumble_recovery_touchdowns":{"description":"Touchdowns on opponent fumble recoveries","example":5,"type":"integer"},"opponent_fumble_recoveries":{"description":"Opponent fumble recoveries","example":5,"type":"integer"},"deep_pass_attempts":{"description":"Deep pass attempts","example":15,"type":"integer"},"gross_kickoff_yards":{"description":"Yards gained on gross kickoffs","example":250,"type":"integer"},"qb_knockdowns":{"description":"Times quarterback was knocked down","example":5,"type":"integer"},"passing_attempts_allowed":{"description":"Passing attempts allowed by defense","example":15,"type":"integer"},"misc_solo_tackles":{"description":"Solo tackles made on change-of-possession plays (interception and fumble returns)","example":5,"type":"integer"},"total_tackles":{"description":"Total tackles across every phase of the game -- scrimmage defense plus special teams plus change-of-possession (misc) plays. This is the quantity NFL tackle props are priced and graded on.","example":5,"type":"integer"},"deep_targets":{"description":"Number of deep targets (20+ yards)","example":5,"type":"integer"},"fumbles":{"description":"Total number of fumbles","example":5,"type":"integer"},"fourth_down_stops":{"description":"Fourth down stops recorded by defense","example":5,"type":"integer"},"rushing_two_point_conversions":{"description":"Rushing two-point conversions","example":5,"type":"integer"},"missed_or_broken_tackles":{"description":"Number of missed or broken tackles","example":5,"type":"integer"},"receiving_yards":{"description":"Total receiving yards gained","example":250,"type":"integer"},"fanduel_rating":{"description":"FanDuel player rating","example":98.7,"type":"number"},"separation_type":{"description":"Type of separation","example":"example_value","type":"string"},"pressure_type":{"description":"Pressure type","example":"example_value","type":"string"},"timeouts_used":{"description":"Number of timeouts used","example":5,"type":"integer"},"returns":{"description":"Number of return attempts (kick/punt)","example":5,"type":"integer"},"conversion_passing_attempts":{"description":"Two-point conversion passing attempts","example":15,"type":"integer"},"net_kickoff_yards":{"description":"Yards gained on net kickoffs","example":250,"type":"integer"},"receiving_targets":{"description":"Number of times targeted for a pass","example":5,"type":"integer"},"extra_points_blocked":{"description":"Number of extra points blocked","example":5,"type":"integer"},"receptions":{"description":"Number of receptions/catches","example":5,"type":"integer"},"snap_counts_confirmed":{"description":"Provider confirms the snap counts for this game are final","example":"example_value","type":"boolean"},"motion_at_snap":{"description":"Player motion status at snap","example":"example_value","type":"boolean"},"receiving_fumbles":{"description":"Number of fumbles while receiving","example":5,"type":"integer"},"explosive_runs":{"description":"Number of explosive rushing attempts (10+ yards)","example":5,"type":"integer"},"rushing_40_plus":{"description":"Rushing attempts of 40+ yards","example":5,"type":"integer"},"interceptions":{"description":"Number of interceptions thrown","example":5,"type":"integer"},"quarterback_hits":{"description":"Number of quarterback hits","example":5,"type":"integer"},"interception_return_yards":{"description":"Yards gained on interception returns","example":250,"type":"integer"},"yahoo_fantasy_points_ceiling":{"description":"Yahoo fantasy points ceiling","example":18.5,"type":"number"},"primary_coverage":{"description":"Primary coverage","example":"example_value","type":"boolean"},"secondary_coverage":{"description":"Secondary coverage","example":"example_value","type":"boolean"},"fumbles_recovered":{"description":"Number of fumbles recovered","example":5,"type":"integer"},"rushing_20_plus":{"description":"Rushing attempts of 20+ yards","example":5,"type":"integer"},"throw_away":{"description":"Whether the pass was intentionally thrown away","example":"example_value","type":"boolean"},"field_goal_percentage":{"description":"Field goal percentage (made/attempted)","example":12.3,"type":"number"},"receiving_tds":{"description":"Number of receiving touchdowns","example":2,"type":"integer"},"passes_defended":{"description":"Number of passes defended","example":5,"type":"integer"},"fumble_return_touchdowns":{"description":"Touchdowns scored on fumble returns","example":5,"type":"integer"},"completion_percentage":{"description":"Pass completion percentage","example":12.3,"type":"number"},"interception_worthy_throws":{"description":"Interception worthy throws","example":5,"type":"integer"},"red_zone_targets":{"description":"Number of targets in the red zone","example":5,"type":"integer"},"allowed_pressure":{"description":"Allowed pressure","example":"example_value","type":"boolean"},"kickoff_yards":{"description":"Total kickoff yards","example":250,"type":"integer"},"qb_hurries":{"description":"Times quarterback was hurried","example":5,"type":"integer"},"kickoff_returns":{"description":"Number of kickoff returns by opponents","example":5,"type":"integer"},"passing_two_point_conversions":{"description":"Passing two-point conversions","example":5,"type":"integer"},"first_downs":{"description":"Total first downs (used for passing first downs in SR)","example":5,"type":"integer"},"defensive_touchdowns":{"description":"Number of defensive touchdowns","example":5,"type":"integer"},"opponent_fumble_recovery_yards":{"description":"Yards gained on opponent fumble recoveries","example":250,"type":"integer"},"blocked_kick_returns":{"description":"Number of blocked kick returns","example":5,"type":"integer"},"conversion_rushing_attempts":{"description":"Two-point conversion rushing attempts","example":15,"type":"integer"},"extra_point_return_touchdowns":{"description":"Extra point attempts returned for a touchdown by the defense","example":5,"type":"integer"},"own_fumble_recoveries":{"description":"Own fumble recoveries","example":5,"type":"integer"},"punts_blocked":{"description":"Number of punts blocked","example":5,"type":"integer"},"rush_rate":{"description":"Rush rate (rushing attempts per play)","example":12.3,"type":"number"},"passing_avg_yards":{"description":"Average yards per pass attempt","example":12.3,"type":"number"},"special_teams_solo_tackles":{"description":"Solo tackles made on special-teams plays (kick and punt coverage)","example":5,"type":"integer"},"red_zone_passing_attempts":{"description":"Passing attempts in red zone","example":15,"type":"integer"},"conversion_rushing_successes":{"description":"Two-point conversion rushing successes","example":5,"type":"integer"},"dropped_passes":{"description":"Passes dropped by receivers","example":5,"type":"integer"},"passing_net_yards":{"description":"Net passing yards (gross yards minus sack yards lost)","example":250,"type":"integer"},"rushing_first_downs":{"description":"First downs gained via rushing","example":5,"type":"integer"},"passing_yards_allowed":{"description":"Passing yards allowed by defense","example":250,"type":"integer"},"tackles_for_loss_yards":{"description":"Yards lost on tackles for loss","example":250,"type":"integer"},"punt_touchbacks":{"description":"Number of punt touchbacks","example":5,"type":"integer"},"missed_tackle_cause":{"description":"Cause of missed tackle","example":"example_value","type":"string"},"missed_tackle":{"description":"Number of missed tackles","example":5,"type":"integer"},"own_fumble_recovery_touchdowns":{"description":"Touchdowns on own fumble recoveries","example":5,"type":"integer"},"auction_value":{"description":"Auction draft value","example":12.3,"type":"number"},"rushing_attempts_allowed":{"description":"Rushing attempts allowed by defense","example":15,"type":"integer"},"receiving_first_downs":{"description":"First downs gained via receiving","example":5,"type":"integer"},"fg_long":{"description":"Longest field goal made","example":5,"type":"integer"},"own_fumble_recovery_yards":{"description":"Yards gained on own fumble recoveries","example":250,"type":"integer"},"player_kickoff_return_yards":{"description":"Kickoff return yards recorded by the returning player","example":250,"type":"integer"},"timeouts_remaining":{"description":"Number of timeouts remaining","example":5,"type":"integer"},"defensive_tackles_combined":{"description":"Tackles (solo + assisted) made on scrimmage defense only, excluding special teams and change-of-possession plays","example":5,"type":"integer"},"tackles_for_loss":{"description":"Rushes resulting in tackles for loss","example":5,"type":"integer"},"rushing_attempts":{"description":"Number of rushing attempts","example":15,"type":"integer"},"games_started":{"description":"Number of games started","example":5,"type":"integer"},"rank":{"description":"Player ranking","example":5,"type":"integer"},"fielding_e":{"description":"Fielding errors","example":5,"type":"integer"},"kickoff_onside_successes":{"description":"Successful onside kicks","example":5,"type":"integer"},"scrambles":{"description":"Number of quarterback scrambles","example":5,"type":"integer"},"passing_touchdowns_allowed":{"description":"Passing touchdowns allowed by defense","example":5,"type":"integer"},"passing_tds":{"description":"Number of passing touchdowns","example":2,"type":"integer"},"spikes":{"description":"Number of spiked passes","example":5,"type":"integer"},"punt_return_attempts":{"description":"Punt return attempts","example":15,"type":"integer"},"conversion_passing_successes":{"description":"Two-point conversion passing successes","example":5,"type":"integer"},"deep_pass_completions":{"description":"Deep pass completions (20+ yards)","example":10,"type":"integer"},"forced_fumbles":{"description":"Number of fumbles forced by defender","example":5,"type":"integer"},"interception_touchdowns_thrown":{"description":"Interceptions returned for touchdowns (pick-6s)","example":5,"type":"integer"},"punt_return_touchdowns":{"description":"Punt return touchdowns","example":5,"type":"integer"},"is_out_of_pocket":{"description":"Whether quarterback left the pocket","example":"example_value","type":"boolean"},"passing_yards_300_plus":{"description":"Passing yards over 300","example":250,"type":"integer"},"kickoff_return_attempts":{"description":"Kickoff return attempts","example":15,"type":"integer"},"rushing_yards_allowed":{"description":"Rushing yards allowed by defense","example":250,"type":"integer"},"jersey":{"description":"Player jersey number","example":"example_value","type":"string"},"passing_rating":{"description":"Quarterback passer rating","example":98.7,"type":"number"},"contested_ball":{"description":"Whether the targeted receiver's pass was contested","example":"example_value","type":"boolean"},"field_goals_made":{"description":"Number of field goals made","example":5,"type":"integer"},"interception_return_average":{"description":"Average yards per interception return","example":12.3,"type":"number"},"extra_points_missed":{"description":"Extra points missed","example":5,"type":"integer"},"yahoo_fantasy_points":{"description":"Yahoo fantasy points","example":18.5,"type":"number"},"defensive_snap_count":{"description":"Number of defensive snaps played","example":5,"type":"integer"},"endzone_fumble_recovery_touchdowns":{"description":"Touchdowns from end zone fumble recoveries","example":5,"type":"integer"},"rushing_touchdowns_allowed":{"description":"Rushing touchdowns allowed by defense","example":5,"type":"integer"},"return_tds":{"description":"Number of return touchdowns","example":2,"type":"integer"},"kickoff_endzone":{"description":"Kickoffs reaching the end zone","example":5,"type":"integer"},"snap_count":{"description":"Number of offensive snaps played","example":5,"type":"integer"},"def_sack_yards":{"description":"Defensive sack yards","example":250,"type":"integer"},"batted_pass":{"description":"Number of passes batted down by defense","example":5,"type":"integer"},"route_type":{"description":"Type of route run by receiver","example":"example_value","type":"string"},"receiving_40_plus":{"description":"Receptions of 40+ yards","example":5,"type":"integer"},"passing_tds_40_plus_yards":{"description":"Passing touchdowns of 40+ yards","example":250,"type":"integer"},"fumbles_out_of_bounds":{"description":"Number of fumbles that went out of bounds","example":5,"type":"integer"},"deep_pass_receptions":{"description":"Deep pass receptions","example":5,"type":"integer"},"fumbles_lost":{"description":"Number of fumbles lost to opponent","example":5,"type":"integer"},"fumble_long":{"description":"Longest fumble return","example":5,"type":"integer"},"punt_fair_catch":{"description":"Number of punt fair catches","example":5,"type":"integer"},"is_successful_play":{"description":"Whether the play was successful","example":"example_value","type":"boolean"},"total":{"description":"Over/under total for betting","example":12.3,"type":"number"},"applied_pressure":{"description":"Applied pressure","example":"example_value","type":"boolean"},"rushing_tds":{"description":"Number of rushing touchdowns","example":2,"type":"integer"},"passing_air_yards":{"description":"Total air yards on pass attempts","example":250,"type":"integer"},"punt_average":{"description":"Average yards per punt","example":12.3,"type":"number"},"field_goals_blocked":{"description":"Number of field goals blocked","example":5,"type":"integer"},"created_reception":{"description":"Whether the receiver created the reception through an exceptional play","example":"example_value","type":"boolean"},"shotgun":{"description":"Plays run from shotgun formation","example":5,"type":"integer"},"kickoff_attempts":{"description":"Total kickoff attempts","example":15,"type":"integer"},"yards_after_contact":{"description":"Yards gained after contact","example":250,"type":"integer"},"kickoff_onside_attempts":{"description":"Onside kick attempts","example":15,"type":"integer"},"receiving_tds_40_plus_yards":{"description":"Receiving touchdowns of 40+ yards","example":250,"type":"integer"},"catchable_ball":{"description":"Whether the targeted receiver's pass was catchable","example":"example_value","type":"boolean"},"passing_longest_touchdown":{"description":"Longest touchdown pass","example":5,"type":"integer"},"separation_yards":{"description":"Separation distance in yards from defender","example":12.3,"type":"number"},"spread":{"description":"Point spread for betting","example":12.3,"type":"number"},"draftkings_ownership":{"description":"DraftKings ownership percentage","example":12.3,"type":"number"},"conversion_receiving_successes":{"description":"Two-point conversion receiving successes","example":5,"type":"integer"},"extra_points_made":{"description":"Number of extra points made","example":5,"type":"integer"},"blocked_kick_return_yards":{"description":"Yards gained on blocked kick returns","example":250,"type":"integer"},"passing_completions_allowed":{"description":"Passing completions allowed by defense","example":10,"type":"integer"},"interception_return_touchdowns":{"description":"Touchdowns scored on interception returns","example":5,"type":"integer"},"successful_rush_attempts":{"description":"Number of successful rushing attempts","example":15,"type":"integer"},"passing_20_plus":{"description":"Passing completions of 20+ yards","example":5,"type":"integer"},"broken_tackles":{"description":"Number of broken tackles","example":5,"type":"integer"},"conversion_receiving_attempts":{"description":"Two-point conversion receiving attempts","example":15,"type":"integer"},"deep_receptions":{"description":"Deep receptions (20+ yards)","example":5,"type":"integer"},"misc_assisted_tackles":{"description":"Assisted tackles made on change-of-possession plays (interception and fumble returns)","example":5,"type":"integer"},"rushing_yards_100_plus":{"description":"Number of 100+ yard rushing games","example":250,"type":"integer"},"draftkings_fantasy_points":{"description":"DraftKings fantasy points","example":18.5,"type":"number"},"challenges_used":{"description":"Number of challenges used","example":5,"type":"integer"},"blitzes_faced":{"description":"Number of blitzes faced","example":5,"type":"integer"},"punt_attempts":{"description":"Number of punt attempts","example":15,"type":"integer"},"penalty_first_downs":{"description":"First downs gained via opponent penalties","example":5,"type":"integer"},"declared_inactive":{"description":"Player was on the officially declared inactive list for this game","example":"example_value","type":"boolean"},"kneels":{"description":"Number of quarterback kneels","example":5,"type":"integer"},"fantasy_points_half_ppr":{"description":"Fantasy points in half-PPR scoring","example":18.5,"type":"number"}},"type":"object"},"event_id":{"description":"Common model ID of the event","example":"a96af633-aee6-48a0-bf72-0865a4419772","format":"uuid","type":"string"},"for_entity_id":{"description":"Common model ID of the entity (player or team)","example":"59291391-0c7e-442b-9496-33074647384e","format":"uuid","type":"string"},"for_entity_type":{"description":"Type of entity the stats belong to","enum":["player","team"],"example":"player","type":"string"},"inserted_at":{"description":"Creation timestamp","format":"date-time","type":"string"},"is_projection":{"description":"true = projected/forecasted stats, false = actual game results","example":true,"type":"boolean"},"scheduled_start_time":{"description":"Event scheduled start time","example":"2024-11-17T13:00:00Z","format":"date-time","type":"string"},"season_year":{"description":"Season year","example":2024,"type":"integer"},"source":{"description":"Data provider/source of the statistics","enum":["sportradar","ftn","espn","fantasylabs","awesemo"],"example":"ftn","type":"string"},"superseded_from_id":{"description":"Originally requested SportsStack ID when this response was resolved through a superseded identity. Omitted for canonical lookups.","format":"uuid","nullable":true,"type":"string"},"team_id":{"description":"Common model ID of the team the player belongs to for this event (only set for player stats)","format":"uuid","type":"string"},"updated_at":{"description":"Last update timestamp","format":"date-time","type":"string"},"week":{"description":"Week number (for weekly sports like NFL)","example":12,"type":"integer"}},"required":["common_model_id","for_entity_type","for_entity_id","event_id","source"],"title":"EventScopedStats","type":"object"}}},"description":"Event Stats Response"}},"summary":"List Event Stats For Event","tags":["Reference"]}},"/api/v1/seasons/{season_year}/season-stats":{"get":{"callbacks":{},"description":"Returns season-level stats for players and teams.\n\nNotes:\n- `team_id` filters stats for that team entity only (not all players on the team).\n- Use `player_id`/`team_id` for single entities, or `player_ids`/`team_ids` for bulk.\n- `for_entity_type` can limit results to `player` or `team`.\n","operationId":"ApiRestWeb.SeasonStatsController.index","parameters":[{"description":"Year for season","in":"path","name":"season_year","required":true,"schema":{"type":"string"}},{"description":"Filter by league ID — accepts a UUID or league abbreviation (e.g., 'NFL', 'NBA'). See GET /api/v1/leagues for all leagues.","in":"query","name":"league_id","required":true,"schema":{"example":"NFL","type":"string"}},{"description":"Filter by stats type (e.g., 'projections', 'boxscore')","in":"query","name":"type","required":false,"schema":{"type":"string"}},{"description":"Filter by logical projection source (a projection source key)","in":"query","name":"source","required":false,"schema":{"type":"string"}},{"description":"Filter by season stage (PRE, REG, POST)","in":"query","name":"season_stage","required":false,"schema":{"example":"REG","type":"string"}},{"description":"Filter by entity type ('player' or 'team')","in":"query","name":"for_entity_type","required":false,"schema":{"enum":["player","team"],"type":"string"}},{"description":"Filter by entity ID (player or team)","example":"01c7133f-2999-4803-9872-8c2ab1ba63ac","in":"query","name":"for_entity_id","required":false,"schema":{"type":"string"}},{"description":"Filter by multiple entity IDs (player or team). Accepts repeated params or comma-separated values.","in":"query","name":"for_entity_ids","required":false,"schema":{"items":{"format":"uuid","type":"string"},"type":"array"}},{"description":"Filter by player ID (single entity)","example":"01c7133f-2999-4803-9872-8c2ab1ba63ac","in":"query","name":"player_id","required":false,"schema":{"type":"string"}},{"description":"Filter by multiple player IDs (repeated or comma-separated)","in":"query","name":"player_ids","required":false,"schema":{"items":{"format":"uuid","type":"string"},"type":"array"}},{"description":"Filter by team ID (single entity)","example":"01c7133f-2999-4803-9872-8c2ab1ba63ac","in":"query","name":"team_id","required":false,"schema":{"type":"string"}},{"description":"Filter by multiple team IDs (repeated or comma-separated)","in":"query","name":"team_ids","required":false,"schema":{"items":{"format":"uuid","type":"string"},"type":"array"}},{"description":"Include source mappings from the specific integration (i.e. a provider key) will return a source_mappings object with the mappings for the respective objects","in":"query","name":"return_source_id_format","required":false,"schema":{"type":"string"}},{"description":"When true, compute exact total_count/total_pages pagination metadata. When false, pagination is cursor-style (the `x-total-count` and `x-total-pages` headers are omitted entirely — a skipped count is reported by absence, never as 0 — and the `link` header's `next` relation advances one page at a time until it is absent) to avoid an expensive count on large result sets. Defaults to the server's configured behavior.","in":"query","name":"count","required":false,"schema":{"type":"boolean"}},{"description":"Page number for page/per_page pagination. Do not combine with limit/offset.","in":"query","name":"page","required":false,"schema":{"default":1,"minimum":1,"type":"integer"}},{"description":"Number of items per page (max 1000). Do not combine with limit/offset.","in":"query","name":"per_page","required":false,"schema":{"default":500,"maximum":1000,"minimum":1,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"description":"Season-level performance statistics aggregated across all events within a specific season.\n\nThese statistics represent cumulative or averaged performance metrics for players and teams\nover an entire season period. Unlike EventScopedStats which capture single-game performance,\nSeasonScopedStats provide the broader context of sustained performance and seasonal trends.\n\n## Key Concepts\n- **Aggregation Period**: Full season statistics (regular season, playoffs, or combined)\n- **Entity Scope**: Both individual players and team-level aggregations\n- **Data Sources**: Official league stats, advanced analytics, projections\n- **Historical Value**: Season stats enable year-over-year comparisons and career tracking\n\n## Statistical Categories\nSeason stats typically include:\n- **Volume Stats**: Total accumulations (total yards, points, games played)\n- **Rate Stats**: Per-game or per-attempt averages (batting average, completion percentage)\n- **Advanced Metrics**: Efficiency ratings, advanced analytics (PER, QBR, OPS)\n- **Projections**: Forecasted season totals based on current pace or modeling\n\n## Applications\n- **Fantasy Sports**: Season-long player evaluation and projections\n- **Team Analysis**: Roster evaluation and performance trends\n- **Historical Comparison**: Career trajectories and milestone tracking\n- **Contract Negotiations**: Performance-based contract evaluations\n","example":{"common_model_id":"a1b2c3d4-e5f6-7890-abcd-ef1234567890","data":{"defensive_yards":16,"offensive_rushing_yards":12},"for_entity_id":"59291391-0c7e-442b-9496-33074647384e","for_entity_type":"player","inserted_at":"2024-08-26T22:03:16-04:00","is_projection":true,"season_year":2024,"source":"example_provider","team_id":"b3f7a1c2-9d4e-4f8a-b5c6-1a2b3c4d5e6f","updated_at":"2024-08-26T22:03:16-04:00"},"properties":{"common_model_id":{"description":"Unique identifier for this season stats record","format":"uuid","type":"string"},"data":{"additionalProperties":false,"description":"Season-aggregated statistics using canonical field names from our stat registry.\n\n## Season-Level Aggregation\nThese statistics represent cumulative or averaged performance across all events\nwithin a season. Values are typically totals, averages, or rate statistics that\nprovide season-long performance context.\n\n## Standardized Stat Names\nAll statistics use our unified canonical naming system. Season stats commonly include:\n- **Volume Stats**: Total accumulations (passing_yards, rushing_attempts, receptions)\n- **Rate Stats**: Per-game or efficiency metrics (completion_percentage, yards_per_carry)\n- **Advanced Metrics**: Calculated performance indicators (quarterback_rating, passer_rating)\n- **Projections**: Forecasted season totals based on pace or modeling\n\n## Data Sources\n- **Official Stats**: League-provided season totals and averages\n- **Calculated Stats**: Derived metrics from event-level data aggregation\n- **Projections**: Forecasted performance based on current pace\n\n## Provider Translation\nSeason data from various providers is normalized to canonical names:\n- **Official feeds**: Season totals and averages\n- **Projection providers**: Projected season statistics and pace-based forecasts\n- **Ranking providers**: Season performance metrics and rankings\n\nSee the complete stat registry for all supported seasonal statistics.\n","example":{"completion_percentage":67.5,"games_played":16,"interceptions":8,"passing_touchdowns":28,"passing_yards":4200,"quarterback_rating":102.3},"properties":{"def_interception_touchdowns":{"description":"Defensive interception touchdowns","example":5,"type":"integer"},"throwaways":{"description":"Number of throw away passes","example":5,"type":"integer"},"fanduel_fantasy_points_ceiling":{"description":"FanDuel fantasy points ceiling","example":18.5,"type":"number"},"on_target_throws":{"description":"Number of on-target throws","example":5,"type":"integer"},"interception_returns":{"description":"Number of interception returns","example":5,"type":"integer"},"kickoff_return_touchdowns":{"description":"Kickoff return touchdowns","example":5,"type":"integer"},"extra_points_attempted":{"description":"Number of extra point attempts","example":5,"type":"integer"},"redzone_rushing_attempts":{"description":"Rush attempts in the red zone","example":15,"type":"integer"},"is_motion":{"description":"Whether player was in motion during play","example":"example_value","type":"boolean"},"passing_attempts":{"description":"Total number of pass attempts","example":15,"type":"integer"},"punt_long":{"description":"Longest punt","example":5,"type":"integer"},"fumble_return_yards":{"description":"Yards gained on fumble returns","example":250,"type":"integer"},"first_read_receptions":{"description":"Number of first read receptions","example":5,"type":"integer"},"red_zone_pass_attempts":{"description":"Pass attempts in red zone","example":15,"type":"integer"},"points":{"description":"Total points scored by team","example":5,"type":"integer"},"depth_of_target":{"description":"Average depth of target","example":12.3,"type":"number"},"defensive_interceptions":{"description":"Defensive interceptions","example":5,"type":"integer"},"receiving_two_point_conversions":{"description":"Receiving two-point conversions","example":5,"type":"integer"},"field_goal_yards":{"description":"Yards gained on field goals","example":250,"type":"integer"},"conversion_defense_successes":{"description":"Two-point conversion defensive successes","example":5,"type":"integer"},"blocked_kick_return_touchdowns":{"description":"Touchdowns scored on blocked kick returns","example":5,"type":"integer"},"fanduel_ownership":{"description":"FanDuel ownership percentage","example":12.3,"type":"number"},"draftkings_fantasy_points_ceiling":{"description":"DraftKings fantasy points ceiling","example":18.5,"type":"number"},"first_read_targets":{"description":"Number of first read targets","example":5,"type":"integer"},"special_teams_snap_count":{"description":"Number of special teams snaps played","example":5,"type":"integer"},"out_of_pocket_reason":{"description":"Reason quarterback left the pocket","example":"example_value","type":"string"},"goal_line_touches":{"description":"Number of goal line touches","example":5,"type":"integer"},"receiving_yards_100_plus":{"description":"Number of 100+ yard receiving games","example":250,"type":"integer"},"total_pocket_time":{"description":"Total time spent in pocket","example":12.3,"type":"number"},"interception_return_longest_touchdown":{"description":"Longest interception return for touchdown","example":5,"type":"integer"},"field_goals_attempts":{"description":"Number of field goal attempts","example":15,"type":"integer"},"safeties":{"description":"Number of safeties","example":5,"type":"integer"},"pass_first_downs":{"description":"First downs gained via passing","example":5,"type":"integer"},"red_zone_passing_completions":{"description":"Passing completions in red zone","example":10,"type":"integer"},"net_punt_yards":{"description":"Net punt yards","example":250,"type":"integer"},"kneel_downs":{"description":"Number of kneel downs","example":5,"type":"integer"},"cushion_yards":{"description":"Cushion yards","example":250,"type":"integer"},"punt_yards":{"description":"Total punt yards","example":250,"type":"integer"},"challenges_remaining":{"description":"Number of challenges remaining","example":5,"type":"integer"},"passing_gross_yards":{"description":"Gross passing yards before sacks","example":250,"type":"integer"},"avg_pocket_time":{"description":"Average time in pocket per pass attempt","example":12.3,"type":"number"},"defended_passes":{"description":"Passes defended by defenders","example":5,"type":"integer"},"dropped_pass":{"description":"Number of dropped passes","example":5,"type":"integer"},"rushing_direction":{"description":"Direction of rushing attempt","example":"example_value","type":"string"},"sacks_taken":{"description":"Number of sacks taken by quarterback","example":5,"type":"integer"},"rec_long":{"description":"Longest reception","example":5,"type":"integer"},"yards_after_catch":{"description":"Yards gained after catch","example":250,"type":"integer"},"activated":{"description":"Player was activated to the game-day roster (shipped as 0/1)","example":5,"type":"integer"},"passing_yards":{"description":"Total passing yards thrown by the player/team","example":250,"type":"integer"},"touchdowns":{"description":"Total touchdowns scored","example":5,"type":"integer"},"rushing_fumbles":{"description":"Number of fumbles while rushing","example":5,"type":"integer"},"pre_snap_motion":{"description":"Player pre-snap motion type","example":"example_value","type":"boolean"},"nfl_fantasy_points":{"description":"NFL fantasy points","example":18.5,"type":"number"},"assisted_tackles":{"description":"Number of assisted tackles","example":5,"type":"integer"},"passing_completions":{"description":"Number of completed passes","example":10,"type":"integer"},"sacks":{"description":"Number of sacks (as QB or defensive player)","example":12.3,"type":"number"},"passing_40_plus":{"description":"Passing completions of 40+ yards","example":5,"type":"integer"},"missed_tackle_location":{"description":"Location of missed tackle","example":"example_value","type":"string"},"rushing_longest_touchdown":{"description":"Longest touchdown rush","example":5,"type":"integer"},"penalty_yards":{"description":"Penalty yards assessed","example":250,"type":"integer"},"rushing_tds_40_plus_yards":{"description":"Rushing touchdowns of 40+ yards","example":250,"type":"integer"},"penalties":{"description":"Number of penalties committed","example":5,"type":"integer"},"rushing_yards":{"description":"Total rushing yards gained","example":250,"type":"integer"},"punt_return_yards":{"description":"Punt return yards","example":250,"type":"integer"},"blocked_kicks":{"description":"Number of blocked kicks","example":5,"type":"integer"},"position":{"description":"Player position","example":"example_value","type":"string"},"sack_yards_lost":{"description":"Yards lost on sacks","example":250,"type":"integer"},"kickoff_touchbacks":{"description":"Number of kickoff touchbacks","example":5,"type":"integer"},"def_interception_yards":{"description":"Defensive interception return yards","example":250,"type":"integer"},"rush_long":{"description":"Longest rush","example":5,"type":"integer"},"played":{"description":"Whether the player appeared in the game","example":"example_value","type":"boolean"},"two_point_conversions":{"description":"Number of two-point conversions","example":5,"type":"integer"},"conversion_defense_attempts":{"description":"Two-point conversion defensive attempts","example":15,"type":"integer"},"tackles":{"description":"Total tackles (solo + assisted)","example":5,"type":"integer"},"return_yards":{"description":"Total return yards (kick/punt combined)","example":250,"type":"integer"},"kickoff_return_yards":{"description":"Total yards on kickoff returns (opponent)","example":250,"type":"integer"},"games_played":{"description":"Number of games played in","example":5,"type":"integer"},"receiving_20_plus":{"description":"Receptions of 20+ yards","example":5,"type":"integer"},"field_goals_missed":{"description":"Field goals missed","example":5,"type":"integer"},"draftkings_rating":{"description":"DraftKings player rating","example":98.7,"type":"number"},"pre_snap_alignment":{"description":"Player pre-snap alignment","example":"example_value","type":"string"},"kickoff_inside_20":{"description":"Kickoffs downed inside the 20 yard line","example":5,"type":"integer"},"batted_passes":{"description":"Passes batted down at line of scrimmage","example":5,"type":"integer"},"rushing_avg_yards":{"description":"Average yards per carry","example":12.3,"type":"number"},"interception_long":{"description":"Longest interception return","example":5,"type":"integer"},"special_teams_assisted_tackles":{"description":"Assisted tackles made on special-teams plays (kick and punt coverage)","example":5,"type":"integer"},"time_to_throw":{"description":"Time from snap to ball release in seconds","example":12.3,"type":"number"},"player_id":{"description":"Player identifier","example":"example_value","type":"string"},"kickoff_out_of_bounds":{"description":"Kickoffs out of bounds","example":5,"type":"integer"},"pass_long":{"description":"Longest pass completion","example":5,"type":"integer"},"fanduel_fantasy_points":{"description":"FanDuel fantasy points","example":18.5,"type":"number"},"def_tackles_assisted":{"description":"Defensive assisted tackles","example":5,"type":"integer"},"punts_inside_20":{"description":"Number of punts inside the 20-yard line","example":5,"type":"integer"},"solo_tackles":{"description":"Number of solo tackles","example":5,"type":"integer"},"redzone_passing_attempts":{"description":"Pass attempts in the red zone","example":15,"type":"integer"},"poor_throws":{"description":"Number of poor throws","example":5,"type":"integer"},"opponent_fumble_recovery_touchdowns":{"description":"Touchdowns on opponent fumble recoveries","example":5,"type":"integer"},"opponent_fumble_recoveries":{"description":"Opponent fumble recoveries","example":5,"type":"integer"},"deep_pass_attempts":{"description":"Deep pass attempts","example":15,"type":"integer"},"gross_kickoff_yards":{"description":"Yards gained on gross kickoffs","example":250,"type":"integer"},"qb_knockdowns":{"description":"Times quarterback was knocked down","example":5,"type":"integer"},"passing_attempts_allowed":{"description":"Passing attempts allowed by defense","example":15,"type":"integer"},"misc_solo_tackles":{"description":"Solo tackles made on change-of-possession plays (interception and fumble returns)","example":5,"type":"integer"},"total_tackles":{"description":"Total tackles across every phase of the game -- scrimmage defense plus special teams plus change-of-possession (misc) plays. This is the quantity NFL tackle props are priced and graded on.","example":5,"type":"integer"},"deep_targets":{"description":"Number of deep targets (20+ yards)","example":5,"type":"integer"},"fumbles":{"description":"Total number of fumbles","example":5,"type":"integer"},"fourth_down_stops":{"description":"Fourth down stops recorded by defense","example":5,"type":"integer"},"rushing_two_point_conversions":{"description":"Rushing two-point conversions","example":5,"type":"integer"},"missed_or_broken_tackles":{"description":"Number of missed or broken tackles","example":5,"type":"integer"},"receiving_yards":{"description":"Total receiving yards gained","example":250,"type":"integer"},"fanduel_rating":{"description":"FanDuel player rating","example":98.7,"type":"number"},"separation_type":{"description":"Type of separation","example":"example_value","type":"string"},"pressure_type":{"description":"Pressure type","example":"example_value","type":"string"},"timeouts_used":{"description":"Number of timeouts used","example":5,"type":"integer"},"returns":{"description":"Number of return attempts (kick/punt)","example":5,"type":"integer"},"conversion_passing_attempts":{"description":"Two-point conversion passing attempts","example":15,"type":"integer"},"net_kickoff_yards":{"description":"Yards gained on net kickoffs","example":250,"type":"integer"},"receiving_targets":{"description":"Number of times targeted for a pass","example":5,"type":"integer"},"extra_points_blocked":{"description":"Number of extra points blocked","example":5,"type":"integer"},"receptions":{"description":"Number of receptions/catches","example":5,"type":"integer"},"snap_counts_confirmed":{"description":"Provider confirms the snap counts for this game are final","example":"example_value","type":"boolean"},"motion_at_snap":{"description":"Player motion status at snap","example":"example_value","type":"boolean"},"receiving_fumbles":{"description":"Number of fumbles while receiving","example":5,"type":"integer"},"explosive_runs":{"description":"Number of explosive rushing attempts (10+ yards)","example":5,"type":"integer"},"rushing_40_plus":{"description":"Rushing attempts of 40+ yards","example":5,"type":"integer"},"interceptions":{"description":"Number of interceptions thrown","example":5,"type":"integer"},"quarterback_hits":{"description":"Number of quarterback hits","example":5,"type":"integer"},"interception_return_yards":{"description":"Yards gained on interception returns","example":250,"type":"integer"},"yahoo_fantasy_points_ceiling":{"description":"Yahoo fantasy points ceiling","example":18.5,"type":"number"},"primary_coverage":{"description":"Primary coverage","example":"example_value","type":"boolean"},"secondary_coverage":{"description":"Secondary coverage","example":"example_value","type":"boolean"},"fumbles_recovered":{"description":"Number of fumbles recovered","example":5,"type":"integer"},"rushing_20_plus":{"description":"Rushing attempts of 20+ yards","example":5,"type":"integer"},"throw_away":{"description":"Whether the pass was intentionally thrown away","example":"example_value","type":"boolean"},"field_goal_percentage":{"description":"Field goal percentage (made/attempted)","example":12.3,"type":"number"},"receiving_tds":{"description":"Number of receiving touchdowns","example":2,"type":"integer"},"passes_defended":{"description":"Number of passes defended","example":5,"type":"integer"},"fumble_return_touchdowns":{"description":"Touchdowns scored on fumble returns","example":5,"type":"integer"},"completion_percentage":{"description":"Pass completion percentage","example":12.3,"type":"number"},"interception_worthy_throws":{"description":"Interception worthy throws","example":5,"type":"integer"},"red_zone_targets":{"description":"Number of targets in the red zone","example":5,"type":"integer"},"allowed_pressure":{"description":"Allowed pressure","example":"example_value","type":"boolean"},"kickoff_yards":{"description":"Total kickoff yards","example":250,"type":"integer"},"qb_hurries":{"description":"Times quarterback was hurried","example":5,"type":"integer"},"kickoff_returns":{"description":"Number of kickoff returns by opponents","example":5,"type":"integer"},"passing_two_point_conversions":{"description":"Passing two-point conversions","example":5,"type":"integer"},"first_downs":{"description":"Total first downs (used for passing first downs in SR)","example":5,"type":"integer"},"defensive_touchdowns":{"description":"Number of defensive touchdowns","example":5,"type":"integer"},"opponent_fumble_recovery_yards":{"description":"Yards gained on opponent fumble recoveries","example":250,"type":"integer"},"blocked_kick_returns":{"description":"Number of blocked kick returns","example":5,"type":"integer"},"conversion_rushing_attempts":{"description":"Two-point conversion rushing attempts","example":15,"type":"integer"},"extra_point_return_touchdowns":{"description":"Extra point attempts returned for a touchdown by the defense","example":5,"type":"integer"},"own_fumble_recoveries":{"description":"Own fumble recoveries","example":5,"type":"integer"},"punts_blocked":{"description":"Number of punts blocked","example":5,"type":"integer"},"rush_rate":{"description":"Rush rate (rushing attempts per play)","example":12.3,"type":"number"},"passing_avg_yards":{"description":"Average yards per pass attempt","example":12.3,"type":"number"},"special_teams_solo_tackles":{"description":"Solo tackles made on special-teams plays (kick and punt coverage)","example":5,"type":"integer"},"red_zone_passing_attempts":{"description":"Passing attempts in red zone","example":15,"type":"integer"},"conversion_rushing_successes":{"description":"Two-point conversion rushing successes","example":5,"type":"integer"},"dropped_passes":{"description":"Passes dropped by receivers","example":5,"type":"integer"},"passing_net_yards":{"description":"Net passing yards (gross yards minus sack yards lost)","example":250,"type":"integer"},"rushing_first_downs":{"description":"First downs gained via rushing","example":5,"type":"integer"},"passing_yards_allowed":{"description":"Passing yards allowed by defense","example":250,"type":"integer"},"tackles_for_loss_yards":{"description":"Yards lost on tackles for loss","example":250,"type":"integer"},"punt_touchbacks":{"description":"Number of punt touchbacks","example":5,"type":"integer"},"missed_tackle_cause":{"description":"Cause of missed tackle","example":"example_value","type":"string"},"missed_tackle":{"description":"Number of missed tackles","example":5,"type":"integer"},"own_fumble_recovery_touchdowns":{"description":"Touchdowns on own fumble recoveries","example":5,"type":"integer"},"auction_value":{"description":"Auction draft value","example":12.3,"type":"number"},"rushing_attempts_allowed":{"description":"Rushing attempts allowed by defense","example":15,"type":"integer"},"receiving_first_downs":{"description":"First downs gained via receiving","example":5,"type":"integer"},"fg_long":{"description":"Longest field goal made","example":5,"type":"integer"},"own_fumble_recovery_yards":{"description":"Yards gained on own fumble recoveries","example":250,"type":"integer"},"player_kickoff_return_yards":{"description":"Kickoff return yards recorded by the returning player","example":250,"type":"integer"},"timeouts_remaining":{"description":"Number of timeouts remaining","example":5,"type":"integer"},"defensive_tackles_combined":{"description":"Tackles (solo + assisted) made on scrimmage defense only, excluding special teams and change-of-possession plays","example":5,"type":"integer"},"tackles_for_loss":{"description":"Rushes resulting in tackles for loss","example":5,"type":"integer"},"rushing_attempts":{"description":"Number of rushing attempts","example":15,"type":"integer"},"games_started":{"description":"Number of games started","example":5,"type":"integer"},"rank":{"description":"Player ranking","example":5,"type":"integer"},"fielding_e":{"description":"Fielding errors","example":5,"type":"integer"},"kickoff_onside_successes":{"description":"Successful onside kicks","example":5,"type":"integer"},"scrambles":{"description":"Number of quarterback scrambles","example":5,"type":"integer"},"passing_touchdowns_allowed":{"description":"Passing touchdowns allowed by defense","example":5,"type":"integer"},"passing_tds":{"description":"Number of passing touchdowns","example":2,"type":"integer"},"spikes":{"description":"Number of spiked passes","example":5,"type":"integer"},"punt_return_attempts":{"description":"Punt return attempts","example":15,"type":"integer"},"conversion_passing_successes":{"description":"Two-point conversion passing successes","example":5,"type":"integer"},"deep_pass_completions":{"description":"Deep pass completions (20+ yards)","example":10,"type":"integer"},"forced_fumbles":{"description":"Number of fumbles forced by defender","example":5,"type":"integer"},"interception_touchdowns_thrown":{"description":"Interceptions returned for touchdowns (pick-6s)","example":5,"type":"integer"},"punt_return_touchdowns":{"description":"Punt return touchdowns","example":5,"type":"integer"},"is_out_of_pocket":{"description":"Whether quarterback left the pocket","example":"example_value","type":"boolean"},"passing_yards_300_plus":{"description":"Passing yards over 300","example":250,"type":"integer"},"kickoff_return_attempts":{"description":"Kickoff return attempts","example":15,"type":"integer"},"rushing_yards_allowed":{"description":"Rushing yards allowed by defense","example":250,"type":"integer"},"jersey":{"description":"Player jersey number","example":"example_value","type":"string"},"passing_rating":{"description":"Quarterback passer rating","example":98.7,"type":"number"},"contested_ball":{"description":"Whether the targeted receiver's pass was contested","example":"example_value","type":"boolean"},"field_goals_made":{"description":"Number of field goals made","example":5,"type":"integer"},"interception_return_average":{"description":"Average yards per interception return","example":12.3,"type":"number"},"extra_points_missed":{"description":"Extra points missed","example":5,"type":"integer"},"yahoo_fantasy_points":{"description":"Yahoo fantasy points","example":18.5,"type":"number"},"defensive_snap_count":{"description":"Number of defensive snaps played","example":5,"type":"integer"},"endzone_fumble_recovery_touchdowns":{"description":"Touchdowns from end zone fumble recoveries","example":5,"type":"integer"},"rushing_touchdowns_allowed":{"description":"Rushing touchdowns allowed by defense","example":5,"type":"integer"},"return_tds":{"description":"Number of return touchdowns","example":2,"type":"integer"},"kickoff_endzone":{"description":"Kickoffs reaching the end zone","example":5,"type":"integer"},"snap_count":{"description":"Number of offensive snaps played","example":5,"type":"integer"},"def_sack_yards":{"description":"Defensive sack yards","example":250,"type":"integer"},"batted_pass":{"description":"Number of passes batted down by defense","example":5,"type":"integer"},"route_type":{"description":"Type of route run by receiver","example":"example_value","type":"string"},"receiving_40_plus":{"description":"Receptions of 40+ yards","example":5,"type":"integer"},"passing_tds_40_plus_yards":{"description":"Passing touchdowns of 40+ yards","example":250,"type":"integer"},"fumbles_out_of_bounds":{"description":"Number of fumbles that went out of bounds","example":5,"type":"integer"},"deep_pass_receptions":{"description":"Deep pass receptions","example":5,"type":"integer"},"fumbles_lost":{"description":"Number of fumbles lost to opponent","example":5,"type":"integer"},"fumble_long":{"description":"Longest fumble return","example":5,"type":"integer"},"punt_fair_catch":{"description":"Number of punt fair catches","example":5,"type":"integer"},"is_successful_play":{"description":"Whether the play was successful","example":"example_value","type":"boolean"},"total":{"description":"Over/under total for betting","example":12.3,"type":"number"},"applied_pressure":{"description":"Applied pressure","example":"example_value","type":"boolean"},"rushing_tds":{"description":"Number of rushing touchdowns","example":2,"type":"integer"},"passing_air_yards":{"description":"Total air yards on pass attempts","example":250,"type":"integer"},"punt_average":{"description":"Average yards per punt","example":12.3,"type":"number"},"field_goals_blocked":{"description":"Number of field goals blocked","example":5,"type":"integer"},"created_reception":{"description":"Whether the receiver created the reception through an exceptional play","example":"example_value","type":"boolean"},"shotgun":{"description":"Plays run from shotgun formation","example":5,"type":"integer"},"kickoff_attempts":{"description":"Total kickoff attempts","example":15,"type":"integer"},"yards_after_contact":{"description":"Yards gained after contact","example":250,"type":"integer"},"kickoff_onside_attempts":{"description":"Onside kick attempts","example":15,"type":"integer"},"receiving_tds_40_plus_yards":{"description":"Receiving touchdowns of 40+ yards","example":250,"type":"integer"},"catchable_ball":{"description":"Whether the targeted receiver's pass was catchable","example":"example_value","type":"boolean"},"passing_longest_touchdown":{"description":"Longest touchdown pass","example":5,"type":"integer"},"separation_yards":{"description":"Separation distance in yards from defender","example":12.3,"type":"number"},"spread":{"description":"Point spread for betting","example":12.3,"type":"number"},"draftkings_ownership":{"description":"DraftKings ownership percentage","example":12.3,"type":"number"},"conversion_receiving_successes":{"description":"Two-point conversion receiving successes","example":5,"type":"integer"},"extra_points_made":{"description":"Number of extra points made","example":5,"type":"integer"},"blocked_kick_return_yards":{"description":"Yards gained on blocked kick returns","example":250,"type":"integer"},"passing_completions_allowed":{"description":"Passing completions allowed by defense","example":10,"type":"integer"},"interception_return_touchdowns":{"description":"Touchdowns scored on interception returns","example":5,"type":"integer"},"successful_rush_attempts":{"description":"Number of successful rushing attempts","example":15,"type":"integer"},"passing_20_plus":{"description":"Passing completions of 20+ yards","example":5,"type":"integer"},"broken_tackles":{"description":"Number of broken tackles","example":5,"type":"integer"},"conversion_receiving_attempts":{"description":"Two-point conversion receiving attempts","example":15,"type":"integer"},"deep_receptions":{"description":"Deep receptions (20+ yards)","example":5,"type":"integer"},"misc_assisted_tackles":{"description":"Assisted tackles made on change-of-possession plays (interception and fumble returns)","example":5,"type":"integer"},"rushing_yards_100_plus":{"description":"Number of 100+ yard rushing games","example":250,"type":"integer"},"draftkings_fantasy_points":{"description":"DraftKings fantasy points","example":18.5,"type":"number"},"challenges_used":{"description":"Number of challenges used","example":5,"type":"integer"},"blitzes_faced":{"description":"Number of blitzes faced","example":5,"type":"integer"},"punt_attempts":{"description":"Number of punt attempts","example":15,"type":"integer"},"penalty_first_downs":{"description":"First downs gained via opponent penalties","example":5,"type":"integer"},"declared_inactive":{"description":"Player was on the officially declared inactive list for this game","example":"example_value","type":"boolean"},"kneels":{"description":"Number of quarterback kneels","example":5,"type":"integer"},"fantasy_points_half_ppr":{"description":"Fantasy points in half-PPR scoring","example":18.5,"type":"number"}},"type":"object"},"for_entity_id":{"description":"Common model ID of the player or team these stats belong to","type":"string"},"for_entity_type":{"description":"Type of entity: 'player' for individual athletes, 'team' for team aggregations","type":"string"},"inserted_at":{"description":"Timestamp when this statistics record was first created","format":"date-time","type":"string"},"is_projection":{"description":"true for forecasted/projected stats, false for actual recorded performance","type":"boolean"},"league_id":{"description":"League/competition context for the statistics","type":"string"},"season_stage":{"description":"Stage of the season (e.g., 'REG', 'PRE', 'POST', 'IST', 'PIT', 'SC', 'EX', 'CC', 'CT', 'ALL_STAR')","type":"string"},"season_year":{"description":"Calendar year the season primarily occurs in (e.g., 2024 for 2024-25 NBA season)","type":"integer"},"source":{"description":"Data provider or calculation method (e.g., 'calculated')","type":"string"},"team_id":{"description":"Common model ID of the team (set for player season stats)","format":"uuid","type":"string"},"updated_at":{"description":"Timestamp of the most recent update to these statistics","format":"date-time","type":"string"}},"title":"SeasonScopedStats","type":"object"}}},"description":"SeasonStats Response"},"401":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"invalid_api_key","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/invalid_api_key","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"not_found","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/not_found","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Not Found"}},"summary":"List Season Stats","tags":["Stats & Data"]}},"/api/v1/events/{id}/parlay-odds":{"post":{"callbacks":{},"description":"Prices a phase-1 MLB pregame same-game parlay directly against supported sportsbooks and\nreturns a normalized fair-value estimate.\n\nThis endpoint accepts normalized SportsStack leg definitions and returns per-book\ndirect quote results. FanDuel and DraftKings are the primary phase-1 demo books.\nRetail sportsbook fanout remains scoped to one `point_spread` leg plus one\n`total_points` leg. Prediction-market-only requests (`quote_mode=fair_value`,\n`sportsbooks=[]`) may request listed Kalshi MLB player-prop combo legs when the\nmarket is available in the Kalshi MVE catalog.\n\nWhen prediction-market combo/RFQ sources are configured, executable fresh exchange\nquotes can drive `fair_value.method=exchange_combo_consensus`. Non-executable,\nstale, fixture, seeded, unavailable, or unmapped exchange attempts remain visible\nunder `fair_value.sources.exchange_combo_quote_attempts` but never drive unbiased\nfair value.\n","operationId":"ApiRestWeb.ParlayOddsController.create","parameters":[{"description":"Event ID (UUID)","in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"example":{"client_quote_id":"demo-quote-001","legs":[{"market_type":"point_spread","points":1.5,"selection_line":"away","team_id":"e9adca97-6e01-43ec-b5f1-13f2aa4d672e"},{"market_type":"total_points","points":8.5,"selection_line":"over"}],"pricing_sources":["kalshi"],"quote_mode":"retail_and_fair_value","return_source_id_format":"sportsbook_native","sportsbooks":["fanduel","draftkings"],"use_cache":false},"properties":{"client_quote_id":{"nullable":true,"type":"string"},"legs":{"items":{"properties":{"market_type":{"description":"Retail SGP pricing supports point_spread + total_points. Fair-value-only prediction-market pricing also supports listed Kalshi MLB player-prop combo legs.","enum":["point_spread","total_points","player_hits","player_strikeouts","player_hits_plus_runs_plus_rbis","player_home_runs","total_bases"],"type":"string"},"normalized_selection":{"nullable":true,"type":"string"},"player_id":{"format":"uuid","nullable":true,"type":"string"},"points":{"type":"number"},"selection_line":{"enum":["home","away","over","under"],"type":"string"},"team_id":{"format":"uuid","nullable":true,"type":"string"}},"required":["market_type","selection_line","points"],"type":"object"},"maxItems":2,"minItems":2,"type":"array"},"pricing_sources":{"default":["kalshi"],"description":"Optional prediction-market combo quote sources used for fair value. Defaults to Kalshi. These are separate from retail sportsbooks.","items":{"enum":["kalshi","polymarket"],"type":"string"},"type":"array"},"quote_mode":{"default":"retail_and_fair_value","description":"Controls quote fanout. fair_value requires no retail sportsbooks and prices from prediction-market sources only.","enum":["retail_and_fair_value","retail","fair_value"],"type":"string"},"return_source_id_format":{"nullable":true,"type":"string"},"sportsbooks":{"default":["fanduel","draftkings"],"description":"Optional retail sportsbook fanout. Defaults to the phase-1 direct lane: fanduel + draftkings. Use [] with quote_mode=fair_value for prediction-market-only quotes.","items":{"enum":["fanduel","draftkings","betmgm","pinnacle"],"type":"string"},"type":"array"},"use_cache":{"default":false,"type":"boolean"}},"required":["legs"],"type":"object"}}},"description":"Parlay quote request","required":false},"responses":{"200":{"content":{"application/json":{"schema":{"example":{"data":{"common_model_id":"6e87aa9a-0e69-4f0f-b818-2f49fb4665e4","event_id":"44dc9193-4b22-4611-9493-e3604b79dc2b","fair_value":{"assumed_hold_rate":0.0,"confidence":"medium","edges":[{"expected_value":-0.133,"fair_probability":0.34,"probability_edge":-0.052157,"retail_implied_probability":0.392157,"retail_price":155,"sportsbook":"fanduel"}],"exchange_consensus_probability":0.34,"exchange_market_price_available":true,"hold_adjustment_applied":false,"method":"exchange_combo_consensus","price":194,"price_type":"american","probability":0.34,"provider_pre_margin_available":false,"retail_consensus_probability":0.386918,"source_prediction_markets":["kalshi"],"source_quote_count":1,"source_sportsbooks":["fanduel","draftkings"],"sources":{"exchange_combo_quote_attempts":[{"exchange_market_price_available":true,"executable":true,"expires_at":"2026-04-19T17:50:04.569968Z","liquidity":7500,"live_fair_value_eligible":true,"metadata":{"exchange_market_price_available":true,"fair_probability_method":"maker_midpoint","live_fair_value_eligible":true,"pricing_basis":"rfq_quote"},"price":194,"price_type":"american","pricing_basis":"rfq_quote","probability":0.34,"provider_pre_margin_available":false,"quote_fresh":true,"quote_id":"kalshi-live-rfq-1","source":"kalshi","source_event_id":"KXCOMBO-LAD-SD","source_mappings":[{"event_id":"dfed9875-e196-43d6-8f79-bd85296d0a8c","source":"kalshi","source_event_id":"KXCOMBO-LAD-SD","source_market_id":"KXCOMBO-LAD-SD","source_selection_id":"KXMLBSPREAD-LADSD-LAD"},{"event_id":"dfed9875-e196-43d6-8f79-bd85296d0a8c","source":"kalshi","source_event_id":"KXCOMBO-LAD-SD","source_market_id":"KXCOMBO-LAD-SD","source_selection_id":"KXMLBTOTAL-LADSD-85"}],"source_market_ids":["KXCOMBO-LAD-SD"],"source_selection_ids":["yes"],"spread":0.01,"status":"priced"}],"exchange_combo_quotes":[{"exchange_market_price_available":true,"executable":true,"expires_at":"2026-04-19T17:50:04.569968Z","liquidity":7500,"live_fair_value_eligible":true,"metadata":{"exchange_market_price_available":true,"fair_probability_method":"maker_midpoint","live_fair_value_eligible":true,"pricing_basis":"rfq_quote"},"price":194,"price_type":"american","pricing_basis":"rfq_quote","probability":0.34,"provider_pre_margin_available":false,"quote_fresh":true,"quote_id":"kalshi-live-rfq-1","source":"kalshi","source_event_id":"KXCOMBO-LAD-SD","source_mappings":[{"event_id":"dfed9875-e196-43d6-8f79-bd85296d0a8c","source":"kalshi","source_event_id":"KXCOMBO-LAD-SD","source_market_id":"KXCOMBO-LAD-SD","source_selection_id":"KXMLBSPREAD-LADSD-LAD"},{"event_id":"dfed9875-e196-43d6-8f79-bd85296d0a8c","source":"kalshi","source_event_id":"KXCOMBO-LAD-SD","source_market_id":"KXCOMBO-LAD-SD","source_selection_id":"KXMLBTOTAL-LADSD-85"}],"source_market_ids":["KXCOMBO-LAD-SD"],"source_selection_ids":["yes"],"spread":0.01,"status":"priced"}],"retail_sportsbook_quotes":[{"implied_probability":0.392157,"price":155,"price_type":"american","sportsbook":"fanduel"},{"implied_probability":0.381679,"price":162,"price_type":"american","sportsbook":"draftkings"}]},"status":"estimated","warnings":["Exchange combo quotes are market-clearing/RFQ prices, not the sportsbook provider's internal pre-margin price."]},"legs":[{"market_type":"point_spread","normalized_selection":"away","player_id":null,"points":1.5,"selection_line":"away","team_id":"e9adca97-6e01-43ec-b5f1-13f2aa4d672e"},{"market_type":"total_points","normalized_selection":"over","player_id":null,"points":8.5,"selection_line":"over","team_id":null}],"metadata":{"client_quote_id":"demo-quote-001","exchange_combo_attempt_count":1,"exchange_combo_ineligible_count":0,"exchange_combo_quote_count":1,"fair_value_method":"exchange_combo_consensus","pricing_sources_requested":["kalshi"],"provider_pre_margin_available":false,"quote_mode":"retail_and_fair_value","sportsbooks_requested":["fanduel","draftkings"],"use_cache":false},"quote_type":"same_game_parlay","quotes":[{"deep_link":"https://nj.sportsbook.fanduel.com/addToBetslip?...","metadata":{"adapter_version":"phase1-fanduel-v1","cache_status":"miss","canary_age_seconds":12,"session_age_seconds":87,"session_lease_id":"c14241b8-ae72-41b8-b8ce-067441902c79","session_mode":"http_replay","session_state":"active","warnings":[]},"price":155,"price_type":"american","source_event_id":"35506233","source_market_ids":["734.164937882","734.164970086"],"source_selection_ids":["5408012","12493612"],"sportsbook":"fanduel","status":"priced"},{"deep_link":"https://sportsbook.draftkings.com/event/...?...","metadata":{"adapter_version":"phase1-draftkings-v1","cache_status":"miss","relay_mode":true,"relay_runtime_ms":143,"session_mode":"browser_relay","session_state":"active","warnings":[]},"price":162,"price_type":"american","source_event_id":"34012095","source_market_ids":["84396037","84405836"],"source_selection_ids":["0HC84396037P150_3","0OU84405836O850_1"],"sportsbook":"draftkings","status":"priced"}],"requested_at":"2026-04-19T17:49:49.569968Z","status":"priced"}},"properties":{"data":{"properties":{"common_model_id":{"format":"uuid","type":"string"},"event_id":{"format":"uuid","type":"string"},"fair_value":{"properties":{"assumed_hold_rate":{"type":"number"},"confidence":{"enum":["none","very_low","low","medium","high"],"type":"string"},"edges":{"items":{"properties":{"expected_value":{"type":"number"},"fair_probability":{"type":"number"},"probability_edge":{"type":"number"},"retail_implied_probability":{"type":"number"},"retail_price":{"type":"integer"},"sportsbook":{"type":"string"}},"type":"object"},"type":"array"},"exchange_consensus_probability":{"nullable":true,"type":"number"},"exchange_market_price_available":{"description":"True only when fair value is derived from an executable, fresh, live prediction-market combo/RFQ quote. Configured, seeded, fixture, non-executable, and expired quotes are exposed as attempts but do not set this field.","type":"boolean"},"hold_adjustment_applied":{"type":"boolean"},"method":{"enum":["retail_consensus_hold_adjusted","exchange_combo_consensus"],"type":"string"},"price":{"nullable":true,"type":"integer"},"price_type":{"enum":["american"],"type":"string"},"probability":{"nullable":true,"type":"number"},"provider_pre_margin_available":{"description":"Always false for the direct retail quote lane unless a licensed upstream provider fair-price feed is added.","type":"boolean"},"retail_consensus_probability":{"nullable":true,"type":"number"},"source_prediction_markets":{"items":{"type":"string"},"type":"array"},"source_quote_count":{"type":"integer"},"source_sportsbooks":{"items":{"type":"string"},"type":"array"},"sources":{"description":"Fair-value inputs split into selected exchange combo quotes, all exchange attempts, and retail sportsbook quotes.","properties":{"exchange_combo_quote_attempts":{"description":"All prediction-market source attempts, including ineligible, unmapped, unavailable, and fixture/seeded quotes.","items":{"properties":{"exchange_market_price_available":{"description":"True only for executable, fresh, non-fixture exchange combo quotes that can drive fair value.","type":"boolean"},"executable":{"type":"boolean"},"expires_at":{"format":"date-time","nullable":true,"type":"string"},"liquidity":{"nullable":true,"type":"number"},"live_fair_value_eligible":{"description":"Same eligibility decision used by the estimator. Ineligible attempts remain visible for diagnostics.","type":"boolean"},"metadata":{"additionalProperties":true,"description":"Provider diagnostics. Never rely on raw provider metadata alone for eligibility; use live_fair_value_eligible.","type":"object"},"price":{"nullable":true,"type":"integer"},"price_type":{"enum":["american"],"type":"string"},"pricing_basis":{"description":"Source pricing mode, for example rfq_quote, combo_catalog_discovery, configured_quote, or seeded_quote.","nullable":true,"type":"string"},"probability":{"nullable":true,"type":"number"},"provider_pre_margin_available":{"description":"Always false for exchange/RFQ source summaries. These are market-clearing or RFQ prices, not sportsbook provider pre-margin prices.","type":"boolean"},"quote_fresh":{"type":"boolean"},"quote_id":{"nullable":true,"type":"string"},"source":{"description":"Normalized prediction-market source, for example kalshi or polymarket.","type":"string"},"source_event_id":{"nullable":true,"type":"string"},"source_mappings":{"items":{"additionalProperties":true,"type":"object"},"nullable":true,"type":"array"},"source_market_ids":{"items":{"type":"string"},"type":"array"},"source_selection_ids":{"items":{"type":"string"},"type":"array"},"spread":{"nullable":true,"type":"number"},"status":{"enum":["priced","unsupported","event_unmapped","leg_unmapped","quote_unavailable","timeout","rate_limited","access_blocked","error"],"type":"string"}},"required":["source","status","price_type","provider_pre_margin_available","exchange_market_price_available","live_fair_value_eligible","quote_fresh","executable","metadata"],"type":"object"},"type":"array"},"exchange_combo_quotes":{"description":"Only executable, fresh live prediction-market combo quotes selected as unbiased fair-value inputs.","items":{"properties":{"exchange_market_price_available":{"description":"True only for executable, fresh, non-fixture exchange combo quotes that can drive fair value.","type":"boolean"},"executable":{"type":"boolean"},"expires_at":{"format":"date-time","nullable":true,"type":"string"},"liquidity":{"nullable":true,"type":"number"},"live_fair_value_eligible":{"description":"Same eligibility decision used by the estimator. Ineligible attempts remain visible for diagnostics.","type":"boolean"},"metadata":{"additionalProperties":true,"description":"Provider diagnostics. Never rely on raw provider metadata alone for eligibility; use live_fair_value_eligible.","type":"object"},"price":{"nullable":true,"type":"integer"},"price_type":{"enum":["american"],"type":"string"},"pricing_basis":{"description":"Source pricing mode, for example rfq_quote, combo_catalog_discovery, configured_quote, or seeded_quote.","nullable":true,"type":"string"},"probability":{"nullable":true,"type":"number"},"provider_pre_margin_available":{"description":"Always false for exchange/RFQ source summaries. These are market-clearing or RFQ prices, not sportsbook provider pre-margin prices.","type":"boolean"},"quote_fresh":{"type":"boolean"},"quote_id":{"nullable":true,"type":"string"},"source":{"description":"Normalized prediction-market source, for example kalshi or polymarket.","type":"string"},"source_event_id":{"nullable":true,"type":"string"},"source_mappings":{"items":{"additionalProperties":true,"type":"object"},"nullable":true,"type":"array"},"source_market_ids":{"items":{"type":"string"},"type":"array"},"source_selection_ids":{"items":{"type":"string"},"type":"array"},"spread":{"nullable":true,"type":"number"},"status":{"enum":["priced","unsupported","event_unmapped","leg_unmapped","quote_unavailable","timeout","rate_limited","access_blocked","error"],"type":"string"}},"required":["source","status","price_type","provider_pre_margin_available","exchange_market_price_available","live_fair_value_eligible","quote_fresh","executable","metadata"],"type":"object"},"type":"array"},"retail_sportsbook_quotes":{"description":"Retail sportsbook SGP quotes used for consensus and edge comparison.","items":{"properties":{"implied_probability":{"type":"number"},"price":{"type":"integer"},"price_type":{"enum":["american"],"type":"string"},"sportsbook":{"type":"string"}},"required":["sportsbook","price","price_type","implied_probability"],"type":"object"},"type":"array"}},"required":["exchange_combo_quotes","exchange_combo_quote_attempts","retail_sportsbook_quotes"],"type":"object"},"status":{"enum":["estimated","unavailable"],"type":"string"},"warnings":{"items":{"type":"string"},"type":"array"}},"required":["status","price_type","method","provider_pre_margin_available","exchange_market_price_available","retail_consensus_probability","exchange_consensus_probability","assumed_hold_rate","hold_adjustment_applied","source_quote_count","source_sportsbooks","source_prediction_markets","confidence","edges","sources","warnings"],"type":"object"},"legs":{"items":{"properties":{"market_type":{"description":"Retail SGP pricing supports point_spread + total_points. Fair-value-only prediction-market pricing also supports listed Kalshi MLB player-prop combo legs.","enum":["point_spread","total_points","player_hits","player_strikeouts","player_hits_plus_runs_plus_rbis","player_home_runs","total_bases"],"type":"string"},"normalized_selection":{"nullable":true,"type":"string"},"player_id":{"format":"uuid","nullable":true,"type":"string"},"points":{"type":"number"},"selection_line":{"enum":["home","away","over","under"],"type":"string"},"team_id":{"format":"uuid","nullable":true,"type":"string"}},"required":["market_type","selection_line","points"],"type":"object"},"type":"array"},"metadata":{"additionalProperties":true,"type":"object"},"quote_type":{"enum":["same_game_parlay"],"type":"string"},"quotes":{"items":{"properties":{"deep_link":{"nullable":true,"type":"string"},"metadata":{"additionalProperties":true,"description":"Diagnostic metadata such as cache_status, warnings, failure_code, failure_category, http_status, request_phase, retryable, session_hint, and session lease fields like session_lease_id, session_mode, session_state, session_age_seconds, canary_age_seconds, and candidate_refresh_in_progress","type":"object"},"price":{"nullable":true,"type":"integer"},"price_type":{"enum":["american"],"type":"string"},"source_event_id":{"nullable":true,"type":"string"},"source_mappings":{"additionalProperties":true,"nullable":true,"type":"object"},"source_market_ids":{"items":{"type":"string"},"type":"array"},"source_selection_ids":{"items":{"type":"string"},"type":"array"},"sportsbook":{"type":"string"},"status":{"enum":["priced","unsupported","event_unmapped","leg_unmapped","session_expired","access_blocked","stale","timeout","error"],"type":"string"}},"required":["sportsbook","status","price_type","source_market_ids","source_selection_ids","metadata"],"type":"object"},"type":"array"},"requested_at":{"format":"date-time","type":"string"},"status":{"enum":["priced","partial","failed"],"type":"string"}},"required":["common_model_id","event_id","quote_type","status","legs","quotes","fair_value","requested_at"],"type":"object"}},"required":["data"],"type":"object"}}},"description":"Parlay quote response"},"400":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"bad_request","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/bad_request","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"invalid_api_key","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/invalid_api_key","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"not_found","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/not_found","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Not Found"},"422":{"content":{"application/json":{"schema":{"properties":{"detail":{"type":"string"},"error_code":{"type":"string"},"errors":{"additionalProperties":true,"type":"object"},"status":{"type":"integer"},"title":{"type":"string"},"type":{"type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Validation Error"}},"summary":"Price a same-game parlay and estimate fair value for an event","tags":["Betting"]}},"/api/v1/self-service/mappings/pending/{id}/reconcile":{"post":{"callbacks":{},"operationId":"ApiRestWeb.SelfServiceController.reconcile","parameters":[{"description":"","in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"example":{"action":"map","common_model_id":"550e8400-e29b-41d4-a716-446655440000","evidence":{"reviewed_by":"external-reviewer"}},"properties":{"action":{"enum":["map","ignore"],"type":"string"},"common_model_id":{"format":"uuid","nullable":true,"type":"string"},"evidence":{"type":"object"},"reason":{"nullable":true,"type":"string"}},"required":["action"],"type":"object"}}},"description":"Pending mapping reconciliation request","required":false},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"properties":{"action":{"nullable":true,"type":"string"},"common_model_id":{"format":"uuid","nullable":true,"type":"string"},"entity":{"type":"object"},"entity_type":{"enum":["player","team","event"],"type":"string"},"ignored_pending":{"type":"boolean"},"mapping_id":{"format":"uuid","type":"string"},"mapping_state":{"enum":["mapped","pending","ignored"],"type":"string"},"match_status":{"nullable":true,"type":"string"},"pending_mapping_id":{"format":"uuid","nullable":true,"type":"string"},"source":{"example":"cbs.basketball.nba","type":"string"},"source_id":{"example":"cbs-breanna-stewart","type":"string"}},"type":"object"}},"type":"object"}}},"description":"Self-service reconciliation response"},"400":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"bad_request","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/bad_request","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"invalid_api_key","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/invalid_api_key","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"forbidden","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/forbidden","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"not_found","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/not_found","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Not Found"},"409":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"conflict","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/conflict","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Conflict"},"422":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"validation_error","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/validation_error","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Validation Error"},"503":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"service_unavailable","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/service_unavailable","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Service Unavailable"}},"summary":"Reconcile or ignore a pending mapping","tags":["Self-Service"]}},"/api/v1/events/{id}/line-summary":{"get":{"callbacks":{},"description":"Retrieve the opening and closing line (price + points) each sportsbook offered\nfor every outcome of an event, plus the observed min/max price.\n\nUnlike `/v1/odds` — which serves the latest/current position — this endpoint\nexposes the durable line-movement aggregate, so a client can grade\nagainst-the-spread (ATS) and over/under (O/U) records using the pre-game line\nrather than the current one. Pair each row's `points`/`closing_price` with the\nevent's final score (`GET /v1/events/:id?include_scoreboard=true`).\n\nTenant source visibility is applied and fails closed: an event with no\ntenant-visible priced sources returns an empty list.\n","operationId":"ApiRestWeb.OddsControllerV2.line_summary","parameters":[{"description":"Event ID (UUID)","example":"5c4e8fe4-5bc9-49e1-aa84-aaa975900703","in":"path","name":"id","required":true,"schema":{"type":"string"}},{"description":"Filter by sportsbook name","in":"query","name":"sportsbook","required":false,"schema":{"type":"string"}},{"description":"Filter by a single aggregator. A comma-separated list returns 400; send one request per aggregator.","in":"query","name":"aggregator","required":false,"schema":{"type":"string"}},{"description":"Filter by market type (e.g., 'point_spread', 'total_points', 'moneyline')","in":"query","name":"market_type","required":false,"schema":{"type":"string"}},{"description":"Filter by price type","in":"query","name":"price_type","required":false,"schema":{"type":"string"}},{"description":"Filter to main lines only (true/false)","in":"query","name":"is_main","required":false,"schema":{"type":"boolean"}},{"description":"Page number for page/per_page pagination. Do not combine with limit/offset.","in":"query","name":"page","required":false,"schema":{"default":1,"minimum":1,"type":"integer"}},{"description":"Number of items per page (max 1000). Do not combine with limit/offset.","in":"query","name":"per_page","required":false,"schema":{"default":1000,"maximum":1000,"minimum":1,"type":"integer"}},{"description":"Maximum rows for limit/offset pagination. Do not combine with page/per_page.","in":"query","name":"limit","required":false,"schema":{"maximum":1000,"minimum":1,"type":"integer"}},{"description":"Zero-based row offset for limit/offset pagination. Do not combine with page/per_page.","in":"query","name":"offset","required":false,"schema":{"minimum":0,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"items":{"description":"Per-position line movement summary: the opening and closing price/point the book offered for one outcome, plus the observed min/max. Enables computing pre-game (opening/closing) lines for ATS and over/under grading.","properties":{"aggregator":{"nullable":true,"type":"string"},"bet_type":{"nullable":true,"type":"string"},"closing_price":{"description":"Last observed price before the market closed","nullable":true,"type":"number"},"closing_timestamp":{"format":"date-time","nullable":true,"type":"string"},"common_model_id":{"format":"uuid","type":"string"},"event_id":{"format":"uuid","type":"string"},"is_main":{"nullable":true,"type":"boolean"},"league_id":{"format":"uuid","nullable":true,"type":"string"},"market_id":{"format":"uuid","nullable":true,"type":"string"},"market_name":{"nullable":true,"type":"string"},"market_type":{"nullable":true,"type":"string"},"max_price":{"nullable":true,"type":"number"},"min_price":{"nullable":true,"type":"number"},"normalized_selection":{"nullable":true,"type":"string"},"opening_price":{"description":"First observed price for this position","nullable":true,"type":"number"},"opening_timestamp":{"format":"date-time","nullable":true,"type":"string"},"outcome_id":{"format":"uuid","nullable":true,"type":"string"},"outcome_name":{"nullable":true,"type":"string"},"player_id":{"format":"uuid","nullable":true,"type":"string"},"points":{"nullable":true,"type":"number"},"price_type":{"nullable":true,"type":"string"},"selection_line":{"nullable":true,"type":"string"},"side":{"nullable":true,"type":"string"},"snapshot_count":{"nullable":true,"type":"integer"},"sportsbook":{"nullable":true,"type":"string"},"team_id":{"format":"uuid","nullable":true,"type":"string"}},"type":"object"},"type":"array"}},"type":"object"}}},"description":"Success"},"400":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"bad_request","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/bad_request","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"invalid_api_key","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/invalid_api_key","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Unauthorized"}},"summary":"Get Event Line Summary","tags":["Betting"]}},"/api/v1/search":{"get":{"callbacks":{},"description":"Free-text search. `q` may mix team names, player names and a market intent\n(\"Lakers moneyline\", \"Raiders player props\", \"Mahomes passing yards\").\n\n**Types.** `types` is a comma-separated subset of `team,player,event,market`\n(default all). `types=team,player,event` never reads odds and is the typeahead\npath; agree a client debounce of about 300 ms. `market` attaches canonical\nmarkets to the matched events. Each quote is the `GET /v1/odds` row with the\nsame `metadata.execution`, `deep_link`, `limits` and `canonical_outcome_id`;\n`line_alignment` (prediction-market line ladder) is **not** included in v1.\n\n**Matching.** Teams match on name, market, nickname, abbreviation and\n`market + nickname` (exact, then prefix, then a whole word of a name or a typo).\nColloquial team names (\"Sixers\", \"Spurs\", \"Man City\", \"Barca\", \"Chivas\") are\nresolved through a curated alias list, and `ø ö ü å æ` match their `oe ue ae aa` spellings.\nAmbiguous names (\"Giants\", \"Kings\", \"Wolves\") return every candidate; nothing is\nguessed.\nPlayers match on full name and, for a single word, family name (exact, then\nprefix). When that finds no player your tenant can see and no team matched, a\nmisspelling is matched against the players that have player markets from 7 days\nago to 14 days ahead (not the whole player table): accents and word order are\nignored, and a name of 5-9 characters (one word) or 5-15 (several words) may be\none edit away, two from 10 or 16 (an adjacent swap counts as one). A name under 5\ncharacters, a word that is itself a surname, and market, league, sport and common\nwords are never corrected; a one-word query under 10 characters, or several words\nunder 7, must keep its first letter; a missing space between words is not\nrepaired. Such a match has `match_quality` 5-7. Players are\nfound through posted player markets; a player with none in the window (for\nexample \"Aaron Rodgers\" before his game's props are posted) falls back to the\nevents of the player's current team when the name matches exactly (or the result\nis at most 10 players), so the upcoming game is still returned with the team's\nboard. A bare surname with many players does not.\n\n**Ranking.** Only leagues your tenant is entitled to are searched. With\n`event` or `market` in `types`, hits with no event in the window are dropped.\nEvents sort live first, then `scheduled_time`, then `common_model_id`; teams\nand players sort by their earliest event, then match quality; players with no\nevent are ordered by whether their current team plays in the window, then match\nquality, then league id, then `common_model_id`. There is no league-tier\nheuristic.\n\n**Window.** Default now to now+14 days, plus live (in-progress) events that\nstarted within the last 24 hours; a multi-day event that started earlier is not\nreturned. `start_date`/`end_date` (ISO 8601 or `YYYY-MM-DD`, UTC) replace it\n(live events are then not added). `end_date` may be at most 60 days after\n`start_date`: a date-only `end_date` includes that whole day but counts to the\nstart of it, so `2026-01-01`..`2026-03-02` is accepted and `..2026-03-03` is not;\ndatetimes are compared exactly (60 days to the microsecond is accepted).\nCancelled and postponed events are excluded.\n\n**Candidate caps.** Resolution is bounded: at most 24 candidate teams (a nickname\nshared by more, such as \"Eagles\", is ranked first: teams with an event in the\nwindow, then match quality, then nearest event), 50 events\nper team, 600 name matches per player lookup, 10 players, 10 teams returned and\n200 candidate events. `meta.candidates_truncated` is true when any cap cut the\nset. Players are counted as distinct people, not source rows. A very wide\nname prefix (more than 600 distinct players, e.g. a very common surname such as\n\"smith\") is answered by exact full-name match only, so it may return no players\nwith `candidates_truncated: true`; add a first name or initial to narrow it.\nTeam matching is exact, then prefix, then a whole word of a name (4+ characters)\nand typo-tolerant matching with a tight bound (one edit for 5-8 character names,\ntwo from 9, an adjacent swap counts as one; one edit for a 4-character nickname;\na missing or extra first letter on 5+ characters; abbreviations are exact only). `meta.incomplete_resolution` is true when a resolution read failed or timed\nout: results may be missing entities or events (such answers are never cached).\n\n**Odds reads.** Every odds read is scoped to one event; there is never a\nleague-wide read. `sources` (alias `aggregator`) has the same semantics as\n`GET /v1/odds?event_id=&aggregator=` on the plane the deployment serves.\nWith no market intent (neither a market phrase in `q` nor `market_type`) the\nboard is the `core` category (moneyline, spreads, totals and their period\nvariants); name a market or category to see others (`meta.query.market_intent\n.default_scope` is `core` in that case). Per event at most 25 markets, 20\noutcomes per market and 5 quotes per outcome are returned, and at most 2,000\nquotes per response; `truncated` and `meta.truncated_event_ids` say when a cap\ncut a board. When more than 3 teams resolved (an ambiguous nickname such as\n\"Panthers\" or \"Eagles\") each board is cut to 10 markets instead of 25, to keep the\nresponse small. When a board has more than 25 markets the 25 are chosen round-robin\nacross market types (the best covered line of each type first), so one type does\nnot fill the board. The player-prop markets of a board are scoped to the entity in\n`q`: the named player(s) that play in that event, or the roster of the named\nteam(s) playing in it (a roster is the players whose latest team it is, not every\nplayer who was ever listed with it); team, game and event markets (for example in\n\"Mahomes props\") are read unscoped. An event whose roster is missing or over the\nper-team cap, or that no ranked player plays in, stays unscoped and is listed in\n`meta.unscoped_event_ids`; so is an event whose scoped player-prop read found no\nrows at all and was read once more unscoped (and then returned rows). The read is bounded at 3,000 rows per pass; when a\npass is cut, the market types it did not reach are read again (at most 3 passes\nper event). `truncated.rows` is true when rows were left unread, in which case\n`total_markets` is a partial count. Quotes older than the configured maximum\nquote age (default 24 hours) are removed from the boards and counted in\n`meta.stale_quotes_dropped` (an event whose quotes are all stale is returned with\n`markets: []`; kalshi and prophetx quotes are exempt because their timestamps are\nnot proven to advance on an unchanged re-poll); `GET /v1/odds` is unaffected. Read the full board with\n`GET /v1/odds?event_id=`. Events whose read timed out, or that could not be read\nback, are listed in `meta.incomplete_event_ids` with `markets: []`.\n\n**Which parameter filters what.** `sources` (alias `aggregator`) filters QUOTES: the\nboards of the returned events keep only that venue's quotes and no event is ever\ndropped by it (`q=Everton&sources=sxbet` still returns every Everton event). To\nreturn only EVENTS that have markets from a venue use `with_markets_from=<csv>` (alias\n`venue=<csv>` together with `has_venue_markets=true`, the `GET /v1/events` spelling;\n`has_venue_markets=true` alone means `polymarket,kalshi,prophetx`). An event qualifies\nwhen it has an OPEN market (the `market_counts_by_venue` of the event is nonzero) on one of\nthe venues. Venues: `kalshi`, `limitless`, `polymarket`, `polymarket_us`, `predict_fun`,\n`prophetx`, `sxbet` (spellings such as `sx_bet` or `predictfun` are accepted); an unknown\nkey is a 400 `invalid_parameters` with `parameter`, `invalid_values` and `valid_keys`. The\nfilter is applied among the candidate events before paging (`has_next_page`,\n`next_cursor` describe the filtered list; at most 600 candidates are examined,\n`meta.candidates_truncated` says when more existed), needs `event` or `market` in\n`types`, and answers 503 when the counts cannot be read. A canonical parameter next to\nits own alias (`sources` + `aggregator`, `with_markets_from` + `venue` or\n`has_venue_markets`) is a 400 with `conflicts_with`. Only EVENTS are filtered: teams and players are returned as without it. Neither\n`sources` nor `aggregator` narrows `market_count` / `market_counts_by_venue`, which always\ncount the whole event.\n\n**Paging.** `limit` is events per page (default 10, max 25). Follow\n`meta.next_cursor` while `meta.has_next_page`. Cursors are bound to the tenant\nand to every filter, expire after 15 minutes, and are rejected with\n`invalid_cursor` (`reason`: `expired`, `tenant`, `filter_mismatch`,\n`page_size_mismatch`, `malformed`). Paging is stable within the resolution\ncache window and best-effort beyond it.\n\nResponses are `private, no-store`. Overload, a cold team index and an\nunavailable feature-flag or event read return 503 with `retry-after`.\n","operationId":"ApiRestWeb.SearchController.index","parameters":[{"description":"Free text, 2-100 characters after trimming.","example":"lakers moneyline","in":"query","name":"q","required":true,"schema":{"maxLength":100,"minLength":2,"type":"string"}},{"description":"Comma-separated subset of team,player,event,market. Default: all.","example":"team,player,event","in":"query","name":"types","required":false,"schema":{"type":"string"}},{"description":"A canonical market type (for example `moneyline`) or a registry category (`player_props`, `team_props`, `game_props`, `event_props`). Overrides the parsed intent.","in":"query","name":"market_type","required":false,"schema":{"type":"string"}},{"description":"QUOTE filter: per-event odds filter, same semantics as `GET /v1/odds?aggregator=`. One value (a comma list is a 400, an empty value is a 400); a spelling of a known venue (`sx_bet`, `predictfun`) folds to its canonical key, other values (sportsbook and odds-aggregator keys) are kept trimmed and lowercased. Never drops an event and does not narrow `market_count` / `market_counts_by_venue` (they always count the whole event). Alias: `aggregator` (cannot be combined with `sources`).","example":"kalshi","in":"query","name":"sources","required":false,"schema":{"type":"string"}},{"deprecated":true,"description":"Deprecated alias of `sources` (quote filter, does not filter events); kept unchanged. Use `with_markets_from` to filter events.","example":"kalshi","in":"query","name":"aggregator","required":false,"schema":{"type":"string"}},{"description":"RESULT filter: comma-separated venues (`kalshi`, `limitless`, `polymarket`, `polymarket_us`, `predict_fun`, `prophetx`, `sxbet`). Keeps only events with an OPEN market on one of them (nonzero `market_counts_by_venue`). Applied before paging; 503 when the counts cannot be read; unknown venue is a 400 listing `valid_keys`. Requires `event` or `market` in `types`. Does not filter teams or players.","example":"sxbet","in":"query","name":"with_markets_from","required":false,"schema":{"type":"string"}},{"deprecated":true,"description":"Deprecated alias spelling of `with_markets_from` (as `GET /v1/events`): `true` filters events to those with open markets on `venue` (default `polymarket,kalshi,prophetx`). Use `with_markets_from`. Cannot be combined with `with_markets_from`.","in":"query","name":"has_venue_markets","required":false,"schema":{"type":"boolean"}},{"deprecated":true,"description":"Deprecated alias spelling of `with_markets_from`: comma-separated venues; requires `has_venue_markets=true`. Use `with_markets_from`. Cannot be combined with `with_markets_from`.","in":"query","name":"venue","required":false,"schema":{"type":"string"}},{"description":"Window start (ISO 8601 or YYYY-MM-DD, UTC).","in":"query","name":"start_date","required":false,"schema":{"type":"string"}},{"description":"Window end (ISO 8601 or YYYY-MM-DD, UTC), at most 60 days after start. A date-only value includes the whole day but counts to the start of it (`2026-01-01`..`2026-03-02` is accepted, `..2026-03-03` is not).","in":"query","name":"end_date","required":false,"schema":{"type":"string"}},{"description":"Events per page.","in":"query","name":"limit","required":false,"schema":{"default":10,"maximum":25,"minimum":1,"type":"integer"}},{"description":"Opaque cursor from `meta.next_cursor`.","in":"query","name":"cursor","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchResponse"}}},"description":"Search results"},"400":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"bad_request","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/bad_request","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"invalid_api_key","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/invalid_api_key","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"not_found","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/not_found","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Not Found"},"503":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"service_unavailable","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/service_unavailable","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Service Unavailable"}},"summary":"Search teams, players, events and markets","tags":["Search"]}},"/api/v1/global-identities/players":{"get":{"callbacks":{},"operationId":"ApiRestWeb.GlobalIdentityController.index_players","parameters":[{"description":"Search tenant-visible global player groups by player or canonical name","in":"query","name":"search_phrase","required":false,"schema":{"example":"Messi","type":"string"}},{"description":"SportsStack global player ID","in":"query","name":"global_player_id","required":false,"schema":{"format":"uuid","type":"string"}},{"description":"League-scoped player common_model_id","in":"query","name":"player_id","required":false,"schema":{"format":"uuid","type":"string"}},{"description":"Page number for page/per_page pagination. Do not combine with limit/offset.","in":"query","name":"page","required":false,"schema":{"default":1,"minimum":1,"type":"integer"}},{"description":"Number of items per page (max 1000). Do not combine with limit/offset.","in":"query","name":"per_page","required":false,"schema":{"default":250,"maximum":1000,"minimum":1,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"items":{"properties":{"canonical_name":{"type":"string"},"global_player_id":{"format":"uuid","nullable":true,"type":"string"},"player_ids":{"items":{"format":"uuid","type":"string"},"type":"array"},"players":{"items":{"properties":{"common_model_id":{"format":"uuid","type":"string"},"full_name":{"type":"string"},"is_active":{"type":"boolean"},"league_abbreviation":{"nullable":true,"type":"string"},"league_id":{"format":"uuid","type":"string"},"team_id":{"format":"uuid","nullable":true,"type":"string"}},"type":"object"},"type":"array"}},"required":["global_player_id","canonical_name","player_ids","players"],"type":"object"},"type":"array"}},"required":["data"],"type":"object"}}},"description":"Global Player Groups"},"400":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"bad_request","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/bad_request","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"invalid_api_key","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/invalid_api_key","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Unauthorized"}},"summary":"List Global Player Identity Groups","tags":["Reference"]}},"/api/v1/event-stats":{"get":{"callbacks":{},"operationId":"ApiRestWeb.EventStatsController.index","parameters":[{"description":"Filter by event ID. Required unless global_player_id is provided.","in":"query","name":"event_id","required":false,"schema":{"type":"string"}},{"description":"Filter player stats by SportsStack global player ID. Required unless event_id is provided.","in":"query","name":"global_player_id","required":false,"schema":{"type":"string"}},{"description":"Filter by stats type (e.g., 'projections', 'boxscore')","in":"query","name":"type","required":false,"schema":{"type":"string"}},{"description":"Filter by week","in":"query","name":"week","required":false,"schema":{"type":"integer"}},{"description":"Filter by season year","in":"query","name":"season_year","required":false,"schema":{"type":"integer"}},{"description":"Filter by entity type ('player' or 'team')","in":"query","name":"for_entity_type","required":false,"schema":{"type":"string"}},{"description":"Include source mappings from the specific integration (i.e. a provider key) will return a source_mappings object with the mappings for the respective objects","in":"query","name":"return_source_id_format","required":false,"schema":{"type":"string"}},{"description":"Page number for page/per_page pagination. Do not combine with limit/offset.","in":"query","name":"page","required":false,"schema":{"default":1,"minimum":1,"type":"integer"}},{"description":"Number of items per page (max 1000). Do not combine with limit/offset.","in":"query","name":"per_page","required":false,"schema":{"default":1000,"maximum":1000,"minimum":1,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"description":"Performance statistics for players and teams within a specific event.\n\nContains both actual game results and projected/fantasy statistics from various data providers.\nFor comprehensive sport-specific stat definitions, see the EventScopedStats model documentation.\n\n## Core Concepts\n- **Entity Types**: \"player\" (individual stats) or \"team\" (team-level stats)\n- **Data Sources**: official feeds and projection providers (see `source`)\n- **Projections vs Actuals**: is_projection distinguishes forecasts from results\n- **Sport Variation**: data field contains sport/league-specific statistics\n\n## Sample Stats by Sport\n- **Football**: passing_yards, rushing_touchdowns, receptions, sacks, field_goals_made\n- **Basketball**: points, rebounds, assists, field_goals_made, three_pointers_made\n- **Baseball**: hits, home_runs, rbis, strikeouts, earned_run_average, saves\n- **Hockey**: goals, assists, shots, penalty_minutes, save_percentage, wins\n- **Golf**: score, position, money_earned, eagles, birdies, made_cut\n","example":{"common_model_id":"49306211-7b48-4b5e-88e9-a4190189dbea","data":{"completion_percentage":68.2,"interceptions":0.8,"passing_touchdowns":2.1,"passing_yards":285.5,"rushing_yards":22.3},"event_id":"a96af633-aee6-48a0-bf72-0865a4419772","for_entity_id":"59291391-0c7e-442b-9496-33074647384e","for_entity_type":"player","inserted_at":"2024-08-26T22:03:16-04:00","is_projection":true,"scheduled_start_time":"2024-11-17T13:00:00Z","season_year":2024,"source":"ftn","team_id":"b3f7a1c2-9d4e-4f8a-b5c6-1a2b3c4d5e6f","updated_at":"2024-08-26T22:03:16-04:00","week":12},"properties":{"common_model_id":{"description":"EventScopedStats ID","format":"uuid","type":"string"},"data":{"additionalProperties":false,"description":"Sport and position-specific performance statistics with canonical field names.\n\n## Standardized Stat Names\nAll statistics use our unified canonical naming system to ensure consistency across data providers.\nFor example, passing yards from two different providers (\"pass_yds\" and \"py\") both map to \"passing_yards\".\n\n## Current Football Stats (Auto-Generated)\nThis schema is automatically synchronized with our stat registry to include:\n- **Passing**: passing_yards, passing_attempts, passing_completions, passing_tds, interceptions, sacks, deep_pass_completions, pass_long, interception_worthy_throws, pass_first_downs, passing_yards_300_plus, passing_tds_40_plus_yards, deep_pass_attempts, depth_of_target, spikes, passing_rating, completion_percentage, passing_avg_yards, passing_air_yards, passing_net_yards, passing_gross_yards, redzone_passing_attempts, passing_longest_touchdown, on_target_throws, poor_throws, defended_passes, dropped_passes, batted_passes, qb_hurries, qb_knockdowns, avg_pocket_time, total_pocket_time, blitzes_faced, throwaways, spikes, interception_touchdowns_thrown, sacks_taken, sack_yards_lost, passing_20_plus, passing_40_plus, time_to_throw, throw_away, is_out_of_pocket, passing_two_point_conversions\n- **Rushing**: rushing_yards, rushing_attempts, rushing_tds, successful_rush_attempts, explosive_runs, rush_rate, rush_long, goal_line_touches, rushing_first_downs, rushing_yards_100_plus, rushing_tds_40_plus_yards, rushing_direction, kneels, rushing_fumbles, rushing_20_plus, rushing_40_plus, rushing_avg_yards, rushing_longest_touchdown, redzone_rushing_attempts, broken_tackles, yards_after_contact, kneel_downs, scrambles, tackles_for_loss, tackles_for_loss_yards, rushing_two_point_conversions\n- **Receiving**: receiving_yards, receptions, receiving_targets, receiving_tds, dropped_pass, first_read_targets, first_read_receptions, contested_ball, catchable_ball, created_reception, deep_targets, deep_receptions, rec_long, cushion_yards, receiving_first_downs, receiving_yards_100_plus, receiving_tds_40_plus_yards, deep_pass_receptions, receiving_20_plus, receiving_40_plus, receiving_fumbles, separation_yards, separation_type, yards_after_catch, route_type, receiving_two_point_conversions\n- **Defense**: fumbles, forced_fumbles, fumbles_recovered, assisted_tackles, solo_tackles, total_tackles, defensive_tackles_combined, special_teams_solo_tackles, special_teams_assisted_tackles, misc_solo_tackles, misc_assisted_tackles, passes_defended, safeties, blocked_kicks, defensive_touchdowns, tackles, def_sack_yards, def_tackles_assisted, def_interception_touchdowns, def_interception_yards, defensive_interceptions, tackles_for_loss, tackles_for_loss_yards, quarterback_hits, fumble_return_yards, fumble_return_touchdowns, interception_return_yards, interception_return_touchdowns, interception_long, interception_return_average, interception_returns, interception_return_longest_touchdown, fumble_long, missed_tackle, missed_tackle_cause, missed_or_broken_tackles, missed_tackle_location, batted_pass, passing_attempts_allowed, passing_completions_allowed, passing_yards_allowed, rushing_attempts_allowed, rushing_yards_allowed, passing_touchdowns_allowed, rushing_touchdowns_allowed, fourth_down_stops, extra_point_return_touchdowns\n- **Kicking**: field_goals_made, field_goals_attempts, field_goal_yards, field_goal_percentage, fg_long, extra_points_made, extra_points_attempted, extra_points_blocked, field_goals_blocked, field_goals_missed, extra_points_missed\n- **Fantasy**: fantasy_points_half_ppr, nfl_fantasy_points, draftkings_fantasy_points, fanduel_fantasy_points, rank, yahoo_fantasy_points, fanduel_fantasy_points_ceiling, draftkings_fantasy_points_ceiling, yahoo_fantasy_points_ceiling, draftkings_ownership, fanduel_ownership, fanduel_rating, draftkings_rating\n\n## Provider Mapping\nOur system automatically translates provider-specific stat names to these canonical names:\n- **Provider A**: \"pass_yds\" → \"passing_yards\"\n- **Provider B**: \"py\" → \"passing_yards\"\n- **Provider C**: \"pass_yd\" → \"passing_yards\"\n\nSee the complete stat registry documentation for all supported stats and provider mappings.\n","example":{"fantasy_points_half_ppr":18.5,"passing_attempts":35,"passing_completions":22,"passing_tds":2,"passing_yards":250,"receiving_tds":1,"receiving_yards":95,"receptions":6,"rushing_attempts":18,"rushing_tds":1,"rushing_yards":85},"properties":{"def_interception_touchdowns":{"description":"Defensive interception touchdowns","example":5,"type":"integer"},"throwaways":{"description":"Number of throw away passes","example":5,"type":"integer"},"fanduel_fantasy_points_ceiling":{"description":"FanDuel fantasy points ceiling","example":18.5,"type":"number"},"on_target_throws":{"description":"Number of on-target throws","example":5,"type":"integer"},"interception_returns":{"description":"Number of interception returns","example":5,"type":"integer"},"kickoff_return_touchdowns":{"description":"Kickoff return touchdowns","example":5,"type":"integer"},"extra_points_attempted":{"description":"Number of extra point attempts","example":5,"type":"integer"},"redzone_rushing_attempts":{"description":"Rush attempts in the red zone","example":15,"type":"integer"},"is_motion":{"description":"Whether player was in motion during play","example":"example_value","type":"boolean"},"passing_attempts":{"description":"Total number of pass attempts","example":15,"type":"integer"},"punt_long":{"description":"Longest punt","example":5,"type":"integer"},"fumble_return_yards":{"description":"Yards gained on fumble returns","example":250,"type":"integer"},"first_read_receptions":{"description":"Number of first read receptions","example":5,"type":"integer"},"red_zone_pass_attempts":{"description":"Pass attempts in red zone","example":15,"type":"integer"},"points":{"description":"Total points scored by team","example":5,"type":"integer"},"depth_of_target":{"description":"Average depth of target","example":12.3,"type":"number"},"defensive_interceptions":{"description":"Defensive interceptions","example":5,"type":"integer"},"receiving_two_point_conversions":{"description":"Receiving two-point conversions","example":5,"type":"integer"},"field_goal_yards":{"description":"Yards gained on field goals","example":250,"type":"integer"},"conversion_defense_successes":{"description":"Two-point conversion defensive successes","example":5,"type":"integer"},"blocked_kick_return_touchdowns":{"description":"Touchdowns scored on blocked kick returns","example":5,"type":"integer"},"fanduel_ownership":{"description":"FanDuel ownership percentage","example":12.3,"type":"number"},"draftkings_fantasy_points_ceiling":{"description":"DraftKings fantasy points ceiling","example":18.5,"type":"number"},"first_read_targets":{"description":"Number of first read targets","example":5,"type":"integer"},"special_teams_snap_count":{"description":"Number of special teams snaps played","example":5,"type":"integer"},"out_of_pocket_reason":{"description":"Reason quarterback left the pocket","example":"example_value","type":"string"},"goal_line_touches":{"description":"Number of goal line touches","example":5,"type":"integer"},"receiving_yards_100_plus":{"description":"Number of 100+ yard receiving games","example":250,"type":"integer"},"total_pocket_time":{"description":"Total time spent in pocket","example":12.3,"type":"number"},"interception_return_longest_touchdown":{"description":"Longest interception return for touchdown","example":5,"type":"integer"},"field_goals_attempts":{"description":"Number of field goal attempts","example":15,"type":"integer"},"safeties":{"description":"Number of safeties","example":5,"type":"integer"},"pass_first_downs":{"description":"First downs gained via passing","example":5,"type":"integer"},"red_zone_passing_completions":{"description":"Passing completions in red zone","example":10,"type":"integer"},"net_punt_yards":{"description":"Net punt yards","example":250,"type":"integer"},"kneel_downs":{"description":"Number of kneel downs","example":5,"type":"integer"},"cushion_yards":{"description":"Cushion yards","example":250,"type":"integer"},"punt_yards":{"description":"Total punt yards","example":250,"type":"integer"},"challenges_remaining":{"description":"Number of challenges remaining","example":5,"type":"integer"},"passing_gross_yards":{"description":"Gross passing yards before sacks","example":250,"type":"integer"},"avg_pocket_time":{"description":"Average time in pocket per pass attempt","example":12.3,"type":"number"},"defended_passes":{"description":"Passes defended by defenders","example":5,"type":"integer"},"dropped_pass":{"description":"Number of dropped passes","example":5,"type":"integer"},"rushing_direction":{"description":"Direction of rushing attempt","example":"example_value","type":"string"},"sacks_taken":{"description":"Number of sacks taken by quarterback","example":5,"type":"integer"},"rec_long":{"description":"Longest reception","example":5,"type":"integer"},"yards_after_catch":{"description":"Yards gained after catch","example":250,"type":"integer"},"activated":{"description":"Player was activated to the game-day roster (shipped as 0/1)","example":5,"type":"integer"},"passing_yards":{"description":"Total passing yards thrown by the player/team","example":250,"type":"integer"},"touchdowns":{"description":"Total touchdowns scored","example":5,"type":"integer"},"rushing_fumbles":{"description":"Number of fumbles while rushing","example":5,"type":"integer"},"pre_snap_motion":{"description":"Player pre-snap motion type","example":"example_value","type":"boolean"},"nfl_fantasy_points":{"description":"NFL fantasy points","example":18.5,"type":"number"},"assisted_tackles":{"description":"Number of assisted tackles","example":5,"type":"integer"},"passing_completions":{"description":"Number of completed passes","example":10,"type":"integer"},"sacks":{"description":"Number of sacks (as QB or defensive player)","example":12.3,"type":"number"},"passing_40_plus":{"description":"Passing completions of 40+ yards","example":5,"type":"integer"},"missed_tackle_location":{"description":"Location of missed tackle","example":"example_value","type":"string"},"rushing_longest_touchdown":{"description":"Longest touchdown rush","example":5,"type":"integer"},"penalty_yards":{"description":"Penalty yards assessed","example":250,"type":"integer"},"rushing_tds_40_plus_yards":{"description":"Rushing touchdowns of 40+ yards","example":250,"type":"integer"},"penalties":{"description":"Number of penalties committed","example":5,"type":"integer"},"rushing_yards":{"description":"Total rushing yards gained","example":250,"type":"integer"},"punt_return_yards":{"description":"Punt return yards","example":250,"type":"integer"},"blocked_kicks":{"description":"Number of blocked kicks","example":5,"type":"integer"},"position":{"description":"Player position","example":"example_value","type":"string"},"sack_yards_lost":{"description":"Yards lost on sacks","example":250,"type":"integer"},"kickoff_touchbacks":{"description":"Number of kickoff touchbacks","example":5,"type":"integer"},"def_interception_yards":{"description":"Defensive interception return yards","example":250,"type":"integer"},"rush_long":{"description":"Longest rush","example":5,"type":"integer"},"played":{"description":"Whether the player appeared in the game","example":"example_value","type":"boolean"},"two_point_conversions":{"description":"Number of two-point conversions","example":5,"type":"integer"},"conversion_defense_attempts":{"description":"Two-point conversion defensive attempts","example":15,"type":"integer"},"tackles":{"description":"Total tackles (solo + assisted)","example":5,"type":"integer"},"return_yards":{"description":"Total return yards (kick/punt combined)","example":250,"type":"integer"},"kickoff_return_yards":{"description":"Total yards on kickoff returns (opponent)","example":250,"type":"integer"},"games_played":{"description":"Number of games played in","example":5,"type":"integer"},"receiving_20_plus":{"description":"Receptions of 20+ yards","example":5,"type":"integer"},"field_goals_missed":{"description":"Field goals missed","example":5,"type":"integer"},"draftkings_rating":{"description":"DraftKings player rating","example":98.7,"type":"number"},"pre_snap_alignment":{"description":"Player pre-snap alignment","example":"example_value","type":"string"},"kickoff_inside_20":{"description":"Kickoffs downed inside the 20 yard line","example":5,"type":"integer"},"batted_passes":{"description":"Passes batted down at line of scrimmage","example":5,"type":"integer"},"rushing_avg_yards":{"description":"Average yards per carry","example":12.3,"type":"number"},"interception_long":{"description":"Longest interception return","example":5,"type":"integer"},"special_teams_assisted_tackles":{"description":"Assisted tackles made on special-teams plays (kick and punt coverage)","example":5,"type":"integer"},"time_to_throw":{"description":"Time from snap to ball release in seconds","example":12.3,"type":"number"},"player_id":{"description":"Player identifier","example":"example_value","type":"string"},"kickoff_out_of_bounds":{"description":"Kickoffs out of bounds","example":5,"type":"integer"},"pass_long":{"description":"Longest pass completion","example":5,"type":"integer"},"fanduel_fantasy_points":{"description":"FanDuel fantasy points","example":18.5,"type":"number"},"def_tackles_assisted":{"description":"Defensive assisted tackles","example":5,"type":"integer"},"punts_inside_20":{"description":"Number of punts inside the 20-yard line","example":5,"type":"integer"},"solo_tackles":{"description":"Number of solo tackles","example":5,"type":"integer"},"redzone_passing_attempts":{"description":"Pass attempts in the red zone","example":15,"type":"integer"},"poor_throws":{"description":"Number of poor throws","example":5,"type":"integer"},"opponent_fumble_recovery_touchdowns":{"description":"Touchdowns on opponent fumble recoveries","example":5,"type":"integer"},"opponent_fumble_recoveries":{"description":"Opponent fumble recoveries","example":5,"type":"integer"},"deep_pass_attempts":{"description":"Deep pass attempts","example":15,"type":"integer"},"gross_kickoff_yards":{"description":"Yards gained on gross kickoffs","example":250,"type":"integer"},"qb_knockdowns":{"description":"Times quarterback was knocked down","example":5,"type":"integer"},"passing_attempts_allowed":{"description":"Passing attempts allowed by defense","example":15,"type":"integer"},"misc_solo_tackles":{"description":"Solo tackles made on change-of-possession plays (interception and fumble returns)","example":5,"type":"integer"},"total_tackles":{"description":"Total tackles across every phase of the game -- scrimmage defense plus special teams plus change-of-possession (misc) plays. This is the quantity NFL tackle props are priced and graded on.","example":5,"type":"integer"},"deep_targets":{"description":"Number of deep targets (20+ yards)","example":5,"type":"integer"},"fumbles":{"description":"Total number of fumbles","example":5,"type":"integer"},"fourth_down_stops":{"description":"Fourth down stops recorded by defense","example":5,"type":"integer"},"rushing_two_point_conversions":{"description":"Rushing two-point conversions","example":5,"type":"integer"},"missed_or_broken_tackles":{"description":"Number of missed or broken tackles","example":5,"type":"integer"},"receiving_yards":{"description":"Total receiving yards gained","example":250,"type":"integer"},"fanduel_rating":{"description":"FanDuel player rating","example":98.7,"type":"number"},"separation_type":{"description":"Type of separation","example":"example_value","type":"string"},"pressure_type":{"description":"Pressure type","example":"example_value","type":"string"},"timeouts_used":{"description":"Number of timeouts used","example":5,"type":"integer"},"returns":{"description":"Number of return attempts (kick/punt)","example":5,"type":"integer"},"conversion_passing_attempts":{"description":"Two-point conversion passing attempts","example":15,"type":"integer"},"net_kickoff_yards":{"description":"Yards gained on net kickoffs","example":250,"type":"integer"},"receiving_targets":{"description":"Number of times targeted for a pass","example":5,"type":"integer"},"extra_points_blocked":{"description":"Number of extra points blocked","example":5,"type":"integer"},"receptions":{"description":"Number of receptions/catches","example":5,"type":"integer"},"snap_counts_confirmed":{"description":"Provider confirms the snap counts for this game are final","example":"example_value","type":"boolean"},"motion_at_snap":{"description":"Player motion status at snap","example":"example_value","type":"boolean"},"receiving_fumbles":{"description":"Number of fumbles while receiving","example":5,"type":"integer"},"explosive_runs":{"description":"Number of explosive rushing attempts (10+ yards)","example":5,"type":"integer"},"rushing_40_plus":{"description":"Rushing attempts of 40+ yards","example":5,"type":"integer"},"interceptions":{"description":"Number of interceptions thrown","example":5,"type":"integer"},"quarterback_hits":{"description":"Number of quarterback hits","example":5,"type":"integer"},"interception_return_yards":{"description":"Yards gained on interception returns","example":250,"type":"integer"},"yahoo_fantasy_points_ceiling":{"description":"Yahoo fantasy points ceiling","example":18.5,"type":"number"},"primary_coverage":{"description":"Primary coverage","example":"example_value","type":"boolean"},"secondary_coverage":{"description":"Secondary coverage","example":"example_value","type":"boolean"},"fumbles_recovered":{"description":"Number of fumbles recovered","example":5,"type":"integer"},"rushing_20_plus":{"description":"Rushing attempts of 20+ yards","example":5,"type":"integer"},"throw_away":{"description":"Whether the pass was intentionally thrown away","example":"example_value","type":"boolean"},"field_goal_percentage":{"description":"Field goal percentage (made/attempted)","example":12.3,"type":"number"},"receiving_tds":{"description":"Number of receiving touchdowns","example":2,"type":"integer"},"passes_defended":{"description":"Number of passes defended","example":5,"type":"integer"},"fumble_return_touchdowns":{"description":"Touchdowns scored on fumble returns","example":5,"type":"integer"},"completion_percentage":{"description":"Pass completion percentage","example":12.3,"type":"number"},"interception_worthy_throws":{"description":"Interception worthy throws","example":5,"type":"integer"},"red_zone_targets":{"description":"Number of targets in the red zone","example":5,"type":"integer"},"allowed_pressure":{"description":"Allowed pressure","example":"example_value","type":"boolean"},"kickoff_yards":{"description":"Total kickoff yards","example":250,"type":"integer"},"qb_hurries":{"description":"Times quarterback was hurried","example":5,"type":"integer"},"kickoff_returns":{"description":"Number of kickoff returns by opponents","example":5,"type":"integer"},"passing_two_point_conversions":{"description":"Passing two-point conversions","example":5,"type":"integer"},"first_downs":{"description":"Total first downs (used for passing first downs in SR)","example":5,"type":"integer"},"defensive_touchdowns":{"description":"Number of defensive touchdowns","example":5,"type":"integer"},"opponent_fumble_recovery_yards":{"description":"Yards gained on opponent fumble recoveries","example":250,"type":"integer"},"blocked_kick_returns":{"description":"Number of blocked kick returns","example":5,"type":"integer"},"conversion_rushing_attempts":{"description":"Two-point conversion rushing attempts","example":15,"type":"integer"},"extra_point_return_touchdowns":{"description":"Extra point attempts returned for a touchdown by the defense","example":5,"type":"integer"},"own_fumble_recoveries":{"description":"Own fumble recoveries","example":5,"type":"integer"},"punts_blocked":{"description":"Number of punts blocked","example":5,"type":"integer"},"rush_rate":{"description":"Rush rate (rushing attempts per play)","example":12.3,"type":"number"},"passing_avg_yards":{"description":"Average yards per pass attempt","example":12.3,"type":"number"},"special_teams_solo_tackles":{"description":"Solo tackles made on special-teams plays (kick and punt coverage)","example":5,"type":"integer"},"red_zone_passing_attempts":{"description":"Passing attempts in red zone","example":15,"type":"integer"},"conversion_rushing_successes":{"description":"Two-point conversion rushing successes","example":5,"type":"integer"},"dropped_passes":{"description":"Passes dropped by receivers","example":5,"type":"integer"},"passing_net_yards":{"description":"Net passing yards (gross yards minus sack yards lost)","example":250,"type":"integer"},"rushing_first_downs":{"description":"First downs gained via rushing","example":5,"type":"integer"},"passing_yards_allowed":{"description":"Passing yards allowed by defense","example":250,"type":"integer"},"tackles_for_loss_yards":{"description":"Yards lost on tackles for loss","example":250,"type":"integer"},"punt_touchbacks":{"description":"Number of punt touchbacks","example":5,"type":"integer"},"missed_tackle_cause":{"description":"Cause of missed tackle","example":"example_value","type":"string"},"missed_tackle":{"description":"Number of missed tackles","example":5,"type":"integer"},"own_fumble_recovery_touchdowns":{"description":"Touchdowns on own fumble recoveries","example":5,"type":"integer"},"auction_value":{"description":"Auction draft value","example":12.3,"type":"number"},"rushing_attempts_allowed":{"description":"Rushing attempts allowed by defense","example":15,"type":"integer"},"receiving_first_downs":{"description":"First downs gained via receiving","example":5,"type":"integer"},"fg_long":{"description":"Longest field goal made","example":5,"type":"integer"},"own_fumble_recovery_yards":{"description":"Yards gained on own fumble recoveries","example":250,"type":"integer"},"player_kickoff_return_yards":{"description":"Kickoff return yards recorded by the returning player","example":250,"type":"integer"},"timeouts_remaining":{"description":"Number of timeouts remaining","example":5,"type":"integer"},"defensive_tackles_combined":{"description":"Tackles (solo + assisted) made on scrimmage defense only, excluding special teams and change-of-possession plays","example":5,"type":"integer"},"tackles_for_loss":{"description":"Rushes resulting in tackles for loss","example":5,"type":"integer"},"rushing_attempts":{"description":"Number of rushing attempts","example":15,"type":"integer"},"games_started":{"description":"Number of games started","example":5,"type":"integer"},"rank":{"description":"Player ranking","example":5,"type":"integer"},"fielding_e":{"description":"Fielding errors","example":5,"type":"integer"},"kickoff_onside_successes":{"description":"Successful onside kicks","example":5,"type":"integer"},"scrambles":{"description":"Number of quarterback scrambles","example":5,"type":"integer"},"passing_touchdowns_allowed":{"description":"Passing touchdowns allowed by defense","example":5,"type":"integer"},"passing_tds":{"description":"Number of passing touchdowns","example":2,"type":"integer"},"spikes":{"description":"Number of spiked passes","example":5,"type":"integer"},"punt_return_attempts":{"description":"Punt return attempts","example":15,"type":"integer"},"conversion_passing_successes":{"description":"Two-point conversion passing successes","example":5,"type":"integer"},"deep_pass_completions":{"description":"Deep pass completions (20+ yards)","example":10,"type":"integer"},"forced_fumbles":{"description":"Number of fumbles forced by defender","example":5,"type":"integer"},"interception_touchdowns_thrown":{"description":"Interceptions returned for touchdowns (pick-6s)","example":5,"type":"integer"},"punt_return_touchdowns":{"description":"Punt return touchdowns","example":5,"type":"integer"},"is_out_of_pocket":{"description":"Whether quarterback left the pocket","example":"example_value","type":"boolean"},"passing_yards_300_plus":{"description":"Passing yards over 300","example":250,"type":"integer"},"kickoff_return_attempts":{"description":"Kickoff return attempts","example":15,"type":"integer"},"rushing_yards_allowed":{"description":"Rushing yards allowed by defense","example":250,"type":"integer"},"jersey":{"description":"Player jersey number","example":"example_value","type":"string"},"passing_rating":{"description":"Quarterback passer rating","example":98.7,"type":"number"},"contested_ball":{"description":"Whether the targeted receiver's pass was contested","example":"example_value","type":"boolean"},"field_goals_made":{"description":"Number of field goals made","example":5,"type":"integer"},"interception_return_average":{"description":"Average yards per interception return","example":12.3,"type":"number"},"extra_points_missed":{"description":"Extra points missed","example":5,"type":"integer"},"yahoo_fantasy_points":{"description":"Yahoo fantasy points","example":18.5,"type":"number"},"defensive_snap_count":{"description":"Number of defensive snaps played","example":5,"type":"integer"},"endzone_fumble_recovery_touchdowns":{"description":"Touchdowns from end zone fumble recoveries","example":5,"type":"integer"},"rushing_touchdowns_allowed":{"description":"Rushing touchdowns allowed by defense","example":5,"type":"integer"},"return_tds":{"description":"Number of return touchdowns","example":2,"type":"integer"},"kickoff_endzone":{"description":"Kickoffs reaching the end zone","example":5,"type":"integer"},"snap_count":{"description":"Number of offensive snaps played","example":5,"type":"integer"},"def_sack_yards":{"description":"Defensive sack yards","example":250,"type":"integer"},"batted_pass":{"description":"Number of passes batted down by defense","example":5,"type":"integer"},"route_type":{"description":"Type of route run by receiver","example":"example_value","type":"string"},"receiving_40_plus":{"description":"Receptions of 40+ yards","example":5,"type":"integer"},"passing_tds_40_plus_yards":{"description":"Passing touchdowns of 40+ yards","example":250,"type":"integer"},"fumbles_out_of_bounds":{"description":"Number of fumbles that went out of bounds","example":5,"type":"integer"},"deep_pass_receptions":{"description":"Deep pass receptions","example":5,"type":"integer"},"fumbles_lost":{"description":"Number of fumbles lost to opponent","example":5,"type":"integer"},"fumble_long":{"description":"Longest fumble return","example":5,"type":"integer"},"punt_fair_catch":{"description":"Number of punt fair catches","example":5,"type":"integer"},"is_successful_play":{"description":"Whether the play was successful","example":"example_value","type":"boolean"},"total":{"description":"Over/under total for betting","example":12.3,"type":"number"},"applied_pressure":{"description":"Applied pressure","example":"example_value","type":"boolean"},"rushing_tds":{"description":"Number of rushing touchdowns","example":2,"type":"integer"},"passing_air_yards":{"description":"Total air yards on pass attempts","example":250,"type":"integer"},"punt_average":{"description":"Average yards per punt","example":12.3,"type":"number"},"field_goals_blocked":{"description":"Number of field goals blocked","example":5,"type":"integer"},"created_reception":{"description":"Whether the receiver created the reception through an exceptional play","example":"example_value","type":"boolean"},"shotgun":{"description":"Plays run from shotgun formation","example":5,"type":"integer"},"kickoff_attempts":{"description":"Total kickoff attempts","example":15,"type":"integer"},"yards_after_contact":{"description":"Yards gained after contact","example":250,"type":"integer"},"kickoff_onside_attempts":{"description":"Onside kick attempts","example":15,"type":"integer"},"receiving_tds_40_plus_yards":{"description":"Receiving touchdowns of 40+ yards","example":250,"type":"integer"},"catchable_ball":{"description":"Whether the targeted receiver's pass was catchable","example":"example_value","type":"boolean"},"passing_longest_touchdown":{"description":"Longest touchdown pass","example":5,"type":"integer"},"separation_yards":{"description":"Separation distance in yards from defender","example":12.3,"type":"number"},"spread":{"description":"Point spread for betting","example":12.3,"type":"number"},"draftkings_ownership":{"description":"DraftKings ownership percentage","example":12.3,"type":"number"},"conversion_receiving_successes":{"description":"Two-point conversion receiving successes","example":5,"type":"integer"},"extra_points_made":{"description":"Number of extra points made","example":5,"type":"integer"},"blocked_kick_return_yards":{"description":"Yards gained on blocked kick returns","example":250,"type":"integer"},"passing_completions_allowed":{"description":"Passing completions allowed by defense","example":10,"type":"integer"},"interception_return_touchdowns":{"description":"Touchdowns scored on interception returns","example":5,"type":"integer"},"successful_rush_attempts":{"description":"Number of successful rushing attempts","example":15,"type":"integer"},"passing_20_plus":{"description":"Passing completions of 20+ yards","example":5,"type":"integer"},"broken_tackles":{"description":"Number of broken tackles","example":5,"type":"integer"},"conversion_receiving_attempts":{"description":"Two-point conversion receiving attempts","example":15,"type":"integer"},"deep_receptions":{"description":"Deep receptions (20+ yards)","example":5,"type":"integer"},"misc_assisted_tackles":{"description":"Assisted tackles made on change-of-possession plays (interception and fumble returns)","example":5,"type":"integer"},"rushing_yards_100_plus":{"description":"Number of 100+ yard rushing games","example":250,"type":"integer"},"draftkings_fantasy_points":{"description":"DraftKings fantasy points","example":18.5,"type":"number"},"challenges_used":{"description":"Number of challenges used","example":5,"type":"integer"},"blitzes_faced":{"description":"Number of blitzes faced","example":5,"type":"integer"},"punt_attempts":{"description":"Number of punt attempts","example":15,"type":"integer"},"penalty_first_downs":{"description":"First downs gained via opponent penalties","example":5,"type":"integer"},"declared_inactive":{"description":"Player was on the officially declared inactive list for this game","example":"example_value","type":"boolean"},"kneels":{"description":"Number of quarterback kneels","example":5,"type":"integer"},"fantasy_points_half_ppr":{"description":"Fantasy points in half-PPR scoring","example":18.5,"type":"number"}},"type":"object"},"event_id":{"description":"Common model ID of the event","example":"a96af633-aee6-48a0-bf72-0865a4419772","format":"uuid","type":"string"},"for_entity_id":{"description":"Common model ID of the entity (player or team)","example":"59291391-0c7e-442b-9496-33074647384e","format":"uuid","type":"string"},"for_entity_type":{"description":"Type of entity the stats belong to","enum":["player","team"],"example":"player","type":"string"},"inserted_at":{"description":"Creation timestamp","format":"date-time","type":"string"},"is_projection":{"description":"true = projected/forecasted stats, false = actual game results","example":true,"type":"boolean"},"scheduled_start_time":{"description":"Event scheduled start time","example":"2024-11-17T13:00:00Z","format":"date-time","type":"string"},"season_year":{"description":"Season year","example":2024,"type":"integer"},"source":{"description":"Data provider/source of the statistics","enum":["sportradar","ftn","espn","fantasylabs","awesemo"],"example":"ftn","type":"string"},"superseded_from_id":{"description":"Originally requested SportsStack ID when this response was resolved through a superseded identity. Omitted for canonical lookups.","format":"uuid","nullable":true,"type":"string"},"team_id":{"description":"Common model ID of the team the player belongs to for this event (only set for player stats)","format":"uuid","type":"string"},"updated_at":{"description":"Last update timestamp","format":"date-time","type":"string"},"week":{"description":"Week number (for weekly sports like NFL)","example":12,"type":"integer"}},"required":["common_model_id","for_entity_type","for_entity_id","event_id","source"],"title":"EventScopedStats","type":"object"}}},"description":"EventStats Response"},"400":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"bad_request","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/bad_request","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"invalid_api_key","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/invalid_api_key","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"not_found","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/not_found","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Not Found"}},"summary":"List Event Stats","tags":["Stats & Data"]}},"/api/v1/odds/{id}":{"get":{"callbacks":{},"description":"Retrieve a single odd by its ID.","operationId":"ApiRestWeb.OddsControllerV2.show","parameters":[{"description":"Odd ID (UUID)","example":"01c7133f-2999-4803-9872-8c2ab1ba63ac","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"description":"Betting odds from a specific sportsbook for a particular outcome, representing the price and probability.\n\n## Odds Standardization\n\nOdds undergo standardization to ensure consistent pricing representation and source attribution:\n\n### Source Selection Name Standardization\nThe `source_selection_name` field identifies what the sportsbook is offering odds on:\n\n#### Total Points Markets\n```\nsource_selection_name: nil  # No specific team/player selection\n```\n\n#### Point Spread Markets\n```\nsource_selection_name: \"Indiana Pacers\"     # Team receiving the spread\n# Derived from event.participants based on outcome selection\n```\n\n#### Moneyline Markets\n```\nsource_selection_name: \"Oklahoma City Thunder\"  # Team to win\n# Derived from event.participants based on outcome selection\n```\n\n### Price Standardization\n- **price**: Standardized to American odds format (-110, +150, etc.)\n- **price_type**: Always \"american\" for consistency\n- **timestamp**: UTC timestamp when current odds were observed. When the\n  response comes from the durable line-summary fallback, this is the time\n  the returned closing price last changed; same-price provider\n  reaffirmations do not advance it.\n\n### Sportsbook Attribution\n- **sportsbook**: Standardized sportsbook name (DraftKings, FanDuel, etc.)\n- **aggregator**: Upstream provider key or `sportsstack` for the canonical SportsStack board\n- **aggregator_event_id**: Provider's event identifier for traceability\n\n### Historical Tracking\nOdds include both current and opening lines for trend analysis:\n- Current odds: Real-time pricing from sportsbooks\n- Opening odds: Initial lines when market opened\n- Movement tracking: Compare current vs opening for line movement insights\n","example":{"aggregator":"sportsstack","aggregator_event_id":null,"fetched_at":"2026-04-21T17:40:00Z","metadata":{"aggregator":"sportsstack","id":"0HC75256377P350_1","link":"https://sportsbook.draftkings.com/event/30568865?outcomes=0HC75256377P350_1","selected_source":"example_provider.football.nfl","selection_reason":"trust_then_freshness","selection_tier":1,"source":"sportsstack","source_event_id":"30568865","source_market_id":"DraftKings-30568865-spreads","sportsstack_kind":"canonical_book_quote"},"price":-110,"price_type":"american","source_event_id":"30568865","source_id":"0HC75256377P350_1","source_market_id":"DraftKings-30568865-spreads","source_selection_id":"0HC75256377P350_1","source_selection_name":"Seattle Seahawks","sportsbook":"draftkings"},"properties":{"actual_scope":{"description":"Proven native contract scope, independent of the compatibility endpoint.","enum":["event","race","session","tournament","round","season"],"nullable":true,"type":"string"},"aggregator":{"description":"Upstream provider name or 'sportsstack' for the canonical SportsStack sportsbook board","type":"string"},"aggregator_event_id":{"description":"Aggregator event ID","type":"string"},"canonical_outcome_id":{"description":"Verified cross-venue economic outcome ID. Null when outcome equivalence is unresolved, push-capable, three-way, or ambiguous.","format":"uuid","nullable":true,"type":"string"},"clock_provenance":{"properties":{"evaluated_at":{"format":"date-time","type":"string"},"max_age_seconds":{"enum":[300],"type":"integer"},"quote_provenance":{"description":"Unmodified retained JSON provenance, including legacy or malformed evidence.","nullable":true},"source":{"enum":["timestamp",null],"nullable":true,"type":"string"}},"type":"object"},"common_model_id":{"description":"Market ID","type":"string"},"deep_link":{"description":"Desktop sportsbook deep link URL","type":"string"},"execution_readiness":{"description":"Requires exact native source-ID binding, active parent/outcome lifecycle and proven fresh provider clock; not order-fill certification. ProphetX additionally requires one atomic native strike/price/size/time observation matching its documented submit-order fields. ready=null means unknown. Native IDs remain separate from common_model_id.","example":{"available_size":{"state":"unknown","value":null},"depth":{"state":"unknown","value":null},"executable":{"reason":"catalog_is_not_a_book","state":"unknown"},"identifiers_valid":true,"liquidity":{"state":"unknown","value":null},"ready":null,"reasons":["provider_clock_provenance_downgrade"],"scope":"outcome_identifiers_and_provider_clock","venue":"limitless"},"properties":{"available_size":{"additionalProperties":true,"description":"Retained evidence; absent measurements have state unknown and value null.","type":"object"},"depth":{"additionalProperties":true,"description":"Retained evidence; absent measurements have state unknown and value null.","type":"object"},"executable":{"additionalProperties":true,"description":"Retained evidence; absent measurements have state unknown and value null.","type":"object"},"identifiers_valid":{"type":"boolean"},"liquidity":{"additionalProperties":true,"description":"Retained evidence; absent measurements have state unknown and value null.","type":"object"},"ready":{"nullable":true,"type":"boolean"},"reasons":{"items":{"type":"string"},"type":"array"},"scope":{"enum":["outcome_identifiers_and_provider_clock"],"type":"string"},"venue":{"type":"string"}},"type":"object"},"fetched_at":{"description":"Timestamp when SportsStack fetched or observed this quote","format":"date-time","nullable":true,"type":"string"},"freshness_reasons":{"description":"Deterministic provider_clock_* or lifecycle_* reasons; empty when fresh.","items":{"type":"string"},"type":"array"},"inserted_at":{"description":"Timestamp of creation","format":"date-time","type":"string"},"line_alignment":{"description":"SS main-line ladder plan Phase D. Present only for event-scoped, `latest_only=true` `/v1/odds` requests (`event_id` given) -- the key itself is absent from the response row (not present with a null body) for non-event-scoped `league_id`/list requests, since computing it there would mean an unbounded per-request ladder fetch across many events. Read-time derived from CommonModel.Betting.PredictionMarkets.LineLadder; never renames, removes, or reinterprets the sibling `is_main` field (the stored, write-time value) -- purely additive. All three sub-fields are null together when this row was not matched into a ranked ladder slot (e.g. a moneyline row, which has no alt-strike ladder, or a real-sportsbook row, which LineLadder never covers).","example":{"alignment_group":{"family":"spread","market_type":"point_spread","side":{"sign":"negative","team_id":null}},"is_main_derived":true,"sibling_line_count":2},"nullable":true,"properties":{"alignment_group":{"additionalProperties":true,"description":"The {market_type, family, side} ladder slot this row was matched into.","nullable":true,"type":"object"},"is_main_derived":{"description":"Whether LineLadder derived this row as the closest-to-even main line for its venue/slot, independent of the stored `is_main` column.","nullable":true,"type":"boolean"},"sibling_line_count":{"description":"Number of lines this row's own venue quotes within the same ladder slot.","nullable":true,"type":"integer"}},"type":"object"},"metadata":{"additionalProperties":true,"description":"Metadata. For prediction markets this includes an \"execution\" block carrying the trade-execution identifiers for the originating venue (venue, ticker/token_id, side, condition_id, neg_risk, tick_size, venue contracts, url). See the Prediction-Market Execution integration guide. UFC conditional markets expose \"probability_semantics\": \"conditional\", a structured \"condition\" object, and a plain-language \"void_condition\".","properties":{"condition":{"additionalProperties":true,"nullable":true,"properties":{"fight_result":{"description":"Fight-result condition for a conditional UFC market.","enum":["finish","decision"],"type":"string"},"round":{"description":"Optional round constraint for the conditional market.","minimum":1,"nullable":true,"type":"integer"}},"required":["fight_result"],"type":"object"},"probability_semantics":{"description":"Set to \"conditional\" when this price is conditional on the described fight result.","enum":["conditional"],"nullable":true,"type":"string"},"void_condition":{"description":"Plain-language condition under which a conditional UFC market is voided.","nullable":true,"type":"string"}},"type":"object"},"mobile_deep_link":{"description":"Mobile/native app deep link URL","type":"string"},"outcome_id":{"description":"Venue-backed SportsStack outcome ID","type":"string"},"platform_observed_at":{"description":"Prediction quotes only. Row observed_at, independently of provider freshness.","format":"date-time","nullable":true,"type":"string"},"price":{"description":"Price","type":"number"},"price_type":{"description":"Price format ('decimal', 'american')","type":"string"},"provider_freshness":{"description":"Prediction quotes only. Fresh requires a proven nonfuture provider clock at most 300 seconds old and proven active exact-parent/outcome lifecycle. Standalone odds report unknown without lifecycle proof.","enum":["fresh","stale","unknown"],"type":"string"},"provider_observed_at":{"description":"Prediction quotes only. Authoritative provider quote timestamp; never receipt/observation time. Requires matching observed quote_provenance.provider_updated_at; null for absent, synthetic or downgraded authority.","format":"date-time","nullable":true,"type":"string"},"reference_alignment":{"description":"Present only on crypto odds rows (omitted on sports rows; `line_alignment` is the\nsports ladder analogue and is omitted on crypto rows). `alignment` is `exact` (this\nmarket spans two or more venues), `single_venue`, or `unverified_mirror`.\n`different_reference_market_ids` lists the OTHER `market_id`s of the same window\n(any reference source), symmetrically.\n","properties":{"alignment":{"enum":["exact","single_venue","unverified_mirror"],"type":"string"},"alignment_group":{"description":"The window (event) id.","format":"uuid","type":"string"},"different_reference_market_ids":{"items":{"format":"uuid","type":"string"},"type":"array"},"reference_source":{"type":"string"},"tie_rule":{"enum":["up","split"],"type":"string"},"venue_count":{"minimum":1,"type":"integer"}},"title":"CryptoReferenceAlignment","type":"object"},"sgp_token":{"description":"Opaque same-game-parlay token supplied by the sportsbook. Null when the provider does not offer one.","nullable":true,"type":"string"},"source_event_id":{"description":"Source event ID","type":"string"},"source_id":{"description":"Source ID","type":"string"},"source_market_id":{"description":"Source market ID","type":"string"},"source_selection_id":{"description":"Source selection ID","type":"string"},"source_selection_name":{"description":"Source selection name","type":"string"},"sportsbook":{"description":"Sportsbook","type":"string"},"timestamp":{"description":"Provider quote timestamp","format":"date-time","nullable":true,"type":"string"},"trading_fees":{"description":"Prediction quotes only (absent on sportsbook rows and on venues whose fees are not captured yet: Limitless, ProphetX, Polymarket US, SX Bet). Computed at read time; no order-fill or account-specific guarantee (per-account discounts, maker rebates and balance-precision rounding are not modelled). Kalshi: rates from a versioned snapshot of Kalshi's public series metadata, event fee overrides and fee schedule; `observed_at` is the snapshot time. Series with event-level fee overrides (MLB) resolve per event: an override in force reports `scope: event` (with `event_ticker`, `effective_from`), before its `scheduled_ts` the series fee is reported with the pending change under `scheduled_override`, and an event missing from the snapshot reports `unknown` (`event_fee_override_not_in_snapshot`). Predict.fun: derived from the stored market `fee_rate_bps`; `observed_at` is the quote observation time. Polymarket: the market's own Gamma `feesEnabled`/`feeSchedule` captured with the quote (`fee = shares x rate x P x (1 - P)`, taker only, makers pay nothing; `maker.rebate_rate` is the fraction of taker fees returned to makers through a daily rebate program, not a per-fill credit; fees round to 5 decimal places with no published direction, so `rounding.direction` is absent); `observed_at` is the quote observation time, and quotes whose fee data is missing, has an exponent other than 1, or is not taker-only report `unknown`. The rate is per market (`sports_fees_v3` 0.05, `sports_fees_v2` 0.03, `zero_fees` 0 are all live on sports), never a category default.","example":{"availability":"published","charge_basis":"fill","fee_multiplier":1.0,"fee_type":"quadratic_with_maker_fees","maker":{"exponent":1,"model":"quadratic","multiplier":1.0,"rate":0.0175,"rounding":{"applies_to":"fee_plus_position_cost","direction":"up","increment":0.0001}},"observed_at":"2026-09-30T15:33:45Z","scope":"series","series_ticker":"KXNBAGAME","source":"kalshi_series_snapshot","taker":{"exponent":1,"model":"quadratic","multiplier":1.0,"rate":0.07,"rounding":{"applies_to":"fee_plus_position_cost","direction":"up","increment":0.0001}}},"properties":{"availability":{"enum":["published","unavailable","unknown"],"type":"string"},"charge_basis":{"description":"Fees are charged per fill, not per order or per settlement.","enum":["fill"],"type":"string"},"effective_from":{"description":"Kalshi, `scope: event`: the override's `scheduled_ts`, from which these rates apply.","format":"date-time","type":"string"},"event_ticker":{"description":"Kalshi: the market ticker minus its last `-` segment. Present for series with event-level fee overrides.","type":"string"},"fee_multiplier":{"type":"number"},"fee_rate_bps":{"type":"integer"},"fee_type":{"type":"string"},"fees_enabled":{"description":"Polymarket: the market's Gamma `feesEnabled` flag.","type":"boolean"},"maker":{"description":"One side of the fee. `quadratic`: fee = rate x contracts x (P x (1 - P)) ^ exponent. `linear_min_price`: fee = rate x min(P, 1 - P) x shares. `none`: no fee. `rate` already includes any venue multiplier.","properties":{"exponent":{"type":"integer"},"formula":{"type":"string"},"model":{"enum":["quadratic","linear_min_price","none"],"type":"string"},"multiplier":{"type":"number"},"rate":{"type":"number"},"rebate_rate":{"description":"Polymarket maker side: fraction of taker fees rebated to resting makers by the daily rebate program (context only, not a per-fill credit).","type":"number"},"rounding":{"properties":{"applies_to":{"type":"string"},"direction":{"enum":["up"],"type":"string"},"increment":{"type":"number"}},"type":"object"}},"type":"object"},"observed_at":{"format":"date-time","nullable":true,"type":"string"},"reason":{"description":"Present when availability is unknown; deterministic snake_case reason.","type":"string"},"scheduled_override":{"description":"Kalshi, `scope: series`: an event-level override that is not yet in force. Charged from `effective_from`; carries `fee_type`, `fee_multiplier`, `taker` and `maker` like the top-level object.","properties":{"effective_from":{"format":"date-time","type":"string"},"fee_multiplier":{"type":"number"},"fee_type":{"type":"string"},"maker":{"description":"One side of the fee. `quadratic`: fee = rate x contracts x (P x (1 - P)) ^ exponent. `linear_min_price`: fee = rate x min(P, 1 - P) x shares. `none`: no fee. `rate` already includes any venue multiplier.","properties":{"exponent":{"type":"integer"},"formula":{"type":"string"},"model":{"enum":["quadratic","linear_min_price","none"],"type":"string"},"multiplier":{"type":"number"},"rate":{"type":"number"},"rebate_rate":{"description":"Polymarket maker side: fraction of taker fees rebated to resting makers by the daily rebate program (context only, not a per-fill credit).","type":"number"},"rounding":{"properties":{"applies_to":{"type":"string"},"direction":{"enum":["up"],"type":"string"},"increment":{"type":"number"}},"type":"object"}},"type":"object"},"taker":{"description":"One side of the fee. `quadratic`: fee = rate x contracts x (P x (1 - P)) ^ exponent. `linear_min_price`: fee = rate x min(P, 1 - P) x shares. `none`: no fee. `rate` already includes any venue multiplier.","properties":{"exponent":{"type":"integer"},"formula":{"type":"string"},"model":{"enum":["quadratic","linear_min_price","none"],"type":"string"},"multiplier":{"type":"number"},"rate":{"type":"number"},"rebate_rate":{"description":"Polymarket maker side: fraction of taker fees rebated to resting makers by the daily rebate program (context only, not a per-fill credit).","type":"number"},"rounding":{"properties":{"applies_to":{"type":"string"},"direction":{"enum":["up"],"type":"string"},"increment":{"type":"number"}},"type":"object"}},"type":"object"}},"type":"object"},"scope":{"enum":["series","event","market"],"type":"string"},"series_ticker":{"type":"string"},"source":{"description":"kalshi_series_snapshot | kalshi_event_fee_snapshot | kalshi_fee_schedule_default | venue_record. `kalshi_event_fee_snapshot` is a Kalshi event-level override in force; `kalshi_fee_schedule_default` is the schedule default (quadratic x 1) inferred for a KX series not in the exception snapshot.","type":"string"},"taker":{"description":"One side of the fee. `quadratic`: fee = rate x contracts x (P x (1 - P)) ^ exponent. `linear_min_price`: fee = rate x min(P, 1 - P) x shares. `none`: no fee. `rate` already includes any venue multiplier.","properties":{"exponent":{"type":"integer"},"formula":{"type":"string"},"model":{"enum":["quadratic","linear_min_price","none"],"type":"string"},"multiplier":{"type":"number"},"rate":{"type":"number"},"rebate_rate":{"description":"Polymarket maker side: fraction of taker fees rebated to resting makers by the daily rebate program (context only, not a per-fill credit).","type":"number"},"rounding":{"properties":{"applies_to":{"type":"string"},"direction":{"enum":["up"],"type":"string"},"increment":{"type":"number"}},"type":"object"}},"type":"object"}},"type":"object"},"updated_at":{"description":"Timestamp when SportsStack last wrote this row","format":"date-time","type":"string"}},"required":["common_model_id","name"],"title":"Odds","type":"object"}}},"description":"Success"},"400":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"bad_request","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/bad_request","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"invalid_api_key","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/invalid_api_key","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"not_found","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/not_found","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Not Found"}},"summary":"Show Odd","tags":["Betting"]}},"/api/v1/standings/{id}":{"get":{"callbacks":{},"operationId":"ApiRestWeb.StandingsController.show","parameters":[{"description":"Standings ID (UUID common_model_id)","example":"01c7133f-2999-4803-9872-8c2ab1ba63ac","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"description":"Historical standings or rankings snapshot for a specific tenant, entity, season, and season type.\n\nRecords nightly provider imports so you can query past ranks,\ngames-back deltas, and splits while the most recent regular-season snapshot is surfaced\non `Team.metadata`.\n","example":{"for_entity_id":"01c7133f-2999-4803-9872-8c2ab1ba63ac","for_entity_type":"team","league_id":"32fa944f-b1bd-41b4-bec2-7ab269fde6fc","metadata":{"conference_name":"NFC","division_name":"NFC East"},"primary_group":"NFC East","primary_group_type":"division","ranking_overall":3,"ranking_primary_context":"division","ranking_primary_value":1,"record_losses":2,"record_ties":0,"record_wins":11,"season_type":"REG","season_year":2024,"secondary_group":"NFC","secondary_group_type":"conference","source_for_entity_id":"competitor_4422","table_type":"standings","team_id":"01c7133f-2999-4803-9872-8c2ab1ba63ac"},"properties":{"status_streak_type":{"description":"Identifier for the current streak (WIN, LOSS, TIE)","type":"string"},"split_away_ties":{"description":"Away ties","type":"integer"},"scoring_against":{"description":"Total scoring against","type":"integer"},"ranking_points":{"description":"Table points (soccer/rugby/etc.)","type":"integer"},"secondary_group_type":{"description":"Type of secondary grouping.\nValues: conference, league, null\n","enum":["conference","league"],"nullable":true,"type":"string"},"split_division_losses":{"description":"Division losses","type":"integer"},"scoring_unit":{"description":"Unit for scoring metrics (points, runs, goals, etc.)","type":"string"},"source_for_entity_id":{"description":"Provider source identifier for the ranked/standing entity.","nullable":true,"type":"string"},"record_games_played":{"description":"Total games played","type":"integer"},"ranking_overall":{"description":"Overall/league rank","type":"integer"},"ranking_primary_value":{"type":"integer"},"split_last10_ties":{"description":"Ties over last 10","type":"integer"},"ranking_group":{"description":"Group/Pool rank","type":"integer"},"split_away_wins":{"description":"Away wins","type":"integer"},"split_home_ties":{"description":"Home ties","type":"integer"},"split_last10_wins":{"description":"Wins over last 10","type":"integer"},"season_type":{"description":"Season segment (PRE, REG, PST, etc.)","type":"string"},"record_losses":{"description":"Total losses","type":"integer"},"record_ties":{"description":"Total ties","type":"integer"},"record_games_back":{"description":"Games behind the division leader","format":"float","type":"number"},"status_streak_text":{"description":"Human-readable streak text","type":"string"},"record_win_pct":{"description":"Win percentage","format":"float","type":"number"},"league_id":{"description":"League this snapshot belongs to","type":"string"},"ranking_secondary_value":{"type":"integer"},"split_division_wins":{"description":"Division wins","type":"integer"},"for_entity_id":{"description":"Common Model ID of the team or player represented by this row.","type":"string"},"id":{"description":"Standings record identifier","type":"string"},"split_home_losses":{"description":"Home losses","type":"integer"},"record_wildcard_back":{"description":"Games behind the wildcard leader","format":"float","type":"number"},"split_conference_wins":{"description":"Conference wins","type":"integer"},"tenant_id":{"description":"Tenant that owns this standings snapshot","type":"string"},"primary_group":{"description":"Most granular organizational grouping name. Works across all sports.\nExamples: \"NFC East\" (NFL), \"Group E\" (World Cup), \"Atlantic\" (NBA).\n","nullable":true,"type":"string"},"split_last10_losses":{"description":"Losses over last 10","type":"integer"},"status_clinched":{"description":"Clinched qualifier (division, wildcard, playoff, etc.)","type":"string"},"ranking_primary_context":{"description":"Context for the primary rank value (division, conference, etc.)","type":"string"},"record_wins":{"description":"Total wins","type":"integer"},"scoring_diff":{"description":"Scoring differential","type":"integer"},"for_entity_type":{"description":"Entity type represented by this row.","enum":["team","player"],"type":"string"},"split_conference_losses":{"description":"Conference losses","type":"integer"},"ranking_secondary_context":{"description":"Context for the secondary rank value","type":"string"},"season_id":{"description":"Season Common Model ID","type":"string"},"split_home_wins":{"description":"Home wins","type":"integer"},"season_year":{"description":"Season year","type":"integer"},"ranking_wildcard":{"description":"Wildcard rank","type":"integer"},"split_conference_ties":{"description":"Conference ties","type":"integer"},"status_elimination_number":{"description":"Elimination number for the current race","type":"integer"},"team_id":{"description":"Legacy compatibility field. Mirrors `for_entity_id` when `for_entity_type=team`.","nullable":true,"type":"string"},"split_away_losses":{"description":"Away losses","type":"integer"},"secondary_group":{"description":"Parent/higher-level organizational grouping if exists.\nExamples: \"NFC\" (NFL), \"Eastern Conference\" (NBA), null (World Cup).\n","nullable":true,"type":"string"},"status_streak_length":{"description":"Length of the streak","type":"integer"},"scoring_for":{"description":"Total scoring for","type":"integer"},"standings_date":{"description":"Date/time for when the standings payload was generated","format":"date-time","type":"string"},"metadata":{"additionalProperties":true,"description":"Provider payload fragments plus sport-specific splits/rankings.\n\nNote: Universal organizational hierarchy is now available as top-level fields\n(`primary_group`, `primary_group_type`, `secondary_group`, `secondary_group_type`).\n\n## Sport-Specific Fields (Legacy/Backward Compatibility)\n\n- `division_name` (string): Division name (NFL, NBA, MLB)\n- `conference_name` (string): Conference name (NFL, NBA)\n- `group_name` (string): Group name (World Cup, Champions League)\n\n## Additional Metadata\n\n- `rankings` - Additional ranking breakdowns\n- `split` - Game split details (home/away/division/conference)\n- `scoring_secondary` - Secondary scoring metrics\n- `advanced_metrics` - Provider-specific advanced stats\n","type":"object"},"table_type":{"description":"Distinguishes standings tables from rankings tables.","enum":["standings","ranking"],"type":"string"},"primary_group_type":{"description":"Type of primary grouping. Use this to determine UI labels.\nValues: division, group, conference, region, pool\n","enum":["division","group","conference","region","pool"],"nullable":true,"type":"string"},"split_division_ties":{"description":"Division ties","type":"integer"}},"required":["for_entity_type","for_entity_id","table_type","season_id","season_year","season_type"],"title":"Standings","type":"object"}}},"description":"Standings Response"},"400":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"bad_request","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/bad_request","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Bad Request"}},"summary":"Show Standings","tags":["Stats & Data"]}},"/api/v1/events/{id}/plays":{"get":{"callbacks":{},"operationId":"ApiRestWeb.EventController.index_event_plays","parameters":[{"description":"Event ID (UUID)","example":"01c7133f-2999-4803-9872-8c2ab1ba63ac","in":"path","name":"id","required":true,"schema":{"type":"string"}},{"description":"Filter by play number within the event","in":"query","name":"play_number","required":false,"schema":{"type":"integer"}},{"description":"Page number for page/per_page pagination. Do not combine with limit/offset.","in":"query","name":"page","required":false,"schema":{"default":1,"minimum":1,"type":"integer"}},{"description":"Number of items per page (max 1000). Do not combine with limit/offset.","in":"query","name":"per_page","required":false,"schema":{"default":100,"maximum":1000,"minimum":1,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"description":"Individual play-by-play action within a sporting event providing granular game analysis.\n\nPlays represent the finest level of detail in sports event tracking, capturing each\ndiscrete action that occurs during a game. This data enables advanced analytics,\nsituational analysis, and detailed performance evaluation beyond basic statistics.\n\n## Play Scope\nPlay data granularity varies by sport:\n- **Football**: Every snap, including penalties, timeouts, and scoring plays\n- **Basketball**: Possessions, shots, fouls, substitutions, timeouts\n- **Baseball**: Each pitch, at-bat outcome, defensive plays, baserunning\n- **Hockey**: Faceoffs, shots, saves, penalties, line changes\n\n## Analytical Value\n- **Situational Analysis**: Performance in specific game contexts (red zone, 3rd down)\n- **Momentum Tracking**: How individual plays affect game flow and outcomes\n- **Player Evaluation**: Context-aware performance beyond box score statistics\n- **Strategy Analysis**: Play calling patterns and effectiveness\n\n## Data Structure\nEach play contains multiple data layers:\n- **Basic Info**: Description, timing, participants involved\n- **Game Context**: Score, field position, down/distance (football)\n- **Play Details**: Specific outcomes and measurements\n- **Player Roles**: Individual contributions and responsibilities\n","example":{"common_model_id":"123e4567-e89b-12d3-a456-426614174007","defense_id":"123e4567-e89b-12d3-a456-426614174003","description":"Quarterback throws a 20-yard pass for a touchdown","event_id":"123e4567-e89b-12d3-a456-426614174001","game_context":{"defense_timeouts":3,"final_defense_score":0,"final_distance":10,"final_down":1,"final_offense_score":6,"final_yards_from_scoring":0,"initial_defense_score":0,"initial_distance":10,"initial_down":1,"initial_offense_score":0,"initial_yards_from_scoring":20,"offense_timeouts":3,"zone":"red zone"},"id":"123e4567-e89b-12d3-a456-426614174000","league_id":"123e4567-e89b-12d3-a456-426614174008","minutes_remaining":10,"offense_id":"123e4567-e89b-12d3-a456-426614174002","period":1,"play_details":{"depth_of_target":20,"formation":"shotgun","is_first_down":true,"is_no_huddle":false,"pass_location":"deep right","points_scored":6,"successful_play":true,"yards_gained":20},"play_number":1,"play_type":"pass","seconds_remaining":30,"source":"official","tenant_id":"123e4567-e89b-12d3-a456-426614174006","time_on_clock":"14:30"},"properties":{"common_model_id":{"description":"Stable, cross-request-safe identifier for this play — unlike `id`, this does not change when the play is re-observed by the same feed. Recommended as the join key for correlating this play across separate API calls.","type":"string"},"defense_id":{"description":"Team or player in defensive role","type":"string"},"description":{"description":"Human-readable narrative description of what occurred","type":"string"},"event_id":{"description":"Parent event/game this play belongs to","format":"uuid","type":"string"},"game_context":{"additionalProperties":true,"description":"Situational game state when play occurred","example":{"defense_score":7,"initial_distance":8,"initial_down":2,"initial_yards_from_scoring":25,"offense_score":14,"quarter":3,"time_remaining":"8:42"},"type":"object"},"id":{"description":"Per-observation record identifier — regenerates on re-ingestion of the same real-world play, so it is NOT stable across requests. Use `common_model_id` for a stable, cross-request-safe identifier.","format":"uuid","type":"string"},"league_id":{"description":"League context for sport-specific play rules and interpretation","format":"uuid","type":"string"},"minutes_remaining":{"description":"Minutes remaining in current period when play started","type":"integer"},"offense_id":{"description":"Team or player with possession/offensive role","type":"string"},"period":{"description":"Game period when play occurred (quarter, inning, period)","type":"integer"},"play_details":{"additionalProperties":true,"description":"Sport-specific detailed measurements and outcomes","example":{"event_type":"single","is_out":false,"pitches":[{"pitch_number":1,"pitch_type":"FF","release_x":-1.9,"release_z":4.95,"start_speed":96.6},{"coord_x":89.8,"coord_y":111.48,"hardness":"medium","hit_location":7,"pitch_number":2,"release_x":-2.0,"release_z":4.97,"trajectory":"ground_ball"}],"play_category":"at_bat"},"type":"object"},"play_number":{"description":"Play number within the event, scoped to `source` — NOT globally unique per event. Multiple feeds (from different providers) can each number their own plays starting from 1, so the same play_number on two different sources refers to two different plays. Always join on (event_id, source, play_number), never (event_id, play_number) alone. For a single opaque cross-request identifier, use `common_model_id` instead.","type":"integer"},"play_type":{"description":"Classification of play action (pass, run, shot, penalty, etc.)","type":"string"},"seconds_remaining":{"description":"Seconds remaining in current period when play started","type":"integer"},"source":{"description":"Data provider or official source of play-by-play information","type":"string"},"tenant_id":{"description":"Client tenant accessing this play data","format":"uuid","type":"string"},"time_on_clock":{"description":"Game clock time in MM:SS format (for timed sports)","type":"string"}},"required":["description","common_model_id"],"title":"Play","type":"object"}}},"description":"Plays Response"},"401":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"invalid_api_key","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/invalid_api_key","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"not_found","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/not_found","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Not Found"}},"summary":"List Plays For Event","tags":["Stats & Data","Stats & Data","Stats & Data","Reference"]}},"/api/v1/data-dictionary/market-types":{"get":{"callbacks":{},"description":"Returns all market type definitions used in sports betting.\n\nEach market type includes:\n- **canonical_name**: The standardized market type identifier\n- **display_name**: Human-readable display name\n- **category**: Market category (e.g., core, player_props, game_props)\n- **provider_aliases**: Provider-specific market identifiers\n- **stat_mapping**: Optional mapping to statistics for player prop markets\n","operationId":"ApiRestWeb.DataDictionaryController.market_types","parameters":[{"description":"Filter by category (e.g., core, player_props, game_props)","example":"player_props","in":"query","name":"category","required":false,"schema":{"type":"string"}},{"description":"Filter by provider key","example":"provider_key","in":"query","name":"provider","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"items":{"properties":{"canonical_name":{"description":"Standardized market type identifier","example":"moneyline","type":"string"},"category":{"description":"Market category","example":"core","type":"string"},"display_name":{"description":"Human-readable display name","example":"Winner of the game/match (2-way betting)","type":"string"},"provider_aliases":{"additionalProperties":{"items":{"type":"string"},"type":"array"},"description":"Provider-specific market identifiers","example":{"provider_a":["h2h"],"provider_b":["market_219"]},"type":"object"},"stat_mapping":{"description":"Optional mapping to statistics for calculating market outcomes","example":{"basketball":{"calculation_type":"simple_stat","stat_mapping":"points"}},"nullable":true,"type":"object"}},"type":"object"},"type":"array"},"meta":{"properties":{"categories":{"description":"List of market categories","items":{"type":"string"},"type":"array"},"providers":{"description":"List of providers with mappings","items":{"type":"string"},"type":"array"},"total_count":{"description":"Total number of market types","type":"integer"}},"type":"object"}},"type":"object"}}},"description":"Market Types Response"},"401":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"invalid_api_key","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/invalid_api_key","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Unauthorized"}},"summary":"List Market Types","tags":["SportsStack"]}},"/api/v1/mappings":{"get":{"callbacks":{},"description":"List mappings for a given entity type. Returns most recently updated mappings first.\n\nRow selection is controlled by the standard filters such as `entity_type`,\n`common_model_id`, `integration`, `league`, and `source_id`.\n\n`source_id` is unique only together with `entity_type`/`integration` — the\nsame source_id string can legitimately belong to two different providers.\nA `source_id` filter given without `entity_type`, `integration`/`provider`,\nor `common_model_id` to narrow it returns `409 conflict` when that source_id\nis ambiguous, instead of silently returning whichever provider's row is\nnewest.\n\nEnrichment is controlled separately:\n- `return_source_id_format` adds a `source_mappings` object for the requested provider\n  without narrowing the top-level rows.\n- `include_all_mappings=true` adds `all_mappings` for each returned row and supersedes\n  `return_source_id_format` when both are provided.\n","operationId":"ApiRestWeb.MappingsController.index","parameters":[{"description":"Filter by entity type (player / team / event / market / outcome / odd / etc..)","in":"query","name":"entity_type","required":false,"schema":{"type":"string"}},{"description":"Filter by the mapping's canonical entity ID (alias of common_model_id).","in":"query","name":"entity_id","required":false,"schema":{"format":"uuid","type":"string"}},{"description":"Filter by common model ID of the mapped entity, if null - it is unmapped / pending","in":"query","name":"common_model_id","required":false,"schema":{"type":"string"}},{"description":"Filter by league (e.g. nfl) - See the full list of leagues in the /leagues endpoint","in":"query","name":"league","required":false,"schema":{"type":"string"}},{"description":"Filter top-level mapping rows by provider. Alias of integration.","in":"query","name":"provider","required":false,"schema":{"type":"string"}},{"description":"Filter top-level mapping rows by integration/provider (a provider key). Tokens remain exact after case normalization. This is distinct from return_source_id_format, which only enriches rows.","in":"query","name":"integration","required":false,"schema":{"type":"string"}},{"description":"Filter by an external integration ID. Polymarket markets also resolve by CLOB token ID, condition ID, and slug.","in":"query","name":"source_id","required":false,"schema":{"type":"string"}},{"description":"Operations-only (`mapping:read` scope): include mappings deprecated after two distinct complete catalog misses.","in":"query","name":"include_deprecated","required":false,"schema":{"type":"boolean"}},{"description":"Add `all_mappings` for each returned row. When true, this supersedes `return_source_id_format`.","in":"query","name":"include_all_mappings","required":false,"schema":{"type":"boolean"}},{"description":"Add a `source_mappings` object for the requested integration (a provider key) without narrowing the top-level rows. Combine with `integration` when the top-level rows must also be that provider's mappings.","in":"query","name":"return_source_id_format","required":false,"schema":{"type":"string"}},{"description":"Return an exact `x-total-count`/`x-total-pages` response header\npair. Defaults to `true` when the request is bounded by\n`entity_id`, `common_model_id`, or `source_id`, and `false`\notherwise -- counting every row matching only\n`entity_type`/`provider`/`league` is unbounded (millions of rows\nfor a busy provider). This endpoint has no JSON `meta` object;\nwhen the count is skipped, both headers are omitted (never sent as\nzero or null) and the `link` header's `next` relation drives\npagination instead. Must be `true` or `false`; any other value is\nrejected with HTTP 400.\n\nFor a request not bounded by `entity_id`, `common_model_id`, or\n`source_id`, the total is computed off the request path and reused\nfor up to ten minutes across pages and polls, so it can trail new\nmappings by that long. If it has not been computed yet (first request\nafter a deploy, or a total that is still being counted) the response\nis served at once with both headers omitted; the next request\ncarries them.\n","in":"query","name":"count","required":false,"schema":{"type":"boolean"}},{"description":"When true, add source_mappings_by_source keyed by full normalized source (for example, provider.football.nfl).","in":"query","name":"include_source_mappings_by_source","required":false,"schema":{"default":false,"type":"boolean"}},{"description":"Optional provider-family filter for source_mappings_by_source (for example, a provider key).","in":"query","name":"source_mapping_provider","required":false,"schema":{"type":"string"}},{"description":"Optional full-source filter for source_mappings_by_source in provider.sport.league format.","in":"query","name":"source_mapping_source","required":false,"schema":{"type":"string"}},{"description":"Page number for page/per_page pagination. Do not combine with limit/offset.","in":"query","name":"page","required":false,"schema":{"default":1,"minimum":1,"type":"integer"}},{"description":"Number of items per page (max 1000). Do not combine with limit/offset.","in":"query","name":"per_page","required":false,"schema":{"default":500,"maximum":1000,"minimum":1,"type":"integer"}},{"description":"Maximum rows for limit/offset pagination. Do not combine with page/per_page.","in":"query","name":"limit","required":false,"schema":{"maximum":1000,"minimum":1,"type":"integer"}},{"description":"Zero-based row offset for limit/offset pagination. Do not combine with page/per_page.","in":"query","name":"offset","required":false,"schema":{"minimum":0,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"items":{"description":"Identity mapping that links external data provider IDs to our unified common model IDs.\n\nEntityIdentity records are the foundation of our data normalization system, enabling us\nto aggregate data from multiple providers about the same real-world entity (player, team,\nevent, etc.) into a single unified representation.\n\n## Core Concept\nDifferent data providers use different ID systems for the same entities:\n- **Provider A**: Player ID \"A_123456\"\n- **Provider B**: Player ID \"B_45678\"\n- **Provider C**: Player ID \"C_987654\"\n\nOur system maps these to a single common_model_id representing that player.\n\n## Mapping States\n- **Mapped**: source_id linked to valid common_model_id (ready for data aggregation)\n- **Pending**: source_id exists but common_model_id is null (needs manual/AI resolution)\n- **Conflicted**: Multiple potential matches requiring human review\n\n## Resolution Process\n1. **Automatic Matching**: Algorithm/AI attempts to link source_id to existing entity\n2. **Fuzzy Matching**: Name/attribute similarity matching when exact match fails\n3. **Manual Review**: Human verification for ambiguous cases\n4. **New Entity Creation**: Generate new common_model_id when no match exists\n\n## Data Quality Impact\nProper identity mapping ensures:\n- **Complete Data**: All provider data aggregated under single entity\n- **Accuracy**: No duplicate or missing entities\n- **Consistency**: Unified view across all data sources\n","example":{"entity_id":"59291391-0c7e-442b-9496-33074647384e","entity_type":"player","id":"49306211-7b48-4b5e-88e9-a4190189dbea","integration":"example_provider","league":"nfl","source_id":"123456"},"properties":{"all_mappings":{"description":"Optional enrichment containing all known provider mappings for this entity when include_all_mappings=true","items":{"properties":{"integration":{"description":"Provider name for this additional mapping","type":"string"},"source_id":{"description":"Provider-specific ID for this entity","type":"string"}},"type":"object"},"type":"array"},"common_model_id":{"description":"Our unified identifier for this entity - null indicates unmapped/pending status","type":"string"},"deprecated_at":{"description":"Set after two distinct complete catalog misses. Deprecated mappings are hidden by default.","format":"date-time","nullable":true,"type":"string"},"entity_type":{"description":"Category of entity being mapped (player, team, event, league, market, etc.)","type":"string"},"id":{"description":"Unique identifier for this specific mapping record","type":"string"},"inserted_at":{"description":"When this mapping was first created","format":"date-time","type":"string"},"integration":{"description":"External data provider key","type":"string"},"league":{"description":"League context for the mapping (nfl, nba, mlb) - same entity may have different IDs per league","type":"string"},"source_id":{"description":"Entity identifier from the external data provider's system","type":"string"},"source_mappings":{"additionalProperties":{"type":"string"},"description":"Optional provider-to-source_id map added when return_source_id_format is supplied","type":"object"},"source_mappings_by_source":{"additionalProperties":{"properties":{"event":{"description":"Event mapping rows for event endpoints.","items":{"properties":{"common_model_id":{"format":"uuid","type":"string"},"deprecated_at":{"format":"date-time","nullable":true,"type":"string"},"entity_type":{"type":"string"},"id_scheme":{"type":"string"},"ignored_pending":{"type":"boolean"},"league":{"type":"string"},"match_status":{"type":"string"},"overmapped_allowed":{"type":"boolean"},"provider":{"type":"string"},"source":{"type":"string"},"source_id":{"type":"string"},"tenant_id":{"format":"uuid","nullable":true,"type":"string"},"updated_at":{"format":"date-time","type":"string"}},"type":"object"},"type":"array"},"mappings":{"description":"Source mapping rows for non-event entity endpoints.","items":{"properties":{"common_model_id":{"format":"uuid","type":"string"},"deprecated_at":{"format":"date-time","nullable":true,"type":"string"},"entity_type":{"type":"string"},"id_scheme":{"type":"string"},"ignored_pending":{"type":"boolean"},"league":{"type":"string"},"match_status":{"type":"string"},"overmapped_allowed":{"type":"boolean"},"provider":{"type":"string"},"source":{"type":"string"},"source_id":{"type":"string"},"tenant_id":{"format":"uuid","nullable":true,"type":"string"},"updated_at":{"format":"date-time","type":"string"}},"type":"object"},"type":"array"},"participants":{"description":"Participant mapping rows for event endpoints.","items":{"properties":{"common_model_id":{"format":"uuid","type":"string"},"deprecated_at":{"format":"date-time","nullable":true,"type":"string"},"entity_type":{"type":"string"},"id_scheme":{"type":"string"},"ignored_pending":{"type":"boolean"},"league":{"type":"string"},"match_status":{"type":"string"},"overmapped_allowed":{"type":"boolean"},"participant_id":{"format":"uuid","type":"string"},"participant_role":{"type":"string"},"participant_side":{"enum":["home","away","neutral","unknown"],"type":"string"},"provider":{"type":"string"},"source":{"type":"string"},"source_id":{"type":"string"},"tenant_id":{"format":"uuid","nullable":true,"type":"string"},"updated_at":{"format":"date-time","type":"string"}},"type":"object"},"type":"array"},"unmapped_participants":{"description":"Event participants that could not be emitted as source mappings because they were placeholders/TBD or lacked a mapping for the requested source.","items":{"properties":{"display_name":{"type":"string"},"participant_id":{"type":"string"},"participant_role":{"type":"string"},"participant_side":{"enum":["home","away","neutral","unknown"],"type":"string"},"reason":{"enum":["placeholder_or_tbd","missing_source_mapping"],"type":"string"}},"type":"object"},"type":"array"}},"type":"object"},"description":"Optional enterprise mapping enrichment keyed by full normalized source. Added when include_source_mappings_by_source=true.","type":"object"},"updated_at":{"description":"When this mapping was last updated","format":"date-time","type":"string"}},"required":["id","entity_type","integration","league","source_id"],"title":"Mapping","type":"object"},"type":"array"}},"required":["data"],"type":"object"}}},"description":"Mapping Response"},"400":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"bad_request","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/bad_request","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"invalid_api_key","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/invalid_api_key","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"forbidden","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/forbidden","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Forbidden"},"409":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"conflict","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/conflict","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Conflict"}},"summary":"List Mappings","tags":["Mappings"]}},"/api/v1/settlement/query":{"get":{"callbacks":{},"operationId":"ApiRestWeb.Settlement.QueryController.show","parameters":[{"description":"Event ID (common_model_id)","in":"query","name":"event_id","required":true,"schema":{"type":"string"}},{"description":"Player or team ID (common_model_id)","in":"query","name":"entity_id","required":true,"schema":{"type":"string"}},{"description":"Entity type: 'player' or 'team'","in":"query","name":"entity_type","required":true,"schema":{"type":"string"}},{"description":"Stat name — accepts either market type (e.g., 'player_points') or raw stat key (e.g., 'points')","in":"query","name":"stat_name","required":true,"schema":{"type":"string"}},{"description":"Betting line value","in":"query","name":"line","required":true,"schema":{"type":"number"}},{"description":"League abbreviation (e.g., 'nba')","in":"query","name":"league","required":true,"schema":{"type":"string"}},{"description":"Outcome direction: 'over' or 'under'. When provided, returns win/loss/push result.","in":"query","name":"direction","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"examples":{"caution":{"description":"Moderate confidence (50-84%). Result directionally clear but margin is thin or game in post-correction window. Manual review recommended.","summary":"Caution","value":{"data":{"action":"caution","additional_provider_count":1,"consensus_value":26.0,"display_name":"Player Points","entity_name":"Anthony Edwards","game_phase_factor":92.0,"line":25.5,"margin_safety":85.0,"market_type":"player_points","outcome_direction":"over","provider_count":4,"provider_spread":2.0,"provider_values":[{"source":"provider_a","value":27.0},{"source":"provider_b","value":26.0},{"source":"provider_c","value":25.0}],"reasoning":"CAUTION: Moderate confidence (64.1%). Stat value 26.0 near line 25.5 — within danger zone (margin: 0.5 over). Game final, in post-correction window. 4 providers reporting (85% agreement).","reliability":{"agreement":0.85,"correction_modifier":1.0,"coverage":0.8,"provider_count":4,"provider_spread":2.0},"result":"win","settlement_confidence":64.1,"stat_confidence":82.0,"stat_name":"player_points","total_provider_count":4,"visible_sources":["provider_a","provider_b","provider_c"]}}},"hold":{"description":"Low confidence (<50%). Insufficient data, high provider disagreement, or game still in progress. Do not settle — wait for more data.","summary":"Hold","value":{"data":{"action":"hold","additional_provider_count":0,"consensus_value":24.0,"display_name":"Player Points","entity_name":"Luka Doncic","game_phase_factor":65.0,"line":24.5,"margin_safety":45.0,"market_type":"player_points","outcome_direction":"over","provider_count":2,"provider_spread":4.0,"provider_values":[{"source":"provider_a","value":22.0},{"source":"provider_b","value":26.0}],"reasoning":"HOLD: Low confidence (21.9%). Stat value 24.0 near line 24.5 — within danger zone (margin: 0.5 over). Game in progress (mid-game). 2 providers reporting (70% agreement).","reliability":{"agreement":0.7,"correction_modifier":1.0,"coverage":0.5,"provider_count":2,"provider_spread":4.0},"result":null,"settlement_confidence":21.9,"stat_confidence":75.0,"stat_name":"player_points","total_provider_count":2,"visible_sources":["provider_a","provider_b"]}}},"settle-loss":{"description":"High confidence. Consensus below line for over direction. Safe to settle as a loss.","summary":"Settle — Loss","value":{"data":{"action":"settle","additional_provider_count":3,"consensus_value":21,"display_name":"Player Points","entity_name":"Zion Williamson","game_phase_factor":100,"line":21.5,"margin_safety":100,"market_type":"player_points","outcome_direction":"over","provider_count":6,"provider_spread":0,"provider_values":[{"source":"provider_a","value":21},{"source":"provider_b","value":21},{"source":"provider_c","value":21}],"reasoning":"SETTLE: High confidence (100.0%). Stat value 21.0 clearly on wrong side of line 21.5 for over (margin: 0.5). Confident loss. Game fully settled. 6 providers reporting (100.0% agreement).","reliability":{"agreement":1,"correction_modifier":1,"coverage":1,"provider_count":6,"provider_spread":0},"result":"loss","settlement_confidence":100,"stat_confidence":100,"stat_name":"player_points","total_provider_count":6,"visible_sources":["provider_a","provider_b","provider_c"]}}},"settle-win":{"description":"High confidence. Consensus clearly exceeds line. Safe to settle as a win.","summary":"Settle — Win","value":{"data":{"action":"settle","additional_provider_count":3,"consensus_value":13.0,"display_name":"Player Points","entity_name":"Ben Sheppard","game_phase_factor":100.0,"line":9.5,"margin_safety":100.0,"market_type":"player_points","outcome_direction":"over","provider_count":6,"provider_spread":0.0,"provider_values":[{"source":"provider_a","value":13.0},{"source":"provider_b","value":13.0},{"source":"provider_c","value":13.0}],"reasoning":"SETTLE: High confidence (100.0%). Stat value 13.0 is well clear of line 9.5 (margin: 3.5 over). Game fully settled. 6 providers reporting (100% agreement).","reliability":{"agreement":1.0,"correction_modifier":1.0,"coverage":1.0,"provider_count":6,"provider_spread":0.0},"result":"win","settlement_confidence":100.0,"stat_confidence":100.0,"stat_name":"player_points","total_provider_count":6,"visible_sources":["provider_a","provider_b","provider_c"]}}}},"schema":{"properties":{"data":{"properties":{"action":{"description":"Settlement recommendation: settle (>=85% confidence), caution (50-84%), hold (<50%)","enum":["settle","caution","hold"],"type":"string"},"additional_provider_count":{"description":"Hidden providers contributing to consensus but not shown","type":"integer"},"consensus_value":{"description":"Consensus stat value across providers","type":"number"},"display_name":{"type":"string"},"entity_name":{"nullable":true,"type":"string"},"game_phase_factor":{"description":"Game completion factor as percentage (100 = fully settled)","type":"number"},"hold_reason":{"description":"Coarse, stable reason code for a `hold` or `caution` action. `unsupported_contract_variant` means the line maps to a prediction-market contract variant whose settlement rules are not supported; it is terminal, do not poll for it to change. Always `null` for `settle`.","enum":["event_not_started","no_evidence_sources","awaiting_eligibility","conflicting_first_scorer_signal","missing_first_scorer_signal","missing_sportradar","missing_ufcstats","missing_opticodds","insufficient_provider_quorum","incomplete_result","incomplete_stats","post_final_settlement_window","provider_conflict","unsupported_line","unsupported_selection","unsupported_method","unsupported_official_method","pga_cut_status_missing","pga_missing_player_stat","pga_final_stat_not_available","pga_leaderboard_not_final","pga_missing_line","pga_missing_direction","pga_round_not_final","unsupported_contract_variant"],"nullable":true,"type":"string"},"line":{"description":"Betting line value","type":"number"},"margin_safety":{"description":"How far consensus is from the line, as percentage (100 = max safety)","type":"number"},"market_type":{"type":"string"},"outcome_direction":{"enum":["over","under"],"type":"string"},"provider_count":{"description":"Total providers with data","type":"integer"},"provider_spread":{"description":"Max difference between provider values","type":"number"},"provider_values":{"description":"Per-provider stat values (filtered to tenant-visible providers)","items":{"properties":{"observed_at":{"format":"date_time","nullable":true,"type":"string"},"provider_entity_id":{"nullable":true,"type":"string"},"provider_family":{"nullable":true,"type":"string"},"provider_stat_name":{"nullable":true,"type":"string"},"source":{"type":"string"},"stat_name":{"nullable":true,"type":"string"},"value":{"nullable":true,"oneOf":[{"type":"number"},{"properties":{"final_round":{"nullable":true,"type":"integer"},"final_round_seconds":{"nullable":true,"type":"integer"},"method":{"nullable":true,"type":"string"},"result_complete":{"nullable":true,"type":"boolean"},"round_length_seconds":{"nullable":true,"type":"integer"},"scheduled_rounds":{"nullable":true,"type":"integer"},"terminal_status":{"nullable":true,"type":"string"},"winner_common_model_id":{"nullable":true,"type":"string"}},"type":"object"}]}},"type":"object"},"type":"array"},"reasoning":{"description":"Human-readable explanation of the recommendation","type":"string"},"reliability":{"nullable":true,"properties":{"agreement":{"nullable":true,"type":"number"},"correction_modifier":{"nullable":true,"type":"number"},"coverage":{"nullable":true,"type":"number"},"provider_count":{"nullable":true,"type":"integer"},"provider_spread":{"nullable":true,"type":"number"}},"type":"object"},"result":{"enum":["win","loss","push","void"],"nullable":true,"type":"string"},"settlement_confidence":{"description":"Combined confidence score (stat_confidence × margin_safety × game_phase_factor)","type":"number"},"stat_confidence":{"description":"Provider agreement and coverage score","type":"number"},"stat_name":{"type":"string"},"total_provider_count":{"type":"integer"},"visible_sources":{"items":{"type":"string"},"type":"array"}},"type":"object"}},"type":"object"}}},"description":"Settlement Query Response"},"400":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"bad_request","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/bad_request","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"invalid_api_key","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/invalid_api_key","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"not_found","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/not_found","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Not Found"},"503":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"service_unavailable","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/service_unavailable","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Service Unavailable"}},"summary":"Query settlement confidence for a single market","tags":["Settlement"]}},"/api/v1/settlement/batch":{"post":{"callbacks":{},"operationId":"ApiRestWeb.Settlement.BatchController.create","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"properties":{"league":{"description":"League abbreviation","type":"string"},"markets":{"items":{"properties":{"direction":{"description":"Selection direction; defaults to over","enum":["over","under"],"type":"string"},"entity_id":{"type":"string"},"entity_type":{"type":"string"},"event_id":{"type":"string"},"line":{"type":"number"},"name":{"description":"Optional market display name","nullable":true,"type":"string"},"stat_name":{"type":"string"}},"required":["event_id","entity_id","entity_type","stat_name","line"],"type":"object"},"maxItems":200,"type":"array"}},"required":["markets","league"],"type":"object"}}},"description":"Batch request","required":false},"responses":{"200":{"content":{"application/json":{}},"description":"Batch Settlement Response"},"400":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"bad_request","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/bad_request","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"invalid_api_key","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/invalid_api_key","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"not_found","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/not_found","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Not Found"}},"summary":"Evaluate settlement confidence for a batch of markets","tags":["Settlement"]}},"/api/v1/self-service/entities":{"post":{"callbacks":{},"description":"Creates a core player, team, or event common_model_id and writes the provider mapping. Requires entity:mint scope plus an explicit mint source allowlist; intended only for approved primary seeding of new leagues.","operationId":"ApiRestWeb.SelfServiceController.create_entity","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"example":{"entity":{"display_name":"Jane Example","league_common_model_id":"550e8400-e29b-41d4-a716-446655440000","position":"Right"},"entity_type":"player","evidence":{"observed_at":"2026-06-29T12:00:00Z","source_url":"https://example.com/roster"},"source":"partner.pickleball.mlp","source_id":"mlp-player-123"},"properties":{"entity":{"properties":{"display_name":{"type":"string"},"league_common_model_id":{"format":"uuid","type":"string"},"metadata":{"type":"object"},"position":{"nullable":true,"type":"string"}},"type":"object"},"entity_type":{"enum":["player","team","event"],"type":"string"},"evidence":{"type":"object"},"source":{"example":"partner.pickleball.mlp","type":"string"},"source_id":{"example":"mlp-player-123","type":"string"}},"required":["source","entity_type","source_id","entity"],"type":"object"}}},"description":"Self-service entity seed request","required":false},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"properties":{"action":{"nullable":true,"type":"string"},"common_model_id":{"format":"uuid","nullable":true,"type":"string"},"entity":{"type":"object"},"entity_type":{"enum":["player","team","event"],"type":"string"},"ignored_pending":{"type":"boolean"},"mapping_id":{"format":"uuid","type":"string"},"mapping_state":{"enum":["mapped","pending","ignored"],"type":"string"},"match_status":{"nullable":true,"type":"string"},"pending_mapping_id":{"format":"uuid","nullable":true,"type":"string"},"source":{"example":"cbs.basketball.nba","type":"string"},"source_id":{"example":"cbs-breanna-stewart","type":"string"}},"type":"object"}},"type":"object"}}},"description":"Self-service entity seed response"},"400":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"bad_request","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/bad_request","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"invalid_api_key","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/invalid_api_key","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"forbidden","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/forbidden","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"not_found","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/not_found","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Not Found"},"409":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"conflict","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/conflict","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Conflict"},"422":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"validation_error","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/validation_error","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Validation Error"},"503":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"service_unavailable","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/service_unavailable","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Service Unavailable"}},"summary":"Mint a new SportsStack entity for an approved primary source","tags":["Self-Service"]}},"/api/v1/rankings":{"get":{"callbacks":{},"operationId":"ApiRestWeb.RankingsController.index","parameters":[{"description":"Filter by league ID — accepts a UUID or league abbreviation (e.g., 'ATP', 'WTA'). See GET /api/v1/leagues for all leagues.","in":"query","name":"league_id","required":true,"schema":{"example":"ATP","type":"string"}},{"description":"Compatibility alias for team rankings (`for_entity_type=team`, `for_entity_id=<team_id>`)","example":"01c7133f-2999-4803-9872-8c2ab1ba63ac","in":"query","name":"team_id","required":false,"schema":{"type":"string"}},{"description":"Filter by entity type (`team` or `player`)","in":"query","name":"for_entity_type","required":false,"schema":{"enum":["team","player"],"example":"player","type":"string"}},{"description":"Filter by target entity ID (team or player)","example":"01c7133f-2999-4803-9872-8c2ab1ba63ac","in":"query","name":"for_entity_id","required":false,"schema":{"type":"string"}},{"description":"Filter by season year","in":"query","name":"season_year","required":false,"schema":{"example":2024,"type":"integer"}},{"description":"Filter by season type (REG, TOUR, etc.)","in":"query","name":"season_type","required":false,"schema":{"example":"REG","type":"string"}},{"description":"Filter by source provider (e.g., 'provider.tennis.atp')","in":"query","name":"source","required":false,"schema":{"type":"string"}},{"description":"Filter by primary organizational group (e.g., 'NFC East', 'Group A'). Works across all sports.","example":"Group A","in":"query","name":"primary_group","required":false,"schema":{"type":"string"}},{"description":"Filter by primary group type: 'division', 'group', 'conference', 'region', 'pool'","in":"query","name":"primary_group_type","required":false,"schema":{"enum":["division","group","conference","region","pool"],"example":"group","type":"string"}},{"description":"Filter by secondary/parent group (e.g., conference, league)","example":"ATP Tour","in":"query","name":"secondary_group","required":false,"schema":{"type":"string"}},{"description":"Page number for page/per_page pagination. Do not combine with limit/offset.","in":"query","name":"page","required":false,"schema":{"default":1,"minimum":1,"type":"integer"}},{"description":"Number of items per page (max 1000). Do not combine with limit/offset.","in":"query","name":"per_page","required":false,"schema":{"default":100,"maximum":1000,"minimum":1,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"description":"Historical standings or rankings snapshot for a specific tenant, entity, season, and season type.\n\nRecords nightly provider imports so you can query past ranks,\ngames-back deltas, and splits while the most recent regular-season snapshot is surfaced\non `Team.metadata`.\n","example":{"for_entity_id":"01c7133f-2999-4803-9872-8c2ab1ba63ac","for_entity_type":"team","league_id":"32fa944f-b1bd-41b4-bec2-7ab269fde6fc","metadata":{"conference_name":"NFC","division_name":"NFC East"},"primary_group":"NFC East","primary_group_type":"division","ranking_overall":3,"ranking_primary_context":"division","ranking_primary_value":1,"record_losses":2,"record_ties":0,"record_wins":11,"season_type":"REG","season_year":2024,"secondary_group":"NFC","secondary_group_type":"conference","source_for_entity_id":"competitor_4422","table_type":"standings","team_id":"01c7133f-2999-4803-9872-8c2ab1ba63ac"},"properties":{"status_streak_type":{"description":"Identifier for the current streak (WIN, LOSS, TIE)","type":"string"},"split_away_ties":{"description":"Away ties","type":"integer"},"scoring_against":{"description":"Total scoring against","type":"integer"},"ranking_points":{"description":"Table points (soccer/rugby/etc.)","type":"integer"},"secondary_group_type":{"description":"Type of secondary grouping.\nValues: conference, league, null\n","enum":["conference","league"],"nullable":true,"type":"string"},"split_division_losses":{"description":"Division losses","type":"integer"},"scoring_unit":{"description":"Unit for scoring metrics (points, runs, goals, etc.)","type":"string"},"source_for_entity_id":{"description":"Provider source identifier for the ranked/standing entity.","nullable":true,"type":"string"},"record_games_played":{"description":"Total games played","type":"integer"},"ranking_overall":{"description":"Overall/league rank","type":"integer"},"ranking_primary_value":{"type":"integer"},"split_last10_ties":{"description":"Ties over last 10","type":"integer"},"ranking_group":{"description":"Group/Pool rank","type":"integer"},"split_away_wins":{"description":"Away wins","type":"integer"},"split_home_ties":{"description":"Home ties","type":"integer"},"split_last10_wins":{"description":"Wins over last 10","type":"integer"},"season_type":{"description":"Season segment (PRE, REG, PST, etc.)","type":"string"},"record_losses":{"description":"Total losses","type":"integer"},"record_ties":{"description":"Total ties","type":"integer"},"record_games_back":{"description":"Games behind the division leader","format":"float","type":"number"},"status_streak_text":{"description":"Human-readable streak text","type":"string"},"record_win_pct":{"description":"Win percentage","format":"float","type":"number"},"league_id":{"description":"League this snapshot belongs to","type":"string"},"ranking_secondary_value":{"type":"integer"},"split_division_wins":{"description":"Division wins","type":"integer"},"for_entity_id":{"description":"Common Model ID of the team or player represented by this row.","type":"string"},"id":{"description":"Standings record identifier","type":"string"},"split_home_losses":{"description":"Home losses","type":"integer"},"record_wildcard_back":{"description":"Games behind the wildcard leader","format":"float","type":"number"},"split_conference_wins":{"description":"Conference wins","type":"integer"},"tenant_id":{"description":"Tenant that owns this standings snapshot","type":"string"},"primary_group":{"description":"Most granular organizational grouping name. Works across all sports.\nExamples: \"NFC East\" (NFL), \"Group E\" (World Cup), \"Atlantic\" (NBA).\n","nullable":true,"type":"string"},"split_last10_losses":{"description":"Losses over last 10","type":"integer"},"status_clinched":{"description":"Clinched qualifier (division, wildcard, playoff, etc.)","type":"string"},"ranking_primary_context":{"description":"Context for the primary rank value (division, conference, etc.)","type":"string"},"record_wins":{"description":"Total wins","type":"integer"},"scoring_diff":{"description":"Scoring differential","type":"integer"},"for_entity_type":{"description":"Entity type represented by this row.","enum":["team","player"],"type":"string"},"split_conference_losses":{"description":"Conference losses","type":"integer"},"ranking_secondary_context":{"description":"Context for the secondary rank value","type":"string"},"season_id":{"description":"Season Common Model ID","type":"string"},"split_home_wins":{"description":"Home wins","type":"integer"},"season_year":{"description":"Season year","type":"integer"},"ranking_wildcard":{"description":"Wildcard rank","type":"integer"},"split_conference_ties":{"description":"Conference ties","type":"integer"},"status_elimination_number":{"description":"Elimination number for the current race","type":"integer"},"team_id":{"description":"Legacy compatibility field. Mirrors `for_entity_id` when `for_entity_type=team`.","nullable":true,"type":"string"},"split_away_losses":{"description":"Away losses","type":"integer"},"secondary_group":{"description":"Parent/higher-level organizational grouping if exists.\nExamples: \"NFC\" (NFL), \"Eastern Conference\" (NBA), null (World Cup).\n","nullable":true,"type":"string"},"status_streak_length":{"description":"Length of the streak","type":"integer"},"scoring_for":{"description":"Total scoring for","type":"integer"},"standings_date":{"description":"Date/time for when the standings payload was generated","format":"date-time","type":"string"},"metadata":{"additionalProperties":true,"description":"Provider payload fragments plus sport-specific splits/rankings.\n\nNote: Universal organizational hierarchy is now available as top-level fields\n(`primary_group`, `primary_group_type`, `secondary_group`, `secondary_group_type`).\n\n## Sport-Specific Fields (Legacy/Backward Compatibility)\n\n- `division_name` (string): Division name (NFL, NBA, MLB)\n- `conference_name` (string): Conference name (NFL, NBA)\n- `group_name` (string): Group name (World Cup, Champions League)\n\n## Additional Metadata\n\n- `rankings` - Additional ranking breakdowns\n- `split` - Game split details (home/away/division/conference)\n- `scoring_secondary` - Secondary scoring metrics\n- `advanced_metrics` - Provider-specific advanced stats\n","type":"object"},"table_type":{"description":"Distinguishes standings tables from rankings tables.","enum":["standings","ranking"],"type":"string"},"primary_group_type":{"description":"Type of primary grouping. Use this to determine UI labels.\nValues: division, group, conference, region, pool\n","enum":["division","group","conference","region","pool"],"nullable":true,"type":"string"},"split_division_ties":{"description":"Division ties","type":"integer"}},"required":["for_entity_type","for_entity_id","table_type","season_id","season_year","season_type"],"title":"Standings","type":"object"}}},"description":"Rankings Response"},"401":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"invalid_api_key","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/invalid_api_key","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"not_found","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/not_found","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Not Found"}},"summary":"List Rankings","tags":["Stats & Data"]}},"/api/v1/teams":{"get":{"callbacks":{},"operationId":"ApiRestWeb.TeamController.index","parameters":[{"description":"Filter by league ID — accepts a UUID or league abbreviation (e.g., 'NFL', 'NBA'). See GET /api/v1/leagues for all leagues.","in":"query","name":"league_id","required":true,"schema":{"example":"NFL","type":"string"}},{"description":"Include source mappings from the specific integration (i.e. a provider key) will return a source_mappings object with the mappings for the respective objects","in":"query","name":"return_source_id_format","required":false,"schema":{"type":"string"}},{"description":"Search for teams by name","in":"query","name":"search_phrase","required":false,"schema":{"type":"string"}},{"description":"Enable fuzzy matching via Levenshtein distance. Requires search_phrase and league_id. Tolerates typos and name variations.","in":"query","name":"fuzzy","required":false,"schema":{"example":"true","type":"string"}},{"description":"Filter by team status (ACTIVE, INACTIVE). Defaults to ACTIVE if not specified.","in":"query","name":"status","required":false,"schema":{"example":"ACTIVE","type":"string"}},{"description":"Include virtual/placeholder teams (e.g., tournament bracket positions). Only the literal value \"true\" opts in. Defaults to excluded.","in":"query","name":"include_virtual","required":false,"schema":{"example":"true","type":"string"}},{"description":"When true, add source_mappings_by_source keyed by full normalized source (for example, provider.football.nfl).","in":"query","name":"include_source_mappings_by_source","required":false,"schema":{"default":false,"type":"boolean"}},{"description":"Optional provider-family filter for source_mappings_by_source (for example, a provider key).","in":"query","name":"source_mapping_provider","required":false,"schema":{"type":"string"}},{"description":"Optional full-source filter for source_mappings_by_source in provider.sport.league format.","in":"query","name":"source_mapping_source","required":false,"schema":{"type":"string"}},{"description":"Page number for page/per_page pagination. Do not combine with limit/offset.","in":"query","name":"page","required":false,"schema":{"default":1,"minimum":1,"type":"integer"}},{"description":"Number of items per page (max 1000). Do not combine with limit/offset.","in":"query","name":"per_page","required":false,"schema":{"default":50,"maximum":1000,"minimum":1,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"description":"A team represents an organized group of players competing together under a common identity.\n\nTeams are the primary competing entities in team-based sports. They maintain rosters,\nhave historical records, geographic associations, and fan bases. Teams can change leagues,\nrelocate cities, or rebrand while maintaining continuity of their competitive history.\n\n## Team Structure\n- **Identity**: Name, abbreviation, colors, logos, and branding\n- **Location**: City/region association and home venue\n- **Roster**: Current and historical player affiliations\n- **Performance**: Win-loss records, championships, statistics\n- **Organization**: Coaching staff, management, ownership\n\n## Key Relationships\n- **League**: Organizational membership and competitive framework\n- **Players**: Current roster and historical affiliations\n- **Events**: Games played as home or away team\n- **Statistics**: Team-level performance metrics\n- **Markets**: Team-specific betting opportunities\n\n## Franchise Continuity\nTeams may undergo changes while maintaining data continuity:\n- **Relocation**: Moving cities (e.g., St. Louis Rams → Los Angeles Rams)\n- **Rebranding**: Name changes (e.g., Washington Redskins → Commanders)\n- **League Changes**: Moving between divisions or conferences\n\n## Geographic Significance\nTeam location affects scheduling, fan base, media coverage, and betting markets.\nHome field advantage is a measurable factor in performance analysis.\n","example":{"abbreviation":"PHI","colors":[{"type":"primary","value":"#004C54"},{"type":"secondary","value":"#A5ACAF"}],"common_model_id":"e2790078-ec3a-4c45-8dc4-5cf173960b2b","image_url":"https://cdn.example.com/logos/nba/lal.png","league_id":"58e8c89b-72f8-4427-adbc-10f193c9b462","market":"Philadelphia","metadata":{"conference":"NFC","division":"NFC East"},"name":"Philadelphia Eagles","nickname":"Eagles","status":"ACTIVE"},"properties":{"abbreviation":{"description":"Standard short form used in schedules and stats (e.g., 'LAL')","type":"string"},"colors":{"description":"Team brand colors as array of color objects with type and hex value","items":{"properties":{"type":{"description":"Color type: 'primary', 'secondary', or 'accent_N'","example":"primary","type":"string"},"value":{"description":"Color value in hex format","example":"#004C54","type":"string"}},"type":"object"},"type":"array"},"common_model_id":{"description":"Unique team identifier preserving historical continuity","type":"string"},"conference":{"description":"Conference name (e.g., 'NFC', 'Eastern Conference'), hoisted from team metadata for convenience. Null when unavailable; see GET /api/v1/standings for the authoritative grouping.","nullable":true,"type":"string"},"division":{"description":"Division name (e.g., 'NFC East', 'AL West'), hoisted from team metadata for convenience. Null when no provider or standings data supplies it — GET /api/v1/standings?primary_group_type=division is the authoritative source.","nullable":true,"type":"string"},"image_url":{"description":"Team logo, helmet, or primary branding image","type":"string"},"league_id":{"description":"League/competition the team currently competes in","type":"string"},"market":{"description":"Geographic market/city name (e.g., 'Los Angeles', 'Philadelphia')","type":"string"},"metadata":{"additionalProperties":true,"description":"Additional team metadata including division, conference, and other organizational information","properties":{"away_loss":{"description":"Away losses recorded in the current standings snapshot","type":"integer"},"conference":{"description":"Conference name (e.g., 'NFC', 'AFC', 'Eastern Conference')","type":"string"},"division":{"description":"Division name (e.g., 'NFC East', 'AL West')","type":"string"},"division_rank":{"description":"Current division rank (1 = first place) from the latest standings pull","type":"integer"},"home_loss":{"description":"Home losses recorded in the current standings snapshot","type":"integer"},"last_10_lost":{"description":"Losses over the last ten games according to the latest standings import","type":"integer"},"last_10_won":{"description":"Wins over the last ten games according to the latest standings import","type":"integer"},"league_rank":{"description":"Overall league rank from the most recent standings snapshot","type":"integer"},"loss":{"description":"Latest regular-season loss total","type":"integer"},"standing_season_type":{"description":"Season segment (PRE, REG, PST, etc.) for the current standings data","type":"string"},"standing_season_year":{"description":"Season year for the latest standings snapshot applied to this team","type":"integer"},"streak":{"description":"Current streak text (e.g., 'W3', 'L2') sourced from standings metadata","type":"string"},"wild_card_back":{"description":"Games behind the wildcard leader in the most recent standings snapshot","format":"float","type":"number"},"win":{"description":"Latest regular-season win total synced from the authoritative provider","type":"integer"},"win_percentage":{"description":"Decimal win percentage (0-1) from the standings feed","format":"float","type":"number"}},"type":"object"},"name":{"description":"Full team name including city (e.g., 'Los Angeles Lakers')","type":"string"},"nickname":{"description":"Team nickname or mascot name (e.g., 'Lakers', 'Eagles')","type":"string"},"source_mappings_by_source":{"additionalProperties":{"properties":{"event":{"description":"Event mapping rows for event endpoints.","items":{"properties":{"common_model_id":{"format":"uuid","type":"string"},"deprecated_at":{"format":"date-time","nullable":true,"type":"string"},"entity_type":{"type":"string"},"id_scheme":{"type":"string"},"ignored_pending":{"type":"boolean"},"league":{"type":"string"},"match_status":{"type":"string"},"overmapped_allowed":{"type":"boolean"},"provider":{"type":"string"},"source":{"type":"string"},"source_id":{"type":"string"},"tenant_id":{"format":"uuid","nullable":true,"type":"string"},"updated_at":{"format":"date-time","type":"string"}},"type":"object"},"type":"array"},"mappings":{"description":"Source mapping rows for non-event entity endpoints.","items":{"properties":{"common_model_id":{"format":"uuid","type":"string"},"deprecated_at":{"format":"date-time","nullable":true,"type":"string"},"entity_type":{"type":"string"},"id_scheme":{"type":"string"},"ignored_pending":{"type":"boolean"},"league":{"type":"string"},"match_status":{"type":"string"},"overmapped_allowed":{"type":"boolean"},"provider":{"type":"string"},"source":{"type":"string"},"source_id":{"type":"string"},"tenant_id":{"format":"uuid","nullable":true,"type":"string"},"updated_at":{"format":"date-time","type":"string"}},"type":"object"},"type":"array"},"participants":{"description":"Participant mapping rows for event endpoints.","items":{"properties":{"common_model_id":{"format":"uuid","type":"string"},"deprecated_at":{"format":"date-time","nullable":true,"type":"string"},"entity_type":{"type":"string"},"id_scheme":{"type":"string"},"ignored_pending":{"type":"boolean"},"league":{"type":"string"},"match_status":{"type":"string"},"overmapped_allowed":{"type":"boolean"},"participant_id":{"format":"uuid","type":"string"},"participant_role":{"type":"string"},"participant_side":{"enum":["home","away","neutral","unknown"],"type":"string"},"provider":{"type":"string"},"source":{"type":"string"},"source_id":{"type":"string"},"tenant_id":{"format":"uuid","nullable":true,"type":"string"},"updated_at":{"format":"date-time","type":"string"}},"type":"object"},"type":"array"},"unmapped_participants":{"description":"Event participants that could not be emitted as source mappings because they were placeholders/TBD or lacked a mapping for the requested source.","items":{"properties":{"display_name":{"type":"string"},"participant_id":{"type":"string"},"participant_role":{"type":"string"},"participant_side":{"enum":["home","away","neutral","unknown"],"type":"string"},"reason":{"enum":["placeholder_or_tbd","missing_source_mapping"],"type":"string"}},"type":"object"},"type":"array"}},"type":"object"},"description":"Optional enterprise mapping enrichment keyed by full normalized source. Added when include_source_mappings_by_source=true.","type":"object"},"status":{"description":"Team status: ACTIVE for official league teams, INACTIVE for exhibition/minor league teams not in league hierarchy","enum":["ACTIVE","INACTIVE"],"type":"string"}},"required":["common_model_id","name"],"title":"Team","type":"object"}}},"description":"Team Response"},"401":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"invalid_api_key","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/invalid_api_key","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"not_found","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/not_found","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Not Found"},"503":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"service_unavailable","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/service_unavailable","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Service Unavailable"}},"summary":"List Teams","tags":["Reference"]}},"/api/v1/news":{"get":{"callbacks":{},"description":"Retrieves news items with flexible filtering options.\n\nThis endpoint supports filtering by entity type and ID to get news for specific\nplayers, teams, events, or leagues. You can also filter by league to get all\nnews within a specific competition context.\n\n## Filtering Examples\n- **Player News**: `?for_entity_type=player&for_entity_id=123e4567-e89b-12d3-a456-426614174000`\n- **Team News**: `?for_entity_type=team&for_entity_id=123e4567-e89b-12d3-a456-426614174001`\n- **Event News**: `?for_entity_type=event&for_entity_id=123e4567-e89b-12d3-a456-426614174002`\n- **League News**: `?league_id=32fa944f-b1bd-41b4-bec2-7ab269fde6fc`\n\n## Content Freshness\nNews items are typically generated:\n- **Game Recaps**: Within 30 minutes of game completion\n- **Player Insights**: Daily during active seasons\n- **Weekly Summaries**: Monday mornings for previous week's activity\n\n## Response Format\nReturns paginated news items sorted by date (newest first), with full content\nincluding all analysis sections, tags, and metadata.\n","operationId":"ApiRestWeb.NewsController.index","parameters":[{"description":"Filter by entity type. Supported values:\n- `player` - Individual player news and insights\n- `team` - Team performance analysis and updates\n- `event` - Game recaps and post-game analysis\n","in":"query","name":"for_entity_type","required":false,"schema":{"enum":["player","team","event","league"],"example":"player","type":"string"}},{"description":"Filter by specific entity ID (UUID). Must be used together with for_entity_type.\n\nExamples:\n- Player ID: Get all news about a specific player\n- Team ID: Get all news about a specific team\n- Event ID: Get game recap and analysis for a specific event\n","in":"query","name":"for_entity_id","required":false,"schema":{"example":"123e4567-e89b-12d3-a456-426614174000","format":"uuid","type":"string"}},{"description":"Filter by league ID — accepts a UUID or league abbreviation (e.g., 'NFL', 'NBA').\nUse this to get news across all entities (players, teams, events) within a league.\n\nSee GET `/api/v1/leagues` for available leagues.\n","in":"query","name":"league_id","required":true,"schema":{"example":"NFL","type":"string"}},{"description":"Filter news items linked to a specific event (UUID)","in":"query","name":"event_id","required":false,"schema":{"type":"string"}},{"description":"Filter news items from this date onwards (YYYY-MM-DD format)","in":"query","name":"date_from","required":false,"schema":{"example":"2024-01-01","format":"date","type":"string"}},{"description":"Filter news items up to this date (YYYY-MM-DD format)","in":"query","name":"date_to","required":false,"schema":{"example":"2024-12-31","format":"date","type":"string"}},{"description":"Include entity tags in the response. Entity tags identify potential entity mentions\nin news content with confidence and relevance scores.\n\nWhen enabled, each news item will include an `entity_tags` array containing:\n- **entity_type**: Type of entity (player, team, coach, etc.)\n- **entity_id**: Reference to the actual entity\n- **entity_name**: Display name of the entity\n- **mentioned_as**: The actual text that referenced the entity\n- **confidence**: 0.0-1.0 score indicating how confident we are this is the right entity\n- **relevance**: 0.0-1.0 score indicating how relevant/prominent this entity is in the content\n- **context**: Surrounding text context where entity was mentioned\n- **reasoning**: AI/algorithm reasoning for the tag\n\nUse this to discover related entities mentioned in news content and build\nentity relationship graphs.\n","in":"query","name":"include_entity_tags","required":false,"schema":{"default":false,"example":true,"type":"boolean"}},{"description":"Include news articles that mention the entity in their entity_tags (not just direct news).\n\nWhen enabled and searching by for_entity_type/for_entity_id, the results will include:\n1. **Direct news**: Articles specifically about the entity (original behavior)\n2. **Mentioned news**: Articles that mention the entity with sufficient confidence\n\nFor example, when searching for a specific player, you'll get both:\n- Player performance analysis articles (direct)\n- Game recap articles that mention the player significantly (mentioned)\n\nThis provides a more comprehensive view of entity-related content.\n","in":"query","name":"include_entity_mentions","required":false,"schema":{"default":true,"example":true,"type":"boolean"}},{"description":"Minimum confidence threshold for including entity mention matches (0.0-1.0).\n\nOnly applies when include_entity_mentions=true. Higher values return more precise\nmatches but may miss some relevant content. Lower values return more comprehensive\nresults but may include less relevant mentions.\n\n**Recommended values:**\n- 0.9+: Very high precision, only strongest entity mentions\n- 0.7-0.8: Balanced precision and recall (default)\n- 0.5-0.6: Broader results, may include some less relevant mentions\n- <0.5: May include many low-confidence matches\n","in":"query","name":"min_mention_confidence","required":false,"schema":{"default":0.7,"example":0.7,"maximum":1.0,"minimum":0.0,"type":"number"}},{"description":"Page number for page/per_page pagination. Do not combine with limit/offset.","in":"query","name":"page","required":false,"schema":{"default":1,"minimum":1,"type":"integer"}},{"description":"Number of items per page (max 1000). Do not combine with limit/offset.","in":"query","name":"per_page","required":false,"schema":{"default":50,"maximum":1000,"minimum":1,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"description":"News and insights about sports entities including players, teams, events, and leagues.\n\nNews items provide automated analysis, commentary, and insights based on performance data,\nstatistical trends, and recent activity. Each news item contains multiple types of analysis\ntailored for different audiences including media, fantasy sports, and betting markets.\n","example":{"analysis":"Allen's recent rushing success stems from the Bills' increased use of designed quarterback runs in the red zone, capitalizing on his 6'5\" frame and surprising mobility. This strategic shift has coincided with the team's push for playoff positioning, as the coaching staff recognizes Allen's unique ability to create mismatches against smaller linebackers and defensive backs in short-yardage situations.","author":"Matthew Berry","betting_analysis":"Allen's rushing touchdown prop has moved from +125 to -110 over the past two weeks, reflecting bookmakers' adjustment to his recent red zone usage. The over on his rushing yards has hit in 8 of his last 10 games, creating value for bettors who recognize this trend early.","date":"2024-01-15","edit_history":[{"changes":{"tags":["fantasy_football","playoff_implications","rushing_qb","red_zone"]},"editor_id":"user-456","timestamp":"2024-01-15T12:00:00Z"}],"event_id":"456e7890-f12b-34c5-d678-901234567890","for_entity_id":"123e4567-e89b-12d3-a456-426614174000","for_entity_type":"player","headline":"Josh Allen's Rushing Touchdowns Fuel Fantasy Surge Ahead of Playoffs","id":"123e4567-e89b-12d3-a456-426614174000","inserted_at":"2024-01-15T10:30:00Z","league_id":"32fa944f-b1bd-41b4-bec2-7ab269fde6fc","metadata":{"confidence_score":0.89,"data_sources":["example_provider_a","example_provider_b"],"generation_model":"gpt-4-turbo","processing_time":3.2},"original_content":{"analysis":"Allen's recent rushing success stems from...","headline":"Josh Allen's Rushing Touchdowns Fuel Fantasy Surge Ahead of Playoffs","summary":"Josh Allen has scored 4 rushing touchdowns in his last 3 games...","tags":["fantasy_football","playoff_implications"]},"priority":2,"source":"Example News","summary":"Josh Allen has scored 4 rushing touchdowns in his last 3 games, significantly boosting his fantasy value ahead of the playoffs. His dual-threat ability makes him a premium option for championship weeks, especially with the Bills' favorable upcoming schedule.","tags":["fantasy_football","playoff_implications","rushing_qb","red_zone"],"tenant_id":"ff6332b6-8151-4a13-b20c-bd7b2ab45452","updated_at":"2024-01-15T14:45:00Z"},"properties":{"analysis":{"description":"Detailed breakdown and commentary providing deeper insights","example":"Allen's recent rushing success stems from the Bills' increased use of designed quarterback runs in the red zone, capitalizing on his 6'5\" frame and surprising mobility. This strategic shift has coincided with the team's push for playoff positioning...","type":"string"},"author":{"description":"Content creator attribution","example":"Matthew Berry","type":"string"},"betting_analysis":{"description":"Analysis focused on betting markets, odds, and wagering implications","example":"Allen's rushing touchdown prop has moved from +125 to -110 over the past two weeks, reflecting bookmakers' adjustment to his recent red zone usage. The over on his rushing yards has hit in 8 of his last 10 games...","type":"string"},"date":{"description":"Publication date (typically the date of the analyzed performance or event)","example":"2024-01-15","format":"date","type":"string"},"edit_history":{"description":"Chronological record of manual edits made to the content","items":{"properties":{"changes":{"additionalProperties":true,"description":"Fields that were modified in this edit","type":"object"},"editor_id":{"description":"ID of the person who made the edit","type":"string"},"timestamp":{"description":"When the edit was made","format":"date-time","type":"string"}},"type":"object"},"type":"array"},"entity_tags":{"description":"Entity tags identifying potential entity mentions in the content.\nOnly included when include_entity_tags=true is specified in the request.\n","items":{"properties":{"confidence":{"description":"Confidence score (0.0-1.0) indicating how confident we are this is the right entity","maximum":1.0,"minimum":0.0,"type":"number"},"context":{"description":"Surrounding text context where entity was mentioned","type":"string"},"entity_id":{"description":"Reference to the actual entity","format":"uuid","type":"string"},"entity_name":{"description":"Display name of the entity","type":"string"},"entity_type":{"description":"Type of entity being tagged","enum":["player","team","coach","league","venue"],"type":"string"},"id":{"description":"Unique identifier for this entity tag","format":"uuid","type":"string"},"inserted_at":{"description":"When this entity tag was created","format":"date-time","type":"string"},"mentioned_as":{"description":"The actual text that referenced the entity in the content","type":"string"},"reasoning":{"description":"AI/algorithm reasoning for the tag","type":"string"},"relevance":{"description":"Relevance score (0.0-1.0) indicating how relevant/prominent this entity is in the content","maximum":1.0,"minimum":0.0,"type":"number"},"tag_method":{"description":"Specific method used for tagging (e.g., 'gpt4', 'regex', 'user_edit')","type":"string"},"tag_source":{"description":"Source of the tag (AI analysis, manual tagging, etc.)","enum":["ai","manual","rule_based","hybrid"],"type":"string"}},"required":["id","entity_type","entity_id","entity_name","mentioned_as","confidence","relevance","tag_source","tag_method"],"type":"object"},"type":"array"},"event_id":{"description":"Related event ID (for game recaps and event-specific news)","example":"456e7890-f12b-34c5-d678-901234567890","format":"uuid","type":"string"},"for_entity_id":{"description":"ID of the specific entity (player, team, event, or league) this news covers","example":"123e4567-e89b-12d3-a456-426614174000","format":"uuid","type":"string"},"for_entity_type":{"description":"Type of entity this news item is about","enum":["player","team","event","league"],"example":"player","type":"string"},"headline":{"description":"Headline summarizing the main story or insight","example":"Josh Allen's Rushing Touchdowns Fuel Fantasy Surge Ahead of Playoffs","type":"string"},"id":{"description":"Unique identifier for this news item","format":"uuid","type":"string"},"inserted_at":{"description":"When this news item was created in the system","example":"2024-01-15T10:30:00Z","format":"date-time","type":"string"},"league_id":{"description":"League context for this news item","example":"32fa944f-b1bd-41b4-bec2-7ab269fde6fc","format":"uuid","type":"string"},"metadata":{"additionalProperties":true,"description":"Additional context and system metadata","type":"object"},"original_content":{"additionalProperties":true,"description":"Preserved original content before any manual edits","properties":{"analysis":{"description":"Original analysis","type":"string"},"betting_analysis":{"description":"Original betting analysis","type":"string"},"headline":{"description":"Original headline","type":"string"},"summary":{"description":"Original summary","type":"string"},"tags":{"description":"Original tags","items":{"type":"string"},"type":"array"}},"type":"object"},"priority":{"default":3,"description":"Content priority level (1=breaking news/urgent, 5=routine update)","example":3,"maximum":5,"minimum":1,"type":"integer"},"source":{"description":"Publishing source or platform","example":"Example News","type":"string"},"summary":{"description":"Concise overview of the main points, typically 2-3 sentences","example":"Josh Allen has scored 4 rushing touchdowns in his last 3 games, significantly boosting his fantasy value ahead of the playoffs. His dual-threat ability makes him a premium option for championship weeks, especially with the Bills' favorable upcoming schedule.","type":"string"},"tags":{"description":"Content categorization tags for discovery and filtering","example":["game_recap","fantasy_football","playoff_implications","rushing_qb"],"items":{"type":"string"},"type":"array"},"tenant_id":{"description":"Client tenant this news item belongs to","format":"uuid","type":"string"},"tournament_id":{"description":"Related tournament ID (for tournament-specific news)","format":"uuid","type":"string"},"updated_at":{"description":"When this news item was last modified","example":"2024-01-15T14:45:00Z","format":"date-time","type":"string"}},"required":["id","headline","summary","for_entity_type","for_entity_id","league_id","date"],"title":"News","type":"object"}}},"description":"News Response"},"400":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"bad_request","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/bad_request","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"invalid_api_key","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/invalid_api_key","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"not_found","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/not_found","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Not Found"}},"summary":"List News Items","tags":["Content"]}},"/api/v1/prediction-markets/audit-runs":{"post":{"callbacks":{},"description":"Queues a durable, all-league product-acceptance census artifact covering\n`from`..`through` (inclusive, max 31 days). Requires the\n`prediction_market:audit` API-key scope. Returns the durable report id\nimmediately (202); poll `GET /v1/prediction-markets/audit-runs/:id` for\ncompletion.\n","operationId":"ApiRestWeb.PredictionMarketsAuditController.create","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"properties":{"from":{"example":"2026-07-01","format":"date","type":"string"},"through":{"example":"2026-07-21","format":"date","type":"string"}},"required":["from","through"],"type":"object"}}},"description":"Audit Run Request","required":false},"responses":{"202":{"content":{"application/json":{"schema":{"properties":{"from_date":{"format":"date","type":"string"},"id":{"format":"uuid","type":"string"},"status":{"type":"string"},"through_date":{"format":"date","type":"string"}},"type":"object"}}},"description":"Audit Run Queued"},"401":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"invalid_api_key","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/invalid_api_key","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"forbidden","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/forbidden","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"validation_error","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/validation_error","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Validation Error"}},"summary":"Queue a Prediction-Market Audit Run","tags":["Prediction Markets"]}},"/api/v1/grader/odds":{"get":{"callbacks":{},"description":"Drop-in replacement for an upstream /grader/odds. Accepts the same query params and returns a compatible response with SportsStack settlement enrichment alongside.","operationId":"ApiRestWeb.Settlement.GraderController.show","parameters":[{"description":"Upstream fixture ID","in":"query","name":"fixture_id","required":true,"schema":{"type":"string"}},{"description":"Supported upstream market ID or published grader label (for example, player_points or Player Points)","in":"query","name":"market","required":true,"schema":{"type":"string"}},{"description":"Upstream bet name (e.g., LeBron James Over 25.5)","in":"query","name":"name","required":true,"schema":{"type":"string"}},{"description":"Sportsbook name","in":"query","name":"sportsbook","required":false,"schema":{"type":"string"}},{"description":"Upstream player ID (for player props)","in":"query","name":"player_id","required":false,"schema":{"type":"string"}},{"description":"Upstream team ID (for team markets)","in":"query","name":"team_id","required":false,"schema":{"type":"string"}},{"description":"Opt in to provisional in-game grading (default false)","in":"query","name":"show_live_result","required":false,"schema":{"type":"boolean"}},{"description":"Whether to include upstream proxy grading data (default true)","in":"query","name":"include_opticodds","required":false,"schema":{"type":"boolean"}},{"description":"League abbreviation (optional — inferred from fixture)","in":"query","name":"league","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"examples":{"pending":{"description":"The upstream grader reports a live, non-terminal selection while SportsStack recommends hold. The non-terminal outcomes are not compared as a disagreement.","summary":"Pending (game in progress)","value":{"data":{"away_score":61,"away_team_display":"Phoenix Suns","fixture_id":"live456-nba-fixture","graded_at":null,"home_score":55,"home_team_display":"Dallas Mavericks","line":"24.5","market":"player_points","name":"Luka Doncic Over 24.5","opticodds":{"away_score":61,"graded_at":null,"home_score":55,"player_score":null,"result":"Pending","status":"Live"},"opticodds_reason":null,"player_score":null,"resolution":{"action":"hold","event_phase":"live","observed_at":"2026-03-26T04:15:01Z","raw_event_status":"in_progress","reason":"insufficient_provider_quorum","result":null,"retryable":true,"sources":{"opticodds":{"availability":"available","grade_state":"pending","reason":null},"sportsstack":{"evaluation_state":"awaiting_settlement","lookup_state":"resolved","reason":"insufficient_provider_quorum"}},"sportsstack_evaluated_at":"2026-03-26T04:15:00Z","state":"pending","version":1},"result":"Pending","sportsbook":null,"sportsstack":{"action":"hold","agrees_with_opticodds":null,"consensus_value":24.0,"game_phase_factor":0.65,"hold_reason":"insufficient_provider_quorum","margin_safety":0.45,"mathematically_locked":false,"provider_count":2,"provider_values":[{"source":"provider_a","value":22.0},{"source":"provider_b","value":26.0}],"reliability":{"agreement":0.7,"coverage":0.5},"result":null,"settlement_confidence":21.9},"status":"Live"}}},"settle-loss-both-graders":{"description":"Both SportsStack and the upstream grader returned grading data. Results agree — consensus below line for over bet.","summary":"Settled — Lost (both providers)","value":{"data":{"away_score":112,"away_team_display":"Dallas Mavericks","fixture_id":"xyz789-nba-fixture","graded_at":"2026-03-26T04:15:00Z","home_score":98,"home_team_display":"New Orleans Pelicans","line":"21.5","market":"player_points","name":"Zion Williamson Over 21.5","opticodds":{"away_score":112,"graded_at":"2026-03-26T04:15:00Z","home_score":98,"player_score":21,"result":"Lost","status":"Completed"},"opticodds_reason":null,"player_score":21,"resolution":{"action":"settle","event_phase":"final","observed_at":"2026-03-26T04:15:01Z","raw_event_status":"completed","reason":"sportsstack_settled","result":"lost","retryable":false,"sources":{"opticodds":{"availability":"available","grade_state":"settled","reason":null},"sportsstack":{"evaluation_state":"settled","lookup_state":"resolved","reason":null}},"sportsstack_evaluated_at":"2026-03-26T04:15:00Z","state":"settled","version":1},"result":"Lost","sportsbook":"DraftKings","sportsstack":{"action":"settle","agrees_with_opticodds":true,"consensus_value":21.0,"game_phase_factor":1.0,"margin_safety":1.0,"mathematically_locked":false,"provider_count":6,"provider_values":[{"source":"provider_a","value":21.0},{"source":"provider_b","value":21.0},{"source":"provider_c","value":21.0}],"reliability":{"agreement":1.0,"coverage":1.0},"result":"Lost","settlement_confidence":100.0},"status":"Completed"}}},"settle-win":{"description":"Player prop graded via SportsStack with the upstream grader explicitly omitted. Consensus clearly over line, high confidence settle.","summary":"Settled — Won (SportsStack only)","value":{"data":{"away_score":109,"away_team_display":"New Orleans Pelicans","fixture_id":"abc123-nba-fixture","graded_at":"2026-04-14T04:20:24Z","home_score":120,"home_team_display":"Indiana Pacers","line":"9.5","market":"player_points","name":"Ben Sheppard Over 9.5","opticodds":null,"opticodds_reason":"not_requested","player_score":null,"resolution":{"action":"settle","event_phase":"final","observed_at":"2026-04-14T04:20:25Z","raw_event_status":"completed","reason":"sportsstack_settled","result":"won","retryable":false,"sources":{"opticodds":{"availability":"not_requested","grade_state":"unknown","reason":"not_requested"},"sportsstack":{"evaluation_state":"settled","lookup_state":"resolved","reason":null}},"sportsstack_evaluated_at":"2026-04-14T04:20:24Z","state":"settled","version":1},"result":"Won","sportsbook":null,"sportsstack":{"action":"settle","agrees_with_opticodds":null,"consensus_value":13.0,"game_phase_factor":1.0,"margin_safety":1.0,"mathematically_locked":false,"provider_count":6,"provider_values":[{"source":"provider_a","value":13.0},{"source":"provider_b","value":13.0},{"source":"provider_c","value":13.0}],"reliability":{"agreement":1.0,"coverage":1.0},"result":"Won","settlement_confidence":100.0},"status":"graded"}}}},"schema":{"properties":{"data":{"properties":{"away_score":{"nullable":true,"oneOf":[{"type":"number"},{"type":"string"}]},"away_team_display":{"nullable":true,"type":"string"},"fixture_id":{"type":"string"},"graded_at":{"nullable":true,"type":"string"},"home_score":{"nullable":true,"oneOf":[{"type":"number"},{"type":"string"}]},"home_team_display":{"nullable":true,"type":"string"},"line":{"nullable":true,"type":"string"},"market":{"type":"string"},"name":{"type":"string"},"opticodds":{"description":"Upstream grader data (null when the upstream grader is unavailable or not configured)","nullable":true,"properties":{"away_score":{"nullable":true,"oneOf":[{"type":"number"},{"type":"string"}]},"graded_at":{"nullable":true,"type":"string"},"home_score":{"nullable":true,"oneOf":[{"type":"number"},{"type":"string"}]},"player_score":{"nullable":true,"oneOf":[{"type":"number"},{"type":"string"}]},"result":{"nullable":true,"type":"string"},"status":{"nullable":true,"type":"string"}},"type":"object"},"opticodds_reason":{"description":"Bounded reason the upstream grader data is null. Null when an upstream grader item is present.","enum":["not_requested","market_not_settleable","empty_response","upstream_timeout","upstream_error"],"nullable":true,"type":"string"},"player_score":{"nullable":true,"oneOf":[{"type":"number"},{"type":"string"}]},"resolution":{"description":"Versioned normalized context for the SportsStack recommendation and source evidence. `sportsstack.action` remains SportsStack's primary recommendation. `resolution.action` is conservative cross-provider execution guidance and may be stricter when sources conflict. Existing top-level provider-compatible fields remain raw and non-authoritative.","properties":{"action":{"description":"Conservative cross-provider execution guidance. This does not replace `sportsstack.action` as SportsStack's primary recommendation.","enum":["settle","hold","manual_review","ignore"],"type":"string"},"event_phase":{"enum":["scheduled","live","final","canceled","unknown"],"type":"string"},"observed_at":{"description":"When SportsStack built this response. Always present.","format":"date-time","type":"string"},"raw_event_status":{"description":"Raw SportsStack event status for diagnostics only; do not enum-match it.","nullable":true,"type":"string"},"reason":{"enum":["event_not_started","no_evidence_sources","awaiting_eligibility","conflicting_first_scorer_signal","missing_first_scorer_signal","missing_sportradar","missing_ufcstats","missing_opticodds","insufficient_provider_quorum","incomplete_result","incomplete_stats","post_final_settlement_window","provider_conflict","unsupported_line","unsupported_selection","unsupported_method","unsupported_official_method","pga_cut_status_missing","pga_missing_player_stat","pga_final_stat_not_available","pga_leaderboard_not_final","pga_missing_line","pga_missing_direction","pga_round_not_final","unsupported_contract_variant","sportsstack_settled","inconsistent_settlement","awaiting_settlement","fixture_not_found","player_not_found","team_not_found","no_recommendation","recommendation_not_found","missing_market_snapshot","unsupported_market","settlement_evidence_not_found","stale_recommendation","evaluation_deferred","not_attempted","sportsstack_unavailable"],"type":"string"},"result":{"enum":["won","lost","refund"],"nullable":true,"type":"string"},"retryable":{"type":"boolean"},"sources":{"properties":{"opticodds":{"properties":{"availability":{"enum":["available","unavailable","not_requested"],"type":"string"},"grade_state":{"enum":["settled","pending","unknown"],"type":"string"},"reason":{"description":"Bounded reason the upstream grader data is null. Null when an upstream grader item is present.","enum":["not_requested","market_not_settleable","empty_response","upstream_timeout","upstream_error"],"nullable":true,"type":"string"}},"required":["availability","grade_state","reason"],"type":"object"},"sportsstack":{"properties":{"evaluation_state":{"enum":["settled","awaiting_evidence","awaiting_settlement","manual_review","unsupported","inconsistent","unavailable"],"type":"string"},"lookup_state":{"enum":["resolved","unavailable"],"type":"string"},"reason":{"enum":["event_not_started","no_evidence_sources","awaiting_eligibility","conflicting_first_scorer_signal","missing_first_scorer_signal","missing_sportradar","missing_ufcstats","missing_opticodds","insufficient_provider_quorum","incomplete_result","incomplete_stats","post_final_settlement_window","provider_conflict","unsupported_line","unsupported_selection","unsupported_method","unsupported_official_method","pga_cut_status_missing","pga_missing_player_stat","pga_final_stat_not_available","pga_leaderboard_not_final","pga_missing_line","pga_missing_direction","pga_round_not_final","unsupported_contract_variant","sportsstack_settled","inconsistent_settlement","awaiting_settlement","fixture_not_found","player_not_found","team_not_found","no_recommendation","recommendation_not_found","missing_market_snapshot","unsupported_market","settlement_evidence_not_found","stale_recommendation","evaluation_deferred","not_attempted","sportsstack_unavailable"],"nullable":true,"type":"string"}},"required":["lookup_state","evaluation_state","reason"],"type":"object"}},"required":["opticodds","sportsstack"],"type":"object"},"sportsstack_evaluated_at":{"description":"When SportsStack last evaluated the returned recommendation, when present.","format":"date-time","nullable":true,"type":"string"},"state":{"enum":["settled","pending","manual_review","unsupported","unavailable"],"type":"string"},"version":{"enum":[1],"type":"integer"}},"required":["version","state","action","result","reason","retryable","observed_at","sportsstack_evaluated_at","event_phase","raw_event_status","sources"],"type":"object"},"result":{"description":"Upstream result when graded; with show_live_result=true, a pending upstream item can fall back to a provisional SportsStack result.","nullable":true,"type":"string"},"sportsbook":{"nullable":true,"type":"string"},"sportsstack":{"description":"SportsStack settlement enrichment (null when no recommendation available)","nullable":true,"properties":{"action":{"description":"SportsStack's primary settlement recommendation. Existing integrations should continue to use this field as their recommendation source.","enum":["settle","caution","hold"],"type":"string"},"agreement_basis":{"description":"Phase of a comparable counterparty/SportsStack result pair.","enum":["live","final"],"nullable":true,"type":"string"},"agrees_with_opticodds":{"description":"Whether the grading counterparty's terminal grade matches the SportsStack verdict, including a stored verdict on hold or an opted-in provisional live verdict. This does not authorize settlement.","nullable":true,"type":"boolean"},"consensus_value":{"type":"number"},"game_phase_factor":{"type":"number"},"hold_reason":{"description":"Coarse, stable reason code for a `hold` or `caution` action (e.g. \"no_evidence_sources\", \"insufficient_provider_quorum\", \"provider_conflict\"). Always `null` for `settle`. Prefer this over parsing `reasoning` for programmatic branching.","enum":["event_not_started","no_evidence_sources","awaiting_eligibility","conflicting_first_scorer_signal","missing_first_scorer_signal","missing_sportradar","missing_ufcstats","missing_opticodds","insufficient_provider_quorum","incomplete_result","incomplete_stats","post_final_settlement_window","provider_conflict","unsupported_line","unsupported_selection","unsupported_method","unsupported_official_method","pga_cut_status_missing","pga_missing_player_stat","pga_final_stat_not_available","pga_leaderboard_not_final","pga_missing_line","pga_missing_direction","pga_round_not_final","unsupported_contract_variant"],"nullable":true,"type":"string"},"live_settlement_basis":{"description":"Proof permitting an opt-in in-game settle recommendation; null otherwise.","enum":["measured_stat_lock","completed_market_period"],"nullable":true,"type":"string"},"margin_safety":{"type":"number"},"mathematically_locked":{"type":"boolean"},"provider_count":{"type":"integer"},"provider_values":{"items":{"properties":{"observed_at":{"format":"date-time","nullable":true,"type":"string"},"provider_entity_id":{"nullable":true,"type":"string"},"provider_family":{"nullable":true,"type":"string"},"provider_stat_name":{"nullable":true,"type":"string"},"source":{"type":"string"},"stat_name":{"nullable":true,"type":"string"},"value":{"nullable":true,"oneOf":[{"type":"number"},{"properties":{"final_round":{"nullable":true,"type":"integer"},"final_round_seconds":{"nullable":true,"type":"integer"},"method":{"nullable":true,"type":"string"},"result_complete":{"nullable":true,"type":"boolean"},"round_length_seconds":{"nullable":true,"type":"integer"},"scheduled_rounds":{"nullable":true,"type":"integer"},"terminal_status":{"nullable":true,"type":"string"},"winner_common_model_id":{"nullable":true,"type":"string"}},"type":"object"}]}},"type":"object"},"type":"array"},"reasoning":{"description":"Human-readable explanation of the settlement decision, including the raw per-provider evidence for void/hold outcomes.","nullable":true,"type":"string"},"reliability":{"properties":{"agreement":{"type":"number"},"coverage":{"type":"number"}},"type":"object"},"result":{"enum":["Won","Lost","Push","Void"],"nullable":true,"type":"string"},"settlement_confidence":{"type":"number"}},"type":"object"},"sportsstack_reason":{"description":"Reason SportsStack enrichment is null","nullable":true,"properties":{"code":{"type":"string"},"message":{"type":"string"}},"type":"object"},"status":{"description":"Upstream status when graded; a SportsStack live fallback uses live. Use sportsstack.action to decide whether to settle.","nullable":true,"type":"string"}},"required":["resolution"],"type":"object"}},"required":["data"],"type":"object"}}},"description":"Grader response (provider-compatible)"},"400":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"bad_request","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/bad_request","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"invalid_api_key","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/invalid_api_key","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"not_found","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/not_found","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Not Found"},"422":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"bad_request","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/bad_request","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Bad Request"}},"summary":"Grader: Grade a single bet","tags":["Settlement"]}},"/api/v1/events":{"get":{"callbacks":{},"description":"This endpoint retrieves a list of events based on the provided query parameters.\nYou can filter events either by (season year, week) OR (day, month, calendar year)\nseason type, and league ID are additional filters.\n\nNote: The first week of the NFL postseason is week 1, season_type = POST\n\nFor NFL and NCAAF events, the response includes both `week` and `season_type_agnostic_week` fields.\nThe `season_type_agnostic_week` is a continuous week number across the entire season (regular season weeks 1-18 for NFL, 1-16 for NCAAF, with postseason weeks continuing from there).\n\nPagination is supported to navigate through large sets of data.\n\nIf none of (day/month/calendar_year, start_date/end_date, week,\nseason_type_agnostic_week) is supplied, results default to a rolling\nwindow (recent past through the next ~30 days) rather than the league's\nentire slate. Pass an explicit start_date/end_date to see events outside\nthis window.\n\nEach sports event also carries `market_count` and `market_counts_by_venue`\nso a client can tell which games have something to trade without reading\n`/odds` per event. `market_count` is the number of distinct OPEN markets\n(provider status `active`; suspended, closed, settled and unknown statuses\nare not counted) in sources the tenant can read, the same visibility as\n`GET /markets`; `market_counts_by_venue` gives the same count per venue\n(aggregator, e.g. `polymarket`, `kalshi`), and its values can sum to more\nthan `market_count` because `market_count` counts a market once. Finished\nevents report `0`. With `active=true&aggregator=<venue>` only that venue is\ncounted. A market being open does not mean it is currently priced; read\n`GET /events/{id}/odds` for prices. `null` means the count could not be\ncomputed right now (never `0`); the list still serves. Crypto windows do\nnot carry these fields.\n\n**Crypto (`league_id=CRYPTO`; tenants entitled to the `CRYPTO` league only).** One event\nper crypto up/down window (`event_id` = the window id), with empty `participants` and a\ntitle like `BTC Up or Down 10:30-10:45 UTC` (always UTC). Status is `scheduled`,\n`in_progress` (inside the window), `completed` (from `window_end`, even if no venue has\nposted a result yet) or `cancelled` (every listing voided). The additive\n`crypto_window` object carries the asset, horizon, window bounds and the per-market\n`groups` (list responses carry `market_id`, `venues` and `alignment` only; fetch\n`/events/{id}` for constituents and results). With none of `status`, `start_date` or\n`end_date` the set is live plus upcoming windows starting within 24 hours; an explicit\n`status` or date replaces that default (`completed` is the last 24 hours), and\n`start_date`..`end_date` may span at most 7 days. `season_year` is accepted and means the\nUTC year of `window_start`. `status=cancelled` is not supported as\na filter. `asset` and `horizon` filter; `active=true&aggregator=kalshi` returns windows\nthe venue currently lists with a quote no older than 15 minutes (`predict_fun`,\n`prophetx`, `polymarket_us` and `sxbet` are valid and empty). Default `per_page` is 100, maximum 200. Sports-only\nfilters (`week`, `season_type*`, `participant_id`, `team_id`, `player_id`,\n`day`, `month`, `year`, `calendar_year`) are a 400 for this league;\n`include_scoreboard` and the source-mapping parameters are accepted and ignored.\n","operationId":"ApiRestWeb.EventController.index","parameters":[{"description":"The year of the season. i.e. Superbowl on Feb 14th 2025 is still in the 2024 season","in":"query","name":"season_year","required":false,"schema":{"example":2024,"type":"integer"}},{"description":"(Use week OR season_type_agnostic_week) Week (only supported for weekly sports [NFL / NCAAF] i.e. first week of the season is 1, first week of the postseason is 1 with season_stage = POST)","in":"query","name":"week","required":false,"schema":{"example":1,"type":"integer"}},{"description":"(Use week OR season_type_agnostic_week) Week - Agnostic of Season Type (only supported for weekly sports [NFL / NCAAF]) i.e. first week of the season is 1, first week of the postseason is 19. Setting this parameter will ignore season_type","in":"query","name":"season_type_agnostic_week","required":false,"schema":{"example":1,"type":"integer"}},{"description":"Day of the month (DD) - must also pass month and calendar_year (or year)","in":"query","name":"day","required":false,"schema":{"example":"01","type":"string"}},{"description":"Month of the year (MM) - must also pass day and calendar_year (or year)","in":"query","name":"month","required":false,"schema":{"example":"01","type":"string"}},{"description":"Year of the event (YYYY) - must also pass day and month","in":"query","name":"calendar_year","required":false,"schema":{"example":"2024","type":"string"}},{"description":"Alias of calendar_year. Must also be passed with day and month.","in":"query","name":"year","required":false,"schema":{"example":"2024","type":"string"}},{"description":"Season type (PRE / REG / POST)","in":"query","name":"season_type","required":false,"schema":{"example":"REG","type":"string"}},{"description":"Filter by event status (scheduled, in_progress, completed, cancelled, postponed, time_tbd)","in":"query","name":"status","required":false,"schema":{"enum":["scheduled","in_progress","completed","cancelled","postponed","time_tbd"],"example":"scheduled","type":"string"}},{"description":"When true, return only nonterminal events that currently have tenant-visible odds from the required aggregator.","in":"query","name":"active","required":false,"schema":{"default":false,"type":"boolean"}},{"description":"Filter active event discovery by odds aggregator (for example kalshi or polymarket). Requires active=true. One value only: a comma-separated list returns 400; send one request per aggregator.","in":"query","name":"aggregator","required":false,"schema":{"enum":["kalshi","polymarket","predict_fun","limitless","prophetx","polymarket_us","sxbet","predictfun"],"example":"kalshi","type":"string"}},{"description":"When true, return only nonterminal events that currently have at least one OPEN market on a requested venue (see `venue`): the events whose `market_counts_by_venue` is nonzero for one of them. Several venues are checked in one request, unlike `active=true&aggregator=`. Requires `league_id`; cannot be combined with `active` or `aggregator`. Only events that started within the last 36 hours or start within 14 days are considered (the `market_count` window), so it does not apply the default date window; pass `start_date`/`end_date` to bound it further. 503 when the discovery read is unavailable.","in":"query","name":"has_venue_markets","required":false,"schema":{"default":false,"type":"boolean"}},{"description":"Comma-separated prediction venues `has_venue_markets` considers (polymarket, kalshi, prophetx, predict_fun, limitless, polymarket_us, sxbet). Default: polymarket,kalshi,prophetx; `polymarket_us` and `sxbet` are opt-in and never part of the default. Requires `has_venue_markets=true`.","in":"query","name":"venue","required":false,"schema":{"example":"polymarket,kalshi","type":"string"}},{"description":"CRYPTO league only (`league_id=CRYPTO`): filter to one asset. Any other league rejects it as an unknown parameter (400).","in":"query","name":"asset","required":false,"schema":{"enum":["BTC","ETH","SOL","DOGE"],"type":"string"}},{"description":"CRYPTO league only (`league_id=CRYPTO`): filter to one window horizon. Any other league rejects it as an unknown parameter (400).","in":"query","name":"horizon","required":false,"schema":{"enum":["5m","15m","1h","1d"],"type":"string"}},{"description":"Filter by league ID — accepts a UUID or league abbreviation (e.g., 'NFL', 'NBA'). See GET /api/v1/leagues for all leagues.","in":"query","name":"league_id","required":true,"schema":{"example":"NFL","type":"string"}},{"description":"Filter events by participant ID (team or player common_model_id). Returns events where the specified participant is involved.","in":"query","name":"participant_id","required":false,"schema":{"example":"4af4c296-6fbc-4705-8660-3b587c252e16","format":"uuid","type":"string"}},{"description":"Filter events containing this team common_model_id.","in":"query","name":"team_id","required":false,"schema":{"format":"uuid","type":"string"}},{"description":"Filter events containing this player common_model_id.","in":"query","name":"player_id","required":false,"schema":{"format":"uuid","type":"string"}},{"description":"Return events scheduled at or after this instant (inclusive). Accepts an ISO 8601 date-time (e.g. '2026-08-05T00:00:00Z') or a plain UTC date ('2026-08-05', interpreted as 00:00:00Z). Combine with end_date for a range. Bounds are UTC — distinct from the day/month/calendar_year filter, which resolves a calendar day in America/New_York; avoid combining the two.","in":"query","name":"start_date","required":false,"schema":{"example":"2026-08-05T00:00:00Z","type":"string"}},{"description":"Return events scheduled at or before this instant (inclusive). Accepts an ISO 8601 date-time or a plain UTC date ('2026-08-05', interpreted as the end of that day, 23:59:59.999999Z). Combine with start_date for a range. Bounds are UTC — distinct from the day/month/calendar_year filter, which resolves a calendar day in America/New_York; avoid combining the two.","in":"query","name":"end_date","required":false,"schema":{"example":"2026-08-07T23:59:59Z","type":"string"}},{"description":"Include source mappings from the specific integration (i.e. a provider key) will return a source_mappings object with the mappings for the respective objects","in":"query","name":"return_source_id_format","required":false,"schema":{"type":"string"}},{"description":"Return an exact `x-total-count`/`x-total-pages` for the list. Defaults\nto `true` for a bounded request (any filter that narrows the league\nboard — a day/week, a date range, a participant/team/player, an event\nstatus, or `active=true`) and `false` for a bare full-league board\n(only `league_id`, optionally with `season_year`/`season_type`), where\ncounting every matching event is unbounded and can hold a database\nconnection open for tens of seconds. When the count is skipped both\n`x-total-count` and `x-total-pages` are **omitted** — a skipped count\nis reported by absence, never by a number — and pagination is\ncursor-style: follow the `link` header's `next` relation until it is\nabsent. `last` is withheld too, because an uncounted read does not\nknow where the end is. Pass `count=true` for exact totals. Must be\n`true` or `false`; any other value is rejected with HTTP 400.\n","in":"query","name":"count","required":false,"schema":{"type":"boolean"}},{"description":"Include detailed scoreboard information for each event. Scoreboard is always included by default.","in":"query","name":"include_scoreboard","required":false,"schema":{"default":true,"type":"boolean"}},{"description":"When true, add source_mappings_by_source keyed by full normalized source (for example, provider.football.nfl).","in":"query","name":"include_source_mappings_by_source","required":false,"schema":{"default":false,"type":"boolean"}},{"description":"Optional provider-family filter for source_mappings_by_source (for example, a provider key).","in":"query","name":"source_mapping_provider","required":false,"schema":{"type":"string"}},{"description":"Optional full-source filter for source_mappings_by_source in provider.sport.league format.","in":"query","name":"source_mapping_source","required":false,"schema":{"type":"string"}},{"description":"Page number for page/per_page pagination. Do not combine with limit/offset.","in":"query","name":"page","required":false,"schema":{"default":1,"minimum":1,"type":"integer"}},{"description":"Number of items per page (max 1000). Do not combine with limit/offset.","in":"query","name":"per_page","required":false,"schema":{"default":100,"maximum":1000,"minimum":1,"type":"integer"}},{"description":"Maximum rows for limit/offset pagination. Do not combine with page/per_page.","in":"query","name":"limit","required":false,"schema":{"maximum":1000,"minimum":1,"type":"integer"}},{"description":"Zero-based row offset for limit/offset pagination. Do not combine with page/per_page.","in":"query","name":"offset","required":false,"schema":{"minimum":0,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"items":{"description":"A sporting event represents a single game, match, or competition between participants.\n\nEvents are the core entity around which most sports data revolves. They connect teams/players,\ncontain statistics, betting markets, and live game state information. Events can be scheduled\ngames, ongoing matches, or completed competitions.\n\n## Key Relationships\n- **Participants**: Teams (NFL, NBA) or individual players (Golf, Tennis) competing\n- **Statistics**: Player and team performance data (EventScopedStats)\n- **Markets**: Betting opportunities and odds associated with the event\n- **Live Data**: Real-time scores and game state (EventScoreboard)\n- **Plays**: Individual game actions and play-by-play data\n- **Tournament**: Tournament/playoff structure (tournament_id, tournament_round) for bracket reconstruction\n\n## Event Lifecycle\nEvents progress through various states from scheduling to completion. The status field\nindicates the current phase, while EventScoreboard provides live updates during play.\n\n## Status Values\n- `\"scheduled\"` - Future event, not yet started\n- `\"in_progress\"` - Currently being played with live updates\n- `\"completed\"` - Event finished with final results\n- `\"cancelled\"` - Event cancelled and will not be played\n- `\"postponed\"` - Event delayed/rescheduled to future date\n- `\"time_tbd\"` - Scheduled but specific time not yet determined\n\n## Sport Variations\nParticipant structure varies by sport:\n- **Team Sports** (NFL, NBA, NHL): Two teams with home/away designation\n- **Individual Sports** (Golf, Tennis): Multiple individual players\n- **Head-to-Head** (Tennis, Boxing): Two individual competitors\n","example":{"common_model_id":"4af4c296-6fbc-4705-8660-3b587c252e16","image_url":"https://cdn.example.com/photos/events/lakers-warriors.jpg","league_id":"58e8c89b-72f8-4427-adbc-10f193c9b462","participants":"[]","scheduled_start_time":"2017-10-12T12:00:00Z","season_year":2024,"title":"LAL @ GS","week":1},"properties":{"actual_scope":{"description":"Proven native contract scope, independent of the compatibility endpoint.","enum":["event","race","session","tournament","round","season"],"nullable":true,"type":"string"},"common_model_id":{"description":"Unique event identifier in our unified system","type":"string"},"crypto_window":{"description":"Additive detail on a crypto event (`league_id=CRYPTO`). `groups` is a disjoint\npartition by `family_id`: `alignment` is `exact` (two or more distinct venues\nsharing one family: same window, reference source and tie rule, safe to treat as\none contract), or `single_venue`. A Limitless listing whose mirrored Polymarket\nlisting is missing or disagrees is in `unmatched` (`unverified_mirror`) with its own\n`market_id`, never presented as the shared contract. Markets of the same window on a\ndifferent reference (for example Kalshi's CF Benchmarks RTI vs Polymarket/Limitless's\nChainlink 60s TWAP) are other `market_id`s on the same event, listed per odds row in\n`reference_alignment.different_reference_market_ids`; they can disagree on start price\nand result even on a near-flat window.\n","properties":{"asset":{"enum":["BTC","ETH","SOL","DOGE"],"type":"string"},"groups":{"items":{"properties":{"alignment":{"enum":["exact","single_venue"],"type":"string"},"constituents":{"description":"Present on `/v1/events/{id}` only; list responses omit the constituent detail.","items":{"description":"One venue's native listing for a crypto window: its native IDs\n(`native_market_id`, `native_ref`, and `native_yes_token`/`native_no_token`\nwhen the venue exposes on-chain tokens) and, while the listing is quotable,\nan indicative `quote` from our one-minute poll. `result`/`resolved_at`/\n`end_price` are a pass-through of the venue's own settlement, never a\nSportsStack determination. Clients that need executable prices stream order\nbooks from the venue directly using the native IDs.\n","properties":{"end_price":{"format":"double","nullable":true,"type":"number"},"family_id":{"description":"Shared by every listing with the same window, reference source and tie rule.","format":"uuid","type":"string"},"last_changed_at":{"description":"Fetch time of the feed file that last changed this listing.","format":"date_time","type":"string"},"lifecycle":{"enum":["upcoming","live","closed","resolved","voided"],"type":"string"},"mirror_of":{"description":"For a Limitless listing, the Polymarket slug it mirrors.","nullable":true,"type":"string"},"native_market_id":{"description":"The venue's native market ID.","type":"string"},"native_no_token":{"description":"On-chain CLOB token ID for the Down/No side, when the venue exposes one.","nullable":true,"type":"string"},"native_ref":{"description":"The venue's ticker (Kalshi) or slug (Polymarket, Limitless).","type":"string"},"native_yes_token":{"description":"On-chain CLOB token ID for the Up/Yes side, when the venue exposes one.","nullable":true,"type":"string"},"quote":{"description":"The listing's indicative quote: our one-minute poll capture of the venue's\nprice (`observed_at` is OUR capture time, never a provider clock). `null`\nwhen the listing is not currently quotable: it is not `upcoming`/`live`, its\nwindow has ended, it has no quote, or the quote is older than 15 minutes.\nIndicative, not executable: `stale` is true once `age_ms` exceeds\n`stale_after_ms` (150 s for 5m/15m, 300 s for 1h, 600 s for 1d).\n","nullable":true,"properties":{"age_ms":{"minimum":0,"type":"integer"},"down":{"format":"double","maximum":1,"minimum":0,"type":"number"},"observed_at":{"format":"date_time","type":"string"},"source":{"enum":["kalshi_bid_ask_mid","kalshi_last","polymarket_clob_mid","polymarket_gamma","limitless_clob_mid","limitless_prices"],"type":"string"},"stale":{"type":"boolean"},"stale_after_ms":{"minimum":0,"type":"integer"},"up":{"format":"double","maximum":1,"minimum":0,"type":"number"}},"required":["up","down","source","observed_at","age_ms","stale_after_ms","stale"],"title":"CryptoWindowQuote","type":"object"},"reference_source":{"description":"The oracle/index this listing resolves against. Two listings of the\nsame window with different reference sources are the\n`same_window_different_reference` match class, not `exact` -- they\ncan and do disagree on start price and result even on a near-flat\nwindow. `binance_usdt_1m_noon` is the Binance USDT 1-minute candle at\n12:00 America/New_York, used by Polymarket's daily up/down markets.\n","enum":["cf_benchmarks_rti","chainlink_twap_60s","binance_usdt_1h_candle","binance_usdt_1m_noon"],"type":"string"},"resolved_at":{"format":"date_time","nullable":true,"type":"string"},"result":{"description":"The venue's own result, passed through unchanged. `null` does not\nmean \"no\": a window whose status is `ended` has not necessarily been\nresolved by the venue yet -- see the result-latency notes on the\nparent window.\n","enum":["up","down","split"],"nullable":true,"type":"string"},"result_revision":{"description":"Increments on every terminal-state correction (including voided -> resolved and back).","minimum":0,"type":"integer"},"settlement_value":{"format":"double","nullable":true,"type":"number"},"start_price":{"format":"double","nullable":true,"type":"number"},"tie_rule":{"enum":["up","split"],"type":"string"},"venue":{"enum":["kalshi","polymarket","limitless"],"type":"string"}},"required":["venue","native_market_id","native_ref","reference_source","tie_rule","family_id","lifecycle","result_revision","last_changed_at"],"title":"CryptoWindowConstituent","type":"object"},"type":"array"},"family_id":{"format":"uuid","type":"string"},"market_id":{"format":"uuid","type":"string"},"reference_source":{"type":"string"},"tie_rule":{"enum":["up","split"],"type":"string"},"venues":{"items":{"type":"string"},"type":"array"}},"required":["market_id","venues","alignment"],"type":"object"},"type":"array"},"horizon":{"enum":["5m","15m","1h","1d"],"type":"string"},"unmatched":{"items":{"properties":{"alignment":{"enum":["unverified_mirror"],"type":"string"},"constituent":{"description":"One venue's native listing for a crypto window: its native IDs\n(`native_market_id`, `native_ref`, and `native_yes_token`/`native_no_token`\nwhen the venue exposes on-chain tokens) and, while the listing is quotable,\nan indicative `quote` from our one-minute poll. `result`/`resolved_at`/\n`end_price` are a pass-through of the venue's own settlement, never a\nSportsStack determination. Clients that need executable prices stream order\nbooks from the venue directly using the native IDs.\n","properties":{"end_price":{"format":"double","nullable":true,"type":"number"},"family_id":{"description":"Shared by every listing with the same window, reference source and tie rule.","format":"uuid","type":"string"},"last_changed_at":{"description":"Fetch time of the feed file that last changed this listing.","format":"date_time","type":"string"},"lifecycle":{"enum":["upcoming","live","closed","resolved","voided"],"type":"string"},"mirror_of":{"description":"For a Limitless listing, the Polymarket slug it mirrors.","nullable":true,"type":"string"},"native_market_id":{"description":"The venue's native market ID.","type":"string"},"native_no_token":{"description":"On-chain CLOB token ID for the Down/No side, when the venue exposes one.","nullable":true,"type":"string"},"native_ref":{"description":"The venue's ticker (Kalshi) or slug (Polymarket, Limitless).","type":"string"},"native_yes_token":{"description":"On-chain CLOB token ID for the Up/Yes side, when the venue exposes one.","nullable":true,"type":"string"},"quote":{"description":"The listing's indicative quote: our one-minute poll capture of the venue's\nprice (`observed_at` is OUR capture time, never a provider clock). `null`\nwhen the listing is not currently quotable: it is not `upcoming`/`live`, its\nwindow has ended, it has no quote, or the quote is older than 15 minutes.\nIndicative, not executable: `stale` is true once `age_ms` exceeds\n`stale_after_ms` (150 s for 5m/15m, 300 s for 1h, 600 s for 1d).\n","nullable":true,"properties":{"age_ms":{"minimum":0,"type":"integer"},"down":{"format":"double","maximum":1,"minimum":0,"type":"number"},"observed_at":{"format":"date_time","type":"string"},"source":{"enum":["kalshi_bid_ask_mid","kalshi_last","polymarket_clob_mid","polymarket_gamma","limitless_clob_mid","limitless_prices"],"type":"string"},"stale":{"type":"boolean"},"stale_after_ms":{"minimum":0,"type":"integer"},"up":{"format":"double","maximum":1,"minimum":0,"type":"number"}},"required":["up","down","source","observed_at","age_ms","stale_after_ms","stale"],"title":"CryptoWindowQuote","type":"object"},"reference_source":{"description":"The oracle/index this listing resolves against. Two listings of the\nsame window with different reference sources are the\n`same_window_different_reference` match class, not `exact` -- they\ncan and do disagree on start price and result even on a near-flat\nwindow. `binance_usdt_1m_noon` is the Binance USDT 1-minute candle at\n12:00 America/New_York, used by Polymarket's daily up/down markets.\n","enum":["cf_benchmarks_rti","chainlink_twap_60s","binance_usdt_1h_candle","binance_usdt_1m_noon"],"type":"string"},"resolved_at":{"format":"date_time","nullable":true,"type":"string"},"result":{"description":"The venue's own result, passed through unchanged. `null` does not\nmean \"no\": a window whose status is `ended` has not necessarily been\nresolved by the venue yet -- see the result-latency notes on the\nparent window.\n","enum":["up","down","split"],"nullable":true,"type":"string"},"result_revision":{"description":"Increments on every terminal-state correction (including voided -> resolved and back).","minimum":0,"type":"integer"},"settlement_value":{"format":"double","nullable":true,"type":"number"},"start_price":{"format":"double","nullable":true,"type":"number"},"tie_rule":{"enum":["up","split"],"type":"string"},"venue":{"enum":["kalshi","polymarket","limitless"],"type":"string"}},"required":["venue","native_market_id","native_ref","reference_source","tie_rule","family_id","lifecycle","result_revision","last_changed_at"],"title":"CryptoWindowConstituent","type":"object"},"market_id":{"format":"uuid","type":"string"},"reason":{"enum":["mirror_counterpart_missing","mirror_terms_disagree"],"type":"string"},"venues":{"items":{"type":"string"},"type":"array"}},"required":["market_id","alignment","reason"],"type":"object"},"type":"array"},"window_end":{"format":"date_time","type":"string"},"window_start":{"format":"date_time","type":"string"}},"required":["asset","horizon","window_start","window_end","groups","unmatched"],"title":"CryptoEventWindow","type":"object"},"event_scoreboard":{"description":"Live event status with real-time scores, period, and game state information.\n\nContains dynamic/live game data that updates throughout the event. For comprehensive\nsport-specific details and field explanations, see the EventScoreboard model documentation.\n\n## Core Fields\n- **Basic Info**: sport, league, event_id\n- **Game State**: period, time_on_clock, period_half (sport-specific), status\n- **Scoring**: home_score, away_score (for team sports), periods (linescore)\n- **Details**: Sport-specific data in JSONB format\n- **Freshness**: response_received_at — when the provider observed this state\n- **Serving provenance** (additive): observed_at, served_at, source_rank — which provider\n  row was served, its rank in the live primary order, and why it won\n\n## Rendering a live clock\n`time_on_clock` is a point-in-time observation, not a ticking value; we refresh\nit as fast as the provider reports it. To render a smooth clock, tick locally\nfrom `time_on_clock` using `response_received_at` as the anchor and resync on\neach response. For timed sports `details.clock_running` says whether the clock\nshould be advancing — `null` means the provider did not tell us, which is\ndistinct from a known-stopped clock.\n\n## Period Numbering by Sport\n- **Football**: 1-4 (quarters), 5+ (overtime)\n- **Basketball**: 1-4 (quarters), 5+ (overtime)\n- **Baseball**: 1-9+ (innings)\n- **Hockey**: 1-3 (periods), 4+ (overtime)\n- **Golf**: 1-4 (rounds)\n","example":{"away_score":10,"common_model_id":"123e4567-e89b-12d3-a456-426614174000","details":{"away_timeouts":2,"distance":8,"down":2,"home_timeouts":3,"possession_team_id":"123e4567-e89b-12d3-a456-426614174002","red_zone":false,"wall_clock":"2024-01-15T15:32:08Z","yard_line":35},"event_id":"123e4567-e89b-12d3-a456-426614174001","home_score":14,"inserted_at":"2024-01-15T15:30:00Z","league":"NFL","observed_at":"2024-01-15T15:32:09Z","period":2,"response_received_at":"2024-01-15T15:32:10Z","served_at":"2024-01-15T15:32:11Z","source_rank":{"provider":"sportsstack","rank":null,"reason":null},"sport":"football","status":"in_progress","time_on_clock":"14:30","updated_at":"2024-01-15T15:32:15Z"},"properties":{"away_score":{"description":"Away team total score (null for individual sports like golf)","example":10,"type":"integer"},"common_model_id":{"description":"Event Status ID","format":"uuid","type":"string"},"details":{"additionalProperties":true,"description":"Sport-specific game state for a served scoreboard. Two formats exist.\n\n## Current format (what is served today)\n\nThe keys, nesting and value types of `details` depend on the data source that\nprovided the scoreboard row. For one event, `details` can be an object from one\nsource and `null` from another, and a key can be absent, `null` or populated\ndepending on the source. Treat every field as optional. Responses in this format\ndo not contain `details_version`. The property list below describes the keys that\ncan appear; not every source provides every key, and the same key can have a\ndifferent shape for different sources.\n\n## Current format reference\n\n### Dynamic game state\nThe details field contains live, sport-specific information that changes throughout\nthe game. Unlike static event information, this data updates in real-time as the\ngame progresses.\n\n### Sport-specific structures\nEach sport has its own set of relevant game state data:\n\n#### Football (Flattened Fields)\n- **Game State**: down, distance, yard_line, possession_team_id, red_zone, goal_to_go\n- **Clock Management**: play_clock, game_clock, clock_running, two_minute_warning, inside_two_minutes\n- **Timeouts**: home_timeouts, away_timeouts\n- **Weather (Flattened)**: weather_temperature, weather_condition, weather_wind_speed, weather_wind_direction, weather_humidity, weather_precipitation, wind_affecting_kicking, precipitation\n- **Analytics**: field_goal_range, touchdown_probability, turnover_on_downs_risk\n- **Game Info**: attendance, neutral_site, duration\n\n#### Basketball (Flattened Fields)\n- **Clock State**: shot_clock, shot_clock_running, game_clock, clock_running\n- **Fouls & Bonus**: home_team_fouls, away_team_fouls, home_bonus, away_bonus, home_double_bonus, away_double_bonus\n- **Timeouts**: home_timeouts, away_timeouts\n- **Free Throws (Flattened)**: free_throw_shooter_id, free_throw_shooter_name, free_throw_shots_awarded, free_throw_shots_made, free_throw_shots_attempted, free_throw_technical_foul, free_throw_flagrant_foul, free_throw_and_one, free_throw_clear_path_foul, free_throw_bonus_situation, free_throw_current_attempt\n- **Game Flow**: intermission, overtime_number, last_play, last_score_team_id, last_score_time, possession_arrow\n- **Analytics**: pace, lead_changes, times_tied, home_biggest_lead, away_biggest_lead, home_shooting_foul_trouble, away_shooting_foul_trouble\n- **Game Info**: attendance\n\n#### Baseball (Flattened Fields)\n- **Count**: balls, strikes, outs\n- **Hitter (Flattened)**: hitter_id, hitter_full_name, hitter_ab_over, hitter_outcome_id\n- **Pitcher (Flattened)**: pitcher_id, pitcher_full_name, pitcher_pitch_speed, pitcher_pitch_type, pitcher_pitch_x, pitcher_pitch_y, pitcher_pitch_zone\n- **Baserunners**: runners_on_base (array of maps), runners_count\n\n#### Hockey (Flattened Fields)\n- **Power Play**: man_advantage, power_play_time_remaining, home_on_power_play, away_on_power_play, penalty_kill_percentage\n- **Goalies**: home_goalie_pulled, away_goalie_pulled, empty_net, home_goalie_id, away_goalie_id\n- **Clock**: game_clock, clock_running, intermission, overtime_type\n- **Shootout**: in_shootout, shootout_round, home_shootout_goals, away_shootout_goals, shootout_attempts, shootout_attempts_count\n- **Penalties**: active_penalties (array of maps), active_penalties_count\n- **Game Flow**: last_faceoff_winner, faceoff_location, last_goal_time, last_goal_team_id, last_penalty_time\n- **Team Stats**: shots_on_goal_home, shots_on_goal_away, face_off_wins_home, face_off_wins_away, hits_home, hits_away, blocked_shots_home, blocked_shots_away\n\n#### Soccer (Flattened Fields)\n- **State**: match_status (`first_half`, `halftime`, `second_half`, `extra_time_first_half`, `extra_time_second_half`, `penalties`, `ended`; `not_started` and `postponed` also occur in both formats), match_minute (elapsed clock, `\"MM:SS\"`, stoppage time excluded)\n- **Stoppage Time**: added_time_announced, added_time_played (`\"MM:SS\"`)\n- **Cards**: home_yellow_cards, away_yellow_cards, home_red_cards, away_red_cards (red cards include second-yellow dismissals)\n- **Substitutions**: home_substitutions, away_substitutions\n- **Team Stats**: home_possession, away_possession (percent, 0-100), home_shots, away_shots, home_shots_on_target, away_shots_on_target, home_corners, away_corners\n- **Shootout**: shootout (`{home_score, away_score}`), present only once a penalty shootout has been reached\n- **Regulation Score**: regulation_score (`{home_score, away_score}`), the 90-minute score, present only once a match goes past regulation (top-level `home_score`/`away_score` include extra time but not the shootout)\n\n#### Golf (Embedded Objects)\n- **Tournament State**: round_number, total_rounds, holes_completed, current_hole, cut_line, cut_made, playoff_status, playoff_type, tournament_complete\n- **Course Conditions**: par_for_course, course_length, wind_speed, wind_direction, temperature, weather_condition, course_conditions\n- **Field Info**: field_size, players_made_cut, scoring_average\n- **Leaders**: driving_distance_leader, greens_in_regulation_leader, putting_average_leader\n- **Detailed Data**: leaderboard (array), featured_players (array), featured_hole (object)\n\n### Data structure strategy\nMost fields are flattened, with nested objects used where noted.\n\n### Array fields for complex data\nSome complex data structures use arrays of maps:\n- **runners_on_base**: Baseball baserunner positions and details (array of maps)\n- **active_penalties**: Hockey penalty details and timing information (array of maps)\n- **shootout_attempts**: Hockey shootout attempt details (array of maps)\n- **leaderboard**: Golf leaderboard entries (array of embedded objects)\n\n## `details_version` 1 format (selected per account)\n\nAccounts can be switched to a fixed per-sport format that does not depend on the\ndata source. Until an account is switched it receives the current format. A response\nin the new format is recognised by `details_version` = `1`. The exact keys for each\nsport are the component schemas `ScoreboardDetailsV1Football`,\n`ScoreboardDetailsV1Basketball`, `ScoreboardDetailsV1Baseball`,\n`ScoreboardDetailsV1Hockey` (also used for `ice_hockey`), `ScoreboardDetailsV1Soccer`,\n`ScoreboardDetailsV1Tennis` and `ScoreboardDetailsV1Other`.\n\n1. For every sport except golf and motorsports (see 8), `details` is always a JSON object\n   when a scoreboard is returned; it is never `null`.\n2. For football, basketball, baseball, hockey, ice_hockey, soccer and tennis, every key of that\n   sport's schema is present in every response.\n3. A key whose value is not known is `null`. `null` means \"not reported\". It never\n   stands for `0`, `false`, an empty string or an empty list; those values appear only\n   when the source reported them (an empty string is itself returned as `null`). A\n   source that itself reports a default value, for example a zero count before play\n   starts, has that value passed through: the format does not guess which zeros are\n   real. A baseball runner map in which every base is empty is returned as an empty\n   list with a count of `0`.\n4. Each key has one type. Values are taken from the source, with these normalizations:\n   a source's status text is mapped to the `match_status` values; clock text is read\n   into `match_minute` and the added-time keys; baseball runners that a source gives as\n   a map by base are returned as a list and `runners_count` is computed from it; and the\n   shootout and regulation scores are read from period scores where a source reports\n   them that way. A value that cannot be expressed as the key's type is returned as\n   `null`. That includes: a number that is negative (except temperature and pitch\n   location, which may be negative) or above 1e12; a count that is not a whole JSON\n   integer (text such as `\"2\"`, or any number with a decimal point such as `2.9` or\n   `2.0`) or that is above 1,000,000,000; numeric text in a number key; a possession\n   percentage above 100; a score pair with a side that is negative, above 1,000,000,000\n   or not a whole integer; a runner list or map with an entry that has no valid base,\n   repeats a base, or (in map form) holds a value that is neither text nor empty, in which case the\n   runners are `null` together with their count; a game clock that is not `m:ss` text\n   (minutes of one to three digits, seconds 00-59, and an optional fraction on the\n   seconds), and a soccer match minute or added time that is not exactly `m:ss`;\n   text of the form `prefix:type:value`; and an empty or blank string. Runners are\n   returned in base order. In a runner list, a name that is not text, or that has the\n   `prefix:type:value` form, is left out of that runner and the runner is kept. A\n   runner map by base carries player identifiers, so no names are returned from it; a\n   base that holds blank text counts as empty.\n5. Only the keys listed in the sport's schema are returned. For football, basketball,\n   baseball, hockey, ice_hockey and soccer, every key of that sport in the property list\n   below that does not carry a source identifier is in the schema. Tennis has one key,\n   `retirement_info`, which is not in the property list. Not returned in this format:\n   keys that carry a source identifier (player, team and goalie IDs, and similar), and\n   keys of the current format that are not in the property list (for example nested\n   baseball count and runner details, per-period linescores, match situation and\n   referee detail). Switching an account removes them from its responses.\n6. Changing the data source for an event does not change the key set, the types or the\n   meaning of `null`. Values can change.\n7. The format has no keys that carry a source identifier, and text of the form\n   `prefix:type:value` (one to ten ASCII letters, a colon, ASCII letters or underscores, a colon,\n   then text without whitespace; case-insensitive; surrounding whitespace ignored) is\n   `null`. Free text is not inspected beyond that. `possession_team_id` is a UUID in its\n   36-character text form (returned in lower case) or `null`; it is not checked against\n   the team list. Golf and motorsports are served as stored (see 8) and can contain\n   source identifiers.\n8. Golf and motorsports are not shaped by this format: their `details` are the stored\n   object, carry no `details_version`, and can contain source identifiers (an account\n   that holds no provider-data entitlement may have provider-id values removed from them\n   by a separate step). A scoreboard whose sport is not one of the sports named above,\n   including a sport stored as an identifier instead of a name, is treated as any other\n   sport. Sport names are matched ignoring case and surrounding whitespace (any Unicode space). For any other sport\n   (for example MMA) the object is exactly `{\"details_version\": 1}`.\n\n## When no scoreboard is available\n\nThe scoreboard object is absent as a whole; it is not returned with empty `details`:\n\n* `GET /api/v1/events/{id}/event-scoreboard` and `GET /api/v1/events/{id}/linescore`\n  return `404`.\n* `GET /api/v1/events` and `GET /api/v1/events/{id}` omit `event_scoreboard`.\n* `GET /api/v1/tournaments/{id}/bracket` returns `event_scoreboard: null`.\n\nA scoreboard is returned only from data you are entitled to receive. Data you are not\nentitled to is treated as if it did not exist.\n\nThis is different from an unknown value inside a returned scoreboard, which is a\n`null` key in the `details_version` 1 format.\n","example":{"goal_to_go":false,"away_yellow_cards":1,"runners_count":2,"home_timeouts":2,"match_status":"second_half","weather_wind_speed":8.0,"yard_line":25,"hitter_id":"player-123","possession_team_id":"123e4567-e89b-12d3-a456-426614174002","away_timeouts":3,"home_on_power_play":true,"touchdown_probability":0.35,"added_time_played":"00:00","weather_temperature":45.0,"active_penalties_count":1,"away_corners":2,"wind_affecting_kicking":false,"regulation_score":{"away_score":3,"home_score":0},"away_red_cards":1,"runners_on_base":[{"base":1,"ending_base":2,"id":"player-789"},{"base":3,"ending_base":3,"id":"player-012"}],"pitcher_id":"player-456","pitcher_full_name":"Jane Smith","shootout":{"away_score":4,"home_score":3},"home_substitutions":3,"away_substitutions":2,"added_time_announced":"04:00","home_possession":56,"strikes":1,"away_shots":7,"shots_on_goal_home":15,"home_yellow_cards":2,"balls":2,"home_corners":6,"away_possession":44,"home_shots_on_target":5,"details_version":1,"weather_humidity":65,"neutral_site":false,"attendance":72000,"hitter_full_name":"John Doe","outs":2,"distance":7,"play_clock":25,"inside_two_minutes":false,"away_on_power_play":false,"red_zone":true,"game_clock":"8:42","man_advantage":"5v4","power_play_time_remaining":82,"weather_wind_direction":"NW","two_minute_warning":false,"pitcher_pitch_speed":95.5,"home_red_cards":0,"weather_condition":"clear","down":3,"clock_running":true,"match_minute":"67:12","precipitation":false,"home_shots":11,"shots_on_goal_away":12,"away_shots_on_target":3,"turnover_on_downs_risk":0.15,"active_penalties":[{"major_penalty":false,"penalty_type":"Cross-checking","player_id":"player-789","time_remaining":82}],"field_goal_range":true,"weather_precipitation":false},"properties":{"penalty_kill_percentage":{"description":"Current penalty kill success rate","type":"number"},"holes_completed":{"description":"Holes finished in current round","type":"integer"},"course_conditions":{"description":"Course conditions","type":"string"},"home_biggest_lead":{"description":"Biggest home team lead","type":"integer"},"pitcher_pitch_x":{"description":"Pitch location X coordinate","type":"number"},"shootout_attempts_count":{"description":"Total shootout attempts","type":"integer"},"away_shooting_foul_trouble":{"description":"Away team in foul trouble","type":"boolean"},"goal_to_go":{"description":"Goal line is closer than first down marker","type":"boolean"},"away_yellow_cards":{"description":"Soccer away yellow cards","type":"integer"},"shootout_round":{"description":"Current shootout round","type":"integer"},"runners_count":{"description":"Number of runners on base","type":"integer"},"home_timeouts":{"description":"Home team timeouts remaining","type":"integer"},"wall_clock":{"description":"Provider wall-clock timestamp for the most recent game event","format":"date-time","type":"string"},"home_bonus":{"description":"Home team in bonus situation","type":"boolean"},"match_status":{"description":"Soccer match phase","enum":["first_half","halftime","second_half","extra_time_first_half","extra_time_second_half","penalties","ended"],"type":"string"},"last_play":{"description":"Description of last play","type":"string"},"hitter_ab_over":{"description":"At-bat is complete","type":"boolean"},"weather_wind_speed":{"description":"Wind speed (mph)","type":"number"},"home_double_bonus":{"description":"Home team in double bonus","type":"boolean"},"yard_line":{"description":"Field position (0-100)","type":"integer"},"hitter_id":{"description":"Current batter player ID","type":"string"},"times_tied":{"description":"Number of times tied","type":"integer"},"last_goal_time":{"description":"Time of last goal","type":"string"},"home_goalie_pulled":{"description":"Home goalie pulled","type":"boolean"},"lead_changes":{"description":"Number of lead changes","type":"integer"},"tournament_complete":{"description":"Tournament finished","type":"boolean"},"possession_team_id":{"description":"Common-model team ID with possession","format":"uuid","type":"string"},"wind_direction":{"description":"Wind direction","type":"string"},"away_timeouts":{"description":"Away team timeouts remaining","type":"integer"},"free_throw_shots_awarded":{"description":"Number of free throws awarded","type":"integer"},"home_on_power_play":{"description":"Home team on power play","type":"boolean"},"home_team_fouls":{"description":"Home team fouls this period/half","type":"integer"},"touchdown_probability":{"description":"Probability of touchdown (0.0-1.0)","type":"number"},"added_time_played":{"description":"Soccer stoppage time played so far in the current period (MM:SS)","example":"01:26","type":"string"},"weather_temperature":{"description":"Temperature (Fahrenheit)","type":"number"},"duration":{"description":"Game duration","type":"string"},"overtime_type":{"description":"Type of overtime","enum":["3v3","4v4","shootout"],"type":"string"},"course_length":{"description":"Course length in yards","type":"integer"},"shot_clock_running":{"description":"Whether shot clock is running","type":"boolean"},"active_penalties_count":{"description":"Number of active penalties","type":"integer"},"current_hole":{"description":"Hole currently being played","type":"integer"},"away_corners":{"description":"Soccer away corner kicks","type":"integer"},"wind_affecting_kicking":{"description":"Wind affecting field goals/punts","type":"boolean"},"regulation_score":{"description":"Soccer 90-minute score. Present only once a match goes past regulation (extra time).","properties":{"away_score":{"type":"integer"},"home_score":{"type":"integer"}},"type":"object"},"free_throw_clear_path_foul":{"description":"Free throws from clear path foul","type":"boolean"},"hits_home":{"description":"Home team hits","type":"integer"},"shootout_attempts":{"description":"Shootout attempts with details","items":{"properties":{"goalie_id":{"description":"Goalie player ID","type":"string"},"is_deciding_goal":{"description":"Was the deciding goal","type":"boolean"},"result":{"description":"Shot result","type":"string"},"round":{"description":"Shootout round","type":"integer"},"shooter_id":{"description":"Shooter player ID","type":"string"},"shooter_name":{"description":"Shooter name","type":"string"},"shooter_team_id":{"description":"Shooter's team","type":"string"}},"type":"object"},"type":"array"},"playoff_type":{"description":"Type of playoff","enum":["sudden_death","aggregate","match_play"],"type":"string"},"away_red_cards":{"description":"Soccer away red cards (includes second-yellow dismissals)","type":"integer"},"free_throw_current_attempt":{"description":"Current free throw attempt number","type":"integer"},"runners_on_base":{"description":"Baserunners with positions and details","items":{"properties":{"base":{"description":"Starting base (1, 2, 3)","type":"integer"},"ending_base":{"description":"Ending base after play","type":"integer"},"full_name":{"description":"Runner name, when known","type":"string"},"id":{"description":"Player ID","type":"string"}},"type":"object"},"type":"array"},"cut_made":{"description":"Has cut been applied","type":"boolean"},"pitcher_id":{"description":"Current pitcher player ID","type":"string"},"pitcher_full_name":{"description":"Current pitcher name","type":"string"},"shootout":{"description":"Soccer penalty shootout score. Present only once penalties are reached.","properties":{"away_score":{"type":"integer"},"home_score":{"type":"integer"}},"type":"object"},"faceoff_location":{"description":"Location of last faceoff","type":"string"},"home_substitutions":{"description":"Soccer home substitutions made","type":"integer"},"wind_speed":{"description":"Wind speed (mph)","type":"number"},"shot_clock":{"description":"Shot clock seconds remaining","type":"integer"},"away_substitutions":{"description":"Soccer away substitutions made","type":"integer"},"pitcher_pitch_zone":{"description":"Strike zone location","type":"integer"},"added_time_announced":{"description":"Soccer stoppage time announced by the fourth official (MM:SS)","example":"02:00","type":"string"},"free_throw_technical_foul":{"description":"Free throws from technical foul","type":"boolean"},"home_possession":{"description":"Soccer home ball possession percentage","maximum":100,"minimum":0,"type":"number"},"putting_average_leader":{"description":"Putting average leader player ID","type":"string"},"home_shooting_foul_trouble":{"description":"Home team in foul trouble","type":"boolean"},"strikes":{"description":"Strike count (0-2)","type":"integer"},"greens_in_regulation_leader":{"description":"GIR leader player ID","type":"string"},"away_biggest_lead":{"description":"Biggest away team lead","type":"integer"},"face_off_wins_away":{"description":"Away team faceoff wins","type":"integer"},"last_goal_team_id":{"description":"Team that scored last goal","type":"string"},"away_double_bonus":{"description":"Away team in double bonus","type":"boolean"},"away_shots":{"description":"Soccer away total shots","type":"integer"},"temperature":{"description":"Temperature (Fahrenheit)","type":"integer"},"last_penalty_time":{"description":"Time of last penalty","type":"string"},"last_score_team_id":{"description":"Team that scored last","type":"string"},"free_throw_and_one":{"description":"And-one free throw situation","type":"boolean"},"shots_on_goal_home":{"description":"Home team shots on goal","type":"integer"},"home_yellow_cards":{"description":"Soccer home yellow cards","type":"integer"},"free_throw_flagrant_foul":{"description":"Free throws from flagrant foul","type":"boolean"},"in_shootout":{"description":"Currently in shootout","type":"boolean"},"playoff_status":{"description":"Tournament in playoff","type":"boolean"},"away_goalie_id":{"description":"Current away goalie player ID","type":"string"},"balls":{"description":"Ball count (0-3)","type":"integer"},"home_corners":{"description":"Soccer home corner kicks","type":"integer"},"home_shootout_goals":{"description":"Home team shootout goals","type":"integer"},"pitcher_pitch_type":{"description":"Last pitch type","type":"string"},"away_possession":{"description":"Soccer away ball possession percentage","maximum":100,"minimum":0,"type":"number"},"scoring_average":{"description":"Current round scoring average","type":"number"},"empty_net":{"description":"Empty net situation","type":"boolean"},"home_shots_on_target":{"description":"Soccer home shots on target","type":"integer"},"away_bonus":{"description":"Away team in bonus situation","type":"boolean"},"details_version":{"description":"Version of the details contract. Present and `1` in the contract format; absent in legacy provider-shaped objects.","example":1,"type":"integer"},"weather_humidity":{"description":"Humidity percentage","type":"integer"},"neutral_site":{"description":"Neutral site game","type":"boolean"},"free_throw_shots_made":{"description":"Free throws made so far","type":"integer"},"attendance":{"description":"Game attendance","type":"integer"},"total_rounds":{"description":"Total tournament rounds","type":"integer"},"hitter_full_name":{"description":"Current batter name","type":"string"},"pace":{"description":"Possessions per 48 minutes","type":"number"},"outs":{"description":"Outs in inning (0-2)","type":"integer"},"round_number":{"description":"Current round (1-4+)","type":"integer"},"free_throw_shooter_name":{"description":"Name of free throw shooter","type":"string"},"cut_line":{"description":"Score needed to make cut","type":"integer"},"distance":{"description":"Yards to go for first down","type":"integer"},"free_throw_shooter_id":{"description":"Player ID shooting free throws","type":"string"},"field_size":{"description":"Total number of players","type":"integer"},"play_clock":{"description":"Seconds on play clock","type":"integer"},"hits_away":{"description":"Away team hits","type":"integer"},"inside_two_minutes":{"description":"Less than two minutes remaining","type":"boolean"},"driving_distance_leader":{"description":"Driving distance leader player ID","type":"string"},"home_goalie_id":{"description":"Current home goalie player ID","type":"string"},"intermission":{"description":"Between periods/halves","type":"boolean"},"hitter_outcome_id":{"description":"At-bat outcome identifier","type":"string"},"blocked_shots_away":{"description":"Away team blocked shots","type":"integer"},"away_on_power_play":{"description":"Away team on power play","type":"boolean"},"last_faceoff_winner":{"description":"Team that won last faceoff","enum":["home","away"],"type":"string"},"red_zone":{"description":"In red zone (20 yards or less)","type":"boolean"},"game_clock":{"description":"Current game clock time","type":"string"},"man_advantage":{"description":"Current man advantage (e.g., '5v4', 'even')","type":"string"},"blocked_shots_home":{"description":"Home team blocked shots","type":"integer"},"away_goalie_pulled":{"description":"Away goalie pulled","type":"boolean"},"power_play_time_remaining":{"description":"Seconds remaining on power play","type":"integer"},"weather_wind_direction":{"description":"Wind direction","type":"string"},"players_made_cut":{"description":"Players making the cut","type":"integer"},"par_for_course":{"description":"Course par","type":"integer"},"two_minute_warning":{"description":"Two minute warning called","type":"boolean"},"pitcher_pitch_speed":{"description":"Last pitch speed (mph)","type":"number"},"possession_arrow":{"description":"Possession arrow (college)","enum":["home","away"],"type":"string"},"away_shootout_goals":{"description":"Away team shootout goals","type":"integer"},"free_throw_shots_attempted":{"description":"Free throws attempted so far","type":"integer"},"home_red_cards":{"description":"Soccer home red cards (includes second-yellow dismissals)","type":"integer"},"weather_condition":{"description":"Weather condition","type":"string"},"away_team_fouls":{"description":"Away team fouls this period/half","type":"integer"},"pitcher_pitch_y":{"description":"Pitch location Y coordinate","type":"number"},"down":{"description":"Current down (1-4)","type":"integer"},"last_score_time":{"description":"When last score occurred","type":"string"},"clock_running":{"description":"Whether game clock is running","type":"boolean"},"overtime_number":{"description":"Which overtime period","type":"integer"},"match_minute":{"description":"Soccer elapsed match clock as MM:SS (stoppage time excluded). Tick locally between updates.","example":"45:00","type":"string"},"precipitation":{"description":"Active precipitation","type":"boolean"},"home_shots":{"description":"Soccer home total shots","type":"integer"},"shots_on_goal_away":{"description":"Away team shots on goal","type":"integer"},"away_shots_on_target":{"description":"Soccer away shots on target","type":"integer"},"turnover_on_downs_risk":{"description":"Probability of turnover on downs (0.0-1.0)","type":"number"},"active_penalties":{"description":"Currently active penalties with details","items":{"properties":{"duration":{"description":"Penalty duration in minutes","type":"integer"},"major_penalty":{"description":"Is major penalty","type":"boolean"},"misconduct":{"description":"Is misconduct penalty","type":"boolean"},"penalty_start_time":{"description":"When penalty started","type":"string"},"penalty_type":{"description":"Type of penalty","type":"string"},"player_id":{"description":"Penalized player ID","type":"string"},"player_name":{"description":"Penalized player name","type":"string"},"team_id":{"description":"Team of penalized player","type":"string"},"time_remaining":{"description":"Time remaining in seconds","type":"integer"}},"type":"object"},"type":"array"},"field_goal_range":{"description":"Within field goal range","type":"boolean"},"free_throw_bonus_situation":{"description":"Free throws from bonus","type":"boolean"},"weather_precipitation":{"description":"Is it precipitating","type":"boolean"},"face_off_wins_home":{"description":"Home team faceoff wins","type":"integer"}},"type":"object"},"event_id":{"description":"Event ID","format":"uuid","type":"string"},"home_score":{"description":"Home team total score (null for individual sports like golf)","example":14,"type":"integer"},"inserted_at":{"description":"Creation timestamp","format":"date-time","type":"string"},"league":{"description":"League abbreviation","example":"NFL","type":"string"},"observed_at":{"description":"Provider observation time of the served row (the elected row's own observation; unlike response_received_at it is never taken from a clock donor). Null when unknown.","example":"2024-01-15T15:32:09Z","format":"date-time","nullable":true,"type":"string"},"period":{"description":"Current period/quarter/inning (1-based, sport-specific numbering)","example":2,"type":"integer"},"period_half":{"description":"Period subdivision (e.g., 'top'/'bottom' for baseball innings)","enum":["top","bottom"],"example":"bottom","type":"string"},"period_half_over":{"description":"Whether the current period half is complete","type":"boolean"},"periods":{"description":"Per-period linescore, in period order. This is what `/v1/events/{id}/linescore` returns.","example":[{"away_score":3,"home_score":7,"number":1,"type":"regular_period"}],"items":{"additionalProperties":true,"type":"object"},"type":"array"},"response_received_at":{"description":"When we received this state from the upstream provider. This is the observation time, and it is the field to use to judge freshness or to interpolate a running clock — `updated_at` is a storage timestamp and moves even when the observation did not.","example":"2024-01-15T15:32:10Z","format":"date-time","type":"string"},"served_at":{"description":"When this response was assembled (UTC, whole seconds).","example":"2024-01-15T15:32:11Z","format":"date-time","nullable":true,"type":"string"},"source_rank":{"description":"Which provider's row was served and why it was chosen. `provider` is the provider family (`sportsstack` for a canonical row, whose backing vendor is not disclosed); `rank` is its position in the league's live primary order (0 = primary, null = outside the order or canonical); `reason` is `primary` (highest-ranked provider present), `fallback_stale` (a higher-ranked provider's row was older than the stale window), `single_provider` (only one provider reported), `freshest` (a fresher lower-ranked row was served), or null when the election's candidates are not visible to the tenant.","nullable":true,"properties":{"provider":{"example":"sportsstack","type":"string"},"rank":{"example":0,"nullable":true,"type":"integer"},"reason":{"enum":["primary","fallback_stale","single_provider","freshest"],"nullable":true,"type":"string"}},"type":"object"},"sport":{"description":"Sport name","enum":["football","basketball","baseball","hockey","ice_hockey","soccer","golf"],"example":"football","type":"string"},"status":{"description":"Lifecycle state of the event as reported by the provider (e.g. 'live', 'in_progress', 'halftime', 'closed', 'final'). Values are provider vocabulary and are not normalized across providers — use this to tell a live scoreboard from a finished one, not for settlement decisions.","example":"in_progress","type":"string"},"time_on_clock":{"description":"Time remaining in period - format varies by sport (MM:SS for timed sports, null for baseball/golf)","example":"14:30","type":"string"},"updated_at":{"description":"Last update timestamp","format":"date-time","type":"string"}},"required":["common_model_id","event_id","sport","league"],"title":"EventStatus","type":"object"},"image_url":{"description":"Event promotional image or logo","type":"string"},"league_id":{"description":"League/competition this event belongs to","type":"string"},"market_count":{"description":"Number of distinct open markets (provider status active; suspended, closed, settled and unknown statuses are not counted) for this event, in sources visible to the tenant (the visibility `GET /markets` applies); each market counts once across venues. Finished events report 0. An open market is not necessarily priced right now. null means the count could not be computed right now (never 0). Present on `GET /events`.","minimum":0,"nullable":true,"type":"integer"},"market_counts_by_venue":{"additionalProperties":{"minimum":0,"type":"integer"},"description":"Per-venue (aggregator, e.g. `polymarket`, `kalshi`, `prophetx`, `predict_fun`, `limitless`, `polymarket_us`, `sxbet`) breakdown of `market_count`, with the same rules. Venues with no open market are omitted. Values can sum to more than `market_count`. null means the count could not be computed right now. Present on `GET /events`.","nullable":true,"type":"object"},"metadata":{"additionalProperties":true,"description":"Provider-specific event metadata. Playoff-series and named games expose `subtitle`, a short label such as `\"Game 3\"`, `\"Monday Night Football\"` or `\"AFC Championship\"`; where the game is part of a best-of series, `series_game_number` (1-9) and, when a provider states it, `series_games_total` are also present. The game number does not change when a game is rescheduled. UFC bout events expose `card_ufcstats_id` and, once completed, `result` with parsed `method`, `details`, `end_round`, `end_time`, `time_format`, and `referee`. For FIFA-family tournament events (FIFA World Cup, Women's World Cup, Club World Cup, U20, U17), these keys are emitted in addition to any existing provider fields:\n\n- `round` — verbatim provider round object. Group stage: `{number: <matchday>}`. Knockout: `{name: <snake_case>, cup_round_id: <sr_id>, type: <round_type>}`. Present on all soccer events (backward-compatible).\n- `round_name` — human-readable round display string. Group stage: `\"Round 1\" | \"Round 2\" | \"Round 3\"`. Knockout: `\"Round of 32\" | \"Round of 16\" | \"Quarterfinals\" | \"Semifinals\" | \"3rd Place Playoff\" | \"Final\"`. FIFA-family only.\n- `stage` — the stage object this event belongs to: `{order, type, phase, start_date, end_date, year}`. `type` is `\"league\"` for group stage, `\"cup\"` for knockouts. FIFA-family only.\n- `group` — for FIFA group-stage events only: `{id, name, group_name}` where `group_name` is the short label (`\"A\"`, `\"B\"`, etc.).\n- `cup_round_id` — for FIFA knockout events only: stable provider identifier shared by all matches in the same cup round. Use this to group the 4 quarterfinal matches, the 2 semifinals, etc. Final and 3rd Place Playoff have distinct `cup_round_id`s despite sharing the same `stage`.\n\nNon-FIFA soccer events (MLS, EPL, UEFA, etc.) only carry `metadata.round` from the provider.","type":"object"},"participant_type":{"description":"Participant shape classification for the event: 'team_v_team' for team sports, 'player_v_player' for individual head-to-head, 'players_v_players' for side-vs-side player groups, or 'players_pool' for pooled field formats.","enum":["team_v_team","player_v_player","players_v_players","players_pool"],"type":"string"},"participants":{"description":"Competing entities - teams for team sports, individual players for individual sports","items":{"properties":{"id":{"description":"Participant common_model_id (references the corresponding Team or Player)","format":"uuid","type":"string"},"is_home":{"description":"true if home team/player, false if away (null for neutral sites)","type":"boolean"},"points":{"description":"Participant's score in this event. Sport-specific semantics: for team sports with a single numeric score (NBA/NFL/MLB/NHL/soccer) this is the score (goals for soccer). This is NOT FIFA match result points (3-1-0). For FIFA/soccer standings points, query GET /api/v1/standings?league_id=<id>&season_year=<yr>&primary_group_type=group and read ranking_points. On knockout matches tournament_round is populated and points continues to reflect the score (extra time/penalties result available via event_scoreboard).","type":"integer"},"team":{"description":"Tenant-visible team details when type=team. team.id matches the participant id.","properties":{"abbreviation":{"type":"string"},"id":{"format":"uuid","type":"string"},"image_url":{"type":"string"},"market":{"type":"string"},"name":{"type":"string"},"nickname":{"type":"string"}},"type":"object"},"type":{"description":"Entity type: 'team' or 'player'","type":"string"}},"type":"object"},"type":"array"},"scheduled_start_time":{"description":"When the event is scheduled to begin (ISO 8601 UTC timestamp)","format":"date-time","type":"string"},"season_id":{"description":"Season Common Model ID. For UFC bouts, this is the UFC fight-card season ID; metadata.card_ufcstats_id carries the provider card identifier when available.","format":"uuid","type":"string"},"season_type":{"description":"Season phase: 'PRE' (preseason), 'REG' (regular), 'POST' (playoffs), 'IST' (in-season tournament), 'PIT' (play-in tournament), 'SC' (showcase cup), 'EX' (exhibition), 'CC' (commissioners cup), 'CT' (conference tournament), 'ALL_STAR' (all-star)","type":"string"},"season_type_agnostic_week":{"description":"Week number agnostic of season type (only for NFL/NCAAF). This is a continuous week number across the entire season: regular season weeks are 1-18 (NFL) or 1-16 (NCAAF), and postseason weeks continue from there (e.g., NFL postseason week 1 = 19, week 2 = 20, etc.). This field is only present for NFL and NCAAF events.","type":"integer"},"season_year":{"description":"Calendar year the season primarily takes place","type":"integer"},"source_mappings_by_source":{"additionalProperties":{"properties":{"event":{"description":"Event mapping rows for event endpoints.","items":{"properties":{"common_model_id":{"format":"uuid","type":"string"},"deprecated_at":{"format":"date-time","nullable":true,"type":"string"},"entity_type":{"type":"string"},"id_scheme":{"type":"string"},"ignored_pending":{"type":"boolean"},"league":{"type":"string"},"match_status":{"type":"string"},"overmapped_allowed":{"type":"boolean"},"provider":{"type":"string"},"source":{"type":"string"},"source_id":{"type":"string"},"tenant_id":{"format":"uuid","nullable":true,"type":"string"},"updated_at":{"format":"date-time","type":"string"}},"type":"object"},"type":"array"},"mappings":{"description":"Source mapping rows for non-event entity endpoints.","items":{"properties":{"common_model_id":{"format":"uuid","type":"string"},"deprecated_at":{"format":"date-time","nullable":true,"type":"string"},"entity_type":{"type":"string"},"id_scheme":{"type":"string"},"ignored_pending":{"type":"boolean"},"league":{"type":"string"},"match_status":{"type":"string"},"overmapped_allowed":{"type":"boolean"},"provider":{"type":"string"},"source":{"type":"string"},"source_id":{"type":"string"},"tenant_id":{"format":"uuid","nullable":true,"type":"string"},"updated_at":{"format":"date-time","type":"string"}},"type":"object"},"type":"array"},"participants":{"description":"Participant mapping rows for event endpoints.","items":{"properties":{"common_model_id":{"format":"uuid","type":"string"},"deprecated_at":{"format":"date-time","nullable":true,"type":"string"},"entity_type":{"type":"string"},"id_scheme":{"type":"string"},"ignored_pending":{"type":"boolean"},"league":{"type":"string"},"match_status":{"type":"string"},"overmapped_allowed":{"type":"boolean"},"participant_id":{"format":"uuid","type":"string"},"participant_role":{"type":"string"},"participant_side":{"enum":["home","away","neutral","unknown"],"type":"string"},"provider":{"type":"string"},"source":{"type":"string"},"source_id":{"type":"string"},"tenant_id":{"format":"uuid","nullable":true,"type":"string"},"updated_at":{"format":"date-time","type":"string"}},"type":"object"},"type":"array"},"unmapped_participants":{"description":"Event participants that could not be emitted as source mappings because they were placeholders/TBD or lacked a mapping for the requested source.","items":{"properties":{"display_name":{"type":"string"},"participant_id":{"type":"string"},"participant_role":{"type":"string"},"participant_side":{"enum":["home","away","neutral","unknown"],"type":"string"},"reason":{"enum":["placeholder_or_tbd","missing_source_mapping"],"type":"string"}},"type":"object"},"type":"array"}},"type":"object"},"description":"Optional enterprise mapping enrichment keyed by full normalized source. Added when include_source_mappings_by_source=true.","type":"object"},"status":{"description":"Status of the event: 'scheduled', 'in_progress', 'completed', 'cancelled', 'postponed', 'time_tbd'. A live event does not move back to 'scheduled' or 'time_tbd' on one provider's report while another still reports it live; 'completed' is reached when one provider reports a final and 'cancelled' when two do.","enum":["scheduled","in_progress","completed","cancelled","postponed","time_tbd"],"type":"string"},"title":{"description":"Human-readable event name (e.g., 'LAL @ GS', 'Super Bowl LVIII')","type":"string"},"tournament_id":{"description":"Tournament this event belongs to (for tournament/playoff events). Used to reconstruct bracket structure from events.","format":"uuid","type":"string"},"tournament_round":{"description":"Round position within the tournament. Semantics vary by sport: (1) FIFA-family soccer group-stage matches: `0` — the match is part of a tournament group phase. Matchday number (1/2/3) lives in `metadata.round.number` with a humanized string in `metadata.round_name`. (2) FIFA-family soccer knockout matches: `null` — the provider does not expose a sequential round number for knockouts (the 3rd-place playoff and Final share the same stage with distinct cup rounds, and no knockout leads into another). Use `metadata.round_name` for display and `metadata.cup_round_id` as the stable grouping key — the 4 quarterfinal matches share one `cup_round_id`; Final and 3rd Place Playoff have distinct ids. (3) Non-tournament soccer events (MLS regular-season, EPL league match with no cup context): `null` with `tournament_id: null` — not a tournament match. (4) Other tournament sports (NCAAB, etc.): 1-based bracket position aligned with `Tournament.rounds[*].round_number`.","type":"integer"},"weather":{"description":"Weather conditions for outdoor events (affects player performance and betting)","properties":{"condition":{"description":"Weather condition description (e.g., Sunny, Cloudy, Rainy, Snow)","type":"string"},"humidity":{"description":"Humidity percentage (0-100)","type":"integer"},"pressure":{"description":"Atmospheric pressure in hectopascals (hPa)","type":"integer"},"temperature":{"description":"Temperature in Celsius","type":"number"},"wind_direction":{"description":"Cardinal wind direction (N, S, E, W, NE, NW, SE, SW)","type":"string"},"wind_speed":{"description":"Wind speed in kilometers per hour","type":"number"}},"required":["temperature","condition"],"type":"object"},"week":{"description":"Week number within the season (for weekly sports like NFL)","type":"integer"}},"required":["common_model_id","title"],"title":"Event","type":"object"},"type":"array"}},"required":["data"],"type":"object"}}},"description":"Event Response"},"400":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"bad_request","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/bad_request","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"invalid_api_key","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/invalid_api_key","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"not_found","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/not_found","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Not Found"}},"summary":"List Events","tags":["Reference"]}},"/api/v1/teams/{id}":{"get":{"callbacks":{},"operationId":"ApiRestWeb.TeamController.show","parameters":[{"description":"Team ID (UUID)","example":"01c7133f-2999-4803-9872-8c2ab1ba63ac","in":"path","name":"id","required":true,"schema":{"type":"string"}},{"description":"Include source mappings from the specific integration (i.e. a provider key) will return a source_mappings object with the mappings for the respective objects","in":"query","name":"return_source_id_format","required":false,"schema":{"type":"string"}},{"description":"Include virtual/placeholder teams. Only the literal value \"true\" opts in. Defaults to excluded.","in":"query","name":"include_virtual","required":false,"schema":{"example":"true","type":"string"}},{"description":"When true, add source_mappings_by_source keyed by full normalized source (for example, provider.football.nfl).","in":"query","name":"include_source_mappings_by_source","required":false,"schema":{"default":false,"type":"boolean"}},{"description":"Optional provider-family filter for source_mappings_by_source (for example, a provider key).","in":"query","name":"source_mapping_provider","required":false,"schema":{"type":"string"}},{"description":"Optional full-source filter for source_mappings_by_source in provider.sport.league format.","in":"query","name":"source_mapping_source","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"description":"A team represents an organized group of players competing together under a common identity.\n\nTeams are the primary competing entities in team-based sports. They maintain rosters,\nhave historical records, geographic associations, and fan bases. Teams can change leagues,\nrelocate cities, or rebrand while maintaining continuity of their competitive history.\n\n## Team Structure\n- **Identity**: Name, abbreviation, colors, logos, and branding\n- **Location**: City/region association and home venue\n- **Roster**: Current and historical player affiliations\n- **Performance**: Win-loss records, championships, statistics\n- **Organization**: Coaching staff, management, ownership\n\n## Key Relationships\n- **League**: Organizational membership and competitive framework\n- **Players**: Current roster and historical affiliations\n- **Events**: Games played as home or away team\n- **Statistics**: Team-level performance metrics\n- **Markets**: Team-specific betting opportunities\n\n## Franchise Continuity\nTeams may undergo changes while maintaining data continuity:\n- **Relocation**: Moving cities (e.g., St. Louis Rams → Los Angeles Rams)\n- **Rebranding**: Name changes (e.g., Washington Redskins → Commanders)\n- **League Changes**: Moving between divisions or conferences\n\n## Geographic Significance\nTeam location affects scheduling, fan base, media coverage, and betting markets.\nHome field advantage is a measurable factor in performance analysis.\n","example":{"abbreviation":"PHI","colors":[{"type":"primary","value":"#004C54"},{"type":"secondary","value":"#A5ACAF"}],"common_model_id":"e2790078-ec3a-4c45-8dc4-5cf173960b2b","image_url":"https://cdn.example.com/logos/nba/lal.png","league_id":"58e8c89b-72f8-4427-adbc-10f193c9b462","market":"Philadelphia","metadata":{"conference":"NFC","division":"NFC East"},"name":"Philadelphia Eagles","nickname":"Eagles","status":"ACTIVE"},"properties":{"abbreviation":{"description":"Standard short form used in schedules and stats (e.g., 'LAL')","type":"string"},"colors":{"description":"Team brand colors as array of color objects with type and hex value","items":{"properties":{"type":{"description":"Color type: 'primary', 'secondary', or 'accent_N'","example":"primary","type":"string"},"value":{"description":"Color value in hex format","example":"#004C54","type":"string"}},"type":"object"},"type":"array"},"common_model_id":{"description":"Unique team identifier preserving historical continuity","type":"string"},"conference":{"description":"Conference name (e.g., 'NFC', 'Eastern Conference'), hoisted from team metadata for convenience. Null when unavailable; see GET /api/v1/standings for the authoritative grouping.","nullable":true,"type":"string"},"division":{"description":"Division name (e.g., 'NFC East', 'AL West'), hoisted from team metadata for convenience. Null when no provider or standings data supplies it — GET /api/v1/standings?primary_group_type=division is the authoritative source.","nullable":true,"type":"string"},"image_url":{"description":"Team logo, helmet, or primary branding image","type":"string"},"league_id":{"description":"League/competition the team currently competes in","type":"string"},"market":{"description":"Geographic market/city name (e.g., 'Los Angeles', 'Philadelphia')","type":"string"},"metadata":{"additionalProperties":true,"description":"Additional team metadata including division, conference, and other organizational information","properties":{"away_loss":{"description":"Away losses recorded in the current standings snapshot","type":"integer"},"conference":{"description":"Conference name (e.g., 'NFC', 'AFC', 'Eastern Conference')","type":"string"},"division":{"description":"Division name (e.g., 'NFC East', 'AL West')","type":"string"},"division_rank":{"description":"Current division rank (1 = first place) from the latest standings pull","type":"integer"},"home_loss":{"description":"Home losses recorded in the current standings snapshot","type":"integer"},"last_10_lost":{"description":"Losses over the last ten games according to the latest standings import","type":"integer"},"last_10_won":{"description":"Wins over the last ten games according to the latest standings import","type":"integer"},"league_rank":{"description":"Overall league rank from the most recent standings snapshot","type":"integer"},"loss":{"description":"Latest regular-season loss total","type":"integer"},"standing_season_type":{"description":"Season segment (PRE, REG, PST, etc.) for the current standings data","type":"string"},"standing_season_year":{"description":"Season year for the latest standings snapshot applied to this team","type":"integer"},"streak":{"description":"Current streak text (e.g., 'W3', 'L2') sourced from standings metadata","type":"string"},"wild_card_back":{"description":"Games behind the wildcard leader in the most recent standings snapshot","format":"float","type":"number"},"win":{"description":"Latest regular-season win total synced from the authoritative provider","type":"integer"},"win_percentage":{"description":"Decimal win percentage (0-1) from the standings feed","format":"float","type":"number"}},"type":"object"},"name":{"description":"Full team name including city (e.g., 'Los Angeles Lakers')","type":"string"},"nickname":{"description":"Team nickname or mascot name (e.g., 'Lakers', 'Eagles')","type":"string"},"source_mappings_by_source":{"additionalProperties":{"properties":{"event":{"description":"Event mapping rows for event endpoints.","items":{"properties":{"common_model_id":{"format":"uuid","type":"string"},"deprecated_at":{"format":"date-time","nullable":true,"type":"string"},"entity_type":{"type":"string"},"id_scheme":{"type":"string"},"ignored_pending":{"type":"boolean"},"league":{"type":"string"},"match_status":{"type":"string"},"overmapped_allowed":{"type":"boolean"},"provider":{"type":"string"},"source":{"type":"string"},"source_id":{"type":"string"},"tenant_id":{"format":"uuid","nullable":true,"type":"string"},"updated_at":{"format":"date-time","type":"string"}},"type":"object"},"type":"array"},"mappings":{"description":"Source mapping rows for non-event entity endpoints.","items":{"properties":{"common_model_id":{"format":"uuid","type":"string"},"deprecated_at":{"format":"date-time","nullable":true,"type":"string"},"entity_type":{"type":"string"},"id_scheme":{"type":"string"},"ignored_pending":{"type":"boolean"},"league":{"type":"string"},"match_status":{"type":"string"},"overmapped_allowed":{"type":"boolean"},"provider":{"type":"string"},"source":{"type":"string"},"source_id":{"type":"string"},"tenant_id":{"format":"uuid","nullable":true,"type":"string"},"updated_at":{"format":"date-time","type":"string"}},"type":"object"},"type":"array"},"participants":{"description":"Participant mapping rows for event endpoints.","items":{"properties":{"common_model_id":{"format":"uuid","type":"string"},"deprecated_at":{"format":"date-time","nullable":true,"type":"string"},"entity_type":{"type":"string"},"id_scheme":{"type":"string"},"ignored_pending":{"type":"boolean"},"league":{"type":"string"},"match_status":{"type":"string"},"overmapped_allowed":{"type":"boolean"},"participant_id":{"format":"uuid","type":"string"},"participant_role":{"type":"string"},"participant_side":{"enum":["home","away","neutral","unknown"],"type":"string"},"provider":{"type":"string"},"source":{"type":"string"},"source_id":{"type":"string"},"tenant_id":{"format":"uuid","nullable":true,"type":"string"},"updated_at":{"format":"date-time","type":"string"}},"type":"object"},"type":"array"},"unmapped_participants":{"description":"Event participants that could not be emitted as source mappings because they were placeholders/TBD or lacked a mapping for the requested source.","items":{"properties":{"display_name":{"type":"string"},"participant_id":{"type":"string"},"participant_role":{"type":"string"},"participant_side":{"enum":["home","away","neutral","unknown"],"type":"string"},"reason":{"enum":["placeholder_or_tbd","missing_source_mapping"],"type":"string"}},"type":"object"},"type":"array"}},"type":"object"},"description":"Optional enterprise mapping enrichment keyed by full normalized source. Added when include_source_mappings_by_source=true.","type":"object"},"status":{"description":"Team status: ACTIVE for official league teams, INACTIVE for exhibition/minor league teams not in league hierarchy","enum":["ACTIVE","INACTIVE"],"type":"string"}},"required":["common_model_id","name"],"title":"Team","type":"object"}}},"description":"Team Response"},"400":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"bad_request","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/bad_request","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Bad Request"},"404":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"not_found","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/not_found","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Not Found"}},"summary":"Show Team","tags":["Reference"]}},"/api/v1/events/{id}/play-stats":{"get":{"callbacks":{},"operationId":"ApiRestWeb.EventController.index_related_play_stats","parameters":[{"description":"Event ID (UUID)","example":"01c7133f-2999-4803-9872-8c2ab1ba63ac","in":"path","name":"id","required":true,"schema":{"type":"string"}},{"description":"Filter by player ID","in":"query","name":"player_id","required":false,"schema":{"type":"string"}},{"description":"Filter by team ID","in":"query","name":"team_id","required":false,"schema":{"type":"string"}},{"description":"Filter by play number within the event","in":"query","name":"play_number","required":false,"schema":{"type":"integer"}},{"description":"Page number for page/per_page pagination. Do not combine with limit/offset.","in":"query","name":"page","required":false,"schema":{"default":1,"minimum":1,"type":"integer"}},{"description":"Number of items per page (max 1000). Do not combine with limit/offset.","in":"query","name":"per_page","required":false,"schema":{"default":100,"maximum":1000,"minimum":1,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"description":"Individual player statistics and involvement details for a specific play within an event.\n\nPlayStat records capture how individual players contributed to or were affected by\nspecific plays. This granular data enables advanced player evaluation, situational\nperformance analysis, and detailed coaching insights beyond traditional box scores.\n\n## Player-Play Relationship\nEach PlayStat links a player to a specific play, recording:\n- **Role**: How the player was involved (quarterback, receiver, defender, etc.)\n- **Performance**: Measurable outcomes (yards gained, tackles made, shots taken)\n- **Context**: Situational factors affecting the player's involvement\n\n## Use Cases\n- **Advanced Analytics**: Context-aware player performance evaluation\n- **Coaching Analysis**: Individual performance in specific situations\n- **Fantasy Sports**: Granular scoring and projection models\n- **Player Development**: Detailed performance tracking and improvement areas\n\n## Data Inheritance\nPlayStat inherits contextual information from the parent Play record while adding\nplayer-specific details about involvement and statistical outcomes.\n","example":{"common_model_id":"123e4567-e89b-12d3-a456-426614174000","event_id":"123e4567-e89b-12d3-a456-426614174003","play_number":1,"player_id":"123e4567-e89b-12d3-a456-426614174001","player_info":{"role":"quarterback","statistics":{"completion":true,"passing_touchdowns":1,"passing_yards":20}}},"properties":{"common_model_id":{"description":"Unique identifier for this player-play statistical record","type":"string"},"defense_id":{"description":"Team or player in defensive role during this play","type":"string"},"description":{"description":"Human-readable description of what happened (inherited from Play)","type":"string"},"event_id":{"description":"Parent event/game containing this play","type":"string"},"game_context":{"additionalProperties":true,"description":"Situational game state when play occurred (inherited from parent Play)","type":"object"},"inserted_at":{"description":"When this player-play statistic record was created","format":"date-time","type":"string"},"league_id":{"description":"League context for sport-specific statistical interpretation","format":"uuid","type":"string"},"minutes_remaining":{"description":"Minutes remaining in period when play started (inherited from Play)","type":"integer"},"offense_id":{"description":"Team or player with possession during this play","type":"string"},"period":{"description":"Game period when this play occurred (inherited from Play)","type":"integer"},"play_details":{"additionalProperties":true,"description":"General play outcome details (inherited from parent Play record)","type":"object"},"play_number":{"description":"Play number within the event, scoped to `source` — NOT globally unique per event. Multiple feeds (from different providers) can each number their own plays starting from 1, so the same play_number on two different sources refers to two different plays. Always join on (event_id, source, play_number), never (event_id, play_number) alone.","type":"integer"},"play_type":{"description":"Classification of play action (inherited from parent Play)","type":"string"},"player_id":{"description":"Player who participated in or was affected by this play","type":"string"},"player_info":{"additionalProperties":true,"description":"Player-specific role, involvement, and statistical outcomes for this play","properties":{"external_player_id":{"description":"Provider-specific player identifier","type":"string"},"role":{"description":"Player's role(s) in this specific play (e.g., 'quarterback', 'receiver', 'tackler')","items":{"type":"string"},"type":"array"},"statistics":{"additionalProperties":false,"description":"Play-level player statistics using canonical field names from our stat registry.\n\n## Play-Specific Context\nThese statistics represent individual player performance within a single play. Unlike\nevent-scoped or season-scoped stats, these capture momentary contributions to specific\ngame actions.\n\n## Standardized Stat Names\nAll statistics use our unified canonical naming system to ensure consistency across data providers.\nCommon play-level stats include:\n- **Passing**: passing_yards, passing_touchdowns, completion, interception\n- **Rushing**: rushing_yards, rushing_touchdowns, fumble\n- **Receiving**: receiving_yards, receiving_touchdowns, reception, target\n- **Defense**: tackle, assist, sack, pass_defended, interception\n- **Kicking**: field_goal_made, field_goal_yards, extra_point_made\n\n## Provider Translation\nRaw provider data is automatically translated to canonical names:\n- **Provider A**: \"py\" → \"passing_yards\", \"car\" → \"rushing_attempts\"\n- **Provider B**: \"pass_yds\" → \"passing_yards\", \"rush_att\" → \"rushing_attempts\"\n\nNote: Not all stats are applicable to every play. Only relevant stats for the player's\nrole in that specific play will be present.\n","example":{"completion":true,"passing_yards":15,"target_depth":12},"properties":{"def_interception_touchdowns":{"description":"Defensive interception touchdowns","example":5,"type":"integer"},"throwaways":{"description":"Number of throw away passes","example":5,"type":"integer"},"fanduel_fantasy_points_ceiling":{"description":"FanDuel fantasy points ceiling","example":18.5,"type":"number"},"on_target_throws":{"description":"Number of on-target throws","example":5,"type":"integer"},"interception_returns":{"description":"Number of interception returns","example":5,"type":"integer"},"kickoff_return_touchdowns":{"description":"Kickoff return touchdowns","example":5,"type":"integer"},"extra_points_attempted":{"description":"Number of extra point attempts","example":5,"type":"integer"},"redzone_rushing_attempts":{"description":"Rush attempts in the red zone","example":15,"type":"integer"},"is_motion":{"description":"Whether player was in motion during play","example":"example_value","type":"boolean"},"passing_attempts":{"description":"Total number of pass attempts","example":15,"type":"integer"},"punt_long":{"description":"Longest punt","example":5,"type":"integer"},"fumble_return_yards":{"description":"Yards gained on fumble returns","example":250,"type":"integer"},"first_read_receptions":{"description":"Number of first read receptions","example":5,"type":"integer"},"red_zone_pass_attempts":{"description":"Pass attempts in red zone","example":15,"type":"integer"},"points":{"description":"Total points scored by team","example":5,"type":"integer"},"depth_of_target":{"description":"Average depth of target","example":12.3,"type":"number"},"defensive_interceptions":{"description":"Defensive interceptions","example":5,"type":"integer"},"receiving_two_point_conversions":{"description":"Receiving two-point conversions","example":5,"type":"integer"},"field_goal_yards":{"description":"Yards gained on field goals","example":250,"type":"integer"},"conversion_defense_successes":{"description":"Two-point conversion defensive successes","example":5,"type":"integer"},"blocked_kick_return_touchdowns":{"description":"Touchdowns scored on blocked kick returns","example":5,"type":"integer"},"fanduel_ownership":{"description":"FanDuel ownership percentage","example":12.3,"type":"number"},"draftkings_fantasy_points_ceiling":{"description":"DraftKings fantasy points ceiling","example":18.5,"type":"number"},"first_read_targets":{"description":"Number of first read targets","example":5,"type":"integer"},"special_teams_snap_count":{"description":"Number of special teams snaps played","example":5,"type":"integer"},"out_of_pocket_reason":{"description":"Reason quarterback left the pocket","example":"example_value","type":"string"},"goal_line_touches":{"description":"Number of goal line touches","example":5,"type":"integer"},"receiving_yards_100_plus":{"description":"Number of 100+ yard receiving games","example":250,"type":"integer"},"total_pocket_time":{"description":"Total time spent in pocket","example":12.3,"type":"number"},"interception_return_longest_touchdown":{"description":"Longest interception return for touchdown","example":5,"type":"integer"},"field_goals_attempts":{"description":"Number of field goal attempts","example":15,"type":"integer"},"safeties":{"description":"Number of safeties","example":5,"type":"integer"},"pass_first_downs":{"description":"First downs gained via passing","example":5,"type":"integer"},"red_zone_passing_completions":{"description":"Passing completions in red zone","example":10,"type":"integer"},"net_punt_yards":{"description":"Net punt yards","example":250,"type":"integer"},"kneel_downs":{"description":"Number of kneel downs","example":5,"type":"integer"},"cushion_yards":{"description":"Cushion yards","example":250,"type":"integer"},"punt_yards":{"description":"Total punt yards","example":250,"type":"integer"},"challenges_remaining":{"description":"Number of challenges remaining","example":5,"type":"integer"},"passing_gross_yards":{"description":"Gross passing yards before sacks","example":250,"type":"integer"},"avg_pocket_time":{"description":"Average time in pocket per pass attempt","example":12.3,"type":"number"},"defended_passes":{"description":"Passes defended by defenders","example":5,"type":"integer"},"dropped_pass":{"description":"Number of dropped passes","example":5,"type":"integer"},"rushing_direction":{"description":"Direction of rushing attempt","example":"example_value","type":"string"},"sacks_taken":{"description":"Number of sacks taken by quarterback","example":5,"type":"integer"},"rec_long":{"description":"Longest reception","example":5,"type":"integer"},"yards_after_catch":{"description":"Yards gained after catch","example":250,"type":"integer"},"activated":{"description":"Player was activated to the game-day roster (shipped as 0/1)","example":5,"type":"integer"},"passing_yards":{"description":"Total passing yards thrown by the player/team","example":250,"type":"integer"},"touchdowns":{"description":"Total touchdowns scored","example":5,"type":"integer"},"rushing_fumbles":{"description":"Number of fumbles while rushing","example":5,"type":"integer"},"pre_snap_motion":{"description":"Player pre-snap motion type","example":"example_value","type":"boolean"},"nfl_fantasy_points":{"description":"NFL fantasy points","example":18.5,"type":"number"},"assisted_tackles":{"description":"Number of assisted tackles","example":5,"type":"integer"},"passing_completions":{"description":"Number of completed passes","example":10,"type":"integer"},"sacks":{"description":"Number of sacks (as QB or defensive player)","example":12.3,"type":"number"},"passing_40_plus":{"description":"Passing completions of 40+ yards","example":5,"type":"integer"},"missed_tackle_location":{"description":"Location of missed tackle","example":"example_value","type":"string"},"rushing_longest_touchdown":{"description":"Longest touchdown rush","example":5,"type":"integer"},"penalty_yards":{"description":"Penalty yards assessed","example":250,"type":"integer"},"rushing_tds_40_plus_yards":{"description":"Rushing touchdowns of 40+ yards","example":250,"type":"integer"},"penalties":{"description":"Number of penalties committed","example":5,"type":"integer"},"rushing_yards":{"description":"Total rushing yards gained","example":250,"type":"integer"},"punt_return_yards":{"description":"Punt return yards","example":250,"type":"integer"},"blocked_kicks":{"description":"Number of blocked kicks","example":5,"type":"integer"},"position":{"description":"Player position","example":"example_value","type":"string"},"sack_yards_lost":{"description":"Yards lost on sacks","example":250,"type":"integer"},"kickoff_touchbacks":{"description":"Number of kickoff touchbacks","example":5,"type":"integer"},"def_interception_yards":{"description":"Defensive interception return yards","example":250,"type":"integer"},"rush_long":{"description":"Longest rush","example":5,"type":"integer"},"played":{"description":"Whether the player appeared in the game","example":"example_value","type":"boolean"},"two_point_conversions":{"description":"Number of two-point conversions","example":5,"type":"integer"},"conversion_defense_attempts":{"description":"Two-point conversion defensive attempts","example":15,"type":"integer"},"tackles":{"description":"Total tackles (solo + assisted)","example":5,"type":"integer"},"return_yards":{"description":"Total return yards (kick/punt combined)","example":250,"type":"integer"},"kickoff_return_yards":{"description":"Total yards on kickoff returns (opponent)","example":250,"type":"integer"},"games_played":{"description":"Number of games played in","example":5,"type":"integer"},"receiving_20_plus":{"description":"Receptions of 20+ yards","example":5,"type":"integer"},"field_goals_missed":{"description":"Field goals missed","example":5,"type":"integer"},"draftkings_rating":{"description":"DraftKings player rating","example":98.7,"type":"number"},"pre_snap_alignment":{"description":"Player pre-snap alignment","example":"example_value","type":"string"},"kickoff_inside_20":{"description":"Kickoffs downed inside the 20 yard line","example":5,"type":"integer"},"batted_passes":{"description":"Passes batted down at line of scrimmage","example":5,"type":"integer"},"rushing_avg_yards":{"description":"Average yards per carry","example":12.3,"type":"number"},"interception_long":{"description":"Longest interception return","example":5,"type":"integer"},"special_teams_assisted_tackles":{"description":"Assisted tackles made on special-teams plays (kick and punt coverage)","example":5,"type":"integer"},"time_to_throw":{"description":"Time from snap to ball release in seconds","example":12.3,"type":"number"},"player_id":{"description":"Player identifier","example":"example_value","type":"string"},"kickoff_out_of_bounds":{"description":"Kickoffs out of bounds","example":5,"type":"integer"},"pass_long":{"description":"Longest pass completion","example":5,"type":"integer"},"fanduel_fantasy_points":{"description":"FanDuel fantasy points","example":18.5,"type":"number"},"def_tackles_assisted":{"description":"Defensive assisted tackles","example":5,"type":"integer"},"punts_inside_20":{"description":"Number of punts inside the 20-yard line","example":5,"type":"integer"},"solo_tackles":{"description":"Number of solo tackles","example":5,"type":"integer"},"redzone_passing_attempts":{"description":"Pass attempts in the red zone","example":15,"type":"integer"},"poor_throws":{"description":"Number of poor throws","example":5,"type":"integer"},"opponent_fumble_recovery_touchdowns":{"description":"Touchdowns on opponent fumble recoveries","example":5,"type":"integer"},"opponent_fumble_recoveries":{"description":"Opponent fumble recoveries","example":5,"type":"integer"},"deep_pass_attempts":{"description":"Deep pass attempts","example":15,"type":"integer"},"gross_kickoff_yards":{"description":"Yards gained on gross kickoffs","example":250,"type":"integer"},"qb_knockdowns":{"description":"Times quarterback was knocked down","example":5,"type":"integer"},"passing_attempts_allowed":{"description":"Passing attempts allowed by defense","example":15,"type":"integer"},"misc_solo_tackles":{"description":"Solo tackles made on change-of-possession plays (interception and fumble returns)","example":5,"type":"integer"},"total_tackles":{"description":"Total tackles across every phase of the game -- scrimmage defense plus special teams plus change-of-possession (misc) plays. This is the quantity NFL tackle props are priced and graded on.","example":5,"type":"integer"},"deep_targets":{"description":"Number of deep targets (20+ yards)","example":5,"type":"integer"},"fumbles":{"description":"Total number of fumbles","example":5,"type":"integer"},"fourth_down_stops":{"description":"Fourth down stops recorded by defense","example":5,"type":"integer"},"rushing_two_point_conversions":{"description":"Rushing two-point conversions","example":5,"type":"integer"},"missed_or_broken_tackles":{"description":"Number of missed or broken tackles","example":5,"type":"integer"},"receiving_yards":{"description":"Total receiving yards gained","example":250,"type":"integer"},"fanduel_rating":{"description":"FanDuel player rating","example":98.7,"type":"number"},"separation_type":{"description":"Type of separation","example":"example_value","type":"string"},"pressure_type":{"description":"Pressure type","example":"example_value","type":"string"},"timeouts_used":{"description":"Number of timeouts used","example":5,"type":"integer"},"returns":{"description":"Number of return attempts (kick/punt)","example":5,"type":"integer"},"conversion_passing_attempts":{"description":"Two-point conversion passing attempts","example":15,"type":"integer"},"net_kickoff_yards":{"description":"Yards gained on net kickoffs","example":250,"type":"integer"},"receiving_targets":{"description":"Number of times targeted for a pass","example":5,"type":"integer"},"extra_points_blocked":{"description":"Number of extra points blocked","example":5,"type":"integer"},"receptions":{"description":"Number of receptions/catches","example":5,"type":"integer"},"snap_counts_confirmed":{"description":"Provider confirms the snap counts for this game are final","example":"example_value","type":"boolean"},"motion_at_snap":{"description":"Player motion status at snap","example":"example_value","type":"boolean"},"receiving_fumbles":{"description":"Number of fumbles while receiving","example":5,"type":"integer"},"explosive_runs":{"description":"Number of explosive rushing attempts (10+ yards)","example":5,"type":"integer"},"rushing_40_plus":{"description":"Rushing attempts of 40+ yards","example":5,"type":"integer"},"interceptions":{"description":"Number of interceptions thrown","example":5,"type":"integer"},"quarterback_hits":{"description":"Number of quarterback hits","example":5,"type":"integer"},"interception_return_yards":{"description":"Yards gained on interception returns","example":250,"type":"integer"},"yahoo_fantasy_points_ceiling":{"description":"Yahoo fantasy points ceiling","example":18.5,"type":"number"},"primary_coverage":{"description":"Primary coverage","example":"example_value","type":"boolean"},"secondary_coverage":{"description":"Secondary coverage","example":"example_value","type":"boolean"},"fumbles_recovered":{"description":"Number of fumbles recovered","example":5,"type":"integer"},"rushing_20_plus":{"description":"Rushing attempts of 20+ yards","example":5,"type":"integer"},"throw_away":{"description":"Whether the pass was intentionally thrown away","example":"example_value","type":"boolean"},"field_goal_percentage":{"description":"Field goal percentage (made/attempted)","example":12.3,"type":"number"},"receiving_tds":{"description":"Number of receiving touchdowns","example":2,"type":"integer"},"passes_defended":{"description":"Number of passes defended","example":5,"type":"integer"},"fumble_return_touchdowns":{"description":"Touchdowns scored on fumble returns","example":5,"type":"integer"},"completion_percentage":{"description":"Pass completion percentage","example":12.3,"type":"number"},"interception_worthy_throws":{"description":"Interception worthy throws","example":5,"type":"integer"},"red_zone_targets":{"description":"Number of targets in the red zone","example":5,"type":"integer"},"allowed_pressure":{"description":"Allowed pressure","example":"example_value","type":"boolean"},"kickoff_yards":{"description":"Total kickoff yards","example":250,"type":"integer"},"qb_hurries":{"description":"Times quarterback was hurried","example":5,"type":"integer"},"kickoff_returns":{"description":"Number of kickoff returns by opponents","example":5,"type":"integer"},"passing_two_point_conversions":{"description":"Passing two-point conversions","example":5,"type":"integer"},"first_downs":{"description":"Total first downs (used for passing first downs in SR)","example":5,"type":"integer"},"defensive_touchdowns":{"description":"Number of defensive touchdowns","example":5,"type":"integer"},"opponent_fumble_recovery_yards":{"description":"Yards gained on opponent fumble recoveries","example":250,"type":"integer"},"blocked_kick_returns":{"description":"Number of blocked kick returns","example":5,"type":"integer"},"conversion_rushing_attempts":{"description":"Two-point conversion rushing attempts","example":15,"type":"integer"},"extra_point_return_touchdowns":{"description":"Extra point attempts returned for a touchdown by the defense","example":5,"type":"integer"},"own_fumble_recoveries":{"description":"Own fumble recoveries","example":5,"type":"integer"},"punts_blocked":{"description":"Number of punts blocked","example":5,"type":"integer"},"rush_rate":{"description":"Rush rate (rushing attempts per play)","example":12.3,"type":"number"},"passing_avg_yards":{"description":"Average yards per pass attempt","example":12.3,"type":"number"},"special_teams_solo_tackles":{"description":"Solo tackles made on special-teams plays (kick and punt coverage)","example":5,"type":"integer"},"red_zone_passing_attempts":{"description":"Passing attempts in red zone","example":15,"type":"integer"},"conversion_rushing_successes":{"description":"Two-point conversion rushing successes","example":5,"type":"integer"},"dropped_passes":{"description":"Passes dropped by receivers","example":5,"type":"integer"},"passing_net_yards":{"description":"Net passing yards (gross yards minus sack yards lost)","example":250,"type":"integer"},"rushing_first_downs":{"description":"First downs gained via rushing","example":5,"type":"integer"},"passing_yards_allowed":{"description":"Passing yards allowed by defense","example":250,"type":"integer"},"tackles_for_loss_yards":{"description":"Yards lost on tackles for loss","example":250,"type":"integer"},"punt_touchbacks":{"description":"Number of punt touchbacks","example":5,"type":"integer"},"missed_tackle_cause":{"description":"Cause of missed tackle","example":"example_value","type":"string"},"missed_tackle":{"description":"Number of missed tackles","example":5,"type":"integer"},"own_fumble_recovery_touchdowns":{"description":"Touchdowns on own fumble recoveries","example":5,"type":"integer"},"auction_value":{"description":"Auction draft value","example":12.3,"type":"number"},"rushing_attempts_allowed":{"description":"Rushing attempts allowed by defense","example":15,"type":"integer"},"receiving_first_downs":{"description":"First downs gained via receiving","example":5,"type":"integer"},"fg_long":{"description":"Longest field goal made","example":5,"type":"integer"},"own_fumble_recovery_yards":{"description":"Yards gained on own fumble recoveries","example":250,"type":"integer"},"player_kickoff_return_yards":{"description":"Kickoff return yards recorded by the returning player","example":250,"type":"integer"},"timeouts_remaining":{"description":"Number of timeouts remaining","example":5,"type":"integer"},"defensive_tackles_combined":{"description":"Tackles (solo + assisted) made on scrimmage defense only, excluding special teams and change-of-possession plays","example":5,"type":"integer"},"tackles_for_loss":{"description":"Rushes resulting in tackles for loss","example":5,"type":"integer"},"rushing_attempts":{"description":"Number of rushing attempts","example":15,"type":"integer"},"games_started":{"description":"Number of games started","example":5,"type":"integer"},"rank":{"description":"Player ranking","example":5,"type":"integer"},"fielding_e":{"description":"Fielding errors","example":5,"type":"integer"},"kickoff_onside_successes":{"description":"Successful onside kicks","example":5,"type":"integer"},"scrambles":{"description":"Number of quarterback scrambles","example":5,"type":"integer"},"passing_touchdowns_allowed":{"description":"Passing touchdowns allowed by defense","example":5,"type":"integer"},"passing_tds":{"description":"Number of passing touchdowns","example":2,"type":"integer"},"spikes":{"description":"Number of spiked passes","example":5,"type":"integer"},"punt_return_attempts":{"description":"Punt return attempts","example":15,"type":"integer"},"conversion_passing_successes":{"description":"Two-point conversion passing successes","example":5,"type":"integer"},"deep_pass_completions":{"description":"Deep pass completions (20+ yards)","example":10,"type":"integer"},"forced_fumbles":{"description":"Number of fumbles forced by defender","example":5,"type":"integer"},"interception_touchdowns_thrown":{"description":"Interceptions returned for touchdowns (pick-6s)","example":5,"type":"integer"},"punt_return_touchdowns":{"description":"Punt return touchdowns","example":5,"type":"integer"},"is_out_of_pocket":{"description":"Whether quarterback left the pocket","example":"example_value","type":"boolean"},"passing_yards_300_plus":{"description":"Passing yards over 300","example":250,"type":"integer"},"kickoff_return_attempts":{"description":"Kickoff return attempts","example":15,"type":"integer"},"rushing_yards_allowed":{"description":"Rushing yards allowed by defense","example":250,"type":"integer"},"jersey":{"description":"Player jersey number","example":"example_value","type":"string"},"passing_rating":{"description":"Quarterback passer rating","example":98.7,"type":"number"},"contested_ball":{"description":"Whether the targeted receiver's pass was contested","example":"example_value","type":"boolean"},"field_goals_made":{"description":"Number of field goals made","example":5,"type":"integer"},"interception_return_average":{"description":"Average yards per interception return","example":12.3,"type":"number"},"extra_points_missed":{"description":"Extra points missed","example":5,"type":"integer"},"yahoo_fantasy_points":{"description":"Yahoo fantasy points","example":18.5,"type":"number"},"defensive_snap_count":{"description":"Number of defensive snaps played","example":5,"type":"integer"},"endzone_fumble_recovery_touchdowns":{"description":"Touchdowns from end zone fumble recoveries","example":5,"type":"integer"},"rushing_touchdowns_allowed":{"description":"Rushing touchdowns allowed by defense","example":5,"type":"integer"},"return_tds":{"description":"Number of return touchdowns","example":2,"type":"integer"},"kickoff_endzone":{"description":"Kickoffs reaching the end zone","example":5,"type":"integer"},"snap_count":{"description":"Number of offensive snaps played","example":5,"type":"integer"},"def_sack_yards":{"description":"Defensive sack yards","example":250,"type":"integer"},"batted_pass":{"description":"Number of passes batted down by defense","example":5,"type":"integer"},"route_type":{"description":"Type of route run by receiver","example":"example_value","type":"string"},"receiving_40_plus":{"description":"Receptions of 40+ yards","example":5,"type":"integer"},"passing_tds_40_plus_yards":{"description":"Passing touchdowns of 40+ yards","example":250,"type":"integer"},"fumbles_out_of_bounds":{"description":"Number of fumbles that went out of bounds","example":5,"type":"integer"},"deep_pass_receptions":{"description":"Deep pass receptions","example":5,"type":"integer"},"fumbles_lost":{"description":"Number of fumbles lost to opponent","example":5,"type":"integer"},"fumble_long":{"description":"Longest fumble return","example":5,"type":"integer"},"punt_fair_catch":{"description":"Number of punt fair catches","example":5,"type":"integer"},"is_successful_play":{"description":"Whether the play was successful","example":"example_value","type":"boolean"},"total":{"description":"Over/under total for betting","example":12.3,"type":"number"},"applied_pressure":{"description":"Applied pressure","example":"example_value","type":"boolean"},"rushing_tds":{"description":"Number of rushing touchdowns","example":2,"type":"integer"},"passing_air_yards":{"description":"Total air yards on pass attempts","example":250,"type":"integer"},"punt_average":{"description":"Average yards per punt","example":12.3,"type":"number"},"field_goals_blocked":{"description":"Number of field goals blocked","example":5,"type":"integer"},"created_reception":{"description":"Whether the receiver created the reception through an exceptional play","example":"example_value","type":"boolean"},"shotgun":{"description":"Plays run from shotgun formation","example":5,"type":"integer"},"kickoff_attempts":{"description":"Total kickoff attempts","example":15,"type":"integer"},"yards_after_contact":{"description":"Yards gained after contact","example":250,"type":"integer"},"kickoff_onside_attempts":{"description":"Onside kick attempts","example":15,"type":"integer"},"receiving_tds_40_plus_yards":{"description":"Receiving touchdowns of 40+ yards","example":250,"type":"integer"},"catchable_ball":{"description":"Whether the targeted receiver's pass was catchable","example":"example_value","type":"boolean"},"passing_longest_touchdown":{"description":"Longest touchdown pass","example":5,"type":"integer"},"separation_yards":{"description":"Separation distance in yards from defender","example":12.3,"type":"number"},"spread":{"description":"Point spread for betting","example":12.3,"type":"number"},"draftkings_ownership":{"description":"DraftKings ownership percentage","example":12.3,"type":"number"},"conversion_receiving_successes":{"description":"Two-point conversion receiving successes","example":5,"type":"integer"},"extra_points_made":{"description":"Number of extra points made","example":5,"type":"integer"},"blocked_kick_return_yards":{"description":"Yards gained on blocked kick returns","example":250,"type":"integer"},"passing_completions_allowed":{"description":"Passing completions allowed by defense","example":10,"type":"integer"},"interception_return_touchdowns":{"description":"Touchdowns scored on interception returns","example":5,"type":"integer"},"successful_rush_attempts":{"description":"Number of successful rushing attempts","example":15,"type":"integer"},"passing_20_plus":{"description":"Passing completions of 20+ yards","example":5,"type":"integer"},"broken_tackles":{"description":"Number of broken tackles","example":5,"type":"integer"},"conversion_receiving_attempts":{"description":"Two-point conversion receiving attempts","example":15,"type":"integer"},"deep_receptions":{"description":"Deep receptions (20+ yards)","example":5,"type":"integer"},"misc_assisted_tackles":{"description":"Assisted tackles made on change-of-possession plays (interception and fumble returns)","example":5,"type":"integer"},"rushing_yards_100_plus":{"description":"Number of 100+ yard rushing games","example":250,"type":"integer"},"draftkings_fantasy_points":{"description":"DraftKings fantasy points","example":18.5,"type":"number"},"challenges_used":{"description":"Number of challenges used","example":5,"type":"integer"},"blitzes_faced":{"description":"Number of blitzes faced","example":5,"type":"integer"},"punt_attempts":{"description":"Number of punt attempts","example":15,"type":"integer"},"penalty_first_downs":{"description":"First downs gained via opponent penalties","example":5,"type":"integer"},"declared_inactive":{"description":"Player was on the officially declared inactive list for this game","example":"example_value","type":"boolean"},"kneels":{"description":"Number of quarterback kneels","example":5,"type":"integer"},"fantasy_points_half_ppr":{"description":"Fantasy points in half-PPR scoring","example":18.5,"type":"number"}},"type":"object"},"team_id":{"description":"Team the player was representing during this play","format":"uuid","type":"string"}},"type":"object"},"seconds_remaining":{"description":"Seconds remaining in period when play started (inherited from Play)","type":"integer"},"source":{"description":"Data provider source for this player-play statistic","type":"string"},"team_id":{"description":"Team this play stat belongs to","type":"string"},"tenant_id":{"description":"Client tenant accessing this player statistic data","format":"uuid","type":"string"},"time_on_clock":{"description":"Game clock time when play occurred (inherited from Play)","type":"string"},"updated_at":{"description":"Most recent update to this player's play involvement data","format":"date-time","type":"string"}},"required":["common_model_id","player_id","play_number","event_id"],"title":"PlayStat","type":"object"}}},"description":"Play Stats Response"}},"summary":"List Play Stats For Event","tags":["Stats & Data","Reference"]}},"/api/v1/markets/{id}":{"get":{"callbacks":{},"operationId":"ApiRestWeb.MarketController.show","parameters":[{"description":"Market ID (UUID)","example":"01c7133f-2999-4803-9872-8c2ab1ba63ac","in":"path","name":"id","required":true,"schema":{"type":"string"}},{"description":"Include source mappings from the specific integration (i.e. a provider key) will return a source_mappings object with the mappings for the respective objects","in":"query","name":"return_source_id_format","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"description":"A betting market represents a specific wagering opportunity associated with a sporting event.\n\nMarkets define the framework for betting by establishing what can be wagered on, such as\ngame outcomes, player performances, or statistical achievements. Each market contains\nmultiple outcomes that bettors can choose from, with associated odds from various sportsbooks.\n\n## Market Standardization\n\nAll market data undergoes a comprehensive standardization process to ensure consistency\nacross data providers:\n\n### Name Standardization\nMarket names are standardized using our MarketTypesRegistry:\n- **Raw Provider**: `market_id: \"market_8010\", name: \"winning margin\"`\n- **Standardized**: `name: \"1st Half Winning Margin\"` (from registry display_name)\n\n### Market Type Classification\nMarkets are classified into standardized types:\n- **Moneyline**: Game winner (home/away)\n- **Point Spread**: Handicap betting with point advantages\n- **Total Points**: Over/under betting on combined scores\n- **Player Props**: Individual player performance metrics\n- **Team Props**: Team-specific statistical achievements\n\n## Market Types\n- **Game Outcomes**: Moneyline (winner), point spreads, totals (over/under)\n- **Player Props**: Individual player statistics (passing yards, points scored)\n- **Team Props**: Team-specific achievements (total touchdowns, team assists)\n- **Game Props**: Event-specific occurrences (first scorer, longest field goal)\n- **Futures**: Long-term bets (championship winners, season awards)\n\n## Market Structure\n- **Primary Markets**: Main betting options (moneyline, spread, total)\n- **Alternate Lines**: Non-standard lines offering different risk/reward\n- **Live Markets**: In-game betting opportunities that update during play\n- **Future Markets**: Season-long or tournament-wide betting opportunities\n\n## Key Relationships\n- **Event**: Most markets tied to specific games/matches\n- **Outcomes**: Multiple betting options within each market\n- **Odds**: Current betting lines from various sportsbooks\n- **Sportsbooks**: Multiple operators offering odds on the same market\n\n## Performance Optimized Response\n\nWhen `include_outcomes_and_odds=true` is specified, the API returns an optimized flattened structure\nfor improved performance. This structure reduces response time by approximately 80% compared to\nthe standard nested structure.\n\n### Optimized Structure\n```json\n{\n  \"market_id\": \"5c4e8fe4-5bc9-49e1-aa84-aaa975900703\",\n  \"market_name\": \"Moneyline\",\n  \"market_status\": \"active\",\n  \"market_type\": \"moneyline\",\n  \"market_updated_at\": \"2024-01-15T20:30:00Z\",\n  \"outcomes\": [\n    {\n      \"outcome_id\": \"abc123\",\n      \"outcome_name\": \"Team A\",\n      \"outcome_selection\": \"Team A\",\n      \"outcome_line\": null,\n      \"outcome_status\": \"ACTIVE\",\n      \"odds\": [\n        {\n          \"odds_id\": \"def456\",\n          \"odds_price\": -110,\n          \"odds_price_type\": \"american\",\n          \"odds_sportsbook\": \"draftkings\",\n          \"odds_is_main\": true,\n          \"odds_aggregator\": \"sportsstack\"\n        }\n      ]\n    }\n  ]\n}\n```\n\n### Performance Benefits\n- **Query Time**: Reduced from 536ms to ~386ms (28% improvement)\n- **Render Time**: Reduced from 4.8s to ~500ms (90% improvement)\n- **Total Response Time**: Reduced from 6.1s to ~1.2s (80% improvement)\n- **Database Load**: Single optimized query instead of multiple queries\n- **Memory Usage**: Efficient flattened structure with reduced nesting\n","example":{"canonical_status":"open","common_model_id":"123e4567-e89b-12d3-a456-426614174010","is_main":true,"market_type_id":null,"metadata":{"source":"draftkings","source_event_id":"30568865","source_market_id":"DraftKings-30568865-h2h"},"name":"(0dac14546d6008893a8b3b6c417472a6) DraftKings - 30568865 - h2h","status":"active","timestamp":"2024-09-10T14:30:00Z"},"properties":{"actual_scope":{"description":"Proven native contract scope, independent of the compatibility endpoint.","enum":["event","race","session","tournament","round","season"],"nullable":true,"type":"string"},"canonical_status":{"description":"Canonical market status (SS-2270), derived from the raw provider-native\n`status` string via a fixed open|suspended|resolved mapping. `null` when\nthe provider never sets a status (e.g. some aggregators) or writes\na value outside the known vocabulary — this field never guesses.\n","enum":["open","suspended","resolved"],"nullable":true,"type":"string"},"common_model_id":{"description":"Market ID","type":"string"},"event_id":{"description":"Event ID","type":"string"},"future_type":{"description":"Future type (if applicable)","type":"string"},"inserted_at":{"description":"Timestamp of creation","format":"date-time","type":"string"},"is_future":{"description":"Whether this is a future market","type":"boolean"},"is_main":{"description":"Whether this is a main vs alternate market","type":"boolean"},"league_id":{"description":"League ID","format":"uuid","type":"string"},"market_type":{"description":"Market type","type":"string"},"market_type_id":{"description":"Market type ID","type":"string"},"metadata":{"description":"Metadata. For prediction markets (Kalshi, Polymarket, Predict.fun, Limitless) this includes an \"execution\" block with the identifiers needed to place a trade on the originating venue: venue, condition_id, neg_risk, tick_size, venue contract addresses, slug and url. See the Prediction-Market Execution integration guide.","type":"object"},"name":{"description":"Name","type":"string"},"outcomes":{"description":"Outcomes","items":{"description":"A specific betting outcome within a market, representing one possible result that bettors can wager on.\n\n## Outcome Standardization\n\nOutcomes undergo market-type-specific standardization to ensure consistent field formats:\n\n### Total Points Markets (Over/Under)\n```\nname: \"Over 228.5\"              # Human-readable with line value\nline: 228.5                     # Numeric line value\nselection: nil                  # No specific entity selection\nselection_line: \"over\"          # Direction (over/under)\nnormalized_selection: nil       # No entity to normalize\ngrouping_key: \"default:-228.5\" # Groups over/under for same line\n```\n\n### Point Spread Markets (Handicap)\n```\nname: \"Indiana Pacers +11\"           # Team name + formatted spread\nline: 11.0                           # Absolute line value\nselection: \"Indiana Pacers\"          # Team name\nselection_line: nil                  # Not applicable for spreads\nnormalized_selection: \"indiana_pacers\" # Lowercase, underscores\ngrouping_key: \"default:-11.0\"       # Groups home/away for same spread\n```\n\n### Moneyline Markets (Winner)\n```\nname: \"Oklahoma City Thunder\"               # Team name\nline: nil                                   # No line for moneyline\nselection: \"Oklahoma City Thunder\"          # Team name\nselection_line: nil                         # Not applicable\nnormalized_selection: \"oklahoma_city_thunder\" # Lowercase, underscores\ngrouping_key: \"default:Oklahoma City Thunder\" # Groups by team\n```\n\n### Field Standardization\n- **name**: Human-readable outcome description with context\n- **selection**: Entity being selected (team/player name or null)\n- **normalized_selection**: Lowercase, underscore-separated for consistent querying\n- **line**: Numeric betting line (spread/total value, null for moneyline)\n- **selection_line**: Direction for totals (\"over\"/\"under\"), null otherwise\n- **grouping_key**: Groups related outcomes (same spread/total different sides)\n","example":{"common_model_id":"123e4567-e89b-12d3-a456-426614174010","event_id":"30568865","grouping_key":"DraftKings-30568865-h2h","inserted_at":"2024-09-10T14:30:00Z","is_alternate_line":false,"is_main":true,"line":1.5,"market_id":"123e4567-e89b-12d3-a456-426614174011","market_type":"h2h","metadata":{"source":"draftkings","source_event_id":"30568865","source_market_id":"DraftKings-30568865-h2h"},"name":"DraftKings - 30568865 - h2h - Seattle Seahawks","normalized_selection":"Seattle Seahawks","player_id":"59291391-0c7e-442b-9496-33074647384e","selection":"Seattle Seahawks","selection_line":"1.5","stat_type":"points","status":"active","team_id":"58e8c89b-72f8-4427-adbc-10f193c9b462","tenant_id":"ff6332b6-8151-4a13-b20c-bd7b2ab45452","updated_at":"2024-09-11T09:15:00Z"},"properties":{"common_model_id":{"description":"Market ID","type":"string"},"event_id":{"description":"Event ID","type":"string"},"grouping_key":{"description":"Grouping Key","type":"string"},"inserted_at":{"description":"Timestamp of creation","format":"date-time","type":"string"},"is_alternate_line":{"description":"Is Alternate Line","type":"boolean"},"is_main":{"description":"Is Main","type":"boolean"},"line":{"description":"Line (if applicable)","type":"number"},"market_id":{"description":"Market ID","type":"string"},"market_type":{"description":"Market Type","type":"string"},"metadata":{"description":"Metadata. For prediction markets this includes an \"execution\" block carrying the trade-execution identifiers for the originating venue (venue, ticker/token_id, side, condition_id, neg_risk, tick_size, venue contracts, url). See the Prediction-Market Execution integration guide.","type":"object"},"name":{"description":"Name","type":"string"},"normalized_selection":{"description":"Normalized Selection","type":"string"},"odds":{"description":"Odds","items":{"description":"Betting odds from a specific sportsbook for a particular outcome, representing the price and probability.\n\n## Odds Standardization\n\nOdds undergo standardization to ensure consistent pricing representation and source attribution:\n\n### Source Selection Name Standardization\nThe `source_selection_name` field identifies what the sportsbook is offering odds on:\n\n#### Total Points Markets\n```\nsource_selection_name: nil  # No specific team/player selection\n```\n\n#### Point Spread Markets\n```\nsource_selection_name: \"Indiana Pacers\"     # Team receiving the spread\n# Derived from event.participants based on outcome selection\n```\n\n#### Moneyline Markets\n```\nsource_selection_name: \"Oklahoma City Thunder\"  # Team to win\n# Derived from event.participants based on outcome selection\n```\n\n### Price Standardization\n- **price**: Standardized to American odds format (-110, +150, etc.)\n- **price_type**: Always \"american\" for consistency\n- **timestamp**: UTC timestamp when current odds were observed. When the\n  response comes from the durable line-summary fallback, this is the time\n  the returned closing price last changed; same-price provider\n  reaffirmations do not advance it.\n\n### Sportsbook Attribution\n- **sportsbook**: Standardized sportsbook name (DraftKings, FanDuel, etc.)\n- **aggregator**: Upstream provider key or `sportsstack` for the canonical SportsStack board\n- **aggregator_event_id**: Provider's event identifier for traceability\n\n### Historical Tracking\nOdds include both current and opening lines for trend analysis:\n- Current odds: Real-time pricing from sportsbooks\n- Opening odds: Initial lines when market opened\n- Movement tracking: Compare current vs opening for line movement insights\n","example":{"aggregator":"sportsstack","aggregator_event_id":null,"fetched_at":"2026-04-21T17:40:00Z","metadata":{"aggregator":"sportsstack","id":"0HC75256377P350_1","link":"https://sportsbook.draftkings.com/event/30568865?outcomes=0HC75256377P350_1","selected_source":"example_provider.football.nfl","selection_reason":"trust_then_freshness","selection_tier":1,"source":"sportsstack","source_event_id":"30568865","source_market_id":"DraftKings-30568865-spreads","sportsstack_kind":"canonical_book_quote"},"price":-110,"price_type":"american","source_event_id":"30568865","source_id":"0HC75256377P350_1","source_market_id":"DraftKings-30568865-spreads","source_selection_id":"0HC75256377P350_1","source_selection_name":"Seattle Seahawks","sportsbook":"draftkings"},"properties":{"aggregator":{"description":"Upstream provider name or 'sportsstack' for the canonical SportsStack sportsbook board","type":"string"},"aggregator_event_id":{"description":"Aggregator event ID","type":"string"},"canonical_outcome_id":{"description":"Verified cross-venue economic outcome ID. Null when outcome equivalence is unresolved, push-capable, three-way, or ambiguous.","format":"uuid","nullable":true,"type":"string"},"clock_provenance":{"properties":{"evaluated_at":{"format":"date-time","type":"string"},"max_age_seconds":{"enum":[300],"type":"integer"},"quote_provenance":{"description":"Unmodified retained JSON provenance, including legacy or malformed evidence.","nullable":true},"source":{"enum":["timestamp",null],"nullable":true,"type":"string"}},"type":"object"},"common_model_id":{"description":"Market ID","type":"string"},"deep_link":{"description":"Desktop sportsbook deep link URL","type":"string"},"execution_readiness":{"description":"Requires exact native source-ID binding, active parent/outcome lifecycle and proven fresh provider clock; not order-fill certification. ProphetX additionally requires one atomic native strike/price/size/time observation matching its documented submit-order fields. ready=null means unknown. Native IDs remain separate from common_model_id.","example":{"available_size":{"state":"unknown","value":null},"depth":{"state":"unknown","value":null},"executable":{"reason":"catalog_is_not_a_book","state":"unknown"},"identifiers_valid":true,"liquidity":{"state":"unknown","value":null},"ready":null,"reasons":["provider_clock_provenance_downgrade"],"scope":"outcome_identifiers_and_provider_clock","venue":"limitless"},"properties":{"available_size":{"additionalProperties":true,"description":"Retained evidence; absent measurements have state unknown and value null.","type":"object"},"depth":{"additionalProperties":true,"description":"Retained evidence; absent measurements have state unknown and value null.","type":"object"},"executable":{"additionalProperties":true,"description":"Retained evidence; absent measurements have state unknown and value null.","type":"object"},"identifiers_valid":{"type":"boolean"},"liquidity":{"additionalProperties":true,"description":"Retained evidence; absent measurements have state unknown and value null.","type":"object"},"ready":{"nullable":true,"type":"boolean"},"reasons":{"items":{"type":"string"},"type":"array"},"scope":{"enum":["outcome_identifiers_and_provider_clock"],"type":"string"},"venue":{"type":"string"}},"type":"object"},"fetched_at":{"description":"Timestamp when SportsStack fetched or observed this quote","format":"date-time","nullable":true,"type":"string"},"freshness_reasons":{"description":"Deterministic provider_clock_* or lifecycle_* reasons; empty when fresh.","items":{"type":"string"},"type":"array"},"inserted_at":{"description":"Timestamp of creation","format":"date-time","type":"string"},"line_alignment":{"description":"SS main-line ladder plan Phase D. Present only for event-scoped, `latest_only=true` `/v1/odds` requests (`event_id` given) -- the key itself is absent from the response row (not present with a null body) for non-event-scoped `league_id`/list requests, since computing it there would mean an unbounded per-request ladder fetch across many events. Read-time derived from CommonModel.Betting.PredictionMarkets.LineLadder; never renames, removes, or reinterprets the sibling `is_main` field (the stored, write-time value) -- purely additive. All three sub-fields are null together when this row was not matched into a ranked ladder slot (e.g. a moneyline row, which has no alt-strike ladder, or a real-sportsbook row, which LineLadder never covers).","example":{"alignment_group":{"family":"spread","market_type":"point_spread","side":{"sign":"negative","team_id":null}},"is_main_derived":true,"sibling_line_count":2},"nullable":true,"properties":{"alignment_group":{"additionalProperties":true,"description":"The {market_type, family, side} ladder slot this row was matched into.","nullable":true,"type":"object"},"is_main_derived":{"description":"Whether LineLadder derived this row as the closest-to-even main line for its venue/slot, independent of the stored `is_main` column.","nullable":true,"type":"boolean"},"sibling_line_count":{"description":"Number of lines this row's own venue quotes within the same ladder slot.","nullable":true,"type":"integer"}},"type":"object"},"metadata":{"additionalProperties":true,"description":"Metadata. For prediction markets this includes an \"execution\" block carrying the trade-execution identifiers for the originating venue (venue, ticker/token_id, side, condition_id, neg_risk, tick_size, venue contracts, url). See the Prediction-Market Execution integration guide. UFC conditional markets expose \"probability_semantics\": \"conditional\", a structured \"condition\" object, and a plain-language \"void_condition\".","properties":{"condition":{"additionalProperties":true,"nullable":true,"properties":{"fight_result":{"description":"Fight-result condition for a conditional UFC market.","enum":["finish","decision"],"type":"string"},"round":{"description":"Optional round constraint for the conditional market.","minimum":1,"nullable":true,"type":"integer"}},"required":["fight_result"],"type":"object"},"probability_semantics":{"description":"Set to \"conditional\" when this price is conditional on the described fight result.","enum":["conditional"],"nullable":true,"type":"string"},"void_condition":{"description":"Plain-language condition under which a conditional UFC market is voided.","nullable":true,"type":"string"}},"type":"object"},"mobile_deep_link":{"description":"Mobile/native app deep link URL","type":"string"},"outcome_id":{"description":"Venue-backed SportsStack outcome ID","type":"string"},"platform_observed_at":{"description":"Prediction quotes only. Row observed_at, independently of provider freshness.","format":"date-time","nullable":true,"type":"string"},"price":{"description":"Price","type":"number"},"price_type":{"description":"Price format ('decimal', 'american')","type":"string"},"provider_freshness":{"description":"Prediction quotes only. Fresh requires a proven nonfuture provider clock at most 300 seconds old and proven active exact-parent/outcome lifecycle. Standalone odds report unknown without lifecycle proof.","enum":["fresh","stale","unknown"],"type":"string"},"provider_observed_at":{"description":"Prediction quotes only. Authoritative provider quote timestamp; never receipt/observation time. Requires matching observed quote_provenance.provider_updated_at; null for absent, synthetic or downgraded authority.","format":"date-time","nullable":true,"type":"string"},"reference_alignment":{"description":"Present only on crypto odds rows (omitted on sports rows; `line_alignment` is the\nsports ladder analogue and is omitted on crypto rows). `alignment` is `exact` (this\nmarket spans two or more venues), `single_venue`, or `unverified_mirror`.\n`different_reference_market_ids` lists the OTHER `market_id`s of the same window\n(any reference source), symmetrically.\n","properties":{"alignment":{"enum":["exact","single_venue","unverified_mirror"],"type":"string"},"alignment_group":{"description":"The window (event) id.","format":"uuid","type":"string"},"different_reference_market_ids":{"items":{"format":"uuid","type":"string"},"type":"array"},"reference_source":{"type":"string"},"tie_rule":{"enum":["up","split"],"type":"string"},"venue_count":{"minimum":1,"type":"integer"}},"title":"CryptoReferenceAlignment","type":"object"},"sgp_token":{"description":"Opaque same-game-parlay token supplied by the sportsbook. Null when the provider does not offer one.","nullable":true,"type":"string"},"source_event_id":{"description":"Source event ID","type":"string"},"source_id":{"description":"Source ID","type":"string"},"source_market_id":{"description":"Source market ID","type":"string"},"source_selection_id":{"description":"Source selection ID","type":"string"},"source_selection_name":{"description":"Source selection name","type":"string"},"sportsbook":{"description":"Sportsbook","type":"string"},"timestamp":{"description":"Provider quote timestamp","format":"date-time","nullable":true,"type":"string"},"trading_fees":{"description":"Prediction quotes only (absent on sportsbook rows and on venues whose fees are not captured yet: Limitless, ProphetX, Polymarket US, SX Bet). Computed at read time; no order-fill or account-specific guarantee (per-account discounts, maker rebates and balance-precision rounding are not modelled). Kalshi: rates from a versioned snapshot of Kalshi's public series metadata, event fee overrides and fee schedule; `observed_at` is the snapshot time. Series with event-level fee overrides (MLB) resolve per event: an override in force reports `scope: event` (with `event_ticker`, `effective_from`), before its `scheduled_ts` the series fee is reported with the pending change under `scheduled_override`, and an event missing from the snapshot reports `unknown` (`event_fee_override_not_in_snapshot`). Predict.fun: derived from the stored market `fee_rate_bps`; `observed_at` is the quote observation time. Polymarket: the market's own Gamma `feesEnabled`/`feeSchedule` captured with the quote (`fee = shares x rate x P x (1 - P)`, taker only, makers pay nothing; `maker.rebate_rate` is the fraction of taker fees returned to makers through a daily rebate program, not a per-fill credit; fees round to 5 decimal places with no published direction, so `rounding.direction` is absent); `observed_at` is the quote observation time, and quotes whose fee data is missing, has an exponent other than 1, or is not taker-only report `unknown`. The rate is per market (`sports_fees_v3` 0.05, `sports_fees_v2` 0.03, `zero_fees` 0 are all live on sports), never a category default.","example":{"availability":"published","charge_basis":"fill","fee_multiplier":1.0,"fee_type":"quadratic_with_maker_fees","maker":{"exponent":1,"model":"quadratic","multiplier":1.0,"rate":0.0175,"rounding":{"applies_to":"fee_plus_position_cost","direction":"up","increment":0.0001}},"observed_at":"2026-09-30T15:33:45Z","scope":"series","series_ticker":"KXNBAGAME","source":"kalshi_series_snapshot","taker":{"exponent":1,"model":"quadratic","multiplier":1.0,"rate":0.07,"rounding":{"applies_to":"fee_plus_position_cost","direction":"up","increment":0.0001}}},"properties":{"availability":{"enum":["published","unavailable","unknown"],"type":"string"},"charge_basis":{"description":"Fees are charged per fill, not per order or per settlement.","enum":["fill"],"type":"string"},"effective_from":{"description":"Kalshi, `scope: event`: the override's `scheduled_ts`, from which these rates apply.","format":"date-time","type":"string"},"event_ticker":{"description":"Kalshi: the market ticker minus its last `-` segment. Present for series with event-level fee overrides.","type":"string"},"fee_multiplier":{"type":"number"},"fee_rate_bps":{"type":"integer"},"fee_type":{"type":"string"},"fees_enabled":{"description":"Polymarket: the market's Gamma `feesEnabled` flag.","type":"boolean"},"maker":{"description":"One side of the fee. `quadratic`: fee = rate x contracts x (P x (1 - P)) ^ exponent. `linear_min_price`: fee = rate x min(P, 1 - P) x shares. `none`: no fee. `rate` already includes any venue multiplier.","properties":{"exponent":{"type":"integer"},"formula":{"type":"string"},"model":{"enum":["quadratic","linear_min_price","none"],"type":"string"},"multiplier":{"type":"number"},"rate":{"type":"number"},"rebate_rate":{"description":"Polymarket maker side: fraction of taker fees rebated to resting makers by the daily rebate program (context only, not a per-fill credit).","type":"number"},"rounding":{"properties":{"applies_to":{"type":"string"},"direction":{"enum":["up"],"type":"string"},"increment":{"type":"number"}},"type":"object"}},"type":"object"},"observed_at":{"format":"date-time","nullable":true,"type":"string"},"reason":{"description":"Present when availability is unknown; deterministic snake_case reason.","type":"string"},"scheduled_override":{"description":"Kalshi, `scope: series`: an event-level override that is not yet in force. Charged from `effective_from`; carries `fee_type`, `fee_multiplier`, `taker` and `maker` like the top-level object.","properties":{"effective_from":{"format":"date-time","type":"string"},"fee_multiplier":{"type":"number"},"fee_type":{"type":"string"},"maker":{"description":"One side of the fee. `quadratic`: fee = rate x contracts x (P x (1 - P)) ^ exponent. `linear_min_price`: fee = rate x min(P, 1 - P) x shares. `none`: no fee. `rate` already includes any venue multiplier.","properties":{"exponent":{"type":"integer"},"formula":{"type":"string"},"model":{"enum":["quadratic","linear_min_price","none"],"type":"string"},"multiplier":{"type":"number"},"rate":{"type":"number"},"rebate_rate":{"description":"Polymarket maker side: fraction of taker fees rebated to resting makers by the daily rebate program (context only, not a per-fill credit).","type":"number"},"rounding":{"properties":{"applies_to":{"type":"string"},"direction":{"enum":["up"],"type":"string"},"increment":{"type":"number"}},"type":"object"}},"type":"object"},"taker":{"description":"One side of the fee. `quadratic`: fee = rate x contracts x (P x (1 - P)) ^ exponent. `linear_min_price`: fee = rate x min(P, 1 - P) x shares. `none`: no fee. `rate` already includes any venue multiplier.","properties":{"exponent":{"type":"integer"},"formula":{"type":"string"},"model":{"enum":["quadratic","linear_min_price","none"],"type":"string"},"multiplier":{"type":"number"},"rate":{"type":"number"},"rebate_rate":{"description":"Polymarket maker side: fraction of taker fees rebated to resting makers by the daily rebate program (context only, not a per-fill credit).","type":"number"},"rounding":{"properties":{"applies_to":{"type":"string"},"direction":{"enum":["up"],"type":"string"},"increment":{"type":"number"}},"type":"object"}},"type":"object"}},"type":"object"},"scope":{"enum":["series","event","market"],"type":"string"},"series_ticker":{"type":"string"},"source":{"description":"kalshi_series_snapshot | kalshi_event_fee_snapshot | kalshi_fee_schedule_default | venue_record. `kalshi_event_fee_snapshot` is a Kalshi event-level override in force; `kalshi_fee_schedule_default` is the schedule default (quadratic x 1) inferred for a KX series not in the exception snapshot.","type":"string"},"taker":{"description":"One side of the fee. `quadratic`: fee = rate x contracts x (P x (1 - P)) ^ exponent. `linear_min_price`: fee = rate x min(P, 1 - P) x shares. `none`: no fee. `rate` already includes any venue multiplier.","properties":{"exponent":{"type":"integer"},"formula":{"type":"string"},"model":{"enum":["quadratic","linear_min_price","none"],"type":"string"},"multiplier":{"type":"number"},"rate":{"type":"number"},"rebate_rate":{"description":"Polymarket maker side: fraction of taker fees rebated to resting makers by the daily rebate program (context only, not a per-fill credit).","type":"number"},"rounding":{"properties":{"applies_to":{"type":"string"},"direction":{"enum":["up"],"type":"string"},"increment":{"type":"number"}},"type":"object"}},"type":"object"}},"type":"object"},"updated_at":{"description":"Timestamp when SportsStack last wrote this row","format":"date-time","type":"string"}},"required":["common_model_id","name"],"title":"Odds","type":"object"},"type":"array"},"player_id":{"description":"Player ID","type":"string"},"selection":{"description":"Selection","type":"string"},"selection_line":{"description":"Selection Line","type":"string"},"stat_type":{"description":"Stat type (if applicable)","type":"string"},"status":{"description":"Status","type":"string"},"team_id":{"description":"Team ID","type":"string"},"tenant_id":{"description":"Tenant ID","type":"string"},"updated_at":{"description":"Timestamp of last update","format":"date-time","type":"string"}},"required":["common_model_id","name"],"title":"Outcome","type":"object"},"type":"array"},"sport_id":{"description":"Sport ID","format":"uuid","type":"string"},"start_date":{"description":"Start date (if applicable)","format":"date-time","type":"string"},"updated_at":{"description":"Timestamp of last update","format":"date-time","type":"string"}},"required":["common_model_id","name"],"title":"Market","type":"object"}}},"description":"Success"},"400":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"bad_request","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/bad_request","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Bad Request"}},"summary":"Show Market","tags":["Betting"]}},"/api/v1/futures":{"get":{"callbacks":{},"description":"Retrieve future markets (tournament outrights, season totals, etc.).\n\nFuture markets are separate from event-scoped markets and include:\n- Tournament outrights (e.g., \"NFL Super Bowl Winner\")\n- Season totals (e.g., \"Team Win Total\")\n- Player props (e.g., \"MVP Winner\")\n\nUse `include_outcomes=true` to include outcomes and their current,\ntenant-visible venue quotes for each market in the response.\n\nDiscovery flow: `GET /sports` -> `GET /leagues` (each league item carries\n`futures_count`) -> `GET /futures?league_id=<abbr>&season_year=<year>&aggregator=<venue>`.\n`season_year`, `aggregator` and `status` (`active|closed`) narrow the list\nthe way they do on `GET /events`; an unsupported value is a 400, never\nsilently ignored.\n","operationId":"ApiRestWeb.FuturesController.index","parameters":[{"description":"Filter by league ID — accepts a UUID or league abbreviation (e.g., 'NFL', 'NBA')","in":"query","name":"league_id","required":false,"schema":{"type":"string"}},{"description":"Filter by tournament ID (UUID)","in":"query","name":"tournament_id","required":false,"schema":{"type":"string"}},{"description":"Filter by market type ID (UUID)","in":"query","name":"market_type_id","required":false,"schema":{"type":"string"}},{"description":"Filter by future type (e.g., 'tournament_outright', 'season_total')","in":"query","name":"future_type","required":false,"schema":{"type":"string"}},{"description":"Filter by season year. A future market has no season column, so this matches the season token of its canonical family key (`future|<league>|<season>|<type>|<subject>`, e.g. `future|nba|2027|championship|league` is season 2027). Markets without a family key never match. The token is the classifier's own season, not derived from `start_date`.","in":"query","name":"season_year","required":false,"schema":{"example":2027,"type":"integer"}},{"description":"Only futures that currently have a priced, tenant-visible quote from this venue (for example kalshi or polymarket). Same venue set as `GET /v1/events?aggregator=`. One value only: a comma-separated list returns 400; send one request per venue.","in":"query","name":"aggregator","required":false,"schema":{"enum":["kalshi","polymarket","predict_fun","limitless","prophetx","polymarket_us","sxbet","predictfun"],"example":"kalshi","type":"string"}},{"description":"Filter by lifecycle. `active` is a market whose status is active, open or trading; `closed` is every other status (closed, settled, resolved, or missing), so the two partition the catalog. Judged on the served row.","in":"query","name":"status","required":false,"schema":{"enum":["active","closed"],"example":"active","type":"string"}},{"description":"Include outcomes and current venue quotes for each market (true/false, default: false)","in":"query","name":"include_outcomes","required":false,"schema":{"type":"boolean"}},{"description":"Page number for page/per_page pagination. Do not combine with limit/offset.","in":"query","name":"page","required":false,"schema":{"default":1,"minimum":1,"type":"integer"}},{"description":"Number of items per page (max 1000). Do not combine with limit/offset.","in":"query","name":"per_page","required":false,"schema":{"default":50,"maximum":1000,"minimum":1,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"items":{"description":"A contract served through the futures compatibility route. actual_scope identifies race, session, tournament, round, or season meaning when proven.","example":{"common_model_id":"123e4567-e89b-12d3-a456-426614174000","future_type":"championship","league_id":"123e4567-e89b-12d3-a456-426614174001","name":"2026 FIFA World Cup Winner","outcomes":[],"status":"active","tradeable":false,"untradeable_reasons":["insufficient_outcomes"]},"properties":{"actual_scope":{"description":"Native contract scope; null means unknown, independent of storage route.","enum":["event","race","session","tournament","round","season"],"nullable":true,"type":"string"},"common_model_id":{"format":"uuid","type":"string"},"future_type":{"nullable":true,"type":"string"},"inserted_at":{"format":"date-time","nullable":true,"type":"string"},"league_id":{"format":"uuid","nullable":true,"type":"string"},"market_type_id":{"format":"uuid","nullable":true,"type":"string"},"metadata":{"nullable":true,"type":"object"},"name":{"type":"string"},"outcomes":{"description":"Included only when include_outcomes=true","items":{"properties":{"common_model_id":{"format":"uuid","type":"string"},"execution":{"additionalProperties":true,"description":"Venue-keyed execution blocks (`{\"kalshi\": {...}, \"polymarket\": {...}}`, the same shape event odds carry under metadata.execution) unioned from this outcome's quotes. Unlike metadata.execution, which holds one venue on a cross-venue outcome, this lists every venue that currently quotes the outcome. Empty when no quote carries a block.","type":"object"},"grouping_key":{"nullable":true,"type":"string"},"inserted_at":{"format":"date-time","nullable":true,"type":"string"},"is_main":{"nullable":true,"type":"boolean"},"line":{"nullable":true,"type":"number"},"metadata":{"description":"Provider metadata. For prediction markets this includes the \"execution\" block carrying the identifiers needed to place a trade on the originating venue (venue, ticker/token_id, condition_id, neg_risk, tick_size, venue contracts, url).","nullable":true,"type":"object"},"name":{"type":"string"},"normalized_selection":{"nullable":true,"type":"string"},"odds":{"description":"Current tenant-visible quotes for this canonical outcome, one per venue/position.","items":{"properties":{"aggregator":{"type":"string"},"canonical_outcome_id":{"description":"Cross-venue outcome identity; present only when the outcome identity is verified (same rule as GET /v1/odds), otherwise null. Never a per-venue fallback.","format":"uuid","nullable":true,"type":"string"},"clock_provenance":{"properties":{"evaluated_at":{"format":"date-time","type":"string"},"max_age_seconds":{"enum":[300],"type":"integer"},"quote_provenance":{"description":"Unmodified retained JSON provenance, including legacy or malformed evidence.","nullable":true},"source":{"enum":["timestamp",null],"nullable":true,"type":"string"}},"type":"object"},"common_model_id":{"format":"uuid","type":"string"},"deep_link":{"nullable":true,"type":"string"},"event_id":{"description":"Always null for a future market; present for parity with GET /v1/odds.","format":"uuid","nullable":true,"type":"string"},"execution_readiness":{"description":"Requires exact native source-ID binding, active parent/outcome lifecycle and proven fresh provider clock; not order-fill certification. ProphetX additionally requires one atomic native strike/price/size/time observation matching its documented submit-order fields. ready=null means unknown. Native IDs remain separate from common_model_id.","example":{"available_size":{"state":"unknown","value":null},"depth":{"state":"unknown","value":null},"executable":{"reason":"catalog_is_not_a_book","state":"unknown"},"identifiers_valid":true,"liquidity":{"state":"unknown","value":null},"ready":null,"reasons":["provider_clock_provenance_downgrade"],"scope":"outcome_identifiers_and_provider_clock","venue":"limitless"},"properties":{"available_size":{"additionalProperties":true,"description":"Retained evidence; absent measurements have state unknown and value null.","type":"object"},"depth":{"additionalProperties":true,"description":"Retained evidence; absent measurements have state unknown and value null.","type":"object"},"executable":{"additionalProperties":true,"description":"Retained evidence; absent measurements have state unknown and value null.","type":"object"},"identifiers_valid":{"type":"boolean"},"liquidity":{"additionalProperties":true,"description":"Retained evidence; absent measurements have state unknown and value null.","type":"object"},"ready":{"nullable":true,"type":"boolean"},"reasons":{"items":{"type":"string"},"type":"array"},"scope":{"enum":["outcome_identifiers_and_provider_clock"],"type":"string"},"venue":{"type":"string"}},"type":"object"},"fetched_at":{"description":"Timestamp when SportsStack fetched or observed this quote","format":"date-time","nullable":true,"type":"string"},"freshness_reasons":{"description":"Deterministic provider_clock_* or lifecycle_* reasons; empty when fresh.","items":{"type":"string"},"type":"array"},"is_main":{"nullable":true,"type":"boolean"},"limits":{"nullable":true,"type":"object"},"market_id":{"description":"The future market this quote belongs to (its common_model_id, which is the canonical family id for a classified family). Same field as GET /v1/odds.","format":"uuid","nullable":true,"type":"string"},"market_name":{"nullable":true,"type":"string"},"market_type":{"nullable":true,"type":"string"},"metadata":{"description":"Provider quote metadata, including venue execution identifiers.","nullable":true,"type":"object"},"outcome_id":{"description":"The outcome common_model_id this quote is nested under. Same field as GET /v1/odds.","format":"uuid","nullable":true,"type":"string"},"platform_observed_at":{"description":"Prediction quotes only. Row observed_at, independently of provider freshness.","format":"date-time","nullable":true,"type":"string"},"points":{"description":"Line value distinguishing alternate positions, when applicable","nullable":true,"type":"number"},"price":{"type":"number"},"price_type":{"type":"string"},"provider_freshness":{"description":"Prediction quotes only. Fresh requires a proven nonfuture provider clock at most 300 seconds old and proven active exact-parent/outcome lifecycle. Standalone odds report unknown without lifecycle proof.","enum":["fresh","stale","unknown"],"type":"string"},"provider_observed_at":{"description":"Prediction quotes only. Authoritative provider quote timestamp; never receipt/observation time. Requires matching observed quote_provenance.provider_updated_at; null for absent, synthetic or downgraded authority.","format":"date-time","nullable":true,"type":"string"},"selection_line":{"description":"Provider label for the selected line position, when applicable","nullable":true,"type":"string"},"source_id":{"nullable":true,"type":"string"},"source_market_id":{"nullable":true,"type":"string"},"source_selection_id":{"nullable":true,"type":"string"},"sportsbook":{"type":"string"},"timestamp":{"format":"date-time","nullable":true,"type":"string"},"trading_fees":{"description":"Prediction quotes only (absent on sportsbook rows and on venues whose fees are not captured yet: Limitless, ProphetX, Polymarket US, SX Bet). Computed at read time; no order-fill or account-specific guarantee (per-account discounts, maker rebates and balance-precision rounding are not modelled). Kalshi: rates from a versioned snapshot of Kalshi's public series metadata, event fee overrides and fee schedule; `observed_at` is the snapshot time. Series with event-level fee overrides (MLB) resolve per event: an override in force reports `scope: event` (with `event_ticker`, `effective_from`), before its `scheduled_ts` the series fee is reported with the pending change under `scheduled_override`, and an event missing from the snapshot reports `unknown` (`event_fee_override_not_in_snapshot`). Predict.fun: derived from the stored market `fee_rate_bps`; `observed_at` is the quote observation time. Polymarket: the market's own Gamma `feesEnabled`/`feeSchedule` captured with the quote (`fee = shares x rate x P x (1 - P)`, taker only, makers pay nothing; `maker.rebate_rate` is the fraction of taker fees returned to makers through a daily rebate program, not a per-fill credit; fees round to 5 decimal places with no published direction, so `rounding.direction` is absent); `observed_at` is the quote observation time, and quotes whose fee data is missing, has an exponent other than 1, or is not taker-only report `unknown`. The rate is per market (`sports_fees_v3` 0.05, `sports_fees_v2` 0.03, `zero_fees` 0 are all live on sports), never a category default.","example":{"availability":"published","charge_basis":"fill","fee_multiplier":1.0,"fee_type":"quadratic_with_maker_fees","maker":{"exponent":1,"model":"quadratic","multiplier":1.0,"rate":0.0175,"rounding":{"applies_to":"fee_plus_position_cost","direction":"up","increment":0.0001}},"observed_at":"2026-09-30T15:33:45Z","scope":"series","series_ticker":"KXNBAGAME","source":"kalshi_series_snapshot","taker":{"exponent":1,"model":"quadratic","multiplier":1.0,"rate":0.07,"rounding":{"applies_to":"fee_plus_position_cost","direction":"up","increment":0.0001}}},"properties":{"availability":{"enum":["published","unavailable","unknown"],"type":"string"},"charge_basis":{"description":"Fees are charged per fill, not per order or per settlement.","enum":["fill"],"type":"string"},"effective_from":{"description":"Kalshi, `scope: event`: the override's `scheduled_ts`, from which these rates apply.","format":"date-time","type":"string"},"event_ticker":{"description":"Kalshi: the market ticker minus its last `-` segment. Present for series with event-level fee overrides.","type":"string"},"fee_multiplier":{"type":"number"},"fee_rate_bps":{"type":"integer"},"fee_type":{"type":"string"},"fees_enabled":{"description":"Polymarket: the market's Gamma `feesEnabled` flag.","type":"boolean"},"maker":{"description":"One side of the fee. `quadratic`: fee = rate x contracts x (P x (1 - P)) ^ exponent. `linear_min_price`: fee = rate x min(P, 1 - P) x shares. `none`: no fee. `rate` already includes any venue multiplier.","properties":{"exponent":{"type":"integer"},"formula":{"type":"string"},"model":{"enum":["quadratic","linear_min_price","none"],"type":"string"},"multiplier":{"type":"number"},"rate":{"type":"number"},"rebate_rate":{"description":"Polymarket maker side: fraction of taker fees rebated to resting makers by the daily rebate program (context only, not a per-fill credit).","type":"number"},"rounding":{"properties":{"applies_to":{"type":"string"},"direction":{"enum":["up"],"type":"string"},"increment":{"type":"number"}},"type":"object"}},"type":"object"},"observed_at":{"format":"date-time","nullable":true,"type":"string"},"reason":{"description":"Present when availability is unknown; deterministic snake_case reason.","type":"string"},"scheduled_override":{"description":"Kalshi, `scope: series`: an event-level override that is not yet in force. Charged from `effective_from`; carries `fee_type`, `fee_multiplier`, `taker` and `maker` like the top-level object.","properties":{"effective_from":{"format":"date-time","type":"string"},"fee_multiplier":{"type":"number"},"fee_type":{"type":"string"},"maker":{"description":"One side of the fee. `quadratic`: fee = rate x contracts x (P x (1 - P)) ^ exponent. `linear_min_price`: fee = rate x min(P, 1 - P) x shares. `none`: no fee. `rate` already includes any venue multiplier.","properties":{"exponent":{"type":"integer"},"formula":{"type":"string"},"model":{"enum":["quadratic","linear_min_price","none"],"type":"string"},"multiplier":{"type":"number"},"rate":{"type":"number"},"rebate_rate":{"description":"Polymarket maker side: fraction of taker fees rebated to resting makers by the daily rebate program (context only, not a per-fill credit).","type":"number"},"rounding":{"properties":{"applies_to":{"type":"string"},"direction":{"enum":["up"],"type":"string"},"increment":{"type":"number"}},"type":"object"}},"type":"object"},"taker":{"description":"One side of the fee. `quadratic`: fee = rate x contracts x (P x (1 - P)) ^ exponent. `linear_min_price`: fee = rate x min(P, 1 - P) x shares. `none`: no fee. `rate` already includes any venue multiplier.","properties":{"exponent":{"type":"integer"},"formula":{"type":"string"},"model":{"enum":["quadratic","linear_min_price","none"],"type":"string"},"multiplier":{"type":"number"},"rate":{"type":"number"},"rebate_rate":{"description":"Polymarket maker side: fraction of taker fees rebated to resting makers by the daily rebate program (context only, not a per-fill credit).","type":"number"},"rounding":{"properties":{"applies_to":{"type":"string"},"direction":{"enum":["up"],"type":"string"},"increment":{"type":"number"}},"type":"object"}},"type":"object"}},"type":"object"},"scope":{"enum":["series","event","market"],"type":"string"},"series_ticker":{"type":"string"},"source":{"description":"kalshi_series_snapshot | kalshi_event_fee_snapshot | kalshi_fee_schedule_default | venue_record. `kalshi_event_fee_snapshot` is a Kalshi event-level override in force; `kalshi_fee_schedule_default` is the schedule default (quadratic x 1) inferred for a KX series not in the exception snapshot.","type":"string"},"taker":{"description":"One side of the fee. `quadratic`: fee = rate x contracts x (P x (1 - P)) ^ exponent. `linear_min_price`: fee = rate x min(P, 1 - P) x shares. `none`: no fee. `rate` already includes any venue multiplier.","properties":{"exponent":{"type":"integer"},"formula":{"type":"string"},"model":{"enum":["quadratic","linear_min_price","none"],"type":"string"},"multiplier":{"type":"number"},"rate":{"type":"number"},"rebate_rate":{"description":"Polymarket maker side: fraction of taker fees rebated to resting makers by the daily rebate program (context only, not a per-fill credit).","type":"number"},"rounding":{"properties":{"applies_to":{"type":"string"},"direction":{"enum":["up"],"type":"string"},"increment":{"type":"number"}},"type":"object"}},"type":"object"}},"type":"object"}},"required":["common_model_id","price","price_type","sportsbook","aggregator"],"title":"FutureOutcomeOdd","type":"object"},"type":"array"},"player_id":{"format":"uuid","nullable":true,"type":"string"},"selection":{"nullable":true,"type":"string"},"selection_line":{"nullable":true,"type":"string"},"status":{"nullable":true,"type":"string"},"team_id":{"format":"uuid","nullable":true,"type":"string"},"updated_at":{"format":"date-time","nullable":true,"type":"string"}},"required":["common_model_id","name"],"title":"FutureOutcome","type":"object"},"type":"array"},"player_id":{"format":"uuid","nullable":true,"type":"string"},"sport_id":{"format":"uuid","nullable":true,"type":"string"},"start_date":{"format":"date-time","nullable":true,"type":"string"},"status":{"nullable":true,"type":"string"},"team_id":{"format":"uuid","nullable":true,"type":"string"},"timestamp":{"format":"date-time","nullable":true,"type":"string"},"tournament_id":{"format":"uuid","nullable":true,"type":"string"},"tradeable":{"description":"Included only when include_outcomes=true. True when no lifecycle or structural tradeability reason applies; this does not guarantee current liquidity or executable quotes.","type":"boolean"},"untradeable_reasons":{"description":"Included only when include_outcomes=true. Empty exactly when tradeable is true; otherwise lists every failed lifecycle or structural invariant.","items":{"enum":["lifecycle_not_tradable","missing_mutually_exclusive_signal","insufficient_outcomes","duplicate_canonical_selection"],"type":"string"},"type":"array"},"updated_at":{"format":"date-time","nullable":true,"type":"string"}},"required":["common_model_id","name"],"title":"FutureMarket","type":"object"},"type":"array"}},"required":["data"],"type":"object"}}},"description":"Future Markets","headers":{"Link":{"description":"RFC 8288 pagination links with first, prev, next, and last relations","schema":{"type":"string"},"style":"simple"},"X-Page":{"description":"Current page number","schema":{"minimum":1,"type":"integer"},"style":"simple"},"X-Per-Page":{"description":"Maximum number of items requested per page","schema":{"maximum":1000,"minimum":1,"type":"integer"},"style":"simple"},"X-Total-Count":{"description":"Total number of items across all pages","schema":{"minimum":0,"type":"integer"},"style":"simple"},"X-Total-Pages":{"description":"Total number of pages","schema":{"minimum":0,"type":"integer"},"style":"simple"}}},"400":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"bad_request","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/bad_request","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"invalid_api_key","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/invalid_api_key","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"forbidden","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/forbidden","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"not_found","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/not_found","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Not Found"}},"summary":"List Future Markets","tags":["Betting"]}},"/api/v1/events/{id}/prediction-lines":{"get":{"callbacks":{},"description":"Returns the prediction-market line ladder for one event: every quoted\nline per venue (Kalshi, Polymarket, Limitless, Predict.fun, ProphetX, Polymarket US),\ngrouped by `{market_type, family, side}`, with the derived main line\nmarked per venue. Read-time projection only -- does not read or write the\n`is_main` column on any `flat_odd` row.\n","operationId":"ApiRestWeb.PredictionLinesController.show","parameters":[{"description":"Event ID (UUID)","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"properties":{"event_id":{"format":"uuid","type":"string"},"ladder":{"description":"One entry per {market_type, family, side} slot, each carrying the full quoted ladder and derived main_line marker per venue.","items":{"type":"object"},"type":"array"}},"type":"object"}},"type":"object"}}},"description":"Success"},"400":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"bad_request","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/bad_request","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"invalid_api_key","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/invalid_api_key","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Unauthorized"}},"summary":"Get Prediction-Market Line Ladder","tags":["Betting"]}},"/api/v1/prediction-markets/audit-runs/{id}":{"get":{"callbacks":{},"description":"Retrieves one durable product-acceptance census artifact by id. Requires\nthe `prediction_market:audit` API-key scope.\n","operationId":"ApiRestWeb.PredictionMarketsAuditController.show","parameters":[{"description":"Audit report ID (UUID)","example":"01c7133f-2999-4803-9872-8c2ab1ba63ac","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"acceptance":{"$ref":"#/components/schemas/PredictionAcceptance"},"checkpoint_date":{"format":"date","nullable":true,"type":"string"},"checkpoint_window_start":{"format":"date_time","nullable":true,"type":"string"},"completed_at":{"format":"date_time","nullable":true,"type":"string"},"deployed_sha":{"nullable":true,"type":"string"},"error":{"nullable":true,"type":"string"},"from_date":{"format":"date","type":"string"},"id":{"format":"uuid","type":"string"},"report":{"nullable":true,"type":"object"},"report_revision":{"type":"integer"},"status":{"type":"string"},"through_date":{"format":"date","type":"string"},"trigger":{"enum":["manual","scheduled"],"type":"string"}},"type":"object"}}},"description":"Audit Run"},"401":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"invalid_api_key","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/invalid_api_key","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"forbidden","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/forbidden","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"not_found","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/not_found","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Not Found"},"503":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"service_unavailable","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/service_unavailable","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Service Unavailable"}},"summary":"Retrieve a Prediction-Market Audit Run","tags":["Prediction Markets"]}},"/api/v1/self-service/mappings/resolve":{"post":{"callbacks":{},"operationId":"ApiRestWeb.SelfServiceController.resolve","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"properties":{"entity_types":{"items":{"type":"string"},"type":"array"},"items":{"items":{"type":"object"},"type":"array"},"source":{"example":"cbs.basketball.nba","type":"string"}},"required":["source","items"],"type":"object"}}},"description":"Bulk mapping resolve request","required":false},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"count":{"type":"integer"},"data":{"items":{"type":"object"},"type":"array"},"source":{"type":"string"}},"type":"object"}}},"description":"Self-service resolve response"},"400":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"bad_request","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/bad_request","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"invalid_api_key","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/invalid_api_key","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"forbidden","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/forbidden","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"not_found","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/not_found","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Not Found"},"409":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"conflict","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/conflict","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Conflict"},"422":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"validation_error","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/validation_error","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Validation Error"},"503":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"service_unavailable","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/service_unavailable","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Service Unavailable"}},"summary":"Resolve provider source IDs in bulk","tags":["Self-Service"]}},"/api/v1/rankings/{id}":{"get":{"callbacks":{},"operationId":"ApiRestWeb.RankingsController.show","parameters":[{"description":"Ranking ID (UUID common_model_id)","example":"01c7133f-2999-4803-9872-8c2ab1ba63ac","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"description":"Historical standings or rankings snapshot for a specific tenant, entity, season, and season type.\n\nRecords nightly provider imports so you can query past ranks,\ngames-back deltas, and splits while the most recent regular-season snapshot is surfaced\non `Team.metadata`.\n","example":{"for_entity_id":"01c7133f-2999-4803-9872-8c2ab1ba63ac","for_entity_type":"team","league_id":"32fa944f-b1bd-41b4-bec2-7ab269fde6fc","metadata":{"conference_name":"NFC","division_name":"NFC East"},"primary_group":"NFC East","primary_group_type":"division","ranking_overall":3,"ranking_primary_context":"division","ranking_primary_value":1,"record_losses":2,"record_ties":0,"record_wins":11,"season_type":"REG","season_year":2024,"secondary_group":"NFC","secondary_group_type":"conference","source_for_entity_id":"competitor_4422","table_type":"standings","team_id":"01c7133f-2999-4803-9872-8c2ab1ba63ac"},"properties":{"status_streak_type":{"description":"Identifier for the current streak (WIN, LOSS, TIE)","type":"string"},"split_away_ties":{"description":"Away ties","type":"integer"},"scoring_against":{"description":"Total scoring against","type":"integer"},"ranking_points":{"description":"Table points (soccer/rugby/etc.)","type":"integer"},"secondary_group_type":{"description":"Type of secondary grouping.\nValues: conference, league, null\n","enum":["conference","league"],"nullable":true,"type":"string"},"split_division_losses":{"description":"Division losses","type":"integer"},"scoring_unit":{"description":"Unit for scoring metrics (points, runs, goals, etc.)","type":"string"},"source_for_entity_id":{"description":"Provider source identifier for the ranked/standing entity.","nullable":true,"type":"string"},"record_games_played":{"description":"Total games played","type":"integer"},"ranking_overall":{"description":"Overall/league rank","type":"integer"},"ranking_primary_value":{"type":"integer"},"split_last10_ties":{"description":"Ties over last 10","type":"integer"},"ranking_group":{"description":"Group/Pool rank","type":"integer"},"split_away_wins":{"description":"Away wins","type":"integer"},"split_home_ties":{"description":"Home ties","type":"integer"},"split_last10_wins":{"description":"Wins over last 10","type":"integer"},"season_type":{"description":"Season segment (PRE, REG, PST, etc.)","type":"string"},"record_losses":{"description":"Total losses","type":"integer"},"record_ties":{"description":"Total ties","type":"integer"},"record_games_back":{"description":"Games behind the division leader","format":"float","type":"number"},"status_streak_text":{"description":"Human-readable streak text","type":"string"},"record_win_pct":{"description":"Win percentage","format":"float","type":"number"},"league_id":{"description":"League this snapshot belongs to","type":"string"},"ranking_secondary_value":{"type":"integer"},"split_division_wins":{"description":"Division wins","type":"integer"},"for_entity_id":{"description":"Common Model ID of the team or player represented by this row.","type":"string"},"id":{"description":"Standings record identifier","type":"string"},"split_home_losses":{"description":"Home losses","type":"integer"},"record_wildcard_back":{"description":"Games behind the wildcard leader","format":"float","type":"number"},"split_conference_wins":{"description":"Conference wins","type":"integer"},"tenant_id":{"description":"Tenant that owns this standings snapshot","type":"string"},"primary_group":{"description":"Most granular organizational grouping name. Works across all sports.\nExamples: \"NFC East\" (NFL), \"Group E\" (World Cup), \"Atlantic\" (NBA).\n","nullable":true,"type":"string"},"split_last10_losses":{"description":"Losses over last 10","type":"integer"},"status_clinched":{"description":"Clinched qualifier (division, wildcard, playoff, etc.)","type":"string"},"ranking_primary_context":{"description":"Context for the primary rank value (division, conference, etc.)","type":"string"},"record_wins":{"description":"Total wins","type":"integer"},"scoring_diff":{"description":"Scoring differential","type":"integer"},"for_entity_type":{"description":"Entity type represented by this row.","enum":["team","player"],"type":"string"},"split_conference_losses":{"description":"Conference losses","type":"integer"},"ranking_secondary_context":{"description":"Context for the secondary rank value","type":"string"},"season_id":{"description":"Season Common Model ID","type":"string"},"split_home_wins":{"description":"Home wins","type":"integer"},"season_year":{"description":"Season year","type":"integer"},"ranking_wildcard":{"description":"Wildcard rank","type":"integer"},"split_conference_ties":{"description":"Conference ties","type":"integer"},"status_elimination_number":{"description":"Elimination number for the current race","type":"integer"},"team_id":{"description":"Legacy compatibility field. Mirrors `for_entity_id` when `for_entity_type=team`.","nullable":true,"type":"string"},"split_away_losses":{"description":"Away losses","type":"integer"},"secondary_group":{"description":"Parent/higher-level organizational grouping if exists.\nExamples: \"NFC\" (NFL), \"Eastern Conference\" (NBA), null (World Cup).\n","nullable":true,"type":"string"},"status_streak_length":{"description":"Length of the streak","type":"integer"},"scoring_for":{"description":"Total scoring for","type":"integer"},"standings_date":{"description":"Date/time for when the standings payload was generated","format":"date-time","type":"string"},"metadata":{"additionalProperties":true,"description":"Provider payload fragments plus sport-specific splits/rankings.\n\nNote: Universal organizational hierarchy is now available as top-level fields\n(`primary_group`, `primary_group_type`, `secondary_group`, `secondary_group_type`).\n\n## Sport-Specific Fields (Legacy/Backward Compatibility)\n\n- `division_name` (string): Division name (NFL, NBA, MLB)\n- `conference_name` (string): Conference name (NFL, NBA)\n- `group_name` (string): Group name (World Cup, Champions League)\n\n## Additional Metadata\n\n- `rankings` - Additional ranking breakdowns\n- `split` - Game split details (home/away/division/conference)\n- `scoring_secondary` - Secondary scoring metrics\n- `advanced_metrics` - Provider-specific advanced stats\n","type":"object"},"table_type":{"description":"Distinguishes standings tables from rankings tables.","enum":["standings","ranking"],"type":"string"},"primary_group_type":{"description":"Type of primary grouping. Use this to determine UI labels.\nValues: division, group, conference, region, pool\n","enum":["division","group","conference","region","pool"],"nullable":true,"type":"string"},"split_division_ties":{"description":"Division ties","type":"integer"}},"required":["for_entity_type","for_entity_id","table_type","season_id","season_year","season_type"],"title":"Standings","type":"object"}}},"description":"Rankings Response"}},"summary":"Show Rankings","tags":["Stats & Data"]}},"/api/v1/futures/{id}":{"get":{"callbacks":{},"description":"Retrieve a single future market by ID.\n\nUse `include_outcomes=true` to include outcomes and their current,\ntenant-visible venue quotes for this market in the response.\n","operationId":"ApiRestWeb.FuturesController.show","parameters":[{"description":"Future Market ID (UUID)","example":"01c7133f-2999-4803-9872-8c2ab1ba63ac","in":"path","name":"id","required":true,"schema":{"type":"string"}},{"description":"Include outcomes and current venue quotes for this market (true/false, default: false)","in":"query","name":"include_outcomes","required":false,"schema":{"type":"boolean"}},{"description":"Return the market only if its family-key season equals this year; otherwise 404. See `GET /futures`.","in":"query","name":"season_year","required":false,"schema":{"example":2027,"type":"integer"}},{"description":"Return the market only if it currently has a priced, tenant-visible quote from this venue; otherwise 404. One value only: a comma-separated list returns 400.","in":"query","name":"aggregator","required":false,"schema":{"enum":["kalshi","polymarket","predict_fun","limitless","prophetx","polymarket_us","sxbet","predictfun"],"example":"kalshi","type":"string"}},{"description":"Return the market only if its lifecycle matches (`active` or `closed`); otherwise 404. See `GET /futures`.","in":"query","name":"status","required":false,"schema":{"enum":["active","closed"],"example":"active","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"description":"A contract served through the futures compatibility route. actual_scope identifies race, session, tournament, round, or season meaning when proven.","example":{"common_model_id":"123e4567-e89b-12d3-a456-426614174000","future_type":"championship","league_id":"123e4567-e89b-12d3-a456-426614174001","name":"2026 FIFA World Cup Winner","outcomes":[],"status":"active","tradeable":false,"untradeable_reasons":["insufficient_outcomes"]},"properties":{"actual_scope":{"description":"Native contract scope; null means unknown, independent of storage route.","enum":["event","race","session","tournament","round","season"],"nullable":true,"type":"string"},"common_model_id":{"format":"uuid","type":"string"},"future_type":{"nullable":true,"type":"string"},"inserted_at":{"format":"date-time","nullable":true,"type":"string"},"league_id":{"format":"uuid","nullable":true,"type":"string"},"market_type_id":{"format":"uuid","nullable":true,"type":"string"},"metadata":{"nullable":true,"type":"object"},"name":{"type":"string"},"outcomes":{"description":"Included only when include_outcomes=true","items":{"properties":{"common_model_id":{"format":"uuid","type":"string"},"execution":{"additionalProperties":true,"description":"Venue-keyed execution blocks (`{\"kalshi\": {...}, \"polymarket\": {...}}`, the same shape event odds carry under metadata.execution) unioned from this outcome's quotes. Unlike metadata.execution, which holds one venue on a cross-venue outcome, this lists every venue that currently quotes the outcome. Empty when no quote carries a block.","type":"object"},"grouping_key":{"nullable":true,"type":"string"},"inserted_at":{"format":"date-time","nullable":true,"type":"string"},"is_main":{"nullable":true,"type":"boolean"},"line":{"nullable":true,"type":"number"},"metadata":{"description":"Provider metadata. For prediction markets this includes the \"execution\" block carrying the identifiers needed to place a trade on the originating venue (venue, ticker/token_id, condition_id, neg_risk, tick_size, venue contracts, url).","nullable":true,"type":"object"},"name":{"type":"string"},"normalized_selection":{"nullable":true,"type":"string"},"odds":{"description":"Current tenant-visible quotes for this canonical outcome, one per venue/position.","items":{"properties":{"aggregator":{"type":"string"},"canonical_outcome_id":{"description":"Cross-venue outcome identity; present only when the outcome identity is verified (same rule as GET /v1/odds), otherwise null. Never a per-venue fallback.","format":"uuid","nullable":true,"type":"string"},"clock_provenance":{"properties":{"evaluated_at":{"format":"date-time","type":"string"},"max_age_seconds":{"enum":[300],"type":"integer"},"quote_provenance":{"description":"Unmodified retained JSON provenance, including legacy or malformed evidence.","nullable":true},"source":{"enum":["timestamp",null],"nullable":true,"type":"string"}},"type":"object"},"common_model_id":{"format":"uuid","type":"string"},"deep_link":{"nullable":true,"type":"string"},"event_id":{"description":"Always null for a future market; present for parity with GET /v1/odds.","format":"uuid","nullable":true,"type":"string"},"execution_readiness":{"description":"Requires exact native source-ID binding, active parent/outcome lifecycle and proven fresh provider clock; not order-fill certification. ProphetX additionally requires one atomic native strike/price/size/time observation matching its documented submit-order fields. ready=null means unknown. Native IDs remain separate from common_model_id.","example":{"available_size":{"state":"unknown","value":null},"depth":{"state":"unknown","value":null},"executable":{"reason":"catalog_is_not_a_book","state":"unknown"},"identifiers_valid":true,"liquidity":{"state":"unknown","value":null},"ready":null,"reasons":["provider_clock_provenance_downgrade"],"scope":"outcome_identifiers_and_provider_clock","venue":"limitless"},"properties":{"available_size":{"additionalProperties":true,"description":"Retained evidence; absent measurements have state unknown and value null.","type":"object"},"depth":{"additionalProperties":true,"description":"Retained evidence; absent measurements have state unknown and value null.","type":"object"},"executable":{"additionalProperties":true,"description":"Retained evidence; absent measurements have state unknown and value null.","type":"object"},"identifiers_valid":{"type":"boolean"},"liquidity":{"additionalProperties":true,"description":"Retained evidence; absent measurements have state unknown and value null.","type":"object"},"ready":{"nullable":true,"type":"boolean"},"reasons":{"items":{"type":"string"},"type":"array"},"scope":{"enum":["outcome_identifiers_and_provider_clock"],"type":"string"},"venue":{"type":"string"}},"type":"object"},"fetched_at":{"description":"Timestamp when SportsStack fetched or observed this quote","format":"date-time","nullable":true,"type":"string"},"freshness_reasons":{"description":"Deterministic provider_clock_* or lifecycle_* reasons; empty when fresh.","items":{"type":"string"},"type":"array"},"is_main":{"nullable":true,"type":"boolean"},"limits":{"nullable":true,"type":"object"},"market_id":{"description":"The future market this quote belongs to (its common_model_id, which is the canonical family id for a classified family). Same field as GET /v1/odds.","format":"uuid","nullable":true,"type":"string"},"market_name":{"nullable":true,"type":"string"},"market_type":{"nullable":true,"type":"string"},"metadata":{"description":"Provider quote metadata, including venue execution identifiers.","nullable":true,"type":"object"},"outcome_id":{"description":"The outcome common_model_id this quote is nested under. Same field as GET /v1/odds.","format":"uuid","nullable":true,"type":"string"},"platform_observed_at":{"description":"Prediction quotes only. Row observed_at, independently of provider freshness.","format":"date-time","nullable":true,"type":"string"},"points":{"description":"Line value distinguishing alternate positions, when applicable","nullable":true,"type":"number"},"price":{"type":"number"},"price_type":{"type":"string"},"provider_freshness":{"description":"Prediction quotes only. Fresh requires a proven nonfuture provider clock at most 300 seconds old and proven active exact-parent/outcome lifecycle. Standalone odds report unknown without lifecycle proof.","enum":["fresh","stale","unknown"],"type":"string"},"provider_observed_at":{"description":"Prediction quotes only. Authoritative provider quote timestamp; never receipt/observation time. Requires matching observed quote_provenance.provider_updated_at; null for absent, synthetic or downgraded authority.","format":"date-time","nullable":true,"type":"string"},"selection_line":{"description":"Provider label for the selected line position, when applicable","nullable":true,"type":"string"},"source_id":{"nullable":true,"type":"string"},"source_market_id":{"nullable":true,"type":"string"},"source_selection_id":{"nullable":true,"type":"string"},"sportsbook":{"type":"string"},"timestamp":{"format":"date-time","nullable":true,"type":"string"},"trading_fees":{"description":"Prediction quotes only (absent on sportsbook rows and on venues whose fees are not captured yet: Limitless, ProphetX, Polymarket US, SX Bet). Computed at read time; no order-fill or account-specific guarantee (per-account discounts, maker rebates and balance-precision rounding are not modelled). Kalshi: rates from a versioned snapshot of Kalshi's public series metadata, event fee overrides and fee schedule; `observed_at` is the snapshot time. Series with event-level fee overrides (MLB) resolve per event: an override in force reports `scope: event` (with `event_ticker`, `effective_from`), before its `scheduled_ts` the series fee is reported with the pending change under `scheduled_override`, and an event missing from the snapshot reports `unknown` (`event_fee_override_not_in_snapshot`). Predict.fun: derived from the stored market `fee_rate_bps`; `observed_at` is the quote observation time. Polymarket: the market's own Gamma `feesEnabled`/`feeSchedule` captured with the quote (`fee = shares x rate x P x (1 - P)`, taker only, makers pay nothing; `maker.rebate_rate` is the fraction of taker fees returned to makers through a daily rebate program, not a per-fill credit; fees round to 5 decimal places with no published direction, so `rounding.direction` is absent); `observed_at` is the quote observation time, and quotes whose fee data is missing, has an exponent other than 1, or is not taker-only report `unknown`. The rate is per market (`sports_fees_v3` 0.05, `sports_fees_v2` 0.03, `zero_fees` 0 are all live on sports), never a category default.","example":{"availability":"published","charge_basis":"fill","fee_multiplier":1.0,"fee_type":"quadratic_with_maker_fees","maker":{"exponent":1,"model":"quadratic","multiplier":1.0,"rate":0.0175,"rounding":{"applies_to":"fee_plus_position_cost","direction":"up","increment":0.0001}},"observed_at":"2026-09-30T15:33:45Z","scope":"series","series_ticker":"KXNBAGAME","source":"kalshi_series_snapshot","taker":{"exponent":1,"model":"quadratic","multiplier":1.0,"rate":0.07,"rounding":{"applies_to":"fee_plus_position_cost","direction":"up","increment":0.0001}}},"properties":{"availability":{"enum":["published","unavailable","unknown"],"type":"string"},"charge_basis":{"description":"Fees are charged per fill, not per order or per settlement.","enum":["fill"],"type":"string"},"effective_from":{"description":"Kalshi, `scope: event`: the override's `scheduled_ts`, from which these rates apply.","format":"date-time","type":"string"},"event_ticker":{"description":"Kalshi: the market ticker minus its last `-` segment. Present for series with event-level fee overrides.","type":"string"},"fee_multiplier":{"type":"number"},"fee_rate_bps":{"type":"integer"},"fee_type":{"type":"string"},"fees_enabled":{"description":"Polymarket: the market's Gamma `feesEnabled` flag.","type":"boolean"},"maker":{"description":"One side of the fee. `quadratic`: fee = rate x contracts x (P x (1 - P)) ^ exponent. `linear_min_price`: fee = rate x min(P, 1 - P) x shares. `none`: no fee. `rate` already includes any venue multiplier.","properties":{"exponent":{"type":"integer"},"formula":{"type":"string"},"model":{"enum":["quadratic","linear_min_price","none"],"type":"string"},"multiplier":{"type":"number"},"rate":{"type":"number"},"rebate_rate":{"description":"Polymarket maker side: fraction of taker fees rebated to resting makers by the daily rebate program (context only, not a per-fill credit).","type":"number"},"rounding":{"properties":{"applies_to":{"type":"string"},"direction":{"enum":["up"],"type":"string"},"increment":{"type":"number"}},"type":"object"}},"type":"object"},"observed_at":{"format":"date-time","nullable":true,"type":"string"},"reason":{"description":"Present when availability is unknown; deterministic snake_case reason.","type":"string"},"scheduled_override":{"description":"Kalshi, `scope: series`: an event-level override that is not yet in force. Charged from `effective_from`; carries `fee_type`, `fee_multiplier`, `taker` and `maker` like the top-level object.","properties":{"effective_from":{"format":"date-time","type":"string"},"fee_multiplier":{"type":"number"},"fee_type":{"type":"string"},"maker":{"description":"One side of the fee. `quadratic`: fee = rate x contracts x (P x (1 - P)) ^ exponent. `linear_min_price`: fee = rate x min(P, 1 - P) x shares. `none`: no fee. `rate` already includes any venue multiplier.","properties":{"exponent":{"type":"integer"},"formula":{"type":"string"},"model":{"enum":["quadratic","linear_min_price","none"],"type":"string"},"multiplier":{"type":"number"},"rate":{"type":"number"},"rebate_rate":{"description":"Polymarket maker side: fraction of taker fees rebated to resting makers by the daily rebate program (context only, not a per-fill credit).","type":"number"},"rounding":{"properties":{"applies_to":{"type":"string"},"direction":{"enum":["up"],"type":"string"},"increment":{"type":"number"}},"type":"object"}},"type":"object"},"taker":{"description":"One side of the fee. `quadratic`: fee = rate x contracts x (P x (1 - P)) ^ exponent. `linear_min_price`: fee = rate x min(P, 1 - P) x shares. `none`: no fee. `rate` already includes any venue multiplier.","properties":{"exponent":{"type":"integer"},"formula":{"type":"string"},"model":{"enum":["quadratic","linear_min_price","none"],"type":"string"},"multiplier":{"type":"number"},"rate":{"type":"number"},"rebate_rate":{"description":"Polymarket maker side: fraction of taker fees rebated to resting makers by the daily rebate program (context only, not a per-fill credit).","type":"number"},"rounding":{"properties":{"applies_to":{"type":"string"},"direction":{"enum":["up"],"type":"string"},"increment":{"type":"number"}},"type":"object"}},"type":"object"}},"type":"object"},"scope":{"enum":["series","event","market"],"type":"string"},"series_ticker":{"type":"string"},"source":{"description":"kalshi_series_snapshot | kalshi_event_fee_snapshot | kalshi_fee_schedule_default | venue_record. `kalshi_event_fee_snapshot` is a Kalshi event-level override in force; `kalshi_fee_schedule_default` is the schedule default (quadratic x 1) inferred for a KX series not in the exception snapshot.","type":"string"},"taker":{"description":"One side of the fee. `quadratic`: fee = rate x contracts x (P x (1 - P)) ^ exponent. `linear_min_price`: fee = rate x min(P, 1 - P) x shares. `none`: no fee. `rate` already includes any venue multiplier.","properties":{"exponent":{"type":"integer"},"formula":{"type":"string"},"model":{"enum":["quadratic","linear_min_price","none"],"type":"string"},"multiplier":{"type":"number"},"rate":{"type":"number"},"rebate_rate":{"description":"Polymarket maker side: fraction of taker fees rebated to resting makers by the daily rebate program (context only, not a per-fill credit).","type":"number"},"rounding":{"properties":{"applies_to":{"type":"string"},"direction":{"enum":["up"],"type":"string"},"increment":{"type":"number"}},"type":"object"}},"type":"object"}},"type":"object"}},"required":["common_model_id","price","price_type","sportsbook","aggregator"],"title":"FutureOutcomeOdd","type":"object"},"type":"array"},"player_id":{"format":"uuid","nullable":true,"type":"string"},"selection":{"nullable":true,"type":"string"},"selection_line":{"nullable":true,"type":"string"},"status":{"nullable":true,"type":"string"},"team_id":{"format":"uuid","nullable":true,"type":"string"},"updated_at":{"format":"date-time","nullable":true,"type":"string"}},"required":["common_model_id","name"],"title":"FutureOutcome","type":"object"},"type":"array"},"player_id":{"format":"uuid","nullable":true,"type":"string"},"sport_id":{"format":"uuid","nullable":true,"type":"string"},"start_date":{"format":"date-time","nullable":true,"type":"string"},"status":{"nullable":true,"type":"string"},"team_id":{"format":"uuid","nullable":true,"type":"string"},"timestamp":{"format":"date-time","nullable":true,"type":"string"},"tournament_id":{"format":"uuid","nullable":true,"type":"string"},"tradeable":{"description":"Included only when include_outcomes=true. True when no lifecycle or structural tradeability reason applies; this does not guarantee current liquidity or executable quotes.","type":"boolean"},"untradeable_reasons":{"description":"Included only when include_outcomes=true. Empty exactly when tradeable is true; otherwise lists every failed lifecycle or structural invariant.","items":{"enum":["lifecycle_not_tradable","missing_mutually_exclusive_signal","insufficient_outcomes","duplicate_canonical_selection"],"type":"string"},"type":"array"},"updated_at":{"format":"date-time","nullable":true,"type":"string"}},"required":["common_model_id","name"],"title":"FutureMarket","type":"object"}},"required":["data"],"type":"object"}}},"description":"Success"},"400":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"bad_request","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/bad_request","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"invalid_api_key","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/invalid_api_key","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"forbidden","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/forbidden","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"not_found","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/not_found","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Not Found"}},"summary":"Show Future Market","tags":["Betting"]}},"/api/v1/odds":{"get":{"callbacks":{},"description":"Retrieve betting odds with optimized single-query performance.\n\n**Required**: At least one of `league_id` or `event_id` must be provided.\n\nBy default, returns only the **latest** odd per outcome/sportsbook/aggregator combination\n(`latest_only=true`). Set `latest_only=false` to retrieve full historical odds data.\n\n**Finished games (prediction markets):** latest prices from prediction venues (Kalshi,\nPolymarket, ProphetX, Limitless, Predict.fun, Polymarket US) for a final or cancelled event are kept for at\nleast 14 days after the event's scheduled start. After that they may be removed, and a latest\nread for that `event_id` returns no rows for those venues. Use `latest_only=false` for the\nprice history.\n\nUse additional filters to narrow results by sportsbook, market type, etc.\n\n**`line_alignment` (prediction markets, event-scoped requests only):** each row's additive\n`line_alignment` block is only present when this is an event-scoped, `latest_only=true`\nrequest (`event_id` given). It is derived at read time from\n`CommonModel.Betting.PredictionMarkets.LineLadder` and never rewrites the sibling `is_main`\ncolumn. For non-event-scoped `league_id` requests the key is **omitted from the response row\nentirely** (not present with a null body) -- computing a ladder per event across a whole\nleague's worth of events in one request is intentionally out of scope; see\n`docs/plans/2026-09-24-prediction-market-is-main-line-ladder.md` Phase D.\n\n**Crypto (`league_id=CRYPTO` or a crypto window `event_id`; tenants entitled to the\n`CRYPTO` league only).** One row per venue per outcome (Up/Down) with\n`market_type = \"up_down\"` and `market_id` = the contract family. Polymarket and\nLimitless rows of the same window share one `market_id` (same Chainlink 60s TWAP\nreference and tie rule); Kalshi resolves off a different reference and has its own\n`market_id`. Each row's additive `reference_alignment` lists the other markets of the\nwindow in `different_reference_market_ids`, and `canonical_outcome_id` is a crypto\nnamespaced id (join it only against other crypto rows, never sports prediction-market\n`canonical_outcome_id`s). Prices are **indicative**: captured by our one-minute poll\n(`timestamp`/`observed_at` are our capture time, never a provider clock), so\n`provider_freshness` is `unknown` (a fresh snapshot) or `stale` (older than\n`metadata.crypto_quote.stale_after_ms`; 150 s for 5m/15m, 300 s for 1h, 600 s for\n1d), never `fresh`, and `execution_readiness.ready` is `false`: treat both as\n\"indicative, not executable\", use `stale` to grey out a price. A quote older than 15\nminutes, a market with no quote, and any window at or after its `window_end` yield no\nrow. Crypto odds are latest-only: `latest_only=false` or `since` is a 400\n`historical_unavailable_for_league`. `line_alignment` is omitted on crypto rows.\n`league_id=CRYPTO` returns the board of live windows plus upcoming windows starting\nwithin 60 minutes (default and maximum `per_page` 100, exact `meta.total_count`).\n`asset` and `horizon` filter the board. Crypto at the polling cadence is too slow for\n5m-market trading use.\n","operationId":"ApiRestWeb.OddsControllerV2.index","parameters":[{"description":"Filter by league ID (UUID or abbreviation, e.g., 'NFL') — required if event_id not provided","example":"NFL","in":"query","name":"league_id","required":false,"schema":{"type":"string"}},{"description":"Filter by event ID (UUID) - required if league_id not provided","example":"5c4e8fe4-5bc9-49e1-aa84-aaa975900703","in":"query","name":"event_id","required":false,"schema":{"type":"string"}},{"description":"Filter by market ID (UUID)","in":"query","name":"market_id","required":false,"schema":{"type":"string"}},{"description":"Filter by outcome ID (UUID)","in":"query","name":"outcome_id","required":false,"schema":{"type":"string"}},{"description":"Filter by player ID (UUID) - useful for player prop markets","in":"query","name":"player_id","required":false,"schema":{"type":"string"}},{"description":"Filter by sportsbook name (e.g., 'draftkings', 'fanduel')","in":"query","name":"sportsbook","required":false,"schema":{"type":"string"}},{"description":"Filter by a single aggregator key. One value only: a comma-separated list returns 400; send one request per aggregator.","in":"query","name":"aggregator","required":false,"schema":{"type":"string"}},{"description":"Filter by market type (e.g., 'moneyline', 'point_spread', 'total_points')","in":"query","name":"market_type","required":false,"schema":{"type":"string"}},{"description":"Filter by price type (e.g., 'american' for priced odds, 'recommendation' for recommendation cards)","in":"query","name":"price_type","required":false,"schema":{"type":"string"}},{"description":"Filter by main lines only (true/false)","in":"query","name":"is_main","required":false,"schema":{"type":"boolean"}},{"description":"Filter by live odds only (true/false)","in":"query","name":"is_live","required":false,"schema":{"type":"boolean"}},{"description":"Return only the latest odd per outcome/sportsbook/aggregator (default: true). Set to false for full historical data.","in":"query","name":"latest_only","required":false,"schema":{"type":"boolean"}},{"description":"Filter odds updated since this ISO 8601 timestamp (e.g., '2026-02-11T18:00:00Z'). Only applies when latest_only=false.","example":"2026-02-11T18:00:00Z","in":"query","name":"since","required":false,"schema":{"type":"string"}},{"description":"Return an exact `meta.total_count`/`meta.total_pages`. Defaults to\n`true` for event-scoped requests (`event_id` present) and `false` for\nleague-scoped requests, where counting every matching row is\nunbounded. When the count is skipped both fields are `null` and\n`meta.has_next_page?` drives the `next` link. Must be `true` or\n`false`; any other value is rejected with HTTP 400.\n","in":"query","name":"count","required":false,"schema":{"type":"boolean"}},{"description":"CRYPTO league only (`league_id=CRYPTO`): filter to one asset. Ignored on every other league.","in":"query","name":"asset","required":false,"schema":{"enum":["BTC","ETH","SOL","DOGE"],"type":"string"}},{"description":"CRYPTO league only (`league_id=CRYPTO`): filter to one window horizon. Ignored on every other league.","in":"query","name":"horizon","required":false,"schema":{"enum":["5m","15m","1h","1d"],"type":"string"}},{"description":"Page number for page/per_page pagination. Do not combine with limit/offset.","in":"query","name":"page","required":false,"schema":{"default":1,"minimum":1,"type":"integer"}},{"description":"Number of items per page (max 1000). Do not combine with limit/offset.","in":"query","name":"per_page","required":false,"schema":{"default":1000,"maximum":1000,"minimum":1,"type":"integer"}},{"description":"Maximum rows for limit/offset pagination. Do not combine with page/per_page.","in":"query","name":"limit","required":false,"schema":{"maximum":1000,"minimum":1,"type":"integer"}},{"description":"Zero-based row offset for limit/offset pagination. Do not combine with page/per_page.","in":"query","name":"offset","required":false,"schema":{"minimum":0,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"description":"Betting odds from a specific sportsbook for a particular outcome, representing the price and probability.\n\n## Odds Standardization\n\nOdds undergo standardization to ensure consistent pricing representation and source attribution:\n\n### Source Selection Name Standardization\nThe `source_selection_name` field identifies what the sportsbook is offering odds on:\n\n#### Total Points Markets\n```\nsource_selection_name: nil  # No specific team/player selection\n```\n\n#### Point Spread Markets\n```\nsource_selection_name: \"Indiana Pacers\"     # Team receiving the spread\n# Derived from event.participants based on outcome selection\n```\n\n#### Moneyline Markets\n```\nsource_selection_name: \"Oklahoma City Thunder\"  # Team to win\n# Derived from event.participants based on outcome selection\n```\n\n### Price Standardization\n- **price**: Standardized to American odds format (-110, +150, etc.)\n- **price_type**: Always \"american\" for consistency\n- **timestamp**: UTC timestamp when current odds were observed. When the\n  response comes from the durable line-summary fallback, this is the time\n  the returned closing price last changed; same-price provider\n  reaffirmations do not advance it.\n\n### Sportsbook Attribution\n- **sportsbook**: Standardized sportsbook name (DraftKings, FanDuel, etc.)\n- **aggregator**: Upstream provider key or `sportsstack` for the canonical SportsStack board\n- **aggregator_event_id**: Provider's event identifier for traceability\n\n### Historical Tracking\nOdds include both current and opening lines for trend analysis:\n- Current odds: Real-time pricing from sportsbooks\n- Opening odds: Initial lines when market opened\n- Movement tracking: Compare current vs opening for line movement insights\n","example":{"aggregator":"sportsstack","aggregator_event_id":null,"fetched_at":"2026-04-21T17:40:00Z","metadata":{"aggregator":"sportsstack","id":"0HC75256377P350_1","link":"https://sportsbook.draftkings.com/event/30568865?outcomes=0HC75256377P350_1","selected_source":"example_provider.football.nfl","selection_reason":"trust_then_freshness","selection_tier":1,"source":"sportsstack","source_event_id":"30568865","source_market_id":"DraftKings-30568865-spreads","sportsstack_kind":"canonical_book_quote"},"price":-110,"price_type":"american","source_event_id":"30568865","source_id":"0HC75256377P350_1","source_market_id":"DraftKings-30568865-spreads","source_selection_id":"0HC75256377P350_1","source_selection_name":"Seattle Seahawks","sportsbook":"draftkings"},"properties":{"actual_scope":{"description":"Proven native contract scope, independent of the compatibility endpoint.","enum":["event","race","session","tournament","round","season"],"nullable":true,"type":"string"},"aggregator":{"description":"Upstream provider name or 'sportsstack' for the canonical SportsStack sportsbook board","type":"string"},"aggregator_event_id":{"description":"Aggregator event ID","type":"string"},"canonical_outcome_id":{"description":"Verified cross-venue economic outcome ID. Null when outcome equivalence is unresolved, push-capable, three-way, or ambiguous.","format":"uuid","nullable":true,"type":"string"},"clock_provenance":{"properties":{"evaluated_at":{"format":"date-time","type":"string"},"max_age_seconds":{"enum":[300],"type":"integer"},"quote_provenance":{"description":"Unmodified retained JSON provenance, including legacy or malformed evidence.","nullable":true},"source":{"enum":["timestamp",null],"nullable":true,"type":"string"}},"type":"object"},"common_model_id":{"description":"Market ID","type":"string"},"deep_link":{"description":"Desktop sportsbook deep link URL","type":"string"},"execution_readiness":{"description":"Requires exact native source-ID binding, active parent/outcome lifecycle and proven fresh provider clock; not order-fill certification. ProphetX additionally requires one atomic native strike/price/size/time observation matching its documented submit-order fields. ready=null means unknown. Native IDs remain separate from common_model_id.","example":{"available_size":{"state":"unknown","value":null},"depth":{"state":"unknown","value":null},"executable":{"reason":"catalog_is_not_a_book","state":"unknown"},"identifiers_valid":true,"liquidity":{"state":"unknown","value":null},"ready":null,"reasons":["provider_clock_provenance_downgrade"],"scope":"outcome_identifiers_and_provider_clock","venue":"limitless"},"properties":{"available_size":{"additionalProperties":true,"description":"Retained evidence; absent measurements have state unknown and value null.","type":"object"},"depth":{"additionalProperties":true,"description":"Retained evidence; absent measurements have state unknown and value null.","type":"object"},"executable":{"additionalProperties":true,"description":"Retained evidence; absent measurements have state unknown and value null.","type":"object"},"identifiers_valid":{"type":"boolean"},"liquidity":{"additionalProperties":true,"description":"Retained evidence; absent measurements have state unknown and value null.","type":"object"},"ready":{"nullable":true,"type":"boolean"},"reasons":{"items":{"type":"string"},"type":"array"},"scope":{"enum":["outcome_identifiers_and_provider_clock"],"type":"string"},"venue":{"type":"string"}},"type":"object"},"fetched_at":{"description":"Timestamp when SportsStack fetched or observed this quote","format":"date-time","nullable":true,"type":"string"},"freshness_reasons":{"description":"Deterministic provider_clock_* or lifecycle_* reasons; empty when fresh.","items":{"type":"string"},"type":"array"},"inserted_at":{"description":"Timestamp of creation","format":"date-time","type":"string"},"line_alignment":{"description":"SS main-line ladder plan Phase D. Present only for event-scoped, `latest_only=true` `/v1/odds` requests (`event_id` given) -- the key itself is absent from the response row (not present with a null body) for non-event-scoped `league_id`/list requests, since computing it there would mean an unbounded per-request ladder fetch across many events. Read-time derived from CommonModel.Betting.PredictionMarkets.LineLadder; never renames, removes, or reinterprets the sibling `is_main` field (the stored, write-time value) -- purely additive. All three sub-fields are null together when this row was not matched into a ranked ladder slot (e.g. a moneyline row, which has no alt-strike ladder, or a real-sportsbook row, which LineLadder never covers).","example":{"alignment_group":{"family":"spread","market_type":"point_spread","side":{"sign":"negative","team_id":null}},"is_main_derived":true,"sibling_line_count":2},"nullable":true,"properties":{"alignment_group":{"additionalProperties":true,"description":"The {market_type, family, side} ladder slot this row was matched into.","nullable":true,"type":"object"},"is_main_derived":{"description":"Whether LineLadder derived this row as the closest-to-even main line for its venue/slot, independent of the stored `is_main` column.","nullable":true,"type":"boolean"},"sibling_line_count":{"description":"Number of lines this row's own venue quotes within the same ladder slot.","nullable":true,"type":"integer"}},"type":"object"},"metadata":{"additionalProperties":true,"description":"Metadata. For prediction markets this includes an \"execution\" block carrying the trade-execution identifiers for the originating venue (venue, ticker/token_id, side, condition_id, neg_risk, tick_size, venue contracts, url). See the Prediction-Market Execution integration guide. UFC conditional markets expose \"probability_semantics\": \"conditional\", a structured \"condition\" object, and a plain-language \"void_condition\".","properties":{"condition":{"additionalProperties":true,"nullable":true,"properties":{"fight_result":{"description":"Fight-result condition for a conditional UFC market.","enum":["finish","decision"],"type":"string"},"round":{"description":"Optional round constraint for the conditional market.","minimum":1,"nullable":true,"type":"integer"}},"required":["fight_result"],"type":"object"},"probability_semantics":{"description":"Set to \"conditional\" when this price is conditional on the described fight result.","enum":["conditional"],"nullable":true,"type":"string"},"void_condition":{"description":"Plain-language condition under which a conditional UFC market is voided.","nullable":true,"type":"string"}},"type":"object"},"mobile_deep_link":{"description":"Mobile/native app deep link URL","type":"string"},"outcome_id":{"description":"Venue-backed SportsStack outcome ID","type":"string"},"platform_observed_at":{"description":"Prediction quotes only. Row observed_at, independently of provider freshness.","format":"date-time","nullable":true,"type":"string"},"price":{"description":"Price","type":"number"},"price_type":{"description":"Price format ('decimal', 'american')","type":"string"},"provider_freshness":{"description":"Prediction quotes only. Fresh requires a proven nonfuture provider clock at most 300 seconds old and proven active exact-parent/outcome lifecycle. Standalone odds report unknown without lifecycle proof.","enum":["fresh","stale","unknown"],"type":"string"},"provider_observed_at":{"description":"Prediction quotes only. Authoritative provider quote timestamp; never receipt/observation time. Requires matching observed quote_provenance.provider_updated_at; null for absent, synthetic or downgraded authority.","format":"date-time","nullable":true,"type":"string"},"reference_alignment":{"description":"Present only on crypto odds rows (omitted on sports rows; `line_alignment` is the\nsports ladder analogue and is omitted on crypto rows). `alignment` is `exact` (this\nmarket spans two or more venues), `single_venue`, or `unverified_mirror`.\n`different_reference_market_ids` lists the OTHER `market_id`s of the same window\n(any reference source), symmetrically.\n","properties":{"alignment":{"enum":["exact","single_venue","unverified_mirror"],"type":"string"},"alignment_group":{"description":"The window (event) id.","format":"uuid","type":"string"},"different_reference_market_ids":{"items":{"format":"uuid","type":"string"},"type":"array"},"reference_source":{"type":"string"},"tie_rule":{"enum":["up","split"],"type":"string"},"venue_count":{"minimum":1,"type":"integer"}},"title":"CryptoReferenceAlignment","type":"object"},"sgp_token":{"description":"Opaque same-game-parlay token supplied by the sportsbook. Null when the provider does not offer one.","nullable":true,"type":"string"},"source_event_id":{"description":"Source event ID","type":"string"},"source_id":{"description":"Source ID","type":"string"},"source_market_id":{"description":"Source market ID","type":"string"},"source_selection_id":{"description":"Source selection ID","type":"string"},"source_selection_name":{"description":"Source selection name","type":"string"},"sportsbook":{"description":"Sportsbook","type":"string"},"timestamp":{"description":"Provider quote timestamp","format":"date-time","nullable":true,"type":"string"},"trading_fees":{"description":"Prediction quotes only (absent on sportsbook rows and on venues whose fees are not captured yet: Limitless, ProphetX, Polymarket US, SX Bet). Computed at read time; no order-fill or account-specific guarantee (per-account discounts, maker rebates and balance-precision rounding are not modelled). Kalshi: rates from a versioned snapshot of Kalshi's public series metadata, event fee overrides and fee schedule; `observed_at` is the snapshot time. Series with event-level fee overrides (MLB) resolve per event: an override in force reports `scope: event` (with `event_ticker`, `effective_from`), before its `scheduled_ts` the series fee is reported with the pending change under `scheduled_override`, and an event missing from the snapshot reports `unknown` (`event_fee_override_not_in_snapshot`). Predict.fun: derived from the stored market `fee_rate_bps`; `observed_at` is the quote observation time. Polymarket: the market's own Gamma `feesEnabled`/`feeSchedule` captured with the quote (`fee = shares x rate x P x (1 - P)`, taker only, makers pay nothing; `maker.rebate_rate` is the fraction of taker fees returned to makers through a daily rebate program, not a per-fill credit; fees round to 5 decimal places with no published direction, so `rounding.direction` is absent); `observed_at` is the quote observation time, and quotes whose fee data is missing, has an exponent other than 1, or is not taker-only report `unknown`. The rate is per market (`sports_fees_v3` 0.05, `sports_fees_v2` 0.03, `zero_fees` 0 are all live on sports), never a category default.","example":{"availability":"published","charge_basis":"fill","fee_multiplier":1.0,"fee_type":"quadratic_with_maker_fees","maker":{"exponent":1,"model":"quadratic","multiplier":1.0,"rate":0.0175,"rounding":{"applies_to":"fee_plus_position_cost","direction":"up","increment":0.0001}},"observed_at":"2026-09-30T15:33:45Z","scope":"series","series_ticker":"KXNBAGAME","source":"kalshi_series_snapshot","taker":{"exponent":1,"model":"quadratic","multiplier":1.0,"rate":0.07,"rounding":{"applies_to":"fee_plus_position_cost","direction":"up","increment":0.0001}}},"properties":{"availability":{"enum":["published","unavailable","unknown"],"type":"string"},"charge_basis":{"description":"Fees are charged per fill, not per order or per settlement.","enum":["fill"],"type":"string"},"effective_from":{"description":"Kalshi, `scope: event`: the override's `scheduled_ts`, from which these rates apply.","format":"date-time","type":"string"},"event_ticker":{"description":"Kalshi: the market ticker minus its last `-` segment. Present for series with event-level fee overrides.","type":"string"},"fee_multiplier":{"type":"number"},"fee_rate_bps":{"type":"integer"},"fee_type":{"type":"string"},"fees_enabled":{"description":"Polymarket: the market's Gamma `feesEnabled` flag.","type":"boolean"},"maker":{"description":"One side of the fee. `quadratic`: fee = rate x contracts x (P x (1 - P)) ^ exponent. `linear_min_price`: fee = rate x min(P, 1 - P) x shares. `none`: no fee. `rate` already includes any venue multiplier.","properties":{"exponent":{"type":"integer"},"formula":{"type":"string"},"model":{"enum":["quadratic","linear_min_price","none"],"type":"string"},"multiplier":{"type":"number"},"rate":{"type":"number"},"rebate_rate":{"description":"Polymarket maker side: fraction of taker fees rebated to resting makers by the daily rebate program (context only, not a per-fill credit).","type":"number"},"rounding":{"properties":{"applies_to":{"type":"string"},"direction":{"enum":["up"],"type":"string"},"increment":{"type":"number"}},"type":"object"}},"type":"object"},"observed_at":{"format":"date-time","nullable":true,"type":"string"},"reason":{"description":"Present when availability is unknown; deterministic snake_case reason.","type":"string"},"scheduled_override":{"description":"Kalshi, `scope: series`: an event-level override that is not yet in force. Charged from `effective_from`; carries `fee_type`, `fee_multiplier`, `taker` and `maker` like the top-level object.","properties":{"effective_from":{"format":"date-time","type":"string"},"fee_multiplier":{"type":"number"},"fee_type":{"type":"string"},"maker":{"description":"One side of the fee. `quadratic`: fee = rate x contracts x (P x (1 - P)) ^ exponent. `linear_min_price`: fee = rate x min(P, 1 - P) x shares. `none`: no fee. `rate` already includes any venue multiplier.","properties":{"exponent":{"type":"integer"},"formula":{"type":"string"},"model":{"enum":["quadratic","linear_min_price","none"],"type":"string"},"multiplier":{"type":"number"},"rate":{"type":"number"},"rebate_rate":{"description":"Polymarket maker side: fraction of taker fees rebated to resting makers by the daily rebate program (context only, not a per-fill credit).","type":"number"},"rounding":{"properties":{"applies_to":{"type":"string"},"direction":{"enum":["up"],"type":"string"},"increment":{"type":"number"}},"type":"object"}},"type":"object"},"taker":{"description":"One side of the fee. `quadratic`: fee = rate x contracts x (P x (1 - P)) ^ exponent. `linear_min_price`: fee = rate x min(P, 1 - P) x shares. `none`: no fee. `rate` already includes any venue multiplier.","properties":{"exponent":{"type":"integer"},"formula":{"type":"string"},"model":{"enum":["quadratic","linear_min_price","none"],"type":"string"},"multiplier":{"type":"number"},"rate":{"type":"number"},"rebate_rate":{"description":"Polymarket maker side: fraction of taker fees rebated to resting makers by the daily rebate program (context only, not a per-fill credit).","type":"number"},"rounding":{"properties":{"applies_to":{"type":"string"},"direction":{"enum":["up"],"type":"string"},"increment":{"type":"number"}},"type":"object"}},"type":"object"}},"type":"object"},"scope":{"enum":["series","event","market"],"type":"string"},"series_ticker":{"type":"string"},"source":{"description":"kalshi_series_snapshot | kalshi_event_fee_snapshot | kalshi_fee_schedule_default | venue_record. `kalshi_event_fee_snapshot` is a Kalshi event-level override in force; `kalshi_fee_schedule_default` is the schedule default (quadratic x 1) inferred for a KX series not in the exception snapshot.","type":"string"},"taker":{"description":"One side of the fee. `quadratic`: fee = rate x contracts x (P x (1 - P)) ^ exponent. `linear_min_price`: fee = rate x min(P, 1 - P) x shares. `none`: no fee. `rate` already includes any venue multiplier.","properties":{"exponent":{"type":"integer"},"formula":{"type":"string"},"model":{"enum":["quadratic","linear_min_price","none"],"type":"string"},"multiplier":{"type":"number"},"rate":{"type":"number"},"rebate_rate":{"description":"Polymarket maker side: fraction of taker fees rebated to resting makers by the daily rebate program (context only, not a per-fill credit).","type":"number"},"rounding":{"properties":{"applies_to":{"type":"string"},"direction":{"enum":["up"],"type":"string"},"increment":{"type":"number"}},"type":"object"}},"type":"object"}},"type":"object"},"updated_at":{"description":"Timestamp when SportsStack last wrote this row","format":"date-time","type":"string"}},"required":["common_model_id","name"],"title":"Odds","type":"object"}}},"description":"Success"},"400":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"bad_request","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/bad_request","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"invalid_api_key","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/invalid_api_key","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Unauthorized"}},"summary":"List Odds","tags":["Betting"]}},"/api/v1/odds/latest":{"get":{"callbacks":{},"description":"Retrieve the latest odds per outcome/sportsbook/aggregator combination for a single event.\n\nReturns only the most recent odd for each unique position/sportsbook/aggregator combination,\nwith stale main-line movements filtered out. Supports pagination (page, per_page)\nwith a maximum of 1000 rows per page.\n\n**Note:** Prefer `/v1/odds?event_id=X` which provides the same behavior with additional\nfilters (market_id, outcome_id, is_live, league-scoping, historical mode).\n","operationId":"ApiRestWeb.OddsControllerV2.latest","parameters":[{"description":"Filter by event ID (UUID) - required","example":"5c4e8fe4-5bc9-49e1-aa84-aaa975900703","in":"query","name":"event_id","required":true,"schema":{"type":"string"}},{"description":"Filter by sportsbook name","in":"query","name":"sportsbook","required":false,"schema":{"type":"string"}},{"description":"Filter by a single aggregator. A comma-separated list returns 400; send one request per aggregator.","in":"query","name":"aggregator","required":false,"schema":{"type":"string"}},{"description":"Filter by market type","in":"query","name":"market_type","required":false,"schema":{"type":"string"}},{"description":"Filter by main lines only","in":"query","name":"is_main","required":false,"schema":{"type":"boolean"}},{"description":"Page number for page/per_page pagination. Do not combine with limit/offset.","in":"query","name":"page","required":false,"schema":{"default":1,"minimum":1,"type":"integer"}},{"description":"Number of items per page (max 1000). Do not combine with limit/offset.","in":"query","name":"per_page","required":false,"schema":{"default":1000,"maximum":1000,"minimum":1,"type":"integer"}},{"description":"Maximum rows for limit/offset pagination. Do not combine with page/per_page.","in":"query","name":"limit","required":false,"schema":{"maximum":1000,"minimum":1,"type":"integer"}},{"description":"Zero-based row offset for limit/offset pagination. Do not combine with page/per_page.","in":"query","name":"offset","required":false,"schema":{"minimum":0,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"description":"Betting odds from a specific sportsbook for a particular outcome, representing the price and probability.\n\n## Odds Standardization\n\nOdds undergo standardization to ensure consistent pricing representation and source attribution:\n\n### Source Selection Name Standardization\nThe `source_selection_name` field identifies what the sportsbook is offering odds on:\n\n#### Total Points Markets\n```\nsource_selection_name: nil  # No specific team/player selection\n```\n\n#### Point Spread Markets\n```\nsource_selection_name: \"Indiana Pacers\"     # Team receiving the spread\n# Derived from event.participants based on outcome selection\n```\n\n#### Moneyline Markets\n```\nsource_selection_name: \"Oklahoma City Thunder\"  # Team to win\n# Derived from event.participants based on outcome selection\n```\n\n### Price Standardization\n- **price**: Standardized to American odds format (-110, +150, etc.)\n- **price_type**: Always \"american\" for consistency\n- **timestamp**: UTC timestamp when current odds were observed. When the\n  response comes from the durable line-summary fallback, this is the time\n  the returned closing price last changed; same-price provider\n  reaffirmations do not advance it.\n\n### Sportsbook Attribution\n- **sportsbook**: Standardized sportsbook name (DraftKings, FanDuel, etc.)\n- **aggregator**: Upstream provider key or `sportsstack` for the canonical SportsStack board\n- **aggregator_event_id**: Provider's event identifier for traceability\n\n### Historical Tracking\nOdds include both current and opening lines for trend analysis:\n- Current odds: Real-time pricing from sportsbooks\n- Opening odds: Initial lines when market opened\n- Movement tracking: Compare current vs opening for line movement insights\n","example":{"aggregator":"sportsstack","aggregator_event_id":null,"fetched_at":"2026-04-21T17:40:00Z","metadata":{"aggregator":"sportsstack","id":"0HC75256377P350_1","link":"https://sportsbook.draftkings.com/event/30568865?outcomes=0HC75256377P350_1","selected_source":"example_provider.football.nfl","selection_reason":"trust_then_freshness","selection_tier":1,"source":"sportsstack","source_event_id":"30568865","source_market_id":"DraftKings-30568865-spreads","sportsstack_kind":"canonical_book_quote"},"price":-110,"price_type":"american","source_event_id":"30568865","source_id":"0HC75256377P350_1","source_market_id":"DraftKings-30568865-spreads","source_selection_id":"0HC75256377P350_1","source_selection_name":"Seattle Seahawks","sportsbook":"draftkings"},"properties":{"actual_scope":{"description":"Proven native contract scope, independent of the compatibility endpoint.","enum":["event","race","session","tournament","round","season"],"nullable":true,"type":"string"},"aggregator":{"description":"Upstream provider name or 'sportsstack' for the canonical SportsStack sportsbook board","type":"string"},"aggregator_event_id":{"description":"Aggregator event ID","type":"string"},"canonical_outcome_id":{"description":"Verified cross-venue economic outcome ID. Null when outcome equivalence is unresolved, push-capable, three-way, or ambiguous.","format":"uuid","nullable":true,"type":"string"},"clock_provenance":{"properties":{"evaluated_at":{"format":"date-time","type":"string"},"max_age_seconds":{"enum":[300],"type":"integer"},"quote_provenance":{"description":"Unmodified retained JSON provenance, including legacy or malformed evidence.","nullable":true},"source":{"enum":["timestamp",null],"nullable":true,"type":"string"}},"type":"object"},"common_model_id":{"description":"Market ID","type":"string"},"deep_link":{"description":"Desktop sportsbook deep link URL","type":"string"},"execution_readiness":{"description":"Requires exact native source-ID binding, active parent/outcome lifecycle and proven fresh provider clock; not order-fill certification. ProphetX additionally requires one atomic native strike/price/size/time observation matching its documented submit-order fields. ready=null means unknown. Native IDs remain separate from common_model_id.","example":{"available_size":{"state":"unknown","value":null},"depth":{"state":"unknown","value":null},"executable":{"reason":"catalog_is_not_a_book","state":"unknown"},"identifiers_valid":true,"liquidity":{"state":"unknown","value":null},"ready":null,"reasons":["provider_clock_provenance_downgrade"],"scope":"outcome_identifiers_and_provider_clock","venue":"limitless"},"properties":{"available_size":{"additionalProperties":true,"description":"Retained evidence; absent measurements have state unknown and value null.","type":"object"},"depth":{"additionalProperties":true,"description":"Retained evidence; absent measurements have state unknown and value null.","type":"object"},"executable":{"additionalProperties":true,"description":"Retained evidence; absent measurements have state unknown and value null.","type":"object"},"identifiers_valid":{"type":"boolean"},"liquidity":{"additionalProperties":true,"description":"Retained evidence; absent measurements have state unknown and value null.","type":"object"},"ready":{"nullable":true,"type":"boolean"},"reasons":{"items":{"type":"string"},"type":"array"},"scope":{"enum":["outcome_identifiers_and_provider_clock"],"type":"string"},"venue":{"type":"string"}},"type":"object"},"fetched_at":{"description":"Timestamp when SportsStack fetched or observed this quote","format":"date-time","nullable":true,"type":"string"},"freshness_reasons":{"description":"Deterministic provider_clock_* or lifecycle_* reasons; empty when fresh.","items":{"type":"string"},"type":"array"},"inserted_at":{"description":"Timestamp of creation","format":"date-time","type":"string"},"line_alignment":{"description":"SS main-line ladder plan Phase D. Present only for event-scoped, `latest_only=true` `/v1/odds` requests (`event_id` given) -- the key itself is absent from the response row (not present with a null body) for non-event-scoped `league_id`/list requests, since computing it there would mean an unbounded per-request ladder fetch across many events. Read-time derived from CommonModel.Betting.PredictionMarkets.LineLadder; never renames, removes, or reinterprets the sibling `is_main` field (the stored, write-time value) -- purely additive. All three sub-fields are null together when this row was not matched into a ranked ladder slot (e.g. a moneyline row, which has no alt-strike ladder, or a real-sportsbook row, which LineLadder never covers).","example":{"alignment_group":{"family":"spread","market_type":"point_spread","side":{"sign":"negative","team_id":null}},"is_main_derived":true,"sibling_line_count":2},"nullable":true,"properties":{"alignment_group":{"additionalProperties":true,"description":"The {market_type, family, side} ladder slot this row was matched into.","nullable":true,"type":"object"},"is_main_derived":{"description":"Whether LineLadder derived this row as the closest-to-even main line for its venue/slot, independent of the stored `is_main` column.","nullable":true,"type":"boolean"},"sibling_line_count":{"description":"Number of lines this row's own venue quotes within the same ladder slot.","nullable":true,"type":"integer"}},"type":"object"},"metadata":{"additionalProperties":true,"description":"Metadata. For prediction markets this includes an \"execution\" block carrying the trade-execution identifiers for the originating venue (venue, ticker/token_id, side, condition_id, neg_risk, tick_size, venue contracts, url). See the Prediction-Market Execution integration guide. UFC conditional markets expose \"probability_semantics\": \"conditional\", a structured \"condition\" object, and a plain-language \"void_condition\".","properties":{"condition":{"additionalProperties":true,"nullable":true,"properties":{"fight_result":{"description":"Fight-result condition for a conditional UFC market.","enum":["finish","decision"],"type":"string"},"round":{"description":"Optional round constraint for the conditional market.","minimum":1,"nullable":true,"type":"integer"}},"required":["fight_result"],"type":"object"},"probability_semantics":{"description":"Set to \"conditional\" when this price is conditional on the described fight result.","enum":["conditional"],"nullable":true,"type":"string"},"void_condition":{"description":"Plain-language condition under which a conditional UFC market is voided.","nullable":true,"type":"string"}},"type":"object"},"mobile_deep_link":{"description":"Mobile/native app deep link URL","type":"string"},"outcome_id":{"description":"Venue-backed SportsStack outcome ID","type":"string"},"platform_observed_at":{"description":"Prediction quotes only. Row observed_at, independently of provider freshness.","format":"date-time","nullable":true,"type":"string"},"price":{"description":"Price","type":"number"},"price_type":{"description":"Price format ('decimal', 'american')","type":"string"},"provider_freshness":{"description":"Prediction quotes only. Fresh requires a proven nonfuture provider clock at most 300 seconds old and proven active exact-parent/outcome lifecycle. Standalone odds report unknown without lifecycle proof.","enum":["fresh","stale","unknown"],"type":"string"},"provider_observed_at":{"description":"Prediction quotes only. Authoritative provider quote timestamp; never receipt/observation time. Requires matching observed quote_provenance.provider_updated_at; null for absent, synthetic or downgraded authority.","format":"date-time","nullable":true,"type":"string"},"reference_alignment":{"description":"Present only on crypto odds rows (omitted on sports rows; `line_alignment` is the\nsports ladder analogue and is omitted on crypto rows). `alignment` is `exact` (this\nmarket spans two or more venues), `single_venue`, or `unverified_mirror`.\n`different_reference_market_ids` lists the OTHER `market_id`s of the same window\n(any reference source), symmetrically.\n","properties":{"alignment":{"enum":["exact","single_venue","unverified_mirror"],"type":"string"},"alignment_group":{"description":"The window (event) id.","format":"uuid","type":"string"},"different_reference_market_ids":{"items":{"format":"uuid","type":"string"},"type":"array"},"reference_source":{"type":"string"},"tie_rule":{"enum":["up","split"],"type":"string"},"venue_count":{"minimum":1,"type":"integer"}},"title":"CryptoReferenceAlignment","type":"object"},"sgp_token":{"description":"Opaque same-game-parlay token supplied by the sportsbook. Null when the provider does not offer one.","nullable":true,"type":"string"},"source_event_id":{"description":"Source event ID","type":"string"},"source_id":{"description":"Source ID","type":"string"},"source_market_id":{"description":"Source market ID","type":"string"},"source_selection_id":{"description":"Source selection ID","type":"string"},"source_selection_name":{"description":"Source selection name","type":"string"},"sportsbook":{"description":"Sportsbook","type":"string"},"timestamp":{"description":"Provider quote timestamp","format":"date-time","nullable":true,"type":"string"},"trading_fees":{"description":"Prediction quotes only (absent on sportsbook rows and on venues whose fees are not captured yet: Limitless, ProphetX, Polymarket US, SX Bet). Computed at read time; no order-fill or account-specific guarantee (per-account discounts, maker rebates and balance-precision rounding are not modelled). Kalshi: rates from a versioned snapshot of Kalshi's public series metadata, event fee overrides and fee schedule; `observed_at` is the snapshot time. Series with event-level fee overrides (MLB) resolve per event: an override in force reports `scope: event` (with `event_ticker`, `effective_from`), before its `scheduled_ts` the series fee is reported with the pending change under `scheduled_override`, and an event missing from the snapshot reports `unknown` (`event_fee_override_not_in_snapshot`). Predict.fun: derived from the stored market `fee_rate_bps`; `observed_at` is the quote observation time. Polymarket: the market's own Gamma `feesEnabled`/`feeSchedule` captured with the quote (`fee = shares x rate x P x (1 - P)`, taker only, makers pay nothing; `maker.rebate_rate` is the fraction of taker fees returned to makers through a daily rebate program, not a per-fill credit; fees round to 5 decimal places with no published direction, so `rounding.direction` is absent); `observed_at` is the quote observation time, and quotes whose fee data is missing, has an exponent other than 1, or is not taker-only report `unknown`. The rate is per market (`sports_fees_v3` 0.05, `sports_fees_v2` 0.03, `zero_fees` 0 are all live on sports), never a category default.","example":{"availability":"published","charge_basis":"fill","fee_multiplier":1.0,"fee_type":"quadratic_with_maker_fees","maker":{"exponent":1,"model":"quadratic","multiplier":1.0,"rate":0.0175,"rounding":{"applies_to":"fee_plus_position_cost","direction":"up","increment":0.0001}},"observed_at":"2026-09-30T15:33:45Z","scope":"series","series_ticker":"KXNBAGAME","source":"kalshi_series_snapshot","taker":{"exponent":1,"model":"quadratic","multiplier":1.0,"rate":0.07,"rounding":{"applies_to":"fee_plus_position_cost","direction":"up","increment":0.0001}}},"properties":{"availability":{"enum":["published","unavailable","unknown"],"type":"string"},"charge_basis":{"description":"Fees are charged per fill, not per order or per settlement.","enum":["fill"],"type":"string"},"effective_from":{"description":"Kalshi, `scope: event`: the override's `scheduled_ts`, from which these rates apply.","format":"date-time","type":"string"},"event_ticker":{"description":"Kalshi: the market ticker minus its last `-` segment. Present for series with event-level fee overrides.","type":"string"},"fee_multiplier":{"type":"number"},"fee_rate_bps":{"type":"integer"},"fee_type":{"type":"string"},"fees_enabled":{"description":"Polymarket: the market's Gamma `feesEnabled` flag.","type":"boolean"},"maker":{"description":"One side of the fee. `quadratic`: fee = rate x contracts x (P x (1 - P)) ^ exponent. `linear_min_price`: fee = rate x min(P, 1 - P) x shares. `none`: no fee. `rate` already includes any venue multiplier.","properties":{"exponent":{"type":"integer"},"formula":{"type":"string"},"model":{"enum":["quadratic","linear_min_price","none"],"type":"string"},"multiplier":{"type":"number"},"rate":{"type":"number"},"rebate_rate":{"description":"Polymarket maker side: fraction of taker fees rebated to resting makers by the daily rebate program (context only, not a per-fill credit).","type":"number"},"rounding":{"properties":{"applies_to":{"type":"string"},"direction":{"enum":["up"],"type":"string"},"increment":{"type":"number"}},"type":"object"}},"type":"object"},"observed_at":{"format":"date-time","nullable":true,"type":"string"},"reason":{"description":"Present when availability is unknown; deterministic snake_case reason.","type":"string"},"scheduled_override":{"description":"Kalshi, `scope: series`: an event-level override that is not yet in force. Charged from `effective_from`; carries `fee_type`, `fee_multiplier`, `taker` and `maker` like the top-level object.","properties":{"effective_from":{"format":"date-time","type":"string"},"fee_multiplier":{"type":"number"},"fee_type":{"type":"string"},"maker":{"description":"One side of the fee. `quadratic`: fee = rate x contracts x (P x (1 - P)) ^ exponent. `linear_min_price`: fee = rate x min(P, 1 - P) x shares. `none`: no fee. `rate` already includes any venue multiplier.","properties":{"exponent":{"type":"integer"},"formula":{"type":"string"},"model":{"enum":["quadratic","linear_min_price","none"],"type":"string"},"multiplier":{"type":"number"},"rate":{"type":"number"},"rebate_rate":{"description":"Polymarket maker side: fraction of taker fees rebated to resting makers by the daily rebate program (context only, not a per-fill credit).","type":"number"},"rounding":{"properties":{"applies_to":{"type":"string"},"direction":{"enum":["up"],"type":"string"},"increment":{"type":"number"}},"type":"object"}},"type":"object"},"taker":{"description":"One side of the fee. `quadratic`: fee = rate x contracts x (P x (1 - P)) ^ exponent. `linear_min_price`: fee = rate x min(P, 1 - P) x shares. `none`: no fee. `rate` already includes any venue multiplier.","properties":{"exponent":{"type":"integer"},"formula":{"type":"string"},"model":{"enum":["quadratic","linear_min_price","none"],"type":"string"},"multiplier":{"type":"number"},"rate":{"type":"number"},"rebate_rate":{"description":"Polymarket maker side: fraction of taker fees rebated to resting makers by the daily rebate program (context only, not a per-fill credit).","type":"number"},"rounding":{"properties":{"applies_to":{"type":"string"},"direction":{"enum":["up"],"type":"string"},"increment":{"type":"number"}},"type":"object"}},"type":"object"}},"type":"object"},"scope":{"enum":["series","event","market"],"type":"string"},"series_ticker":{"type":"string"},"source":{"description":"kalshi_series_snapshot | kalshi_event_fee_snapshot | kalshi_fee_schedule_default | venue_record. `kalshi_event_fee_snapshot` is a Kalshi event-level override in force; `kalshi_fee_schedule_default` is the schedule default (quadratic x 1) inferred for a KX series not in the exception snapshot.","type":"string"},"taker":{"description":"One side of the fee. `quadratic`: fee = rate x contracts x (P x (1 - P)) ^ exponent. `linear_min_price`: fee = rate x min(P, 1 - P) x shares. `none`: no fee. `rate` already includes any venue multiplier.","properties":{"exponent":{"type":"integer"},"formula":{"type":"string"},"model":{"enum":["quadratic","linear_min_price","none"],"type":"string"},"multiplier":{"type":"number"},"rate":{"type":"number"},"rebate_rate":{"description":"Polymarket maker side: fraction of taker fees rebated to resting makers by the daily rebate program (context only, not a per-fill credit).","type":"number"},"rounding":{"properties":{"applies_to":{"type":"string"},"direction":{"enum":["up"],"type":"string"},"increment":{"type":"number"}},"type":"object"}},"type":"object"}},"type":"object"},"updated_at":{"description":"Timestamp when SportsStack last wrote this row","format":"date-time","type":"string"}},"required":["common_model_id","name"],"title":"Odds","type":"object"}}},"description":"Success"},"400":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"bad_request","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/bad_request","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"invalid_api_key","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/invalid_api_key","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Unauthorized"}},"summary":"Get Latest Odds","tags":["Betting"]}},"/api/v1/prediction-markets/crypto/windows":{"get":{"callbacks":{},"description":"Alias of the `CRYPTO` league surface; new integrations should use\n`GET /v1/events` and `GET /v1/odds` with `league_id=CRYPTO`. Requires the\ntenant-wide `crypto_windows` feature flag (or, when the unified surface is\nenabled for the tenant, the `CRYPTO` league entitlement). Returns the\nwindow map -- discovery, cross-venue match classes and each constituent's\nnative IDs/lifecycle/result -- plus each constituent's optional indicative\n`quote` (our one-minute poll capture, never a provider clock, absent once a\nlisting is no longer quotable). Clients that need executable prices stream\norder books from the venue directly using the returned native IDs.\n\n`same_window_different_reference` groups share a window and tie rule but\nresolve off different reference sources (for example Kalshi's CF\nBenchmarks RTI vs Polymarket/Limitless's Chainlink 60s TWAP) and can\ndisagree even on a near-flat window; they are never `exact`.\n\nLimitless creates 5m/15m markets 1-2 windows ahead but hourly/daily\nmarkets only at `window_start`, so a missing Limitless hourly/daily\nconstituent for up to 3 minutes after `window_start` is expected\ndiscovery lag (R1), not a gap.\n\n`status: ended` means the window's clock ran out, not that any venue has\nposted a result -- Kalshi/Polymarket results land within 5-20 minutes of\n`window_end` and Limitless within 5-35 minutes (see the `CryptoWindow`\nschema for the full per-venue latency table); a later result or a venue\nvoid can still correct a constituent up to `window_end` + 24h. Data is\nretained for 30 days from `window_end`.\n\nPagination is keyset-based via the opaque `after` cursor, which freezes\n`as_of` (and any filters) at the first page so a multi-page walk stays\nconsistent while wall-clock time advances.\n","operationId":"ApiRestWeb.CryptoWindowsController.index","parameters":[{"description":"","in":"query","name":"asset","required":false,"schema":{"enum":["BTC","ETH","SOL","DOGE"],"type":"string"}},{"description":"","in":"query","name":"horizon","required":false,"schema":{"enum":["5m","15m","1h","1d"],"type":"string"}},{"description":"","in":"query","name":"status","required":false,"schema":{"default":"live","enum":["upcoming","live","ended"],"type":"string"}},{"description":"","in":"query","name":"venue","required":false,"schema":{"enum":["kalshi","polymarket","limitless"],"type":"string"}},{"description":"","in":"query","name":"match_class","required":false,"schema":{"enum":["exact","same_window_different_reference"],"type":"string"}},{"description":"","in":"query","name":"page_size","required":false,"schema":{"default":50,"maximum":200,"minimum":1,"type":"integer"}},{"description":"Opaque signed cursor returned by a previous page.","in":"query","name":"after","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"after":{"description":"Opaque signed cursor for the next page; null on the last page.","nullable":true,"type":"string"},"as_of":{"description":"Frozen for this cursor walk; pass the returned `after` to keep it stable.","format":"date_time","type":"string"},"data":{"items":{"description":"A calendar-grid crypto up/down window matched across Kalshi, Polymarket\nand Limitless (ParlayX). Identity, cross-venue match classes, each\nconstituent's native IDs, the venue's own lifecycle/result and an\nindicative per-constituent `quote`; SportsStack never computes settlement.\nPrefer the unified `CRYPTO` league surface (`/v1/events`, `/v1/odds`) for new\nintegrations; this endpoint is a documented alias of it.\n\nDiscovery lag (R1): Kalshi and Polymarket pre-list windows, so the next\nwindow is readable before `window_start`. Limitless creates 5m/15m\nmarkets 1-2 windows ahead but creates hourly/daily markets only at\n`window_start` itself, so a missing Limitless hourly/daily constituent\nfor up to 3 minutes after `window_start` is expected lag, not a gap.\n\n`status` is a window-clock computation (`upcoming`/`live`/`ended`\nrelative to `as_of`) and is independent of any constituent's result --\n`ended` does not imply any venue has posted a result yet; check each\nconstituent's own `lifecycle`/`result`.\n\nResult latency and correction bounds, measured from `window_end` (R6):\n\n| Venue | Published within 30 min of window_end | Later |\n|---|---|---|\n| Kalshi, Polymarket | visible within 5 min (live poll) | visible within 20 min (15-min sweep, up to window_end + 24h) |\n| Limitless | visible within 5 min during the first hour (3-min re-checks) | visible within 35 min (30-min re-checks) up to window_end + 24h |\n\nA later or different venue result, or a venue void, corrects the stored\nstate (bumping `result_revision`) up to `window_end` + 24h. A result is\nnever overwritten by a null except by an explicit venue void.\n\nData is retained for 30 days from `window_end`.\n","properties":{"as_of":{"description":"Frozen at the first page of a cursor walk so status stays stable.","format":"date_time","type":"string"},"asset":{"enum":["BTC","ETH","SOL","DOGE"],"type":"string"},"groups":{"items":{"description":"A cross-venue match class for this window. `exact` groups share one\n`family_id` (same window, reference source and tie rule) and are safe to\ntreat as one contract. `same_window_different_reference` groups share a\n`tie_rule` across two or more distinct `reference_source`s (for example\nKalshi's `cf_benchmarks_rti` vs Polymarket/Limitless's\n`chainlink_twap_60s`) -- same window and side convention, different\noracle, and must never be collapsed into `exact`.\n","properties":{"constituents":{"items":{"description":"One venue's native listing for a crypto window: its native IDs\n(`native_market_id`, `native_ref`, and `native_yes_token`/`native_no_token`\nwhen the venue exposes on-chain tokens) and, while the listing is quotable,\nan indicative `quote` from our one-minute poll. `result`/`resolved_at`/\n`end_price` are a pass-through of the venue's own settlement, never a\nSportsStack determination. Clients that need executable prices stream order\nbooks from the venue directly using the native IDs.\n","properties":{"end_price":{"format":"double","nullable":true,"type":"number"},"family_id":{"description":"Shared by every listing with the same window, reference source and tie rule.","format":"uuid","type":"string"},"last_changed_at":{"description":"Fetch time of the feed file that last changed this listing.","format":"date_time","type":"string"},"lifecycle":{"enum":["upcoming","live","closed","resolved","voided"],"type":"string"},"mirror_of":{"description":"For a Limitless listing, the Polymarket slug it mirrors.","nullable":true,"type":"string"},"native_market_id":{"description":"The venue's native market ID.","type":"string"},"native_no_token":{"description":"On-chain CLOB token ID for the Down/No side, when the venue exposes one.","nullable":true,"type":"string"},"native_ref":{"description":"The venue's ticker (Kalshi) or slug (Polymarket, Limitless).","type":"string"},"native_yes_token":{"description":"On-chain CLOB token ID for the Up/Yes side, when the venue exposes one.","nullable":true,"type":"string"},"quote":{"description":"The listing's indicative quote: our one-minute poll capture of the venue's\nprice (`observed_at` is OUR capture time, never a provider clock). `null`\nwhen the listing is not currently quotable: it is not `upcoming`/`live`, its\nwindow has ended, it has no quote, or the quote is older than 15 minutes.\nIndicative, not executable: `stale` is true once `age_ms` exceeds\n`stale_after_ms` (150 s for 5m/15m, 300 s for 1h, 600 s for 1d).\n","nullable":true,"properties":{"age_ms":{"minimum":0,"type":"integer"},"down":{"format":"double","maximum":1,"minimum":0,"type":"number"},"observed_at":{"format":"date_time","type":"string"},"source":{"enum":["kalshi_bid_ask_mid","kalshi_last","polymarket_clob_mid","polymarket_gamma","limitless_clob_mid","limitless_prices"],"type":"string"},"stale":{"type":"boolean"},"stale_after_ms":{"minimum":0,"type":"integer"},"up":{"format":"double","maximum":1,"minimum":0,"type":"number"}},"required":["up","down","source","observed_at","age_ms","stale_after_ms","stale"],"title":"CryptoWindowQuote","type":"object"},"reference_source":{"description":"The oracle/index this listing resolves against. Two listings of the\nsame window with different reference sources are the\n`same_window_different_reference` match class, not `exact` -- they\ncan and do disagree on start price and result even on a near-flat\nwindow. `binance_usdt_1m_noon` is the Binance USDT 1-minute candle at\n12:00 America/New_York, used by Polymarket's daily up/down markets.\n","enum":["cf_benchmarks_rti","chainlink_twap_60s","binance_usdt_1h_candle","binance_usdt_1m_noon"],"type":"string"},"resolved_at":{"format":"date_time","nullable":true,"type":"string"},"result":{"description":"The venue's own result, passed through unchanged. `null` does not\nmean \"no\": a window whose status is `ended` has not necessarily been\nresolved by the venue yet -- see the result-latency notes on the\nparent window.\n","enum":["up","down","split"],"nullable":true,"type":"string"},"result_revision":{"description":"Increments on every terminal-state correction (including voided -> resolved and back).","minimum":0,"type":"integer"},"settlement_value":{"format":"double","nullable":true,"type":"number"},"start_price":{"format":"double","nullable":true,"type":"number"},"tie_rule":{"enum":["up","split"],"type":"string"},"venue":{"enum":["kalshi","polymarket","limitless"],"type":"string"}},"required":["venue","native_market_id","native_ref","reference_source","tie_rule","family_id","lifecycle","result_revision","last_changed_at"],"title":"CryptoWindowConstituent","type":"object"},"minItems":2,"type":"array"},"family_id":{"description":"Set for `exact` groups; null for `same_window_different_reference`.","format":"uuid","nullable":true,"type":"string"},"match_class":{"enum":["exact","same_window_different_reference"],"type":"string"},"tie_rule":{"description":"Set for `same_window_different_reference` groups; null for `exact`.","nullable":true,"type":"string"}},"required":["match_class","constituents"],"title":"CryptoWindowGroup","type":"object"},"type":"array"},"horizon":{"enum":["5m","15m","1h","1d"],"type":"string"},"status":{"description":"Computed relative to `as_of`; does not imply any constituent has a result.","enum":["upcoming","live","ended"],"type":"string"},"unmatched":{"items":{"properties":{"constituent":{"description":"One venue's native listing for a crypto window: its native IDs\n(`native_market_id`, `native_ref`, and `native_yes_token`/`native_no_token`\nwhen the venue exposes on-chain tokens) and, while the listing is quotable,\nan indicative `quote` from our one-minute poll. `result`/`resolved_at`/\n`end_price` are a pass-through of the venue's own settlement, never a\nSportsStack determination. Clients that need executable prices stream order\nbooks from the venue directly using the native IDs.\n","properties":{"end_price":{"format":"double","nullable":true,"type":"number"},"family_id":{"description":"Shared by every listing with the same window, reference source and tie rule.","format":"uuid","type":"string"},"last_changed_at":{"description":"Fetch time of the feed file that last changed this listing.","format":"date_time","type":"string"},"lifecycle":{"enum":["upcoming","live","closed","resolved","voided"],"type":"string"},"mirror_of":{"description":"For a Limitless listing, the Polymarket slug it mirrors.","nullable":true,"type":"string"},"native_market_id":{"description":"The venue's native market ID.","type":"string"},"native_no_token":{"description":"On-chain CLOB token ID for the Down/No side, when the venue exposes one.","nullable":true,"type":"string"},"native_ref":{"description":"The venue's ticker (Kalshi) or slug (Polymarket, Limitless).","type":"string"},"native_yes_token":{"description":"On-chain CLOB token ID for the Up/Yes side, when the venue exposes one.","nullable":true,"type":"string"},"quote":{"description":"The listing's indicative quote: our one-minute poll capture of the venue's\nprice (`observed_at` is OUR capture time, never a provider clock). `null`\nwhen the listing is not currently quotable: it is not `upcoming`/`live`, its\nwindow has ended, it has no quote, or the quote is older than 15 minutes.\nIndicative, not executable: `stale` is true once `age_ms` exceeds\n`stale_after_ms` (150 s for 5m/15m, 300 s for 1h, 600 s for 1d).\n","nullable":true,"properties":{"age_ms":{"minimum":0,"type":"integer"},"down":{"format":"double","maximum":1,"minimum":0,"type":"number"},"observed_at":{"format":"date_time","type":"string"},"source":{"enum":["kalshi_bid_ask_mid","kalshi_last","polymarket_clob_mid","polymarket_gamma","limitless_clob_mid","limitless_prices"],"type":"string"},"stale":{"type":"boolean"},"stale_after_ms":{"minimum":0,"type":"integer"},"up":{"format":"double","maximum":1,"minimum":0,"type":"number"}},"required":["up","down","source","observed_at","age_ms","stale_after_ms","stale"],"title":"CryptoWindowQuote","type":"object"},"reference_source":{"description":"The oracle/index this listing resolves against. Two listings of the\nsame window with different reference sources are the\n`same_window_different_reference` match class, not `exact` -- they\ncan and do disagree on start price and result even on a near-flat\nwindow. `binance_usdt_1m_noon` is the Binance USDT 1-minute candle at\n12:00 America/New_York, used by Polymarket's daily up/down markets.\n","enum":["cf_benchmarks_rti","chainlink_twap_60s","binance_usdt_1h_candle","binance_usdt_1m_noon"],"type":"string"},"resolved_at":{"format":"date_time","nullable":true,"type":"string"},"result":{"description":"The venue's own result, passed through unchanged. `null` does not\nmean \"no\": a window whose status is `ended` has not necessarily been\nresolved by the venue yet -- see the result-latency notes on the\nparent window.\n","enum":["up","down","split"],"nullable":true,"type":"string"},"result_revision":{"description":"Increments on every terminal-state correction (including voided -> resolved and back).","minimum":0,"type":"integer"},"settlement_value":{"format":"double","nullable":true,"type":"number"},"start_price":{"format":"double","nullable":true,"type":"number"},"tie_rule":{"enum":["up","split"],"type":"string"},"venue":{"enum":["kalshi","polymarket","limitless"],"type":"string"}},"required":["venue","native_market_id","native_ref","reference_source","tie_rule","family_id","lifecycle","result_revision","last_changed_at"],"title":"CryptoWindowConstituent","type":"object"},"reason":{"enum":["no_match","mirror_counterpart_missing","mirror_terms_disagree"],"type":"string"}},"required":["reason","constituent"],"title":"CryptoWindowUnmatched","type":"object"},"type":"array"},"window_end":{"format":"date_time","type":"string"},"window_id":{"format":"uuid","type":"string"},"window_start":{"format":"date_time","type":"string"}},"required":["window_id","asset","horizon","window_start","window_end","status","as_of","groups","unmatched"],"title":"CryptoWindow","type":"object"},"type":"array"},"page_size":{"maximum":200,"minimum":1,"type":"integer"}},"required":["data","after","page_size","as_of"],"title":"CryptoWindowPage","type":"object"}}},"description":"Crypto window page"},"400":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"bad_request","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/bad_request","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"invalid_api_key","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/invalid_api_key","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"forbidden","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/forbidden","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Forbidden"},"503":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"service_unavailable","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/service_unavailable","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Service Unavailable"}},"summary":"List crypto up/down windows matched across Kalshi, Polymarket and Limitless","tags":["Prediction Markets"]}},"/api/v1/event-stats/{id}":{"get":{"callbacks":{},"operationId":"ApiRestWeb.EventStatsController.show","parameters":[{"description":"Event Stats ID (UUID)","example":"01c7133f-2999-4803-9872-8c2ab1ba63ac","in":"path","name":"id","required":true,"schema":{"type":"string"}},{"description":"Include source mappings from the specific integration (i.e. a provider key) will return a source_mappings object with the mappings for the respective objects","in":"query","name":"return_source_id_format","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"description":"Performance statistics for players and teams within a specific event.\n\nContains both actual game results and projected/fantasy statistics from various data providers.\nFor comprehensive sport-specific stat definitions, see the EventScopedStats model documentation.\n\n## Core Concepts\n- **Entity Types**: \"player\" (individual stats) or \"team\" (team-level stats)\n- **Data Sources**: official feeds and projection providers (see `source`)\n- **Projections vs Actuals**: is_projection distinguishes forecasts from results\n- **Sport Variation**: data field contains sport/league-specific statistics\n\n## Sample Stats by Sport\n- **Football**: passing_yards, rushing_touchdowns, receptions, sacks, field_goals_made\n- **Basketball**: points, rebounds, assists, field_goals_made, three_pointers_made\n- **Baseball**: hits, home_runs, rbis, strikeouts, earned_run_average, saves\n- **Hockey**: goals, assists, shots, penalty_minutes, save_percentage, wins\n- **Golf**: score, position, money_earned, eagles, birdies, made_cut\n","example":{"common_model_id":"49306211-7b48-4b5e-88e9-a4190189dbea","data":{"completion_percentage":68.2,"interceptions":0.8,"passing_touchdowns":2.1,"passing_yards":285.5,"rushing_yards":22.3},"event_id":"a96af633-aee6-48a0-bf72-0865a4419772","for_entity_id":"59291391-0c7e-442b-9496-33074647384e","for_entity_type":"player","inserted_at":"2024-08-26T22:03:16-04:00","is_projection":true,"scheduled_start_time":"2024-11-17T13:00:00Z","season_year":2024,"source":"ftn","team_id":"b3f7a1c2-9d4e-4f8a-b5c6-1a2b3c4d5e6f","updated_at":"2024-08-26T22:03:16-04:00","week":12},"properties":{"common_model_id":{"description":"EventScopedStats ID","format":"uuid","type":"string"},"data":{"additionalProperties":false,"description":"Sport and position-specific performance statistics with canonical field names.\n\n## Standardized Stat Names\nAll statistics use our unified canonical naming system to ensure consistency across data providers.\nFor example, passing yards from two different providers (\"pass_yds\" and \"py\") both map to \"passing_yards\".\n\n## Current Football Stats (Auto-Generated)\nThis schema is automatically synchronized with our stat registry to include:\n- **Passing**: passing_yards, passing_attempts, passing_completions, passing_tds, interceptions, sacks, deep_pass_completions, pass_long, interception_worthy_throws, pass_first_downs, passing_yards_300_plus, passing_tds_40_plus_yards, deep_pass_attempts, depth_of_target, spikes, passing_rating, completion_percentage, passing_avg_yards, passing_air_yards, passing_net_yards, passing_gross_yards, redzone_passing_attempts, passing_longest_touchdown, on_target_throws, poor_throws, defended_passes, dropped_passes, batted_passes, qb_hurries, qb_knockdowns, avg_pocket_time, total_pocket_time, blitzes_faced, throwaways, spikes, interception_touchdowns_thrown, sacks_taken, sack_yards_lost, passing_20_plus, passing_40_plus, time_to_throw, throw_away, is_out_of_pocket, passing_two_point_conversions\n- **Rushing**: rushing_yards, rushing_attempts, rushing_tds, successful_rush_attempts, explosive_runs, rush_rate, rush_long, goal_line_touches, rushing_first_downs, rushing_yards_100_plus, rushing_tds_40_plus_yards, rushing_direction, kneels, rushing_fumbles, rushing_20_plus, rushing_40_plus, rushing_avg_yards, rushing_longest_touchdown, redzone_rushing_attempts, broken_tackles, yards_after_contact, kneel_downs, scrambles, tackles_for_loss, tackles_for_loss_yards, rushing_two_point_conversions\n- **Receiving**: receiving_yards, receptions, receiving_targets, receiving_tds, dropped_pass, first_read_targets, first_read_receptions, contested_ball, catchable_ball, created_reception, deep_targets, deep_receptions, rec_long, cushion_yards, receiving_first_downs, receiving_yards_100_plus, receiving_tds_40_plus_yards, deep_pass_receptions, receiving_20_plus, receiving_40_plus, receiving_fumbles, separation_yards, separation_type, yards_after_catch, route_type, receiving_two_point_conversions\n- **Defense**: fumbles, forced_fumbles, fumbles_recovered, assisted_tackles, solo_tackles, total_tackles, defensive_tackles_combined, special_teams_solo_tackles, special_teams_assisted_tackles, misc_solo_tackles, misc_assisted_tackles, passes_defended, safeties, blocked_kicks, defensive_touchdowns, tackles, def_sack_yards, def_tackles_assisted, def_interception_touchdowns, def_interception_yards, defensive_interceptions, tackles_for_loss, tackles_for_loss_yards, quarterback_hits, fumble_return_yards, fumble_return_touchdowns, interception_return_yards, interception_return_touchdowns, interception_long, interception_return_average, interception_returns, interception_return_longest_touchdown, fumble_long, missed_tackle, missed_tackle_cause, missed_or_broken_tackles, missed_tackle_location, batted_pass, passing_attempts_allowed, passing_completions_allowed, passing_yards_allowed, rushing_attempts_allowed, rushing_yards_allowed, passing_touchdowns_allowed, rushing_touchdowns_allowed, fourth_down_stops, extra_point_return_touchdowns\n- **Kicking**: field_goals_made, field_goals_attempts, field_goal_yards, field_goal_percentage, fg_long, extra_points_made, extra_points_attempted, extra_points_blocked, field_goals_blocked, field_goals_missed, extra_points_missed\n- **Fantasy**: fantasy_points_half_ppr, nfl_fantasy_points, draftkings_fantasy_points, fanduel_fantasy_points, rank, yahoo_fantasy_points, fanduel_fantasy_points_ceiling, draftkings_fantasy_points_ceiling, yahoo_fantasy_points_ceiling, draftkings_ownership, fanduel_ownership, fanduel_rating, draftkings_rating\n\n## Provider Mapping\nOur system automatically translates provider-specific stat names to these canonical names:\n- **Provider A**: \"pass_yds\" → \"passing_yards\"\n- **Provider B**: \"py\" → \"passing_yards\"\n- **Provider C**: \"pass_yd\" → \"passing_yards\"\n\nSee the complete stat registry documentation for all supported stats and provider mappings.\n","example":{"fantasy_points_half_ppr":18.5,"passing_attempts":35,"passing_completions":22,"passing_tds":2,"passing_yards":250,"receiving_tds":1,"receiving_yards":95,"receptions":6,"rushing_attempts":18,"rushing_tds":1,"rushing_yards":85},"properties":{"def_interception_touchdowns":{"description":"Defensive interception touchdowns","example":5,"type":"integer"},"throwaways":{"description":"Number of throw away passes","example":5,"type":"integer"},"fanduel_fantasy_points_ceiling":{"description":"FanDuel fantasy points ceiling","example":18.5,"type":"number"},"on_target_throws":{"description":"Number of on-target throws","example":5,"type":"integer"},"interception_returns":{"description":"Number of interception returns","example":5,"type":"integer"},"kickoff_return_touchdowns":{"description":"Kickoff return touchdowns","example":5,"type":"integer"},"extra_points_attempted":{"description":"Number of extra point attempts","example":5,"type":"integer"},"redzone_rushing_attempts":{"description":"Rush attempts in the red zone","example":15,"type":"integer"},"is_motion":{"description":"Whether player was in motion during play","example":"example_value","type":"boolean"},"passing_attempts":{"description":"Total number of pass attempts","example":15,"type":"integer"},"punt_long":{"description":"Longest punt","example":5,"type":"integer"},"fumble_return_yards":{"description":"Yards gained on fumble returns","example":250,"type":"integer"},"first_read_receptions":{"description":"Number of first read receptions","example":5,"type":"integer"},"red_zone_pass_attempts":{"description":"Pass attempts in red zone","example":15,"type":"integer"},"points":{"description":"Total points scored by team","example":5,"type":"integer"},"depth_of_target":{"description":"Average depth of target","example":12.3,"type":"number"},"defensive_interceptions":{"description":"Defensive interceptions","example":5,"type":"integer"},"receiving_two_point_conversions":{"description":"Receiving two-point conversions","example":5,"type":"integer"},"field_goal_yards":{"description":"Yards gained on field goals","example":250,"type":"integer"},"conversion_defense_successes":{"description":"Two-point conversion defensive successes","example":5,"type":"integer"},"blocked_kick_return_touchdowns":{"description":"Touchdowns scored on blocked kick returns","example":5,"type":"integer"},"fanduel_ownership":{"description":"FanDuel ownership percentage","example":12.3,"type":"number"},"draftkings_fantasy_points_ceiling":{"description":"DraftKings fantasy points ceiling","example":18.5,"type":"number"},"first_read_targets":{"description":"Number of first read targets","example":5,"type":"integer"},"special_teams_snap_count":{"description":"Number of special teams snaps played","example":5,"type":"integer"},"out_of_pocket_reason":{"description":"Reason quarterback left the pocket","example":"example_value","type":"string"},"goal_line_touches":{"description":"Number of goal line touches","example":5,"type":"integer"},"receiving_yards_100_plus":{"description":"Number of 100+ yard receiving games","example":250,"type":"integer"},"total_pocket_time":{"description":"Total time spent in pocket","example":12.3,"type":"number"},"interception_return_longest_touchdown":{"description":"Longest interception return for touchdown","example":5,"type":"integer"},"field_goals_attempts":{"description":"Number of field goal attempts","example":15,"type":"integer"},"safeties":{"description":"Number of safeties","example":5,"type":"integer"},"pass_first_downs":{"description":"First downs gained via passing","example":5,"type":"integer"},"red_zone_passing_completions":{"description":"Passing completions in red zone","example":10,"type":"integer"},"net_punt_yards":{"description":"Net punt yards","example":250,"type":"integer"},"kneel_downs":{"description":"Number of kneel downs","example":5,"type":"integer"},"cushion_yards":{"description":"Cushion yards","example":250,"type":"integer"},"punt_yards":{"description":"Total punt yards","example":250,"type":"integer"},"challenges_remaining":{"description":"Number of challenges remaining","example":5,"type":"integer"},"passing_gross_yards":{"description":"Gross passing yards before sacks","example":250,"type":"integer"},"avg_pocket_time":{"description":"Average time in pocket per pass attempt","example":12.3,"type":"number"},"defended_passes":{"description":"Passes defended by defenders","example":5,"type":"integer"},"dropped_pass":{"description":"Number of dropped passes","example":5,"type":"integer"},"rushing_direction":{"description":"Direction of rushing attempt","example":"example_value","type":"string"},"sacks_taken":{"description":"Number of sacks taken by quarterback","example":5,"type":"integer"},"rec_long":{"description":"Longest reception","example":5,"type":"integer"},"yards_after_catch":{"description":"Yards gained after catch","example":250,"type":"integer"},"activated":{"description":"Player was activated to the game-day roster (shipped as 0/1)","example":5,"type":"integer"},"passing_yards":{"description":"Total passing yards thrown by the player/team","example":250,"type":"integer"},"touchdowns":{"description":"Total touchdowns scored","example":5,"type":"integer"},"rushing_fumbles":{"description":"Number of fumbles while rushing","example":5,"type":"integer"},"pre_snap_motion":{"description":"Player pre-snap motion type","example":"example_value","type":"boolean"},"nfl_fantasy_points":{"description":"NFL fantasy points","example":18.5,"type":"number"},"assisted_tackles":{"description":"Number of assisted tackles","example":5,"type":"integer"},"passing_completions":{"description":"Number of completed passes","example":10,"type":"integer"},"sacks":{"description":"Number of sacks (as QB or defensive player)","example":12.3,"type":"number"},"passing_40_plus":{"description":"Passing completions of 40+ yards","example":5,"type":"integer"},"missed_tackle_location":{"description":"Location of missed tackle","example":"example_value","type":"string"},"rushing_longest_touchdown":{"description":"Longest touchdown rush","example":5,"type":"integer"},"penalty_yards":{"description":"Penalty yards assessed","example":250,"type":"integer"},"rushing_tds_40_plus_yards":{"description":"Rushing touchdowns of 40+ yards","example":250,"type":"integer"},"penalties":{"description":"Number of penalties committed","example":5,"type":"integer"},"rushing_yards":{"description":"Total rushing yards gained","example":250,"type":"integer"},"punt_return_yards":{"description":"Punt return yards","example":250,"type":"integer"},"blocked_kicks":{"description":"Number of blocked kicks","example":5,"type":"integer"},"position":{"description":"Player position","example":"example_value","type":"string"},"sack_yards_lost":{"description":"Yards lost on sacks","example":250,"type":"integer"},"kickoff_touchbacks":{"description":"Number of kickoff touchbacks","example":5,"type":"integer"},"def_interception_yards":{"description":"Defensive interception return yards","example":250,"type":"integer"},"rush_long":{"description":"Longest rush","example":5,"type":"integer"},"played":{"description":"Whether the player appeared in the game","example":"example_value","type":"boolean"},"two_point_conversions":{"description":"Number of two-point conversions","example":5,"type":"integer"},"conversion_defense_attempts":{"description":"Two-point conversion defensive attempts","example":15,"type":"integer"},"tackles":{"description":"Total tackles (solo + assisted)","example":5,"type":"integer"},"return_yards":{"description":"Total return yards (kick/punt combined)","example":250,"type":"integer"},"kickoff_return_yards":{"description":"Total yards on kickoff returns (opponent)","example":250,"type":"integer"},"games_played":{"description":"Number of games played in","example":5,"type":"integer"},"receiving_20_plus":{"description":"Receptions of 20+ yards","example":5,"type":"integer"},"field_goals_missed":{"description":"Field goals missed","example":5,"type":"integer"},"draftkings_rating":{"description":"DraftKings player rating","example":98.7,"type":"number"},"pre_snap_alignment":{"description":"Player pre-snap alignment","example":"example_value","type":"string"},"kickoff_inside_20":{"description":"Kickoffs downed inside the 20 yard line","example":5,"type":"integer"},"batted_passes":{"description":"Passes batted down at line of scrimmage","example":5,"type":"integer"},"rushing_avg_yards":{"description":"Average yards per carry","example":12.3,"type":"number"},"interception_long":{"description":"Longest interception return","example":5,"type":"integer"},"special_teams_assisted_tackles":{"description":"Assisted tackles made on special-teams plays (kick and punt coverage)","example":5,"type":"integer"},"time_to_throw":{"description":"Time from snap to ball release in seconds","example":12.3,"type":"number"},"player_id":{"description":"Player identifier","example":"example_value","type":"string"},"kickoff_out_of_bounds":{"description":"Kickoffs out of bounds","example":5,"type":"integer"},"pass_long":{"description":"Longest pass completion","example":5,"type":"integer"},"fanduel_fantasy_points":{"description":"FanDuel fantasy points","example":18.5,"type":"number"},"def_tackles_assisted":{"description":"Defensive assisted tackles","example":5,"type":"integer"},"punts_inside_20":{"description":"Number of punts inside the 20-yard line","example":5,"type":"integer"},"solo_tackles":{"description":"Number of solo tackles","example":5,"type":"integer"},"redzone_passing_attempts":{"description":"Pass attempts in the red zone","example":15,"type":"integer"},"poor_throws":{"description":"Number of poor throws","example":5,"type":"integer"},"opponent_fumble_recovery_touchdowns":{"description":"Touchdowns on opponent fumble recoveries","example":5,"type":"integer"},"opponent_fumble_recoveries":{"description":"Opponent fumble recoveries","example":5,"type":"integer"},"deep_pass_attempts":{"description":"Deep pass attempts","example":15,"type":"integer"},"gross_kickoff_yards":{"description":"Yards gained on gross kickoffs","example":250,"type":"integer"},"qb_knockdowns":{"description":"Times quarterback was knocked down","example":5,"type":"integer"},"passing_attempts_allowed":{"description":"Passing attempts allowed by defense","example":15,"type":"integer"},"misc_solo_tackles":{"description":"Solo tackles made on change-of-possession plays (interception and fumble returns)","example":5,"type":"integer"},"total_tackles":{"description":"Total tackles across every phase of the game -- scrimmage defense plus special teams plus change-of-possession (misc) plays. This is the quantity NFL tackle props are priced and graded on.","example":5,"type":"integer"},"deep_targets":{"description":"Number of deep targets (20+ yards)","example":5,"type":"integer"},"fumbles":{"description":"Total number of fumbles","example":5,"type":"integer"},"fourth_down_stops":{"description":"Fourth down stops recorded by defense","example":5,"type":"integer"},"rushing_two_point_conversions":{"description":"Rushing two-point conversions","example":5,"type":"integer"},"missed_or_broken_tackles":{"description":"Number of missed or broken tackles","example":5,"type":"integer"},"receiving_yards":{"description":"Total receiving yards gained","example":250,"type":"integer"},"fanduel_rating":{"description":"FanDuel player rating","example":98.7,"type":"number"},"separation_type":{"description":"Type of separation","example":"example_value","type":"string"},"pressure_type":{"description":"Pressure type","example":"example_value","type":"string"},"timeouts_used":{"description":"Number of timeouts used","example":5,"type":"integer"},"returns":{"description":"Number of return attempts (kick/punt)","example":5,"type":"integer"},"conversion_passing_attempts":{"description":"Two-point conversion passing attempts","example":15,"type":"integer"},"net_kickoff_yards":{"description":"Yards gained on net kickoffs","example":250,"type":"integer"},"receiving_targets":{"description":"Number of times targeted for a pass","example":5,"type":"integer"},"extra_points_blocked":{"description":"Number of extra points blocked","example":5,"type":"integer"},"receptions":{"description":"Number of receptions/catches","example":5,"type":"integer"},"snap_counts_confirmed":{"description":"Provider confirms the snap counts for this game are final","example":"example_value","type":"boolean"},"motion_at_snap":{"description":"Player motion status at snap","example":"example_value","type":"boolean"},"receiving_fumbles":{"description":"Number of fumbles while receiving","example":5,"type":"integer"},"explosive_runs":{"description":"Number of explosive rushing attempts (10+ yards)","example":5,"type":"integer"},"rushing_40_plus":{"description":"Rushing attempts of 40+ yards","example":5,"type":"integer"},"interceptions":{"description":"Number of interceptions thrown","example":5,"type":"integer"},"quarterback_hits":{"description":"Number of quarterback hits","example":5,"type":"integer"},"interception_return_yards":{"description":"Yards gained on interception returns","example":250,"type":"integer"},"yahoo_fantasy_points_ceiling":{"description":"Yahoo fantasy points ceiling","example":18.5,"type":"number"},"primary_coverage":{"description":"Primary coverage","example":"example_value","type":"boolean"},"secondary_coverage":{"description":"Secondary coverage","example":"example_value","type":"boolean"},"fumbles_recovered":{"description":"Number of fumbles recovered","example":5,"type":"integer"},"rushing_20_plus":{"description":"Rushing attempts of 20+ yards","example":5,"type":"integer"},"throw_away":{"description":"Whether the pass was intentionally thrown away","example":"example_value","type":"boolean"},"field_goal_percentage":{"description":"Field goal percentage (made/attempted)","example":12.3,"type":"number"},"receiving_tds":{"description":"Number of receiving touchdowns","example":2,"type":"integer"},"passes_defended":{"description":"Number of passes defended","example":5,"type":"integer"},"fumble_return_touchdowns":{"description":"Touchdowns scored on fumble returns","example":5,"type":"integer"},"completion_percentage":{"description":"Pass completion percentage","example":12.3,"type":"number"},"interception_worthy_throws":{"description":"Interception worthy throws","example":5,"type":"integer"},"red_zone_targets":{"description":"Number of targets in the red zone","example":5,"type":"integer"},"allowed_pressure":{"description":"Allowed pressure","example":"example_value","type":"boolean"},"kickoff_yards":{"description":"Total kickoff yards","example":250,"type":"integer"},"qb_hurries":{"description":"Times quarterback was hurried","example":5,"type":"integer"},"kickoff_returns":{"description":"Number of kickoff returns by opponents","example":5,"type":"integer"},"passing_two_point_conversions":{"description":"Passing two-point conversions","example":5,"type":"integer"},"first_downs":{"description":"Total first downs (used for passing first downs in SR)","example":5,"type":"integer"},"defensive_touchdowns":{"description":"Number of defensive touchdowns","example":5,"type":"integer"},"opponent_fumble_recovery_yards":{"description":"Yards gained on opponent fumble recoveries","example":250,"type":"integer"},"blocked_kick_returns":{"description":"Number of blocked kick returns","example":5,"type":"integer"},"conversion_rushing_attempts":{"description":"Two-point conversion rushing attempts","example":15,"type":"integer"},"extra_point_return_touchdowns":{"description":"Extra point attempts returned for a touchdown by the defense","example":5,"type":"integer"},"own_fumble_recoveries":{"description":"Own fumble recoveries","example":5,"type":"integer"},"punts_blocked":{"description":"Number of punts blocked","example":5,"type":"integer"},"rush_rate":{"description":"Rush rate (rushing attempts per play)","example":12.3,"type":"number"},"passing_avg_yards":{"description":"Average yards per pass attempt","example":12.3,"type":"number"},"special_teams_solo_tackles":{"description":"Solo tackles made on special-teams plays (kick and punt coverage)","example":5,"type":"integer"},"red_zone_passing_attempts":{"description":"Passing attempts in red zone","example":15,"type":"integer"},"conversion_rushing_successes":{"description":"Two-point conversion rushing successes","example":5,"type":"integer"},"dropped_passes":{"description":"Passes dropped by receivers","example":5,"type":"integer"},"passing_net_yards":{"description":"Net passing yards (gross yards minus sack yards lost)","example":250,"type":"integer"},"rushing_first_downs":{"description":"First downs gained via rushing","example":5,"type":"integer"},"passing_yards_allowed":{"description":"Passing yards allowed by defense","example":250,"type":"integer"},"tackles_for_loss_yards":{"description":"Yards lost on tackles for loss","example":250,"type":"integer"},"punt_touchbacks":{"description":"Number of punt touchbacks","example":5,"type":"integer"},"missed_tackle_cause":{"description":"Cause of missed tackle","example":"example_value","type":"string"},"missed_tackle":{"description":"Number of missed tackles","example":5,"type":"integer"},"own_fumble_recovery_touchdowns":{"description":"Touchdowns on own fumble recoveries","example":5,"type":"integer"},"auction_value":{"description":"Auction draft value","example":12.3,"type":"number"},"rushing_attempts_allowed":{"description":"Rushing attempts allowed by defense","example":15,"type":"integer"},"receiving_first_downs":{"description":"First downs gained via receiving","example":5,"type":"integer"},"fg_long":{"description":"Longest field goal made","example":5,"type":"integer"},"own_fumble_recovery_yards":{"description":"Yards gained on own fumble recoveries","example":250,"type":"integer"},"player_kickoff_return_yards":{"description":"Kickoff return yards recorded by the returning player","example":250,"type":"integer"},"timeouts_remaining":{"description":"Number of timeouts remaining","example":5,"type":"integer"},"defensive_tackles_combined":{"description":"Tackles (solo + assisted) made on scrimmage defense only, excluding special teams and change-of-possession plays","example":5,"type":"integer"},"tackles_for_loss":{"description":"Rushes resulting in tackles for loss","example":5,"type":"integer"},"rushing_attempts":{"description":"Number of rushing attempts","example":15,"type":"integer"},"games_started":{"description":"Number of games started","example":5,"type":"integer"},"rank":{"description":"Player ranking","example":5,"type":"integer"},"fielding_e":{"description":"Fielding errors","example":5,"type":"integer"},"kickoff_onside_successes":{"description":"Successful onside kicks","example":5,"type":"integer"},"scrambles":{"description":"Number of quarterback scrambles","example":5,"type":"integer"},"passing_touchdowns_allowed":{"description":"Passing touchdowns allowed by defense","example":5,"type":"integer"},"passing_tds":{"description":"Number of passing touchdowns","example":2,"type":"integer"},"spikes":{"description":"Number of spiked passes","example":5,"type":"integer"},"punt_return_attempts":{"description":"Punt return attempts","example":15,"type":"integer"},"conversion_passing_successes":{"description":"Two-point conversion passing successes","example":5,"type":"integer"},"deep_pass_completions":{"description":"Deep pass completions (20+ yards)","example":10,"type":"integer"},"forced_fumbles":{"description":"Number of fumbles forced by defender","example":5,"type":"integer"},"interception_touchdowns_thrown":{"description":"Interceptions returned for touchdowns (pick-6s)","example":5,"type":"integer"},"punt_return_touchdowns":{"description":"Punt return touchdowns","example":5,"type":"integer"},"is_out_of_pocket":{"description":"Whether quarterback left the pocket","example":"example_value","type":"boolean"},"passing_yards_300_plus":{"description":"Passing yards over 300","example":250,"type":"integer"},"kickoff_return_attempts":{"description":"Kickoff return attempts","example":15,"type":"integer"},"rushing_yards_allowed":{"description":"Rushing yards allowed by defense","example":250,"type":"integer"},"jersey":{"description":"Player jersey number","example":"example_value","type":"string"},"passing_rating":{"description":"Quarterback passer rating","example":98.7,"type":"number"},"contested_ball":{"description":"Whether the targeted receiver's pass was contested","example":"example_value","type":"boolean"},"field_goals_made":{"description":"Number of field goals made","example":5,"type":"integer"},"interception_return_average":{"description":"Average yards per interception return","example":12.3,"type":"number"},"extra_points_missed":{"description":"Extra points missed","example":5,"type":"integer"},"yahoo_fantasy_points":{"description":"Yahoo fantasy points","example":18.5,"type":"number"},"defensive_snap_count":{"description":"Number of defensive snaps played","example":5,"type":"integer"},"endzone_fumble_recovery_touchdowns":{"description":"Touchdowns from end zone fumble recoveries","example":5,"type":"integer"},"rushing_touchdowns_allowed":{"description":"Rushing touchdowns allowed by defense","example":5,"type":"integer"},"return_tds":{"description":"Number of return touchdowns","example":2,"type":"integer"},"kickoff_endzone":{"description":"Kickoffs reaching the end zone","example":5,"type":"integer"},"snap_count":{"description":"Number of offensive snaps played","example":5,"type":"integer"},"def_sack_yards":{"description":"Defensive sack yards","example":250,"type":"integer"},"batted_pass":{"description":"Number of passes batted down by defense","example":5,"type":"integer"},"route_type":{"description":"Type of route run by receiver","example":"example_value","type":"string"},"receiving_40_plus":{"description":"Receptions of 40+ yards","example":5,"type":"integer"},"passing_tds_40_plus_yards":{"description":"Passing touchdowns of 40+ yards","example":250,"type":"integer"},"fumbles_out_of_bounds":{"description":"Number of fumbles that went out of bounds","example":5,"type":"integer"},"deep_pass_receptions":{"description":"Deep pass receptions","example":5,"type":"integer"},"fumbles_lost":{"description":"Number of fumbles lost to opponent","example":5,"type":"integer"},"fumble_long":{"description":"Longest fumble return","example":5,"type":"integer"},"punt_fair_catch":{"description":"Number of punt fair catches","example":5,"type":"integer"},"is_successful_play":{"description":"Whether the play was successful","example":"example_value","type":"boolean"},"total":{"description":"Over/under total for betting","example":12.3,"type":"number"},"applied_pressure":{"description":"Applied pressure","example":"example_value","type":"boolean"},"rushing_tds":{"description":"Number of rushing touchdowns","example":2,"type":"integer"},"passing_air_yards":{"description":"Total air yards on pass attempts","example":250,"type":"integer"},"punt_average":{"description":"Average yards per punt","example":12.3,"type":"number"},"field_goals_blocked":{"description":"Number of field goals blocked","example":5,"type":"integer"},"created_reception":{"description":"Whether the receiver created the reception through an exceptional play","example":"example_value","type":"boolean"},"shotgun":{"description":"Plays run from shotgun formation","example":5,"type":"integer"},"kickoff_attempts":{"description":"Total kickoff attempts","example":15,"type":"integer"},"yards_after_contact":{"description":"Yards gained after contact","example":250,"type":"integer"},"kickoff_onside_attempts":{"description":"Onside kick attempts","example":15,"type":"integer"},"receiving_tds_40_plus_yards":{"description":"Receiving touchdowns of 40+ yards","example":250,"type":"integer"},"catchable_ball":{"description":"Whether the targeted receiver's pass was catchable","example":"example_value","type":"boolean"},"passing_longest_touchdown":{"description":"Longest touchdown pass","example":5,"type":"integer"},"separation_yards":{"description":"Separation distance in yards from defender","example":12.3,"type":"number"},"spread":{"description":"Point spread for betting","example":12.3,"type":"number"},"draftkings_ownership":{"description":"DraftKings ownership percentage","example":12.3,"type":"number"},"conversion_receiving_successes":{"description":"Two-point conversion receiving successes","example":5,"type":"integer"},"extra_points_made":{"description":"Number of extra points made","example":5,"type":"integer"},"blocked_kick_return_yards":{"description":"Yards gained on blocked kick returns","example":250,"type":"integer"},"passing_completions_allowed":{"description":"Passing completions allowed by defense","example":10,"type":"integer"},"interception_return_touchdowns":{"description":"Touchdowns scored on interception returns","example":5,"type":"integer"},"successful_rush_attempts":{"description":"Number of successful rushing attempts","example":15,"type":"integer"},"passing_20_plus":{"description":"Passing completions of 20+ yards","example":5,"type":"integer"},"broken_tackles":{"description":"Number of broken tackles","example":5,"type":"integer"},"conversion_receiving_attempts":{"description":"Two-point conversion receiving attempts","example":15,"type":"integer"},"deep_receptions":{"description":"Deep receptions (20+ yards)","example":5,"type":"integer"},"misc_assisted_tackles":{"description":"Assisted tackles made on change-of-possession plays (interception and fumble returns)","example":5,"type":"integer"},"rushing_yards_100_plus":{"description":"Number of 100+ yard rushing games","example":250,"type":"integer"},"draftkings_fantasy_points":{"description":"DraftKings fantasy points","example":18.5,"type":"number"},"challenges_used":{"description":"Number of challenges used","example":5,"type":"integer"},"blitzes_faced":{"description":"Number of blitzes faced","example":5,"type":"integer"},"punt_attempts":{"description":"Number of punt attempts","example":15,"type":"integer"},"penalty_first_downs":{"description":"First downs gained via opponent penalties","example":5,"type":"integer"},"declared_inactive":{"description":"Player was on the officially declared inactive list for this game","example":"example_value","type":"boolean"},"kneels":{"description":"Number of quarterback kneels","example":5,"type":"integer"},"fantasy_points_half_ppr":{"description":"Fantasy points in half-PPR scoring","example":18.5,"type":"number"}},"type":"object"},"event_id":{"description":"Common model ID of the event","example":"a96af633-aee6-48a0-bf72-0865a4419772","format":"uuid","type":"string"},"for_entity_id":{"description":"Common model ID of the entity (player or team)","example":"59291391-0c7e-442b-9496-33074647384e","format":"uuid","type":"string"},"for_entity_type":{"description":"Type of entity the stats belong to","enum":["player","team"],"example":"player","type":"string"},"inserted_at":{"description":"Creation timestamp","format":"date-time","type":"string"},"is_projection":{"description":"true = projected/forecasted stats, false = actual game results","example":true,"type":"boolean"},"scheduled_start_time":{"description":"Event scheduled start time","example":"2024-11-17T13:00:00Z","format":"date-time","type":"string"},"season_year":{"description":"Season year","example":2024,"type":"integer"},"source":{"description":"Data provider/source of the statistics","enum":["sportradar","ftn","espn","fantasylabs","awesemo"],"example":"ftn","type":"string"},"superseded_from_id":{"description":"Originally requested SportsStack ID when this response was resolved through a superseded identity. Omitted for canonical lookups.","format":"uuid","nullable":true,"type":"string"},"team_id":{"description":"Common model ID of the team the player belongs to for this event (only set for player stats)","format":"uuid","type":"string"},"updated_at":{"description":"Last update timestamp","format":"date-time","type":"string"},"week":{"description":"Week number (for weekly sports like NFL)","example":12,"type":"integer"}},"required":["common_model_id","for_entity_type","for_entity_id","event_id","source"],"title":"EventScopedStats","type":"object"}}},"description":"EventStats Response"},"400":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"bad_request","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/bad_request","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Bad Request"},"410":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"gone","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/gone","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Gone"}},"summary":"Show Event Stats","tags":["Stats & Data"]}},"/api/v1/sports/{id}":{"get":{"callbacks":{},"operationId":"ApiRestWeb.SportController.show","parameters":[{"description":"Sport ID (UUID)","example":"01c7133f-2999-4803-9872-8c2ab1ba63ac","in":"path","name":"id","required":true,"schema":{"type":"string"}},{"description":"Include source mappings from the specific integration (i.e. a provider key) will return a source_mappings object with the mappings for the respective objects","in":"query","name":"return_source_id_format","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"description":"A sport represents a distinct category of competitive physical activity with standardized rules.\n\nSports serve as the highest-level organizational category in our data hierarchy. Each sport\nhas unique characteristics including scoring systems, game duration, participant types,\nand statistical categories. Sports contain multiple leagues and competitions worldwide.\n\n## Supported Sports\nOur platform covers major professional and amateur sports:\n- **Team Sports**: Football (American), Basketball, Baseball, Hockey, Soccer\n- **Individual Sports**: Golf, Tennis, Boxing, MMA, Track & Field\n- **Motor Sports**: Formula 1, NASCAR, IndyCar\n- **Olympic Sports**: Swimming, Gymnastics, Wrestling\n\n## Sport Characteristics\nEach sport has distinct features that affect data structure:\n- **Scoring**: Points, goals, runs, strokes, time-based\n- **Duration**: Timed periods, innings, rounds, holes\n- **Participants**: Teams vs. individuals, roster sizes\n- **Seasons**: Annual cycles, tournament formats, continuous competition\n\n## Data Implications\nSport type determines:\n- Available statistical categories\n- Event structure and participant types\n- Betting market types and options\n- Performance measurement standards\n","example":{"abbreviation":"bball","common_model_id":"4af4c296-6fbc-4705-8660-3b587c252e16","image_url":"https://cdn.example.com/icons/basketball.png","name":"basketball"},"properties":{"abbreviation":{"description":"Common abbreviation or short code","type":"string"},"common_model_id":{"description":"Unique sport identifier in our classification system","type":"string"},"image_url":{"description":"Sport icon or representative image","type":"string"},"name":{"description":"Standard sport name (e.g., 'basketball', 'football', 'golf')","type":"string"}},"required":["name","abbreviation"],"title":"Sport","type":"object"}}},"description":"Sport Response"},"400":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"bad_request","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/bad_request","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Bad Request"}},"summary":"Show Sport","tags":["Reference"]}},"/api/v1/news/{type}/{id}":{"get":{"callbacks":{},"operationId":"ApiRestWeb.NewsController.show_by_entity","parameters":[{"description":"Entity type (player or team)","in":"path","name":"type","required":true,"schema":{"enum":["player","team"],"example":"player","type":"string"}},{"description":"Entity ID (UUID)","in":"path","name":"id","required":true,"schema":{"example":"123e4567-e89b-12d3-a456-426614174000","format":"uuid","type":"string"}},{"description":"Page number for page/per_page pagination. Do not combine with limit/offset.","in":"query","name":"page","required":false,"schema":{"default":1,"minimum":1,"type":"integer"}},{"description":"Number of items per page (max 1000). Do not combine with limit/offset.","in":"query","name":"per_page","required":false,"schema":{"default":50,"maximum":1000,"minimum":1,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"description":"News and insights about sports entities including players, teams, events, and leagues.\n\nNews items provide automated analysis, commentary, and insights based on performance data,\nstatistical trends, and recent activity. Each news item contains multiple types of analysis\ntailored for different audiences including media, fantasy sports, and betting markets.\n","example":{"analysis":"Allen's recent rushing success stems from the Bills' increased use of designed quarterback runs in the red zone, capitalizing on his 6'5\" frame and surprising mobility. This strategic shift has coincided with the team's push for playoff positioning, as the coaching staff recognizes Allen's unique ability to create mismatches against smaller linebackers and defensive backs in short-yardage situations.","author":"Matthew Berry","betting_analysis":"Allen's rushing touchdown prop has moved from +125 to -110 over the past two weeks, reflecting bookmakers' adjustment to his recent red zone usage. The over on his rushing yards has hit in 8 of his last 10 games, creating value for bettors who recognize this trend early.","date":"2024-01-15","edit_history":[{"changes":{"tags":["fantasy_football","playoff_implications","rushing_qb","red_zone"]},"editor_id":"user-456","timestamp":"2024-01-15T12:00:00Z"}],"event_id":"456e7890-f12b-34c5-d678-901234567890","for_entity_id":"123e4567-e89b-12d3-a456-426614174000","for_entity_type":"player","headline":"Josh Allen's Rushing Touchdowns Fuel Fantasy Surge Ahead of Playoffs","id":"123e4567-e89b-12d3-a456-426614174000","inserted_at":"2024-01-15T10:30:00Z","league_id":"32fa944f-b1bd-41b4-bec2-7ab269fde6fc","metadata":{"confidence_score":0.89,"data_sources":["example_provider_a","example_provider_b"],"generation_model":"gpt-4-turbo","processing_time":3.2},"original_content":{"analysis":"Allen's recent rushing success stems from...","headline":"Josh Allen's Rushing Touchdowns Fuel Fantasy Surge Ahead of Playoffs","summary":"Josh Allen has scored 4 rushing touchdowns in his last 3 games...","tags":["fantasy_football","playoff_implications"]},"priority":2,"source":"Example News","summary":"Josh Allen has scored 4 rushing touchdowns in his last 3 games, significantly boosting his fantasy value ahead of the playoffs. His dual-threat ability makes him a premium option for championship weeks, especially with the Bills' favorable upcoming schedule.","tags":["fantasy_football","playoff_implications","rushing_qb","red_zone"],"tenant_id":"ff6332b6-8151-4a13-b20c-bd7b2ab45452","updated_at":"2024-01-15T14:45:00Z"},"properties":{"analysis":{"description":"Detailed breakdown and commentary providing deeper insights","example":"Allen's recent rushing success stems from the Bills' increased use of designed quarterback runs in the red zone, capitalizing on his 6'5\" frame and surprising mobility. This strategic shift has coincided with the team's push for playoff positioning...","type":"string"},"author":{"description":"Content creator attribution","example":"Matthew Berry","type":"string"},"betting_analysis":{"description":"Analysis focused on betting markets, odds, and wagering implications","example":"Allen's rushing touchdown prop has moved from +125 to -110 over the past two weeks, reflecting bookmakers' adjustment to his recent red zone usage. The over on his rushing yards has hit in 8 of his last 10 games...","type":"string"},"date":{"description":"Publication date (typically the date of the analyzed performance or event)","example":"2024-01-15","format":"date","type":"string"},"edit_history":{"description":"Chronological record of manual edits made to the content","items":{"properties":{"changes":{"additionalProperties":true,"description":"Fields that were modified in this edit","type":"object"},"editor_id":{"description":"ID of the person who made the edit","type":"string"},"timestamp":{"description":"When the edit was made","format":"date-time","type":"string"}},"type":"object"},"type":"array"},"entity_tags":{"description":"Entity tags identifying potential entity mentions in the content.\nOnly included when include_entity_tags=true is specified in the request.\n","items":{"properties":{"confidence":{"description":"Confidence score (0.0-1.0) indicating how confident we are this is the right entity","maximum":1.0,"minimum":0.0,"type":"number"},"context":{"description":"Surrounding text context where entity was mentioned","type":"string"},"entity_id":{"description":"Reference to the actual entity","format":"uuid","type":"string"},"entity_name":{"description":"Display name of the entity","type":"string"},"entity_type":{"description":"Type of entity being tagged","enum":["player","team","coach","league","venue"],"type":"string"},"id":{"description":"Unique identifier for this entity tag","format":"uuid","type":"string"},"inserted_at":{"description":"When this entity tag was created","format":"date-time","type":"string"},"mentioned_as":{"description":"The actual text that referenced the entity in the content","type":"string"},"reasoning":{"description":"AI/algorithm reasoning for the tag","type":"string"},"relevance":{"description":"Relevance score (0.0-1.0) indicating how relevant/prominent this entity is in the content","maximum":1.0,"minimum":0.0,"type":"number"},"tag_method":{"description":"Specific method used for tagging (e.g., 'gpt4', 'regex', 'user_edit')","type":"string"},"tag_source":{"description":"Source of the tag (AI analysis, manual tagging, etc.)","enum":["ai","manual","rule_based","hybrid"],"type":"string"}},"required":["id","entity_type","entity_id","entity_name","mentioned_as","confidence","relevance","tag_source","tag_method"],"type":"object"},"type":"array"},"event_id":{"description":"Related event ID (for game recaps and event-specific news)","example":"456e7890-f12b-34c5-d678-901234567890","format":"uuid","type":"string"},"for_entity_id":{"description":"ID of the specific entity (player, team, event, or league) this news covers","example":"123e4567-e89b-12d3-a456-426614174000","format":"uuid","type":"string"},"for_entity_type":{"description":"Type of entity this news item is about","enum":["player","team","event","league"],"example":"player","type":"string"},"headline":{"description":"Headline summarizing the main story or insight","example":"Josh Allen's Rushing Touchdowns Fuel Fantasy Surge Ahead of Playoffs","type":"string"},"id":{"description":"Unique identifier for this news item","format":"uuid","type":"string"},"inserted_at":{"description":"When this news item was created in the system","example":"2024-01-15T10:30:00Z","format":"date-time","type":"string"},"league_id":{"description":"League context for this news item","example":"32fa944f-b1bd-41b4-bec2-7ab269fde6fc","format":"uuid","type":"string"},"metadata":{"additionalProperties":true,"description":"Additional context and system metadata","type":"object"},"original_content":{"additionalProperties":true,"description":"Preserved original content before any manual edits","properties":{"analysis":{"description":"Original analysis","type":"string"},"betting_analysis":{"description":"Original betting analysis","type":"string"},"headline":{"description":"Original headline","type":"string"},"summary":{"description":"Original summary","type":"string"},"tags":{"description":"Original tags","items":{"type":"string"},"type":"array"}},"type":"object"},"priority":{"default":3,"description":"Content priority level (1=breaking news/urgent, 5=routine update)","example":3,"maximum":5,"minimum":1,"type":"integer"},"source":{"description":"Publishing source or platform","example":"Example News","type":"string"},"summary":{"description":"Concise overview of the main points, typically 2-3 sentences","example":"Josh Allen has scored 4 rushing touchdowns in his last 3 games, significantly boosting his fantasy value ahead of the playoffs. His dual-threat ability makes him a premium option for championship weeks, especially with the Bills' favorable upcoming schedule.","type":"string"},"tags":{"description":"Content categorization tags for discovery and filtering","example":["game_recap","fantasy_football","playoff_implications","rushing_qb"],"items":{"type":"string"},"type":"array"},"tenant_id":{"description":"Client tenant this news item belongs to","format":"uuid","type":"string"},"tournament_id":{"description":"Related tournament ID (for tournament-specific news)","format":"uuid","type":"string"},"updated_at":{"description":"When this news item was last modified","example":"2024-01-15T14:45:00Z","format":"date-time","type":"string"}},"required":["id","headline","summary","for_entity_type","for_entity_id","league_id","date"],"title":"News","type":"object"}}},"description":"News Response"},"400":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"bad_request","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/bad_request","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"invalid_api_key","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/invalid_api_key","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"not_found","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/not_found","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Not Found"}},"summary":"Get News by Entity","tags":["Content"]}},"/api/v1/markets":{"get":{"callbacks":{},"deprecated":true,"description":"Retrieve a list of event-scoped betting markets. Use `GET /api/v1/odds`\nfor odds, sportsbook, aggregator, and mainline filters.\n\n**Crypto (`league_id=CRYPTO`; entitled tenants only).** One market per contract family per\nwindow (`market_type = \"up_down\"`, `id` = the `market_id` carried on odds rows), plus one\nper unverified Limitless mirror (`metadata.alignment = \"unverified_mirror\"`, listed but\nnot addressable by `/markets/{id}` in v1). `canonical_status` `resolved` means \"trading\nclosed; a result may be pending\", not \"a result exists\": read `metadata.result_state`\n(`pending`, `resolved`, `voided`) to know whether to settle. The set is the live and\nupcoming-within-60-minutes windows, or one window via `event_id`; `asset` and `horizon`\nfilter. `tournament_id` and `market_group_id` are a 400 for this league.\n","operationId":"ApiRestWeb.MarketController.index","parameters":[{"description":"[Translatable] Filter by Event ID","example":"5c4e8fe4-5bc9-49e1-aa84-aaa975900703","in":"query","name":"event_id","required":false,"schema":{"type":"string"}},{"description":"[Translatable] Filter by Tournament ID","example":"a1b2c3d4-e5f6-7890-abcd-ef1234567890","in":"query","name":"tournament_id","required":false,"schema":{"type":"string"}},{"description":"Filter by league ID — accepts a UUID or league abbreviation (e.g., 'NFL', 'NBA')","example":"NFL","in":"query","name":"league_id","required":true,"schema":{"type":"string"}},{"description":"Filter by Market Group ID","example":"b2c3d4e5-f6a7-8901-bcde-f12345678901","in":"query","name":"market_group_id","required":false,"schema":{"type":"string"}},{"description":"The format for which field to query by (i.e. a provider key will mean you can pass in that provider's id) for any [Translatable] field","example":"provider_key","in":"query","name":"query_source_id_format","required":false,"schema":{"type":"string"}},{"description":"Include source mappings from the specific integration (i.e. a provider key) will return a source_mappings object with the mappings for the respective objects","example":"provider_key","in":"query","name":"return_source_id_format","required":false,"schema":{"type":"string"}},{"description":"Page number for page/per_page pagination. Do not combine with limit/offset.","in":"query","name":"page","required":false,"schema":{"default":1,"minimum":1,"type":"integer"}},{"description":"Number of items per page (max 1000). Do not combine with limit/offset.","in":"query","name":"per_page","required":false,"schema":{"default":25,"maximum":1000,"minimum":1,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"description":"A betting market represents a specific wagering opportunity associated with a sporting event.\n\nMarkets define the framework for betting by establishing what can be wagered on, such as\ngame outcomes, player performances, or statistical achievements. Each market contains\nmultiple outcomes that bettors can choose from, with associated odds from various sportsbooks.\n\n## Market Standardization\n\nAll market data undergoes a comprehensive standardization process to ensure consistency\nacross data providers:\n\n### Name Standardization\nMarket names are standardized using our MarketTypesRegistry:\n- **Raw Provider**: `market_id: \"market_8010\", name: \"winning margin\"`\n- **Standardized**: `name: \"1st Half Winning Margin\"` (from registry display_name)\n\n### Market Type Classification\nMarkets are classified into standardized types:\n- **Moneyline**: Game winner (home/away)\n- **Point Spread**: Handicap betting with point advantages\n- **Total Points**: Over/under betting on combined scores\n- **Player Props**: Individual player performance metrics\n- **Team Props**: Team-specific statistical achievements\n\n## Market Types\n- **Game Outcomes**: Moneyline (winner), point spreads, totals (over/under)\n- **Player Props**: Individual player statistics (passing yards, points scored)\n- **Team Props**: Team-specific achievements (total touchdowns, team assists)\n- **Game Props**: Event-specific occurrences (first scorer, longest field goal)\n- **Futures**: Long-term bets (championship winners, season awards)\n\n## Market Structure\n- **Primary Markets**: Main betting options (moneyline, spread, total)\n- **Alternate Lines**: Non-standard lines offering different risk/reward\n- **Live Markets**: In-game betting opportunities that update during play\n- **Future Markets**: Season-long or tournament-wide betting opportunities\n\n## Key Relationships\n- **Event**: Most markets tied to specific games/matches\n- **Outcomes**: Multiple betting options within each market\n- **Odds**: Current betting lines from various sportsbooks\n- **Sportsbooks**: Multiple operators offering odds on the same market\n\n## Performance Optimized Response\n\nWhen `include_outcomes_and_odds=true` is specified, the API returns an optimized flattened structure\nfor improved performance. This structure reduces response time by approximately 80% compared to\nthe standard nested structure.\n\n### Optimized Structure\n```json\n{\n  \"market_id\": \"5c4e8fe4-5bc9-49e1-aa84-aaa975900703\",\n  \"market_name\": \"Moneyline\",\n  \"market_status\": \"active\",\n  \"market_type\": \"moneyline\",\n  \"market_updated_at\": \"2024-01-15T20:30:00Z\",\n  \"outcomes\": [\n    {\n      \"outcome_id\": \"abc123\",\n      \"outcome_name\": \"Team A\",\n      \"outcome_selection\": \"Team A\",\n      \"outcome_line\": null,\n      \"outcome_status\": \"ACTIVE\",\n      \"odds\": [\n        {\n          \"odds_id\": \"def456\",\n          \"odds_price\": -110,\n          \"odds_price_type\": \"american\",\n          \"odds_sportsbook\": \"draftkings\",\n          \"odds_is_main\": true,\n          \"odds_aggregator\": \"sportsstack\"\n        }\n      ]\n    }\n  ]\n}\n```\n\n### Performance Benefits\n- **Query Time**: Reduced from 536ms to ~386ms (28% improvement)\n- **Render Time**: Reduced from 4.8s to ~500ms (90% improvement)\n- **Total Response Time**: Reduced from 6.1s to ~1.2s (80% improvement)\n- **Database Load**: Single optimized query instead of multiple queries\n- **Memory Usage**: Efficient flattened structure with reduced nesting\n","example":{"canonical_status":"open","common_model_id":"123e4567-e89b-12d3-a456-426614174010","is_main":true,"market_type_id":null,"metadata":{"source":"draftkings","source_event_id":"30568865","source_market_id":"DraftKings-30568865-h2h"},"name":"(0dac14546d6008893a8b3b6c417472a6) DraftKings - 30568865 - h2h","status":"active","timestamp":"2024-09-10T14:30:00Z"},"properties":{"actual_scope":{"description":"Proven native contract scope, independent of the compatibility endpoint.","enum":["event","race","session","tournament","round","season"],"nullable":true,"type":"string"},"canonical_status":{"description":"Canonical market status (SS-2270), derived from the raw provider-native\n`status` string via a fixed open|suspended|resolved mapping. `null` when\nthe provider never sets a status (e.g. some aggregators) or writes\na value outside the known vocabulary — this field never guesses.\n","enum":["open","suspended","resolved"],"nullable":true,"type":"string"},"common_model_id":{"description":"Market ID","type":"string"},"event_id":{"description":"Event ID","type":"string"},"future_type":{"description":"Future type (if applicable)","type":"string"},"inserted_at":{"description":"Timestamp of creation","format":"date-time","type":"string"},"is_future":{"description":"Whether this is a future market","type":"boolean"},"is_main":{"description":"Whether this is a main vs alternate market","type":"boolean"},"league_id":{"description":"League ID","format":"uuid","type":"string"},"market_type":{"description":"Market type","type":"string"},"market_type_id":{"description":"Market type ID","type":"string"},"metadata":{"description":"Metadata. For prediction markets (Kalshi, Polymarket, Predict.fun, Limitless) this includes an \"execution\" block with the identifiers needed to place a trade on the originating venue: venue, condition_id, neg_risk, tick_size, venue contract addresses, slug and url. See the Prediction-Market Execution integration guide.","type":"object"},"name":{"description":"Name","type":"string"},"outcomes":{"description":"Outcomes","items":{"description":"A specific betting outcome within a market, representing one possible result that bettors can wager on.\n\n## Outcome Standardization\n\nOutcomes undergo market-type-specific standardization to ensure consistent field formats:\n\n### Total Points Markets (Over/Under)\n```\nname: \"Over 228.5\"              # Human-readable with line value\nline: 228.5                     # Numeric line value\nselection: nil                  # No specific entity selection\nselection_line: \"over\"          # Direction (over/under)\nnormalized_selection: nil       # No entity to normalize\ngrouping_key: \"default:-228.5\" # Groups over/under for same line\n```\n\n### Point Spread Markets (Handicap)\n```\nname: \"Indiana Pacers +11\"           # Team name + formatted spread\nline: 11.0                           # Absolute line value\nselection: \"Indiana Pacers\"          # Team name\nselection_line: nil                  # Not applicable for spreads\nnormalized_selection: \"indiana_pacers\" # Lowercase, underscores\ngrouping_key: \"default:-11.0\"       # Groups home/away for same spread\n```\n\n### Moneyline Markets (Winner)\n```\nname: \"Oklahoma City Thunder\"               # Team name\nline: nil                                   # No line for moneyline\nselection: \"Oklahoma City Thunder\"          # Team name\nselection_line: nil                         # Not applicable\nnormalized_selection: \"oklahoma_city_thunder\" # Lowercase, underscores\ngrouping_key: \"default:Oklahoma City Thunder\" # Groups by team\n```\n\n### Field Standardization\n- **name**: Human-readable outcome description with context\n- **selection**: Entity being selected (team/player name or null)\n- **normalized_selection**: Lowercase, underscore-separated for consistent querying\n- **line**: Numeric betting line (spread/total value, null for moneyline)\n- **selection_line**: Direction for totals (\"over\"/\"under\"), null otherwise\n- **grouping_key**: Groups related outcomes (same spread/total different sides)\n","example":{"common_model_id":"123e4567-e89b-12d3-a456-426614174010","event_id":"30568865","grouping_key":"DraftKings-30568865-h2h","inserted_at":"2024-09-10T14:30:00Z","is_alternate_line":false,"is_main":true,"line":1.5,"market_id":"123e4567-e89b-12d3-a456-426614174011","market_type":"h2h","metadata":{"source":"draftkings","source_event_id":"30568865","source_market_id":"DraftKings-30568865-h2h"},"name":"DraftKings - 30568865 - h2h - Seattle Seahawks","normalized_selection":"Seattle Seahawks","player_id":"59291391-0c7e-442b-9496-33074647384e","selection":"Seattle Seahawks","selection_line":"1.5","stat_type":"points","status":"active","team_id":"58e8c89b-72f8-4427-adbc-10f193c9b462","tenant_id":"ff6332b6-8151-4a13-b20c-bd7b2ab45452","updated_at":"2024-09-11T09:15:00Z"},"properties":{"common_model_id":{"description":"Market ID","type":"string"},"event_id":{"description":"Event ID","type":"string"},"grouping_key":{"description":"Grouping Key","type":"string"},"inserted_at":{"description":"Timestamp of creation","format":"date-time","type":"string"},"is_alternate_line":{"description":"Is Alternate Line","type":"boolean"},"is_main":{"description":"Is Main","type":"boolean"},"line":{"description":"Line (if applicable)","type":"number"},"market_id":{"description":"Market ID","type":"string"},"market_type":{"description":"Market Type","type":"string"},"metadata":{"description":"Metadata. For prediction markets this includes an \"execution\" block carrying the trade-execution identifiers for the originating venue (venue, ticker/token_id, side, condition_id, neg_risk, tick_size, venue contracts, url). See the Prediction-Market Execution integration guide.","type":"object"},"name":{"description":"Name","type":"string"},"normalized_selection":{"description":"Normalized Selection","type":"string"},"odds":{"description":"Odds","items":{"description":"Betting odds from a specific sportsbook for a particular outcome, representing the price and probability.\n\n## Odds Standardization\n\nOdds undergo standardization to ensure consistent pricing representation and source attribution:\n\n### Source Selection Name Standardization\nThe `source_selection_name` field identifies what the sportsbook is offering odds on:\n\n#### Total Points Markets\n```\nsource_selection_name: nil  # No specific team/player selection\n```\n\n#### Point Spread Markets\n```\nsource_selection_name: \"Indiana Pacers\"     # Team receiving the spread\n# Derived from event.participants based on outcome selection\n```\n\n#### Moneyline Markets\n```\nsource_selection_name: \"Oklahoma City Thunder\"  # Team to win\n# Derived from event.participants based on outcome selection\n```\n\n### Price Standardization\n- **price**: Standardized to American odds format (-110, +150, etc.)\n- **price_type**: Always \"american\" for consistency\n- **timestamp**: UTC timestamp when current odds were observed. When the\n  response comes from the durable line-summary fallback, this is the time\n  the returned closing price last changed; same-price provider\n  reaffirmations do not advance it.\n\n### Sportsbook Attribution\n- **sportsbook**: Standardized sportsbook name (DraftKings, FanDuel, etc.)\n- **aggregator**: Upstream provider key or `sportsstack` for the canonical SportsStack board\n- **aggregator_event_id**: Provider's event identifier for traceability\n\n### Historical Tracking\nOdds include both current and opening lines for trend analysis:\n- Current odds: Real-time pricing from sportsbooks\n- Opening odds: Initial lines when market opened\n- Movement tracking: Compare current vs opening for line movement insights\n","example":{"aggregator":"sportsstack","aggregator_event_id":null,"fetched_at":"2026-04-21T17:40:00Z","metadata":{"aggregator":"sportsstack","id":"0HC75256377P350_1","link":"https://sportsbook.draftkings.com/event/30568865?outcomes=0HC75256377P350_1","selected_source":"example_provider.football.nfl","selection_reason":"trust_then_freshness","selection_tier":1,"source":"sportsstack","source_event_id":"30568865","source_market_id":"DraftKings-30568865-spreads","sportsstack_kind":"canonical_book_quote"},"price":-110,"price_type":"american","source_event_id":"30568865","source_id":"0HC75256377P350_1","source_market_id":"DraftKings-30568865-spreads","source_selection_id":"0HC75256377P350_1","source_selection_name":"Seattle Seahawks","sportsbook":"draftkings"},"properties":{"aggregator":{"description":"Upstream provider name or 'sportsstack' for the canonical SportsStack sportsbook board","type":"string"},"aggregator_event_id":{"description":"Aggregator event ID","type":"string"},"canonical_outcome_id":{"description":"Verified cross-venue economic outcome ID. Null when outcome equivalence is unresolved, push-capable, three-way, or ambiguous.","format":"uuid","nullable":true,"type":"string"},"clock_provenance":{"properties":{"evaluated_at":{"format":"date-time","type":"string"},"max_age_seconds":{"enum":[300],"type":"integer"},"quote_provenance":{"description":"Unmodified retained JSON provenance, including legacy or malformed evidence.","nullable":true},"source":{"enum":["timestamp",null],"nullable":true,"type":"string"}},"type":"object"},"common_model_id":{"description":"Market ID","type":"string"},"deep_link":{"description":"Desktop sportsbook deep link URL","type":"string"},"execution_readiness":{"description":"Requires exact native source-ID binding, active parent/outcome lifecycle and proven fresh provider clock; not order-fill certification. ProphetX additionally requires one atomic native strike/price/size/time observation matching its documented submit-order fields. ready=null means unknown. Native IDs remain separate from common_model_id.","example":{"available_size":{"state":"unknown","value":null},"depth":{"state":"unknown","value":null},"executable":{"reason":"catalog_is_not_a_book","state":"unknown"},"identifiers_valid":true,"liquidity":{"state":"unknown","value":null},"ready":null,"reasons":["provider_clock_provenance_downgrade"],"scope":"outcome_identifiers_and_provider_clock","venue":"limitless"},"properties":{"available_size":{"additionalProperties":true,"description":"Retained evidence; absent measurements have state unknown and value null.","type":"object"},"depth":{"additionalProperties":true,"description":"Retained evidence; absent measurements have state unknown and value null.","type":"object"},"executable":{"additionalProperties":true,"description":"Retained evidence; absent measurements have state unknown and value null.","type":"object"},"identifiers_valid":{"type":"boolean"},"liquidity":{"additionalProperties":true,"description":"Retained evidence; absent measurements have state unknown and value null.","type":"object"},"ready":{"nullable":true,"type":"boolean"},"reasons":{"items":{"type":"string"},"type":"array"},"scope":{"enum":["outcome_identifiers_and_provider_clock"],"type":"string"},"venue":{"type":"string"}},"type":"object"},"fetched_at":{"description":"Timestamp when SportsStack fetched or observed this quote","format":"date-time","nullable":true,"type":"string"},"freshness_reasons":{"description":"Deterministic provider_clock_* or lifecycle_* reasons; empty when fresh.","items":{"type":"string"},"type":"array"},"inserted_at":{"description":"Timestamp of creation","format":"date-time","type":"string"},"line_alignment":{"description":"SS main-line ladder plan Phase D. Present only for event-scoped, `latest_only=true` `/v1/odds` requests (`event_id` given) -- the key itself is absent from the response row (not present with a null body) for non-event-scoped `league_id`/list requests, since computing it there would mean an unbounded per-request ladder fetch across many events. Read-time derived from CommonModel.Betting.PredictionMarkets.LineLadder; never renames, removes, or reinterprets the sibling `is_main` field (the stored, write-time value) -- purely additive. All three sub-fields are null together when this row was not matched into a ranked ladder slot (e.g. a moneyline row, which has no alt-strike ladder, or a real-sportsbook row, which LineLadder never covers).","example":{"alignment_group":{"family":"spread","market_type":"point_spread","side":{"sign":"negative","team_id":null}},"is_main_derived":true,"sibling_line_count":2},"nullable":true,"properties":{"alignment_group":{"additionalProperties":true,"description":"The {market_type, family, side} ladder slot this row was matched into.","nullable":true,"type":"object"},"is_main_derived":{"description":"Whether LineLadder derived this row as the closest-to-even main line for its venue/slot, independent of the stored `is_main` column.","nullable":true,"type":"boolean"},"sibling_line_count":{"description":"Number of lines this row's own venue quotes within the same ladder slot.","nullable":true,"type":"integer"}},"type":"object"},"metadata":{"additionalProperties":true,"description":"Metadata. For prediction markets this includes an \"execution\" block carrying the trade-execution identifiers for the originating venue (venue, ticker/token_id, side, condition_id, neg_risk, tick_size, venue contracts, url). See the Prediction-Market Execution integration guide. UFC conditional markets expose \"probability_semantics\": \"conditional\", a structured \"condition\" object, and a plain-language \"void_condition\".","properties":{"condition":{"additionalProperties":true,"nullable":true,"properties":{"fight_result":{"description":"Fight-result condition for a conditional UFC market.","enum":["finish","decision"],"type":"string"},"round":{"description":"Optional round constraint for the conditional market.","minimum":1,"nullable":true,"type":"integer"}},"required":["fight_result"],"type":"object"},"probability_semantics":{"description":"Set to \"conditional\" when this price is conditional on the described fight result.","enum":["conditional"],"nullable":true,"type":"string"},"void_condition":{"description":"Plain-language condition under which a conditional UFC market is voided.","nullable":true,"type":"string"}},"type":"object"},"mobile_deep_link":{"description":"Mobile/native app deep link URL","type":"string"},"outcome_id":{"description":"Venue-backed SportsStack outcome ID","type":"string"},"platform_observed_at":{"description":"Prediction quotes only. Row observed_at, independently of provider freshness.","format":"date-time","nullable":true,"type":"string"},"price":{"description":"Price","type":"number"},"price_type":{"description":"Price format ('decimal', 'american')","type":"string"},"provider_freshness":{"description":"Prediction quotes only. Fresh requires a proven nonfuture provider clock at most 300 seconds old and proven active exact-parent/outcome lifecycle. Standalone odds report unknown without lifecycle proof.","enum":["fresh","stale","unknown"],"type":"string"},"provider_observed_at":{"description":"Prediction quotes only. Authoritative provider quote timestamp; never receipt/observation time. Requires matching observed quote_provenance.provider_updated_at; null for absent, synthetic or downgraded authority.","format":"date-time","nullable":true,"type":"string"},"reference_alignment":{"description":"Present only on crypto odds rows (omitted on sports rows; `line_alignment` is the\nsports ladder analogue and is omitted on crypto rows). `alignment` is `exact` (this\nmarket spans two or more venues), `single_venue`, or `unverified_mirror`.\n`different_reference_market_ids` lists the OTHER `market_id`s of the same window\n(any reference source), symmetrically.\n","properties":{"alignment":{"enum":["exact","single_venue","unverified_mirror"],"type":"string"},"alignment_group":{"description":"The window (event) id.","format":"uuid","type":"string"},"different_reference_market_ids":{"items":{"format":"uuid","type":"string"},"type":"array"},"reference_source":{"type":"string"},"tie_rule":{"enum":["up","split"],"type":"string"},"venue_count":{"minimum":1,"type":"integer"}},"title":"CryptoReferenceAlignment","type":"object"},"sgp_token":{"description":"Opaque same-game-parlay token supplied by the sportsbook. Null when the provider does not offer one.","nullable":true,"type":"string"},"source_event_id":{"description":"Source event ID","type":"string"},"source_id":{"description":"Source ID","type":"string"},"source_market_id":{"description":"Source market ID","type":"string"},"source_selection_id":{"description":"Source selection ID","type":"string"},"source_selection_name":{"description":"Source selection name","type":"string"},"sportsbook":{"description":"Sportsbook","type":"string"},"timestamp":{"description":"Provider quote timestamp","format":"date-time","nullable":true,"type":"string"},"trading_fees":{"description":"Prediction quotes only (absent on sportsbook rows and on venues whose fees are not captured yet: Limitless, ProphetX, Polymarket US, SX Bet). Computed at read time; no order-fill or account-specific guarantee (per-account discounts, maker rebates and balance-precision rounding are not modelled). Kalshi: rates from a versioned snapshot of Kalshi's public series metadata, event fee overrides and fee schedule; `observed_at` is the snapshot time. Series with event-level fee overrides (MLB) resolve per event: an override in force reports `scope: event` (with `event_ticker`, `effective_from`), before its `scheduled_ts` the series fee is reported with the pending change under `scheduled_override`, and an event missing from the snapshot reports `unknown` (`event_fee_override_not_in_snapshot`). Predict.fun: derived from the stored market `fee_rate_bps`; `observed_at` is the quote observation time. Polymarket: the market's own Gamma `feesEnabled`/`feeSchedule` captured with the quote (`fee = shares x rate x P x (1 - P)`, taker only, makers pay nothing; `maker.rebate_rate` is the fraction of taker fees returned to makers through a daily rebate program, not a per-fill credit; fees round to 5 decimal places with no published direction, so `rounding.direction` is absent); `observed_at` is the quote observation time, and quotes whose fee data is missing, has an exponent other than 1, or is not taker-only report `unknown`. The rate is per market (`sports_fees_v3` 0.05, `sports_fees_v2` 0.03, `zero_fees` 0 are all live on sports), never a category default.","example":{"availability":"published","charge_basis":"fill","fee_multiplier":1.0,"fee_type":"quadratic_with_maker_fees","maker":{"exponent":1,"model":"quadratic","multiplier":1.0,"rate":0.0175,"rounding":{"applies_to":"fee_plus_position_cost","direction":"up","increment":0.0001}},"observed_at":"2026-09-30T15:33:45Z","scope":"series","series_ticker":"KXNBAGAME","source":"kalshi_series_snapshot","taker":{"exponent":1,"model":"quadratic","multiplier":1.0,"rate":0.07,"rounding":{"applies_to":"fee_plus_position_cost","direction":"up","increment":0.0001}}},"properties":{"availability":{"enum":["published","unavailable","unknown"],"type":"string"},"charge_basis":{"description":"Fees are charged per fill, not per order or per settlement.","enum":["fill"],"type":"string"},"effective_from":{"description":"Kalshi, `scope: event`: the override's `scheduled_ts`, from which these rates apply.","format":"date-time","type":"string"},"event_ticker":{"description":"Kalshi: the market ticker minus its last `-` segment. Present for series with event-level fee overrides.","type":"string"},"fee_multiplier":{"type":"number"},"fee_rate_bps":{"type":"integer"},"fee_type":{"type":"string"},"fees_enabled":{"description":"Polymarket: the market's Gamma `feesEnabled` flag.","type":"boolean"},"maker":{"description":"One side of the fee. `quadratic`: fee = rate x contracts x (P x (1 - P)) ^ exponent. `linear_min_price`: fee = rate x min(P, 1 - P) x shares. `none`: no fee. `rate` already includes any venue multiplier.","properties":{"exponent":{"type":"integer"},"formula":{"type":"string"},"model":{"enum":["quadratic","linear_min_price","none"],"type":"string"},"multiplier":{"type":"number"},"rate":{"type":"number"},"rebate_rate":{"description":"Polymarket maker side: fraction of taker fees rebated to resting makers by the daily rebate program (context only, not a per-fill credit).","type":"number"},"rounding":{"properties":{"applies_to":{"type":"string"},"direction":{"enum":["up"],"type":"string"},"increment":{"type":"number"}},"type":"object"}},"type":"object"},"observed_at":{"format":"date-time","nullable":true,"type":"string"},"reason":{"description":"Present when availability is unknown; deterministic snake_case reason.","type":"string"},"scheduled_override":{"description":"Kalshi, `scope: series`: an event-level override that is not yet in force. Charged from `effective_from`; carries `fee_type`, `fee_multiplier`, `taker` and `maker` like the top-level object.","properties":{"effective_from":{"format":"date-time","type":"string"},"fee_multiplier":{"type":"number"},"fee_type":{"type":"string"},"maker":{"description":"One side of the fee. `quadratic`: fee = rate x contracts x (P x (1 - P)) ^ exponent. `linear_min_price`: fee = rate x min(P, 1 - P) x shares. `none`: no fee. `rate` already includes any venue multiplier.","properties":{"exponent":{"type":"integer"},"formula":{"type":"string"},"model":{"enum":["quadratic","linear_min_price","none"],"type":"string"},"multiplier":{"type":"number"},"rate":{"type":"number"},"rebate_rate":{"description":"Polymarket maker side: fraction of taker fees rebated to resting makers by the daily rebate program (context only, not a per-fill credit).","type":"number"},"rounding":{"properties":{"applies_to":{"type":"string"},"direction":{"enum":["up"],"type":"string"},"increment":{"type":"number"}},"type":"object"}},"type":"object"},"taker":{"description":"One side of the fee. `quadratic`: fee = rate x contracts x (P x (1 - P)) ^ exponent. `linear_min_price`: fee = rate x min(P, 1 - P) x shares. `none`: no fee. `rate` already includes any venue multiplier.","properties":{"exponent":{"type":"integer"},"formula":{"type":"string"},"model":{"enum":["quadratic","linear_min_price","none"],"type":"string"},"multiplier":{"type":"number"},"rate":{"type":"number"},"rebate_rate":{"description":"Polymarket maker side: fraction of taker fees rebated to resting makers by the daily rebate program (context only, not a per-fill credit).","type":"number"},"rounding":{"properties":{"applies_to":{"type":"string"},"direction":{"enum":["up"],"type":"string"},"increment":{"type":"number"}},"type":"object"}},"type":"object"}},"type":"object"},"scope":{"enum":["series","event","market"],"type":"string"},"series_ticker":{"type":"string"},"source":{"description":"kalshi_series_snapshot | kalshi_event_fee_snapshot | kalshi_fee_schedule_default | venue_record. `kalshi_event_fee_snapshot` is a Kalshi event-level override in force; `kalshi_fee_schedule_default` is the schedule default (quadratic x 1) inferred for a KX series not in the exception snapshot.","type":"string"},"taker":{"description":"One side of the fee. `quadratic`: fee = rate x contracts x (P x (1 - P)) ^ exponent. `linear_min_price`: fee = rate x min(P, 1 - P) x shares. `none`: no fee. `rate` already includes any venue multiplier.","properties":{"exponent":{"type":"integer"},"formula":{"type":"string"},"model":{"enum":["quadratic","linear_min_price","none"],"type":"string"},"multiplier":{"type":"number"},"rate":{"type":"number"},"rebate_rate":{"description":"Polymarket maker side: fraction of taker fees rebated to resting makers by the daily rebate program (context only, not a per-fill credit).","type":"number"},"rounding":{"properties":{"applies_to":{"type":"string"},"direction":{"enum":["up"],"type":"string"},"increment":{"type":"number"}},"type":"object"}},"type":"object"}},"type":"object"},"updated_at":{"description":"Timestamp when SportsStack last wrote this row","format":"date-time","type":"string"}},"required":["common_model_id","name"],"title":"Odds","type":"object"},"type":"array"},"player_id":{"description":"Player ID","type":"string"},"selection":{"description":"Selection","type":"string"},"selection_line":{"description":"Selection Line","type":"string"},"stat_type":{"description":"Stat type (if applicable)","type":"string"},"status":{"description":"Status","type":"string"},"team_id":{"description":"Team ID","type":"string"},"tenant_id":{"description":"Tenant ID","type":"string"},"updated_at":{"description":"Timestamp of last update","format":"date-time","type":"string"}},"required":["common_model_id","name"],"title":"Outcome","type":"object"},"type":"array"},"sport_id":{"description":"Sport ID","format":"uuid","type":"string"},"start_date":{"description":"Start date (if applicable)","format":"date-time","type":"string"},"updated_at":{"description":"Timestamp of last update","format":"date-time","type":"string"}},"required":["common_model_id","name"],"title":"Market","type":"object"}}},"description":"Success"},"401":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"invalid_api_key","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/invalid_api_key","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"not_found","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/not_found","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Not Found"},"410":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"required":["error","message"],"type":"object"}}},"description":"Nested market odds retired"}},"summary":"List Markets","tags":["Betting"]}},"/api/v1/leagues/{id}":{"get":{"callbacks":{},"operationId":"ApiRestWeb.LeagueController.show","parameters":[{"description":"League ID (UUID)","example":"01c7133f-2999-4803-9872-8c2ab1ba63ac","in":"path","name":"id","required":true,"schema":{"type":"string"}},{"description":"Include source mappings from the specific integration (i.e. a provider key) will return a source_mappings object with the mappings for the respective objects","in":"query","name":"return_source_id_format","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"description":"A league represents an organized sports competition or governing body for a specific sport.\n\nLeagues group teams and players under common rules, schedules, and administrative structure.\nThey serve as the organizational framework that governs seasons, playoffs, and championships.\nEach league belongs to a specific sport and has its own unique characteristics, rules, and format.\n\n## Examples by Sport\n- **Football**: NFL (National Football League), NCAA (College Football)\n- **Basketball**: NBA (National Basketball Association), WNBA, NCAA Basketball\n- **Baseball**: MLB (Major League Baseball), MiLB (Minor League Baseball)\n- **Hockey**: NHL (National Hockey League), AHL (American Hockey League)\n- **Golf**: PGA Tour, European Tour, LPGA Tour\n- **Soccer**: Premier League, La Liga, MLS, Champions League\n\n## Key Relationships\n- **Sport**: Each league belongs to exactly one sport\n- **Teams**: Professional leagues contain teams that compete\n- **Events**: All games/matches within the league structure\n- **Players**: Athletes who participate in the league\n- **Seasons**: Time-bound competitive periods within the league\n\n## League Hierarchies\nSome sports have multiple tiers (e.g., MLB/MiLB, Premier League/Championship)\nor different divisions (AFC/NFC in NFL, Eastern/Western Conference in NBA).\n","example":{"abbreviation":"NBA","common_model_id":"8019d4db-7854-4542-b4af-7265d4b57105","futures_count":12,"image_url":"https://cdn.example.com/logos/nfl/pit.png","name":"National Basketball Association","sport_id":"58e8c89b-72f8-4427-adbc-10f193c9b462"},"properties":{"abbreviation":{"description":"Common short form or acronym (e.g., 'NFL', 'NBA', 'EPL')","type":"string"},"common_model_id":{"description":"Unique league identifier in our unified system","type":"string"},"futures_count":{"description":"Number of tenant-visible future markets (outrights, season totals, awards) in this league: the same set `GET /futures?league_id=<league>` returns. 0 means none; null means the count could not be computed right now. Discovery flow: `GET /sports` -> `GET /leagues` -> `GET /futures?league_id&season_year&aggregator`. Present on `GET /leagues` and `GET /leagues/{id}`.","minimum":0,"nullable":true,"type":"integer"},"image_url":{"description":"League logo or official branding image","type":"string"},"market_count":{"description":"Number of distinct open markets (provider status active; suspended, closed, settled and unknown statuses are not counted) across this league's current events (tenant-visible, not finished, started within the last 36 hours or starting within the next 14 days), in sources visible to the tenant (the visibility `GET /markets` applies); each market counts once across venues. Values can be up to 60 seconds old. An open market is not necessarily priced right now. null means the count could not be computed right now (never 0). Present on `GET /leagues` and `GET /leagues/{id}`; null for the synthetic `CRYPTO` league.","minimum":0,"nullable":true,"type":"integer"},"market_counts_by_venue":{"additionalProperties":{"minimum":0,"type":"integer"},"description":"Per-venue (aggregator, e.g. `polymarket`, `kalshi`, `prophetx`, `predict_fun`, `limitless`, `polymarket_us`, `sxbet`) breakdown of `market_count`, with the same rules. Venues with no open market are omitted. Values can sum to more than `market_count`. null means the count could not be computed right now. Present on `GET /leagues` and `GET /leagues/{id}`; null for the synthetic `CRYPTO` league.","nullable":true,"type":"object"},"name":{"description":"Full official name of the league","type":"string"},"sport_id":{"description":"Reference to the sport this league governs","type":"string"}},"required":["name","abbreviation"],"title":"League","type":"object"}}},"description":"League Response"},"400":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"bad_request","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/bad_request","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Bad Request"}},"summary":"Show League","tags":["Reference"]}},"/api/v1/self-service/mappings/status":{"get":{"callbacks":{},"operationId":"ApiRestWeb.SelfServiceController.status","parameters":[{"description":"","in":"query","name":"since","required":false,"schema":{"format":"date_time","type":"string"}},{"description":"","in":"query","name":"source","required":false,"schema":{"type":"string"}},{"description":"","in":"query","name":"entity_type","required":false,"schema":{"type":"string"}},{"description":"","in":"query","name":"limit","required":false,"schema":{"default":500,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"count":{"type":"integer"},"data":{"items":{"properties":{"action":{"nullable":true,"type":"string"},"common_model_id":{"format":"uuid","nullable":true,"type":"string"},"entity":{"type":"object"},"entity_type":{"enum":["player","team","event"],"type":"string"},"ignored_pending":{"type":"boolean"},"mapping_id":{"format":"uuid","type":"string"},"mapping_state":{"enum":["mapped","pending","ignored"],"type":"string"},"match_status":{"nullable":true,"type":"string"},"pending_mapping_id":{"format":"uuid","nullable":true,"type":"string"},"source":{"example":"cbs.basketball.nba","type":"string"},"source_id":{"example":"cbs-breanna-stewart","type":"string"}},"type":"object"},"type":"array"}},"type":"object"}}},"description":"Self-service mapping status response"},"400":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"bad_request","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/bad_request","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"invalid_api_key","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/invalid_api_key","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"forbidden","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/forbidden","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"not_found","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/not_found","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Not Found"},"409":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"conflict","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/conflict","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Conflict"},"422":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"validation_error","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/validation_error","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Validation Error"},"503":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"service_unavailable","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/service_unavailable","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Service Unavailable"}},"summary":"Sync mapping status changes","tags":["Self-Service"]}},"/api/v1/injuries":{"get":{"callbacks":{},"operationId":"ApiRestWeb.InjuryController.index","parameters":[{"description":"Filter by player ID","in":"query","name":"player_id","required":false,"schema":{"type":"string"}},{"description":"Filter by league ID — accepts a UUID or league abbreviation (e.g., 'NFL', 'NBA')","in":"query","name":"league_id","required":true,"schema":{"type":"string"}},{"description":"Filter by injury status (out, questionable, doubtful, probable, day_to_day, ir, suspended, pup)","in":"query","name":"status","required":false,"schema":{"type":"string"}},{"description":"Deprecated and ignored. Injuries are one aggregated status per player; the report does not expose which providers contributed.","in":"query","name":"source","required":false,"schema":{"type":"string"}},{"description":"Include all players with an active 'status' (out, questionable, doubtful, probable, day_to_day, ir, suspended, pup)","in":"query","name":"with_injury_designation","required":false,"schema":{"type":"boolean"}},{"description":"Deprecated and ignored. Injuries are one aggregated status per player; the report does not expose which providers contributed.","in":"query","name":"source_tier","required":false,"schema":{"type":"integer"}},{"description":"Page number for page/per_page pagination. Do not combine with limit/offset.","in":"query","name":"page","required":false,"schema":{"default":1,"minimum":1,"type":"integer"}},{"description":"Number of items per page (max 1000). Do not combine with limit/offset.","in":"query","name":"per_page","required":false,"schema":{"default":100,"maximum":1000,"minimum":1,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"items":{"description":"Current injury status and health information for a player affecting their availability.\n\nInjury records track both active injuries and ongoing health conditions that impact\na player's ability to participate in games and practices. This information is critical\nfor fantasy sports, betting markets, team planning, and fan engagement.\n\n## Status Classifications\nInjury status follows standard sports medicine and league reporting guidelines:\n- **out**: Definitely will not play in upcoming game(s)\n- **questionable**: Uncertain availability, game-time decision likely\n- **doubtful**: Unlikely to play but not definitively ruled out\n- **probable**: Expected to play, but still listed on injury report\n- **day_to_day**: Short-term injury designation without a firm game status\n- **ir**: Injured Reserve, extended absence with structured return process\n- **suspended**: League disciplinary action, not injury-related\n- **pup**: Physically Unable to Perform list (often preseason/training camp)\n\n## Practice Participation\nDaily practice status provides insight into injury severity and recovery progress:\n- **full_participation**: No restrictions, normal workload\n- **limited_participation**: Modified workload or specific restrictions\n- **did_not_practice**: Injury-related absence from practice\n- **did_not_practice_non_injury**: Rest day or non-injury related absence\n\n## Impact on Performance\nInjury status affects:\n- **Game Availability**: Whether player can participate\n- **Performance Level**: Reduced effectiveness due to injury\n- **Fantasy Value**: Player selection and projection adjustments\n- **Betting Markets**: Line movements and prop bet availability\n","example":{"common_model_id":"49306211-7b48-4b5e-88e9-a4190189dbea","confidence":0.65,"description":"Questionable with a knee injury","injury_type":"Knee","inserted_at":"2024-09-10T14:30:00Z","language_certainty":1.0,"league_id":"58e8c89b-72f8-4427-adbc-10f193c9b462","metadata":{},"player_id":"59291391-0c7e-442b-9496-33074647384e","practice_participation":{"friday":null,"monday":"did_not_practice","saturday":null,"sunday":null,"thursday":"limited_participation","tuesday":"did_not_practice","wednesday":"limited_participation"},"recent_practice_status":"limited_participation","reported_at":"2024-09-11T08:30:00Z","return_date":"2024-09-15","source":"example_provider","source_tier":3,"status":"questionable","tenant_id":"ff6332b6-8151-4a13-b20c-bd7b2ab45452","updated_at":"2024-09-11T09:15:00Z"},"properties":{"common_model_id":{"description":"Unique injury record identifier","type":"string"},"confidence":{"description":"Not populated on the aggregated injury report (null)","type":"number"},"description":{"description":"Free-text description from the source about the injury","type":"string"},"injury_type":{"description":"Body part or condition affected (e.g., 'Knee', 'Shoulder', 'Concussion')","type":"string"},"inserted_at":{"description":"When this injury record was first created in our system","format":"date-time","type":"string"},"language_certainty":{"description":"Not populated on the aggregated injury report (null)","type":"number"},"league_id":{"description":"League context for injury reporting standards","type":"string"},"metadata":{"description":"Vendor-neutral detail only (injury side and location, designation kind, team code)","type":"object"},"player_id":{"description":"Player affected by this injury","type":"string"},"practice_participation":{"description":"Weekly practice participation tracking injury recovery (follows league injury report schedule)","properties":{"friday":{"enum":["full_participation","limited_participation","did_not_practice","did_not_practice_non_injury"],"type":"string"},"monday":{"enum":["full_participation","limited_participation","did_not_practice","did_not_practice_non_injury"],"type":"string"},"saturday":{"enum":["full_participation","limited_participation","did_not_practice","did_not_practice_non_injury"],"type":"string"},"sunday":{"enum":["full_participation","limited_participation","did_not_practice","did_not_practice_non_injury"],"type":"string"},"thursday":{"enum":["full_participation","limited_participation","did_not_practice","did_not_practice_non_injury"],"type":"string"},"tuesday":{"enum":["full_participation","limited_participation","did_not_practice","did_not_practice_non_injury"],"type":"string"},"wednesday":{"enum":["full_participation","limited_participation","did_not_practice","did_not_practice_non_injury"],"type":"string"}},"type":"object"},"recent_practice_status":{"description":"Most recent practice participation level indicating recovery progress","enum":["full_participation","limited_participation","did_not_practice","did_not_practice_non_injury"],"type":"string"},"reported_at":{"description":"When the source originally reported this status (distinct from inserted_at)","format":"date-time","type":"string"},"return_date":{"description":"Projected or estimated return to play date (if available)","format":"date","type":"string"},"source":{"description":"Always 'sportsstack': injuries are one aggregated status per player, and the report does not expose which providers contributed","type":"string"},"source_tier":{"description":"Not populated on the aggregated injury report (null); the contributing providers are not exposed","enum":[1,2,3,4],"type":"integer"},"status":{"description":"Current injury designation following league injury report standards","enum":["out","questionable","doubtful","probable","day_to_day","ir","suspended","pup"],"type":"string"},"tenant_id":{"description":"Client tenant accessing this injury data","type":"string"},"updated_at":{"description":"Most recent update to injury status or practice participation","format":"date-time","type":"string"}},"required":["common_model_id","player_id","source"],"title":"Injury","type":"object"},"type":"array"}},"required":["data"],"type":"object"}}},"description":"Injuries"},"401":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"invalid_api_key","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/invalid_api_key","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"not_found","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/not_found","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Not Found"}},"summary":"List Injuries","tags":["Content"]}},"/api/v1/tournaments/{id}":{"get":{"callbacks":{},"description":"Returns detailed information about a specific tournament.\n\nIncludes tournament metadata, bracket structure (rounds and groups), and participant\ninformation. Use this endpoint to get complete tournament details including bracket\nstructure and current status.\n\nFor the complete bracket with matchups and scores, use the `/bracket` endpoint instead.\n","operationId":"ApiRestWeb.TournamentController.show","parameters":[{"description":"Tournament ID (common_model_id UUID)","in":"path","name":"id","required":true,"schema":{"example":"01c7133f-2999-4803-9872-8c2ab1ba63ac","format":"uuid","type":"string"}},{"description":"Include source mappings from the specific integration (i.e. a provider key) will return a source_mappings object with the mappings for the respective objects","in":"query","name":"return_source_id_format","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"description":"A tournament represents an organized competition structure with brackets, rounds, and matchups.\n\nTournaments organize events into structured competition formats including single elimination brackets,\nbest-of-series playoffs, and group stage + knockout combinations. They provide the framework for\ndetermining champions through progressive elimination or series-based competition.\n\n## Bracket Types\n\n### Single Elimination\nClassic bracket format where one loss eliminates a team (March Madness, CFP, Tennis Grand Slams).\n- Teams progress through rounds (First Round, Sweet 16, Elite 8, Final Four, Championship)\n- Each matchup is a single game\n- Winner advances, loser is eliminated\n\n### Best-of-Series\nPlayoff format where teams compete in multi-game series (NBA, NHL, MLB, NFL playoffs).\n- Each round is a best-of-N series (best of 7, best of 5, etc.)\n- Series winner determined by games won\n- Individual games tracked as separate events\n\n### Group + Knockout\nTwo-stage format with group play followed by knockout rounds (World Cup, UEFA Champions League).\n- **Groups**: Round-robin play within groups, top teams advance\n- **Knockout**: Single elimination bracket after group stage\n- Combines group standings with bracket progression\n\n## Data Sources\n\nTournament structure can be built from two sources:\n1. **Tournament Entity**: `rounds` field contains pre-structured bracket data\n2. **Events**: Individual game events with `tournament_id` and `tournament_round` can reconstruct brackets\n\nThe bracket endpoint intelligently uses whichever source provides the most complete data.\n\n### Soccer bracket reconstruction (FIFA-family tournaments)\nSoccer tournaments do not use 1-based `tournament_round` numbering. Reconstruct from events using:\n- **Group stage matches**: `tournament_id != null && tournament_round == 0`. Matchday in `metadata.round.number`, group identity in `metadata.group`.\n- **Knockout matches**: `tournament_id != null && tournament_round == null && metadata.cup_round_id != null`. The `metadata.cup_round_id` is the stable grouping key (4 quarterfinals share one id; Final and 3rd-place playoff have distinct ids despite sharing `metadata.stage`).\nNon-soccer tournaments (NCAAB, etc.) retain 1-based `tournament_round` bracket positions.\n\n## Key Relationships\n- **League**: Tournament belongs to a specific league\n- **Events**: Individual games/matches within the tournament\n- **Rounds**: Organized competition stages with matchups\n- **Groups**: Group stage divisions (for group_knockout tournaments)\n","example":{"abbreviation":"MM","bracket_type":"single_elimination","common_model_id":"01c7133f-2999-4803-9872-8c2ab1ba63ac","end_date":"2025-04-08","groups":[],"league_id":"31c65553-2f05-4ef7-993c-9e91c583afc8","name":"2025 NCAA Tournament","rounds":[],"season_year":2025,"start_date":"2025-03-20","status":"in_progress","tournament_type":"championship"},"properties":{"abbreviation":{"description":"Short form or acronym for the tournament","example":"MM","type":"string"},"bracket_type":{"description":"Bracket structure type: single_elimination (March Madness), best_of_series (NBA playoffs), group_knockout (World Cup)","enum":["single_elimination","best_of_series","group_knockout"],"type":"string"},"common_model_id":{"description":"Unique tournament identifier in our unified system","format":"uuid","type":"string"},"end_date":{"description":"Tournament end date","example":"2025-04-08","format":"date","type":"string"},"groups":{"description":"Group stage divisions (for group_knockout tournaments, see TournamentGroup schema)","items":{"description":"A group represents a division within the group stage of a tournament (World Cup, UEFA Champions League).\n\nGroups organize teams into round-robin competition pools where teams play each other\nand standings determine advancement to knockout rounds. Each group has its own standings\ntable tracking wins, losses, goals, and points.\n\n## Group Stage Structure\n\n- **Teams**: 3-4 teams per group (varies by tournament)\n- **Format**: Round-robin (each team plays every other team in group)\n- **Advancement**: Top teams (typically top 2) advance to knockout stage\n- **Standings**: Points, goal differential, head-to-head determine rankings\n\n## Standings Calculation\n\nStandings are calculated from group stage events:\n- **Points**: Win = 3, Draw = 1, Loss = 0 (varies by sport)\n- **Goal Differential**: Goals for - Goals against\n- **Head-to-Head**: Direct matchup results for tiebreaking\n","example":{"group_name":"Group A","standings":[{"drawn":1,"goal_difference":3,"goals_against":2,"goals_for":5,"lost":0,"played":3,"points":7,"position":1,"team_id":"e2790078-ec3a-4c45-8dc4-5cf173960b2b","won":2}],"teams":[{"abbreviation":"TMA","country_code":"USA","name":"Team A","team_id":"e2790078-ec3a-4c45-8dc4-5cf173960b2b"}]},"properties":{"group_name":{"description":"Group identifier (e.g., 'Group A', 'Group B')","example":"Group A","type":"string"},"standings":{"description":"Current group standings ordered by position","items":{"properties":{"drawn":{"description":"Draws","type":"integer"},"goal_difference":{"description":"Goal differential","type":"integer"},"goals_against":{"description":"Goals conceded","type":"integer"},"goals_for":{"description":"Goals scored","type":"integer"},"lost":{"description":"Losses","type":"integer"},"played":{"description":"Games played","type":"integer"},"points":{"description":"Total points","type":"integer"},"position":{"description":"Current position in group (1-based)","type":"integer"},"team_id":{"format":"uuid","type":"string"},"won":{"description":"Wins","type":"integer"}},"type":"object"},"type":"array"},"teams":{"description":"Teams participating in this group","items":{"properties":{"abbreviation":{"description":"Team abbreviation","type":"string"},"country_code":{"description":"Country code (for international tournaments)","type":"string"},"name":{"description":"Team name","type":"string"},"team_id":{"description":"Team common_model_id","format":"uuid","type":"string"}},"type":"object"},"type":"array"}},"required":["group_name","teams","standings"],"title":"TournamentGroup","type":"object"},"type":"array"},"league_id":{"description":"League this tournament belongs to","format":"uuid","type":"string"},"metadata":{"additionalProperties":true,"description":"Tournament metadata and provider-specific data. For soccer tournaments with multi-stage structure (World Cup family, and any future tournament sport adopting this shape), the following key is emitted:\n\n- `stages` — list of stage descriptors, each tagged with the provider that emitted it so multiple providers can coexist without clobbering each other. Each entry: `{source, order, type, phase, start_date, end_date, year, group_ids, matchdays, cup_round_ids}`. `group_ids` and `matchdays` populated for `type: \"league\"` (group) stages; `cup_round_ids` populated for `type: \"cup\"` (knockout) stages. The `source` field is the normalized provider source (e.g. `\"provider.soccer.fifa_world_cup\"`) — clients wanting a single provider's view filter `stages` by `source`.\n- `round_numbers` (where present) — flat list of all round numbers across stages. Kept for backward compatibility; prefer `stages[*].matchdays` and `stages[*].cup_round_ids` for navigable structure.\n\nThe flat `Tournament.rounds[]` and `Tournament.groups[]` arrays are unchanged; `metadata.stages` cross-references them by provider id.","type":"object"},"name":{"description":"Tournament name (e.g., '2025 NCAA Tournament', 'NBA Playoffs')","example":"2025 NCAA Tournament","type":"string"},"participants":{"description":"Initial seeded participants/teams in the tournament","items":{"properties":{"abbreviation":{"description":"Team abbreviation","type":"string"},"name":{"description":"Team name","type":"string"},"seed":{"description":"Tournament seed (1-16 for NCAA)","type":"integer"},"team_id":{"description":"Team common_model_id","type":"string"}},"type":"object"},"type":"array"},"rounds":{"description":"Bracket rounds with matchups (see TournamentRound schema)","items":{"description":"A round represents a stage of competition within a tournament bracket.\n\nRounds organize matchups into progressive stages of elimination or series competition.\nEach round contains multiple matchups (games or series) that determine advancement.\n\n## Round Structure by Bracket Type\n\n### Single Elimination Rounds\n- **Round 1**: First Round (64 teams → 32 teams)\n- **Round 2**: Second Round (32 teams → 16 teams)\n- **Round 3**: Sweet 16 (16 teams → 8 teams)\n- **Round 4**: Elite 8 (8 teams → 4 teams)\n- **Round 5**: Final Four (4 teams → 2 teams)\n- **Round 6**: Championship (2 teams → 1 champion)\n\n### Best-of-Series Rounds\n- **Round 1**: First Round (e.g., 16 teams → 8 teams via best-of-7 series)\n- **Round 2**: Conference Semifinals\n- **Round 3**: Conference Finals\n- **Round 4**: Finals\n\n### Group + Knockout Rounds\n- **Groups**: Round-robin play (not numbered rounds)\n- **Round 1**: Round of 16 (knockout stage begins)\n- **Round 2**: Quarterfinals\n- **Round 3**: Semifinals\n- **Round 4**: Final\n","example":{"best_of":null,"matchups":[{"away_score":72,"away_team":{"abbreviation":"TMB","name":"Team B","seed":16,"source_id":"competitor_67890","team_id":"f1798a7e-4832-4a2c-8cb6-60d5afcb3d41"},"event_id":"a96af633-aee6-48a0-bf72-0865a4419772","home_score":85,"home_team":{"abbreviation":"TMA","name":"Team A","seed":1,"source_id":"competitor_12345","team_id":"e2790078-ec3a-4c45-8dc4-5cf173960b2b"},"matchup_source_id":"event_12345678","position":0,"region":"East","scheduled_time":"2025-03-20T12:00:00Z","status":"completed","winner_id":"home"}],"round_name":"First Round","round_number":1,"round_type":"elimination"},"properties":{"best_of":{"description":"Best-of-N value for series rounds (3, 5, or 7 games). Null for single elimination.","example":7,"type":"integer"},"matchups":{"description":"Games or series in this round (see TournamentMatchup schema)","items":{"description":"A matchup represents a single game or series within a tournament round.\n\nMatchups connect teams/participants with game results, scores, and advancement status.\nEach matchup can be either a single game (elimination) or a series (best-of-N).\n\n## Matchup States\n\n- **Scheduled**: Game/series not yet started\n- **In Progress**: Currently being played\n- **Completed**: Finished with final results\n- **Pending**: Placeholder matchup (e.g., waiting for previous round results)\n\n## Team Information\n\nTeams in matchups include:\n- **team_id**: Our unified team identifier (resolved via identity mapping)\n- **source_id**: Provider's team identifier (before mapping)\n- **seed**: Tournament seed number (1-16 for NCAA, null for non-seeded tournaments)\n- **name/abbreviation**: Team display information\n\n## Winner Determination\n\n- **winner_id**: \"home\", \"away\", or null (if not yet determined)\n- **home_score/away_score**: Final scores (null if game not completed)\n- For series: `series_score` object with home/away wins instead of single game scores\n\n## Event Linking\n\n- **event_id**: Links to actual Event entity (populated when events are created)\n- **matchup_source_id**: Provider's game ID (before event creation)\n- When both exist, `event_id` takes precedence for detailed game data\n","example":{"away_score":72,"away_team":{"abbreviation":"TMB","name":"Team B","seed":16,"source_id":"competitor_67890","team_id":"f1798a7e-4832-4a2c-8cb6-60d5afcb3d41"},"event_id":"a96af633-aee6-48a0-bf72-0865a4419772","home_score":85,"home_team":{"abbreviation":"TMA","name":"Team A","seed":1,"source_id":"competitor_12345","team_id":"e2790078-ec3a-4c45-8dc4-5cf173960b2b"},"matchup_source_id":"event_12345678","position":0,"region":"East","scheduled_time":"2025-03-20T12:00:00Z","series_score":null,"status":"completed","winner_id":"home"},"properties":{"away_score":{"description":"Away team score (null if game not completed or for series rounds)","example":72,"type":"integer"},"away_team":{"description":"Away team information (same structure as home_team)","properties":{"abbreviation":{"type":"string"},"name":{"type":"string"},"seed":{"type":"integer"},"source_id":{"type":"string"},"team_id":{"format":"uuid","type":"string"}},"type":"object"},"event_id":{"description":"Event entity common_model_id (populated when events are created)","example":"a96af633-aee6-48a0-bf72-0865a4419772","format":"uuid","type":"string"},"home_score":{"description":"Home team score (null if game not completed or for series rounds)","example":85,"type":"integer"},"home_team":{"description":"Home team information","properties":{"abbreviation":{"description":"Team abbreviation","type":"string"},"name":{"description":"Team full name","type":"string"},"seed":{"description":"Tournament seed (1-16 for NCAA, null for non-seeded)","type":"integer"},"source_id":{"description":"Provider's team identifier","type":"string"},"team_id":{"description":"Team common_model_id (resolved via identity mapping)","format":"uuid","type":"string"}},"type":"object"},"matchup_source_id":{"description":"Provider's game/series ID (before event entity is created)","example":"event_12345678","type":"string"},"position":{"description":"Position/order of matchup within the round","example":0,"type":"integer"},"region":{"description":"Region/bracket name (for NCAA tournaments: East, West, South, Midwest)","example":"East","type":"string"},"scheduled_time":{"description":"Scheduled start time for the game/series","example":"2025-03-20T12:00:00Z","format":"date-time","type":"string"},"series_score":{"description":"Series score for best-of-series rounds (null for single elimination)","example":{"away":2,"home":4},"properties":{"away":{"description":"Away team wins in series","type":"integer"},"home":{"description":"Home team wins in series","type":"integer"}},"type":"object"},"status":{"description":"Matchup status","enum":["scheduled","in_progress","completed","pending"],"type":"string"},"winner_id":{"description":"Winner designation: 'home', 'away', or null if not determined","enum":["home","away",null],"type":"string"}},"required":["position","home_team","away_team","status"],"title":"TournamentMatchup","type":"object"},"type":"array"},"round_name":{"description":"Human-readable round name (e.g., 'First Round', 'Sweet 16', 'Conference Finals')","example":"First Round","type":"string"},"round_number":{"description":"Sequential round number (1-based, lower numbers = earlier rounds)","example":1,"type":"integer"},"round_type":{"description":"Type of round: elimination (single game), best_of_series (multi-game), knockout (post-group stage)","enum":["elimination","best_of_series","knockout"],"type":"string"}},"required":["round_number","round_name","round_type","matchups"],"title":"TournamentRound","type":"object"},"type":"array"},"season_year":{"description":"Primary year of the season (e.g., 2025 for 2024-25 season)","example":2025,"type":"integer"},"start_date":{"description":"Tournament start date","example":"2025-03-20","format":"date","type":"string"},"status":{"description":"Current tournament status","enum":["scheduled","in_progress","completed","cancelled"],"type":"string"},"tournament_type":{"description":"Type of tournament (championship, playoffs, tournament, etc.)","example":"championship","type":"string"}},"required":["common_model_id","name","league_id"],"title":"Tournament","type":"object"}}},"description":"Tournament Response"},"400":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"bad_request","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/bad_request","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"invalid_api_key","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/invalid_api_key","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"not_found","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/not_found","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Not Found"}},"summary":"Show Tournament","tags":["Reference"]}},"/api/v1/market_odds":{"get":{"callbacks":{},"deprecated":true,"description":"## ⚠️ Deprecation Notice\n\nThis endpoint is deprecated. Use `GET /api/v1/odds` for listing odds with league_id or event_id\nfilters, larger page sizes (up to 1000), and a flat response structure. The `/api/v1/odds` endpoint\nremains supported and is the preferred way to retrieve odds data.\n\n---\n\nRetrieve betting markets with outcomes and odds data using optimized performance structure.\n\n## Response Structure\n\nReturns markets with full outcomes and odds data using the optimized structure:\n```json\n{\n  \"market_id\": \"5c4e8fe4-5bc9-49e1-aa84-aaa975900703\",\n  \"market_name\": \"Moneyline\",\n  \"market_status\": \"active\",\n  \"market_type\": \"moneyline\",\n  \"market_updated_at\": \"2024-01-15T20:30:00Z\",\n  \"outcomes\": [\n    {\n      \"outcome_id\": \"abc123\",\n      \"outcome_name\": \"Team A\",\n      \"outcome_selection\": \"Team A\",\n      \"outcome_line\": null,\n      \"outcome_status\": \"ACTIVE\",\n      \"odds\": [\n        {\n          \"odds_id\": \"def456\",\n          \"odds_price\": -110,\n          \"odds_price_type\": \"american\",\n          \"odds_sportsbook\": \"draftkings\",\n          \"odds_is_main\": true,\n          \"odds_aggregator\": \"sportsstack\"\n        }\n      ]\n    }\n  ]\n}\n```\n\n## Performance Note\n\nBy default, this endpoint returns only the **latest odds** per outcome/sportsbook/aggregator\ncombination for optimal performance. If you need historical odds for line movement tracking,\nuse the `include_odds_history` parameter.\n\n**⚠️ Memory Protection**: This endpoint has a maximum page size of 250 records (instead of 1000)\nto prevent out-of-memory errors when loading nested outcomes and odds data. Use pagination\nto retrieve larger datasets.\n\n## Migration to Preferred Endpoint\n\n**Deprecated**: `GET /api/v1/market_odds` (this endpoint)\n**Preferred**: `GET /api/v1/odds` — use league_id or event_id filters and per_page up to 1000.\n","operationId":"ApiRestWeb.MarketController.market_odds","parameters":[{"description":"[Translatable] Filter by Event ID","example":"5c4e8fe4-5bc9-49e1-aa84-aaa975900703","in":"query","name":"event_id","required":false,"schema":{"type":"string"}},{"description":"[Translatable] Filter by Tournament ID","example":"a1b2c3d4-e5f6-7890-abcd-ef1234567890","in":"query","name":"tournament_id","required":false,"schema":{"type":"string"}},{"description":"Filter by league ID — accepts a UUID or league abbreviation (e.g., 'NFL', 'NBA')","example":"NFL","in":"query","name":"league_id","required":true,"schema":{"type":"string"}},{"description":"Filter by Market Group ID","example":"b2c3d4e5-f6a7-8901-bcde-f12345678901","in":"query","name":"market_group_id","required":false,"schema":{"type":"string"}},{"description":"Filter by Sportsbook ID","example":"draftkings","in":"query","name":"sportsbook","required":false,"schema":{"type":"string"}},{"description":"Filter by a single aggregator ID. A comma-separated list returns 400; send one request per aggregator.","example":"sportsstack","in":"query","name":"aggregator","required":false,"schema":{"type":"string"}},{"description":"Only include mainline odds","example":true,"in":"query","name":"is_main","required":false,"schema":{"type":"boolean"}},{"description":"Include all historical odds instead of just the latest.\n**Warning**: This can significantly increase response time and payload size.\nUse only when you need line movement history.\nDefault: false (returns only latest odds per outcome/sportsbook/aggregator)\n","example":false,"in":"query","name":"include_odds_history","required":false,"schema":{"type":"boolean"}},{"description":"The format for which field to query by (i.e. a provider key will mean you can pass in that provider's id) for any [Translatable] field","example":"provider_key","in":"query","name":"query_source_id_format","required":false,"schema":{"type":"string"}},{"description":"Include source mappings from the specific integration (i.e. a provider key) will return a source_mappings object with the mappings for the respective objects","example":"provider_key","in":"query","name":"return_source_id_format","required":false,"schema":{"type":"string"}},{"description":"Page number for page/per_page pagination. Do not combine with limit/offset.","in":"query","name":"page","required":false,"schema":{"default":1,"minimum":1,"type":"integer"}},{"description":"Number of items per page (max 1000). Do not combine with limit/offset.","in":"query","name":"per_page","required":false,"schema":{"default":25,"maximum":1000,"minimum":1,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"description":"Optimized betting markets with outcomes and odds data for high-performance scenarios.\n\nThis schema represents the response from the `/api/v1/market_odds` endpoint, which is the\nrecommended way to access market data with odds. It automatically includes outcomes and\nodds data using an optimized structure that provides approximately 80% faster\nresponse times compared to the deprecated `/api/v1/markets` endpoint.\n\n## Performance Characteristics\n- **Query Time**: ~386ms (28% faster than standard)\n- **Render Time**: ~500ms (90% faster than standard)\n- **Total Response**: ~1.2s (80% faster than standard)\n\n## Migration from Deprecated Endpoint\n\n**Old**: `GET /api/v1/markets?include_outcomes_and_odds=true`\n**New**: `GET /api/v1/market_odds`\n\nThe new endpoint provides the same data with better performance and cleaner API design.\n","example":{"common_model_id":"5c4e8fe4-5bc9-49e1-aa84-aaa975900703","event_id":"abc-123-def","is_future":false,"league_id":"league-456","market_type":"moneyline","name":"Moneyline","outcomes":[{"common_model_id":"abc123","line":null,"name":"Team A","odds":[{"aggregator":"sportsstack","common_model_id":"def456","is_main":true,"price":-110,"price_type":"american","sportsbook":"draftkings","timestamp":"2024-01-15T20:30:00Z"}],"player_id":null,"selection":"Team A","status":"ACTIVE","team_id":"58e8c89b-72f8-4427-adbc-10f193c9b462"}],"start_date":null,"status":"active","updated_at":"2024-01-15T20:30:00Z"},"properties":{"common_model_id":{"description":"Market ID","type":"string"},"event_id":{"description":"Event ID","type":"string"},"is_future":{"description":"Whether this is a future market","type":"boolean"},"league_id":{"description":"League ID","type":"string"},"market_type":{"description":"Market type","type":"string"},"name":{"description":"Market name","type":"string"},"outcomes":{"description":"Market outcomes with odds","items":{"description":"A specific betting outcome within a market, representing one possible result that bettors can wager on.\n\n## Outcome Standardization\n\nOutcomes undergo market-type-specific standardization to ensure consistent field formats:\n\n### Total Points Markets (Over/Under)\n```\nname: \"Over 228.5\"              # Human-readable with line value\nline: 228.5                     # Numeric line value\nselection: nil                  # No specific entity selection\nselection_line: \"over\"          # Direction (over/under)\nnormalized_selection: nil       # No entity to normalize\ngrouping_key: \"default:-228.5\" # Groups over/under for same line\n```\n\n### Point Spread Markets (Handicap)\n```\nname: \"Indiana Pacers +11\"           # Team name + formatted spread\nline: 11.0                           # Absolute line value\nselection: \"Indiana Pacers\"          # Team name\nselection_line: nil                  # Not applicable for spreads\nnormalized_selection: \"indiana_pacers\" # Lowercase, underscores\ngrouping_key: \"default:-11.0\"       # Groups home/away for same spread\n```\n\n### Moneyline Markets (Winner)\n```\nname: \"Oklahoma City Thunder\"               # Team name\nline: nil                                   # No line for moneyline\nselection: \"Oklahoma City Thunder\"          # Team name\nselection_line: nil                         # Not applicable\nnormalized_selection: \"oklahoma_city_thunder\" # Lowercase, underscores\ngrouping_key: \"default:Oklahoma City Thunder\" # Groups by team\n```\n\n### Field Standardization\n- **name**: Human-readable outcome description with context\n- **selection**: Entity being selected (team/player name or null)\n- **normalized_selection**: Lowercase, underscore-separated for consistent querying\n- **line**: Numeric betting line (spread/total value, null for moneyline)\n- **selection_line**: Direction for totals (\"over\"/\"under\"), null otherwise\n- **grouping_key**: Groups related outcomes (same spread/total different sides)\n","example":{"common_model_id":"123e4567-e89b-12d3-a456-426614174010","event_id":"30568865","grouping_key":"DraftKings-30568865-h2h","inserted_at":"2024-09-10T14:30:00Z","is_alternate_line":false,"is_main":true,"line":1.5,"market_id":"123e4567-e89b-12d3-a456-426614174011","market_type":"h2h","metadata":{"source":"draftkings","source_event_id":"30568865","source_market_id":"DraftKings-30568865-h2h"},"name":"DraftKings - 30568865 - h2h - Seattle Seahawks","normalized_selection":"Seattle Seahawks","player_id":"59291391-0c7e-442b-9496-33074647384e","selection":"Seattle Seahawks","selection_line":"1.5","stat_type":"points","status":"active","team_id":"58e8c89b-72f8-4427-adbc-10f193c9b462","tenant_id":"ff6332b6-8151-4a13-b20c-bd7b2ab45452","updated_at":"2024-09-11T09:15:00Z"},"properties":{"common_model_id":{"description":"Market ID","type":"string"},"event_id":{"description":"Event ID","type":"string"},"grouping_key":{"description":"Grouping Key","type":"string"},"inserted_at":{"description":"Timestamp of creation","format":"date-time","type":"string"},"is_alternate_line":{"description":"Is Alternate Line","type":"boolean"},"is_main":{"description":"Is Main","type":"boolean"},"line":{"description":"Line (if applicable)","type":"number"},"market_id":{"description":"Market ID","type":"string"},"market_type":{"description":"Market Type","type":"string"},"metadata":{"description":"Metadata. For prediction markets this includes an \"execution\" block carrying the trade-execution identifiers for the originating venue (venue, ticker/token_id, side, condition_id, neg_risk, tick_size, venue contracts, url). See the Prediction-Market Execution integration guide.","type":"object"},"name":{"description":"Name","type":"string"},"normalized_selection":{"description":"Normalized Selection","type":"string"},"odds":{"description":"Odds","items":{"description":"Betting odds from a specific sportsbook for a particular outcome, representing the price and probability.\n\n## Odds Standardization\n\nOdds undergo standardization to ensure consistent pricing representation and source attribution:\n\n### Source Selection Name Standardization\nThe `source_selection_name` field identifies what the sportsbook is offering odds on:\n\n#### Total Points Markets\n```\nsource_selection_name: nil  # No specific team/player selection\n```\n\n#### Point Spread Markets\n```\nsource_selection_name: \"Indiana Pacers\"     # Team receiving the spread\n# Derived from event.participants based on outcome selection\n```\n\n#### Moneyline Markets\n```\nsource_selection_name: \"Oklahoma City Thunder\"  # Team to win\n# Derived from event.participants based on outcome selection\n```\n\n### Price Standardization\n- **price**: Standardized to American odds format (-110, +150, etc.)\n- **price_type**: Always \"american\" for consistency\n- **timestamp**: UTC timestamp when current odds were observed. When the\n  response comes from the durable line-summary fallback, this is the time\n  the returned closing price last changed; same-price provider\n  reaffirmations do not advance it.\n\n### Sportsbook Attribution\n- **sportsbook**: Standardized sportsbook name (DraftKings, FanDuel, etc.)\n- **aggregator**: Upstream provider key or `sportsstack` for the canonical SportsStack board\n- **aggregator_event_id**: Provider's event identifier for traceability\n\n### Historical Tracking\nOdds include both current and opening lines for trend analysis:\n- Current odds: Real-time pricing from sportsbooks\n- Opening odds: Initial lines when market opened\n- Movement tracking: Compare current vs opening for line movement insights\n","example":{"aggregator":"sportsstack","aggregator_event_id":null,"fetched_at":"2026-04-21T17:40:00Z","metadata":{"aggregator":"sportsstack","id":"0HC75256377P350_1","link":"https://sportsbook.draftkings.com/event/30568865?outcomes=0HC75256377P350_1","selected_source":"example_provider.football.nfl","selection_reason":"trust_then_freshness","selection_tier":1,"source":"sportsstack","source_event_id":"30568865","source_market_id":"DraftKings-30568865-spreads","sportsstack_kind":"canonical_book_quote"},"price":-110,"price_type":"american","source_event_id":"30568865","source_id":"0HC75256377P350_1","source_market_id":"DraftKings-30568865-spreads","source_selection_id":"0HC75256377P350_1","source_selection_name":"Seattle Seahawks","sportsbook":"draftkings"},"properties":{"aggregator":{"description":"Upstream provider name or 'sportsstack' for the canonical SportsStack sportsbook board","type":"string"},"aggregator_event_id":{"description":"Aggregator event ID","type":"string"},"canonical_outcome_id":{"description":"Verified cross-venue economic outcome ID. Null when outcome equivalence is unresolved, push-capable, three-way, or ambiguous.","format":"uuid","nullable":true,"type":"string"},"clock_provenance":{"properties":{"evaluated_at":{"format":"date-time","type":"string"},"max_age_seconds":{"enum":[300],"type":"integer"},"quote_provenance":{"description":"Unmodified retained JSON provenance, including legacy or malformed evidence.","nullable":true},"source":{"enum":["timestamp",null],"nullable":true,"type":"string"}},"type":"object"},"common_model_id":{"description":"Market ID","type":"string"},"deep_link":{"description":"Desktop sportsbook deep link URL","type":"string"},"execution_readiness":{"description":"Requires exact native source-ID binding, active parent/outcome lifecycle and proven fresh provider clock; not order-fill certification. ProphetX additionally requires one atomic native strike/price/size/time observation matching its documented submit-order fields. ready=null means unknown. Native IDs remain separate from common_model_id.","example":{"available_size":{"state":"unknown","value":null},"depth":{"state":"unknown","value":null},"executable":{"reason":"catalog_is_not_a_book","state":"unknown"},"identifiers_valid":true,"liquidity":{"state":"unknown","value":null},"ready":null,"reasons":["provider_clock_provenance_downgrade"],"scope":"outcome_identifiers_and_provider_clock","venue":"limitless"},"properties":{"available_size":{"additionalProperties":true,"description":"Retained evidence; absent measurements have state unknown and value null.","type":"object"},"depth":{"additionalProperties":true,"description":"Retained evidence; absent measurements have state unknown and value null.","type":"object"},"executable":{"additionalProperties":true,"description":"Retained evidence; absent measurements have state unknown and value null.","type":"object"},"identifiers_valid":{"type":"boolean"},"liquidity":{"additionalProperties":true,"description":"Retained evidence; absent measurements have state unknown and value null.","type":"object"},"ready":{"nullable":true,"type":"boolean"},"reasons":{"items":{"type":"string"},"type":"array"},"scope":{"enum":["outcome_identifiers_and_provider_clock"],"type":"string"},"venue":{"type":"string"}},"type":"object"},"fetched_at":{"description":"Timestamp when SportsStack fetched or observed this quote","format":"date-time","nullable":true,"type":"string"},"freshness_reasons":{"description":"Deterministic provider_clock_* or lifecycle_* reasons; empty when fresh.","items":{"type":"string"},"type":"array"},"inserted_at":{"description":"Timestamp of creation","format":"date-time","type":"string"},"line_alignment":{"description":"SS main-line ladder plan Phase D. Present only for event-scoped, `latest_only=true` `/v1/odds` requests (`event_id` given) -- the key itself is absent from the response row (not present with a null body) for non-event-scoped `league_id`/list requests, since computing it there would mean an unbounded per-request ladder fetch across many events. Read-time derived from CommonModel.Betting.PredictionMarkets.LineLadder; never renames, removes, or reinterprets the sibling `is_main` field (the stored, write-time value) -- purely additive. All three sub-fields are null together when this row was not matched into a ranked ladder slot (e.g. a moneyline row, which has no alt-strike ladder, or a real-sportsbook row, which LineLadder never covers).","example":{"alignment_group":{"family":"spread","market_type":"point_spread","side":{"sign":"negative","team_id":null}},"is_main_derived":true,"sibling_line_count":2},"nullable":true,"properties":{"alignment_group":{"additionalProperties":true,"description":"The {market_type, family, side} ladder slot this row was matched into.","nullable":true,"type":"object"},"is_main_derived":{"description":"Whether LineLadder derived this row as the closest-to-even main line for its venue/slot, independent of the stored `is_main` column.","nullable":true,"type":"boolean"},"sibling_line_count":{"description":"Number of lines this row's own venue quotes within the same ladder slot.","nullable":true,"type":"integer"}},"type":"object"},"metadata":{"additionalProperties":true,"description":"Metadata. For prediction markets this includes an \"execution\" block carrying the trade-execution identifiers for the originating venue (venue, ticker/token_id, side, condition_id, neg_risk, tick_size, venue contracts, url). See the Prediction-Market Execution integration guide. UFC conditional markets expose \"probability_semantics\": \"conditional\", a structured \"condition\" object, and a plain-language \"void_condition\".","properties":{"condition":{"additionalProperties":true,"nullable":true,"properties":{"fight_result":{"description":"Fight-result condition for a conditional UFC market.","enum":["finish","decision"],"type":"string"},"round":{"description":"Optional round constraint for the conditional market.","minimum":1,"nullable":true,"type":"integer"}},"required":["fight_result"],"type":"object"},"probability_semantics":{"description":"Set to \"conditional\" when this price is conditional on the described fight result.","enum":["conditional"],"nullable":true,"type":"string"},"void_condition":{"description":"Plain-language condition under which a conditional UFC market is voided.","nullable":true,"type":"string"}},"type":"object"},"mobile_deep_link":{"description":"Mobile/native app deep link URL","type":"string"},"outcome_id":{"description":"Venue-backed SportsStack outcome ID","type":"string"},"platform_observed_at":{"description":"Prediction quotes only. Row observed_at, independently of provider freshness.","format":"date-time","nullable":true,"type":"string"},"price":{"description":"Price","type":"number"},"price_type":{"description":"Price format ('decimal', 'american')","type":"string"},"provider_freshness":{"description":"Prediction quotes only. Fresh requires a proven nonfuture provider clock at most 300 seconds old and proven active exact-parent/outcome lifecycle. Standalone odds report unknown without lifecycle proof.","enum":["fresh","stale","unknown"],"type":"string"},"provider_observed_at":{"description":"Prediction quotes only. Authoritative provider quote timestamp; never receipt/observation time. Requires matching observed quote_provenance.provider_updated_at; null for absent, synthetic or downgraded authority.","format":"date-time","nullable":true,"type":"string"},"reference_alignment":{"description":"Present only on crypto odds rows (omitted on sports rows; `line_alignment` is the\nsports ladder analogue and is omitted on crypto rows). `alignment` is `exact` (this\nmarket spans two or more venues), `single_venue`, or `unverified_mirror`.\n`different_reference_market_ids` lists the OTHER `market_id`s of the same window\n(any reference source), symmetrically.\n","properties":{"alignment":{"enum":["exact","single_venue","unverified_mirror"],"type":"string"},"alignment_group":{"description":"The window (event) id.","format":"uuid","type":"string"},"different_reference_market_ids":{"items":{"format":"uuid","type":"string"},"type":"array"},"reference_source":{"type":"string"},"tie_rule":{"enum":["up","split"],"type":"string"},"venue_count":{"minimum":1,"type":"integer"}},"title":"CryptoReferenceAlignment","type":"object"},"sgp_token":{"description":"Opaque same-game-parlay token supplied by the sportsbook. Null when the provider does not offer one.","nullable":true,"type":"string"},"source_event_id":{"description":"Source event ID","type":"string"},"source_id":{"description":"Source ID","type":"string"},"source_market_id":{"description":"Source market ID","type":"string"},"source_selection_id":{"description":"Source selection ID","type":"string"},"source_selection_name":{"description":"Source selection name","type":"string"},"sportsbook":{"description":"Sportsbook","type":"string"},"timestamp":{"description":"Provider quote timestamp","format":"date-time","nullable":true,"type":"string"},"trading_fees":{"description":"Prediction quotes only (absent on sportsbook rows and on venues whose fees are not captured yet: Limitless, ProphetX, Polymarket US, SX Bet). Computed at read time; no order-fill or account-specific guarantee (per-account discounts, maker rebates and balance-precision rounding are not modelled). Kalshi: rates from a versioned snapshot of Kalshi's public series metadata, event fee overrides and fee schedule; `observed_at` is the snapshot time. Series with event-level fee overrides (MLB) resolve per event: an override in force reports `scope: event` (with `event_ticker`, `effective_from`), before its `scheduled_ts` the series fee is reported with the pending change under `scheduled_override`, and an event missing from the snapshot reports `unknown` (`event_fee_override_not_in_snapshot`). Predict.fun: derived from the stored market `fee_rate_bps`; `observed_at` is the quote observation time. Polymarket: the market's own Gamma `feesEnabled`/`feeSchedule` captured with the quote (`fee = shares x rate x P x (1 - P)`, taker only, makers pay nothing; `maker.rebate_rate` is the fraction of taker fees returned to makers through a daily rebate program, not a per-fill credit; fees round to 5 decimal places with no published direction, so `rounding.direction` is absent); `observed_at` is the quote observation time, and quotes whose fee data is missing, has an exponent other than 1, or is not taker-only report `unknown`. The rate is per market (`sports_fees_v3` 0.05, `sports_fees_v2` 0.03, `zero_fees` 0 are all live on sports), never a category default.","example":{"availability":"published","charge_basis":"fill","fee_multiplier":1.0,"fee_type":"quadratic_with_maker_fees","maker":{"exponent":1,"model":"quadratic","multiplier":1.0,"rate":0.0175,"rounding":{"applies_to":"fee_plus_position_cost","direction":"up","increment":0.0001}},"observed_at":"2026-09-30T15:33:45Z","scope":"series","series_ticker":"KXNBAGAME","source":"kalshi_series_snapshot","taker":{"exponent":1,"model":"quadratic","multiplier":1.0,"rate":0.07,"rounding":{"applies_to":"fee_plus_position_cost","direction":"up","increment":0.0001}}},"properties":{"availability":{"enum":["published","unavailable","unknown"],"type":"string"},"charge_basis":{"description":"Fees are charged per fill, not per order or per settlement.","enum":["fill"],"type":"string"},"effective_from":{"description":"Kalshi, `scope: event`: the override's `scheduled_ts`, from which these rates apply.","format":"date-time","type":"string"},"event_ticker":{"description":"Kalshi: the market ticker minus its last `-` segment. Present for series with event-level fee overrides.","type":"string"},"fee_multiplier":{"type":"number"},"fee_rate_bps":{"type":"integer"},"fee_type":{"type":"string"},"fees_enabled":{"description":"Polymarket: the market's Gamma `feesEnabled` flag.","type":"boolean"},"maker":{"description":"One side of the fee. `quadratic`: fee = rate x contracts x (P x (1 - P)) ^ exponent. `linear_min_price`: fee = rate x min(P, 1 - P) x shares. `none`: no fee. `rate` already includes any venue multiplier.","properties":{"exponent":{"type":"integer"},"formula":{"type":"string"},"model":{"enum":["quadratic","linear_min_price","none"],"type":"string"},"multiplier":{"type":"number"},"rate":{"type":"number"},"rebate_rate":{"description":"Polymarket maker side: fraction of taker fees rebated to resting makers by the daily rebate program (context only, not a per-fill credit).","type":"number"},"rounding":{"properties":{"applies_to":{"type":"string"},"direction":{"enum":["up"],"type":"string"},"increment":{"type":"number"}},"type":"object"}},"type":"object"},"observed_at":{"format":"date-time","nullable":true,"type":"string"},"reason":{"description":"Present when availability is unknown; deterministic snake_case reason.","type":"string"},"scheduled_override":{"description":"Kalshi, `scope: series`: an event-level override that is not yet in force. Charged from `effective_from`; carries `fee_type`, `fee_multiplier`, `taker` and `maker` like the top-level object.","properties":{"effective_from":{"format":"date-time","type":"string"},"fee_multiplier":{"type":"number"},"fee_type":{"type":"string"},"maker":{"description":"One side of the fee. `quadratic`: fee = rate x contracts x (P x (1 - P)) ^ exponent. `linear_min_price`: fee = rate x min(P, 1 - P) x shares. `none`: no fee. `rate` already includes any venue multiplier.","properties":{"exponent":{"type":"integer"},"formula":{"type":"string"},"model":{"enum":["quadratic","linear_min_price","none"],"type":"string"},"multiplier":{"type":"number"},"rate":{"type":"number"},"rebate_rate":{"description":"Polymarket maker side: fraction of taker fees rebated to resting makers by the daily rebate program (context only, not a per-fill credit).","type":"number"},"rounding":{"properties":{"applies_to":{"type":"string"},"direction":{"enum":["up"],"type":"string"},"increment":{"type":"number"}},"type":"object"}},"type":"object"},"taker":{"description":"One side of the fee. `quadratic`: fee = rate x contracts x (P x (1 - P)) ^ exponent. `linear_min_price`: fee = rate x min(P, 1 - P) x shares. `none`: no fee. `rate` already includes any venue multiplier.","properties":{"exponent":{"type":"integer"},"formula":{"type":"string"},"model":{"enum":["quadratic","linear_min_price","none"],"type":"string"},"multiplier":{"type":"number"},"rate":{"type":"number"},"rebate_rate":{"description":"Polymarket maker side: fraction of taker fees rebated to resting makers by the daily rebate program (context only, not a per-fill credit).","type":"number"},"rounding":{"properties":{"applies_to":{"type":"string"},"direction":{"enum":["up"],"type":"string"},"increment":{"type":"number"}},"type":"object"}},"type":"object"}},"type":"object"},"scope":{"enum":["series","event","market"],"type":"string"},"series_ticker":{"type":"string"},"source":{"description":"kalshi_series_snapshot | kalshi_event_fee_snapshot | kalshi_fee_schedule_default | venue_record. `kalshi_event_fee_snapshot` is a Kalshi event-level override in force; `kalshi_fee_schedule_default` is the schedule default (quadratic x 1) inferred for a KX series not in the exception snapshot.","type":"string"},"taker":{"description":"One side of the fee. `quadratic`: fee = rate x contracts x (P x (1 - P)) ^ exponent. `linear_min_price`: fee = rate x min(P, 1 - P) x shares. `none`: no fee. `rate` already includes any venue multiplier.","properties":{"exponent":{"type":"integer"},"formula":{"type":"string"},"model":{"enum":["quadratic","linear_min_price","none"],"type":"string"},"multiplier":{"type":"number"},"rate":{"type":"number"},"rebate_rate":{"description":"Polymarket maker side: fraction of taker fees rebated to resting makers by the daily rebate program (context only, not a per-fill credit).","type":"number"},"rounding":{"properties":{"applies_to":{"type":"string"},"direction":{"enum":["up"],"type":"string"},"increment":{"type":"number"}},"type":"object"}},"type":"object"}},"type":"object"},"updated_at":{"description":"Timestamp when SportsStack last wrote this row","format":"date-time","type":"string"}},"required":["common_model_id","name"],"title":"Odds","type":"object"},"type":"array"},"player_id":{"description":"Player ID","type":"string"},"selection":{"description":"Selection","type":"string"},"selection_line":{"description":"Selection Line","type":"string"},"stat_type":{"description":"Stat type (if applicable)","type":"string"},"status":{"description":"Status","type":"string"},"team_id":{"description":"Team ID","type":"string"},"tenant_id":{"description":"Tenant ID","type":"string"},"updated_at":{"description":"Timestamp of last update","format":"date-time","type":"string"}},"required":["common_model_id","name"],"title":"Outcome","type":"object"},"type":"array"},"start_date":{"description":"Start date for future markets","format":"date-time","type":"string"},"status":{"description":"Market status","type":"string"},"tournament_id":{"description":"Tournament ID","type":"string"},"updated_at":{"description":"Timestamp of last market update","format":"date-time","type":"string"}},"required":["common_model_id","name","outcomes"],"title":"MarketOdds","type":"object"}}},"description":"Success"},"400":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"bad_request","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/bad_request","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"invalid_api_key","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/invalid_api_key","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"not_found","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/not_found","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Not Found"}},"summary":"List Market Odds","tags":["Betting"]}},"/api/v1/mappings/{id}":{"get":{"callbacks":{},"operationId":"ApiRestWeb.MappingsController.show","parameters":[{"description":"Mapping ID (UUID)","example":"01c7133f-2999-4803-9872-8c2ab1ba63ac","in":"path","name":"id","required":true,"schema":{"type":"string"}},{"description":"Add a `source_mappings` object for the requested integration (i.e. a provider key)","in":"query","name":"return_source_id_format","required":false,"schema":{"type":"string"}},{"description":"Operations-only (`mapping:read` scope): return a deprecated mapping by its ID.","in":"query","name":"include_deprecated","required":false,"schema":{"type":"boolean"}},{"description":"When true, add source_mappings_by_source keyed by full normalized source (for example, provider.football.nfl).","in":"query","name":"include_source_mappings_by_source","required":false,"schema":{"default":false,"type":"boolean"}},{"description":"Optional provider-family filter for source_mappings_by_source (for example, a provider key).","in":"query","name":"source_mapping_provider","required":false,"schema":{"type":"string"}},{"description":"Optional full-source filter for source_mappings_by_source in provider.sport.league format.","in":"query","name":"source_mapping_source","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"description":"Identity mapping that links external data provider IDs to our unified common model IDs.\n\nEntityIdentity records are the foundation of our data normalization system, enabling us\nto aggregate data from multiple providers about the same real-world entity (player, team,\nevent, etc.) into a single unified representation.\n\n## Core Concept\nDifferent data providers use different ID systems for the same entities:\n- **Provider A**: Player ID \"A_123456\"\n- **Provider B**: Player ID \"B_45678\"\n- **Provider C**: Player ID \"C_987654\"\n\nOur system maps these to a single common_model_id representing that player.\n\n## Mapping States\n- **Mapped**: source_id linked to valid common_model_id (ready for data aggregation)\n- **Pending**: source_id exists but common_model_id is null (needs manual/AI resolution)\n- **Conflicted**: Multiple potential matches requiring human review\n\n## Resolution Process\n1. **Automatic Matching**: Algorithm/AI attempts to link source_id to existing entity\n2. **Fuzzy Matching**: Name/attribute similarity matching when exact match fails\n3. **Manual Review**: Human verification for ambiguous cases\n4. **New Entity Creation**: Generate new common_model_id when no match exists\n\n## Data Quality Impact\nProper identity mapping ensures:\n- **Complete Data**: All provider data aggregated under single entity\n- **Accuracy**: No duplicate or missing entities\n- **Consistency**: Unified view across all data sources\n","example":{"entity_id":"59291391-0c7e-442b-9496-33074647384e","entity_type":"player","id":"49306211-7b48-4b5e-88e9-a4190189dbea","integration":"example_provider","league":"nfl","source_id":"123456"},"properties":{"all_mappings":{"description":"Optional enrichment containing all known provider mappings for this entity when include_all_mappings=true","items":{"properties":{"integration":{"description":"Provider name for this additional mapping","type":"string"},"source_id":{"description":"Provider-specific ID for this entity","type":"string"}},"type":"object"},"type":"array"},"common_model_id":{"description":"Our unified identifier for this entity - null indicates unmapped/pending status","type":"string"},"deprecated_at":{"description":"Set after two distinct complete catalog misses. Deprecated mappings are hidden by default.","format":"date-time","nullable":true,"type":"string"},"entity_type":{"description":"Category of entity being mapped (player, team, event, league, market, etc.)","type":"string"},"id":{"description":"Unique identifier for this specific mapping record","type":"string"},"inserted_at":{"description":"When this mapping was first created","format":"date-time","type":"string"},"integration":{"description":"External data provider key","type":"string"},"league":{"description":"League context for the mapping (nfl, nba, mlb) - same entity may have different IDs per league","type":"string"},"source_id":{"description":"Entity identifier from the external data provider's system","type":"string"},"source_mappings":{"additionalProperties":{"type":"string"},"description":"Optional provider-to-source_id map added when return_source_id_format is supplied","type":"object"},"source_mappings_by_source":{"additionalProperties":{"properties":{"event":{"description":"Event mapping rows for event endpoints.","items":{"properties":{"common_model_id":{"format":"uuid","type":"string"},"deprecated_at":{"format":"date-time","nullable":true,"type":"string"},"entity_type":{"type":"string"},"id_scheme":{"type":"string"},"ignored_pending":{"type":"boolean"},"league":{"type":"string"},"match_status":{"type":"string"},"overmapped_allowed":{"type":"boolean"},"provider":{"type":"string"},"source":{"type":"string"},"source_id":{"type":"string"},"tenant_id":{"format":"uuid","nullable":true,"type":"string"},"updated_at":{"format":"date-time","type":"string"}},"type":"object"},"type":"array"},"mappings":{"description":"Source mapping rows for non-event entity endpoints.","items":{"properties":{"common_model_id":{"format":"uuid","type":"string"},"deprecated_at":{"format":"date-time","nullable":true,"type":"string"},"entity_type":{"type":"string"},"id_scheme":{"type":"string"},"ignored_pending":{"type":"boolean"},"league":{"type":"string"},"match_status":{"type":"string"},"overmapped_allowed":{"type":"boolean"},"provider":{"type":"string"},"source":{"type":"string"},"source_id":{"type":"string"},"tenant_id":{"format":"uuid","nullable":true,"type":"string"},"updated_at":{"format":"date-time","type":"string"}},"type":"object"},"type":"array"},"participants":{"description":"Participant mapping rows for event endpoints.","items":{"properties":{"common_model_id":{"format":"uuid","type":"string"},"deprecated_at":{"format":"date-time","nullable":true,"type":"string"},"entity_type":{"type":"string"},"id_scheme":{"type":"string"},"ignored_pending":{"type":"boolean"},"league":{"type":"string"},"match_status":{"type":"string"},"overmapped_allowed":{"type":"boolean"},"participant_id":{"format":"uuid","type":"string"},"participant_role":{"type":"string"},"participant_side":{"enum":["home","away","neutral","unknown"],"type":"string"},"provider":{"type":"string"},"source":{"type":"string"},"source_id":{"type":"string"},"tenant_id":{"format":"uuid","nullable":true,"type":"string"},"updated_at":{"format":"date-time","type":"string"}},"type":"object"},"type":"array"},"unmapped_participants":{"description":"Event participants that could not be emitted as source mappings because they were placeholders/TBD or lacked a mapping for the requested source.","items":{"properties":{"display_name":{"type":"string"},"participant_id":{"type":"string"},"participant_role":{"type":"string"},"participant_side":{"enum":["home","away","neutral","unknown"],"type":"string"},"reason":{"enum":["placeholder_or_tbd","missing_source_mapping"],"type":"string"}},"type":"object"},"type":"array"}},"type":"object"},"description":"Optional enterprise mapping enrichment keyed by full normalized source. Added when include_source_mappings_by_source=true.","type":"object"},"updated_at":{"description":"When this mapping was last updated","format":"date-time","type":"string"}},"required":["id","entity_type","integration","league","source_id"],"title":"Mapping","type":"object"}}},"description":"Mapping Response"},"400":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"bad_request","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/bad_request","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"invalid_api_key","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/invalid_api_key","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"forbidden","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/forbidden","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"not_found","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/not_found","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"internal_error","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/internal_error","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Internal Server Error"}},"summary":"Show Mapping","tags":["Mappings"]}},"/api/v1/play-stats":{"get":{"callbacks":{},"description":"This endpoint retrieves a list of play stats across all events.\nYou can filter by various parameters including player_id, event_id, league_id.\n\nNote: This endpoint defaults to the maximum supported page size (1000) due to the volume of play stats data.\n","operationId":"ApiRestWeb.EventController.index_play_stats","parameters":[{"description":"Filter by player ID","in":"query","name":"player_id","required":false,"schema":{"type":"string"}},{"description":"Filter by event ID","in":"query","name":"event_id","required":false,"schema":{"type":"string"}},{"description":"Filter by league ID — accepts a UUID or league abbreviation (e.g., 'NFL', 'NBA')","in":"query","name":"league_id","required":false,"schema":{"type":"string"}},{"description":"Filter by team ID","in":"query","name":"team_id","required":false,"schema":{"type":"string"}},{"description":"Filter by play number within the event","in":"query","name":"play_number","required":false,"schema":{"type":"integer"}},{"description":"Page number for page/per_page pagination. Do not combine with limit/offset.","in":"query","name":"page","required":false,"schema":{"default":1,"minimum":1,"type":"integer"}},{"description":"Number of items per page (max 1000). Do not combine with limit/offset.","in":"query","name":"per_page","required":false,"schema":{"default":1000,"maximum":1000,"minimum":1,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"description":"Individual player statistics and involvement details for a specific play within an event.\n\nPlayStat records capture how individual players contributed to or were affected by\nspecific plays. This granular data enables advanced player evaluation, situational\nperformance analysis, and detailed coaching insights beyond traditional box scores.\n\n## Player-Play Relationship\nEach PlayStat links a player to a specific play, recording:\n- **Role**: How the player was involved (quarterback, receiver, defender, etc.)\n- **Performance**: Measurable outcomes (yards gained, tackles made, shots taken)\n- **Context**: Situational factors affecting the player's involvement\n\n## Use Cases\n- **Advanced Analytics**: Context-aware player performance evaluation\n- **Coaching Analysis**: Individual performance in specific situations\n- **Fantasy Sports**: Granular scoring and projection models\n- **Player Development**: Detailed performance tracking and improvement areas\n\n## Data Inheritance\nPlayStat inherits contextual information from the parent Play record while adding\nplayer-specific details about involvement and statistical outcomes.\n","example":{"common_model_id":"123e4567-e89b-12d3-a456-426614174000","event_id":"123e4567-e89b-12d3-a456-426614174003","play_number":1,"player_id":"123e4567-e89b-12d3-a456-426614174001","player_info":{"role":"quarterback","statistics":{"completion":true,"passing_touchdowns":1,"passing_yards":20}}},"properties":{"common_model_id":{"description":"Unique identifier for this player-play statistical record","type":"string"},"defense_id":{"description":"Team or player in defensive role during this play","type":"string"},"description":{"description":"Human-readable description of what happened (inherited from Play)","type":"string"},"event_id":{"description":"Parent event/game containing this play","type":"string"},"game_context":{"additionalProperties":true,"description":"Situational game state when play occurred (inherited from parent Play)","type":"object"},"inserted_at":{"description":"When this player-play statistic record was created","format":"date-time","type":"string"},"league_id":{"description":"League context for sport-specific statistical interpretation","format":"uuid","type":"string"},"minutes_remaining":{"description":"Minutes remaining in period when play started (inherited from Play)","type":"integer"},"offense_id":{"description":"Team or player with possession during this play","type":"string"},"period":{"description":"Game period when this play occurred (inherited from Play)","type":"integer"},"play_details":{"additionalProperties":true,"description":"General play outcome details (inherited from parent Play record)","type":"object"},"play_number":{"description":"Play number within the event, scoped to `source` — NOT globally unique per event. Multiple feeds (from different providers) can each number their own plays starting from 1, so the same play_number on two different sources refers to two different plays. Always join on (event_id, source, play_number), never (event_id, play_number) alone.","type":"integer"},"play_type":{"description":"Classification of play action (inherited from parent Play)","type":"string"},"player_id":{"description":"Player who participated in or was affected by this play","type":"string"},"player_info":{"additionalProperties":true,"description":"Player-specific role, involvement, and statistical outcomes for this play","properties":{"external_player_id":{"description":"Provider-specific player identifier","type":"string"},"role":{"description":"Player's role(s) in this specific play (e.g., 'quarterback', 'receiver', 'tackler')","items":{"type":"string"},"type":"array"},"statistics":{"additionalProperties":false,"description":"Play-level player statistics using canonical field names from our stat registry.\n\n## Play-Specific Context\nThese statistics represent individual player performance within a single play. Unlike\nevent-scoped or season-scoped stats, these capture momentary contributions to specific\ngame actions.\n\n## Standardized Stat Names\nAll statistics use our unified canonical naming system to ensure consistency across data providers.\nCommon play-level stats include:\n- **Passing**: passing_yards, passing_touchdowns, completion, interception\n- **Rushing**: rushing_yards, rushing_touchdowns, fumble\n- **Receiving**: receiving_yards, receiving_touchdowns, reception, target\n- **Defense**: tackle, assist, sack, pass_defended, interception\n- **Kicking**: field_goal_made, field_goal_yards, extra_point_made\n\n## Provider Translation\nRaw provider data is automatically translated to canonical names:\n- **Provider A**: \"py\" → \"passing_yards\", \"car\" → \"rushing_attempts\"\n- **Provider B**: \"pass_yds\" → \"passing_yards\", \"rush_att\" → \"rushing_attempts\"\n\nNote: Not all stats are applicable to every play. Only relevant stats for the player's\nrole in that specific play will be present.\n","example":{"completion":true,"passing_yards":15,"target_depth":12},"properties":{"def_interception_touchdowns":{"description":"Defensive interception touchdowns","example":5,"type":"integer"},"throwaways":{"description":"Number of throw away passes","example":5,"type":"integer"},"fanduel_fantasy_points_ceiling":{"description":"FanDuel fantasy points ceiling","example":18.5,"type":"number"},"on_target_throws":{"description":"Number of on-target throws","example":5,"type":"integer"},"interception_returns":{"description":"Number of interception returns","example":5,"type":"integer"},"kickoff_return_touchdowns":{"description":"Kickoff return touchdowns","example":5,"type":"integer"},"extra_points_attempted":{"description":"Number of extra point attempts","example":5,"type":"integer"},"redzone_rushing_attempts":{"description":"Rush attempts in the red zone","example":15,"type":"integer"},"is_motion":{"description":"Whether player was in motion during play","example":"example_value","type":"boolean"},"passing_attempts":{"description":"Total number of pass attempts","example":15,"type":"integer"},"punt_long":{"description":"Longest punt","example":5,"type":"integer"},"fumble_return_yards":{"description":"Yards gained on fumble returns","example":250,"type":"integer"},"first_read_receptions":{"description":"Number of first read receptions","example":5,"type":"integer"},"red_zone_pass_attempts":{"description":"Pass attempts in red zone","example":15,"type":"integer"},"points":{"description":"Total points scored by team","example":5,"type":"integer"},"depth_of_target":{"description":"Average depth of target","example":12.3,"type":"number"},"defensive_interceptions":{"description":"Defensive interceptions","example":5,"type":"integer"},"receiving_two_point_conversions":{"description":"Receiving two-point conversions","example":5,"type":"integer"},"field_goal_yards":{"description":"Yards gained on field goals","example":250,"type":"integer"},"conversion_defense_successes":{"description":"Two-point conversion defensive successes","example":5,"type":"integer"},"blocked_kick_return_touchdowns":{"description":"Touchdowns scored on blocked kick returns","example":5,"type":"integer"},"fanduel_ownership":{"description":"FanDuel ownership percentage","example":12.3,"type":"number"},"draftkings_fantasy_points_ceiling":{"description":"DraftKings fantasy points ceiling","example":18.5,"type":"number"},"first_read_targets":{"description":"Number of first read targets","example":5,"type":"integer"},"special_teams_snap_count":{"description":"Number of special teams snaps played","example":5,"type":"integer"},"out_of_pocket_reason":{"description":"Reason quarterback left the pocket","example":"example_value","type":"string"},"goal_line_touches":{"description":"Number of goal line touches","example":5,"type":"integer"},"receiving_yards_100_plus":{"description":"Number of 100+ yard receiving games","example":250,"type":"integer"},"total_pocket_time":{"description":"Total time spent in pocket","example":12.3,"type":"number"},"interception_return_longest_touchdown":{"description":"Longest interception return for touchdown","example":5,"type":"integer"},"field_goals_attempts":{"description":"Number of field goal attempts","example":15,"type":"integer"},"safeties":{"description":"Number of safeties","example":5,"type":"integer"},"pass_first_downs":{"description":"First downs gained via passing","example":5,"type":"integer"},"red_zone_passing_completions":{"description":"Passing completions in red zone","example":10,"type":"integer"},"net_punt_yards":{"description":"Net punt yards","example":250,"type":"integer"},"kneel_downs":{"description":"Number of kneel downs","example":5,"type":"integer"},"cushion_yards":{"description":"Cushion yards","example":250,"type":"integer"},"punt_yards":{"description":"Total punt yards","example":250,"type":"integer"},"challenges_remaining":{"description":"Number of challenges remaining","example":5,"type":"integer"},"passing_gross_yards":{"description":"Gross passing yards before sacks","example":250,"type":"integer"},"avg_pocket_time":{"description":"Average time in pocket per pass attempt","example":12.3,"type":"number"},"defended_passes":{"description":"Passes defended by defenders","example":5,"type":"integer"},"dropped_pass":{"description":"Number of dropped passes","example":5,"type":"integer"},"rushing_direction":{"description":"Direction of rushing attempt","example":"example_value","type":"string"},"sacks_taken":{"description":"Number of sacks taken by quarterback","example":5,"type":"integer"},"rec_long":{"description":"Longest reception","example":5,"type":"integer"},"yards_after_catch":{"description":"Yards gained after catch","example":250,"type":"integer"},"activated":{"description":"Player was activated to the game-day roster (shipped as 0/1)","example":5,"type":"integer"},"passing_yards":{"description":"Total passing yards thrown by the player/team","example":250,"type":"integer"},"touchdowns":{"description":"Total touchdowns scored","example":5,"type":"integer"},"rushing_fumbles":{"description":"Number of fumbles while rushing","example":5,"type":"integer"},"pre_snap_motion":{"description":"Player pre-snap motion type","example":"example_value","type":"boolean"},"nfl_fantasy_points":{"description":"NFL fantasy points","example":18.5,"type":"number"},"assisted_tackles":{"description":"Number of assisted tackles","example":5,"type":"integer"},"passing_completions":{"description":"Number of completed passes","example":10,"type":"integer"},"sacks":{"description":"Number of sacks (as QB or defensive player)","example":12.3,"type":"number"},"passing_40_plus":{"description":"Passing completions of 40+ yards","example":5,"type":"integer"},"missed_tackle_location":{"description":"Location of missed tackle","example":"example_value","type":"string"},"rushing_longest_touchdown":{"description":"Longest touchdown rush","example":5,"type":"integer"},"penalty_yards":{"description":"Penalty yards assessed","example":250,"type":"integer"},"rushing_tds_40_plus_yards":{"description":"Rushing touchdowns of 40+ yards","example":250,"type":"integer"},"penalties":{"description":"Number of penalties committed","example":5,"type":"integer"},"rushing_yards":{"description":"Total rushing yards gained","example":250,"type":"integer"},"punt_return_yards":{"description":"Punt return yards","example":250,"type":"integer"},"blocked_kicks":{"description":"Number of blocked kicks","example":5,"type":"integer"},"position":{"description":"Player position","example":"example_value","type":"string"},"sack_yards_lost":{"description":"Yards lost on sacks","example":250,"type":"integer"},"kickoff_touchbacks":{"description":"Number of kickoff touchbacks","example":5,"type":"integer"},"def_interception_yards":{"description":"Defensive interception return yards","example":250,"type":"integer"},"rush_long":{"description":"Longest rush","example":5,"type":"integer"},"played":{"description":"Whether the player appeared in the game","example":"example_value","type":"boolean"},"two_point_conversions":{"description":"Number of two-point conversions","example":5,"type":"integer"},"conversion_defense_attempts":{"description":"Two-point conversion defensive attempts","example":15,"type":"integer"},"tackles":{"description":"Total tackles (solo + assisted)","example":5,"type":"integer"},"return_yards":{"description":"Total return yards (kick/punt combined)","example":250,"type":"integer"},"kickoff_return_yards":{"description":"Total yards on kickoff returns (opponent)","example":250,"type":"integer"},"games_played":{"description":"Number of games played in","example":5,"type":"integer"},"receiving_20_plus":{"description":"Receptions of 20+ yards","example":5,"type":"integer"},"field_goals_missed":{"description":"Field goals missed","example":5,"type":"integer"},"draftkings_rating":{"description":"DraftKings player rating","example":98.7,"type":"number"},"pre_snap_alignment":{"description":"Player pre-snap alignment","example":"example_value","type":"string"},"kickoff_inside_20":{"description":"Kickoffs downed inside the 20 yard line","example":5,"type":"integer"},"batted_passes":{"description":"Passes batted down at line of scrimmage","example":5,"type":"integer"},"rushing_avg_yards":{"description":"Average yards per carry","example":12.3,"type":"number"},"interception_long":{"description":"Longest interception return","example":5,"type":"integer"},"special_teams_assisted_tackles":{"description":"Assisted tackles made on special-teams plays (kick and punt coverage)","example":5,"type":"integer"},"time_to_throw":{"description":"Time from snap to ball release in seconds","example":12.3,"type":"number"},"player_id":{"description":"Player identifier","example":"example_value","type":"string"},"kickoff_out_of_bounds":{"description":"Kickoffs out of bounds","example":5,"type":"integer"},"pass_long":{"description":"Longest pass completion","example":5,"type":"integer"},"fanduel_fantasy_points":{"description":"FanDuel fantasy points","example":18.5,"type":"number"},"def_tackles_assisted":{"description":"Defensive assisted tackles","example":5,"type":"integer"},"punts_inside_20":{"description":"Number of punts inside the 20-yard line","example":5,"type":"integer"},"solo_tackles":{"description":"Number of solo tackles","example":5,"type":"integer"},"redzone_passing_attempts":{"description":"Pass attempts in the red zone","example":15,"type":"integer"},"poor_throws":{"description":"Number of poor throws","example":5,"type":"integer"},"opponent_fumble_recovery_touchdowns":{"description":"Touchdowns on opponent fumble recoveries","example":5,"type":"integer"},"opponent_fumble_recoveries":{"description":"Opponent fumble recoveries","example":5,"type":"integer"},"deep_pass_attempts":{"description":"Deep pass attempts","example":15,"type":"integer"},"gross_kickoff_yards":{"description":"Yards gained on gross kickoffs","example":250,"type":"integer"},"qb_knockdowns":{"description":"Times quarterback was knocked down","example":5,"type":"integer"},"passing_attempts_allowed":{"description":"Passing attempts allowed by defense","example":15,"type":"integer"},"misc_solo_tackles":{"description":"Solo tackles made on change-of-possession plays (interception and fumble returns)","example":5,"type":"integer"},"total_tackles":{"description":"Total tackles across every phase of the game -- scrimmage defense plus special teams plus change-of-possession (misc) plays. This is the quantity NFL tackle props are priced and graded on.","example":5,"type":"integer"},"deep_targets":{"description":"Number of deep targets (20+ yards)","example":5,"type":"integer"},"fumbles":{"description":"Total number of fumbles","example":5,"type":"integer"},"fourth_down_stops":{"description":"Fourth down stops recorded by defense","example":5,"type":"integer"},"rushing_two_point_conversions":{"description":"Rushing two-point conversions","example":5,"type":"integer"},"missed_or_broken_tackles":{"description":"Number of missed or broken tackles","example":5,"type":"integer"},"receiving_yards":{"description":"Total receiving yards gained","example":250,"type":"integer"},"fanduel_rating":{"description":"FanDuel player rating","example":98.7,"type":"number"},"separation_type":{"description":"Type of separation","example":"example_value","type":"string"},"pressure_type":{"description":"Pressure type","example":"example_value","type":"string"},"timeouts_used":{"description":"Number of timeouts used","example":5,"type":"integer"},"returns":{"description":"Number of return attempts (kick/punt)","example":5,"type":"integer"},"conversion_passing_attempts":{"description":"Two-point conversion passing attempts","example":15,"type":"integer"},"net_kickoff_yards":{"description":"Yards gained on net kickoffs","example":250,"type":"integer"},"receiving_targets":{"description":"Number of times targeted for a pass","example":5,"type":"integer"},"extra_points_blocked":{"description":"Number of extra points blocked","example":5,"type":"integer"},"receptions":{"description":"Number of receptions/catches","example":5,"type":"integer"},"snap_counts_confirmed":{"description":"Provider confirms the snap counts for this game are final","example":"example_value","type":"boolean"},"motion_at_snap":{"description":"Player motion status at snap","example":"example_value","type":"boolean"},"receiving_fumbles":{"description":"Number of fumbles while receiving","example":5,"type":"integer"},"explosive_runs":{"description":"Number of explosive rushing attempts (10+ yards)","example":5,"type":"integer"},"rushing_40_plus":{"description":"Rushing attempts of 40+ yards","example":5,"type":"integer"},"interceptions":{"description":"Number of interceptions thrown","example":5,"type":"integer"},"quarterback_hits":{"description":"Number of quarterback hits","example":5,"type":"integer"},"interception_return_yards":{"description":"Yards gained on interception returns","example":250,"type":"integer"},"yahoo_fantasy_points_ceiling":{"description":"Yahoo fantasy points ceiling","example":18.5,"type":"number"},"primary_coverage":{"description":"Primary coverage","example":"example_value","type":"boolean"},"secondary_coverage":{"description":"Secondary coverage","example":"example_value","type":"boolean"},"fumbles_recovered":{"description":"Number of fumbles recovered","example":5,"type":"integer"},"rushing_20_plus":{"description":"Rushing attempts of 20+ yards","example":5,"type":"integer"},"throw_away":{"description":"Whether the pass was intentionally thrown away","example":"example_value","type":"boolean"},"field_goal_percentage":{"description":"Field goal percentage (made/attempted)","example":12.3,"type":"number"},"receiving_tds":{"description":"Number of receiving touchdowns","example":2,"type":"integer"},"passes_defended":{"description":"Number of passes defended","example":5,"type":"integer"},"fumble_return_touchdowns":{"description":"Touchdowns scored on fumble returns","example":5,"type":"integer"},"completion_percentage":{"description":"Pass completion percentage","example":12.3,"type":"number"},"interception_worthy_throws":{"description":"Interception worthy throws","example":5,"type":"integer"},"red_zone_targets":{"description":"Number of targets in the red zone","example":5,"type":"integer"},"allowed_pressure":{"description":"Allowed pressure","example":"example_value","type":"boolean"},"kickoff_yards":{"description":"Total kickoff yards","example":250,"type":"integer"},"qb_hurries":{"description":"Times quarterback was hurried","example":5,"type":"integer"},"kickoff_returns":{"description":"Number of kickoff returns by opponents","example":5,"type":"integer"},"passing_two_point_conversions":{"description":"Passing two-point conversions","example":5,"type":"integer"},"first_downs":{"description":"Total first downs (used for passing first downs in SR)","example":5,"type":"integer"},"defensive_touchdowns":{"description":"Number of defensive touchdowns","example":5,"type":"integer"},"opponent_fumble_recovery_yards":{"description":"Yards gained on opponent fumble recoveries","example":250,"type":"integer"},"blocked_kick_returns":{"description":"Number of blocked kick returns","example":5,"type":"integer"},"conversion_rushing_attempts":{"description":"Two-point conversion rushing attempts","example":15,"type":"integer"},"extra_point_return_touchdowns":{"description":"Extra point attempts returned for a touchdown by the defense","example":5,"type":"integer"},"own_fumble_recoveries":{"description":"Own fumble recoveries","example":5,"type":"integer"},"punts_blocked":{"description":"Number of punts blocked","example":5,"type":"integer"},"rush_rate":{"description":"Rush rate (rushing attempts per play)","example":12.3,"type":"number"},"passing_avg_yards":{"description":"Average yards per pass attempt","example":12.3,"type":"number"},"special_teams_solo_tackles":{"description":"Solo tackles made on special-teams plays (kick and punt coverage)","example":5,"type":"integer"},"red_zone_passing_attempts":{"description":"Passing attempts in red zone","example":15,"type":"integer"},"conversion_rushing_successes":{"description":"Two-point conversion rushing successes","example":5,"type":"integer"},"dropped_passes":{"description":"Passes dropped by receivers","example":5,"type":"integer"},"passing_net_yards":{"description":"Net passing yards (gross yards minus sack yards lost)","example":250,"type":"integer"},"rushing_first_downs":{"description":"First downs gained via rushing","example":5,"type":"integer"},"passing_yards_allowed":{"description":"Passing yards allowed by defense","example":250,"type":"integer"},"tackles_for_loss_yards":{"description":"Yards lost on tackles for loss","example":250,"type":"integer"},"punt_touchbacks":{"description":"Number of punt touchbacks","example":5,"type":"integer"},"missed_tackle_cause":{"description":"Cause of missed tackle","example":"example_value","type":"string"},"missed_tackle":{"description":"Number of missed tackles","example":5,"type":"integer"},"own_fumble_recovery_touchdowns":{"description":"Touchdowns on own fumble recoveries","example":5,"type":"integer"},"auction_value":{"description":"Auction draft value","example":12.3,"type":"number"},"rushing_attempts_allowed":{"description":"Rushing attempts allowed by defense","example":15,"type":"integer"},"receiving_first_downs":{"description":"First downs gained via receiving","example":5,"type":"integer"},"fg_long":{"description":"Longest field goal made","example":5,"type":"integer"},"own_fumble_recovery_yards":{"description":"Yards gained on own fumble recoveries","example":250,"type":"integer"},"player_kickoff_return_yards":{"description":"Kickoff return yards recorded by the returning player","example":250,"type":"integer"},"timeouts_remaining":{"description":"Number of timeouts remaining","example":5,"type":"integer"},"defensive_tackles_combined":{"description":"Tackles (solo + assisted) made on scrimmage defense only, excluding special teams and change-of-possession plays","example":5,"type":"integer"},"tackles_for_loss":{"description":"Rushes resulting in tackles for loss","example":5,"type":"integer"},"rushing_attempts":{"description":"Number of rushing attempts","example":15,"type":"integer"},"games_started":{"description":"Number of games started","example":5,"type":"integer"},"rank":{"description":"Player ranking","example":5,"type":"integer"},"fielding_e":{"description":"Fielding errors","example":5,"type":"integer"},"kickoff_onside_successes":{"description":"Successful onside kicks","example":5,"type":"integer"},"scrambles":{"description":"Number of quarterback scrambles","example":5,"type":"integer"},"passing_touchdowns_allowed":{"description":"Passing touchdowns allowed by defense","example":5,"type":"integer"},"passing_tds":{"description":"Number of passing touchdowns","example":2,"type":"integer"},"spikes":{"description":"Number of spiked passes","example":5,"type":"integer"},"punt_return_attempts":{"description":"Punt return attempts","example":15,"type":"integer"},"conversion_passing_successes":{"description":"Two-point conversion passing successes","example":5,"type":"integer"},"deep_pass_completions":{"description":"Deep pass completions (20+ yards)","example":10,"type":"integer"},"forced_fumbles":{"description":"Number of fumbles forced by defender","example":5,"type":"integer"},"interception_touchdowns_thrown":{"description":"Interceptions returned for touchdowns (pick-6s)","example":5,"type":"integer"},"punt_return_touchdowns":{"description":"Punt return touchdowns","example":5,"type":"integer"},"is_out_of_pocket":{"description":"Whether quarterback left the pocket","example":"example_value","type":"boolean"},"passing_yards_300_plus":{"description":"Passing yards over 300","example":250,"type":"integer"},"kickoff_return_attempts":{"description":"Kickoff return attempts","example":15,"type":"integer"},"rushing_yards_allowed":{"description":"Rushing yards allowed by defense","example":250,"type":"integer"},"jersey":{"description":"Player jersey number","example":"example_value","type":"string"},"passing_rating":{"description":"Quarterback passer rating","example":98.7,"type":"number"},"contested_ball":{"description":"Whether the targeted receiver's pass was contested","example":"example_value","type":"boolean"},"field_goals_made":{"description":"Number of field goals made","example":5,"type":"integer"},"interception_return_average":{"description":"Average yards per interception return","example":12.3,"type":"number"},"extra_points_missed":{"description":"Extra points missed","example":5,"type":"integer"},"yahoo_fantasy_points":{"description":"Yahoo fantasy points","example":18.5,"type":"number"},"defensive_snap_count":{"description":"Number of defensive snaps played","example":5,"type":"integer"},"endzone_fumble_recovery_touchdowns":{"description":"Touchdowns from end zone fumble recoveries","example":5,"type":"integer"},"rushing_touchdowns_allowed":{"description":"Rushing touchdowns allowed by defense","example":5,"type":"integer"},"return_tds":{"description":"Number of return touchdowns","example":2,"type":"integer"},"kickoff_endzone":{"description":"Kickoffs reaching the end zone","example":5,"type":"integer"},"snap_count":{"description":"Number of offensive snaps played","example":5,"type":"integer"},"def_sack_yards":{"description":"Defensive sack yards","example":250,"type":"integer"},"batted_pass":{"description":"Number of passes batted down by defense","example":5,"type":"integer"},"route_type":{"description":"Type of route run by receiver","example":"example_value","type":"string"},"receiving_40_plus":{"description":"Receptions of 40+ yards","example":5,"type":"integer"},"passing_tds_40_plus_yards":{"description":"Passing touchdowns of 40+ yards","example":250,"type":"integer"},"fumbles_out_of_bounds":{"description":"Number of fumbles that went out of bounds","example":5,"type":"integer"},"deep_pass_receptions":{"description":"Deep pass receptions","example":5,"type":"integer"},"fumbles_lost":{"description":"Number of fumbles lost to opponent","example":5,"type":"integer"},"fumble_long":{"description":"Longest fumble return","example":5,"type":"integer"},"punt_fair_catch":{"description":"Number of punt fair catches","example":5,"type":"integer"},"is_successful_play":{"description":"Whether the play was successful","example":"example_value","type":"boolean"},"total":{"description":"Over/under total for betting","example":12.3,"type":"number"},"applied_pressure":{"description":"Applied pressure","example":"example_value","type":"boolean"},"rushing_tds":{"description":"Number of rushing touchdowns","example":2,"type":"integer"},"passing_air_yards":{"description":"Total air yards on pass attempts","example":250,"type":"integer"},"punt_average":{"description":"Average yards per punt","example":12.3,"type":"number"},"field_goals_blocked":{"description":"Number of field goals blocked","example":5,"type":"integer"},"created_reception":{"description":"Whether the receiver created the reception through an exceptional play","example":"example_value","type":"boolean"},"shotgun":{"description":"Plays run from shotgun formation","example":5,"type":"integer"},"kickoff_attempts":{"description":"Total kickoff attempts","example":15,"type":"integer"},"yards_after_contact":{"description":"Yards gained after contact","example":250,"type":"integer"},"kickoff_onside_attempts":{"description":"Onside kick attempts","example":15,"type":"integer"},"receiving_tds_40_plus_yards":{"description":"Receiving touchdowns of 40+ yards","example":250,"type":"integer"},"catchable_ball":{"description":"Whether the targeted receiver's pass was catchable","example":"example_value","type":"boolean"},"passing_longest_touchdown":{"description":"Longest touchdown pass","example":5,"type":"integer"},"separation_yards":{"description":"Separation distance in yards from defender","example":12.3,"type":"number"},"spread":{"description":"Point spread for betting","example":12.3,"type":"number"},"draftkings_ownership":{"description":"DraftKings ownership percentage","example":12.3,"type":"number"},"conversion_receiving_successes":{"description":"Two-point conversion receiving successes","example":5,"type":"integer"},"extra_points_made":{"description":"Number of extra points made","example":5,"type":"integer"},"blocked_kick_return_yards":{"description":"Yards gained on blocked kick returns","example":250,"type":"integer"},"passing_completions_allowed":{"description":"Passing completions allowed by defense","example":10,"type":"integer"},"interception_return_touchdowns":{"description":"Touchdowns scored on interception returns","example":5,"type":"integer"},"successful_rush_attempts":{"description":"Number of successful rushing attempts","example":15,"type":"integer"},"passing_20_plus":{"description":"Passing completions of 20+ yards","example":5,"type":"integer"},"broken_tackles":{"description":"Number of broken tackles","example":5,"type":"integer"},"conversion_receiving_attempts":{"description":"Two-point conversion receiving attempts","example":15,"type":"integer"},"deep_receptions":{"description":"Deep receptions (20+ yards)","example":5,"type":"integer"},"misc_assisted_tackles":{"description":"Assisted tackles made on change-of-possession plays (interception and fumble returns)","example":5,"type":"integer"},"rushing_yards_100_plus":{"description":"Number of 100+ yard rushing games","example":250,"type":"integer"},"draftkings_fantasy_points":{"description":"DraftKings fantasy points","example":18.5,"type":"number"},"challenges_used":{"description":"Number of challenges used","example":5,"type":"integer"},"blitzes_faced":{"description":"Number of blitzes faced","example":5,"type":"integer"},"punt_attempts":{"description":"Number of punt attempts","example":15,"type":"integer"},"penalty_first_downs":{"description":"First downs gained via opponent penalties","example":5,"type":"integer"},"declared_inactive":{"description":"Player was on the officially declared inactive list for this game","example":"example_value","type":"boolean"},"kneels":{"description":"Number of quarterback kneels","example":5,"type":"integer"},"fantasy_points_half_ppr":{"description":"Fantasy points in half-PPR scoring","example":18.5,"type":"number"}},"type":"object"},"team_id":{"description":"Team the player was representing during this play","format":"uuid","type":"string"}},"type":"object"},"seconds_remaining":{"description":"Seconds remaining in period when play started (inherited from Play)","type":"integer"},"source":{"description":"Data provider source for this player-play statistic","type":"string"},"team_id":{"description":"Team this play stat belongs to","type":"string"},"tenant_id":{"description":"Client tenant accessing this player statistic data","format":"uuid","type":"string"},"time_on_clock":{"description":"Game clock time when play occurred (inherited from Play)","type":"string"},"updated_at":{"description":"Most recent update to this player's play involvement data","format":"date-time","type":"string"}},"required":["common_model_id","player_id","play_number","event_id"],"title":"PlayStat","type":"object"}}},"description":"Play Stats Response"},"401":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"invalid_api_key","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/invalid_api_key","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"not_found","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/not_found","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Not Found"}},"summary":"List Play Stats","tags":["Stats & Data","Stats & Data","Reference"]}},"/api/v1/prediction-markets/matches":{"get":{"callbacks":{},"description":"Returns only reviewed groups with at least two tenant-visible venues. Exact family, subject, actual scope, period/session/round/season, line, outcome, selection semantics, and resolution rules must agree; every native constituent remains intact.","operationId":"ApiRestWeb.PredictionMarketsController.matches","parameters":[{"description":"","in":"query","name":"cursor","required":false,"schema":{"type":"string"}},{"description":"","in":"query","name":"limit","required":false,"schema":{"default":25,"maximum":50,"minimum":1,"type":"integer"}},{"description":"","in":"query","name":"venue","required":false,"schema":{"type":"string"}},{"description":"","in":"query","name":"league","required":false,"schema":{"type":"string"}},{"description":"","in":"query","name":"actual_scope","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"cursor":{"nullable":true,"type":"string"},"data":{"items":{"description":"Human-reviewed cross-venue equivalence with exact canonical event, family, subject, scope, outcome/line, selection, and resolution-rule agreement.","properties":{"actual_scope":{"enum":["event","race","session","tournament","round","season"],"type":"string"},"canonical_event_id":{"format":"uuid","nullable":true,"type":"string"},"canonical_family_id":{"format":"uuid","type":"string"},"canonical_league_id":{"format":"uuid","nullable":true,"type":"string"},"canonical_subject_id":{"format":"uuid","type":"string"},"canonical_subject_type":{"type":"string"},"constituents":{"items":{"additionalProperties":true,"description":"Immutable venue-native snapshot retaining title, rules, scope, selections, native execution identifiers, and sanitized provenance.","properties":{"line":{"format":"double","nullable":true,"type":"number"},"native_selections":{"items":{"additionalProperties":true,"properties":{"canonical_subject":{"additionalProperties":false,"properties":{"id":{"format":"uuid","nullable":true,"type":"string"},"reasons":{"items":{"type":"string"},"type":"array"},"type":{"enum":["player"],"nullable":true,"type":"string"}},"required":["type","id","reasons"],"type":"object"},"execution_identifiers":{"additionalProperties":true,"type":"object"},"execution_readiness":{"enum":["ready","blocked","unknown"],"type":"string"},"execution_readiness_reasons":{"items":{"type":"string"},"type":"array"},"label":{"type":"string"},"lifecycle":{"type":"string"},"line":{"format":"double","nullable":true,"type":"number"},"native_selection_id":{"type":"string"},"native_subject":{"additionalProperties":true,"nullable":true,"type":"object"},"outcome_meaning":{"type":"string"},"quote_readiness":{"enum":["ready","blocked","unknown"],"type":"string"},"quote_readiness_reasons":{"items":{"type":"string"},"type":"array"}},"required":["native_selection_id","execution_identifiers","native_subject","canonical_subject","quote_readiness","quote_readiness_reasons","execution_readiness","execution_readiness_reasons"],"type":"object"},"type":"array"},"snapshot_version":{"nullable":true,"type":"integer"}},"type":"object"},"minItems":2,"type":"array"},"id":{"format":"uuid","type":"string"},"line":{"format":"double","nullable":true,"type":"number"},"outcome_meaning":{"type":"string"},"period":{"nullable":true,"type":"string"},"resolution_terms":{"additionalProperties":true,"type":"object"},"review_status":{"enum":["reviewed"],"type":"string"},"reviewed_at":{"format":"date_time","type":"string"},"round":{"nullable":true,"type":"string"},"scope_key":{"nullable":true,"type":"string"},"season":{"nullable":true,"type":"string"},"selection_semantics":{"items":{"additionalProperties":false,"properties":{"line":{"format":"double","nullable":true,"type":"number"},"outcome_meaning":{"type":"string"}},"type":"object"},"type":"array"},"session":{"nullable":true,"type":"string"}},"required":["id","review_status","canonical_subject_type","canonical_subject_id","canonical_family_id","actual_scope","outcome_meaning","resolution_terms","selection_semantics","reviewed_at","constituents"],"title":"PredictionNativeMatch","type":"object"},"type":"array"},"page_size":{"maximum":50,"minimum":1,"type":"integer"}},"required":["data","cursor","page_size"],"title":"PredictionNativeMatchPage","type":"object"}}},"description":"Reviewed native match page"},"400":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"bad_request","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/bad_request","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"invalid_api_key","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/invalid_api_key","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"forbidden","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/forbidden","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Forbidden"},"503":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"service_unavailable","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/service_unavailable","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Service Unavailable"}},"summary":"List reviewed cross-venue prediction equivalence","tags":["Prediction Markets"]}},"/api/v1/data-dictionary/stat-types":{"get":{"callbacks":{},"description":"Returns all stat type definitions across all supported sports.\n\nEach stat type includes:\n- **canonical_name**: The standardized field name used in API responses\n- **description**: Human-readable description of the stat\n- **data_type**: The data type (integer, float, string, boolean)\n- **sport**: The sport this stat applies to\n- **category**: Classification category (e.g., passing, rushing, scoring)\n- **provider_aliases**: Provider-specific field names that map to this stat\n","operationId":"ApiRestWeb.DataDictionaryController.stat_types","parameters":[{"description":"Filter by sport (e.g., football, basketball, baseball, ice_hockey, golf, soccer)","example":"football","in":"query","name":"sport","required":false,"schema":{"type":"string"}},{"description":"Filter by category (e.g., passing, rushing, scoring)","example":"passing","in":"query","name":"category","required":false,"schema":{"type":"string"}},{"description":"Filter by provider key","example":"provider_key","in":"query","name":"provider","required":false,"schema":{"type":"string"}},{"description":"Filter observed availability by league common_model_id","in":"query","name":"league_id","required":false,"schema":{"type":"string"}},{"description":"Filter observed availability by normalized source","example":"provider.soccer.epl","in":"query","name":"source","required":false,"schema":{"type":"string"}},{"description":"Filter observed availability by route","example":"event_stats","in":"query","name":"route","required":false,"schema":{"type":"string"}},{"description":"Filter observed availability by entity scope","example":"player","in":"query","name":"entity_scope","required":false,"schema":{"type":"string"}},{"description":"Filter observed availability by data kind: actual, projection, or all","example":"all","in":"query","name":"data_kind","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"items":{"properties":{"availability":{"description":"Observed availability from silver data","items":{"type":"object"},"type":"array"},"canonical_name":{"description":"Standardized field name","example":"passing_yards","type":"string"},"category":{"description":"Stat category","example":"passing","type":"string"},"data_type":{"description":"Data type","enum":["integer","float","string","boolean"],"example":"integer","type":"string"},"description":{"description":"Human-readable description","example":"Total passing yards","type":"string"},"provider_aliases":{"additionalProperties":{"items":{"type":"string"},"type":"array"},"description":"Provider-specific aliases for this stat","example":{"provider_a":["pass_yds","passing_yards"],"provider_b":["py","passing_yards"]},"type":"object"},"sport":{"description":"Sport this stat applies to","example":"football","type":"string"}},"type":"object"},"type":"array"},"meta":{"properties":{"availability_filters":{"description":"Availability filters applied to this response","type":"object"},"categories":{"description":"List of stat categories","items":{"type":"string"},"type":"array"},"providers":{"description":"List of providers with mappings","items":{"type":"string"},"type":"array"},"routes_supported":{"description":"Observed route-level support for the availability filters","type":"object"},"sports":{"description":"List of supported sports","items":{"type":"string"},"type":"array"},"total_count":{"description":"Total number of stat types","type":"integer"}},"type":"object"}},"type":"object"}}},"description":"Stat Types Response"},"401":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"invalid_api_key","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/invalid_api_key","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Unauthorized"}},"summary":"List Stat Types","tags":["SportsStack"]}},"/api/v1/webhooks/test":{"post":{"callbacks":{},"description":"Sends a test payload directly to a tenant's active webhook destination,\nbypassing the batcher and RabbitMQ. Use this to verify that the HTTP\ndelivery path works independently of the pipeline.\n\nIf `destination_id` is omitted, the first active webhook destination for\nthe tenant is used.\n","operationId":"ApiRestWeb.WebhookTestController.create","parameters":[{"description":"Specific webhook destination ID to test. If omitted, uses the first active webhook destination.","in":"query","name":"destination_id","required":false,"schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"destination_id":{"format":"uuid","type":"string"},"destination_name":{"type":"string"},"message":{"type":"string"},"status":{"example":"delivered","type":"string"}},"type":"object"}}},"description":"Webhook delivered successfully"},"404":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"}},"type":"object"}}},"description":"No active webhook destinations"},"422":{"content":{"application/json":{"schema":{"properties":{"destination_id":{"format":"uuid","type":"string"},"message":{"type":"string"},"reason":{"type":"string"},"status":{"example":"client_error","type":"string"}},"type":"object"}}},"description":"Webhook endpoint returned a client error"},"502":{"content":{"application/json":{"schema":{"properties":{"destination_id":{"format":"uuid","type":"string"},"message":{"type":"string"},"reason":{"type":"string"},"status":{"example":"failed","type":"string"}},"type":"object"}}},"description":"Webhook endpoint returned a server error or is unreachable"}},"summary":"Test Webhook Delivery","tags":["Webhooks"]}},"/api/v1/self-service/mappings":{"post":{"callbacks":{},"operationId":"ApiRestWeb.SelfServiceController.create_mapping","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"example":{"common_model_id":"550e8400-e29b-41d4-a716-446655440000","entity_type":"player","evidence":{"player_name":"Breanna Stewart"},"source":"cbs.basketball.nba","source_id":"cbs-breanna-stewart"},"properties":{"common_model_id":{"format":"uuid","type":"string"},"entity_type":{"enum":["player","team","event"],"type":"string"},"evidence":{"type":"object"},"source":{"example":"cbs.basketball.nba","type":"string"},"source_id":{"example":"cbs-breanna-stewart","type":"string"}},"required":["source","entity_type","source_id","common_model_id"],"type":"object"}}},"description":"Direct mapping request","required":false},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"properties":{"action":{"nullable":true,"type":"string"},"common_model_id":{"format":"uuid","nullable":true,"type":"string"},"entity":{"type":"object"},"entity_type":{"enum":["player","team","event"],"type":"string"},"ignored_pending":{"type":"boolean"},"mapping_id":{"format":"uuid","type":"string"},"mapping_state":{"enum":["mapped","pending","ignored"],"type":"string"},"match_status":{"nullable":true,"type":"string"},"pending_mapping_id":{"format":"uuid","nullable":true,"type":"string"},"source":{"example":"cbs.basketball.nba","type":"string"},"source_id":{"example":"cbs-breanna-stewart","type":"string"}},"type":"object"}},"type":"object"}}},"description":"Self-service mapping response"},"400":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"bad_request","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/bad_request","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"invalid_api_key","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/invalid_api_key","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"forbidden","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/forbidden","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"not_found","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/not_found","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Not Found"},"409":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"conflict","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/conflict","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Conflict"},"422":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"validation_error","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/validation_error","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Validation Error"},"503":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"service_unavailable","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/service_unavailable","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Service Unavailable"}},"summary":"Create or resolve an allowlisted provider mapping","tags":["Self-Service"]}},"/api/v1/seasons/{id}":{"get":{"callbacks":{},"operationId":"ApiRestWeb.SeasonController.show","parameters":[{"description":"Season ID (UUID)","example":"01c7133f-2999-4803-9872-8c2ab1ba63ac","in":"path","name":"id","required":true,"schema":{"type":"string"}},{"description":"Include source mappings from the specific integration (i.e. a provider key) will return a source_mappings object with the mappings for the respective objects","in":"query","name":"return_source_id_format","required":false,"schema":{"type":"string"}},{"description":"When true, add source_mappings_by_source keyed by full normalized source (for example, provider.football.nfl).","in":"query","name":"include_source_mappings_by_source","required":false,"schema":{"default":false,"type":"boolean"}},{"description":"Optional provider-family filter for source_mappings_by_source (for example, a provider key).","in":"query","name":"source_mapping_provider","required":false,"schema":{"type":"string"}},{"description":"Optional full-source filter for source_mappings_by_source in provider.sport.league format.","in":"query","name":"source_mapping_source","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"description":"A season represents a specific time period of competition within a league.\n\nSeasons organize events into distinct time-bound periods with specific start and end dates.\nMost leagues have multiple seasons per year, including preseason, regular season, and postseason.\nSeasons are crucial for organizing statistics, determining standings, and structuring competition.\n\n## Season Types\n- **PRE**: Preseason - exhibition games before the official season starts\n- **REG**: Regular Season - standard competitive games counting toward standings\n- **PST**: Postseason/Playoffs - championship tournament after regular season\n\n## Key Characteristics\n- **Time-Bounded**: Each season has defined start and end dates\n- **League-Specific**: Seasons belong to a specific league\n- **Type-Categorized**: Different rules/importance based on season type\n\n## Examples\n- **NFL 2024 Regular Season**: September 2024 - January 2025\n- **NBA 2023-24 Playoffs**: April 2024 - June 2024\n- **MLB 2024 Preseason**: February 2024 - March 2024\n\n## Key Relationships\n- **League**: Each season belongs to exactly one league\n- **Events**: All games/matches played during the season\n- **Statistics**: Season-scoped performance data aggregated across events\n","example":{"abbreviation":"2024-REG","common_model_id":"a1b2c3d4-5678-90ab-cdef-123456789abc","end_date":"2025-01-05","league_id":"8019d4db-7854-4542-b4af-7265d4b57105","metadata":{"sportradar":{"season_code":"REG","status":"closed"}},"name":"2024 NFL Regular Season","season_type":"REG","season_year":2024,"start_date":"2024-09-05","status":"closed"},"properties":{"abbreviation":{"description":"Short form or code for the season","type":"string"},"common_model_id":{"description":"Unique season identifier in our unified system","type":"string"},"end_date":{"description":"Season end date in ISO 8601 format","example":"2025-01-05","format":"date","type":"string"},"image_url":{"description":"Season logo or branding image URL","type":"string"},"league_id":{"description":"Reference to the league this season belongs to","type":"string"},"metadata":{"description":"Provider-specific metadata and codes","example":{"sportradar":{"name":"2014 Season","season_code":"REG","status":"closed"}},"properties":{"sportradar":{"description":"Provider-specific season metadata","properties":{"name":{"description":"Original provider season name (may be generic like '2014 Season')","example":"2014 Season","type":"string"},"season_code":{"description":"Original provider season type code (REG, PST, AST, etc.)","example":"REG","type":"string"},"status":{"description":"Original provider status value","example":"closed","type":"string"}},"type":"object"}},"type":"object"},"name":{"description":"Human-readable season name (e.g., '2024 Regular Season', '2023-24 Playoffs')","type":"string"},"season_type":{"description":"Type of season: PRE (preseason), REG (regular), PST (postseason)","enum":["PRE","REG","PST","IST","PIT","SC","EX","CC","CT","ALL_STAR"],"example":"REG","type":"string"},"season_year":{"description":"Primary year of the season (e.g., 2024 for 2024-25 NBA season)","example":2024,"type":"integer"},"start_date":{"description":"Season start date in ISO 8601 format","example":"2024-09-05","format":"date","type":"string"},"status":{"description":"Season status (normalized across providers)","enum":["scheduled","in_progress","closed"],"example":"closed","type":"string"}},"required":["name","season_year"],"title":"Season","type":"object"}}},"description":"Season Response"},"400":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"bad_request","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/bad_request","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Bad Request"}},"summary":"Show Season","tags":["Reference"]}},"/api/v1/players/{id}/play-stats":{"get":{"callbacks":{},"operationId":"ApiRestWeb.PlayerController.index_related_play_stats","parameters":[{"description":"Player ID (UUID)","example":"01c7133f-2999-4803-9872-8c2ab1ba63ac","in":"path","name":"id","required":true,"schema":{"type":"string"}},{"description":"Filter by event ID","in":"query","name":"event_id","required":false,"schema":{"type":"string"}},{"description":"Page number for page/per_page pagination. Do not combine with limit/offset.","in":"query","name":"page","required":false,"schema":{"default":1,"minimum":1,"type":"integer"}},{"description":"Number of items per page (max 1000). Do not combine with limit/offset.","in":"query","name":"per_page","required":false,"schema":{"default":250,"maximum":1000,"minimum":1,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"description":"Individual player statistics and involvement details for a specific play within an event.\n\nPlayStat records capture how individual players contributed to or were affected by\nspecific plays. This granular data enables advanced player evaluation, situational\nperformance analysis, and detailed coaching insights beyond traditional box scores.\n\n## Player-Play Relationship\nEach PlayStat links a player to a specific play, recording:\n- **Role**: How the player was involved (quarterback, receiver, defender, etc.)\n- **Performance**: Measurable outcomes (yards gained, tackles made, shots taken)\n- **Context**: Situational factors affecting the player's involvement\n\n## Use Cases\n- **Advanced Analytics**: Context-aware player performance evaluation\n- **Coaching Analysis**: Individual performance in specific situations\n- **Fantasy Sports**: Granular scoring and projection models\n- **Player Development**: Detailed performance tracking and improvement areas\n\n## Data Inheritance\nPlayStat inherits contextual information from the parent Play record while adding\nplayer-specific details about involvement and statistical outcomes.\n","example":{"common_model_id":"123e4567-e89b-12d3-a456-426614174000","event_id":"123e4567-e89b-12d3-a456-426614174003","play_number":1,"player_id":"123e4567-e89b-12d3-a456-426614174001","player_info":{"role":"quarterback","statistics":{"completion":true,"passing_touchdowns":1,"passing_yards":20}}},"properties":{"common_model_id":{"description":"Unique identifier for this player-play statistical record","type":"string"},"defense_id":{"description":"Team or player in defensive role during this play","type":"string"},"description":{"description":"Human-readable description of what happened (inherited from Play)","type":"string"},"event_id":{"description":"Parent event/game containing this play","type":"string"},"game_context":{"additionalProperties":true,"description":"Situational game state when play occurred (inherited from parent Play)","type":"object"},"inserted_at":{"description":"When this player-play statistic record was created","format":"date-time","type":"string"},"league_id":{"description":"League context for sport-specific statistical interpretation","format":"uuid","type":"string"},"minutes_remaining":{"description":"Minutes remaining in period when play started (inherited from Play)","type":"integer"},"offense_id":{"description":"Team or player with possession during this play","type":"string"},"period":{"description":"Game period when this play occurred (inherited from Play)","type":"integer"},"play_details":{"additionalProperties":true,"description":"General play outcome details (inherited from parent Play record)","type":"object"},"play_number":{"description":"Play number within the event, scoped to `source` — NOT globally unique per event. Multiple feeds (from different providers) can each number their own plays starting from 1, so the same play_number on two different sources refers to two different plays. Always join on (event_id, source, play_number), never (event_id, play_number) alone.","type":"integer"},"play_type":{"description":"Classification of play action (inherited from parent Play)","type":"string"},"player_id":{"description":"Player who participated in or was affected by this play","type":"string"},"player_info":{"additionalProperties":true,"description":"Player-specific role, involvement, and statistical outcomes for this play","properties":{"external_player_id":{"description":"Provider-specific player identifier","type":"string"},"role":{"description":"Player's role(s) in this specific play (e.g., 'quarterback', 'receiver', 'tackler')","items":{"type":"string"},"type":"array"},"statistics":{"additionalProperties":false,"description":"Play-level player statistics using canonical field names from our stat registry.\n\n## Play-Specific Context\nThese statistics represent individual player performance within a single play. Unlike\nevent-scoped or season-scoped stats, these capture momentary contributions to specific\ngame actions.\n\n## Standardized Stat Names\nAll statistics use our unified canonical naming system to ensure consistency across data providers.\nCommon play-level stats include:\n- **Passing**: passing_yards, passing_touchdowns, completion, interception\n- **Rushing**: rushing_yards, rushing_touchdowns, fumble\n- **Receiving**: receiving_yards, receiving_touchdowns, reception, target\n- **Defense**: tackle, assist, sack, pass_defended, interception\n- **Kicking**: field_goal_made, field_goal_yards, extra_point_made\n\n## Provider Translation\nRaw provider data is automatically translated to canonical names:\n- **Provider A**: \"py\" → \"passing_yards\", \"car\" → \"rushing_attempts\"\n- **Provider B**: \"pass_yds\" → \"passing_yards\", \"rush_att\" → \"rushing_attempts\"\n\nNote: Not all stats are applicable to every play. Only relevant stats for the player's\nrole in that specific play will be present.\n","example":{"completion":true,"passing_yards":15,"target_depth":12},"properties":{"def_interception_touchdowns":{"description":"Defensive interception touchdowns","example":5,"type":"integer"},"throwaways":{"description":"Number of throw away passes","example":5,"type":"integer"},"fanduel_fantasy_points_ceiling":{"description":"FanDuel fantasy points ceiling","example":18.5,"type":"number"},"on_target_throws":{"description":"Number of on-target throws","example":5,"type":"integer"},"interception_returns":{"description":"Number of interception returns","example":5,"type":"integer"},"kickoff_return_touchdowns":{"description":"Kickoff return touchdowns","example":5,"type":"integer"},"extra_points_attempted":{"description":"Number of extra point attempts","example":5,"type":"integer"},"redzone_rushing_attempts":{"description":"Rush attempts in the red zone","example":15,"type":"integer"},"is_motion":{"description":"Whether player was in motion during play","example":"example_value","type":"boolean"},"passing_attempts":{"description":"Total number of pass attempts","example":15,"type":"integer"},"punt_long":{"description":"Longest punt","example":5,"type":"integer"},"fumble_return_yards":{"description":"Yards gained on fumble returns","example":250,"type":"integer"},"first_read_receptions":{"description":"Number of first read receptions","example":5,"type":"integer"},"red_zone_pass_attempts":{"description":"Pass attempts in red zone","example":15,"type":"integer"},"points":{"description":"Total points scored by team","example":5,"type":"integer"},"depth_of_target":{"description":"Average depth of target","example":12.3,"type":"number"},"defensive_interceptions":{"description":"Defensive interceptions","example":5,"type":"integer"},"receiving_two_point_conversions":{"description":"Receiving two-point conversions","example":5,"type":"integer"},"field_goal_yards":{"description":"Yards gained on field goals","example":250,"type":"integer"},"conversion_defense_successes":{"description":"Two-point conversion defensive successes","example":5,"type":"integer"},"blocked_kick_return_touchdowns":{"description":"Touchdowns scored on blocked kick returns","example":5,"type":"integer"},"fanduel_ownership":{"description":"FanDuel ownership percentage","example":12.3,"type":"number"},"draftkings_fantasy_points_ceiling":{"description":"DraftKings fantasy points ceiling","example":18.5,"type":"number"},"first_read_targets":{"description":"Number of first read targets","example":5,"type":"integer"},"special_teams_snap_count":{"description":"Number of special teams snaps played","example":5,"type":"integer"},"out_of_pocket_reason":{"description":"Reason quarterback left the pocket","example":"example_value","type":"string"},"goal_line_touches":{"description":"Number of goal line touches","example":5,"type":"integer"},"receiving_yards_100_plus":{"description":"Number of 100+ yard receiving games","example":250,"type":"integer"},"total_pocket_time":{"description":"Total time spent in pocket","example":12.3,"type":"number"},"interception_return_longest_touchdown":{"description":"Longest interception return for touchdown","example":5,"type":"integer"},"field_goals_attempts":{"description":"Number of field goal attempts","example":15,"type":"integer"},"safeties":{"description":"Number of safeties","example":5,"type":"integer"},"pass_first_downs":{"description":"First downs gained via passing","example":5,"type":"integer"},"red_zone_passing_completions":{"description":"Passing completions in red zone","example":10,"type":"integer"},"net_punt_yards":{"description":"Net punt yards","example":250,"type":"integer"},"kneel_downs":{"description":"Number of kneel downs","example":5,"type":"integer"},"cushion_yards":{"description":"Cushion yards","example":250,"type":"integer"},"punt_yards":{"description":"Total punt yards","example":250,"type":"integer"},"challenges_remaining":{"description":"Number of challenges remaining","example":5,"type":"integer"},"passing_gross_yards":{"description":"Gross passing yards before sacks","example":250,"type":"integer"},"avg_pocket_time":{"description":"Average time in pocket per pass attempt","example":12.3,"type":"number"},"defended_passes":{"description":"Passes defended by defenders","example":5,"type":"integer"},"dropped_pass":{"description":"Number of dropped passes","example":5,"type":"integer"},"rushing_direction":{"description":"Direction of rushing attempt","example":"example_value","type":"string"},"sacks_taken":{"description":"Number of sacks taken by quarterback","example":5,"type":"integer"},"rec_long":{"description":"Longest reception","example":5,"type":"integer"},"yards_after_catch":{"description":"Yards gained after catch","example":250,"type":"integer"},"activated":{"description":"Player was activated to the game-day roster (shipped as 0/1)","example":5,"type":"integer"},"passing_yards":{"description":"Total passing yards thrown by the player/team","example":250,"type":"integer"},"touchdowns":{"description":"Total touchdowns scored","example":5,"type":"integer"},"rushing_fumbles":{"description":"Number of fumbles while rushing","example":5,"type":"integer"},"pre_snap_motion":{"description":"Player pre-snap motion type","example":"example_value","type":"boolean"},"nfl_fantasy_points":{"description":"NFL fantasy points","example":18.5,"type":"number"},"assisted_tackles":{"description":"Number of assisted tackles","example":5,"type":"integer"},"passing_completions":{"description":"Number of completed passes","example":10,"type":"integer"},"sacks":{"description":"Number of sacks (as QB or defensive player)","example":12.3,"type":"number"},"passing_40_plus":{"description":"Passing completions of 40+ yards","example":5,"type":"integer"},"missed_tackle_location":{"description":"Location of missed tackle","example":"example_value","type":"string"},"rushing_longest_touchdown":{"description":"Longest touchdown rush","example":5,"type":"integer"},"penalty_yards":{"description":"Penalty yards assessed","example":250,"type":"integer"},"rushing_tds_40_plus_yards":{"description":"Rushing touchdowns of 40+ yards","example":250,"type":"integer"},"penalties":{"description":"Number of penalties committed","example":5,"type":"integer"},"rushing_yards":{"description":"Total rushing yards gained","example":250,"type":"integer"},"punt_return_yards":{"description":"Punt return yards","example":250,"type":"integer"},"blocked_kicks":{"description":"Number of blocked kicks","example":5,"type":"integer"},"position":{"description":"Player position","example":"example_value","type":"string"},"sack_yards_lost":{"description":"Yards lost on sacks","example":250,"type":"integer"},"kickoff_touchbacks":{"description":"Number of kickoff touchbacks","example":5,"type":"integer"},"def_interception_yards":{"description":"Defensive interception return yards","example":250,"type":"integer"},"rush_long":{"description":"Longest rush","example":5,"type":"integer"},"played":{"description":"Whether the player appeared in the game","example":"example_value","type":"boolean"},"two_point_conversions":{"description":"Number of two-point conversions","example":5,"type":"integer"},"conversion_defense_attempts":{"description":"Two-point conversion defensive attempts","example":15,"type":"integer"},"tackles":{"description":"Total tackles (solo + assisted)","example":5,"type":"integer"},"return_yards":{"description":"Total return yards (kick/punt combined)","example":250,"type":"integer"},"kickoff_return_yards":{"description":"Total yards on kickoff returns (opponent)","example":250,"type":"integer"},"games_played":{"description":"Number of games played in","example":5,"type":"integer"},"receiving_20_plus":{"description":"Receptions of 20+ yards","example":5,"type":"integer"},"field_goals_missed":{"description":"Field goals missed","example":5,"type":"integer"},"draftkings_rating":{"description":"DraftKings player rating","example":98.7,"type":"number"},"pre_snap_alignment":{"description":"Player pre-snap alignment","example":"example_value","type":"string"},"kickoff_inside_20":{"description":"Kickoffs downed inside the 20 yard line","example":5,"type":"integer"},"batted_passes":{"description":"Passes batted down at line of scrimmage","example":5,"type":"integer"},"rushing_avg_yards":{"description":"Average yards per carry","example":12.3,"type":"number"},"interception_long":{"description":"Longest interception return","example":5,"type":"integer"},"special_teams_assisted_tackles":{"description":"Assisted tackles made on special-teams plays (kick and punt coverage)","example":5,"type":"integer"},"time_to_throw":{"description":"Time from snap to ball release in seconds","example":12.3,"type":"number"},"player_id":{"description":"Player identifier","example":"example_value","type":"string"},"kickoff_out_of_bounds":{"description":"Kickoffs out of bounds","example":5,"type":"integer"},"pass_long":{"description":"Longest pass completion","example":5,"type":"integer"},"fanduel_fantasy_points":{"description":"FanDuel fantasy points","example":18.5,"type":"number"},"def_tackles_assisted":{"description":"Defensive assisted tackles","example":5,"type":"integer"},"punts_inside_20":{"description":"Number of punts inside the 20-yard line","example":5,"type":"integer"},"solo_tackles":{"description":"Number of solo tackles","example":5,"type":"integer"},"redzone_passing_attempts":{"description":"Pass attempts in the red zone","example":15,"type":"integer"},"poor_throws":{"description":"Number of poor throws","example":5,"type":"integer"},"opponent_fumble_recovery_touchdowns":{"description":"Touchdowns on opponent fumble recoveries","example":5,"type":"integer"},"opponent_fumble_recoveries":{"description":"Opponent fumble recoveries","example":5,"type":"integer"},"deep_pass_attempts":{"description":"Deep pass attempts","example":15,"type":"integer"},"gross_kickoff_yards":{"description":"Yards gained on gross kickoffs","example":250,"type":"integer"},"qb_knockdowns":{"description":"Times quarterback was knocked down","example":5,"type":"integer"},"passing_attempts_allowed":{"description":"Passing attempts allowed by defense","example":15,"type":"integer"},"misc_solo_tackles":{"description":"Solo tackles made on change-of-possession plays (interception and fumble returns)","example":5,"type":"integer"},"total_tackles":{"description":"Total tackles across every phase of the game -- scrimmage defense plus special teams plus change-of-possession (misc) plays. This is the quantity NFL tackle props are priced and graded on.","example":5,"type":"integer"},"deep_targets":{"description":"Number of deep targets (20+ yards)","example":5,"type":"integer"},"fumbles":{"description":"Total number of fumbles","example":5,"type":"integer"},"fourth_down_stops":{"description":"Fourth down stops recorded by defense","example":5,"type":"integer"},"rushing_two_point_conversions":{"description":"Rushing two-point conversions","example":5,"type":"integer"},"missed_or_broken_tackles":{"description":"Number of missed or broken tackles","example":5,"type":"integer"},"receiving_yards":{"description":"Total receiving yards gained","example":250,"type":"integer"},"fanduel_rating":{"description":"FanDuel player rating","example":98.7,"type":"number"},"separation_type":{"description":"Type of separation","example":"example_value","type":"string"},"pressure_type":{"description":"Pressure type","example":"example_value","type":"string"},"timeouts_used":{"description":"Number of timeouts used","example":5,"type":"integer"},"returns":{"description":"Number of return attempts (kick/punt)","example":5,"type":"integer"},"conversion_passing_attempts":{"description":"Two-point conversion passing attempts","example":15,"type":"integer"},"net_kickoff_yards":{"description":"Yards gained on net kickoffs","example":250,"type":"integer"},"receiving_targets":{"description":"Number of times targeted for a pass","example":5,"type":"integer"},"extra_points_blocked":{"description":"Number of extra points blocked","example":5,"type":"integer"},"receptions":{"description":"Number of receptions/catches","example":5,"type":"integer"},"snap_counts_confirmed":{"description":"Provider confirms the snap counts for this game are final","example":"example_value","type":"boolean"},"motion_at_snap":{"description":"Player motion status at snap","example":"example_value","type":"boolean"},"receiving_fumbles":{"description":"Number of fumbles while receiving","example":5,"type":"integer"},"explosive_runs":{"description":"Number of explosive rushing attempts (10+ yards)","example":5,"type":"integer"},"rushing_40_plus":{"description":"Rushing attempts of 40+ yards","example":5,"type":"integer"},"interceptions":{"description":"Number of interceptions thrown","example":5,"type":"integer"},"quarterback_hits":{"description":"Number of quarterback hits","example":5,"type":"integer"},"interception_return_yards":{"description":"Yards gained on interception returns","example":250,"type":"integer"},"yahoo_fantasy_points_ceiling":{"description":"Yahoo fantasy points ceiling","example":18.5,"type":"number"},"primary_coverage":{"description":"Primary coverage","example":"example_value","type":"boolean"},"secondary_coverage":{"description":"Secondary coverage","example":"example_value","type":"boolean"},"fumbles_recovered":{"description":"Number of fumbles recovered","example":5,"type":"integer"},"rushing_20_plus":{"description":"Rushing attempts of 20+ yards","example":5,"type":"integer"},"throw_away":{"description":"Whether the pass was intentionally thrown away","example":"example_value","type":"boolean"},"field_goal_percentage":{"description":"Field goal percentage (made/attempted)","example":12.3,"type":"number"},"receiving_tds":{"description":"Number of receiving touchdowns","example":2,"type":"integer"},"passes_defended":{"description":"Number of passes defended","example":5,"type":"integer"},"fumble_return_touchdowns":{"description":"Touchdowns scored on fumble returns","example":5,"type":"integer"},"completion_percentage":{"description":"Pass completion percentage","example":12.3,"type":"number"},"interception_worthy_throws":{"description":"Interception worthy throws","example":5,"type":"integer"},"red_zone_targets":{"description":"Number of targets in the red zone","example":5,"type":"integer"},"allowed_pressure":{"description":"Allowed pressure","example":"example_value","type":"boolean"},"kickoff_yards":{"description":"Total kickoff yards","example":250,"type":"integer"},"qb_hurries":{"description":"Times quarterback was hurried","example":5,"type":"integer"},"kickoff_returns":{"description":"Number of kickoff returns by opponents","example":5,"type":"integer"},"passing_two_point_conversions":{"description":"Passing two-point conversions","example":5,"type":"integer"},"first_downs":{"description":"Total first downs (used for passing first downs in SR)","example":5,"type":"integer"},"defensive_touchdowns":{"description":"Number of defensive touchdowns","example":5,"type":"integer"},"opponent_fumble_recovery_yards":{"description":"Yards gained on opponent fumble recoveries","example":250,"type":"integer"},"blocked_kick_returns":{"description":"Number of blocked kick returns","example":5,"type":"integer"},"conversion_rushing_attempts":{"description":"Two-point conversion rushing attempts","example":15,"type":"integer"},"extra_point_return_touchdowns":{"description":"Extra point attempts returned for a touchdown by the defense","example":5,"type":"integer"},"own_fumble_recoveries":{"description":"Own fumble recoveries","example":5,"type":"integer"},"punts_blocked":{"description":"Number of punts blocked","example":5,"type":"integer"},"rush_rate":{"description":"Rush rate (rushing attempts per play)","example":12.3,"type":"number"},"passing_avg_yards":{"description":"Average yards per pass attempt","example":12.3,"type":"number"},"special_teams_solo_tackles":{"description":"Solo tackles made on special-teams plays (kick and punt coverage)","example":5,"type":"integer"},"red_zone_passing_attempts":{"description":"Passing attempts in red zone","example":15,"type":"integer"},"conversion_rushing_successes":{"description":"Two-point conversion rushing successes","example":5,"type":"integer"},"dropped_passes":{"description":"Passes dropped by receivers","example":5,"type":"integer"},"passing_net_yards":{"description":"Net passing yards (gross yards minus sack yards lost)","example":250,"type":"integer"},"rushing_first_downs":{"description":"First downs gained via rushing","example":5,"type":"integer"},"passing_yards_allowed":{"description":"Passing yards allowed by defense","example":250,"type":"integer"},"tackles_for_loss_yards":{"description":"Yards lost on tackles for loss","example":250,"type":"integer"},"punt_touchbacks":{"description":"Number of punt touchbacks","example":5,"type":"integer"},"missed_tackle_cause":{"description":"Cause of missed tackle","example":"example_value","type":"string"},"missed_tackle":{"description":"Number of missed tackles","example":5,"type":"integer"},"own_fumble_recovery_touchdowns":{"description":"Touchdowns on own fumble recoveries","example":5,"type":"integer"},"auction_value":{"description":"Auction draft value","example":12.3,"type":"number"},"rushing_attempts_allowed":{"description":"Rushing attempts allowed by defense","example":15,"type":"integer"},"receiving_first_downs":{"description":"First downs gained via receiving","example":5,"type":"integer"},"fg_long":{"description":"Longest field goal made","example":5,"type":"integer"},"own_fumble_recovery_yards":{"description":"Yards gained on own fumble recoveries","example":250,"type":"integer"},"player_kickoff_return_yards":{"description":"Kickoff return yards recorded by the returning player","example":250,"type":"integer"},"timeouts_remaining":{"description":"Number of timeouts remaining","example":5,"type":"integer"},"defensive_tackles_combined":{"description":"Tackles (solo + assisted) made on scrimmage defense only, excluding special teams and change-of-possession plays","example":5,"type":"integer"},"tackles_for_loss":{"description":"Rushes resulting in tackles for loss","example":5,"type":"integer"},"rushing_attempts":{"description":"Number of rushing attempts","example":15,"type":"integer"},"games_started":{"description":"Number of games started","example":5,"type":"integer"},"rank":{"description":"Player ranking","example":5,"type":"integer"},"fielding_e":{"description":"Fielding errors","example":5,"type":"integer"},"kickoff_onside_successes":{"description":"Successful onside kicks","example":5,"type":"integer"},"scrambles":{"description":"Number of quarterback scrambles","example":5,"type":"integer"},"passing_touchdowns_allowed":{"description":"Passing touchdowns allowed by defense","example":5,"type":"integer"},"passing_tds":{"description":"Number of passing touchdowns","example":2,"type":"integer"},"spikes":{"description":"Number of spiked passes","example":5,"type":"integer"},"punt_return_attempts":{"description":"Punt return attempts","example":15,"type":"integer"},"conversion_passing_successes":{"description":"Two-point conversion passing successes","example":5,"type":"integer"},"deep_pass_completions":{"description":"Deep pass completions (20+ yards)","example":10,"type":"integer"},"forced_fumbles":{"description":"Number of fumbles forced by defender","example":5,"type":"integer"},"interception_touchdowns_thrown":{"description":"Interceptions returned for touchdowns (pick-6s)","example":5,"type":"integer"},"punt_return_touchdowns":{"description":"Punt return touchdowns","example":5,"type":"integer"},"is_out_of_pocket":{"description":"Whether quarterback left the pocket","example":"example_value","type":"boolean"},"passing_yards_300_plus":{"description":"Passing yards over 300","example":250,"type":"integer"},"kickoff_return_attempts":{"description":"Kickoff return attempts","example":15,"type":"integer"},"rushing_yards_allowed":{"description":"Rushing yards allowed by defense","example":250,"type":"integer"},"jersey":{"description":"Player jersey number","example":"example_value","type":"string"},"passing_rating":{"description":"Quarterback passer rating","example":98.7,"type":"number"},"contested_ball":{"description":"Whether the targeted receiver's pass was contested","example":"example_value","type":"boolean"},"field_goals_made":{"description":"Number of field goals made","example":5,"type":"integer"},"interception_return_average":{"description":"Average yards per interception return","example":12.3,"type":"number"},"extra_points_missed":{"description":"Extra points missed","example":5,"type":"integer"},"yahoo_fantasy_points":{"description":"Yahoo fantasy points","example":18.5,"type":"number"},"defensive_snap_count":{"description":"Number of defensive snaps played","example":5,"type":"integer"},"endzone_fumble_recovery_touchdowns":{"description":"Touchdowns from end zone fumble recoveries","example":5,"type":"integer"},"rushing_touchdowns_allowed":{"description":"Rushing touchdowns allowed by defense","example":5,"type":"integer"},"return_tds":{"description":"Number of return touchdowns","example":2,"type":"integer"},"kickoff_endzone":{"description":"Kickoffs reaching the end zone","example":5,"type":"integer"},"snap_count":{"description":"Number of offensive snaps played","example":5,"type":"integer"},"def_sack_yards":{"description":"Defensive sack yards","example":250,"type":"integer"},"batted_pass":{"description":"Number of passes batted down by defense","example":5,"type":"integer"},"route_type":{"description":"Type of route run by receiver","example":"example_value","type":"string"},"receiving_40_plus":{"description":"Receptions of 40+ yards","example":5,"type":"integer"},"passing_tds_40_plus_yards":{"description":"Passing touchdowns of 40+ yards","example":250,"type":"integer"},"fumbles_out_of_bounds":{"description":"Number of fumbles that went out of bounds","example":5,"type":"integer"},"deep_pass_receptions":{"description":"Deep pass receptions","example":5,"type":"integer"},"fumbles_lost":{"description":"Number of fumbles lost to opponent","example":5,"type":"integer"},"fumble_long":{"description":"Longest fumble return","example":5,"type":"integer"},"punt_fair_catch":{"description":"Number of punt fair catches","example":5,"type":"integer"},"is_successful_play":{"description":"Whether the play was successful","example":"example_value","type":"boolean"},"total":{"description":"Over/under total for betting","example":12.3,"type":"number"},"applied_pressure":{"description":"Applied pressure","example":"example_value","type":"boolean"},"rushing_tds":{"description":"Number of rushing touchdowns","example":2,"type":"integer"},"passing_air_yards":{"description":"Total air yards on pass attempts","example":250,"type":"integer"},"punt_average":{"description":"Average yards per punt","example":12.3,"type":"number"},"field_goals_blocked":{"description":"Number of field goals blocked","example":5,"type":"integer"},"created_reception":{"description":"Whether the receiver created the reception through an exceptional play","example":"example_value","type":"boolean"},"shotgun":{"description":"Plays run from shotgun formation","example":5,"type":"integer"},"kickoff_attempts":{"description":"Total kickoff attempts","example":15,"type":"integer"},"yards_after_contact":{"description":"Yards gained after contact","example":250,"type":"integer"},"kickoff_onside_attempts":{"description":"Onside kick attempts","example":15,"type":"integer"},"receiving_tds_40_plus_yards":{"description":"Receiving touchdowns of 40+ yards","example":250,"type":"integer"},"catchable_ball":{"description":"Whether the targeted receiver's pass was catchable","example":"example_value","type":"boolean"},"passing_longest_touchdown":{"description":"Longest touchdown pass","example":5,"type":"integer"},"separation_yards":{"description":"Separation distance in yards from defender","example":12.3,"type":"number"},"spread":{"description":"Point spread for betting","example":12.3,"type":"number"},"draftkings_ownership":{"description":"DraftKings ownership percentage","example":12.3,"type":"number"},"conversion_receiving_successes":{"description":"Two-point conversion receiving successes","example":5,"type":"integer"},"extra_points_made":{"description":"Number of extra points made","example":5,"type":"integer"},"blocked_kick_return_yards":{"description":"Yards gained on blocked kick returns","example":250,"type":"integer"},"passing_completions_allowed":{"description":"Passing completions allowed by defense","example":10,"type":"integer"},"interception_return_touchdowns":{"description":"Touchdowns scored on interception returns","example":5,"type":"integer"},"successful_rush_attempts":{"description":"Number of successful rushing attempts","example":15,"type":"integer"},"passing_20_plus":{"description":"Passing completions of 20+ yards","example":5,"type":"integer"},"broken_tackles":{"description":"Number of broken tackles","example":5,"type":"integer"},"conversion_receiving_attempts":{"description":"Two-point conversion receiving attempts","example":15,"type":"integer"},"deep_receptions":{"description":"Deep receptions (20+ yards)","example":5,"type":"integer"},"misc_assisted_tackles":{"description":"Assisted tackles made on change-of-possession plays (interception and fumble returns)","example":5,"type":"integer"},"rushing_yards_100_plus":{"description":"Number of 100+ yard rushing games","example":250,"type":"integer"},"draftkings_fantasy_points":{"description":"DraftKings fantasy points","example":18.5,"type":"number"},"challenges_used":{"description":"Number of challenges used","example":5,"type":"integer"},"blitzes_faced":{"description":"Number of blitzes faced","example":5,"type":"integer"},"punt_attempts":{"description":"Number of punt attempts","example":15,"type":"integer"},"penalty_first_downs":{"description":"First downs gained via opponent penalties","example":5,"type":"integer"},"declared_inactive":{"description":"Player was on the officially declared inactive list for this game","example":"example_value","type":"boolean"},"kneels":{"description":"Number of quarterback kneels","example":5,"type":"integer"},"fantasy_points_half_ppr":{"description":"Fantasy points in half-PPR scoring","example":18.5,"type":"number"}},"type":"object"},"team_id":{"description":"Team the player was representing during this play","format":"uuid","type":"string"}},"type":"object"},"seconds_remaining":{"description":"Seconds remaining in period when play started (inherited from Play)","type":"integer"},"source":{"description":"Data provider source for this player-play statistic","type":"string"},"team_id":{"description":"Team this play stat belongs to","type":"string"},"tenant_id":{"description":"Client tenant accessing this player statistic data","format":"uuid","type":"string"},"time_on_clock":{"description":"Game clock time when play occurred (inherited from Play)","type":"string"},"updated_at":{"description":"Most recent update to this player's play involvement data","format":"date-time","type":"string"}},"required":["common_model_id","player_id","play_number","event_id"],"title":"PlayStat","type":"object"}}},"description":"Play Stats Response"}},"summary":"List Play Stats For Player","tags":["Reference"]}},"/api/v1/events/{id}/event-scoreboard":{"get":{"callbacks":{},"description":"Returns the latest event_scoreboard row for an event.","operationId":"ApiRestWeb.EventScoreboardController.show","parameters":[{"description":"Event ID (UUID)","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"description":"Live event status with real-time scores, period, and game state information.\n\nContains dynamic/live game data that updates throughout the event. For comprehensive\nsport-specific details and field explanations, see the EventScoreboard model documentation.\n\n## Core Fields\n- **Basic Info**: sport, league, event_id\n- **Game State**: period, time_on_clock, period_half (sport-specific), status\n- **Scoring**: home_score, away_score (for team sports), periods (linescore)\n- **Details**: Sport-specific data in JSONB format\n- **Freshness**: response_received_at — when the provider observed this state\n- **Serving provenance** (additive): observed_at, served_at, source_rank — which provider\n  row was served, its rank in the live primary order, and why it won\n\n## Rendering a live clock\n`time_on_clock` is a point-in-time observation, not a ticking value; we refresh\nit as fast as the provider reports it. To render a smooth clock, tick locally\nfrom `time_on_clock` using `response_received_at` as the anchor and resync on\neach response. For timed sports `details.clock_running` says whether the clock\nshould be advancing — `null` means the provider did not tell us, which is\ndistinct from a known-stopped clock.\n\n## Period Numbering by Sport\n- **Football**: 1-4 (quarters), 5+ (overtime)\n- **Basketball**: 1-4 (quarters), 5+ (overtime)\n- **Baseball**: 1-9+ (innings)\n- **Hockey**: 1-3 (periods), 4+ (overtime)\n- **Golf**: 1-4 (rounds)\n","example":{"away_score":10,"common_model_id":"123e4567-e89b-12d3-a456-426614174000","details":{"away_timeouts":2,"distance":8,"down":2,"home_timeouts":3,"possession_team_id":"123e4567-e89b-12d3-a456-426614174002","red_zone":false,"wall_clock":"2024-01-15T15:32:08Z","yard_line":35},"event_id":"123e4567-e89b-12d3-a456-426614174001","home_score":14,"inserted_at":"2024-01-15T15:30:00Z","league":"NFL","observed_at":"2024-01-15T15:32:09Z","period":2,"response_received_at":"2024-01-15T15:32:10Z","served_at":"2024-01-15T15:32:11Z","source_rank":{"provider":"sportsstack","rank":null,"reason":null},"sport":"football","status":"in_progress","time_on_clock":"14:30","updated_at":"2024-01-15T15:32:15Z"},"properties":{"away_score":{"description":"Away team total score (null for individual sports like golf)","example":10,"type":"integer"},"common_model_id":{"description":"Event Status ID","format":"uuid","type":"string"},"details":{"additionalProperties":true,"description":"Sport-specific game state for a served scoreboard. Two formats exist.\n\n## Current format (what is served today)\n\nThe keys, nesting and value types of `details` depend on the data source that\nprovided the scoreboard row. For one event, `details` can be an object from one\nsource and `null` from another, and a key can be absent, `null` or populated\ndepending on the source. Treat every field as optional. Responses in this format\ndo not contain `details_version`. The property list below describes the keys that\ncan appear; not every source provides every key, and the same key can have a\ndifferent shape for different sources.\n\n## Current format reference\n\n### Dynamic game state\nThe details field contains live, sport-specific information that changes throughout\nthe game. Unlike static event information, this data updates in real-time as the\ngame progresses.\n\n### Sport-specific structures\nEach sport has its own set of relevant game state data:\n\n#### Football (Flattened Fields)\n- **Game State**: down, distance, yard_line, possession_team_id, red_zone, goal_to_go\n- **Clock Management**: play_clock, game_clock, clock_running, two_minute_warning, inside_two_minutes\n- **Timeouts**: home_timeouts, away_timeouts\n- **Weather (Flattened)**: weather_temperature, weather_condition, weather_wind_speed, weather_wind_direction, weather_humidity, weather_precipitation, wind_affecting_kicking, precipitation\n- **Analytics**: field_goal_range, touchdown_probability, turnover_on_downs_risk\n- **Game Info**: attendance, neutral_site, duration\n\n#### Basketball (Flattened Fields)\n- **Clock State**: shot_clock, shot_clock_running, game_clock, clock_running\n- **Fouls & Bonus**: home_team_fouls, away_team_fouls, home_bonus, away_bonus, home_double_bonus, away_double_bonus\n- **Timeouts**: home_timeouts, away_timeouts\n- **Free Throws (Flattened)**: free_throw_shooter_id, free_throw_shooter_name, free_throw_shots_awarded, free_throw_shots_made, free_throw_shots_attempted, free_throw_technical_foul, free_throw_flagrant_foul, free_throw_and_one, free_throw_clear_path_foul, free_throw_bonus_situation, free_throw_current_attempt\n- **Game Flow**: intermission, overtime_number, last_play, last_score_team_id, last_score_time, possession_arrow\n- **Analytics**: pace, lead_changes, times_tied, home_biggest_lead, away_biggest_lead, home_shooting_foul_trouble, away_shooting_foul_trouble\n- **Game Info**: attendance\n\n#### Baseball (Flattened Fields)\n- **Count**: balls, strikes, outs\n- **Hitter (Flattened)**: hitter_id, hitter_full_name, hitter_ab_over, hitter_outcome_id\n- **Pitcher (Flattened)**: pitcher_id, pitcher_full_name, pitcher_pitch_speed, pitcher_pitch_type, pitcher_pitch_x, pitcher_pitch_y, pitcher_pitch_zone\n- **Baserunners**: runners_on_base (array of maps), runners_count\n\n#### Hockey (Flattened Fields)\n- **Power Play**: man_advantage, power_play_time_remaining, home_on_power_play, away_on_power_play, penalty_kill_percentage\n- **Goalies**: home_goalie_pulled, away_goalie_pulled, empty_net, home_goalie_id, away_goalie_id\n- **Clock**: game_clock, clock_running, intermission, overtime_type\n- **Shootout**: in_shootout, shootout_round, home_shootout_goals, away_shootout_goals, shootout_attempts, shootout_attempts_count\n- **Penalties**: active_penalties (array of maps), active_penalties_count\n- **Game Flow**: last_faceoff_winner, faceoff_location, last_goal_time, last_goal_team_id, last_penalty_time\n- **Team Stats**: shots_on_goal_home, shots_on_goal_away, face_off_wins_home, face_off_wins_away, hits_home, hits_away, blocked_shots_home, blocked_shots_away\n\n#### Soccer (Flattened Fields)\n- **State**: match_status (`first_half`, `halftime`, `second_half`, `extra_time_first_half`, `extra_time_second_half`, `penalties`, `ended`; `not_started` and `postponed` also occur in both formats), match_minute (elapsed clock, `\"MM:SS\"`, stoppage time excluded)\n- **Stoppage Time**: added_time_announced, added_time_played (`\"MM:SS\"`)\n- **Cards**: home_yellow_cards, away_yellow_cards, home_red_cards, away_red_cards (red cards include second-yellow dismissals)\n- **Substitutions**: home_substitutions, away_substitutions\n- **Team Stats**: home_possession, away_possession (percent, 0-100), home_shots, away_shots, home_shots_on_target, away_shots_on_target, home_corners, away_corners\n- **Shootout**: shootout (`{home_score, away_score}`), present only once a penalty shootout has been reached\n- **Regulation Score**: regulation_score (`{home_score, away_score}`), the 90-minute score, present only once a match goes past regulation (top-level `home_score`/`away_score` include extra time but not the shootout)\n\n#### Golf (Embedded Objects)\n- **Tournament State**: round_number, total_rounds, holes_completed, current_hole, cut_line, cut_made, playoff_status, playoff_type, tournament_complete\n- **Course Conditions**: par_for_course, course_length, wind_speed, wind_direction, temperature, weather_condition, course_conditions\n- **Field Info**: field_size, players_made_cut, scoring_average\n- **Leaders**: driving_distance_leader, greens_in_regulation_leader, putting_average_leader\n- **Detailed Data**: leaderboard (array), featured_players (array), featured_hole (object)\n\n### Data structure strategy\nMost fields are flattened, with nested objects used where noted.\n\n### Array fields for complex data\nSome complex data structures use arrays of maps:\n- **runners_on_base**: Baseball baserunner positions and details (array of maps)\n- **active_penalties**: Hockey penalty details and timing information (array of maps)\n- **shootout_attempts**: Hockey shootout attempt details (array of maps)\n- **leaderboard**: Golf leaderboard entries (array of embedded objects)\n\n## `details_version` 1 format (selected per account)\n\nAccounts can be switched to a fixed per-sport format that does not depend on the\ndata source. Until an account is switched it receives the current format. A response\nin the new format is recognised by `details_version` = `1`. The exact keys for each\nsport are the component schemas `ScoreboardDetailsV1Football`,\n`ScoreboardDetailsV1Basketball`, `ScoreboardDetailsV1Baseball`,\n`ScoreboardDetailsV1Hockey` (also used for `ice_hockey`), `ScoreboardDetailsV1Soccer`,\n`ScoreboardDetailsV1Tennis` and `ScoreboardDetailsV1Other`.\n\n1. For every sport except golf and motorsports (see 8), `details` is always a JSON object\n   when a scoreboard is returned; it is never `null`.\n2. For football, basketball, baseball, hockey, ice_hockey, soccer and tennis, every key of that\n   sport's schema is present in every response.\n3. A key whose value is not known is `null`. `null` means \"not reported\". It never\n   stands for `0`, `false`, an empty string or an empty list; those values appear only\n   when the source reported them (an empty string is itself returned as `null`). A\n   source that itself reports a default value, for example a zero count before play\n   starts, has that value passed through: the format does not guess which zeros are\n   real. A baseball runner map in which every base is empty is returned as an empty\n   list with a count of `0`.\n4. Each key has one type. Values are taken from the source, with these normalizations:\n   a source's status text is mapped to the `match_status` values; clock text is read\n   into `match_minute` and the added-time keys; baseball runners that a source gives as\n   a map by base are returned as a list and `runners_count` is computed from it; and the\n   shootout and regulation scores are read from period scores where a source reports\n   them that way. A value that cannot be expressed as the key's type is returned as\n   `null`. That includes: a number that is negative (except temperature and pitch\n   location, which may be negative) or above 1e12; a count that is not a whole JSON\n   integer (text such as `\"2\"`, or any number with a decimal point such as `2.9` or\n   `2.0`) or that is above 1,000,000,000; numeric text in a number key; a possession\n   percentage above 100; a score pair with a side that is negative, above 1,000,000,000\n   or not a whole integer; a runner list or map with an entry that has no valid base,\n   repeats a base, or (in map form) holds a value that is neither text nor empty, in which case the\n   runners are `null` together with their count; a game clock that is not `m:ss` text\n   (minutes of one to three digits, seconds 00-59, and an optional fraction on the\n   seconds), and a soccer match minute or added time that is not exactly `m:ss`;\n   text of the form `prefix:type:value`; and an empty or blank string. Runners are\n   returned in base order. In a runner list, a name that is not text, or that has the\n   `prefix:type:value` form, is left out of that runner and the runner is kept. A\n   runner map by base carries player identifiers, so no names are returned from it; a\n   base that holds blank text counts as empty.\n5. Only the keys listed in the sport's schema are returned. For football, basketball,\n   baseball, hockey, ice_hockey and soccer, every key of that sport in the property list\n   below that does not carry a source identifier is in the schema. Tennis has one key,\n   `retirement_info`, which is not in the property list. Not returned in this format:\n   keys that carry a source identifier (player, team and goalie IDs, and similar), and\n   keys of the current format that are not in the property list (for example nested\n   baseball count and runner details, per-period linescores, match situation and\n   referee detail). Switching an account removes them from its responses.\n6. Changing the data source for an event does not change the key set, the types or the\n   meaning of `null`. Values can change.\n7. The format has no keys that carry a source identifier, and text of the form\n   `prefix:type:value` (one to ten ASCII letters, a colon, ASCII letters or underscores, a colon,\n   then text without whitespace; case-insensitive; surrounding whitespace ignored) is\n   `null`. Free text is not inspected beyond that. `possession_team_id` is a UUID in its\n   36-character text form (returned in lower case) or `null`; it is not checked against\n   the team list. Golf and motorsports are served as stored (see 8) and can contain\n   source identifiers.\n8. Golf and motorsports are not shaped by this format: their `details` are the stored\n   object, carry no `details_version`, and can contain source identifiers (an account\n   that holds no provider-data entitlement may have provider-id values removed from them\n   by a separate step). A scoreboard whose sport is not one of the sports named above,\n   including a sport stored as an identifier instead of a name, is treated as any other\n   sport. Sport names are matched ignoring case and surrounding whitespace (any Unicode space). For any other sport\n   (for example MMA) the object is exactly `{\"details_version\": 1}`.\n\n## When no scoreboard is available\n\nThe scoreboard object is absent as a whole; it is not returned with empty `details`:\n\n* `GET /api/v1/events/{id}/event-scoreboard` and `GET /api/v1/events/{id}/linescore`\n  return `404`.\n* `GET /api/v1/events` and `GET /api/v1/events/{id}` omit `event_scoreboard`.\n* `GET /api/v1/tournaments/{id}/bracket` returns `event_scoreboard: null`.\n\nA scoreboard is returned only from data you are entitled to receive. Data you are not\nentitled to is treated as if it did not exist.\n\nThis is different from an unknown value inside a returned scoreboard, which is a\n`null` key in the `details_version` 1 format.\n","example":{"goal_to_go":false,"away_yellow_cards":1,"runners_count":2,"home_timeouts":2,"match_status":"second_half","weather_wind_speed":8.0,"yard_line":25,"hitter_id":"player-123","possession_team_id":"123e4567-e89b-12d3-a456-426614174002","away_timeouts":3,"home_on_power_play":true,"touchdown_probability":0.35,"added_time_played":"00:00","weather_temperature":45.0,"active_penalties_count":1,"away_corners":2,"wind_affecting_kicking":false,"regulation_score":{"away_score":3,"home_score":0},"away_red_cards":1,"runners_on_base":[{"base":1,"ending_base":2,"id":"player-789"},{"base":3,"ending_base":3,"id":"player-012"}],"pitcher_id":"player-456","pitcher_full_name":"Jane Smith","shootout":{"away_score":4,"home_score":3},"home_substitutions":3,"away_substitutions":2,"added_time_announced":"04:00","home_possession":56,"strikes":1,"away_shots":7,"shots_on_goal_home":15,"home_yellow_cards":2,"balls":2,"home_corners":6,"away_possession":44,"home_shots_on_target":5,"details_version":1,"weather_humidity":65,"neutral_site":false,"attendance":72000,"hitter_full_name":"John Doe","outs":2,"distance":7,"play_clock":25,"inside_two_minutes":false,"away_on_power_play":false,"red_zone":true,"game_clock":"8:42","man_advantage":"5v4","power_play_time_remaining":82,"weather_wind_direction":"NW","two_minute_warning":false,"pitcher_pitch_speed":95.5,"home_red_cards":0,"weather_condition":"clear","down":3,"clock_running":true,"match_minute":"67:12","precipitation":false,"home_shots":11,"shots_on_goal_away":12,"away_shots_on_target":3,"turnover_on_downs_risk":0.15,"active_penalties":[{"major_penalty":false,"penalty_type":"Cross-checking","player_id":"player-789","time_remaining":82}],"field_goal_range":true,"weather_precipitation":false},"properties":{"penalty_kill_percentage":{"description":"Current penalty kill success rate","type":"number"},"holes_completed":{"description":"Holes finished in current round","type":"integer"},"course_conditions":{"description":"Course conditions","type":"string"},"home_biggest_lead":{"description":"Biggest home team lead","type":"integer"},"pitcher_pitch_x":{"description":"Pitch location X coordinate","type":"number"},"shootout_attempts_count":{"description":"Total shootout attempts","type":"integer"},"away_shooting_foul_trouble":{"description":"Away team in foul trouble","type":"boolean"},"goal_to_go":{"description":"Goal line is closer than first down marker","type":"boolean"},"away_yellow_cards":{"description":"Soccer away yellow cards","type":"integer"},"shootout_round":{"description":"Current shootout round","type":"integer"},"runners_count":{"description":"Number of runners on base","type":"integer"},"home_timeouts":{"description":"Home team timeouts remaining","type":"integer"},"wall_clock":{"description":"Provider wall-clock timestamp for the most recent game event","format":"date-time","type":"string"},"home_bonus":{"description":"Home team in bonus situation","type":"boolean"},"match_status":{"description":"Soccer match phase","enum":["first_half","halftime","second_half","extra_time_first_half","extra_time_second_half","penalties","ended"],"type":"string"},"last_play":{"description":"Description of last play","type":"string"},"hitter_ab_over":{"description":"At-bat is complete","type":"boolean"},"weather_wind_speed":{"description":"Wind speed (mph)","type":"number"},"home_double_bonus":{"description":"Home team in double bonus","type":"boolean"},"yard_line":{"description":"Field position (0-100)","type":"integer"},"hitter_id":{"description":"Current batter player ID","type":"string"},"times_tied":{"description":"Number of times tied","type":"integer"},"last_goal_time":{"description":"Time of last goal","type":"string"},"home_goalie_pulled":{"description":"Home goalie pulled","type":"boolean"},"lead_changes":{"description":"Number of lead changes","type":"integer"},"tournament_complete":{"description":"Tournament finished","type":"boolean"},"possession_team_id":{"description":"Common-model team ID with possession","format":"uuid","type":"string"},"wind_direction":{"description":"Wind direction","type":"string"},"away_timeouts":{"description":"Away team timeouts remaining","type":"integer"},"free_throw_shots_awarded":{"description":"Number of free throws awarded","type":"integer"},"home_on_power_play":{"description":"Home team on power play","type":"boolean"},"home_team_fouls":{"description":"Home team fouls this period/half","type":"integer"},"touchdown_probability":{"description":"Probability of touchdown (0.0-1.0)","type":"number"},"added_time_played":{"description":"Soccer stoppage time played so far in the current period (MM:SS)","example":"01:26","type":"string"},"weather_temperature":{"description":"Temperature (Fahrenheit)","type":"number"},"duration":{"description":"Game duration","type":"string"},"overtime_type":{"description":"Type of overtime","enum":["3v3","4v4","shootout"],"type":"string"},"course_length":{"description":"Course length in yards","type":"integer"},"shot_clock_running":{"description":"Whether shot clock is running","type":"boolean"},"active_penalties_count":{"description":"Number of active penalties","type":"integer"},"current_hole":{"description":"Hole currently being played","type":"integer"},"away_corners":{"description":"Soccer away corner kicks","type":"integer"},"wind_affecting_kicking":{"description":"Wind affecting field goals/punts","type":"boolean"},"regulation_score":{"description":"Soccer 90-minute score. Present only once a match goes past regulation (extra time).","properties":{"away_score":{"type":"integer"},"home_score":{"type":"integer"}},"type":"object"},"free_throw_clear_path_foul":{"description":"Free throws from clear path foul","type":"boolean"},"hits_home":{"description":"Home team hits","type":"integer"},"shootout_attempts":{"description":"Shootout attempts with details","items":{"properties":{"goalie_id":{"description":"Goalie player ID","type":"string"},"is_deciding_goal":{"description":"Was the deciding goal","type":"boolean"},"result":{"description":"Shot result","type":"string"},"round":{"description":"Shootout round","type":"integer"},"shooter_id":{"description":"Shooter player ID","type":"string"},"shooter_name":{"description":"Shooter name","type":"string"},"shooter_team_id":{"description":"Shooter's team","type":"string"}},"type":"object"},"type":"array"},"playoff_type":{"description":"Type of playoff","enum":["sudden_death","aggregate","match_play"],"type":"string"},"away_red_cards":{"description":"Soccer away red cards (includes second-yellow dismissals)","type":"integer"},"free_throw_current_attempt":{"description":"Current free throw attempt number","type":"integer"},"runners_on_base":{"description":"Baserunners with positions and details","items":{"properties":{"base":{"description":"Starting base (1, 2, 3)","type":"integer"},"ending_base":{"description":"Ending base after play","type":"integer"},"full_name":{"description":"Runner name, when known","type":"string"},"id":{"description":"Player ID","type":"string"}},"type":"object"},"type":"array"},"cut_made":{"description":"Has cut been applied","type":"boolean"},"pitcher_id":{"description":"Current pitcher player ID","type":"string"},"pitcher_full_name":{"description":"Current pitcher name","type":"string"},"shootout":{"description":"Soccer penalty shootout score. Present only once penalties are reached.","properties":{"away_score":{"type":"integer"},"home_score":{"type":"integer"}},"type":"object"},"faceoff_location":{"description":"Location of last faceoff","type":"string"},"home_substitutions":{"description":"Soccer home substitutions made","type":"integer"},"wind_speed":{"description":"Wind speed (mph)","type":"number"},"shot_clock":{"description":"Shot clock seconds remaining","type":"integer"},"away_substitutions":{"description":"Soccer away substitutions made","type":"integer"},"pitcher_pitch_zone":{"description":"Strike zone location","type":"integer"},"added_time_announced":{"description":"Soccer stoppage time announced by the fourth official (MM:SS)","example":"02:00","type":"string"},"free_throw_technical_foul":{"description":"Free throws from technical foul","type":"boolean"},"home_possession":{"description":"Soccer home ball possession percentage","maximum":100,"minimum":0,"type":"number"},"putting_average_leader":{"description":"Putting average leader player ID","type":"string"},"home_shooting_foul_trouble":{"description":"Home team in foul trouble","type":"boolean"},"strikes":{"description":"Strike count (0-2)","type":"integer"},"greens_in_regulation_leader":{"description":"GIR leader player ID","type":"string"},"away_biggest_lead":{"description":"Biggest away team lead","type":"integer"},"face_off_wins_away":{"description":"Away team faceoff wins","type":"integer"},"last_goal_team_id":{"description":"Team that scored last goal","type":"string"},"away_double_bonus":{"description":"Away team in double bonus","type":"boolean"},"away_shots":{"description":"Soccer away total shots","type":"integer"},"temperature":{"description":"Temperature (Fahrenheit)","type":"integer"},"last_penalty_time":{"description":"Time of last penalty","type":"string"},"last_score_team_id":{"description":"Team that scored last","type":"string"},"free_throw_and_one":{"description":"And-one free throw situation","type":"boolean"},"shots_on_goal_home":{"description":"Home team shots on goal","type":"integer"},"home_yellow_cards":{"description":"Soccer home yellow cards","type":"integer"},"free_throw_flagrant_foul":{"description":"Free throws from flagrant foul","type":"boolean"},"in_shootout":{"description":"Currently in shootout","type":"boolean"},"playoff_status":{"description":"Tournament in playoff","type":"boolean"},"away_goalie_id":{"description":"Current away goalie player ID","type":"string"},"balls":{"description":"Ball count (0-3)","type":"integer"},"home_corners":{"description":"Soccer home corner kicks","type":"integer"},"home_shootout_goals":{"description":"Home team shootout goals","type":"integer"},"pitcher_pitch_type":{"description":"Last pitch type","type":"string"},"away_possession":{"description":"Soccer away ball possession percentage","maximum":100,"minimum":0,"type":"number"},"scoring_average":{"description":"Current round scoring average","type":"number"},"empty_net":{"description":"Empty net situation","type":"boolean"},"home_shots_on_target":{"description":"Soccer home shots on target","type":"integer"},"away_bonus":{"description":"Away team in bonus situation","type":"boolean"},"details_version":{"description":"Version of the details contract. Present and `1` in the contract format; absent in legacy provider-shaped objects.","example":1,"type":"integer"},"weather_humidity":{"description":"Humidity percentage","type":"integer"},"neutral_site":{"description":"Neutral site game","type":"boolean"},"free_throw_shots_made":{"description":"Free throws made so far","type":"integer"},"attendance":{"description":"Game attendance","type":"integer"},"total_rounds":{"description":"Total tournament rounds","type":"integer"},"hitter_full_name":{"description":"Current batter name","type":"string"},"pace":{"description":"Possessions per 48 minutes","type":"number"},"outs":{"description":"Outs in inning (0-2)","type":"integer"},"round_number":{"description":"Current round (1-4+)","type":"integer"},"free_throw_shooter_name":{"description":"Name of free throw shooter","type":"string"},"cut_line":{"description":"Score needed to make cut","type":"integer"},"distance":{"description":"Yards to go for first down","type":"integer"},"free_throw_shooter_id":{"description":"Player ID shooting free throws","type":"string"},"field_size":{"description":"Total number of players","type":"integer"},"play_clock":{"description":"Seconds on play clock","type":"integer"},"hits_away":{"description":"Away team hits","type":"integer"},"inside_two_minutes":{"description":"Less than two minutes remaining","type":"boolean"},"driving_distance_leader":{"description":"Driving distance leader player ID","type":"string"},"home_goalie_id":{"description":"Current home goalie player ID","type":"string"},"intermission":{"description":"Between periods/halves","type":"boolean"},"hitter_outcome_id":{"description":"At-bat outcome identifier","type":"string"},"blocked_shots_away":{"description":"Away team blocked shots","type":"integer"},"away_on_power_play":{"description":"Away team on power play","type":"boolean"},"last_faceoff_winner":{"description":"Team that won last faceoff","enum":["home","away"],"type":"string"},"red_zone":{"description":"In red zone (20 yards or less)","type":"boolean"},"game_clock":{"description":"Current game clock time","type":"string"},"man_advantage":{"description":"Current man advantage (e.g., '5v4', 'even')","type":"string"},"blocked_shots_home":{"description":"Home team blocked shots","type":"integer"},"away_goalie_pulled":{"description":"Away goalie pulled","type":"boolean"},"power_play_time_remaining":{"description":"Seconds remaining on power play","type":"integer"},"weather_wind_direction":{"description":"Wind direction","type":"string"},"players_made_cut":{"description":"Players making the cut","type":"integer"},"par_for_course":{"description":"Course par","type":"integer"},"two_minute_warning":{"description":"Two minute warning called","type":"boolean"},"pitcher_pitch_speed":{"description":"Last pitch speed (mph)","type":"number"},"possession_arrow":{"description":"Possession arrow (college)","enum":["home","away"],"type":"string"},"away_shootout_goals":{"description":"Away team shootout goals","type":"integer"},"free_throw_shots_attempted":{"description":"Free throws attempted so far","type":"integer"},"home_red_cards":{"description":"Soccer home red cards (includes second-yellow dismissals)","type":"integer"},"weather_condition":{"description":"Weather condition","type":"string"},"away_team_fouls":{"description":"Away team fouls this period/half","type":"integer"},"pitcher_pitch_y":{"description":"Pitch location Y coordinate","type":"number"},"down":{"description":"Current down (1-4)","type":"integer"},"last_score_time":{"description":"When last score occurred","type":"string"},"clock_running":{"description":"Whether game clock is running","type":"boolean"},"overtime_number":{"description":"Which overtime period","type":"integer"},"match_minute":{"description":"Soccer elapsed match clock as MM:SS (stoppage time excluded). Tick locally between updates.","example":"45:00","type":"string"},"precipitation":{"description":"Active precipitation","type":"boolean"},"home_shots":{"description":"Soccer home total shots","type":"integer"},"shots_on_goal_away":{"description":"Away team shots on goal","type":"integer"},"away_shots_on_target":{"description":"Soccer away shots on target","type":"integer"},"turnover_on_downs_risk":{"description":"Probability of turnover on downs (0.0-1.0)","type":"number"},"active_penalties":{"description":"Currently active penalties with details","items":{"properties":{"duration":{"description":"Penalty duration in minutes","type":"integer"},"major_penalty":{"description":"Is major penalty","type":"boolean"},"misconduct":{"description":"Is misconduct penalty","type":"boolean"},"penalty_start_time":{"description":"When penalty started","type":"string"},"penalty_type":{"description":"Type of penalty","type":"string"},"player_id":{"description":"Penalized player ID","type":"string"},"player_name":{"description":"Penalized player name","type":"string"},"team_id":{"description":"Team of penalized player","type":"string"},"time_remaining":{"description":"Time remaining in seconds","type":"integer"}},"type":"object"},"type":"array"},"field_goal_range":{"description":"Within field goal range","type":"boolean"},"free_throw_bonus_situation":{"description":"Free throws from bonus","type":"boolean"},"weather_precipitation":{"description":"Is it precipitating","type":"boolean"},"face_off_wins_home":{"description":"Home team faceoff wins","type":"integer"}},"type":"object"},"event_id":{"description":"Event ID","format":"uuid","type":"string"},"home_score":{"description":"Home team total score (null for individual sports like golf)","example":14,"type":"integer"},"inserted_at":{"description":"Creation timestamp","format":"date-time","type":"string"},"league":{"description":"League abbreviation","example":"NFL","type":"string"},"observed_at":{"description":"Provider observation time of the served row (the elected row's own observation; unlike response_received_at it is never taken from a clock donor). Null when unknown.","example":"2024-01-15T15:32:09Z","format":"date-time","nullable":true,"type":"string"},"period":{"description":"Current period/quarter/inning (1-based, sport-specific numbering)","example":2,"type":"integer"},"period_half":{"description":"Period subdivision (e.g., 'top'/'bottom' for baseball innings)","enum":["top","bottom"],"example":"bottom","type":"string"},"period_half_over":{"description":"Whether the current period half is complete","type":"boolean"},"periods":{"description":"Per-period linescore, in period order. This is what `/v1/events/{id}/linescore` returns.","example":[{"away_score":3,"home_score":7,"number":1,"type":"regular_period"}],"items":{"additionalProperties":true,"type":"object"},"type":"array"},"response_received_at":{"description":"When we received this state from the upstream provider. This is the observation time, and it is the field to use to judge freshness or to interpolate a running clock — `updated_at` is a storage timestamp and moves even when the observation did not.","example":"2024-01-15T15:32:10Z","format":"date-time","type":"string"},"served_at":{"description":"When this response was assembled (UTC, whole seconds).","example":"2024-01-15T15:32:11Z","format":"date-time","nullable":true,"type":"string"},"source_rank":{"description":"Which provider's row was served and why it was chosen. `provider` is the provider family (`sportsstack` for a canonical row, whose backing vendor is not disclosed); `rank` is its position in the league's live primary order (0 = primary, null = outside the order or canonical); `reason` is `primary` (highest-ranked provider present), `fallback_stale` (a higher-ranked provider's row was older than the stale window), `single_provider` (only one provider reported), `freshest` (a fresher lower-ranked row was served), or null when the election's candidates are not visible to the tenant.","nullable":true,"properties":{"provider":{"example":"sportsstack","type":"string"},"rank":{"example":0,"nullable":true,"type":"integer"},"reason":{"enum":["primary","fallback_stale","single_provider","freshest"],"nullable":true,"type":"string"}},"type":"object"},"sport":{"description":"Sport name","enum":["football","basketball","baseball","hockey","ice_hockey","soccer","golf"],"example":"football","type":"string"},"status":{"description":"Lifecycle state of the event as reported by the provider (e.g. 'live', 'in_progress', 'halftime', 'closed', 'final'). Values are provider vocabulary and are not normalized across providers — use this to tell a live scoreboard from a finished one, not for settlement decisions.","example":"in_progress","type":"string"},"time_on_clock":{"description":"Time remaining in period - format varies by sport (MM:SS for timed sports, null for baseball/golf)","example":"14:30","type":"string"},"updated_at":{"description":"Last update timestamp","format":"date-time","type":"string"}},"required":["common_model_id","event_id","sport","league"],"title":"EventStatus","type":"object"}}},"description":"EventScoreboard Response"},"401":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"invalid_api_key","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/invalid_api_key","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"not_found","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/not_found","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Not Found"}},"summary":"Get Event Scoreboard","tags":["Events"]}},"/api/v1/injuries/{player_id}/timeline":{"get":{"callbacks":{},"description":"Returns the chronological history of injury reports for a player, newest first. A report with a null status carries no active designation (the player was cleared, or the designation was not recognised). Like the injury list, the history is one aggregated, vendor-neutral view: `source` is always `sportsstack`, and `source_tier` and `confidence` are null.","operationId":"ApiRestWeb.InjuryController.timeline","parameters":[{"description":"Player ID (common_model_id)","in":"path","name":"player_id","required":true,"schema":{"type":"string"}},{"description":"Page number for page/per_page pagination. Do not combine with limit/offset.","in":"query","name":"page","required":false,"schema":{"default":1,"minimum":1,"type":"integer"}},{"description":"Number of items per page (max 1000). Do not combine with limit/offset.","in":"query","name":"per_page","required":false,"schema":{"default":100,"maximum":1000,"minimum":1,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"items":{"description":"A single report in a player's injury history, newest first. A report with a null\n`status` carries no active designation (the player was cleared, or the designation\nwas not recognised). Like the injury list, the history is\none aggregated, vendor-neutral view: `source` is always `sportsstack` and\n`source_tier` and `confidence` are null.\n","example":{"confidence":null,"description":"Questionable with a knee injury, limited practice Wednesday","id":"a1b2c3d4-e5f6-7890-abcd-ef1234567890","injury_id":"49306211-7b48-4b5e-88e9-a4190189dbea","injury_type":"Knee","inserted_at":"2024-09-11T09:00:00Z","league_id":"58e8c89b-72f8-4427-adbc-10f193c9b462","metadata":{},"player_id":"59291391-0c7e-442b-9496-33074647384e","reported_at":"2024-09-11T08:30:00Z","source":"sportsstack","source_tier":null,"status":"questionable","tenant_id":"ff6332b6-8151-4a13-b20c-bd7b2ab45452","updated_at":"2024-09-11T09:00:00Z"},"properties":{"confidence":{"description":"Always null: the aggregate does not expose a confidence score","nullable":true,"type":"number"},"description":{"description":"Free-text from the source","nullable":true,"type":"string"},"id":{"description":"Injury report ID (common_model_id)","type":"string"},"injury_id":{"description":"Injury report ID (same as id)","type":"string"},"injury_type":{"description":"Body part or condition","nullable":true,"type":"string"},"inserted_at":{"description":"When this report was first recorded","format":"date-time","type":"string"},"league_id":{"description":"League context","nullable":true,"type":"string"},"metadata":{"description":"Additional source metadata","type":"object"},"player_id":{"description":"Player this observation is about","type":"string"},"reported_at":{"description":"When the source reported this status","format":"date-time","nullable":true,"type":"string"},"source":{"description":"Always `sportsstack`","type":"string"},"source_tier":{"description":"Always null: the aggregate does not expose source tiers","nullable":true,"type":"integer"},"status":{"description":"Reported injury status; null when the report carries no active designation","nullable":true,"type":"string"},"tenant_id":{"description":"Tenant ID","type":"string"},"updated_at":{"format":"date-time","type":"string"}},"required":["id","tenant_id","player_id","source"],"title":"InjuryTimeline","type":"object"},"type":"array"}},"required":["data"],"type":"object"}}},"description":"Injury Timeline"},"401":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"invalid_api_key","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/invalid_api_key","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"not_found","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/not_found","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Not Found"}},"summary":"Player Injury Timeline","tags":["Content"]}},"/api/v1/events/{id}/odds":{"get":{"callbacks":{},"description":"Retrieve pre-structured odds for an event, optimized for client rendering.\n\nReturns a response with:\n- `main_lines`: Pre-structured 6-box data with away/home teams and spread/moneyline/total markets\n- `other_markets`: All non-main-line markets grouped by market_type\n\nThis endpoint is designed to enable clients to render the entire betting page\nusing a single API call.\n","operationId":"ApiRestWeb.OddsControllerV2.event_odds","parameters":[{"description":"Event ID (UUID)","in":"path","name":"id","required":true,"schema":{"type":"string"}},{"description":"Filter response: 'main_lines', 'other_markets', or 'all' (default: 'all')","in":"query","name":"include","required":false,"schema":{"type":"string"}},{"description":"Filter by sportsbook name","in":"query","name":"sportsbook","required":false,"schema":{"type":"string"}},{"description":"Filter by a single aggregator. A comma-separated list returns 400; send one request per aggregator.","in":"query","name":"aggregator","required":false,"schema":{"type":"string"}},{"description":"Filter by market type","in":"query","name":"market_type","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"properties":{"main_lines":{"description":"Pre-structured 6-box data with away/home teams and markets","type":"object"},"other_markets":{"description":"Non-main-line markets grouped by market_type","type":"array"}},"type":"object"}},"type":"object"}}},"description":"Success"},"400":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"bad_request","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/bad_request","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"invalid_api_key","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/invalid_api_key","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"not_found","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/not_found","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Not Found"}},"summary":"Get Structured Event Odds","tags":["Betting"]}},"/api/v1/news/{id}":{"get":{"callbacks":{},"description":"Retrieves a specific news item by its ID.\n\nReturns the complete news item including all analysis sections, edit history,\nand metadata. This endpoint is useful for displaying full news articles or\ngetting detailed information about a specific piece of content.\n\n## Response Content\nThe response includes:\n- **Core Content**: Headline, summary, and detailed analysis\n- **Specialized Analysis**: Betting, fantasy, and social insights\n- **Metadata**: Publication date, author, source, and tags\n- **Edit History**: Track of any manual edits made to AI-generated content\n- **Entity Context**: Information about the related player, team, event, or league\n","operationId":"ApiRestWeb.NewsController.show","parameters":[{"description":"News Item ID (UUID)","example":"123e4567-e89b-12d3-a456-426614174000","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"description":"News and insights about sports entities including players, teams, events, and leagues.\n\nNews items provide automated analysis, commentary, and insights based on performance data,\nstatistical trends, and recent activity. Each news item contains multiple types of analysis\ntailored for different audiences including media, fantasy sports, and betting markets.\n","example":{"analysis":"Allen's recent rushing success stems from the Bills' increased use of designed quarterback runs in the red zone, capitalizing on his 6'5\" frame and surprising mobility. This strategic shift has coincided with the team's push for playoff positioning, as the coaching staff recognizes Allen's unique ability to create mismatches against smaller linebackers and defensive backs in short-yardage situations.","author":"Matthew Berry","betting_analysis":"Allen's rushing touchdown prop has moved from +125 to -110 over the past two weeks, reflecting bookmakers' adjustment to his recent red zone usage. The over on his rushing yards has hit in 8 of his last 10 games, creating value for bettors who recognize this trend early.","date":"2024-01-15","edit_history":[{"changes":{"tags":["fantasy_football","playoff_implications","rushing_qb","red_zone"]},"editor_id":"user-456","timestamp":"2024-01-15T12:00:00Z"}],"event_id":"456e7890-f12b-34c5-d678-901234567890","for_entity_id":"123e4567-e89b-12d3-a456-426614174000","for_entity_type":"player","headline":"Josh Allen's Rushing Touchdowns Fuel Fantasy Surge Ahead of Playoffs","id":"123e4567-e89b-12d3-a456-426614174000","inserted_at":"2024-01-15T10:30:00Z","league_id":"32fa944f-b1bd-41b4-bec2-7ab269fde6fc","metadata":{"confidence_score":0.89,"data_sources":["example_provider_a","example_provider_b"],"generation_model":"gpt-4-turbo","processing_time":3.2},"original_content":{"analysis":"Allen's recent rushing success stems from...","headline":"Josh Allen's Rushing Touchdowns Fuel Fantasy Surge Ahead of Playoffs","summary":"Josh Allen has scored 4 rushing touchdowns in his last 3 games...","tags":["fantasy_football","playoff_implications"]},"priority":2,"source":"Example News","summary":"Josh Allen has scored 4 rushing touchdowns in his last 3 games, significantly boosting his fantasy value ahead of the playoffs. His dual-threat ability makes him a premium option for championship weeks, especially with the Bills' favorable upcoming schedule.","tags":["fantasy_football","playoff_implications","rushing_qb","red_zone"],"tenant_id":"ff6332b6-8151-4a13-b20c-bd7b2ab45452","updated_at":"2024-01-15T14:45:00Z"},"properties":{"analysis":{"description":"Detailed breakdown and commentary providing deeper insights","example":"Allen's recent rushing success stems from the Bills' increased use of designed quarterback runs in the red zone, capitalizing on his 6'5\" frame and surprising mobility. This strategic shift has coincided with the team's push for playoff positioning...","type":"string"},"author":{"description":"Content creator attribution","example":"Matthew Berry","type":"string"},"betting_analysis":{"description":"Analysis focused on betting markets, odds, and wagering implications","example":"Allen's rushing touchdown prop has moved from +125 to -110 over the past two weeks, reflecting bookmakers' adjustment to his recent red zone usage. The over on his rushing yards has hit in 8 of his last 10 games...","type":"string"},"date":{"description":"Publication date (typically the date of the analyzed performance or event)","example":"2024-01-15","format":"date","type":"string"},"edit_history":{"description":"Chronological record of manual edits made to the content","items":{"properties":{"changes":{"additionalProperties":true,"description":"Fields that were modified in this edit","type":"object"},"editor_id":{"description":"ID of the person who made the edit","type":"string"},"timestamp":{"description":"When the edit was made","format":"date-time","type":"string"}},"type":"object"},"type":"array"},"entity_tags":{"description":"Entity tags identifying potential entity mentions in the content.\nOnly included when include_entity_tags=true is specified in the request.\n","items":{"properties":{"confidence":{"description":"Confidence score (0.0-1.0) indicating how confident we are this is the right entity","maximum":1.0,"minimum":0.0,"type":"number"},"context":{"description":"Surrounding text context where entity was mentioned","type":"string"},"entity_id":{"description":"Reference to the actual entity","format":"uuid","type":"string"},"entity_name":{"description":"Display name of the entity","type":"string"},"entity_type":{"description":"Type of entity being tagged","enum":["player","team","coach","league","venue"],"type":"string"},"id":{"description":"Unique identifier for this entity tag","format":"uuid","type":"string"},"inserted_at":{"description":"When this entity tag was created","format":"date-time","type":"string"},"mentioned_as":{"description":"The actual text that referenced the entity in the content","type":"string"},"reasoning":{"description":"AI/algorithm reasoning for the tag","type":"string"},"relevance":{"description":"Relevance score (0.0-1.0) indicating how relevant/prominent this entity is in the content","maximum":1.0,"minimum":0.0,"type":"number"},"tag_method":{"description":"Specific method used for tagging (e.g., 'gpt4', 'regex', 'user_edit')","type":"string"},"tag_source":{"description":"Source of the tag (AI analysis, manual tagging, etc.)","enum":["ai","manual","rule_based","hybrid"],"type":"string"}},"required":["id","entity_type","entity_id","entity_name","mentioned_as","confidence","relevance","tag_source","tag_method"],"type":"object"},"type":"array"},"event_id":{"description":"Related event ID (for game recaps and event-specific news)","example":"456e7890-f12b-34c5-d678-901234567890","format":"uuid","type":"string"},"for_entity_id":{"description":"ID of the specific entity (player, team, event, or league) this news covers","example":"123e4567-e89b-12d3-a456-426614174000","format":"uuid","type":"string"},"for_entity_type":{"description":"Type of entity this news item is about","enum":["player","team","event","league"],"example":"player","type":"string"},"headline":{"description":"Headline summarizing the main story or insight","example":"Josh Allen's Rushing Touchdowns Fuel Fantasy Surge Ahead of Playoffs","type":"string"},"id":{"description":"Unique identifier for this news item","format":"uuid","type":"string"},"inserted_at":{"description":"When this news item was created in the system","example":"2024-01-15T10:30:00Z","format":"date-time","type":"string"},"league_id":{"description":"League context for this news item","example":"32fa944f-b1bd-41b4-bec2-7ab269fde6fc","format":"uuid","type":"string"},"metadata":{"additionalProperties":true,"description":"Additional context and system metadata","type":"object"},"original_content":{"additionalProperties":true,"description":"Preserved original content before any manual edits","properties":{"analysis":{"description":"Original analysis","type":"string"},"betting_analysis":{"description":"Original betting analysis","type":"string"},"headline":{"description":"Original headline","type":"string"},"summary":{"description":"Original summary","type":"string"},"tags":{"description":"Original tags","items":{"type":"string"},"type":"array"}},"type":"object"},"priority":{"default":3,"description":"Content priority level (1=breaking news/urgent, 5=routine update)","example":3,"maximum":5,"minimum":1,"type":"integer"},"source":{"description":"Publishing source or platform","example":"Example News","type":"string"},"summary":{"description":"Concise overview of the main points, typically 2-3 sentences","example":"Josh Allen has scored 4 rushing touchdowns in his last 3 games, significantly boosting his fantasy value ahead of the playoffs. His dual-threat ability makes him a premium option for championship weeks, especially with the Bills' favorable upcoming schedule.","type":"string"},"tags":{"description":"Content categorization tags for discovery and filtering","example":["game_recap","fantasy_football","playoff_implications","rushing_qb"],"items":{"type":"string"},"type":"array"},"tenant_id":{"description":"Client tenant this news item belongs to","format":"uuid","type":"string"},"tournament_id":{"description":"Related tournament ID (for tournament-specific news)","format":"uuid","type":"string"},"updated_at":{"description":"When this news item was last modified","example":"2024-01-15T14:45:00Z","format":"date-time","type":"string"}},"required":["id","headline","summary","for_entity_type","for_entity_id","league_id","date"],"title":"News","type":"object"}}},"description":"News Response"},"401":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"invalid_api_key","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/invalid_api_key","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"not_found","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/not_found","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Not Found"}},"summary":"Show News Item","tags":["Content"]}},"/api/v1/season-stats/{id}":{"get":{"callbacks":{},"operationId":"ApiRestWeb.SeasonStatsController.show","parameters":[{"description":"Season Stats ID (UUID)","example":"01c7133f-2999-4803-9872-8c2ab1ba63ac","in":"path","name":"id","required":true,"schema":{"type":"string"}},{"description":"Include source mappings from the specific integration (i.e. a provider key) will return a source_mappings object with the mappings for the respective objects","in":"query","name":"return_source_id_format","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"description":"Season-level performance statistics aggregated across all events within a specific season.\n\nThese statistics represent cumulative or averaged performance metrics for players and teams\nover an entire season period. Unlike EventScopedStats which capture single-game performance,\nSeasonScopedStats provide the broader context of sustained performance and seasonal trends.\n\n## Key Concepts\n- **Aggregation Period**: Full season statistics (regular season, playoffs, or combined)\n- **Entity Scope**: Both individual players and team-level aggregations\n- **Data Sources**: Official league stats, advanced analytics, projections\n- **Historical Value**: Season stats enable year-over-year comparisons and career tracking\n\n## Statistical Categories\nSeason stats typically include:\n- **Volume Stats**: Total accumulations (total yards, points, games played)\n- **Rate Stats**: Per-game or per-attempt averages (batting average, completion percentage)\n- **Advanced Metrics**: Efficiency ratings, advanced analytics (PER, QBR, OPS)\n- **Projections**: Forecasted season totals based on current pace or modeling\n\n## Applications\n- **Fantasy Sports**: Season-long player evaluation and projections\n- **Team Analysis**: Roster evaluation and performance trends\n- **Historical Comparison**: Career trajectories and milestone tracking\n- **Contract Negotiations**: Performance-based contract evaluations\n","example":{"common_model_id":"a1b2c3d4-e5f6-7890-abcd-ef1234567890","data":{"defensive_yards":16,"offensive_rushing_yards":12},"for_entity_id":"59291391-0c7e-442b-9496-33074647384e","for_entity_type":"player","inserted_at":"2024-08-26T22:03:16-04:00","is_projection":true,"season_year":2024,"source":"example_provider","team_id":"b3f7a1c2-9d4e-4f8a-b5c6-1a2b3c4d5e6f","updated_at":"2024-08-26T22:03:16-04:00"},"properties":{"common_model_id":{"description":"Unique identifier for this season stats record","format":"uuid","type":"string"},"data":{"additionalProperties":false,"description":"Season-aggregated statistics using canonical field names from our stat registry.\n\n## Season-Level Aggregation\nThese statistics represent cumulative or averaged performance across all events\nwithin a season. Values are typically totals, averages, or rate statistics that\nprovide season-long performance context.\n\n## Standardized Stat Names\nAll statistics use our unified canonical naming system. Season stats commonly include:\n- **Volume Stats**: Total accumulations (passing_yards, rushing_attempts, receptions)\n- **Rate Stats**: Per-game or efficiency metrics (completion_percentage, yards_per_carry)\n- **Advanced Metrics**: Calculated performance indicators (quarterback_rating, passer_rating)\n- **Projections**: Forecasted season totals based on pace or modeling\n\n## Data Sources\n- **Official Stats**: League-provided season totals and averages\n- **Calculated Stats**: Derived metrics from event-level data aggregation\n- **Projections**: Forecasted performance based on current pace\n\n## Provider Translation\nSeason data from various providers is normalized to canonical names:\n- **Official feeds**: Season totals and averages\n- **Projection providers**: Projected season statistics and pace-based forecasts\n- **Ranking providers**: Season performance metrics and rankings\n\nSee the complete stat registry for all supported seasonal statistics.\n","example":{"completion_percentage":67.5,"games_played":16,"interceptions":8,"passing_touchdowns":28,"passing_yards":4200,"quarterback_rating":102.3},"properties":{"def_interception_touchdowns":{"description":"Defensive interception touchdowns","example":5,"type":"integer"},"throwaways":{"description":"Number of throw away passes","example":5,"type":"integer"},"fanduel_fantasy_points_ceiling":{"description":"FanDuel fantasy points ceiling","example":18.5,"type":"number"},"on_target_throws":{"description":"Number of on-target throws","example":5,"type":"integer"},"interception_returns":{"description":"Number of interception returns","example":5,"type":"integer"},"kickoff_return_touchdowns":{"description":"Kickoff return touchdowns","example":5,"type":"integer"},"extra_points_attempted":{"description":"Number of extra point attempts","example":5,"type":"integer"},"redzone_rushing_attempts":{"description":"Rush attempts in the red zone","example":15,"type":"integer"},"is_motion":{"description":"Whether player was in motion during play","example":"example_value","type":"boolean"},"passing_attempts":{"description":"Total number of pass attempts","example":15,"type":"integer"},"punt_long":{"description":"Longest punt","example":5,"type":"integer"},"fumble_return_yards":{"description":"Yards gained on fumble returns","example":250,"type":"integer"},"first_read_receptions":{"description":"Number of first read receptions","example":5,"type":"integer"},"red_zone_pass_attempts":{"description":"Pass attempts in red zone","example":15,"type":"integer"},"points":{"description":"Total points scored by team","example":5,"type":"integer"},"depth_of_target":{"description":"Average depth of target","example":12.3,"type":"number"},"defensive_interceptions":{"description":"Defensive interceptions","example":5,"type":"integer"},"receiving_two_point_conversions":{"description":"Receiving two-point conversions","example":5,"type":"integer"},"field_goal_yards":{"description":"Yards gained on field goals","example":250,"type":"integer"},"conversion_defense_successes":{"description":"Two-point conversion defensive successes","example":5,"type":"integer"},"blocked_kick_return_touchdowns":{"description":"Touchdowns scored on blocked kick returns","example":5,"type":"integer"},"fanduel_ownership":{"description":"FanDuel ownership percentage","example":12.3,"type":"number"},"draftkings_fantasy_points_ceiling":{"description":"DraftKings fantasy points ceiling","example":18.5,"type":"number"},"first_read_targets":{"description":"Number of first read targets","example":5,"type":"integer"},"special_teams_snap_count":{"description":"Number of special teams snaps played","example":5,"type":"integer"},"out_of_pocket_reason":{"description":"Reason quarterback left the pocket","example":"example_value","type":"string"},"goal_line_touches":{"description":"Number of goal line touches","example":5,"type":"integer"},"receiving_yards_100_plus":{"description":"Number of 100+ yard receiving games","example":250,"type":"integer"},"total_pocket_time":{"description":"Total time spent in pocket","example":12.3,"type":"number"},"interception_return_longest_touchdown":{"description":"Longest interception return for touchdown","example":5,"type":"integer"},"field_goals_attempts":{"description":"Number of field goal attempts","example":15,"type":"integer"},"safeties":{"description":"Number of safeties","example":5,"type":"integer"},"pass_first_downs":{"description":"First downs gained via passing","example":5,"type":"integer"},"red_zone_passing_completions":{"description":"Passing completions in red zone","example":10,"type":"integer"},"net_punt_yards":{"description":"Net punt yards","example":250,"type":"integer"},"kneel_downs":{"description":"Number of kneel downs","example":5,"type":"integer"},"cushion_yards":{"description":"Cushion yards","example":250,"type":"integer"},"punt_yards":{"description":"Total punt yards","example":250,"type":"integer"},"challenges_remaining":{"description":"Number of challenges remaining","example":5,"type":"integer"},"passing_gross_yards":{"description":"Gross passing yards before sacks","example":250,"type":"integer"},"avg_pocket_time":{"description":"Average time in pocket per pass attempt","example":12.3,"type":"number"},"defended_passes":{"description":"Passes defended by defenders","example":5,"type":"integer"},"dropped_pass":{"description":"Number of dropped passes","example":5,"type":"integer"},"rushing_direction":{"description":"Direction of rushing attempt","example":"example_value","type":"string"},"sacks_taken":{"description":"Number of sacks taken by quarterback","example":5,"type":"integer"},"rec_long":{"description":"Longest reception","example":5,"type":"integer"},"yards_after_catch":{"description":"Yards gained after catch","example":250,"type":"integer"},"activated":{"description":"Player was activated to the game-day roster (shipped as 0/1)","example":5,"type":"integer"},"passing_yards":{"description":"Total passing yards thrown by the player/team","example":250,"type":"integer"},"touchdowns":{"description":"Total touchdowns scored","example":5,"type":"integer"},"rushing_fumbles":{"description":"Number of fumbles while rushing","example":5,"type":"integer"},"pre_snap_motion":{"description":"Player pre-snap motion type","example":"example_value","type":"boolean"},"nfl_fantasy_points":{"description":"NFL fantasy points","example":18.5,"type":"number"},"assisted_tackles":{"description":"Number of assisted tackles","example":5,"type":"integer"},"passing_completions":{"description":"Number of completed passes","example":10,"type":"integer"},"sacks":{"description":"Number of sacks (as QB or defensive player)","example":12.3,"type":"number"},"passing_40_plus":{"description":"Passing completions of 40+ yards","example":5,"type":"integer"},"missed_tackle_location":{"description":"Location of missed tackle","example":"example_value","type":"string"},"rushing_longest_touchdown":{"description":"Longest touchdown rush","example":5,"type":"integer"},"penalty_yards":{"description":"Penalty yards assessed","example":250,"type":"integer"},"rushing_tds_40_plus_yards":{"description":"Rushing touchdowns of 40+ yards","example":250,"type":"integer"},"penalties":{"description":"Number of penalties committed","example":5,"type":"integer"},"rushing_yards":{"description":"Total rushing yards gained","example":250,"type":"integer"},"punt_return_yards":{"description":"Punt return yards","example":250,"type":"integer"},"blocked_kicks":{"description":"Number of blocked kicks","example":5,"type":"integer"},"position":{"description":"Player position","example":"example_value","type":"string"},"sack_yards_lost":{"description":"Yards lost on sacks","example":250,"type":"integer"},"kickoff_touchbacks":{"description":"Number of kickoff touchbacks","example":5,"type":"integer"},"def_interception_yards":{"description":"Defensive interception return yards","example":250,"type":"integer"},"rush_long":{"description":"Longest rush","example":5,"type":"integer"},"played":{"description":"Whether the player appeared in the game","example":"example_value","type":"boolean"},"two_point_conversions":{"description":"Number of two-point conversions","example":5,"type":"integer"},"conversion_defense_attempts":{"description":"Two-point conversion defensive attempts","example":15,"type":"integer"},"tackles":{"description":"Total tackles (solo + assisted)","example":5,"type":"integer"},"return_yards":{"description":"Total return yards (kick/punt combined)","example":250,"type":"integer"},"kickoff_return_yards":{"description":"Total yards on kickoff returns (opponent)","example":250,"type":"integer"},"games_played":{"description":"Number of games played in","example":5,"type":"integer"},"receiving_20_plus":{"description":"Receptions of 20+ yards","example":5,"type":"integer"},"field_goals_missed":{"description":"Field goals missed","example":5,"type":"integer"},"draftkings_rating":{"description":"DraftKings player rating","example":98.7,"type":"number"},"pre_snap_alignment":{"description":"Player pre-snap alignment","example":"example_value","type":"string"},"kickoff_inside_20":{"description":"Kickoffs downed inside the 20 yard line","example":5,"type":"integer"},"batted_passes":{"description":"Passes batted down at line of scrimmage","example":5,"type":"integer"},"rushing_avg_yards":{"description":"Average yards per carry","example":12.3,"type":"number"},"interception_long":{"description":"Longest interception return","example":5,"type":"integer"},"special_teams_assisted_tackles":{"description":"Assisted tackles made on special-teams plays (kick and punt coverage)","example":5,"type":"integer"},"time_to_throw":{"description":"Time from snap to ball release in seconds","example":12.3,"type":"number"},"player_id":{"description":"Player identifier","example":"example_value","type":"string"},"kickoff_out_of_bounds":{"description":"Kickoffs out of bounds","example":5,"type":"integer"},"pass_long":{"description":"Longest pass completion","example":5,"type":"integer"},"fanduel_fantasy_points":{"description":"FanDuel fantasy points","example":18.5,"type":"number"},"def_tackles_assisted":{"description":"Defensive assisted tackles","example":5,"type":"integer"},"punts_inside_20":{"description":"Number of punts inside the 20-yard line","example":5,"type":"integer"},"solo_tackles":{"description":"Number of solo tackles","example":5,"type":"integer"},"redzone_passing_attempts":{"description":"Pass attempts in the red zone","example":15,"type":"integer"},"poor_throws":{"description":"Number of poor throws","example":5,"type":"integer"},"opponent_fumble_recovery_touchdowns":{"description":"Touchdowns on opponent fumble recoveries","example":5,"type":"integer"},"opponent_fumble_recoveries":{"description":"Opponent fumble recoveries","example":5,"type":"integer"},"deep_pass_attempts":{"description":"Deep pass attempts","example":15,"type":"integer"},"gross_kickoff_yards":{"description":"Yards gained on gross kickoffs","example":250,"type":"integer"},"qb_knockdowns":{"description":"Times quarterback was knocked down","example":5,"type":"integer"},"passing_attempts_allowed":{"description":"Passing attempts allowed by defense","example":15,"type":"integer"},"misc_solo_tackles":{"description":"Solo tackles made on change-of-possession plays (interception and fumble returns)","example":5,"type":"integer"},"total_tackles":{"description":"Total tackles across every phase of the game -- scrimmage defense plus special teams plus change-of-possession (misc) plays. This is the quantity NFL tackle props are priced and graded on.","example":5,"type":"integer"},"deep_targets":{"description":"Number of deep targets (20+ yards)","example":5,"type":"integer"},"fumbles":{"description":"Total number of fumbles","example":5,"type":"integer"},"fourth_down_stops":{"description":"Fourth down stops recorded by defense","example":5,"type":"integer"},"rushing_two_point_conversions":{"description":"Rushing two-point conversions","example":5,"type":"integer"},"missed_or_broken_tackles":{"description":"Number of missed or broken tackles","example":5,"type":"integer"},"receiving_yards":{"description":"Total receiving yards gained","example":250,"type":"integer"},"fanduel_rating":{"description":"FanDuel player rating","example":98.7,"type":"number"},"separation_type":{"description":"Type of separation","example":"example_value","type":"string"},"pressure_type":{"description":"Pressure type","example":"example_value","type":"string"},"timeouts_used":{"description":"Number of timeouts used","example":5,"type":"integer"},"returns":{"description":"Number of return attempts (kick/punt)","example":5,"type":"integer"},"conversion_passing_attempts":{"description":"Two-point conversion passing attempts","example":15,"type":"integer"},"net_kickoff_yards":{"description":"Yards gained on net kickoffs","example":250,"type":"integer"},"receiving_targets":{"description":"Number of times targeted for a pass","example":5,"type":"integer"},"extra_points_blocked":{"description":"Number of extra points blocked","example":5,"type":"integer"},"receptions":{"description":"Number of receptions/catches","example":5,"type":"integer"},"snap_counts_confirmed":{"description":"Provider confirms the snap counts for this game are final","example":"example_value","type":"boolean"},"motion_at_snap":{"description":"Player motion status at snap","example":"example_value","type":"boolean"},"receiving_fumbles":{"description":"Number of fumbles while receiving","example":5,"type":"integer"},"explosive_runs":{"description":"Number of explosive rushing attempts (10+ yards)","example":5,"type":"integer"},"rushing_40_plus":{"description":"Rushing attempts of 40+ yards","example":5,"type":"integer"},"interceptions":{"description":"Number of interceptions thrown","example":5,"type":"integer"},"quarterback_hits":{"description":"Number of quarterback hits","example":5,"type":"integer"},"interception_return_yards":{"description":"Yards gained on interception returns","example":250,"type":"integer"},"yahoo_fantasy_points_ceiling":{"description":"Yahoo fantasy points ceiling","example":18.5,"type":"number"},"primary_coverage":{"description":"Primary coverage","example":"example_value","type":"boolean"},"secondary_coverage":{"description":"Secondary coverage","example":"example_value","type":"boolean"},"fumbles_recovered":{"description":"Number of fumbles recovered","example":5,"type":"integer"},"rushing_20_plus":{"description":"Rushing attempts of 20+ yards","example":5,"type":"integer"},"throw_away":{"description":"Whether the pass was intentionally thrown away","example":"example_value","type":"boolean"},"field_goal_percentage":{"description":"Field goal percentage (made/attempted)","example":12.3,"type":"number"},"receiving_tds":{"description":"Number of receiving touchdowns","example":2,"type":"integer"},"passes_defended":{"description":"Number of passes defended","example":5,"type":"integer"},"fumble_return_touchdowns":{"description":"Touchdowns scored on fumble returns","example":5,"type":"integer"},"completion_percentage":{"description":"Pass completion percentage","example":12.3,"type":"number"},"interception_worthy_throws":{"description":"Interception worthy throws","example":5,"type":"integer"},"red_zone_targets":{"description":"Number of targets in the red zone","example":5,"type":"integer"},"allowed_pressure":{"description":"Allowed pressure","example":"example_value","type":"boolean"},"kickoff_yards":{"description":"Total kickoff yards","example":250,"type":"integer"},"qb_hurries":{"description":"Times quarterback was hurried","example":5,"type":"integer"},"kickoff_returns":{"description":"Number of kickoff returns by opponents","example":5,"type":"integer"},"passing_two_point_conversions":{"description":"Passing two-point conversions","example":5,"type":"integer"},"first_downs":{"description":"Total first downs (used for passing first downs in SR)","example":5,"type":"integer"},"defensive_touchdowns":{"description":"Number of defensive touchdowns","example":5,"type":"integer"},"opponent_fumble_recovery_yards":{"description":"Yards gained on opponent fumble recoveries","example":250,"type":"integer"},"blocked_kick_returns":{"description":"Number of blocked kick returns","example":5,"type":"integer"},"conversion_rushing_attempts":{"description":"Two-point conversion rushing attempts","example":15,"type":"integer"},"extra_point_return_touchdowns":{"description":"Extra point attempts returned for a touchdown by the defense","example":5,"type":"integer"},"own_fumble_recoveries":{"description":"Own fumble recoveries","example":5,"type":"integer"},"punts_blocked":{"description":"Number of punts blocked","example":5,"type":"integer"},"rush_rate":{"description":"Rush rate (rushing attempts per play)","example":12.3,"type":"number"},"passing_avg_yards":{"description":"Average yards per pass attempt","example":12.3,"type":"number"},"special_teams_solo_tackles":{"description":"Solo tackles made on special-teams plays (kick and punt coverage)","example":5,"type":"integer"},"red_zone_passing_attempts":{"description":"Passing attempts in red zone","example":15,"type":"integer"},"conversion_rushing_successes":{"description":"Two-point conversion rushing successes","example":5,"type":"integer"},"dropped_passes":{"description":"Passes dropped by receivers","example":5,"type":"integer"},"passing_net_yards":{"description":"Net passing yards (gross yards minus sack yards lost)","example":250,"type":"integer"},"rushing_first_downs":{"description":"First downs gained via rushing","example":5,"type":"integer"},"passing_yards_allowed":{"description":"Passing yards allowed by defense","example":250,"type":"integer"},"tackles_for_loss_yards":{"description":"Yards lost on tackles for loss","example":250,"type":"integer"},"punt_touchbacks":{"description":"Number of punt touchbacks","example":5,"type":"integer"},"missed_tackle_cause":{"description":"Cause of missed tackle","example":"example_value","type":"string"},"missed_tackle":{"description":"Number of missed tackles","example":5,"type":"integer"},"own_fumble_recovery_touchdowns":{"description":"Touchdowns on own fumble recoveries","example":5,"type":"integer"},"auction_value":{"description":"Auction draft value","example":12.3,"type":"number"},"rushing_attempts_allowed":{"description":"Rushing attempts allowed by defense","example":15,"type":"integer"},"receiving_first_downs":{"description":"First downs gained via receiving","example":5,"type":"integer"},"fg_long":{"description":"Longest field goal made","example":5,"type":"integer"},"own_fumble_recovery_yards":{"description":"Yards gained on own fumble recoveries","example":250,"type":"integer"},"player_kickoff_return_yards":{"description":"Kickoff return yards recorded by the returning player","example":250,"type":"integer"},"timeouts_remaining":{"description":"Number of timeouts remaining","example":5,"type":"integer"},"defensive_tackles_combined":{"description":"Tackles (solo + assisted) made on scrimmage defense only, excluding special teams and change-of-possession plays","example":5,"type":"integer"},"tackles_for_loss":{"description":"Rushes resulting in tackles for loss","example":5,"type":"integer"},"rushing_attempts":{"description":"Number of rushing attempts","example":15,"type":"integer"},"games_started":{"description":"Number of games started","example":5,"type":"integer"},"rank":{"description":"Player ranking","example":5,"type":"integer"},"fielding_e":{"description":"Fielding errors","example":5,"type":"integer"},"kickoff_onside_successes":{"description":"Successful onside kicks","example":5,"type":"integer"},"scrambles":{"description":"Number of quarterback scrambles","example":5,"type":"integer"},"passing_touchdowns_allowed":{"description":"Passing touchdowns allowed by defense","example":5,"type":"integer"},"passing_tds":{"description":"Number of passing touchdowns","example":2,"type":"integer"},"spikes":{"description":"Number of spiked passes","example":5,"type":"integer"},"punt_return_attempts":{"description":"Punt return attempts","example":15,"type":"integer"},"conversion_passing_successes":{"description":"Two-point conversion passing successes","example":5,"type":"integer"},"deep_pass_completions":{"description":"Deep pass completions (20+ yards)","example":10,"type":"integer"},"forced_fumbles":{"description":"Number of fumbles forced by defender","example":5,"type":"integer"},"interception_touchdowns_thrown":{"description":"Interceptions returned for touchdowns (pick-6s)","example":5,"type":"integer"},"punt_return_touchdowns":{"description":"Punt return touchdowns","example":5,"type":"integer"},"is_out_of_pocket":{"description":"Whether quarterback left the pocket","example":"example_value","type":"boolean"},"passing_yards_300_plus":{"description":"Passing yards over 300","example":250,"type":"integer"},"kickoff_return_attempts":{"description":"Kickoff return attempts","example":15,"type":"integer"},"rushing_yards_allowed":{"description":"Rushing yards allowed by defense","example":250,"type":"integer"},"jersey":{"description":"Player jersey number","example":"example_value","type":"string"},"passing_rating":{"description":"Quarterback passer rating","example":98.7,"type":"number"},"contested_ball":{"description":"Whether the targeted receiver's pass was contested","example":"example_value","type":"boolean"},"field_goals_made":{"description":"Number of field goals made","example":5,"type":"integer"},"interception_return_average":{"description":"Average yards per interception return","example":12.3,"type":"number"},"extra_points_missed":{"description":"Extra points missed","example":5,"type":"integer"},"yahoo_fantasy_points":{"description":"Yahoo fantasy points","example":18.5,"type":"number"},"defensive_snap_count":{"description":"Number of defensive snaps played","example":5,"type":"integer"},"endzone_fumble_recovery_touchdowns":{"description":"Touchdowns from end zone fumble recoveries","example":5,"type":"integer"},"rushing_touchdowns_allowed":{"description":"Rushing touchdowns allowed by defense","example":5,"type":"integer"},"return_tds":{"description":"Number of return touchdowns","example":2,"type":"integer"},"kickoff_endzone":{"description":"Kickoffs reaching the end zone","example":5,"type":"integer"},"snap_count":{"description":"Number of offensive snaps played","example":5,"type":"integer"},"def_sack_yards":{"description":"Defensive sack yards","example":250,"type":"integer"},"batted_pass":{"description":"Number of passes batted down by defense","example":5,"type":"integer"},"route_type":{"description":"Type of route run by receiver","example":"example_value","type":"string"},"receiving_40_plus":{"description":"Receptions of 40+ yards","example":5,"type":"integer"},"passing_tds_40_plus_yards":{"description":"Passing touchdowns of 40+ yards","example":250,"type":"integer"},"fumbles_out_of_bounds":{"description":"Number of fumbles that went out of bounds","example":5,"type":"integer"},"deep_pass_receptions":{"description":"Deep pass receptions","example":5,"type":"integer"},"fumbles_lost":{"description":"Number of fumbles lost to opponent","example":5,"type":"integer"},"fumble_long":{"description":"Longest fumble return","example":5,"type":"integer"},"punt_fair_catch":{"description":"Number of punt fair catches","example":5,"type":"integer"},"is_successful_play":{"description":"Whether the play was successful","example":"example_value","type":"boolean"},"total":{"description":"Over/under total for betting","example":12.3,"type":"number"},"applied_pressure":{"description":"Applied pressure","example":"example_value","type":"boolean"},"rushing_tds":{"description":"Number of rushing touchdowns","example":2,"type":"integer"},"passing_air_yards":{"description":"Total air yards on pass attempts","example":250,"type":"integer"},"punt_average":{"description":"Average yards per punt","example":12.3,"type":"number"},"field_goals_blocked":{"description":"Number of field goals blocked","example":5,"type":"integer"},"created_reception":{"description":"Whether the receiver created the reception through an exceptional play","example":"example_value","type":"boolean"},"shotgun":{"description":"Plays run from shotgun formation","example":5,"type":"integer"},"kickoff_attempts":{"description":"Total kickoff attempts","example":15,"type":"integer"},"yards_after_contact":{"description":"Yards gained after contact","example":250,"type":"integer"},"kickoff_onside_attempts":{"description":"Onside kick attempts","example":15,"type":"integer"},"receiving_tds_40_plus_yards":{"description":"Receiving touchdowns of 40+ yards","example":250,"type":"integer"},"catchable_ball":{"description":"Whether the targeted receiver's pass was catchable","example":"example_value","type":"boolean"},"passing_longest_touchdown":{"description":"Longest touchdown pass","example":5,"type":"integer"},"separation_yards":{"description":"Separation distance in yards from defender","example":12.3,"type":"number"},"spread":{"description":"Point spread for betting","example":12.3,"type":"number"},"draftkings_ownership":{"description":"DraftKings ownership percentage","example":12.3,"type":"number"},"conversion_receiving_successes":{"description":"Two-point conversion receiving successes","example":5,"type":"integer"},"extra_points_made":{"description":"Number of extra points made","example":5,"type":"integer"},"blocked_kick_return_yards":{"description":"Yards gained on blocked kick returns","example":250,"type":"integer"},"passing_completions_allowed":{"description":"Passing completions allowed by defense","example":10,"type":"integer"},"interception_return_touchdowns":{"description":"Touchdowns scored on interception returns","example":5,"type":"integer"},"successful_rush_attempts":{"description":"Number of successful rushing attempts","example":15,"type":"integer"},"passing_20_plus":{"description":"Passing completions of 20+ yards","example":5,"type":"integer"},"broken_tackles":{"description":"Number of broken tackles","example":5,"type":"integer"},"conversion_receiving_attempts":{"description":"Two-point conversion receiving attempts","example":15,"type":"integer"},"deep_receptions":{"description":"Deep receptions (20+ yards)","example":5,"type":"integer"},"misc_assisted_tackles":{"description":"Assisted tackles made on change-of-possession plays (interception and fumble returns)","example":5,"type":"integer"},"rushing_yards_100_plus":{"description":"Number of 100+ yard rushing games","example":250,"type":"integer"},"draftkings_fantasy_points":{"description":"DraftKings fantasy points","example":18.5,"type":"number"},"challenges_used":{"description":"Number of challenges used","example":5,"type":"integer"},"blitzes_faced":{"description":"Number of blitzes faced","example":5,"type":"integer"},"punt_attempts":{"description":"Number of punt attempts","example":15,"type":"integer"},"penalty_first_downs":{"description":"First downs gained via opponent penalties","example":5,"type":"integer"},"declared_inactive":{"description":"Player was on the officially declared inactive list for this game","example":"example_value","type":"boolean"},"kneels":{"description":"Number of quarterback kneels","example":5,"type":"integer"},"fantasy_points_half_ppr":{"description":"Fantasy points in half-PPR scoring","example":18.5,"type":"number"}},"type":"object"},"for_entity_id":{"description":"Common model ID of the player or team these stats belong to","type":"string"},"for_entity_type":{"description":"Type of entity: 'player' for individual athletes, 'team' for team aggregations","type":"string"},"inserted_at":{"description":"Timestamp when this statistics record was first created","format":"date-time","type":"string"},"is_projection":{"description":"true for forecasted/projected stats, false for actual recorded performance","type":"boolean"},"league_id":{"description":"League/competition context for the statistics","type":"string"},"season_stage":{"description":"Stage of the season (e.g., 'REG', 'PRE', 'POST', 'IST', 'PIT', 'SC', 'EX', 'CC', 'CT', 'ALL_STAR')","type":"string"},"season_year":{"description":"Calendar year the season primarily occurs in (e.g., 2024 for 2024-25 NBA season)","type":"integer"},"source":{"description":"Data provider or calculation method (e.g., 'calculated')","type":"string"},"team_id":{"description":"Common model ID of the team (set for player season stats)","format":"uuid","type":"string"},"updated_at":{"description":"Timestamp of the most recent update to these statistics","format":"date-time","type":"string"}},"title":"SeasonScopedStats","type":"object"}}},"description":"SeasonStats Response"},"400":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"bad_request","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/bad_request","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Bad Request"}},"summary":"Show Season Stats","tags":["Stats & Data"]}},"/api/v1/news/league/{league_id}":{"get":{"callbacks":{},"description":"Retrieves news items with flexible filtering options.\n\nThis endpoint supports filtering by entity type and ID to get news for specific\nplayers, teams, events within a league.\n\n## Filtering Examples\n- **Player News**: `?for_entity_type=player&for_entity_id=123e4567-e89b-12d3-a456-426614174000`\n- **Team News**: `?for_entity_type=team&for_entity_id=123e4567-e89b-12d3-a456-426614174001`\n- **Event News**: `?for_entity_type=event&for_entity_id=123e4567-e89b-12d3-a456-426614174002`\n\n## Response Format\nReturns paginated news items sorted by date (newest first), with full content\nincluding all analysis sections, tags, and metadata.\n","operationId":"ApiRestWeb.NewsController.show_by_league","parameters":[{"description":"League ID — accepts a UUID or league abbreviation (e.g., 'NFL', 'NBA')","in":"path","name":"league_id","required":true,"schema":{"example":"NFL","type":"string"}},{"description":"Filter by entity type (player or team)","in":"query","name":"for_entity_type","required":false,"schema":{"enum":["player","event","team"],"example":"player","type":"string"}},{"description":"Filter by entity ID (UUID)","in":"query","name":"for_entity_id","required":false,"schema":{"example":"123e4567-e89b-12d3-a456-426614174000","format":"uuid","type":"string"}},{"description":"Page number for page/per_page pagination. Do not combine with limit/offset.","in":"query","name":"page","required":false,"schema":{"default":1,"minimum":1,"type":"integer"}},{"description":"Number of items per page (max 1000). Do not combine with limit/offset.","in":"query","name":"per_page","required":false,"schema":{"default":50,"maximum":1000,"minimum":1,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"description":"News and insights about sports entities including players, teams, events, and leagues.\n\nNews items provide automated analysis, commentary, and insights based on performance data,\nstatistical trends, and recent activity. Each news item contains multiple types of analysis\ntailored for different audiences including media, fantasy sports, and betting markets.\n","example":{"analysis":"Allen's recent rushing success stems from the Bills' increased use of designed quarterback runs in the red zone, capitalizing on his 6'5\" frame and surprising mobility. This strategic shift has coincided with the team's push for playoff positioning, as the coaching staff recognizes Allen's unique ability to create mismatches against smaller linebackers and defensive backs in short-yardage situations.","author":"Matthew Berry","betting_analysis":"Allen's rushing touchdown prop has moved from +125 to -110 over the past two weeks, reflecting bookmakers' adjustment to his recent red zone usage. The over on his rushing yards has hit in 8 of his last 10 games, creating value for bettors who recognize this trend early.","date":"2024-01-15","edit_history":[{"changes":{"tags":["fantasy_football","playoff_implications","rushing_qb","red_zone"]},"editor_id":"user-456","timestamp":"2024-01-15T12:00:00Z"}],"event_id":"456e7890-f12b-34c5-d678-901234567890","for_entity_id":"123e4567-e89b-12d3-a456-426614174000","for_entity_type":"player","headline":"Josh Allen's Rushing Touchdowns Fuel Fantasy Surge Ahead of Playoffs","id":"123e4567-e89b-12d3-a456-426614174000","inserted_at":"2024-01-15T10:30:00Z","league_id":"32fa944f-b1bd-41b4-bec2-7ab269fde6fc","metadata":{"confidence_score":0.89,"data_sources":["example_provider_a","example_provider_b"],"generation_model":"gpt-4-turbo","processing_time":3.2},"original_content":{"analysis":"Allen's recent rushing success stems from...","headline":"Josh Allen's Rushing Touchdowns Fuel Fantasy Surge Ahead of Playoffs","summary":"Josh Allen has scored 4 rushing touchdowns in his last 3 games...","tags":["fantasy_football","playoff_implications"]},"priority":2,"source":"Example News","summary":"Josh Allen has scored 4 rushing touchdowns in his last 3 games, significantly boosting his fantasy value ahead of the playoffs. His dual-threat ability makes him a premium option for championship weeks, especially with the Bills' favorable upcoming schedule.","tags":["fantasy_football","playoff_implications","rushing_qb","red_zone"],"tenant_id":"ff6332b6-8151-4a13-b20c-bd7b2ab45452","updated_at":"2024-01-15T14:45:00Z"},"properties":{"analysis":{"description":"Detailed breakdown and commentary providing deeper insights","example":"Allen's recent rushing success stems from the Bills' increased use of designed quarterback runs in the red zone, capitalizing on his 6'5\" frame and surprising mobility. This strategic shift has coincided with the team's push for playoff positioning...","type":"string"},"author":{"description":"Content creator attribution","example":"Matthew Berry","type":"string"},"betting_analysis":{"description":"Analysis focused on betting markets, odds, and wagering implications","example":"Allen's rushing touchdown prop has moved from +125 to -110 over the past two weeks, reflecting bookmakers' adjustment to his recent red zone usage. The over on his rushing yards has hit in 8 of his last 10 games...","type":"string"},"date":{"description":"Publication date (typically the date of the analyzed performance or event)","example":"2024-01-15","format":"date","type":"string"},"edit_history":{"description":"Chronological record of manual edits made to the content","items":{"properties":{"changes":{"additionalProperties":true,"description":"Fields that were modified in this edit","type":"object"},"editor_id":{"description":"ID of the person who made the edit","type":"string"},"timestamp":{"description":"When the edit was made","format":"date-time","type":"string"}},"type":"object"},"type":"array"},"entity_tags":{"description":"Entity tags identifying potential entity mentions in the content.\nOnly included when include_entity_tags=true is specified in the request.\n","items":{"properties":{"confidence":{"description":"Confidence score (0.0-1.0) indicating how confident we are this is the right entity","maximum":1.0,"minimum":0.0,"type":"number"},"context":{"description":"Surrounding text context where entity was mentioned","type":"string"},"entity_id":{"description":"Reference to the actual entity","format":"uuid","type":"string"},"entity_name":{"description":"Display name of the entity","type":"string"},"entity_type":{"description":"Type of entity being tagged","enum":["player","team","coach","league","venue"],"type":"string"},"id":{"description":"Unique identifier for this entity tag","format":"uuid","type":"string"},"inserted_at":{"description":"When this entity tag was created","format":"date-time","type":"string"},"mentioned_as":{"description":"The actual text that referenced the entity in the content","type":"string"},"reasoning":{"description":"AI/algorithm reasoning for the tag","type":"string"},"relevance":{"description":"Relevance score (0.0-1.0) indicating how relevant/prominent this entity is in the content","maximum":1.0,"minimum":0.0,"type":"number"},"tag_method":{"description":"Specific method used for tagging (e.g., 'gpt4', 'regex', 'user_edit')","type":"string"},"tag_source":{"description":"Source of the tag (AI analysis, manual tagging, etc.)","enum":["ai","manual","rule_based","hybrid"],"type":"string"}},"required":["id","entity_type","entity_id","entity_name","mentioned_as","confidence","relevance","tag_source","tag_method"],"type":"object"},"type":"array"},"event_id":{"description":"Related event ID (for game recaps and event-specific news)","example":"456e7890-f12b-34c5-d678-901234567890","format":"uuid","type":"string"},"for_entity_id":{"description":"ID of the specific entity (player, team, event, or league) this news covers","example":"123e4567-e89b-12d3-a456-426614174000","format":"uuid","type":"string"},"for_entity_type":{"description":"Type of entity this news item is about","enum":["player","team","event","league"],"example":"player","type":"string"},"headline":{"description":"Headline summarizing the main story or insight","example":"Josh Allen's Rushing Touchdowns Fuel Fantasy Surge Ahead of Playoffs","type":"string"},"id":{"description":"Unique identifier for this news item","format":"uuid","type":"string"},"inserted_at":{"description":"When this news item was created in the system","example":"2024-01-15T10:30:00Z","format":"date-time","type":"string"},"league_id":{"description":"League context for this news item","example":"32fa944f-b1bd-41b4-bec2-7ab269fde6fc","format":"uuid","type":"string"},"metadata":{"additionalProperties":true,"description":"Additional context and system metadata","type":"object"},"original_content":{"additionalProperties":true,"description":"Preserved original content before any manual edits","properties":{"analysis":{"description":"Original analysis","type":"string"},"betting_analysis":{"description":"Original betting analysis","type":"string"},"headline":{"description":"Original headline","type":"string"},"summary":{"description":"Original summary","type":"string"},"tags":{"description":"Original tags","items":{"type":"string"},"type":"array"}},"type":"object"},"priority":{"default":3,"description":"Content priority level (1=breaking news/urgent, 5=routine update)","example":3,"maximum":5,"minimum":1,"type":"integer"},"source":{"description":"Publishing source or platform","example":"Example News","type":"string"},"summary":{"description":"Concise overview of the main points, typically 2-3 sentences","example":"Josh Allen has scored 4 rushing touchdowns in his last 3 games, significantly boosting his fantasy value ahead of the playoffs. His dual-threat ability makes him a premium option for championship weeks, especially with the Bills' favorable upcoming schedule.","type":"string"},"tags":{"description":"Content categorization tags for discovery and filtering","example":["game_recap","fantasy_football","playoff_implications","rushing_qb"],"items":{"type":"string"},"type":"array"},"tenant_id":{"description":"Client tenant this news item belongs to","format":"uuid","type":"string"},"tournament_id":{"description":"Related tournament ID (for tournament-specific news)","format":"uuid","type":"string"},"updated_at":{"description":"When this news item was last modified","example":"2024-01-15T14:45:00Z","format":"date-time","type":"string"}},"required":["id","headline","summary","for_entity_type","for_entity_id","league_id","date"],"title":"News","type":"object"}}},"description":"News Response"},"400":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"bad_request","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/bad_request","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"invalid_api_key","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/invalid_api_key","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"description":"RFC 7807 Problem Details","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence","type":"string"},"error_code":{"description":"Machine-readable error code","example":"not_found","type":"string"},"status":{"description":"HTTP status code","type":"integer"},"suggestions":{"description":"Actionable suggestions to resolve the error","items":{"type":"string"},"type":"array"},"title":{"description":"Short, human-readable summary of the problem type","type":"string"},"type":{"description":"URI reference identifying the problem type","example":"https://docs.sportsstack.com/errors/not_found","type":"string"}},"required":["type","title","status","detail","error_code"],"type":"object"}}},"description":"Not Found"}},"summary":"Get News by League","tags":["Content"]}}},"security":[{"bearerAuth":[]}],"servers":[{"url":"https://api.sportsstack.io","variables":{}}],"tags":[{"description":"Core entity endpoints for sports hierarchy (Sports, Leagues, Teams, Players, Seasons, Events, Tournaments)","name":"Reference"},{"description":"Entity identity mapping endpoints for translating between provider IDs and common model IDs","name":"Mappings"},{"description":"Allowlisted identity enrichment, direct provider mapping, pending reconciliation, and local mapping table sync endpoints","name":"Self-Service"},{"description":"Statistical endpoints for performance data and standings (Event Stats, Season Stats, Standings, Plays, Play Stats)","name":"Stats & Data"},{"description":"Betting market and odds endpoints (Markets, Futures, Odds, Outcomes)","name":"Betting"},{"description":"Settlement confidence endpoints. Includes native SportsStack endpoints (event_id, entity_id) and provider-compatible routes.","name":"Settlement"},{"description":"News and injury information endpoints","name":"Content"},{"description":"Webhook delivery testing and management endpoints","name":"Webhooks"},{"description":"Platform-specific endpoints for data health and dictionary","name":"SportsStack"}]}