statshawk
MCP

Tool Catalog

Fourteen tools, not 250. One tool per concept, league-aware where the concept spans leagues.

One tool per concept.

Statshawk's MCP server exposes a small catalog by design (one tool per concept) so the LLM picks faster and burns fewer context tokens. League-scoped concepts (get_standings, search_games, and get_player_props) take a league parameter; game- and entity-scoped concepts use canonical IDs instead (get_box_score takes a game_id, get_team_roster a team_id, and search_player is global, returning per_… IDs that chain into props); genuinely sport-specific concepts get their own tool (get_mlb_matchups is MLB), while sport-shaped tools serve several sports from one shape (get_play_by_play returns MLB Statcast or NFL drives depending on the contest). Pregame odds are three tools: get_odds_markets (discovery), get_odds_spot (current board), and get_odds_history (paged tape). Injury availability rides get_team_roster and get_player_props, and full per-source history has its own tool (get_injury_history). The list below is generated from the live server's tools/list at build time, and this committed catalog is the fallback when that fetch fails.

14 tools// synced 2026-09-12
get_standings

Use this when the user asks for a league table, standings, records, or where a team sits. Not for single game results (search_games). Get team-match league standings, ranked best-record-first (rank = position in the list, 1-indexed). The shared W/L/T shape covers newer team sports such as AFL, NRL, rugby union, lacrosse, volleyball, water polo, and field hockey when data is ingested. Racing drivers/constructors use separate PointsRank tables in the REST API and are not projected here yet; golf intentionally has no edition standings table. Serves the latest season with completed games — mid-season the live table, offseason the just-completed season — and reports the served season in `season_year` (never an empty upcoming season). Entries carry W/L/T, win_pct, points_for/against, and games_played. `points` is the ranking dimension where the sport has one: NHL `points` = 2*W + OTL (with `otl` = overtime/shootout losses — worth a point, NOT counted in `losses`) and soccer `points` = 3*W + 1*T (tables ranked by points, then goal difference, then goals scored; for soccer read `ties` as draws and points_for/against as goals). Both are null for pct-ranked leagues. Note: conference/division grouping and streak/games-back are not available in the current API — a missing `team_id`/`team_name` on an entry means the standings row has no linked team record.

parameters
leaguestringrequired

Team-match competition code. Racing uses separate drivers/constructors PointsRank tables in the REST API and is not projected by this MCP tool yet; golf intentionally has no edition standings table.

get_box_score

Use this when the user asks who won, the final score, or the stat lines from a specific game, or wants a player's line from recent games (walk several game_ids for a last-N log). Needs a contest id from search_games or get_mlb_matchups. Not for standings or season totals (get_standings, get_player_props). Get a team-match contest (game) box score with per-player stat lines, including newer team sports such as AFL, NRL, and rugby union when data is ingested. Field/individual contest shapes (golf, racing, tennis, MMA) are not projected by this MCP tool yet. `game_id` is a contest id (`cst_...`) — chain it from get_mlb_matchups (`contest`) or search_games (`game_id`). Each player line carries `phases`: an array of `{ phase, measures }`, where `phase` names the stat category (e.g. `baseball_batting`, `baseball_pitching`, `basketball_player_game`) and `measures` is a flat map of canonical, phase-qualified stat keys to values, passed through unchanged from the server — no client-side renaming or filtering. A two-way player (e.g. a pitcher who also bats) appears once with multiple phase entries. `player_name` is resolved server-side for every line (including large NFL boxscores); if it is ever `null`, resolve the `person_id` via search_player.

parameters
game_idstringrequired
search_games

Use this when the user asks what games are on a date, a team's schedule or recent results, or when you need a game id for a box score, play-by-play, or odds. Also the game-discovery step in player workflows: after search_player resolves a name, use this to find the recent game ids for that player's log or recent form. Not for player identity or bio lookup (search_player). Search team-backed match games by league, date, team, and/or status. This includes AFL, NRL, rugby union, lacrosse, volleyball, water polo, and field hockey in addition to the major leagues when those competitions have ingested data. Golf/racing fields and individual/pair contests (ATP/WTA/UFC) use the generalized REST contest surface and are not returned by this tool yet. `date` is applied server-side; `team` (name substring match) and `status` are applied client-side after resolving team names. Returned `game_id` (a `cst_...` contest id) chains into get_box_score / get_play_by_play / get_odds_markets / get_odds_spot / get_odds_history. When building a slate or counting games, EXCLUDE `status: 'postponed'` rows: a postponed game is a real provider record (MLB keeps the original game and issues a NEW id for the makeup), so the same matchup can legitimately appear twice — once postponed, once scheduled. The scheduled/final row is the one that will carry stats. `stage` filters by season stage server-side (preseason/regular/postseason/exhibition/allstar) and each returned game carries its `stage`; omit it to get all stages.

