Across 7,276 games with a closing total, the over/under's average error is +0.70 points - nearly unbiased, median exactly zero - yet individual games scatter by a standard deviation of 13.4 points. The total nails the average and misses almost every single game. Over hit 48.7%, under 49.8%, and why ~50% still loses to the vig.
By The NFL Analytics Editorial Team · Published June 16, 2026
The over/under — the bookmaker's line on a game's combined points — gets talked about as if it were either clairvoyant or a trap. It's neither, and it behaves almost exactly like the point spread. I pulled the complete nflverse game log bundled with this site and measured every closing total against the actual combined score across 7,276 games. The result is two numbers that pull in opposite directions. The total is nearly unbiased — the average error is just +0.70 points and the median is exactly zero. And it is wildly wrong about individual games — the standard deviation of that error is 13.4 points, with a mean absolute error of 10.6. The market knows the average; it has almost no idea about any one Sunday.
Here is the distribution of total error — actual combined points minus the closing over/under — straight from data_layer/games.csv. A perfect line would stack every game on the dotted zero.
Two features carry the argument. The peak sits on zero and the navy mean line is nearly on top of the dotted perfect-prediction line — that's the lack of bias. And the bell is broad: plenty of games land 20, 30, even 40 points off the number in both directions. A forecast can be perfectly centered and still miss by a touchdown-and-a-half on a typical game, and that is exactly what an NFL total does.
The unbiasedness shows up in the hit rates. Across the 7,276 games, the over cashed 48.7% of the time, the under 49.8%, and 1.5% were pushes (the total landing exactly on the number). Throw out the pushes and it's a hair under 50/50. That near-symmetry is the signature of an efficient market: if unders cashed 55% of the time, you could bet every under and print money, so the line moves until that edge is gone. The tiny tilt — a +0.70 average error, i.e. games going very slightly over the line on average — is a real artifact of rising scoring that the market chased a beat behind, but it is far too small to beat the vig.
Picture a game with a closing total of 44.5. It finishes 31–27 — 58 points, a +13.5 error, a comfortable over. Was the line “wrong”? Not in any useful sense. 44.5 was a perfectly reasonable central estimate; this game simply landed about one standard deviation into the right tail of the bell above. The next week the same 44.5 line produces a 13–10 rock fight — 23 points, a −21.5 error, an easy under. Average thousands of those and the misses cancel to +0.70. That cancellation is the unbiasedness; the ±13-point swings are the scatter. Same line, both truths — which is why a single game tells you nothing about whether a total was “good.”
Load data_layer/games.csv, keep games with a real total and total_line, and compute total − total_line per game. The distribution, mean, SD, and over/under/push rates are produced by explainer_src/make_total_error_chart.py, which reads the bundled nflverse log directly and stamps a “Data: nflverse” footer. No network, nothing hand-entered.
Want the code behind these metrics? Work through the 45-chapter NFL analytics tutorial.
Browse tutorials Free tools