Bench Coach — Transparency
Every input to the Bench Coach model — what it is, where it comes from, how often it refreshes, and what it costs. No hidden feeds.
| Source | MLB Stats API (statsapi.mlb.com) |
| Feed | GUMBO live feed v1.1 |
| What we use it for | In-game state: current outs, base runners, score, inning, at-bat, and play-by-play events. Drives the 75-state lead-aware Markov chain input on every pitch. |
| Update cadence | Real-time — polled every 15 seconds |
| Also used for | Daily schedule (game slate), rosters, team standings, starting pitcher confirmation, and lineup cards |
| License / cost | Public / free (MLB official API) |
| Source | Retrosheet |
| What we use it for | Historical play-by-play data (2010–2024) — 2.6 million plate appearances — used to estimate the underlying 25×25 baseline transition matrix; production uses the 75-state lead-aware chain |
| Volume | 2.6M plate appearances across 15 seasons |
| Update cadence | Seasonal — model retrains annually when new season data is released |
| License | Public, non-commercial license (retrosheet.org/notice.htm) |
Retrosheet data is used exclusively for training the underlying 25×25 baseline transition matrix; production uses the 75-state lead-aware Markov chain. The deployed model trains on the full 2010–2024 corpus; calibration metrics come from the post-audit 2017–2025 out-of-sample suite — 361,519 predictions across 20,325 games, Brier 0.1598–0.1677 — see the methodology page for Brier and accuracy figures. No Retrosheet data is queried at runtime.
| Source | The Odds API |
| Tier | Starter 20K (20,000 credits/month) |
| What we use it for | Live sportsbook odds for MLB moneylines and totals (DraftKings, FanDuel, BetMGM, and others). Used for de-vig, expected value (EV) calculation, and Kelly criterion bet sizing. |
| Update cadence | Cached with 5-minute TTL; refreshed on live poller tick |
| License / cost | Commercial API — Starter 20K tier |
| Source | Open-Meteo |
| What we use it for | Game-time weather at 30 MLB stadiums: temperature, wind speed, wind direction (bearing), humidity, and precipitation probability. Wind vector decomposed into blowing-out / blowing-in component relative to each park's home plate bearing. |
| Update cadence | Hourly — pulled before first pitch |
| License / cost | Free tier (non-commercial) |
| Second source | ESPN Injury Feed |
| What we use it for | IL status and injury reports for starting pitchers and key position players. Supplemented by MLB Transactions API for official roster moves. |
| Update cadence | Starting pitcher slot polled every 60 seconds during active game window; injury list polled every 15 minutes |
| License / cost | Public endpoints; terms respected |
| Source | Baseball Savant / Statcast (via pybaseball) |
| What we use it for | Per-batter and per-pitcher outcome distributions (singles, doubles, home runs, strikeouts, walks, groundouts) used to personalize the Markov transition matrix per at-bat via Bayesian blending |
| Volume | 358 batter profiles, 354 pitcher profiles |
| Update cadence | Local-only — refreshed manually and shipped as static cache artifacts |
| Production boundary | Baseball Savant blocks Railway's production IP. Statcast is queried locally only; results are serialized to .json cache files and deployed with the application. |
| License / cost | Public / free (non-commercial) |
Baseball Savant (Statcast) blocks Railway's production IP. Statcast calls do not run from the production server. Batter and pitcher matrices are computed locally via pybaseball, then shipped as static cache artifacts at deploy time. Production reads the cache only — it never calls Statcast directly. The cache is refreshed locally and re-deployed as needed. Player profile data in production is current to the last local refresh, not real-time.
All sources by cadence.
| Source | Cadence | License / Tier |
|---|---|---|
| MLB Stats API | Real-time (15s) | Public / free |
| Retrosheet | Annual (training only) | Non-commercial |
| The Odds API | 5-min cache | Commercial API |
| Open-Meteo | Hourly | Free tier |
| ESPN / MLB Transactions | 60s / 15m | Public / free |
| Baseball Savant | Local cache (seasonal) | Non-commercial |