parameters
leaguestringrequired

Team-match competition code, including NBA/MLB/NFL/NHL/soccer and newer team sports such as "afl", "nrl", and "wrwc". Golf/racing fields and individual/pair contests (ATP/WTA/UFC) are generalized contests and are not returned by this MCP tool yet.

datestringoptional
teamstringoptional
statusstringoptional
scheduledin_progressfinalpostponedcancelledsuspended
stagestringoptional

Exact season-stage filter, applied server-side (e.g. "preseason" for NFL August games). Omitted returns all stages.

preseasonregularpostseasonexhibitionallstar
get_team_roster

Use this when the user asks who is on a team or a team's squad, or when you need person_ids for a team's players. Not for one named player (search_player), and not for a confirmed lineup or batting order: this lists associated players, including benched and injured ones; MLB lineups come from get_mlb_matchups. Get a team's roster, the list of players currently associated with the team. Each entry carries `source`: `appearance` means the player recently played for this team (data-confirmed via a game appearance), while `membership` means they are named to the squad but have no recent game appearance on record (benched, not yet debuted, or out). Season stats and game logs are not inlined here; use the returned `person_id` with get_player_props for averages and hit rates. A rostered player who currently has an injury report carries an `injury` object (`status` verbatim from the source, plus `injury_type`, `return_date`, and `source`). The `injury` key is ABSENT when there is no current report; absence is NOT a health guarantee, since injury coverage is only MLB, NFL, NBA, NHL, and WNBA (a player on any other league never carries `injury`). For full injury history and coverage windows, call get_injury_history with the `person_id`. Baseball players carry handedness: `bats` (`L`/`R`/`S` for switch) and `throws` (`L`/`R`). Three states: values = known; `null` = a baseball player whose hand is UNKNOWN, do not infer it from the name, position, or stat line; keys ABSENT = not a baseball player (rosters in other sports carry no handedness keys at all).

parameters
team_idstringrequired
get_play_by_play

Use this when the user asks how a pitcher has been throwing recently, wants pitch-level or plate-appearance detail, batter-vs-pitcher history, or drive-by-drive NFL play data for a game. Needs a contest id from search_games or get_mlb_matchups, plus a person_id from search_player for player filters. Not for season totals. Play-by-play for a contest (`game_id` is a contest id, `cst_...`, from search_games or get_mlb_matchups). SPORT-SHAPED response: MLB serves plate appearances + Statcast pitches (default detail: full); NFL serves drives with nested plays (default detail: standard). Baseball filters: pitcher_id / batter_id (person ids; intersect for H2H) — for pitcher analysis prefer `pitcher_id=X&detail=standard` (~70% smaller, the right shape for K props). Football filters: quarter (5+ = OT), down (1-4), red_zone, scoring_only, team_id (offense). Filters are sport-checked: a baseball filter on a football contest (or vice versa) returns 400 rather than silently ignoring it.

parameters
game_idstringrequired

Contest id (`cst_...`) from search_games or get_mlb_matchups. Despite the param name, this is the contest id, not a raw game UUID.

detailstringoptional

Detail tier — SPORT-SPECIFIC meanings and defaults. MLB (default when omitted: `full`): `sparse` is pitch sequencing only (type, call, count, in-play); `standard` adds velocity + exit velocity; `full` adds spin, plate location, zone, launch angle, distance, trajectory. NFL (default when omitted: `standard`): `sparse` is structured situation fields only (down/distance/yards-to-endzone, flags, clock, score); `standard` adds drive metadata and wallclock; `full` is accepted but currently adds nothing further for plays. For MLB prop analysis prefer `standard` — headline numbers, ~30% smaller than `full`.

