Your LLM is wrong
about sports.
Trained models hallucinate teams and rosters. Web search returns hype articles instead of box scores. Raw-stat providers ship JSON dumps that bloat your context. statshawk wires real, normalized stats and pre-computed analysis cards into any LLM. Hosted, OAuth, no BYO key.
Models confidently invent. statshawk returns what's real.
What was Curry's stat line last night vs Miami?
I don't have real-time data on last night's games, but based on his season averages Curry typically scores in the high 20s and shoots well from three. The Heat have a top-10 defense, but he often plays well against them.
What was Curry's stat line last night vs Miami?
Curry went for 28 and 6 assists in last night's 118-112 win over Miami. He shot 4 of 7 from three on 13 total attempts.
// any LLM that supports MCP can call statshawk tools. for non-MCP clients, use the REST API directly. either way, the response is shaped for context, not for a dashboard.
The other way is scraping ESPN.
An LLM can answer this through web search or HTML scraping. It just costs you ~500x more tokens and gets the math wrong. Same question, three sports.
Should I take Mahomes over 249.5 passing yards Sunday?
Mahomes averages around 250 yards, but my math on the recent boxscores might be off.
Should I take Mahomes over 249.5 passing yards Sunday?
Mahomes is over 249.5 in 71% of season games (80% L10), facing a top-10 pass defense Sunday.
// switch sports above. same question, two ways to answer it. one burns context and gets arithmetic wrong. the other returns the prop card pre-computed.
A pitcher-vs-batter matchup, from one API call.
Per-zone hit rates, a swing-and-miss map, and every pitch a starter has thrown a hitter all season — already joined, already shaped. Toggle the metric. Tap or hover a pitch.

Machado hits .636 up over the plate and just .043 up and away. Houser works the cold corners and stays off the barrel.
- Hottest
- up over the plate
- .636
- Coldest
- up and away
- .043
- Top whiff
- down and away, chasing
- 57%
- Go-to
- Sinker
- 12 of 21
Manny Machado's 2026 zone profile (74 games) vs. every pitch Adrian Houser threw him. One get_play_by_play call.
// real Statcast pitch data from get_play_by_play(detail='full'). the same call powers your own zone models, scouting cards, and matchup tools.
The wedge isn't more sports data. It's less work for the LLM.
~15 tools, not 250
One get_player_props that takes a league, not eight league-prefixed copies. Smaller catalog, faster tool selection, fewer context tokens.
Analysis in the surface
Hit rates, defensive ranks, pace-adjusted projections, pre-computed and shaped for your model's context. ~500x fewer tokens than the same answer scraped from ESPN, and the math is already done.
Sign in, no BYO key
OAuth from Claude, Cursor, ChatGPT. We issue and rotate the bearer token. No juggling provider API keys in your MCP config.
One schema, every league. Same key for REST and MCP.
One schema, every league
Normalized box scores, season stats, and standings across NBA, MLB, NFL, and NHL. Stop writing per-provider adapters.
REST + MCP, same auth
Plain HTTP for backends. MCP for LLMs. Same key, same metering, same response shape.
Weight-aware metering
Light lookups cost 1 unit, heavy analysis costs 10. Predictable bills, hard caps, no surprise overage.
Direct from the ingest
Backed by stat-engine, our Rust ingestion pipeline. Fresh data within minutes of the box score posting.