NRFI / YRFI: 3,956 games, Pinnacle prices captured before first pitch.
A run in the first inning or not. Pinnacle YRFI and NRFI prices, each team's real first-inning runs, settled result — every price checked, game by game, against the official first-pitch time.
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 2026Both seasons
2025 and 2026 in one download.
- 3,956 games, one file per season + a combined file
- 2026: 1,984 games (82%), final file
- Joins our other MLB files on game_pk
Download link valid 72 h, 5 downloads
Buy — €25MLB Complete Pack
All 5 datasets, all seasons.
- Full-Game Odds
- First 5 Innings
- First inning · NRFI
- Modeling Features
- Line Movements
Pinnacle's price versus reality
Games grouped by Pinnacle's implied YRFI probability (margin removed), and what actually happened in the first inning.
Descriptive chart: a gap of a few points over 3,956 games is not a proven edge.
| YRFI PROB. | GAMES | YRFI (1+ run) | NRFI (0 runs) | Implied |
|---|---|---|---|---|
| < 45 % | 674 | 43.0% | 57.0% | 42.9% |
| 45-50 % | 1,852 | 50.0% | 50.0% | 47.7% |
| 50-55 % | 1,208 | 53.1% | 46.9% | 51.8% |
| 55-60 % | 207 | 60.9% | 39.1% | 56.6% |
A short market, clean data
The first inning is over in minutes: a price captured after first pitch is worthless. That is why every row was checked against the official first-pitch time.
Calibrate an NRFI model
Margin-free implied probability versus the real outcome, ready to compare with yours.
n = pd.read_parquet("mlb_nrfi_pinnacle_2025_2026.parquet")
p_y = 1 / n.pinnacle_i1_over_price
p_n = 1 / n.pinnacle_i1_under_price
n["fair_yrfi"] = p_y / (p_y + p_n)Team by team
Each team's first-inning runs: spot the lineups that start fast.
n.groupby("home_team").runs_i1_home.mean()
.sort_values(ascending=False).head(10)Cross with starters
Join Modeling Features (starting pitchers) on game_pk — overlap: the 2025 season.
feat = pd.read_parquet("mlb_modeling_features_2023_2025.parquet")
n.merge(feat, on="game_pk")Checked against the real first pitch, game by game.
First-inning prices are often captured in the final minutes. We compared every snapshot with the official first-pitch time published by MLB and kept the last one strictly before it. Result: median ~2 min before first pitch.
2025 is a partial season (1,972 games, spread across the season): our capture of this market was not systematic yet. 2026 is partial too: games whose price was only captured after the real first pitch are dropped. 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.
What's in the file — and what isn't
Included
- Pinnacle YRFI (over 0.5) and NRFI (under 0.5) prices
- Each team's first-inning runs
- YRFI / NRFI result
- Snapshot time, checked against the real first pitch
- ProbWin layer: fair probability of every side; best closing price among tracked bookmakers, with the bookmaker
Not included
- Seasons before 2025
- Complete 2025 and 2026 seasons (partial, see left)
- Closing line
- Postseason
Every column, with its fill rate
Measured on the delivered file. 100% = no missing values.
Game
MLB game id (join key), date, teams, scheduled start (UTC)
First inning
Each team's first-inning runs, total, YRFI / NRFI
Pinnacle prices
Line (always 0.5), YRFI price (over), NRFI price (under), snapshot time
ProbWin layer — YRFI / NRFI
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 | runs_i1_away | runs_i1_home | pinnacle_i1_over_price | pinnacle_i1_under_price | nrfi_result | pinnacle_i1_snapshot_utc | commence_utc |
|---|---|---|---|---|---|---|---|---|---|
| 2026-04-18 | DET | BOS | 1 | 0 | 2.33 | 1.64 | YRFI | 2026-04-18 20:09:59 | 2026-04-18 20:10:00 |
| 2026-07-29 | CHC | STL | 0 | 0 | 2.0 | 1.85 | NRFI | 2026-07-29 22:39:56 | 2026-07-29 23:45:00 |
| 2026-08-22 | CLE | COL | 0 | 0 | 1.69 | 2.23 | NRFI | 2026-08-22 23:39:25 | 2026-08-23 00:10:00 |
| 2026-08-25 | CIN | SF | 0 | 2 | 1.99 | 1.86 | YRFI | 2026-08-26 00:39:31 | 2026-08-26 01:45:00 |
| 2026-08-27 | LAD | ATL | 0 | 1 | 2.52 | 1.55 | YRFI | 2026-08-27 22:39:45 | 2026-08-27 23:15:00 |
| 2026-09-07 | LAA | BOS | 0 | 0 | 1.99 | 1.87 | NRFI | 2026-09-07 16:39:51 | 2026-09-07 17:35:00 |
Before you buy
Why are some snapshots later than the scheduled time?
Games rarely start on the scheduled minute. When a snapshot fell after the scheduled time we checked that it preceded the real first pitch (official MLB time). Otherwise we kept the previous snapshot.
Why are NRFI prices not floored at 1.50?
NRFI is often the favourite and legitimately priced below 1.50. Only prices ≤ 1.01 (corrupt captures) are dropped.
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.