sparsestandardfull
pitcher_idstringoptional

Filter to PAs where this pitcher (person id, `per_...`) was on the mound. Combined with `detail=standard` this is the ideal shape for analyzing one pitcher (cuts response ~70% vs. an unfiltered call). BASEBALL ONLY — 400 on a football contest.

batter_idstringoptional

Filter to PAs for this batter (person id, `per_...`). Combined with `pitcher_id` the result is the head-to-head PAs between the two players (usually ~4KB total). BASEBALL ONLY — 400 on a football contest.

quarterintegeroptional

FOOTBALL ONLY: quarter filter, >= 1 (values 5+ are overtime periods). 400 on a baseball contest.

downintegeroptional

FOOTBALL ONLY: down filter, 1-4. 400 on a baseball contest.

red_zonebooleanoptional

FOOTBALL ONLY: only plays snapped inside the red zone (start yards-to-endzone <= 20).

scoring_onlybooleanoptional

FOOTBALL ONLY: scoring plays only.

team_idstringoptional

FOOTBALL ONLY: drives by this offense (team id, `team_...`).

get_odds_markets

Use this when the user asks which betting markets or player props are posted for a game, or before picking a market for a line. Needs a contest id from search_games or get_mlb_matchups. Not for the current line or how a line moved (get_odds_spot, get_odds_history). Cheap discovery: lists markets that have at least one posted pregame line on this contest (`h2h`, `spreads`, `totals`, `team_total`, `player_prop`, plus measure/period when present). Pregame only — nothing after first pitch. Chain into get_odds_spot for the latest board, then get_odds_history only if the user asks how a line moved.

parameters
contest_idstringrequired

Contest id (`cst_...`) from search_games (`game_id`) or get_mlb_matchups (`contest`).

get_odds_spot

Use this when the user asks what the line is: moneyline, spread, total, or a player's current prop for a specific game. Needs a contest id from search_games or get_mlb_matchups. Not for how a line moved (get_odds_history) and not for listing which markets exist (get_odds_markets). Latest pregame board only — one tick per book, closing line at first pitch, never in-play. Optional books / markets / measure / period filters. Optional person_id scopes to that player's posted lines on this contest (person+contest). Prefer this over history for any current-line question. Call get_odds_markets first when the market or measure is unknown.

parameters
contest_idstringrequired

Contest id (`cst_...`) from search_games (`game_id`) or get_mlb_matchups (`contest`).

person_idstringoptional

Optional person id (`per_...`). When set, reads GET /v1/persons/{id}/odds?contest= (person+contest board) instead of the full contest board.

booksstringoptional

Comma-separated sportsbooks (e.g. "pinnacle,draftkings,fanduel").

marketsstringoptional

Comma-separated markets: h2h, spreads, totals, team_total, player_prop (e.g. "h2h,totals").

measurestringoptional

Qualified measure id or alias for player props (e.g. "batting.hr", "pts", "pitching.so").

periodstringoptional

Line period. Omit for every posted period.

fullfirst_halffirst_5_innings
get_odds_history

Use this when the user asks how a line moved, opened, shortened, or was bet down. Needs a contest id plus markets and/or measure. Not for the current line (get_odds_spot) and never for an unscoped person 30-day tape. Newest-first paged pregame poll-tape (stops at first pitch). Requires markets and/or measure — call get_odds_markets or get_odds_spot first. Optional person_id scopes a player-prop tape via the person+contest history route; contest_id is still required. Optional books, period, since, before, cursor, interval (auto|raw|15m|1h). MCP limit defaults to 30 (max 50). Surfaces engine truncated, next_cursor, and next_before. Prefer cursor=next_cursor: it is an opaque, tie-safe engine string — pass it back exactly as received, never construct one. next_before is timestamp-only and can drop same-time leftovers. If truncated, summarize this page and only request older ticks when the user asks. Do not auto-page the whole history.

parameters
contest_idstringrequired

Contest id (`cst_...`) from search_games (`game_id`) or get_mlb_matchups (`contest`).

person_idstringoptional

Optional person id (`per_...`). When set, reads GET /v1/persons/{id}/odds/history?contest= so a player-prop tape is scoped to that person. contest_id is still required.

