DEV Community

Eddie Glush
Eddie Glush

Posted on Originally published at betbetter.world

Millions of odds snapshots: what the bookmaker margin actually looks like

The price of placing a bet is never printed anywhere. There is no line item, no fee, no receipt. It is folded into the odds themselves: both sides of a coin flip pay less than even money, and the gap is what the bookmaker keeps. That gap, the margin or overround, is the single most important number in betting, and almost nobody measures it.

So we did, continuously, and published the result as a daily index with a free CSV.

What the numbers say

Two things are on the site. The Margin Index is a live daily panel; on the day this was written (17 September 2026, 79 days into the series) it measured 2,747,603 markets across 68 bookmakers in a single day, with a headline two-outcome margin of 4.92%. The State of the Vig 2026 quarterly report is the fixed summary: 69.6 million pre-match market observations across 53 bookmakers and 14 sports, 1 July to 8 September 2026.

The clearest finding is that the type of bet matters far more than the sport.

Market type Mean margin Markets that day
Head-to-head (two outcomes) 4.92% 415,503
Handicaps / spreads 5.11% 517,201
Totals (over / under) 5.94% 827,759
Match result (three outcomes) 7.19% 668,945
Player props 7.65% 305,981

Read that as a price ladder. The simpler the bet, the less it costs. A player prop carries roughly 60% more margin than a simple who-wins bet, 7.6% against 4.8% on the quarter's numbers, and props are simultaneously the fastest-growing market type. In the quarterly panel, props were 23.8 million of the 69.6 million observations.

A third outcome is expensive too. Three-way match-result markets, where a draw is possible, ran at about 7.5% over the quarter, half again the two-outcome figure.

The sport gap is real, and bigger than people assume

Same bet type, two-outcome who-wins, split by sport, on the latest day measured:

Sport Margin Cost on $100 Markets Books
NFL 4.36% $4.36 52,100 21
College football 4.43% $4.43 100,933 19
MLB 4.70% $4.70 64,330 52
NHL 4.93% $4.93 37,270 22
UFC / MMA 5.02% $5.02 41,366 24
NRL 5.28% $5.28 4,129 19
NBA 6.00% $6.00 61,611 35

Over the full quarter the pattern is the same and the spread is wider: baseball was the cheapest sport to bet at 4.34%, and T20 international cricket the dearest at 6.24%, about 44% more margin on the same kind of bet. The big American leagues cluster tightly between 4.3% and 4.7%, which is what competition does to a price: those are the markets where the most bookmakers are quoting.

The quarter also caught a seasonal move. Spreads went from 4.96% in July to 5.73% by early September, and totals from 5.57% to 6.37%, as NFL and college football lines came online and displaced the baseball lines that dominated July. Football lines simply carry more margin.

How it is measured

For every bookmaker quote on every market, convert each price to an implied probability (1 ÷ decimal price), sum them, and subtract 100%. A fair market sums to 1.00; the surplus is the margin. Every quote is a separate observation, so a market quoted by 40 bookmakers contributes 40 measurements rather than one blended average. That matters, because the average of a cheap book and an expensive book is a price nobody can actually get.

Handicap markets are paired on the absolute value of the line, since the two sides carry opposite numbers. Observations resolving outside 0–30% are mispaired or stale quotes and are dropped; on the latest day that filter removed at most 0.63% of observations in any market type. In-play prices, suspended markets and betting exchanges (which charge commission instead of margin) are excluded from the quarterly report.

The index publishes aggregates only, no odds, no prices, no bookmaker identities, which is exactly why it can be given away under CC BY without redistributing licensed market data.

Use the data

import pandas as pd
import requests
from io import StringIO

URL = "https://betbetter.world/studies/margin-index?format=csv"
raw = requests.get(URL, timeout=30, headers={"User-Agent": "margin-demo/1.0"}).text

# two leading '#' lines carry the source and licence
df = pd.read_csv(StringIO(raw), comment="#")
print(df.columns.tolist())
# ['as_of_date', 'market_class', 'shape', 'markets_n', 'books_n',
#  'mean_pct', 'median_pct', 'dropped_pct']

# margin by market class, weighted by how many markets were measured
w = (df.assign(num=df.mean_pct * df.markets_n)
       .groupby(["market_class", "shape"])[["num", "markets_n"]].sum())
print((w.num / w.markets_n).sort_values().round(2))

# the headline series: two-outcome head-to-head, day by day
h2h = df[(df.market_class == "h2h") & (df.shape == "2way")]
print(h2h.set_index("as_of_date").mean_pct.tail(14))

Enter fullscreen mode Exit fullscreen mode

Links and citation
Daily Margin Index (and the CSV): https://betbetter.world/studies/margin-index
State of the Vig 2026, Q3: https://betbetter.world/studies/state-of-the-vig-2026
Market calibration study: https://betbetter.world/studies/market-calibration
Our publicly graded record, losses included: https://betbetter.world/results

Suggested citation: Glush, E. (2026). The Bet Better Margin Index: daily measured bookmaker margins across market types. Bet Better. https://betbetter.world/studies/margin-index

Top comments (0)