Sports betting analytics comes down to four measures: hold (what the book charges), closing line value (whether your prices beat the market's final word), ROI with its variance (what you made, and how much of it was luck), and calibration (whether your probabilities mean what they say). Win rate on its own isn't on the list, because it ignores the price.
Each of the four answers a different question, and each can fool you if you read it alone. This page works through all four with real arithmetic, so you can compute them from your own records or from an API's prices.
Hold: what the market charges
Hold is the margin built into a book's prices. Convert each side to an implied probability and add them up.
A market at -110 on both sides: each side implies 110 / 210 = 52.38%. Together that's 104.76%. The 4.76% above 100 is the overround. The book's expected take on balanced action is 1 - 1 / 1.0476 = 4.55%. Both figures get called hold, so say which you mean.
Hold matters for two reasons. It's the hurdle every bet has to clear before it can be profitable, and it's a quality signal: a low-hold market is often a sharper, more competitive one. If you're comparing books, rank them by hold on the same market rather than by any single price.
Closing line value: the best early signal
Closing line value (CLV) asks whether the price you took was better than the fair price at the close. It's the measure most serious sports betting analysis leans on, because it settles in one game instead of a thousand.
Here's a worked example. You bet a side at +120. At the close, the market has your side at +105 and the other side at -125.
- Implied chances at the close: 100 / 205 = 48.78% for your side, 125 / 225 = 55.56% for the other. Total 104.34%.
- Remove the margin by dividing each side by the total: your side's fair chance is 48.78 / 104.34 = 46.75%.
- Your price of +120 is 2.20 in decimal. Against the closing fair chance, it was worth 0.4675 × 2.20 - 1 = +2.86% of stake.
- In probability terms, +120 implies 45.45%, so you beat the fair close by 46.75 - 45.45 = 1.30 points.
One bet's CLV is noise. Across a few hundred bets, a consistently positive average is one of the strongest betting insights you can get from your own records, and it doesn't depend on whether the bets happened to win. The dividing method here (multiplicative) is the simplest. Others remove more margin from the longshot side, and the choice moves the answer a little.
ROI and the variance around it
ROI is profit divided by total stake. It's the number everyone wants, and it's the one that takes longest to mean anything.
Say you place 500 bets of $100 at even money (+100), and your true chance of winning each is 52%. Your expected ROI is 0.52 × 2.00 - 1 = +4%. Now the spread:
- The standard deviation of one even-money bet is 2 × √(0.52 × 0.48) = 0.999 units, call it 1.
- Over 500 bets, the standard error of ROI is 1 / √500 = 4.47 percentage points.
- So your observed ROI will land within about ±8.8 points of +4% roughly 95% of the time: anywhere from -4.8% to +12.8%.
- The chance you're behind after 500 bets, with a real 4% edge, is about 19%.
That's the part most betting analytics dashboards hide. An ROI from a few hundred bets can't separate a good bettor from a lucky one, and a losing stretch doesn't prove the edge is gone. Report ROI with its standard error next to it, and stake money you can afford to lose, because a real edge still loses often.
Calibration: do your probabilities mean anything
If you build forecasts, calibration checks whether events you call 60% happen about 60% of the time. Group predictions into buckets, then compare the average forecast with the actual hit rate in each bucket.
Say 200 predictions fall in your 60% bucket and 108 of them win: 54%. The standard error at 200 trials is √(0.6 × 0.4 / 200) = 3.5 points, so a 6-point miss is about 1.7 standard errors. Suspicious, not proven. Keep collecting, and look at whether the misses all lean one way across buckets. A model that's overconfident everywhere needs its probabilities pulled toward 50%.
The Brier score (the average of squared differences between forecast and result) rolls calibration and sharpness into one number, and it's useful for comparing two models on the same games. Our guides on how to build a sports betting model and the wider sports betting model overview cover where those forecasts come from.
Getting the inputs
ZippyOddsAPI doesn't compute your ROI or calibration for you, since those depend on your own bets and forecasts. All four measures need the same raw material: prices with honest timestamps, closing lines and results. Sports gambling analytics built on prices of unknown age will show edges that were never there.
ZippyOddsAPI supplies the price side. /v1/history returns a market's open, current and every stored change for 30 days, on full-game moneyline, spread and total markets, so you can take the last point before the start as the close. The computed endpoints do some of the work for you: /v1/holds lists low-hold markets, and each /v1/ev row carries a fair_probability with the margin removed, an ev_percent and an observed_at. Results aren't part of it: a game leaves the board when it's reported final, so settle bets from another source. The docs list every field.
A checklist for honest numbers
- Measure hold on the same market, at the same time, across books.
- Track CLV on every bet, against a fair close, not the raw closing price.
- Report ROI with its standard error and the number of bets behind it.
- Check calibration by bucket before trusting a model's edge.
- Drop or flag any price whose age you don't know.
The most useful sports betting insights usually come from that last line. ZippyOddsAPI keeps each price at the time it was observed for exactly this reason: an analysis is only as fresh as its oldest input.