marketsstringoptional

Comma-separated markets: h2h, spreads, totals, team_total, player_prop (e.g. "h2h,totals").

measurestringoptional

Qualified measure id or alias for player props (e.g. "batting.hr", "pts", "pitching.so").

booksstringoptional

Comma-separated sportsbooks (e.g. "pinnacle,draftkings,fanduel").

periodstringoptional

Line period. Omit for every posted period.

fullfirst_halffirst_5_innings
limitintegeroptional

Max price observations to return. MCP default 30, max 50.

beforestringoptional

Exclusive ISO-8601 upper bound on observed_at. Timestamp window only — not tie-safe. Prefer `cursor` when paging.

cursorstringoptional

Opaque older-page cursor: pass a previous response's `next_cursor` back unchanged. Prefer this over `before` (tie-safe). Do not build or edit cursor strings; their format (currently `raw|{observed_at}|{id}` or `bucket|{start}`) belongs to the engine and may change.

sincestringoptional

Inclusive ISO-8601 lower bound. Only ticks at or after this instant.

intervalstringoptional

Downsample: auto (default), raw (every tick), 15m, or 1h.

autoraw15m1h
search_player

Use this when the user names an athlete and wants anything about them: how they have been pitching or hitting lately, stats, splits, injuries, bio. Resolve the name to a person_id here first, then chain into search_games for game ids and get_play_by_play or get_box_score for the games, or get_player_props or get_injury_history directly. Not for team or league questions. Find a player by fuzzy name match. Search is GLOBAL and cross-sport (no league/team scoping — persons are canonical, not league-scoped). The `name` arg is a case-insensitive partial match. Returned `person_id` chains into get_player_props. This search returns bio only, no injury status; for a player's current injury and full injured-list history, pass the `person_id` to get_injury_history (rostered players also carry a current `injury` object in get_team_roster). Each match also includes bio fields `dob, birth_country, height_inches, weight_lbs`. Baseball players additionally carry handedness: `bats` (`L`/`R`/`S` for switch) and `throws` (`L`/`R`). Three states: values = known; `null` = a baseball player whose hand is UNKNOWN — do not guess it from name, position, or stats; keys ABSENT = not a baseball player, the field does not apply (e.g. soccer or NBA players have no `bats`/`throws` keys at all). Team affiliation is still not part of the person record: use get_team_roster.

parameters
namestringrequired

Fuzzy (case-insensitive, partial) name to search for.

limitintegeroptional

Max results to return (default server-side limit applies if omitted).

get_injury_history

Use this when the user asks whether a player is injured or on the IL, when they return, or how long they were out. Needs a person_id from search_player. Not for a whole team's availability (get_team_roster). A player's full injury history: current status plus derived injured-list intervals. Provide either player_name (resolved via search) or person_id directly (preferred). The response is one block per `source` and the sources are NEVER merged: an ESPN report and an MLB transaction describe the same player from two vantage points, so render them as separate timelines or pick one, never splice them together. Each source reports its own coverage window (`covered_from`, `covered_through`); time OUTSIDE that window is UNKNOWN, not healthy, so do not read a gap before a source began tracking as the player being fine then. Each interval's edges are qualified. `start_kind` is one of `reported` (a dated transaction), `listed` (first seen on the source report), `unknown` (left-censored: already injured when tracking began, so `start` is a bound, not the onset), or `tolerant_open` (a change or transfer arrived with no previously open interval, so the start boundary is inferred and weaker). `close_kind:"activated"` is an official return, `close_kind:"unlisted"` only means the player left the source report (weaker than recovered), and an `end` of null (`close_kind:"open"`) is an ongoing stint. Events sit in a SIBLING `events` array, not nested under intervals: each carries `kind`, `status`, `observed_at` (ingestion time), `effective_date` (when an MLB transaction actually took effect, which differs from `observed_at`), `changed_fields` (which facts moved, e.g. an estimated-return slip), plus `return_date`, `resolution_date`, `detail`, `injury_type`, `il_tier`, and `source_event_id`. `unattached_events` is a source-wide count of events not attached to ANY person (not events that failed to form an interval); it qualifies how confidently an empty history for this player can be read. `status` is source vocabulary (e.g. `Out`, `Questionable`, `Day-To-Day`, `60-Day-IL`, `10-Day-IL`, `Active`), rendered verbatim, not an enum; `Active` is meaningful (on the report but playing), not an error. Coverage: MLB has two sources with real history back to 2024-01-01; NFL, NBA, NHL, and WNBA carry ESPN report transitions only, accruing since 2026-08-28, with no deep history; no other league has injury data. A known-healthy player returns 200 with empty interval and event lists (still with coverage blocks); a 404 means the person id is unknown, never that the player is healthy.

