Backtest your MLB model on 9,463 real Pinnacle lines.
Full-game total and run line, both prices, the exact time of every snapshot, the final score and the settled result. Every price was captured before the actual first pitch. One clean file, ready for pandas.
Choose your option
Same columns for every season. The price covers the file as it is at purchase time, unless marked “updated”.
One season
To test an idea on one specific season.
Download link valid 72 h, 5 downloads
Buy season 2026All seasons
2023 → 2026 in one download.
- 9,463 games, one file per season + a combined file
- 2026 from April 12 (2,210 games, 91% of the season), final file
- CSV + Parquet, detailed README
Download link valid 72 h, 5 downloads
Buy — €79MLB Complete Pack
All 5 datasets, all seasons.
- Full-Game Odds
- First 5 Innings
- First inning · NRFI
- Modeling Features
- Line Movements
The Pinnacle line ladder
For every total line Pinnacle posted, the share of games that finished over, exactly on the line, or under. 2023-2026, lines posted on at least 90 games.
| LINE | GAMES | Over | Push (on the line) | Under |
|---|---|---|---|---|
| 7 | 553 | 43.4% | 13.9% | 42.7% |
| 7.5 | 1,425 | 49.8% | 0.0% | 50.2% |
| 8 | 1,833 | 46.9% | 6.8% | 46.4% |
| 8.5 | 2,281 | 49.9% | 0.0% | 50.1% |
| 9 | 1,730 | 42.5% | 10.1% | 47.5% |
| 9.5 | 785 | 50.6% | 0.0% | 49.4% |
| 10 | 291 | 44.3% | 8.2% | 47.4% |
| 10.5 | 177 | 50.8% | 0.0% | 49.2% |
| 11 | 122 | 44.3% | 7.4% | 48.4% |
Built for modelers
One row per game, a unique join key (game_pk), explicit column names. Spend your time on the model, not on cleaning.
Backtest a totals model
Hold your run projections against the Pinnacle line and the settled result, season by season.
import pandas as pd
df = pd.read_parquet("mlb_fullgame_odds_pinnacle_2023_2026.parquet")
df[df.pinnacle_ft_total_line == 8.5]Study the run line
−1.5 / +1.5 run line, both prices, cover result: measure how the market prices favourites.
df.groupby("pinnacle_spread_line")
.spread_result.value_counts(normalize=True)Calibrate against Pinnacle
Pinnacle is the market benchmark. Remove its margin with both prices and compare your probabilities with its own.
p_o = 1 / df.pinnacle_ft_over_price
p_u = 1 / df.pinnacle_ft_under_price
fair_over = p_o / (p_o + p_u)Every price is timestamped. Captured before first pitch.
Every row carries the exact time of the snapshot. Every snapshot was checked against the official first-pitch time published by MLB: we keep the last one strictly before the actual first pitch, never more than 96 h earlier.
These are pre-match prices, not closing lines — and we do not claim otherwise. Lead time varies by season: filter it yourself with the timestamp.
The 2026 season starts on 2026-04-12: from March 25 to April 11 the captured prices were corrupt (both sides ≈ 1.02) — we dropped them rather than ship them.
What's in the file — and what isn't
Included
- Pinnacle full-game total, over and under prices
- Pinnacle run line, home and away prices
- Snapshot time for every price
- Final score, total runs, margin, settled result
- Regular season only, one game = one row
- ProbWin layer: fair probability of every side; best closing price among tracked bookmakers, with the bookmaker
Not included
- Moneyline
- Opening line
- Seasons before 2023
- Postseason
- Pitcher stats → in Modeling Features
Every column, with its fill rate
Measured on the delivered file. 100% = no missing values.
Game
MLB game id (join key), date, teams, scheduled first pitch (UTC)
Score
Final score, total runs, home − away margin
Pinnacle total
Line, over price, under price, snapshot time, OVER / UNDER / PUSH
Pinnacle run line
Home spread, both prices, snapshot time, HOME_COVER / AWAY_COVER
ProbWin layer — total
Fair probability (Pinnacle without margin), best closing price among tracked bookmakers on the same line and its bookmaker, gap to fair price, bookmaker count (several bookmakers: see the README's coverage by season)
ProbWin layer — run line
Fair probability (Pinnacle without margin), best closing price among tracked bookmakers on the same line and its bookmaker, gap to fair price, bookmaker count (several bookmakers: see the README's coverage by season)
The file, exactly as you'll get it
Six real rows, main columns. Download 50 free rows with every column to check it fits your pipeline.
| game_date | away_team | home_team | score_away | score_home | pinnacle_ft_total_line | pinnacle_ft_over_price | pinnacle_ft_under_price | ft_over_result | pinnacle_spread_line | pinnacle_spread_home_price | pinnacle_spread_away_price | spread_result | pinnacle_ft_snapshot_utc | commence_utc |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2026-05-19 | MIL | CHC | 5 | 2 | 7.0 | 1.85 | 2.04 | PUSH | 1.5 | 1.57 | 2.57 | AWAY_COVER | 2026-05-19 21:59:52 | 2026-05-19 23:40:00 |
| 2026-06-02 | COL | LAA | 8 | 2 | 8.5 | 1.85 | 2.04 | OVER | -1.5 | 2.32 | 1.68 | AWAY_COVER | 2026-06-02 21:59:28 | 2026-06-03 01:38:00 |
| 2026-07-12 | CHC | CIN | 8 | 4 | 9.0 | 1.93 | 1.95 | OVER | 1.5 | 1.7 | 2.28 | AWAY_COVER | 2026-07-12 15:59:50 | 2026-07-12 17:40:00 |
| 2026-07-28 | KC | MIN | 2 | 3 | 9.0 | 1.93 | 1.95 | UNDER | -1.5 | 2.2 | 1.75 | AWAY_COVER | 2026-07-28 21:59:35 | 2026-07-28 23:40:00 |
| 2026-08-15 | MIL | LAD | 4 | 1 | 7.5 | 2.07 | 1.83 | UNDER | 1.5 | 1.64 | 2.4 | AWAY_COVER | 2026-08-15 23:09:47 | 2026-08-15 23:15:00 |
| 2026-09-11 | COL | DET | 2 | 6 | 8.0 | 1.93 | 1.95 | PUSH | -1.5 | 2.24 | 1.73 | HOME_COVER | 2026-09-11 22:39:46 | 2026-09-11 22:40:00 |
Before you buy
Is this the closing line?
No. It is the last Pinnacle price captured before first pitch, with its exact time. In 2026, half the snapshots fall within ~45 min of the game. Filter on the timestamp to keep the lead time you need.
Is the 2026 season complete?
No: 2,210 of the 2,429 regular-season games, from April 12, 2026 (the 218 earlier games had corrupt captured prices and were dropped). The season is over: this is the final file.
What is the ProbWin layer?
Added at the end of each row without changing the other columns: the fair probability (both Pinnacle prices, margin removed), the best closing price among tracked bookmakers on the same line (last snapshot before the real first pitch, at most 6 h before), its bookmaker, the gap to the fair price and the bookmaker count. On a tie, the bookmaker shown is Pinnacle. Rules and a measured truth test in the README.
How do I get the file?
Right after payment a download link appears on screen and is emailed to you. The archive contains CSV and Parquet files plus a README documenting every column.
Can I use it in a commercial product?
Yes for your models, analyses and tools, commercial ones included. Reselling or redistributing the files themselves is not allowed.
A question before buying?
Email [email protected] — the founder answers, usually the same day.