NFL spread history CSV: 27 seasons of closing lines and ATS covers
What the spread_line column holds
Every NFL game since 1999 in the games CSV carries a spread_line: the closing point spread for the home team. The sign carries the direction. A positive number says the home team is favored and must win by more than that number. A negative number says the away team is favored, and the magnitude is the expected home defeat. Zero is a pick'em. The convention comes straight from the nflverse source feed the pack is built on, and it matches the result column, which is already home_score - away_score.
Two rows from the free 22-row sample, the first two games of the 1999 season:
| game_id | matchup | result | spread_line | reading |
|---|---|---|---|---|
| 1999_01_MIN_ATL | MIN @ ATL | -3 (17-14 ATL) | -4 | Minnesota favored by 4; Atlanta lost by 3 and covered |
| 1999_01_KC_CHI | KC @ CHI | 3 (20-17 CHI) | -3 | Kansas City favored by 3; Chicago won outright and covered |
Over the full file, the home side is favored far more often, as home field would suggest: 4,731 of the 7,276 played games with a line (65.0%) have a positive spread_line, 2,514 (34.6%) are negative, and 31 (0.4%) are pick'ems. The line exists on every played game in the file, plus 112 of the 272 scheduled 2026 rows that already carry early numbers.
What "cover ATS" means, in arithmetic
Covering the spread (ATS) is a score-keeping idea, not a prediction. A team covers when it beats the line, and the CSV makes that a one-line formula because result and spread_line share the home-team sign convention:
home_margin_vs_line = result - spread_line
# > 0: home team covered
# < 0: away team covered
# == 0: push (only possible on integer lines)
Check it against the two sample rows. MIN @ ATL: result -3, spread_line -4, so -3 - (-4) = +1. The home team lost but covered, because losing by 3 is better than the 4 the line demanded. KC @ CHI: 3 - (-3) = +6, home underdog covers by six. The pack's derived table, team-records-by-season.csv, runs exactly this arithmetic on every row and sums it per team per season into ats_wins, ats_losses, and ats_pushes columns, so a query like "Kansas City's 2023 ATS record" is a filter, not a research project: 16-5-0. For how these rows assemble into a full betting dataset, spreads joined to results and totals on game_id, see the NFL betting data guide.
The spread history itself, season by season
The pack's second derived file, season-summaries.csv, rolls the cover counts up per season. These are its ATS columns, copied from the shipped file. Cover percentages exclude pushes.
| Season | Games | Favorite cover % | Underdog cover % | Pushes |
|---|---|---|---|---|
| 1999 | 259 | 47.0 | 53.0 | 10 |
| 2000 | 259 | 47.6 | 52.4 | 7 |
| 2001 | 259 | 46.6 | 53.4 | 12 |
| 2002 | 267 | 44.3 | 55.7 | 5 |
| 2003 | 267 | 49.6 | 50.4 | 9 |
| 2004 | 267 | 50.2 | 49.8 | 6 |
| 2005 | 267 | 58.8 | 41.2 | 10 |
| 2006 | 267 | 43.6 | 56.4 | 8 |
| 2007 | 267 | 50.8 | 49.2 | 5 |
| 2008 | 267 | 49.0 | 51.0 | 6 |
| 2009 | 267 | 48.6 | 51.4 | 8 |
| 2010 | 267 | 49.2 | 50.8 | 5 |
| 2011 | 267 | 48.8 | 51.2 | 11 |
| 2012 | 267 | 48.1 | 51.9 | 5 |
| 2013 | 267 | 53.5 | 46.5 | 7 |
| 2014 | 267 | 47.9 | 52.1 | 6 |
| 2015 | 267 | 45.9 | 54.1 | 10 |
| 2016 | 267 | 52.3 | 47.7 | 5 |
| 2017 | 267 | 51.7 | 48.3 | 8 |
| 2018 | 267 | 45.7 | 54.3 | 9 |
| 2019 | 267 | 46.7 | 53.3 | 10 |
| 2020 | 269 | 44.2 | 55.8 | 0 |
| 2021 | 285 | 46.6 | 53.4 | 4 |
| 2022 | 284 | 45.3 | 54.7 | 10 |
| 2023 | 285 | 52.0 | 48.0 | 14 |
| 2024 | 285 | 52.7 | 47.3 | 4 |
| 2025 | 285 | 48.6 | 51.4 | 1 |
Read as history, the table says the market keeps itself honest. Underdogs covered more often than favorites in 19 of the 27 seasons. The extreme favorite year, 2005 at 58.8%, sits next to the extreme underdog year, 2020 at 55.8% for dogs, and neither side ran away over any long stretch. Roll the same rows up by decade from games.csv and the pattern flattens further: home teams covered 51.0% in the 249 decided games of 1999, 48.7% in the 2000s (2,578 decided), 48.7% in the 2010s (2,594), and 49.9% in the 2020s so far (1,660 through 2025).
Pushes, half-points, and the deepest lines ever closed
A push happens when the winning margin lands exactly on an integer spread. It has occurred 195 times in 7,276 spread games, 2.7%, and the half-point lines that sportsbooks quote make it rare by design: a .5 anywhere in spread_line makes the game structurally push-proof. 2017 is the extreme case, 267 games and zero pushes, while 2023 had 14.
The deepest closing lines in the file show the other side of cover math. The five largest favorites since 1999:
| game_id | Favorite | spread_line | Result | Cover |
|---|---|---|---|---|
| 2013_06_JAX_DEN | DEN by 27 | -27 | Denver by 16 | Jacksonville |
| 2007_12_PHI_NE | NE by 24 | -24 | New England by 3 | Philadelphia |
| 2007_16_MIA_NE | NE by 22 | -22 | New England by 21 | Miami |
| 2019_03_MIA_DAL | DAL by 22 | -22 | Dallas by 25 | Dallas |
| 2007_15_NYJ_NE | NE by 20.5 | -20.5 | New England by 10 | NY Jets |
Favorites went 1-4 against the number in the five deepest spots. That is the pattern the season table already showed, in its sharpest form: the line prices the blowout in, so the favorite must not just win but win by more than the market already expects.
What this dataset cannot tell you
The file records closing lines and final scores. It contains no opening lines, no in-game movement, no player injuries, and no probability of any future outcome. Cover rates describe what happened in 7,276 completed games; they are a research baseline for questions like "how often did double-digit favorites cover in dome games" or "which seasons had the most pushes", both answerable with a filter and a group-by. Nothing here predicts the next game, and none of it is a recommendation to place one.
Get the spread history as CSV
The free 22-row sample carries the same 46 columns, including spread_line, so the formula above runs on it as-is. The full pack is the 7,548-row games.csv (7,276 played with lines), team-records-by-season.csv with the ATS sums per team per season, season-summaries.csv, a data dictionary, and SHA-256 checksums. Prefer a notebook? The pandas quickstart loads the sample in two lines, the Excel and Google Sheets guide covers the spreadsheet route, and the MCP vs API guide shows how to let an agent filter the full file for you.
Checkout and download run through Getly. The sample and season-summaries download free here, no signup. Source: nflverse game and betting data, CC BY 4.0.
NFL spread history CSV questions
What does a negative spread_line mean?
The away team is favored. spread_line is the closing spread for the home team, so -4 reads "the visitor should win by about 4". Positive means the home team is favored, zero is a pick'em. In the played games since 1999: 65.0% positive, 34.6% negative, 0.4% zero.
How is a cover ATS calculated from the rows?
result - spread_line, with the sign deciding it. Positive means the home team covered, negative the away team, zero a push. Running that over all rows reproduces the ats_wins, ats_losses, and ats_pushes columns in team-records-by-season.csv exactly, which is the check worth running on any spread history CSV you download from anywhere.
Do favorites or underdogs cover more often?
Underdogs, slightly: 50.9% of the 7,081 decided games since 1999, against 49.0% for favorites, with 2.7% pushes. The season table above shows underdogs taking 19 of 27 seasons. That near-even split is what an efficient line produces, and it says nothing about any single future game.