parameters
player_namestringoptional

Resolved to a person via search. Prefer person_id when you have it.

person_idstringoptional

Canonical person id (preferred, skips name resolution).

get_stat_capabilities

Use this when a stat key is rejected, or to learn which stats exist for a sport or a player before calling get_player_props. Not a data tool. Discover the exact stat keys get_player_props accepts for competitions whose sports register player-stat phases. Stat-bearing sports include the major US leagues plus soccer, golf (PGA/LPGA), racing (F1/NASCAR/IndyCar), AFL, NRL, and rugby union. All registered competition codes are accepted, but tennis (ATP/WTA), UFC, lacrosse, volleyball, water polo, and field hockey currently have no registered player-stat phase, so they return an empty phases list and no get_player_props stat keys. Without person_id, lists every phase and its canonical measure ids for a competition (e.g. mlb -> batting + pitching phases). With person_id (and optionally a season START year), returns ONLY the phases that player actually recorded — the definitive fix for "X is not a known stat" errors. Measure ids are canonical and phase-qualified where a sport has multiple phases sharing a base id — collided ids are returned already qualified (`pitching.so` vs `batting.so`); a bare id works when unambiguous. Feed any returned id straight into get_player_props `stat`. Omitting season with person_id uses the current edition.

parameters
leaguestringrequired

League/competition code. Major examples: "mlb", "nba", "nfl", "nhl", "epl". Other registered sports include "pga"/"lpga" (golf), "f1"/"nascar"/"irl" (racing), "atp"/"wta" (tennis), "ufc" (MMA), "afl" (Australian football), "nrl" (rugby league), and "wrwc" (rugby union).

person_idstringoptional

Optional canonical person id (e.g. "per_..."). When provided, returns ONLY the phases this player actually recorded in the given season — the definitive answer to "which stat keys will get_player_props accept for THIS player".

seasonintegeroptional

Season START year (e.g. 2025 = the 2025 MLB season and the 2025-26 NBA/NHL season). Only used with person_id; defaults to the current edition when omitted.

search_docs

Use this when the user asks how to connect StatsHawk, about API keys, plans, quotas, or endpoint reference. Not for sports questions. Search the StatsHawk documentation site (setup guides, REST/MCP API reference, auth, quotas, stat-key reference, and the cookbook). Use it to answer questions about connecting the MCP server, authentication and API keys, plan/quota limits, valid stat keys, and available endpoints. Returns matching doc pages with titles, breadcrumbs, absolute URLs, and text snippets.

parameters
querystringrequired

Free-text docs search, e.g. "how do I authenticate", "quota limits", "pitching stat keys".

limitintegeroptional

Max hits to fetch from the docs index before grouping (default 8).

get_mlb_matchups

Use this when the user asks about today's (or a date's) MLB games, probable starters, confirmed lineups, or platoon matchups. Not for other sports (search_games). MLB pregame matchups for a date (default = today in US Eastern Time). Returns each scheduled game with a `contest` id (chains into get_box_score / get_play_by_play / get_odds_spot), home/away teams, probable starting pitchers (including throwing hand R/L), and confirmed batting lineups (player, position, batting order, bat side L/R). Use this for matchup-based projections — pitcher throws + batter bat_side gives you platoon advantage; batting order tells you projected plate appearances. lineups_available is false when lineups have not yet been posted (typically pre-3-hours-before-first-pitch).

parameters
datestringoptional
get_player_props

