Status: IN PROGRESS Started: April 7, 2026 Last Updated: April 7, 2026 (Phase 1+2 complete) Mirrors: MLB Desk Construction Spec
| Source | What it provides | Database | Schedule |
|---|---|---|---|
| FanDuel prop lines | Sharp anchor — K, hits, HR, TB, RBI, runs, SB, pitcher outs. Over/under lines + prices | fd-mlb-props.db | :00 past hour |
| DraftKings prop lines | Cross-validation — same prop types, second sharp book | dk-mlb-props.db | :00 past hour |
| Kalshi player props | Soft book — HR, hits, K, TB, H+R+RBI, season stats | kalshi-mlb-props.db | :00 past hour |
| Other books (BetRivers, William Hill, BetOnline) | Additional cross-validation when available | dk-mlb-props.db (secondary table) | :00 past hour |
| Source | What it provides | Database | Schedule |
|---|---|---|---|
| Kalshi Season HR | Per-player season HR totals (KXMLBSEASONHR) | kalshi-mlb-prop-futures.db | Weekly Mon → 3d Jul 27 → daily Sep 1 |
| Kalshi Season Stats | Stat milestones — hits, K, wins, saves (KXMLBSTAT) | kalshi-mlb-prop-futures.db | Same as above |
| Kalshi Stat Counts | Stat count thresholds (KXMLBSTATCOUNT) | kalshi-mlb-prop-futures.db | Same as above |
| Source | What it provides | Database | Schedule |
|---|---|---|---|
| Kalshi AL MVP | AL MVP winner (KXMLBALMVP) | kalshi-mlb-awards.db | Weekly Mon → 3d Jul 27 → daily Sep 1 |
| Kalshi NL MVP | NL MVP winner (KXMLBNLMVP) | kalshi-mlb-awards.db | Same |
| Kalshi AL Cy Young | AL Cy Young (KXMLBALCY) | kalshi-mlb-awards.db | Same |
| Kalshi NL Cy Young | NL Cy Young (KXMLBNLCY) | kalshi-mlb-awards.db | Same |
| Kalshi AL ROY | AL Rookie of the Year (KXMLBALROTY) | kalshi-mlb-awards.db | Same |
| Kalshi NL ROY | NL ROY (KXMLBNLROTY) | kalshi-mlb-awards.db | Same |
| Kalshi AL MOTY | AL Manager OTY (KXMLBALMOTY) | kalshi-mlb-awards.db | Same |
| Kalshi NL MOTY | NL Manager OTY (KXMLBNLMOTY) | kalshi-mlb-awards.db | Same |
| Kalshi AL CPOTY | AL Comeback POT (KXMLBALCPOTY) | kalshi-mlb-awards.db | Same |
| Kalshi NL CPOTY | NL Comeback POT (KXMLBNLCPOTY) | kalshi-mlb-awards.db | Same |
| Kalshi AL Reliever OTY | AL Reliever OTY (KXMLBALRELOTY) | kalshi-mlb-awards.db | Same |
| Kalshi NL Reliever OTY | NL Reliever OTY (KXMLBNLRELOTY) | kalshi-mlb-awards.db | Same |
| Kalshi AL Hank Aaron | AL Hank Aaron Award (KXMLBALHAARON) | kalshi-mlb-awards.db | Same |
| Kalshi NL Hank Aaron | NL Hank Aaron Award (KXMLBNLHAARON) | kalshi-mlb-awards.db | Same |
| Kalshi WS MVP | World Series MVP (KXMLBWSMVP) | kalshi-mlb-awards.db | Same |
| Kalshi HR Derby | HR Derby winner (KXMLBHRDERBY) | kalshi-mlb-awards.db | Same |
| Pinnacle Award Futures | Sharp anchor for awards (if available) | pinnacle-mlb-futures.db (shared) | Same |
| Source | What it provides | Database |
|---|---|---|
| MLB Stats API | Schedule, lineups, probable pitchers | mlb-stats.db |
| SP game logs, baselines | Opposing pitcher quality for batter props | mlb-pitching.db |
| Batter game logs, baselines | Player baselines for all prop types | mlb-batting.db |
| Baseball Savant | Statcast — exit velo, barrel rate, K rate, catcher framing | mlb-pitching.db / mlb-batting.db |
| UmpScorecards | Umpire K-zone tendencies | mlb-stats.db |
| Park factors | HR factor (L/R split), K factor, runs factor | mlb-model.db |
| Weather | Wind, temp — affects HR, total bases | mlb-weather.db |
| Source | What it provides | Database |
|---|---|---|
| Prop Edge Scanner | FD de-vigged fair value vs Kalshi price per prop per player | mlb-prop-edges.db |
| Prop Probability Curves | Distribution-based curves per player per prop type | mlb-prop-edges.db |
| Prop Steam Detection | Sharp line movement, prop removals/additions | mlb-prop-edges.db |
| Matchup Context | Opponent SP quality, park factors, umpire, platoon, fatigue | mlb-prop-model.db |
fd_mlb_prop_lines. Columns: player_name, player_id, market (pitcher_strikeouts, batter_hits, etc.), line, over_price, under_price, game_id, home_team, away_team, game_date, game_time, scan_type, captured_at. Same-day only, scan window gated.dk_mlb_prop_lines. Same schema as FD. Secondary table other_book_prop_lines for BetRivers/WilliamHill/BetOnline when available.kalshi_mlb_props. Columns: ticker, player_name, prop_type, threshold, yes_bid, yes_ask, volume, snapshot_type, captured_at.kalshi_mlb_prop_futures. Columns: ticker, player_name, prop_type (season_hr, season_stat, season_stat_count), threshold, yes_bid, yes_ask, volume, snapshot_type, captured_at.kalshi_mlb_awards. Columns: ticker, award_type (mvp, cy_young, roy, moty, cpoty, reliever_oty, hank_aaron, ws_mvp, hr_derby), league (AL/NL), player_name, yes_bid, yes_ask, volume, snapshot_type, captured_at.player_prop_edges — Edge scanner results per player per prop. Columns: player_name, prop_type, side, line, anchor_line, fd_prob, dk_prob, kalshi_price, execution_price, raw_edge, net_edge, confidence_tier, executable, distribution_type, player_sigma, scan_type, detected_at, actual_outcome, settled_at, closing_price, clv.mlb_prop_probability_curves — Precomputed probability curves per player per prop type. Columns: scan_type, game_date, game_time, player_name, player_id, prop_type, threshold, fd_anchor, dk_anchor, fd_yes, fd_no, edge_yes, edge_no, kalshi_yes, kalshi_no, rung, captured_at.mlb_prop_steam — Steam detection signals. Columns: player_name, market, signal_type, bookmaker, old_line, new_line, line_move, old_price, new_price, price_move, detected_at.prop_edge_summary — Per-day per-prop-type edge counts and averages.prop_baselines — EWMA baselines per player per stat. Columns: player_name, player_id, stat_type, ewma_value, ewma_span, games_used, last_updated.prop_matchup_context — Per-game matchup adjustments. Columns: player_name, game_date, opponent, opp_sp_name, opp_sp_hand, opp_sp_k9, park_hr_factor, park_k_factor, umpire_k_adj, platoon_factor, fatigue_factor, lineup_position, projected_pa.prop_player_variance — Per-player distribution parameters. Columns: player_name, stat_type, mean, sigma, cv, dispersion_ratio, distribution_type (normal/negbin/zip), games_sampled.prop_correlations — Cross-prop correlation matrix. Columns: player_name, stat_a, stat_b, correlation, games_sampled.| Time | What fires |
|---|---|
| :00 | FD prop lines pull, DK prop lines pull, Kalshi props snapshot |
| :03 | Prop steam detection (compare consecutive snapshots) |
| :10 | Prop edge scanner (reads fresh FD/DK/Kalshi, builds curves, finds edges) |
| Game start - 1 min | Closing snapshot (FD + DK + Kalshi) |
| Phase | Dates | Frequency | Time |
|---|---|---|---|
| Phase 1 | Now → Jul 26, 2026 | Every Monday | 6:00 AM (with game futures) |
| Phase 2 | Jul 27 → Aug 31 | Every 3 days | Same |
| Phase 3 | Sep 1 → Sep 27 | Daily | Same |
| Expired | After Sep 27 | Stops scanning | — |
Props desk reads from the shared stats databases populated by the game desk's 3 scraper groups. No separate stats scrape needed.
| Group | Time | What props uses |
|---|---|---|
| Group 1 (9:00 AM) | Raw data | MLB Stats API (schedule, lineups, pitchers), batter game logs, SP game logs, Baseball Savant, UmpScorecards |
| Group 2 (9:05 AM) | Baselines | Batter baselines, SP baselines, player crosswalk, platoon splits |
| Group 3 (9:10 AM) | Derived | Prop matchup context refresh, player variance, prop correlations, prop edge scanner (daily deep scan), prop steam |
The prop edge scanner compares FanDuel de-vigged fair value against Kalshi prop prices:
Precomputed per player per prop type per game. Stored in mlb_prop_probability_curves table (mirrors mlb_probability_curves from game desk):
Applied to each prop curve before edge detection:
Detects sharp line movement across books:
Compare Kalshi season HR/stat totals against projection systems. Anchor from PECOTA, ZiPS, or Steamer projections. Gap between Kalshi price and projection-implied probability = edge.
Compare Kalshi award futures against Pinnacle sharp odds (when available) or consensus power rankings. WAR projections as secondary anchor. Track vote share momentum through season.
Each prop type should have its own filtered edge view:
Same passive poller as game desk (every 5 min). Checks MAX(timestamp) per table.
| Source type | Yellow (stale) | Red (alert) |
|---|---|---|
| FD/DK prop lines (6/8/10/2/6) | 30 min after window | 90 min after window |
| Kalshi props (6/8/10/2/6) | 30 min after window | 90 min after window |
| Season props/awards (adaptive) | 2 days after expected | 7 days after expected |
| Prop edge scanner | 30 min after window | 90 min after window |
| Prop baselines (9 AM) | 60 min after expected | 180 min after expected |
| Matchup context (9 AM) | 60 min after expected | 180 min after expected |
| Steam detection | 60 min after last signal | 180 min after last signal |
Same as game desk: Telegram alert after 2 consecutive misses. Consolidated message.
| # | Item | Status |
|---|---|---|
| 1 | Databases isolated | DONE — fd-mlb-props.db, dk-mlb-props.db, kalshi-mlb-prop-futures.db, kalshi-mlb-awards.db, mlb-prop-model.db created. Dual-write wired. |
| 2 | Scraper queue independent | DONE — Props collector dual-writes to FD/DK DBs, matchup context in Group 3 |
| 3 | Recovery queue | NOT DONE |
| 4 | Freshness tracking | DONE — Kalshi props, prop_futures, awards all tracked via dual-write freshness |
| 5 | Dashboard views | DONE — All new DBs have source-table entries and return 200 |
| 6 | Edge scanner | DONE — Unified scanner writes to mlb-prop-edges.db, legacy scanner removed from cron |
| 7 | Scan windows | DONE — All tagged 6am/8am/10am/2pm/6pm/close |
| 8 | Data cleanliness | PARTIAL — No live data, player name parser added to dual-write |
| 9 | Column formatting | NOT DONE |
| 10 | Filters | PARTIAL — Some prop type filters, not all |
| 11 | No cross-desk dependencies | DONE — Edges isolated to mlb-prop-edges.db, reads shared stats DBs (fine) |
| 12 | Player name crosswalk | DONE — Parser extracts "F. LastName" from Kalshi tickers, writes to player_name column |
| 13 | Alerts | NOT DONE — No prop-specific freshness alerts |
| 14 | Season props isolated | DONE — Reclassified as prop_futures, routes to kalshi-mlb-prop-futures.db |
| 15 | Awards isolated | DONE — Reclassified as awards, routes to kalshi-mlb-awards.db with league extraction |
| 16 | Probability curves | DONE — 5 prop types (K, hits, HR, TB, HRR), FD price + model curve vs Kalshi. 3,333 rows per scan. |
| 17 | Matchup context refresh | DONE — Added to Group 3 cron (9:10 AM), buildMatchupContext() scheduled daily |
This spec mirrors the MLB Desk Construction Spec structure. Updated as the desk is built. Final version when all checklist items pass.