MLB Player Props Desk Construction Spec

Status: IN PROGRESS Started: April 7, 2026 Last Updated: April 7, 2026 (Phase 1+2 complete) Mirrors: MLB Desk Construction Spec


1. Data Sources

Game-Day Props (6/8/10/2/6 ET + 1 min before close)

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

Season Props (adaptive schedule)

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

Awards (adaptive schedule)

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

Stats (shared with game desk — read only)

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

Edge Detection (fires :10 past hour, after data collection)

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

2. Databases (7 files + 4 shared)

Game-Day Props

Season Props

Awards

Edge Detection & Models

Shared (read-only from props desk)


3. Schedules

Game-Day Props Timeline (6 AM, 8 AM, 10 AM, 2 PM, 6 PM ET)

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)

Season Props & Awards Adaptive Schedule

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

Stats (9 AM ET daily — 3 staggered groups)

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

4. Edge Detection

Game-Day Prop Edges

The prop edge scanner compares FanDuel de-vigged fair value against Kalshi prop prices:

  1. FanDuel provides the sharp anchor (over/under line + prices for each prop)
  2. De-vig FD's over/under to get the true probability at the posted line
  3. Build a probability curve from the FD anchor using the appropriate distribution:
  4. Each Kalshi threshold is compared: if Kalshi diverges from FD fair value by more than the fee (7%), it's an edge
  5. DraftKings serves as cross-validation: if FD and DK agree within 2%, confidence is HIGH
  6. Edges tagged with player_sigma, matchup context, scan_type, confidence tier

Prop Probability Curves

Precomputed per player per prop type per game. Stored in mlb_prop_probability_curves table (mirrors mlb_probability_curves from game desk):

Matchup Context Adjustments

Applied to each prop curve before edge detection:

Prop Steam Detection

Detects sharp line movement across books:

Season Props Edge Detection (future)

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.

Awards Edge Detection (future)

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.


5. Dashboard

MLB Player Props Desk Groups

Sub-Views per Prop Type

Each prop type should have its own filtered edge view:


6. Freshness Rules

Freshness Tracker

Same passive poller as game desk (every 5 min). Checks MAX(timestamp) per table.

Thresholds

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

Alerts

Same as game desk: Telegram alert after 2 consecutive misses. Consolidated message.


7. Data Quality Rules

  1. No live/in-game data — Only pre-game props. Games that have started are skipped.
  2. No settled prices — Kalshi bid <=5 or bid >=95 filtered out.
  3. Same-day only — Game-day prop databases only store today's props.
  4. Scan window tagging — Every row tagged with scan_type (6am/8am/10am/2pm/6pm/close).
  5. Player name normalization — Standardize names across FD, DK, Kalshi, MLB Stats API (use player crosswalk).
  6. Minimum volume filter — Kalshi props with 0 volume and spread >30 cents are low-confidence.
  7. FD/DK agreement check — Edges where FD and DK disagree by >10% are flagged LOW confidence.
  8. Rate limiting — Odds API has monthly quota (paid tier). Space calls 1s apart.
  9. Closing snapshots — Fire 1 minute before game start for each game (staggered, not all at once).
  10. Expiry dates — Season prop/award databases have expiry handling. Scanning stops after season ends.

8. Isolation Checklist Status

# 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

9. Build Priority

Phase 1: Foundation — COMPLETE (Apr 7, 2026)

  1. Split FD/DK from shared mlb-prop-lines.db into fd-mlb-props.db and dk-mlb-props.db DONE
  2. Fix player ID crosswalk — parse Kalshi tickers, extract player names DONE
  3. Kill legacy mlb-props-edge-scanner, consolidate to unified scanner DONE
  4. Fix matchup context refresh (broken since Apr 3) — added to Group 3 cron DONE
  5. Split season props from kalshi-mlb-props.db into kalshi-mlb-prop-futures.db DONE
  6. Split awards from kalshi-mlb-futures.db into kalshi-mlb-awards.db DONE

Phase 2: Data Quality — MOSTLY COMPLETE (Apr 7, 2026)

  1. Isolate prop edges from research-pipeline.db into mlb-prop-edges.db DONE
  2. Backfill 3 seasons of game logs (2023-2025) for stable EWMA baselines — PENDING (heavy one-time job)
  3. Wire batter baselines into dashboard views DONE (already tracked)
  4. Refresh umpire K-zone pipeline into matchup context DONE (already in matchup builder)

Phase 3: Models

  1. Build prop probability curves (mirrors mlb_probability_curves pattern)
  2. Player-specific distribution parameters (per-player sigma/CV)
  3. Cross-prop correlation matrix
  4. Manager hook probability model (pitcher K/outs)
  5. Catcher framing integration

Phase 4: Polish

  1. Prop-specific freshness thresholds
  2. Dashboard views for all 7 groups
  3. Isolation checklist — mark all items done
  4. Awards edge detection model
  5. Season props edge detection model

Document Control

This spec mirrors the MLB Desk Construction Spec structure. Updated as the desk is built. Final version when all checklist items pass.

Source: ~/edgeclaw/docs/mlb-player-props-desk-construction-spec.md