Use this when the user asks about a player's averages, hit rates against a line (2+ hits, 20+ points, an over/under), or prop-style projections. Not for a single game's line (get_box_score) or the raw season log. Normal route for every account whose plan includes analysis; the engine decides access, not the plan name. Player-prop analysis card: season/recent/home/away averages and hit rates for an over/under line. Takes an optional `season` start year: without it the card covers the latest edition with completed games, which early in a new season can be this year with zero games for a player; pass last year (NCAAF Week 1: season=2025) to analyse the prior season. ANALYSIS ACCESS: if this account does not include analysis the tool returns 403 TIER_REQUIRES_PAID — do not retry; either upgrade at the link in the error (or, if it says billing setup is incomplete, complete billing setup), or derive hit rates yourself from get_box_score lines across the season (every raw-stats tool is available on every plan). A 429 QUOTA_EXCEEDED means the monthly units are used up; relay its upgrade link. Provide either player_name (resolved to a person via search) or person_id directly (preferred — skips name resolution). Results chain naturally from search_player or from a roster entry's `person_id` field (see get_team_roster). Stat keys are canonical short forms (e.g. `hr`, `reb`, `sog`) and are now phase-qualified where ambiguous — e.g. `pitching.so` for pitcher strikeouts — see the `stat` parameter description for the per-sport list, including AFL, NRL, and rugby union phases. Unknown stat keys return a 400 whose structured error data includes `valid_stats`, `aliases`, and a capabilities endpoint; call get_stat_capabilities for the same discovery surface directly. The `context` field, when non-null, carries sport-tagged analysis context — baseball batting props: platoon splits by opposing starter hand; basketball/hockey props: back-to-back vs rested splits. When the player has a current injury report, the card carries an `injury` object (source `status` verbatim, plus `injury_type`, `return_date`, `source`) and, when a stint is relevant to the sampled games, an `injury_window_flags` object (`games_before_latest_interval`, `latest_interval_days`, `window_spans_interval`, and the `interval`). The `interval` carries its own `source`, which the engine selects relevance-first and so may differ from the current `injury.source`. Those flags are ANNOTATION ONLY, meant to explain a stale-form window (e.g. every sampled game predates a long injured-list stint); they never change `averages`, `hit_rates`, or `games`. Both keys are ABSENT when there is no report or no relevant stint; absence is not a health guarantee, and injury data covers only MLB, NFL, NBA, NHL, and WNBA. For full injury history and coverage windows, call get_injury_history. Note: the old sport-specific context block (k_pct, whiff_rate, exit velo, etc.) and the pre-#215 availability/team_context blocks are no longer included in this response.

parameters
player_namestringoptional
person_idstringoptional
statstringrequired

