{"components":{"responses":{},"schemas":{"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://a.espncdn.com/photo/2020/0821/200824_nba_kobe_8-24_feed_art_5X2.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":{"common_model_id":{"description":"Unique event identifier in our unified system","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)\n- **Scoring**: home_score, away_score (for team sports)\n- **Details**: Sport-specific data in JSONB format\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":{"distance":8,"down":2,"possession":"away","redzone":false,"timeouts_remaining":{"away":2,"home":3},"yardline":35},"event_id":"123e4567-e89b-12d3-a456-426614174001","home_score":14,"inserted_at":"2024-01-15T15:30:00Z","league":"NFL","period":2,"sport":"football","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 details stored as JSONB. Contents vary significantly by sport.\n\n**Football**: possession, down, distance, yardline, timeouts_remaining, redzone, etc.\n**Basketball**: shot_clock, possession, timeouts_remaining, team_fouls, bonus_situation, etc.\n**Baseball**: count (balls/strikes), outs, runners_on_base, current_batter, etc.\n**Hockey**: power_play, penalty_kill, shots_on_goal, current_penalties, etc.\n**Golf**: current_round, leaderboard_top_3, cut_line, weather, etc.\n\nSee EventScoreboard model documentation for complete field specifications.\n","example":{"distance":7,"down":3,"possession":"home","timeouts_remaining":{"away":3,"home":2},"yardline":25},"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"},"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"},"sport":{"description":"Sport name","enum":["football","basketball","baseball","hockey","golf"],"example":"football","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"},"metadata":{"additionalProperties":true,"description":"Provider-specific event metadata. 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 SportRadar 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 SportRadar identifier (`\"sr:cup_round:…\"`) 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":{"common_model_id":{"description":"Participant ID (references Team or Player)","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"},"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_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"},"status":{"description":"Status of the event: '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` — SportRadar 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"},"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**: sportradar (official), ftn (projections), espn, fantasylabs, etc.\n- **Projections vs Actuals**: is_projection distinguishes forecasts from results\n- **Sport Variation**: data field contains sport/league-specific statistics\n\n## Common Data Sources\n- `\"sportradar\"` - Official SportRadar data feeds\n- `\"ftn\"` - FantasyData/SportsDataIO projections\n- `\"espn\"` - ESPN statistics\n- `\"fantasylabs\"` - FantasyLabs projections\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 SportRadar (\"pass_yds\") and FTN (\"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\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\n- **Receiving**: receiving_yards, receptions, receiving_targets, receiving_tds, dropped_pass, first_read_targets, first_read_receptions, 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\n- **Defense**: fumbles, forced_fumbles, fumbles_recovered, assisted_tackles, solo_tackles, total_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\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\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- **SportRadar**: \"pass_yds\" → \"passing_yards\"\n- **FTN**: \"py\" → \"passing_yards\"\n- **FTN Models**: \"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"},"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"},"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"},"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"},"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"},"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"},"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"},"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"},"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"},"total_tackles":{"description":"Total number of tackles (solo + assisted)","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"},"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"},"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"},"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"},"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"},"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"},"timeouts_remaining":{"description":"Number of timeouts remaining","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"},"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"},"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"},"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"},"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"},"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"},"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"},"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"},"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"},"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"},"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"},"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)\n- **Scoring**: home_score, away_score (for team sports)\n- **Details**: Sport-specific data in JSONB format\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":{"distance":8,"down":2,"possession":"away","redzone":false,"timeouts_remaining":{"away":2,"home":3},"yardline":35},"event_id":"123e4567-e89b-12d3-a456-426614174001","home_score":14,"inserted_at":"2024-01-15T15:30:00Z","league":"NFL","period":2,"sport":"football","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 details stored as JSONB. Contents vary significantly by sport.\n\n**Football**: possession, down, distance, yardline, timeouts_remaining, redzone, etc.\n**Basketball**: shot_clock, possession, timeouts_remaining, team_fouls, bonus_situation, etc.\n**Baseball**: count (balls/strikes), outs, runners_on_base, current_batter, etc.\n**Hockey**: power_play, penalty_kill, shots_on_goal, current_penalties, etc.\n**Golf**: current_round, leaderboard_top_3, cut_line, weather, etc.\n\nSee EventScoreboard model documentation for complete field specifications.\n","example":{"distance":7,"down":3,"possession":"home","timeouts_remaining":{"away":3,"home":2},"yardline":25},"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"},"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"},"sport":{"description":"Sport name","enum":["football","basketball","baseball","hockey","golf"],"example":"football","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"},"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- **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":"ftn","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":"Computed confidence score (0.0-1.0) based on source tier and language certainty","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":"NLP extraction confidence (0.0-1.0). 1.0 for structured data sources","type":"number"},"league_id":{"description":"League context for injury reporting standards","type":"string"},"metadata":{"description":"Additional source metadata (raw text, URL, etc.)","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":"Data provider or reporting source (e.g., 'ftn', 'sportradar', 'team_official')","type":"string"},"source_tier":{"description":"Source reliability tier: 1=official (league API), 2=beat reporter, 3=aggregator, 4=social","enum":[1,2,3,4],"type":"integer"},"status":{"description":"Current injury designation following league injury report standards","enum":["out","questionable","doubtful","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"},"InjuryTimeline":{"description":"A single observation in the injury status timeline. Each entry records what a\nspecific source reported about a player's injury at a point in time.\n","example":{"confidence":0.65,"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":"sportradar.football.nfl","source_tier":3,"status":"questionable","tenant_id":"ff6332b6-8151-4a13-b20c-bd7b2ab45452","updated_at":"2024-09-11T09:00:00Z"},"properties":{"confidence":{"description":"Confidence score (0.0-1.0)","type":"number"},"description":{"description":"Free-text from the source","type":"string"},"id":{"description":"Timeline entry ID","type":"string"},"injury_id":{"description":"Reference to the Gold injury record","type":"string"},"injury_type":{"description":"Body part or condition","type":"string"},"inserted_at":{"description":"When this timeline entry was recorded","format":"date-time","type":"string"},"league_id":{"description":"League context","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","type":"string"},"source":{"description":"Source identifier","type":"string"},"source_tier":{"description":"Source reliability tier (1-4)","type":"integer"},"status":{"description":"Reported injury status","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"},"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","image_url":"https://a.espncdn.com/combiner/i?img=/i/teamlogos/nfl/500/pit.png&h=200&w=200","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"},"image_url":{"description":"League logo or official branding image","type":"string"},"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"},"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- **SportRadar**: Player ID \"sr:player:123456\"\n- **FTN Data**: Player ID \"FTN_45678\"\n- **ESPN**: Player ID \"ESPN_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":"sportradar","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"},"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 name (sportradar, ftn, espn, draftkings, etc.)","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"},"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"},"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: \"sr: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\": \"sportradar\"\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":{"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":{"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","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","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 odds were captured\n\n### Sportsbook Attribution\n- **sportsbook**: Standardized sportsbook name (DraftKings, FanDuel, etc.)\n- **aggregator**: Upstream provider (`the_odds_api`, `sportradar`, etc.) 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":"sportradar.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"},"common_model_id":{"description":"Market ID","type":"string"},"deep_link":{"description":"Desktop sportsbook deep link URL","type":"string"},"fetched_at":{"description":"Timestamp when SportsStack fetched or observed this quote","format":"date-time","nullable":true,"type":"string"},"inserted_at":{"description":"Timestamp of creation","format":"date-time","type":"string"},"metadata":{"description":"Metadata","type":"object"},"mobile_deep_link":{"description":"Mobile/native app deep link URL","type":"string"},"outcome_id":{"description":"Outcome ID","type":"string"},"price":{"description":"Price","type":"number"},"price_type":{"description":"Price format ('decimal', 'american')","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","type":"string"},"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"},"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":"sportradar","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","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 odds were captured\n\n### Sportsbook Attribution\n- **sportsbook**: Standardized sportsbook name (DraftKings, FanDuel, etc.)\n- **aggregator**: Upstream provider (`the_odds_api`, `sportradar`, etc.) 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":"sportradar.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"},"common_model_id":{"description":"Market ID","type":"string"},"deep_link":{"description":"Desktop sportsbook deep link URL","type":"string"},"fetched_at":{"description":"Timestamp when SportsStack fetched or observed this quote","format":"date-time","nullable":true,"type":"string"},"inserted_at":{"description":"Timestamp of creation","format":"date-time","type":"string"},"metadata":{"description":"Metadata","type":"object"},"mobile_deep_link":{"description":"Mobile/native app deep link URL","type":"string"},"outcome_id":{"description":"Outcome ID","type":"string"},"price":{"description":"Price","type":"number"},"price_type":{"description":"Price format ('decimal', 'american')","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","type":"string"},"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"},"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":["sportradar","ftn"],"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":"Rotowire","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":"Rotowire","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"},"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 odds were captured\n\n### Sportsbook Attribution\n- **sportsbook**: Standardized sportsbook name (DraftKings, FanDuel, etc.)\n- **aggregator**: Upstream provider (`the_odds_api`, `sportradar`, etc.) 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":"sportradar.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"},"common_model_id":{"description":"Market ID","type":"string"},"deep_link":{"description":"Desktop sportsbook deep link URL","type":"string"},"fetched_at":{"description":"Timestamp when SportsStack fetched or observed this quote","format":"date-time","nullable":true,"type":"string"},"inserted_at":{"description":"Timestamp of creation","format":"date-time","type":"string"},"metadata":{"description":"Metadata","type":"object"},"mobile_deep_link":{"description":"Mobile/native app deep link URL","type":"string"},"outcome_id":{"description":"Outcome ID","type":"string"},"price":{"description":"Price","type":"number"},"price_type":{"description":"Price format ('decimal', 'american')","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","type":"string"},"updated_at":{"description":"Timestamp when SportsStack last wrote this row","format":"date-time","type":"string"}},"required":["common_model_id","name"],"title":"Odds","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","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 odds were captured\n\n### Sportsbook Attribution\n- **sportsbook**: Standardized sportsbook name (DraftKings, FanDuel, etc.)\n- **aggregator**: Upstream provider (`the_odds_api`, `sportradar`, etc.) 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":"sportradar.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"},"common_model_id":{"description":"Market ID","type":"string"},"deep_link":{"description":"Desktop sportsbook deep link URL","type":"string"},"fetched_at":{"description":"Timestamp when SportsStack fetched or observed this quote","format":"date-time","nullable":true,"type":"string"},"inserted_at":{"description":"Timestamp of creation","format":"date-time","type":"string"},"metadata":{"description":"Metadata","type":"object"},"mobile_deep_link":{"description":"Mobile/native app deep link URL","type":"string"},"outcome_id":{"description":"Outcome ID","type":"string"},"price":{"description":"Price","type":"number"},"price_type":{"description":"Price format ('decimal', 'american')","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","type":"string"},"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"},"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":"Unique play identifier in our unified system","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":"Unique identifier for this specific play","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":"Sequential play number within the event (1-based)","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"},"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_id":{"description":"Specific play this statistic belongs to","type":"string"},"play_number":{"description":"Sequential play number within the event for easy reference","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- **FTN**: \"py\" → \"passing_yards\", \"car\" → \"rushing_attempts\"\n- **SportRadar**: \"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"},"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"},"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"},"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"},"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"},"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"},"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"},"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"},"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"},"total_tackles":{"description":"Total number of tackles (solo + assisted)","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"},"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"},"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"},"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"},"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"},"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"},"timeouts_remaining":{"description":"Number of timeouts remaining","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"},"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"},"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"},"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"},"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"},"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"},"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"},"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"},"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"},"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"},"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"},"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://a.espncdn.com/combiner/i?img=/i/headshots/nba/players/full/1966.png&w=350&h=254","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"},"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"},"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":"SportRadar-specific season metadata","properties":{"name":{"description":"Original SportRadar season name (may be generic like '2014 Season')","example":"2014 Season","type":"string"},"season_code":{"description":"Original SportRadar season type code (REG, PST, AST, etc.)","example":"REG","type":"string"},"status":{"description":"Original SportRadar 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"},"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":"ftn","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- **SportRadar**: Season totals and averages from official feeds\n- **FTN**: Projected season statistics and pace-based forecasts\n- **ESPN**: 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"},"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"},"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"},"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"},"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"},"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"},"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"},"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"},"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"},"total_tackles":{"description":"Total number of tackles (solo + assisted)","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"},"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"},"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"},"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"},"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"},"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"},"timeouts_remaining":{"description":"Number of timeouts remaining","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"},"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"},"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"},"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"},"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"},"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"},"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"},"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"},"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"},"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., 'sportradar', 'ftn', '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"},"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://a.espncdn.com/combiner/i?img=/redesign/assets/img/icons/ESPN-icon-basketball.png&w=64&h=64&scale=crop&cquality=40&location=origin","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"},"Standings":{"description":"Historical standings or rankings snapshot for a specific tenant, entity, season, and season type.\n\nRecords nightly imports from SportRadar and other providers 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":"sr: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"},"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://a.espncdn.com/combiner/i?img=/i/teamlogos/nba/500/lal.png&h=200&w=200","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"},"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"},"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"},"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. `\"sportradar.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":"sr: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":"sr:competitor:12345","team_id":"e2790078-ec3a-4c45-8dc4-5cf173960b2b"},"matchup_source_id":"sr:sport_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":"sr: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":"sr:competitor:12345","team_id":"e2790078-ec3a-4c45-8dc4-5cf173960b2b"},"matchup_source_id":"sr:sport_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":"sr:sport_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"},"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)\n- **Scoring**: home_score, away_score (for team sports)\n- **Details**: Sport-specific data in JSONB format\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":{"distance":8,"down":2,"possession":"away","redzone":false,"timeouts_remaining":{"away":2,"home":3},"yardline":35},"event_id":"123e4567-e89b-12d3-a456-426614174001","home_score":14,"inserted_at":"2024-01-15T15:30:00Z","league":"NFL","period":2,"sport":"football","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 details stored as JSONB. Contents vary significantly by sport.\n\n**Football**: possession, down, distance, yardline, timeouts_remaining, redzone, etc.\n**Basketball**: shot_clock, possession, timeouts_remaining, team_fouls, bonus_situation, etc.\n**Baseball**: count (balls/strikes), outs, runners_on_base, current_batter, etc.\n**Hockey**: power_play, penalty_kill, shots_on_goal, current_penalties, etc.\n**Golf**: current_round, leaderboard_top_3, cut_line, weather, etc.\n\nSee EventScoreboard model documentation for complete field specifications.\n","example":{"distance":7,"down":3,"possession":"home","timeouts_remaining":{"away":3,"home":2},"yardline":25},"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"},"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"},"sport":{"description":"Sport name","enum":["football","basketball","baseball","hockey","golf"],"example":"football","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":"sr: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":"sr:competitor:12345","team_id":"e2790078-ec3a-4c45-8dc4-5cf173960b2b"},"matchup_source_id":"sr:sport_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":"sr: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":"sr:competitor:12345","team_id":"e2790078-ec3a-4c45-8dc4-5cf173960b2b"},"matchup_source_id":"sr:sport_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":"sr:sport_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"},"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"},"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":"sr: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":"sr:competitor:12345","team_id":"e2790078-ec3a-4c45-8dc4-5cf173960b2b"},"matchup_source_id":"sr:sport_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":"sr:sport_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"},"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":"sr: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":"sr:competitor:12345","team_id":"e2790078-ec3a-4c45-8dc4-5cf173960b2b"},"matchup_source_id":"sr:sport_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":"sr: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":"sr:competitor:12345","team_id":"e2790078-ec3a-4c45-8dc4-5cf173960b2b"},"matchup_source_id":"sr:sport_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":"sr:sport_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"}},"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 (OpticOdds fixture_id, SportsDataIO game_id) and OpticOdds 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"},"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 settlement results for an entire event","tags":["Settlement"]}},"/api/v1/events/{id}/linescore":{"get":"ok"},"/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., 'sportradar.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","in":"query","name":"page","required":false,"schema":{"default":1,"minimum":1,"type":"integer"}},{"description":"Number of items per page (max 1000)","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 imports from SportRadar and other providers 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":"sr: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)\n- **Scoring**: home_score, away_score (for team sports)\n- **Details**: Sport-specific data in JSONB format\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":{"distance":8,"down":2,"possession":"away","redzone":false,"timeouts_remaining":{"away":2,"home":3},"yardline":35},"event_id":"123e4567-e89b-12d3-a456-426614174001","home_score":14,"inserted_at":"2024-01-15T15:30:00Z","league":"NFL","period":2,"sport":"football","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 details stored as JSONB. Contents vary significantly by sport.\n\n**Football**: possession, down, distance, yardline, timeouts_remaining, redzone, etc.\n**Basketball**: shot_clock, possession, timeouts_remaining, team_fouls, bonus_situation, etc.\n**Baseball**: count (balls/strikes), outs, runners_on_base, current_batter, etc.\n**Hockey**: power_play, penalty_kill, shots_on_goal, current_penalties, etc.\n**Golf**: current_round, leaderboard_top_3, cut_line, weather, etc.\n\nSee EventScoreboard model documentation for complete field specifications.\n","example":{"distance":7,"down":3,"possession":"home","timeouts_remaining":{"away":3,"home":2},"yardline":25},"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"},"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"},"sport":{"description":"Sport name","enum":["football","basketball","baseball","hockey","golf"],"example":"football","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":"sr: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":"sr:competitor:12345","team_id":"e2790078-ec3a-4c45-8dc4-5cf173960b2b"},"matchup_source_id":"sr:sport_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":"sr: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":"sr:competitor:12345","team_id":"e2790078-ec3a-4c45-8dc4-5cf173960b2b"},"matchup_source_id":"sr:sport_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":"sr:sport_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/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. 'sportradar') 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 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://a.espncdn.com/combiner/i?img=/i/headshots/nba/players/full/1966.png&w=350&h=254","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"},"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"}},"summary":"Show Player","tags":["Reference"]}},"/api/v1/leagues":{"get":{"callbacks":{},"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":"Page number","in":"query","name":"page","required":false,"schema":{"default":1,"minimum":1,"type":"integer"}},{"description":"Number of items per page (max 1000)","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","image_url":"https://a.espncdn.com/combiner/i?img=/i/teamlogos/nfl/500/pit.png&h=200&w=200","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"},"image_url":{"description":"League logo or official branding image","type":"string"},"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/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":"Page number","in":"query","name":"page","required":false,"schema":{"default":1,"minimum":1,"type":"integer"}},{"description":"Number of items per page (max 1000)","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":"SportRadar-specific season metadata","properties":{"name":{"description":"Original SportRadar season name (may be generic like '2014 Season')","example":"2014 Season","type":"string"},"season_code":{"description":"Original SportRadar season type code (REG, PST, AST, etc.)","example":"REG","type":"string"},"status":{"description":"Original SportRadar 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. 'sportradar') 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 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://a.espncdn.com/photo/2020/0821/200824_nba_kobe_8-24_feed_art_5X2.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":{"common_model_id":{"description":"Unique event identifier in our unified system","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)\n- **Scoring**: home_score, away_score (for team sports)\n- **Details**: Sport-specific data in JSONB format\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":{"distance":8,"down":2,"possession":"away","redzone":false,"timeouts_remaining":{"away":2,"home":3},"yardline":35},"event_id":"123e4567-e89b-12d3-a456-426614174001","home_score":14,"inserted_at":"2024-01-15T15:30:00Z","league":"NFL","period":2,"sport":"football","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 details stored as JSONB. Contents vary significantly by sport.\n\n**Football**: possession, down, distance, yardline, timeouts_remaining, redzone, etc.\n**Basketball**: shot_clock, possession, timeouts_remaining, team_fouls, bonus_situation, etc.\n**Baseball**: count (balls/strikes), outs, runners_on_base, current_batter, etc.\n**Hockey**: power_play, penalty_kill, shots_on_goal, current_penalties, etc.\n**Golf**: current_round, leaderboard_top_3, cut_line, weather, etc.\n\nSee EventScoreboard model documentation for complete field specifications.\n","example":{"distance":7,"down":3,"possession":"home","timeouts_remaining":{"away":3,"home":2},"yardline":25},"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"},"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"},"sport":{"description":"Sport name","enum":["football","basketball","baseball","hockey","golf"],"example":"football","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"},"metadata":{"additionalProperties":true,"description":"Provider-specific event metadata. 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 SportRadar 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 SportRadar identifier (`\"sr:cup_round:…\"`) 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":{"common_model_id":{"description":"Participant ID (references Team or Player)","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"},"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_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"},"status":{"description":"Status of the event: '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` — SportRadar 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"}},"summary":"Show Event","tags":["Reference"]}},"/api/v1/sports":{"get":{"callbacks":{},"operationId":"ApiRestWeb.SportController.index","parameters":[{"description":"Filter by sport name","in":"query","name":"name","required":false,"schema":{"type":"string"}},{"description":"Page number","in":"query","name":"page","required":false,"schema":{"default":1,"minimum":1,"type":"integer"}},{"description":"Number of items per page (max 1000)","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://a.espncdn.com/combiner/i?img=/redesign/assets/img/icons/ESPN-icon-basketball.png&w=64&h=64&scale=crop&cquality=40&location=origin","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","in":"query","name":"page","required":false,"schema":{"default":1,"minimum":1,"type":"integer"}},{"description":"Number of items per page (max 1000)","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- **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":"ftn","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":"Computed confidence score (0.0-1.0) based on source tier and language certainty","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":"NLP extraction confidence (0.0-1.0). 1.0 for structured data sources","type":"number"},"league_id":{"description":"League context for injury reporting standards","type":"string"},"metadata":{"description":"Additional source metadata (raw text, URL, etc.)","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":"Data provider or reporting source (e.g., 'ftn', 'sportradar', 'team_official')","type":"string"},"source_tier":{"description":"Source reliability tier: 1=official (league API), 2=beat reporter, 3=aggregator, 4=social","enum":[1,2,3,4],"type":"integer"},"status":{"description":"Current injury designation following league injury report standards","enum":["out","questionable","doubtful","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":"sports_data_io","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"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. 'sportradar' will mean you can pass in the sportradar 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. 'sportradar') 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":"Page number","in":"query","name":"page","required":false,"schema":{"default":1,"minimum":1,"type":"integer"}},{"description":"Number of items per page (max 1000)","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://a.espncdn.com/combiner/i?img=/i/headshots/nba/players/full/1966.png&w=350&h=254","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"},"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/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","in":"query","name":"page","required":false,"schema":{"default":1,"minimum":1,"type":"integer"}},{"description":"Number of items per page (max 1000)","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. `\"sportradar.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":"sr: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":"sr:competitor:12345","team_id":"e2790078-ec3a-4c45-8dc4-5cf173960b2b"},"matchup_source_id":"sr:sport_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":"sr: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":"sr:competitor:12345","team_id":"e2790078-ec3a-4c45-8dc4-5cf173960b2b"},"matchup_source_id":"sr:sport_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":"sr:sport_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/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","in":"query","name":"page","required":false,"schema":{"default":1,"minimum":1,"type":"integer"}},{"description":"Number of items per page (max 1000)","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. 'sportradar') 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**: sportradar (official), ftn (projections), espn, fantasylabs, etc.\n- **Projections vs Actuals**: is_projection distinguishes forecasts from results\n- **Sport Variation**: data field contains sport/league-specific statistics\n\n## Common Data Sources\n- `\"sportradar\"` - Official SportRadar data feeds\n- `\"ftn\"` - FantasyData/SportsDataIO projections\n- `\"espn\"` - ESPN statistics\n- `\"fantasylabs\"` - FantasyLabs projections\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 SportRadar (\"pass_yds\") and FTN (\"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\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\n- **Receiving**: receiving_yards, receptions, receiving_targets, receiving_tds, dropped_pass, first_read_targets, first_read_receptions, 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\n- **Defense**: fumbles, forced_fumbles, fumbles_recovered, assisted_tackles, solo_tackles, total_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\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\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- **SportRadar**: \"pass_yds\" → \"passing_yards\"\n- **FTN**: \"py\" → \"passing_yards\"\n- **FTN Models**: \"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"},"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"},"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"},"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"},"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"},"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"},"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"},"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"},"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"},"total_tackles":{"description":"Total number of tackles (solo + assisted)","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"},"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"},"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"},"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"},"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"},"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"},"timeouts_remaining":{"description":"Number of timeouts remaining","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"},"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"},"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"},"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"},"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"},"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"},"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"},"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"},"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"},"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"},"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 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. 'sportradar') 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","in":"query","name":"page","required":false,"schema":{"default":1,"minimum":1,"type":"integer"}},{"description":"Number of items per page (max 1000)","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":"ftn","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- **SportRadar**: Season totals and averages from official feeds\n- **FTN**: Projected season statistics and pace-based forecasts\n- **ESPN**: 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"},"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"},"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"},"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"},"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"},"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"},"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"},"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"},"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"},"total_tackles":{"description":"Total number of tackles (solo + assisted)","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"},"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"},"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"},"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"},"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"},"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"},"timeouts_remaining":{"description":"Number of timeouts remaining","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"},"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"},"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"},"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"},"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"},"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"},"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"},"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"},"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"},"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., 'sportradar', 'ftn', '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.\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.\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"}],"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":{"enum":["point_spread","total_points"],"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"},"return_source_id_format":{"nullable":true,"type":"string"},"sportsbooks":{"default":["fanduel","draftkings"],"description":"Optional sportsbook fanout. Defaults to the phase-1 direct lane: fanduel + draftkings.","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","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","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","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","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"},"legs":{"items":{"properties":{"market_type":{"enum":["point_spread","total_points"],"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, and session_hint","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","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 direct same-game parlay for an event","tags":["Betting"]}},"/api/v1/event-stats":{"get":{"callbacks":{},"operationId":"ApiRestWeb.EventStatsController.index","parameters":[{"description":"Filter by event ID","in":"query","name":"event_id","required":true,"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. 'sportradar') 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","in":"query","name":"page","required":false,"schema":{"default":1,"minimum":1,"type":"integer"}},{"description":"Number of items per page (max 1000)","in":"query","name":"per_page","required":false,"schema":{"default":200,"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**: sportradar (official), ftn (projections), espn, fantasylabs, etc.\n- **Projections vs Actuals**: is_projection distinguishes forecasts from results\n- **Sport Variation**: data field contains sport/league-specific statistics\n\n## Common Data Sources\n- `\"sportradar\"` - Official SportRadar data feeds\n- `\"ftn\"` - FantasyData/SportsDataIO projections\n- `\"espn\"` - ESPN statistics\n- `\"fantasylabs\"` - FantasyLabs projections\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 SportRadar (\"pass_yds\") and FTN (\"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\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\n- **Receiving**: receiving_yards, receptions, receiving_targets, receiving_tds, dropped_pass, first_read_targets, first_read_receptions, 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\n- **Defense**: fumbles, forced_fumbles, fumbles_recovered, assisted_tackles, solo_tackles, total_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\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\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- **SportRadar**: \"pass_yds\" → \"passing_yards\"\n- **FTN**: \"py\" → \"passing_yards\"\n- **FTN Models**: \"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"},"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"},"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"},"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"},"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"},"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"},"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"},"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"},"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"},"total_tackles":{"description":"Total number of tackles (solo + assisted)","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"},"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"},"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"},"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"},"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"},"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"},"timeouts_remaining":{"description":"Number of timeouts remaining","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"},"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"},"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"},"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"},"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"},"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"},"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"},"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"},"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"},"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"},"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"},"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":{}},"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"}},"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 imports from SportRadar and other providers 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":"sr: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"}},"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":"Page number","in":"query","name":"page","required":false,"schema":{"default":1,"minimum":1,"type":"integer"}},{"description":"Number of items per page (max 1000)","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":"Unique play identifier in our unified system","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":"Unique identifier for this specific play","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":"Sequential play number within the event (1-based)","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 (e.g., the_odds_api, sportradar_sr)","example":"the_odds_api","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":{"sportradar_sr":["sr:market:219"],"the_odds_api":["h2h"]},"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\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 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 the top-level mapping rows by integration/provider (e.g. sportradar / opticodds)","in":"query","name":"integration","required":false,"schema":{"type":"string"}},{"description":"Filter by source ID (ID of the entity in the external integration's system)","in":"query","name":"source_id","required":false,"schema":{"type":"string"}},{"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 (i.e. 'sportradar') without narrowing the top-level rows","in":"query","name":"return_source_id_format","required":false,"schema":{"type":"string"}},{"description":"Page number","in":"query","name":"page","required":false,"schema":{"default":1,"minimum":1,"type":"integer"}},{"description":"Number of items per page (max 1000)","in":"query","name":"per_page","required":false,"schema":{"default":500,"maximum":1000,"minimum":1,"type":"integer"}}],"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- **SportRadar**: Player ID \"sr:player:123456\"\n- **FTN Data**: Player ID \"FTN_45678\"\n- **ESPN**: Player ID \"ESPN_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":"sportradar","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"},"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 name (sportradar, ftn, espn, draftkings, etc.)","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"},"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"},"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 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":"sportradar","value":27.0},{"source":"espn","value":26.0},{"source":"nba","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":["sportradar","espn","nba"]}}},"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":"sportradar","value":22.0},{"source":"espn","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":["sportradar","espn"]}}},"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":"espn","value":21},{"source":"betradar","value":21},{"source":"nba","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":["espn","betradar","nba"]}}},"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":"opticodds","value":13.0},{"source":"nba","value":13.0},{"source":"espn","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":["opticodds","nba","espn"]}}}},"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"},"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":{"source":{"type":"string"},"value":{"type":"number"}},"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"],"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"}},"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":{"entity_id":{"type":"string"},"entity_type":{"type":"string"},"event_id":{"type":"string"},"line":{"type":"number"},"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"}},"summary":"Evaluate settlement confidence for a batch of markets","tags":["Settlement"]}},"/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., 'sportradar.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","in":"query","name":"page","required":false,"schema":{"default":1,"minimum":1,"type":"integer"}},{"description":"Number of items per page (max 1000)","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 imports from SportRadar and other providers 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":"sr: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. 'sportradar') 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":"Page number","in":"query","name":"page","required":false,"schema":{"default":1,"minimum":1,"type":"integer"}},{"description":"Number of items per page (max 1000)","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://a.espncdn.com/combiner/i?img=/i/teamlogos/nba/500/lal.png&h=200&w=200","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"},"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"},"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"}},"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 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","in":"query","name":"page","required":false,"schema":{"default":1,"minimum":1,"type":"integer"}},{"description":"Number of items per page (max 1000)","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":["sportradar","ftn"],"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":"Rotowire","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":"Rotowire","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/grader/odds":{"get":{"callbacks":{},"description":"Drop-in replacement for OpticOdds /grader/odds. Accepts the same query params and returns an OO-compatible response with SportsStack settlement enrichment alongside.","operationId":"ApiRestWeb.Settlement.GraderController.show","parameters":[{"description":"OpticOdds fixture ID","in":"query","name":"fixture_id","required":true,"schema":{"type":"string"}},{"description":"OO market string (e.g., player_points)","in":"query","name":"market","required":true,"schema":{"type":"string"}},{"description":"OO 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":"OO player ID (for player props)","in":"query","name":"player_id","required":false,"schema":{"type":"string"}},{"description":"League abbreviation (optional — inferred from fixture)","in":"query","name":"league","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"examples":{"pending":{"description":"Game still in progress. SportsStack recommends hold. No result yet from either provider.","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":null,"player_score":null,"result":null,"sportsbook":null,"sportsstack":{"action":"hold","agrees_with_opticodds":null,"consensus_value":24.0,"game_phase_factor":0.65,"margin_safety":0.45,"mathematically_locked":false,"provider_count":2,"provider_values":[{"source":"sportradar","value":22.0},{"source":"espn","value":26.0}],"reliability":{"agreement":0.7,"coverage":0.5},"result":null,"settlement_confidence":21.9},"status":"pending"}]}},"settle-loss-with-oo":{"description":"Both SportsStack and OpticOdds 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":"graded"},"player_score":21,"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":"espn","value":21.0},{"source":"betradar","value":21.0},{"source":"nba","value":21.0}],"reliability":{"agreement":1.0,"coverage":1.0},"result":"Lost","settlement_confidence":100.0},"status":"graded"}]}},"settle-win":{"description":"Player prop graded via SportsStack. OpticOdds unavailable (no API key). 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,"player_score":null,"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":"opticodds","value":13.0},{"source":"nba","value":13.0},{"source":"espn","value":13.0}],"reliability":{"agreement":1.0,"coverage":1.0},"result":"Won","settlement_confidence":100.0},"status":"graded"}]}}},"schema":{"properties":{"data":{"items":{"properties":{"away_score":{"nullable":true,"type":"number"},"away_team_display":{"nullable":true,"type":"string"},"fixture_id":{"type":"string"},"graded_at":{"nullable":true,"type":"string"},"home_score":{"nullable":true,"type":"number"},"home_team_display":{"nullable":true,"type":"string"},"line":{"nullable":true,"type":"string"},"market":{"type":"string"},"name":{"type":"string"},"opticodds":{"description":"OpticOdds grading data (null when OO unavailable or not configured)","nullable":true,"properties":{"away_score":{"nullable":true,"type":"number"},"graded_at":{"nullable":true,"type":"string"},"home_score":{"nullable":true,"type":"number"},"player_score":{"nullable":true,"type":"number"},"result":{"nullable":true,"type":"string"},"status":{"type":"string"}},"type":"object"},"player_score":{"nullable":true,"type":"number"},"result":{"description":"Won/Lost/Push/null","nullable":true,"type":"string"},"sportsbook":{"nullable":true,"type":"string"},"sportsstack":{"description":"SportsStack settlement enrichment (null when no recommendation available)","nullable":true,"properties":{"action":{"enum":["settle","caution","hold"],"type":"string"},"agrees_with_opticodds":{"nullable":true,"type":"boolean"},"consensus_value":{"type":"number"},"game_phase_factor":{"type":"number"},"margin_safety":{"type":"number"},"mathematically_locked":{"type":"boolean"},"provider_count":{"type":"integer"},"provider_values":{"items":{"properties":{"source":{"type":"string"},"value":{"type":"number"}},"type":"object"},"type":"array"},"reliability":{"properties":{"agreement":{"type":"number"},"coverage":{"type":"number"}},"type":"object"},"result":{"enum":["Won","Lost","Push"],"nullable":true,"type":"string"},"settlement_confidence":{"type":"number"}},"type":"object"},"status":{"enum":["graded","pending"],"type":"string"}},"type":"object"},"type":"array"}},"type":"object"}}},"description":"Grader response (OO-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"},"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":"OpticOdds - 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","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":"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":{"example":"scheduled","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":"Include source mappings from the specific integration (i.e. 'sportradar') 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 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":"Page number","in":"query","name":"page","required":false,"schema":{"default":1,"minimum":1,"type":"integer"}},{"description":"Number of items per page (max 1000)","in":"query","name":"per_page","required":false,"schema":{"default":100,"maximum":1000,"minimum":1,"type":"integer"}}],"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://a.espncdn.com/photo/2020/0821/200824_nba_kobe_8-24_feed_art_5X2.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":{"common_model_id":{"description":"Unique event identifier in our unified system","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)\n- **Scoring**: home_score, away_score (for team sports)\n- **Details**: Sport-specific data in JSONB format\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":{"distance":8,"down":2,"possession":"away","redzone":false,"timeouts_remaining":{"away":2,"home":3},"yardline":35},"event_id":"123e4567-e89b-12d3-a456-426614174001","home_score":14,"inserted_at":"2024-01-15T15:30:00Z","league":"NFL","period":2,"sport":"football","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 details stored as JSONB. Contents vary significantly by sport.\n\n**Football**: possession, down, distance, yardline, timeouts_remaining, redzone, etc.\n**Basketball**: shot_clock, possession, timeouts_remaining, team_fouls, bonus_situation, etc.\n**Baseball**: count (balls/strikes), outs, runners_on_base, current_batter, etc.\n**Hockey**: power_play, penalty_kill, shots_on_goal, current_penalties, etc.\n**Golf**: current_round, leaderboard_top_3, cut_line, weather, etc.\n\nSee EventScoreboard model documentation for complete field specifications.\n","example":{"distance":7,"down":3,"possession":"home","timeouts_remaining":{"away":3,"home":2},"yardline":25},"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"},"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"},"sport":{"description":"Sport name","enum":["football","basketball","baseball","hockey","golf"],"example":"football","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"},"metadata":{"additionalProperties":true,"description":"Provider-specific event metadata. 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 SportRadar 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 SportRadar identifier (`\"sr:cup_round:…\"`) 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":{"common_model_id":{"description":"Participant ID (references Team or Player)","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"},"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_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"},"status":{"description":"Status of the event: '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` — SportRadar 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"},"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. 'sportradar') 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"}}],"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://a.espncdn.com/combiner/i?img=/i/teamlogos/nba/500/lal.png&h=200&w=200","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"},"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"},"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"},"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":"Page number","in":"query","name":"page","required":false,"schema":{"default":1,"minimum":1,"type":"integer"}},{"description":"Number of items per page (max 1000)","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_id":{"description":"Specific play this statistic belongs to","type":"string"},"play_number":{"description":"Sequential play number within the event for easy reference","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- **FTN**: \"py\" → \"passing_yards\", \"car\" → \"rushing_attempts\"\n- **SportRadar**: \"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"},"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"},"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"},"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"},"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"},"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"},"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"},"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"},"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"},"total_tackles":{"description":"Total number of tackles (solo + assisted)","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"},"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"},"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"},"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"},"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"},"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"},"timeouts_remaining":{"description":"Number of timeouts remaining","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"},"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"},"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"},"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"},"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"},"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"},"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"},"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"},"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"},"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"},"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. 'sportradar') 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: \"sr: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\": \"sportradar\"\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":{"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":{"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","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","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 odds were captured\n\n### Sportsbook Attribution\n- **sportsbook**: Standardized sportsbook name (DraftKings, FanDuel, etc.)\n- **aggregator**: Upstream provider (`the_odds_api`, `sportradar`, etc.) 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":"sportradar.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"},"common_model_id":{"description":"Market ID","type":"string"},"deep_link":{"description":"Desktop sportsbook deep link URL","type":"string"},"fetched_at":{"description":"Timestamp when SportsStack fetched or observed this quote","format":"date-time","nullable":true,"type":"string"},"inserted_at":{"description":"Timestamp of creation","format":"date-time","type":"string"},"metadata":{"description":"Metadata","type":"object"},"mobile_deep_link":{"description":"Mobile/native app deep link URL","type":"string"},"outcome_id":{"description":"Outcome ID","type":"string"},"price":{"description":"Price","type":"number"},"price_type":{"description":"Price format ('decimal', 'american')","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","type":"string"},"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"}},"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 the outcomes for each market in the response.\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":"Include outcomes for each market (true/false, default: false)","in":"query","name":"include_outcomes","required":false,"schema":{"type":"boolean"}},{"description":"Page number","in":"query","name":"page","required":false,"schema":{"default":1,"minimum":1,"type":"integer"}},{"description":"Number of items per page (max 1000)","in":"query","name":"per_page","required":false,"schema":{"default":50,"maximum":1000,"minimum":1,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{}},"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"}},"summary":"List Future Markets","tags":["Betting"]}},"/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 imports from SportRadar and other providers 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":"sr: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 the outcomes 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 for this market (true/false, default: false)","in":"query","name":"include_outcomes","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"content":{"application/json":{}},"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"}},"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\nUse additional filters to narrow results by sportsbook, market type, etc.\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 aggregator (e.g., 'sportradar', 'opticodds', 'oddschecker')","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 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":"Page number","in":"query","name":"page","required":false,"schema":{"default":1,"minimum":1,"type":"integer"}},{"description":"Number of items per page (max 1000)","in":"query","name":"per_page","required":false,"schema":{"default":1000,"maximum":1000,"minimum":1,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{}},"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 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","in":"query","name":"page","required":false,"schema":{"default":1,"minimum":1,"type":"integer"}},{"description":"Number of items per page (max 1000)","in":"query","name":"per_page","required":false,"schema":{"default":1000,"maximum":1000,"minimum":1,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{}},"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/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. 'sportradar') 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**: sportradar (official), ftn (projections), espn, fantasylabs, etc.\n- **Projections vs Actuals**: is_projection distinguishes forecasts from results\n- **Sport Variation**: data field contains sport/league-specific statistics\n\n## Common Data Sources\n- `\"sportradar\"` - Official SportRadar data feeds\n- `\"ftn\"` - FantasyData/SportsDataIO projections\n- `\"espn\"` - ESPN statistics\n- `\"fantasylabs\"` - FantasyLabs projections\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 SportRadar (\"pass_yds\") and FTN (\"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\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\n- **Receiving**: receiving_yards, receptions, receiving_targets, receiving_tds, dropped_pass, first_read_targets, first_read_receptions, 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\n- **Defense**: fumbles, forced_fumbles, fumbles_recovered, assisted_tackles, solo_tackles, total_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\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\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- **SportRadar**: \"pass_yds\" → \"passing_yards\"\n- **FTN**: \"py\" → \"passing_yards\"\n- **FTN Models**: \"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"},"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"},"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"},"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"},"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"},"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"},"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"},"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"},"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"},"total_tackles":{"description":"Total number of tackles (solo + assisted)","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"},"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"},"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"},"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"},"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"},"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"},"timeouts_remaining":{"description":"Number of timeouts remaining","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"},"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"},"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"},"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"},"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"},"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"},"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"},"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"},"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"},"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"},"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"}},"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. 'sportradar') 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://a.espncdn.com/combiner/i?img=/redesign/assets/img/icons/ESPN-icon-basketball.png&w=64&h=64&scale=crop&cquality=40&location=origin","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"}},"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","in":"query","name":"page","required":false,"schema":{"default":1,"minimum":1,"type":"integer"}},{"description":"Number of items per page (max 1000)","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":["sportradar","ftn"],"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":"Rotowire","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":"Rotowire","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 betting markets with optional outcomes and odds data.\n\n## ⚠️ Deprecation Notice\n\nThis endpoint is deprecated. Use `/api/v1/market_odds` for better performance and cleaner API design.\nThe new endpoint automatically includes outcomes and odds data with optimized response structure.\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":"Include outcomes and odds data in the response. When true, returns an optimized flattened structure\nthat provides approximately 80% faster response times compared to the standard nested structure.\n\n**Performance Impact**: Enabling this parameter triggers the optimized query path with:\n- Single database query instead of multiple queries\n- Efficient JOINs with performance indexes\n- Flattened response structure for faster JSON serialization\n- 250 row limit (max per_page) to prevent massive result sets\n","example":true,"in":"query","name":"include_outcomes_and_odds","required":false,"schema":{"type":"boolean"}},{"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 Aggregator ID","example":"sportradar","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":"The format for which field to query by (i.e. 'sportradar' will mean you can pass in the sportradar id) for any [Translatable] field","example":"sportradar","in":"query","name":"query_source_id_format","required":false,"schema":{"type":"string"}},{"description":"Include source mappings from the specific integration (i.e. 'sportradar') will return a source_mappings object with the mappings for the respective objects","example":"sportradar","in":"query","name":"return_source_id_format","required":false,"schema":{"type":"string"}},{"description":"Page number","in":"query","name":"page","required":false,"schema":{"default":1,"minimum":1,"type":"integer"}},{"description":"Number of items per page (max 1000)","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":"sportradar","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","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 odds were captured\n\n### Sportsbook Attribution\n- **sportsbook**: Standardized sportsbook name (DraftKings, FanDuel, etc.)\n- **aggregator**: Upstream provider (`the_odds_api`, `sportradar`, etc.) 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":"sportradar.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"},"common_model_id":{"description":"Market ID","type":"string"},"deep_link":{"description":"Desktop sportsbook deep link URL","type":"string"},"fetched_at":{"description":"Timestamp when SportsStack fetched or observed this quote","format":"date-time","nullable":true,"type":"string"},"inserted_at":{"description":"Timestamp of creation","format":"date-time","type":"string"},"metadata":{"description":"Metadata","type":"object"},"mobile_deep_link":{"description":"Mobile/native app deep link URL","type":"string"},"outcome_id":{"description":"Outcome ID","type":"string"},"price":{"description":"Price","type":"number"},"price_type":{"description":"Price format ('decimal', 'american')","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","type":"string"},"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"},"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 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. 'sportradar') 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","image_url":"https://a.espncdn.com/combiner/i?img=/i/teamlogos/nfl/500/pit.png&h=200&w=200","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"},"image_url":{"description":"League logo or official branding image","type":"string"},"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"}},"summary":"Show League","tags":["Reference"]}},"/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, ir, suspended, pup)","in":"query","name":"status","required":false,"schema":{"type":"string"}},{"description":"Filter by source (e.g. sportradar.baseball.mlb, rotowire.basketball.nba)","in":"query","name":"source","required":false,"schema":{"type":"string"}},{"description":"Include all players with an active 'status' (out, questionable, doubtful, ir, suspended, pup)","in":"query","name":"with_injury_designation","required":false,"schema":{"type":"boolean"}},{"description":"Filter by source tier (1=official, 2=beat reporter, 3=aggregator, 4=social)","in":"query","name":"source_tier","required":false,"schema":{"type":"integer"}},{"description":"Page number","in":"query","name":"page","required":false,"schema":{"default":1,"minimum":1,"type":"integer"}},{"description":"Number of items per page (max 1000)","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- **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":"ftn","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":"Computed confidence score (0.0-1.0) based on source tier and language certainty","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":"NLP extraction confidence (0.0-1.0). 1.0 for structured data sources","type":"number"},"league_id":{"description":"League context for injury reporting standards","type":"string"},"metadata":{"description":"Additional source metadata (raw text, URL, etc.)","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":"Data provider or reporting source (e.g., 'ftn', 'sportradar', 'team_official')","type":"string"},"source_tier":{"description":"Source reliability tier: 1=official (league API), 2=beat reporter, 3=aggregator, 4=social","enum":[1,2,3,4],"type":"integer"},"status":{"description":"Current injury designation following league injury report standards","enum":["out","questionable","doubtful","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. 'sportradar') 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. `\"sportradar.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":"sr: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":"sr:competitor:12345","team_id":"e2790078-ec3a-4c45-8dc4-5cf173960b2b"},"matchup_source_id":"sr:sport_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":"sr: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":"sr:competitor:12345","team_id":"e2790078-ec3a-4c45-8dc4-5cf173960b2b"},"matchup_source_id":"sr:sport_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":"sr:sport_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"},"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\": \"sportradar\"\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 Aggregator ID","example":"sportradar","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. 'sportradar' will mean you can pass in the sportradar id) for any [Translatable] field","example":"sportradar","in":"query","name":"query_source_id_format","required":false,"schema":{"type":"string"}},{"description":"Include source mappings from the specific integration (i.e. 'sportradar') will return a source_mappings object with the mappings for the respective objects","example":"sportradar","in":"query","name":"return_source_id_format","required":false,"schema":{"type":"string"}},{"description":"Page number","in":"query","name":"page","required":false,"schema":{"default":1,"minimum":1,"type":"integer"}},{"description":"Number of items per page (max 1000)","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":"sportradar","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","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 odds were captured\n\n### Sportsbook Attribution\n- **sportsbook**: Standardized sportsbook name (DraftKings, FanDuel, etc.)\n- **aggregator**: Upstream provider (`the_odds_api`, `sportradar`, etc.) 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":"sportradar.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"},"common_model_id":{"description":"Market ID","type":"string"},"deep_link":{"description":"Desktop sportsbook deep link URL","type":"string"},"fetched_at":{"description":"Timestamp when SportsStack fetched or observed this quote","format":"date-time","nullable":true,"type":"string"},"inserted_at":{"description":"Timestamp of creation","format":"date-time","type":"string"},"metadata":{"description":"Metadata","type":"object"},"mobile_deep_link":{"description":"Mobile/native app deep link URL","type":"string"},"outcome_id":{"description":"Outcome ID","type":"string"},"price":{"description":"Price","type":"number"},"price_type":{"description":"Price format ('decimal', 'american')","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","type":"string"},"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"},"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. 'sportradar')","in":"query","name":"return_source_id_format","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- **SportRadar**: Player ID \"sr:player:123456\"\n- **FTN Data**: Player ID \"FTN_45678\"\n- **ESPN**: Player ID \"ESPN_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":"sportradar","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"},"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 name (sportradar, ftn, espn, draftkings, etc.)","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"},"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"}},"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":"Page number","in":"query","name":"page","required":false,"schema":{"default":1,"minimum":1,"type":"integer"}},{"description":"Number of items per page (max 1000)","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_id":{"description":"Specific play this statistic belongs to","type":"string"},"play_number":{"description":"Sequential play number within the event for easy reference","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- **FTN**: \"py\" → \"passing_yards\", \"car\" → \"rushing_attempts\"\n- **SportRadar**: \"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"},"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"},"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"},"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"},"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"},"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"},"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"},"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"},"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"},"total_tackles":{"description":"Total number of tackles (solo + assisted)","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"},"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"},"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"},"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"},"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"},"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"},"timeouts_remaining":{"description":"Number of timeouts remaining","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"},"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"},"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"},"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"},"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"},"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"},"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"},"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"},"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"},"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"},"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/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 (e.g., sportradar, ftn)","example":"sportradar","in":"query","name":"provider","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"items":{"properties":{"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":{"ftn":["py","passing_yards"],"sportradar":["pass_yds","passing_yards"]},"type":"object"},"sport":{"description":"Sport this stat applies to","example":"football","type":"string"}},"type":"object"},"type":"array"},"meta":{"properties":{"categories":{"description":"List of stat categories","items":{"type":"string"},"type":"array"},"providers":{"description":"List of providers with mappings","items":{"type":"string"},"type":"array"},"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/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. 'sportradar') 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 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":"SportRadar-specific season metadata","properties":{"name":{"description":"Original SportRadar season name (may be generic like '2014 Season')","example":"2014 Season","type":"string"},"season_code":{"description":"Original SportRadar season type code (REG, PST, AST, etc.)","example":"REG","type":"string"},"status":{"description":"Original SportRadar 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"}},"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","in":"query","name":"page","required":false,"schema":{"default":1,"minimum":1,"type":"integer"}},{"description":"Number of items per page (max 1000)","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_id":{"description":"Specific play this statistic belongs to","type":"string"},"play_number":{"description":"Sequential play number within the event for easy reference","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- **FTN**: \"py\" → \"passing_yards\", \"car\" → \"rushing_attempts\"\n- **SportRadar**: \"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"},"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"},"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"},"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"},"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"},"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"},"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"},"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"},"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"},"total_tackles":{"description":"Total number of tackles (solo + assisted)","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"},"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"},"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"},"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"},"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"},"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"},"timeouts_remaining":{"description":"Number of timeouts remaining","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"},"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"},"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"},"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"},"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"},"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"},"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"},"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"},"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"},"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"},"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)\n- **Scoring**: home_score, away_score (for team sports)\n- **Details**: Sport-specific data in JSONB format\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":{"distance":8,"down":2,"possession":"away","redzone":false,"timeouts_remaining":{"away":2,"home":3},"yardline":35},"event_id":"123e4567-e89b-12d3-a456-426614174001","home_score":14,"inserted_at":"2024-01-15T15:30:00Z","league":"NFL","period":2,"sport":"football","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 details stored as JSONB. Contents vary significantly by sport.\n\n**Football**: possession, down, distance, yardline, timeouts_remaining, redzone, etc.\n**Basketball**: shot_clock, possession, timeouts_remaining, team_fouls, bonus_situation, etc.\n**Baseball**: count (balls/strikes), outs, runners_on_base, current_batter, etc.\n**Hockey**: power_play, penalty_kill, shots_on_goal, current_penalties, etc.\n**Golf**: current_round, leaderboard_top_3, cut_line, weather, etc.\n\nSee EventScoreboard model documentation for complete field specifications.\n","example":{"distance":7,"down":3,"possession":"home","timeouts_remaining":{"away":3,"home":2},"yardline":25},"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"},"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"},"sport":{"description":"Sport name","enum":["football","basketball","baseball","hockey","golf"],"example":"football","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 status observations for a player.","operationId":"ApiRestWeb.InjuryController.timeline","parameters":[{"description":"Player ID (common_model_id)","in":"path","name":"player_id","required":true,"schema":{"type":"string"}},{"description":"Page number","in":"query","name":"page","required":false,"schema":{"default":1,"minimum":1,"type":"integer"}},{"description":"Number of items per page (max 1000)","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 observation in the injury status timeline. Each entry records what a\nspecific source reported about a player's injury at a point in time.\n","example":{"confidence":0.65,"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":"sportradar.football.nfl","source_tier":3,"status":"questionable","tenant_id":"ff6332b6-8151-4a13-b20c-bd7b2ab45452","updated_at":"2024-09-11T09:00:00Z"},"properties":{"confidence":{"description":"Confidence score (0.0-1.0)","type":"number"},"description":{"description":"Free-text from the source","type":"string"},"id":{"description":"Timeline entry ID","type":"string"},"injury_id":{"description":"Reference to the Gold injury record","type":"string"},"injury_type":{"description":"Body part or condition","type":"string"},"inserted_at":{"description":"When this timeline entry was recorded","format":"date-time","type":"string"},"league_id":{"description":"League context","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","type":"string"},"source":{"description":"Source identifier","type":"string"},"source_tier":{"description":"Source reliability tier (1-4)","type":"integer"},"status":{"description":"Reported injury status","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 aggregator","in":"query","name":"aggregator","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"},"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":["sportradar","ftn"],"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":"Rotowire","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":"Rotowire","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. 'sportradar') 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":"ftn","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- **SportRadar**: Season totals and averages from official feeds\n- **FTN**: Projected season statistics and pace-based forecasts\n- **ESPN**: 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"},"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"},"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"},"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"},"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"},"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"},"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"},"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"},"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"},"total_tackles":{"description":"Total number of tackles (solo + assisted)","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"},"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"},"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"},"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"},"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"},"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"},"timeouts_remaining":{"description":"Number of timeouts remaining","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"},"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"},"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"},"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"},"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"},"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"},"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"},"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"},"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"},"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., 'sportradar', 'ftn', '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"}},"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","in":"query","name":"page","required":false,"schema":{"default":1,"minimum":1,"type":"integer"}},{"description":"Number of items per page (max 1000)","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":["sportradar","ftn"],"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":"Rotowire","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":"Rotowire","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":"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 for OpticOdds, SportsDataIO, etc.","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"}]}