Canonical stat key. Stat keys are now phase-qualified measure ids where ambiguous — e.g. `pitching.so` for pitcher strikeouts vs a bare `so`/`k` for batter strikeouts. Use the short form where unambiguous — e.g. `hr` not `home_runs`, `reb` not `rebounds`. MLB batter: pa, ab, h, b2, b3, hr, bb, hbp, sf, so, r, rbi, sb, cs; derived: avg, obp, slg, ops, total_bases. There is no `1b` (singles are not stored) — doubles/triples are `b2`/`b3`, not `2b`/`3b`. MLB pitcher: outs, bf, h, er, r, bb, so, hr, pitches, w, l, sv; derived: era, whip, ip. `outs` is the raw count; `ip` derives innings pitched as outs/3. Friendly aliases include `innings_pitched` -> `pitching.ip`, `batters_faced` -> `pitching.bf`, and `pitcher_k` -> `pitching.so`; there is no `hld`. `h`/`r`/`bb`/`so`/`hr` exist in both batting and pitching, so for a pitcher use the qualified form: `pitching.so`, `pitching.h`, `pitching.bb`, `pitching.r`, `pitching.hr`. NBA: min, pts, fgm, fga, tpm, tpa, ftm, fta, oreb, dreb, ast, stl, blk, tov, pf; derived: reb, fg_pct, tp_pct, ft_pct. Three-pointers made is `tpm`, not `3pm`. NHL skater: toi_seconds, goals, assists, plus_minus, sog, hits, blocks, takeaways, giveaways, faceoff_won, faceoff_lost, pim; derived: pts. NHL goalie: toi_seconds, saves, shots_against, goals_against, pim; derived: save_pct. Use the full names — `goals` (not `g`), `assists` (not `a`), `blocks` (not `bs`), `hits` (not `ht`). There are no `ppg`, `ppa`, `shg`, `sha`, `gwg`, or `fo_pct` measures. NFL passing: att, cmp, yards, td, intc, sacked; derived: cmp_pct, yards_per_att, rating. NFL rushing: att, yards, td, fumbles; derived: yards_per_carry. NFL receiving: targets, rec, yards, td; derived: catch_pct, yards_per_rec. `yards`/`td`/`att` collide across all three phases, so use the prefixed forms for skill players — `passing.yards`/`rushing.yards`/`receiving.yards`, `passing.td`/`rushing.td`/`receiving.td` (e.g. a dual-threat RB has both rushing.yards AND receiving.yards). There are no defense or kicking phases — no `int` (defensive), `sacks` (defensive), `solo`, `tfl`, `pd`, `qb_hts`, `fg_made`/`fg_att`, `xp_made`/`xp_att`, `fum`, `lost`, `rtg`, `qbr`, `tot`, or `pts`. QB interceptions thrown are `passing.intc`; sacks taken by a QB are `passing.sacked`. Friendly aliases also accepted: `passing_yards`, `rushing_yards`, `receiving_yards`, `receptions`, `passing_touchdowns`, `rushing_touchdowns`, `receiving_touchdowns`, `completions`, `sacks_taken`. Soccer (EPL/LaLiga/Bundesliga/SerieA/Ligue1/UCL/MLS/FIFA*) outfield: minutes, goals, assists, shots, sot, passes, passes_cmp, tackles, intc, fouls, yellow, red, xg, xa; derived: pass_pct, shot_accuracy. Soccer keeper: minutes, saves, goals_conceded, clean_sheet (season aggregate: clean_sheets); derived: save_pct. Canonical ids are short forms — `goals` (not `total_goals`), `assists` (not `goal_assists`), `shots` (not `total_shots`), `sot` (not `shots_on_target`, though that alias resolves), `yellow`/`red` (not `yellow_cards`/`red_cards`). There are no `offsides`, `own_goals`, `appearances`, `sub_ins`, `fouls_committed`, `fouls_suffered`, or `shots_faced` measures. AFL (`australian_football_player_game`) includes kicks, handballs, goals, behinds, tackles, possessions and clearances components; derived: disposals, marks, possessions, clearances, points, goal_accuracy. NRL (`rugby_league_player_game`) includes tries, try_assists, conversions, penalty_goals, drop_goals, runs, metres, kicks, clean_breaks, offloads, passes, tackles, missed_tackles and cards; derived: points, tackle_pct. Rugby union (`rugby_union_player_game`) adds stored points, defenders_beaten, turnovers_conceded, knock_ons, lineouts, mauls and rucks; derived: tackle_pct. To discover the exact keys a competition or a specific player supports, call get_stat_capabilities.

linenumberoptional
seasonintegeroptional

Optional season START year (2025 = the 2025 MLB/NCAAF season and the 2025-26 NBA/NHL season). Omit for the latest edition with completed games. Pass last year early in a new season, when the current edition has no games yet (NCAAF Week 1: season=2025).

leaguestringrequired

Competition code carrying a registered player-stat phase. In addition to the major leagues and soccer, team-sport phases include "afl", "nrl", and "wrwc". Use get_stat_capabilities before selecting a stat.

Designing for small catalogs

PrincipleWhat it means
League as a parameterCross-league tools take league: "nba" | "mlb" | "nfl" | "nhl" | … instead of shipping per-league copies. Genuinely sport-specific concepts get a dedicated tool (get_mlb_matchups), while sport-shaped tools such as get_play_by_play serve several sports from one shape (MLB Statcast or NFL drives).
Pre-shaped responsesTools return JSON shaped for context windows, not raw dumps. Larger surfaces like play-by-play, full rosters, and injury history stay structured, with filters where the concept supports them (play-by-play, for instance), rather than returning everything at once.
Verbs map to conceptsget_box_score, get_player_props, not box.score.get.v2.
Stable arg namesOnce an arg ships, it doesn't get renamed. New optional args are additive.

If you need a tool we don't ship, email support@statshawk.ai with a use case and we'll evaluate whether it earns a catalog slot.

On this page