Methodology
This page explains exactly how every number on The Odds Gap is computed, where the data comes from, and the limits of what the site can tell you. If you notice a calculation that looks wrong, email admin@theoddsgap.com. The Odds Gap takes methodology bugs seriously.
Data sources
- Sportsbook odds: The Odds API, a paid commercial feed that aggregates US sportsbook prices.
- Prediction market prices: pulled directly from each venue. Kalshi, Polymarket US, ProphetX and Novig each have their own integration, and none of their prices comes through The Odds API. Going to the source gives tighter pricing and lets the site apply each venue's own fee math (see the prediction-markets section below).
- Sport coverage today: NFL, NCAAF, NBA, WNBA, MLB, NHL, NCAAB, UFC, ATP and WTA tennis, MLS, the UEFA Champions League and the FIFA World Cup. Player props are on the board for the major active leagues.
The site does not scrape sportsbook websites and does not store any user account information from any sportsbook.
Refresh cadence
Different parts of the site refresh on different schedules.
- Game lines (Line Shop, Top Gaps, +EV Plays, and Markets vs Books): scanned on two cadences. On Live Beta, free with an email signup during the beta, every book's moneyline, spread, and total is rescanned every minute, around the clock. EPL, La Liga, Serie A, Bundesliga and Ligue 1 refresh every 5 minutes. On the free board, it's an hourly snapshot of that scan, 7am through 9pm Eastern. Every page reads from these caches, so a game-line price is at most about one refresh interval old on Live Beta and about an hour old on the free board, and may be older if a scan hits an upstream error.
- Player props: on Live Beta, refreshed every hour for games starting within 24 hours and every 4 hours for the day after that. On the free board, every 4 hours. Props beyond two days out are not priced until they come inside that window.
- Futures: refreshed every hour on Live Beta, once a day (at 7am Eastern) on the free board. Futures prices move much more slowly than game lines, so a less frequent refresh is enough.
- Prediction markets and exchanges (Kalshi, Polymarket US, ProphetX, Novig): refetched every hour, which is how often their own feeds are re-read. A price from one of these venues carries the time it was taken, and once it is more than about 70 minutes old it is removed from the board rather than shown as current. On the free board, which is itself an hourly snapshot, the cut is about 2 hours. A price that arrives carrying no time at all comes down the same way: if we cannot say when we got it, we will not show it to you as current.
That last one works differently from the sportsbooks on purpose. A sportsbook line that stops refreshing is visible, because the whole page's "updated" stamp goes with it. A single venue's quote is not. On 2026-08-25 six college football games carried Polymarket US prices captured two hours earlier, including one that was 73 dollars a hundred better than the real market. A price we cannot show you the current version of is not a price, so it now comes down instead of staying up.
Pages also have a short response cache (30 to 60 seconds) to keep the server fast under load. None of this affects the freshness of the underlying odds. It only affects how often the page rebuilds.
What this means in practice: the prices on The Odds Gap are a snapshot, not a live feed. By the time you click through to a sportsbook the line may have moved. Always verify the price on the book before you bet.
How "Gap %" is calculated (Top Gaps tab)
For each side of each market (e.g., "Lakers moneyline"):
- Convert every available book's American odds to implied probability.
- Find the BEST price (highest implied payout) and the NEXT BEST price across all tracked books.
- Gap % equals the best implied probability minus the next-best implied probability, expressed in percentage points.
The reason it's best vs. next-best, and not best vs. worst, is that the gap you can actually capture is the gap between you and the second-cheapest book. The worst book on the screen doesn't matter because no one is forcing you to bet there.
A 0.5pp gap is small, a 2pp gap is real money, and anything past 5pp usually means one book hasn't updated yet.
How "+EV %" is calculated (+EV Plays tab)
Pinnacle is treated as the sharp-book reference. Pinnacle takes the largest sports-betting limits in the world and adjusts its lines based on professional action, which is why the academic literature on betting markets uses Pinnacle prices as the closest proxy to a true probability.
For each game with a Pinnacle line available:
- Take Pinnacle's two-sided price for the market and de-vig it (remove the book's hold) to get an implied probability for each side.
- For every other tracked book offering the same market, compute: EV % equals the book's decimal odds, multiplied by Pinnacle's de-vigged probability, minus 1.
- Anything where EV % is greater than zero is shown as a +EV play.
Caveats:
- +EV calculated this way assumes Pinnacle's de-vigged line is the true probability. It is the best public proxy, but it is not the truth.
- When Pinnacle is offline or has not posted a line, the row is hidden rather than guessed.
- The site filters out books not available in your selected state (you set this with the state picker).
How the player-prop +EV badge is calculated (Props tab, and the Player Prop +EV cards)
Props have no Pinnacle anchor. Pinnacle does not post most player props, so the method above has nothing to reference and a different one is used: the market grades itself.
For each player, at each line on the board:
- Take every sportsbook quoting both sides of that exact line, and de-vig each one to an implied probability for the Over.
- Fair value is the median of those de-vigged probabilities. At least three sportsbooks must quote both sides, or no fair is published and the line carries no badge.
- Find the best available Over price across all books, exchanges included.
- Edge equals the fair probability minus the best price's implied probability, in percentage points. Two points or more earns the badge.
Why sportsbooks only, and what it does not mean. Step 1 excludes the exchanges (Kalshi, Polymarket US, ProphetX, Novig). Step 3 does not: an exchange price is a real price you can take, so it always shows on the page and always competes to be the best price. The distinction is that an exchange does not get a vote on what fair means.
The reason is that the exchanges are thin, they move together, and they can all be wrong at the same time. Letting them into the average drags it toward them, and each of them then looks close to consensus by a standard it helped set. That was also circular in the obvious way: an exchange holding the best price was being graded against a fair its own quote was inside. Game lines have worked this way since August 2026; player props were brought into line on 2026-08-29. Measured on that day's board, an exchange was among the anchors on 56% of prop lines and was half or more of them on 9%.
The cost is honest and worth stating: a line quoted two-sided by only two sportsbooks no longer gets a fair, because two books are not a consensus. On the 2026-08-29 board that removed the badge from about 8% of priced lines, mostly home runs and hits, where exchange coverage is deepest.
Caveats:
- The median is a market consensus, not a truth. It is only as good as the books in it, and on a thin prop it can be wrong.
- A price more than 15 percentage points of implied probability away from the line's median is dropped as stale or dust before the best price is chosen, so a single frozen quote cannot manufacture an edge.
- Edges above 15 percentage points are hidden as probable bad data rather than shown.
- Hiding books with the book filter changes which price can be the best one. It never changes the fair, which always reads the full sportsbook set.
Prediction markets, and how The Odds Gap prices them
The Odds Gap tracks four prediction-market venues alongside the traditional sportsbooks: Kalshi, Polymarket US, ProphetX, and Novig. Kalshi and Polymarket US trade binary YES/NO contracts peer-to-peer, with the price of YES sitting between 1¢ and 99¢ as a direct implied probability: a contract at 68¢ is the market's implied 68% chance that YES happens. ProphetX is a peer-to-peer betting exchange: instead of contracts, you bet at American odds against other users (the way a sportsbook displays a line) but with no house and no built-in juice. Since June 2026 it operates under CFTC approval as a Designated Contract Market and clearinghouse, the first built specifically for sports. Novig is a peer-to-peer exchange as well, and as of August 2026 it operates as a CFTC-regulated prediction market. It charges nothing on a pre-game straight bet, but it does charge on parlays and on live in-game trading.
What makes these venues structurally different from a sportsbook:
- No house edge built into the price. A sportsbook charges juice (e.g., -110/-110 means each side has roughly a 52.4% break-even instead of 50%). Prediction-market prices have no juice baked in. These venues make their money differently from a book (a per-contract taker fee on Kalshi and on Polymarket US, a 2% commission on net winnings on ProphetX, and on Novig a fee that applies to parlays and live in-game trades but not to pre-game straight bets, all detailed below) and not on a hidden vig.
- Peer to peer. When you bet on Kalshi or Polymarket US, the counterparty is another trader, not a book. The exchange matches buyers and sellers. This means prices can move in ways traditional sportsbook lines don't.
- Federally regulated by the CFTC. All four venues are. Kalshi has been a CFTC-regulated Designated Contract Market since 2021. Polymarket US (QCX LLC) is also a CFTC-regulated DCM as of 2025. ProphetX received CFTC approval as a DCM and Derivatives Clearing Organization and relaunched nationwide on that basis in June 2026, and Novig moved to a CFTC-regulated prediction-market structure in August 2026. Sports contracts are available in many states where a traditional sportsbook isn't, though the legal status of sports contracts continues to evolve. Always confirm what's legal where you are.
The same outcome ("Lakers ML") can trade at one implied probability on each prediction market and a different one across sportsbooks. When the gap is wide enough, that's a real opportunity to take whichever side is mispricing relative to the others.
ProphetX: 2% commission on winnings, baked into the displayed price
ProphetX is a peer-to-peer betting exchange: you bet at American odds against other users rather than against a house. There's no juice in the line, but ProphetX takes a 2% commission on net winnings when a bet settles in your favor. A ProphetX line showing +100 therefore pays roughly +98 once commission is taken. The Odds Gap doesn't display the raw line. It uses ProphetX's own commission-adjusted price, which their API returns directly, so the ProphetX number shown on the site is what a bettor actually nets, directly comparable to a sportsbook line.
Novig: free pre-game, with fees on parlays and live betting
Novig is a peer-to-peer exchange built around a "no vig" promise. Like ProphetX, you bet at American odds against other traders rather than against a house. In August 2026 Novig moved to a CFTC-regulated prediction-market structure and published a fee schedule. The fee has one shape for every trade type:
fee per contract = coefficient × P × (1 − P)
P is the contract price in dollars, which is also the implied probability. The fee is added to the cost of entering a position, never taken out of the winnings. The coefficient is what changes:
- Pre-game straight bets: zero. Free for makers and takers alike, on the app, the web and the API.
- Parlays: 0.10. Already inside the single combined quote Novig gives you.
- Live in-game: 0.03, charged to takers only.
What The Odds Gap displays for Novig
The board is pre-game, so Novig prices on it carry no fee and are shown raw. Novig charges nothing on these trades, so the price resting on the order book is exactly what a bettor gets and there is nothing to back out. Padding it with a fee it does not charge would show Novig as worse than it is, which is the same kind of error as showing it as better. The Odds Gap takes the best available offer on each side and converts it directly to American odds.
Parlays are different, and the parlay leaderboard applies the fee. Novig prices a parlay as one all-in quote with the 0.10 coefficient already inside it, so multiplying its individual leg prices together the way you can for a sportsbook produces a number nobody can actually take. The site applies the coefficient once to the combined parlay price. Novig's own worked example: a parlay that is fairly worth 10.0¢ (+900) is quoted at 10.9¢, which is +817. A single pick is never charged this, because a single pre-game straight bet is free.
The live in-game coefficient is real but has nowhere to apply yet, because the exchanges are deliberately not shown on the live in-play board. If that changes, the adjustment goes in with them.
Where Novig is available: Novig is available nationwide, though not in every state. As with every book on the site, its price and its link are hidden when you select a state where it is not offered, so the board you see is the board you can act on.
Kalshi: per-contract taker fee, baked into the displayed price
Kalshi's "no juice" framing is structurally true: there's no built-in vig in the price the way a sportsbook bakes one in. But that doesn't mean a Kalshi contract is free. Kalshi charges a per-contract taker fee on every trade that crosses the spread (i.e., when you hit the ask instead of resting a limit order). Most users buying contracts are takers, not makers. So showing a raw yes_ask price and pretending that's what the bettor pays would understate the true cost.
For the standard sports schedule, the per-contract fee The Odds Gap uses is:
fee = 0.07 × P × (1 − P) × 100 cents per contract, where P is the contract price in dollars (0 to 1).
The fee is a small parabola: it maxes at 1.75¢ per contract when the price sits near 50¢ (a coin-flip line), and falls to fractions of a cent at the extremes (heavy favorites and longshots). At 60¢ the fee is 1.68¢; at 90¢ it's 0.63¢; at 99¢ it's 0.07¢.
Why The Odds Gap uses this asymptotic value (and not a ceiling rounded to a whole cent)
Kalshi's published formula is ceil(0.07 × C × P × (1 − P) × 100) cents per trade, where C is the number of contracts in the trade. The ceiling rounds the total trade fee up to the next whole cent, not each contract individually. That ceiling overhead matters for tiny trades and basically vanishes for any normal-sized trade. Two examples from Kalshi's own buy-flow UI confirm this:
- $5.90 bet at 59¢ yes → 9.71 contracts, total fee 17¢ → 1.75¢ per contract.
- $100 bet at 60¢ yes → 162.11 contracts, total fee $2.73 → 1.68¢ per contract.
Both values match the asymptotic formula exactly. Kalshi's UX is dollar-denominated (users specify a dollar amount and Kalshi sizes the contract count to fit), so the per-trade ceiling penalty is essentially zero per contract. Using the asymptotic rate is the most accurate per-contract cost for what users actually pay.
For the rare 1-contract trade (someone betting under ~50¢), Kalshi's per-trade ceiling does add an extra fraction of a cent. The Odds Gap accepts this as a small under-statement at the smallest end of the spectrum, in exchange for being accurate for the typical bettor placing a $5+ wager.
What the fee does to displayed Kalshi prices
Wherever The Odds Gap displays a Kalshi price as American odds (Line Shop, Markets vs Books, the Book Comparison leaderboard, the futures cards, the blog charts), the displayed odds already include this fee. The site adds the fee to the raw yes_ask first, then converts the effective cost to American odds. So a contract trading at 42¢ on Kalshi shows up as roughly +118 on the cards, not +138, because 42¢ + 1.71¢ fee = 43.71¢ effective cost, which is what a typical bettor pays per share.
Where the fee adjustment matters most:
- Coin-flip markets (prices in the 35–65¢ range): the ~1.7¢ fee shifts the American line by roughly 5–8 points. This is where the Kalshi adjustment is biggest.
- Heavy favorites (90¢+ contracts): the fee is well under a cent and the American odds barely move, so this is the band where the fee costs a Kalshi price the least. That is a statement about the size of the adjustment, not a claim that Kalshi wins here: measured on matched lines, it does not lead on moneylines at any price.
- Longshots (under 10¢): the absolute fee is fractions of a cent but it's a large percentage of the cheap contract. Long futures look slightly worse on Kalshi after adjustment, though the absolute payout-per-dollar is still attractive on most events.
One thing this approach does not capture: maker pricing on resting limit orders. Kalshi's published maker formula is ceil(0.0175 × C × P × (1 − P)) dollars per trade, exactly 25% of the taker fee. So a contract trading at 50¢ that costs a taker ~1.75¢ in fee costs a maker ~0.44¢. If you post a resting limit order that another trader eventually fills against, you pay the lower maker rate.
The Odds Gap defaults to taker because that's what the line-shopper persona pays. Someone clicking through from this site to Kalshi types a dollar amount in the buy box and hits Buy, a market order that crosses the spread, which is a taker fill by definition. Modeling that case shows the user the worst-case price they'd actually pay rather than understating it. If you're sophisticated enough to post limit orders and wait for fills, your real cost is roughly a quarter of what the site displays, and Kalshi's gap vs sportsbook prices is wider than the numbers on this site suggest.
Round-trip and settlement assumption (Kalshi)
Kalshi charges the trading fee when you open a position by hitting the ask, and again if you exit early by hitting the opposite ask. Settlement is fee-free. If you hold a contract until the underlying market resolves (the game ends, the contract pays out at $0 or $1 automatically), you only pay the fee once, on entry.
The Odds Gap's adjustment models the entry fee only, on the assumption that a sports bettor opening a single-game position holds it through to resolution rather than trading out before the game ends. That's the typical pattern for someone who's price-shopping a moneyline or spread. If you're actively trading positions in and out, you'd pay the fee on both sides of each round-trip. That's a different use case from "shop the line and place the bet."
Source and currency of the Kalshi fee schedule
The math here mirrors Kalshi's official Fee Schedule (PDF: kalshi.com/docs/kalshi-fee-schedule.pdf) and the corresponding Help Center article (last updated April 19, 2026). Last verified May 27, 2026: the sports 0.07 multiplier, the 1.75¢ peak at 50¢, the 25%-of-taker maker rate, and the per-trade ceiling formula all remain current. Kalshi can change coefficients with notice; if you spot a mismatch between the displayed price on this site and what Kalshi quotes you at checkout, the schedule may have been updated and The Odds Gap may not have re-pulled it yet. Email admin@theoddsgap.com and the site will re-verify.
Polymarket US: per-contract taker fee, baked into the displayed price
Polymarket US is the only Polymarket venue on this site. It is the CFTC-regulated US exchange (QCX LLC), with its own order books, its own liquidity and its own fee schedule. The separate global Polymarket exchange is not part of the comparison, so every Polymarket price you see here is Polymarket US.
Its published taker fee has the same shape as Kalshi's: a parabola that peaks at the coin flip and fades to nothing at the wings.
fee = Θ × contracts × P × (1 − P) in dollars, where P is the contract price in dollars (0 to 1).
Θ is the exchange's own fee coefficient, currently 0.06 on every sports market. The Odds Gap reads Θ from the exchange per market, on every scan, rather than hardcoding it, so if the schedule changes the displayed price changes with it instead of waiting on a code change. At its peak, a coin flip, the fee is $1.50 per 100 contracts, which matches the published maximum.
Worked examples at the current 0.06 coefficient:
- An underdog at 39¢ → fee 1.43¢ per contract → effective 40.43¢ → +147 American instead of the raw +156
- A coin flip at 51¢ → fee 1.50¢ → effective 52.50¢ → −111 American instead of the raw −104
- A favorite at 62¢ → fee 1.41¢ → effective 63.41¢ → −173 American instead of the raw −163
What The Odds Gap displays for Polymarket US
Every Polymarket US price on the site is the effective, fee-inclusive price a taker pays: on moneylines, on every spread and total strike, and on futures. Each side of a market is quoted at its own ask, which is why the two sides add up to slightly more than 100%. That is the spread plus the fee, and it is the real cost of the round trip.
Depth gets the same treatment as every other exchange here. Each Polymarket US price is checked against its own order book before it is published: when the top of the book can absorb a $100 stake, the best ask is quoted, and when it cannot, the site walks down the ladder and quotes the price that stake would actually fill at. A side that cannot absorb the stake at all is dropped rather than shown at a price nobody can take.
How "Markets vs Books" is calculated (Markets vs Books tab)
For each game where a prediction market and the sportsbooks both have a market:
- Compute the sportsbook consensus implied probability. This is the de-vigged average across tracked books. (De-vigging removes the books' juice so the two sides sum to about 100% instead of about 104 to 108%.)
- Compare to each prediction market's effective price, its best ask with the venue's own fee applied.
- Show a row for each prediction market where the absolute difference is at least 2 percentage points AND the quote passes the sanity check below. If two venues beat the books on the same game, both rows appear (tagged with which prediction market is the source).
The 2pp floor exists because tiny disagreements (well under a point) get eaten by transaction friction: funding the account, the per-trade cost, the spread between bid and ask. Below 2pp it's not worth chasing.
One caution about reading that consensus as the truth, and it is measured rather than assumed. A 30-day study of every book's distance from this same de-vigged consensus found that how far a book sits from the market and whether it sits on the same side of it are close to unrelated, at a correlation of r = +0.03. A book can sit a long way from consensus because it is loose, which averages out across a season, or because it holds an opinion that repeats, which does not, and the distance on its own cannot tell those apart. That study also builds its consensus from pricing platforms rather than raw books, because Bally Bet, BetPARX and BetRivers run on one engine and a naive median counts that single opinion three times.
Sanity check on Kalshi quotes
A Kalshi row is hidden, even when the gap is wide, if either of the following is true:
- Rule 1. Overround too high. In a healthy two-sided market the YES and NO prices should sum to about 100 cents. Kalshi's per-trade fee creates a small spread, but anything where YES + NO is greater than 105 means the order book is thin or stale and the visible price isn't trustworthy.
- Rule 2. Direction flip. When at least three sportsbooks have priced the game and their de-vigged consensus says one team is the favorite (over 55% to win), but Kalshi has THAT SAME team priced as an underdog (under 50% on Kalshi), the Kalshi quote is almost always either stale or matched to the wrong contract. So the site drops it.
These rules cull obvious garbage. They do not catch every bad row, so the usual disclaimer applies: verify the Kalshi market is the one you think it is before you trade.
How spread and total lines are picked (Line Shop)
When you look at a Line Shop card, the spread and total pills show one number each (say, Cavaliers -9 at -110). That number is picked deliberately, not by which book happens to have the highest payout for that side.
For each game, the site computes the consensus line for each side. This is the line that appears most often across all tracked books. If two lines tie for most-common, the site picks the one with the higher numeric value. For a favorite (negative line) that means smaller magnitude (-9.5 wins over -10). For an underdog (positive line) that means larger cushion (+10 wins over +9.5). One rule covers both cases: pick whichever line is friendlier to the bettor.
Once the consensus line is set, the pill shows whichever book has the BEST PRICE at that line. If five books are at -9.5 and one book is at -10, the pill shows the -9.5 book with the best odds. The book offering -10 is excluded from the pill (you can still see it in "All Books").
This stops outlier lines from winning the pill. Before this rule, a book offering Cavaliers -10.5 at +122 would show up as the "best" price even though every other book was at -9 and the bettor would be taking a much harder spread for the better odds. Now the pill shows the line you can actually expect to find at most books.
Kalshi snapping
Kalshi typically lists multiple strikes per game (e.g., "Cavaliers win by 5 or more", "Cavaliers win by 10 or more"). When the site computes the consensus line from the sportsbooks and Kalshi happens to offer that exact line, The Odds Gap picks Kalshi's price for that strike and puts it on the card alongside the sportsbooks.
If Kalshi doesn't have the consensus line, Kalshi falls back to whichever of its strikes is closest to a 50/50 market. In that case Kalshi will appear in "All Books" at its own line, but it won't fight the consensus pill at a different line.
What "open" means, and what the colour under it means (Line Shop)
Under some prices on a Line Shop card there is a small muted line reading "PINN open" and a number. That is Pinnacle's opening line on the game, and PINN is Pinnacle. Where Pinnacle never priced the game it reads "BOL open" instead, which is BetOnline's. The label always names the book, because "open" on its own never said whose open it was.
The rule in one sentence: the opener is Pinnacle's first price, or BetOnline's if Pinnacle never priced the game, the label says which book it is, and where we cannot prove it is that book's first price we say "earliest" instead of "open".
Where an opening line is allowed to come from
Two books, and no others: Pinnacle, and where Pinnacle was not quoting at first listing, BetOnline. Both are origination books. They set a number and take the first money on it, and the rest of the market moves to them. Neither is bettable by most of this site's readers, which is why both are reference-only in the price ladders, and it is also exactly why their number is the one worth quoting as an open.
A retail book's first price on a game is a copy of an origination number, or a placeholder before one exists. It is a real price and it is not an opening line, so it never goes in that slot. When neither Pinnacle nor BetOnline had priced a game, no opening line is shown at all. A blank is the honest answer; a retail price wearing the word "open" is not.
In practice that blank lands almost entirely on games far from kickoff. Measured across the whole board on 25 August 2026: of the games starting within a week, 122 of 129 had an origination price; of the games more than four weeks out, essentially none did. Those far-out games fill in on their own as soon as one of the two books quotes them.
How the moment is found
Finding it takes a search rather than a lookup. The site keeps its own hourly record of prices, but the hourly record does not contain the moment a market opened: a game listed at 4am appears in our history at 7am when scanning resumes. So the site searches the odds feed's own archive, which can answer "which games existed at this timestamp" at five-minute resolution, narrowing down to the first timestamp at which the game existed at all, then reads every book's price in that one snapshot. First listings are thin. It is normal for only two or three books to have posted a price at that moment.
The search reaches back up to 180 days below the first time this site recorded a price for the game. That gap is real and it is often large: a game appears in the odds feed's schedule weeks before any book prices it, and this site only sees a game once a book has. Searching a day back, which is what the site did until 25 August 2026, answered "already listed" on 254 of 577 games and proved nothing about any of them.
Two honest limits, both of which the site tracks rather than papers over:
- Pinnacle does not always quote at first listing. When it has not, the site does not substitute a different book into the sharp slot. It shows Pinnacle's earliest price after that, stamped with its own time. That is still Pinnacle's opening line and it is still labeled "PINN open", but the game was on the board before that price existed, so the market may already have moved. Hover the label and the site says so. Quietly swapping in a different book's number would make a sharp opening line and a later price indistinguishable afterwards.
- Some games were already listed before the search window starts. For those the site stores the earliest price it can actually prove and marks it as a floor rather than an opening line, labeled "PINN earliest" and never "open". After the search window was widened this is about five games on a board of 595, down from 254.
So the small line under a price says one of two things, and the book's short name is always the first half of it:
- PINN open: Pinnacle's opening line on this game. BOL open is BetOnline's, shown only where Pinnacle never priced the game. Hover it and the site tells you whether that price was already there the moment the game was listed, or whether the game was listed first and the market may have moved before the book priced it.
- PINN earliest: the game was already listed when the search window started, so this is the earliest price the site can prove and not an opening line at all. BOL earliest is the same claim about BetOnline.
The same words are used everywhere the number appears: the board, the Pick Card, the game pages, the recaps and the partner pages. The site never invents an opening line, and a game whose open cannot be found shows no line at all.
The other books' prices from that same snapshot
Finding the moment a game was first listed reads every book's price in that one snapshot, not only the two origination books'. On a game page you can expand a chart, pick a book, and see that book's own figure from it. That figure is never called an open. It is labeled "DraftKings at first listing", naming the book the way the opener label does, and saying exactly what it is: that book's price at the moment the game was first listed. It is a real price, and for any book other than Pinnacle and BetOnline it is a copy of an origination number or a placeholder before one exists, which is why it does not get the word open.
Pick Pinnacle or BetOnline in that chart and the caption reads the same "PINN open" or "BOL open" as everywhere else, because for those two books that price is an opening line. Where the game was already listed before the search window starts, this caption weakens along with the opener's and reads "DraftKings earliest": the earliest price the site can prove, and no claim about a first listing. A book with nothing in that snapshot says "No captured price" rather than borrowing the number beside it.
The teal and amber colour
When the "open" line is coloured, teal means the sharp market has moved toward that side since it opened, and amber means it has moved away. Bettors call the first of those steam. This is one comparison per side per game: Pinnacle now against Pinnacle at the open. The same answer appears on every book's cell for that side, because it is a statement about the market, not about the book whose cell you are looking at.
Both ends of that comparison are de-vigged first, using the same power method described above. Without that step a book simply widening its margin, say -110 / -110 becoming -120 / -120, would register as a line move when nothing about the market's opinion had changed.
The colour is left off whenever the comparison would not be like-for-like: when the line itself has moved (an opener at -1.5 says nothing about a price at -2.5), when Pinnacle is not quoting the game now, when the reference price is BetOnline's rather than Pinnacle's, and on three-way soccer markets, where a two-way de-vig does not apply.
This is the site's only definition of "the line moved". The arrow beside the number on a Pick Card is the same comparison, so a card and the board can never disagree. It is deliberately not "the best price anywhere now against the open": a game that has picked up two more books since it was listed has a better best price without the market having changed its mind about anything, and counting that as movement would be measuring our own coverage.
How "Book Comparison" works (Book Comparison tab)
Every scan, the site records which book offered the best available price for each side of each game. A book's best-price share is the percentage of those scans where it was the leader. Higher means the book leads the market more often on the periods and sports tracked.
Ties count for everyone. When several books post the same top price on a side, every one of them is credited with the best price on that side, not just whichever the code happened to sort first. A book that reliably matches the market's best price is doing its job, and scoring it as a loser for never uniquely beating the field would misrepresent it. So the exact reading of the number is "at or tied for the best price", and two consequences follow: shares across all books sum to more than 100%, and the count of best-price finishes is therefore not a usable denominator for comparing groups of books, because a larger group collects more tie credit. Comparisons between groups on this site always use each venue's own quoted sides as its denominator instead.
Each month's figures are published as a dated record in the monthly Sportsbook Odds Reports, with the sample size and date range next to every number.
This is a market-quality measure only. It does not account for withdrawal speed, app reliability, customer service, promotions, or local availability. A book with a lower best-price share may still be the right book for you if it has the best app, the loosest withdrawal terms, or simply happens to be the only one legal in your state. The Book Comparison page is data, not a recommendation.
The standing, dated version of this measurement lives on the Best-Price Leaderboard, and the exchange-versus-sportsbook cut of it on Exchange and Prediction-Market Pricing. Those pages state one claim each, with the window, the sample size and the date it was computed, and they exclude the offshore books that the filterable table above can still show.
How "distance from the market" works (reference pages and research studies)
Dispersion is the mean absolute distance between a book's de-vigged price and the median of every other book quoting the same bet at the same moment, measured in probability points. One point means one percentage point of implied probability. Probability is used rather than American odds because ten cents means something very different at -110 than at +400, and averaging cents across a board quietly overweights longshots.
Spreads and totals are only compared when both prices sit on the same number, because Over 8.5 and Over 9.0 are different bets and comparing them just measures the half point. Exchange prices have their trading fee applied before comparison. Two-way markets de-vig to probabilities that sum to one, so both sides carry the identical absolute deviation, and only one side per market is kept so the sample counts are honest rather than doubled.
Dispersion is not a quality score, and this is the part most easily misread. A book scattered on both sides of the market is loose: half its prices are better for you than the field and half are worse. A book that lands on the same side of the field repeatedly has an opinion that repeats, and only that second thing is a weakness in the sense a bettor means. Distance alone cannot tell those apart, which is why the book weakness map measures signed bias and directionality alongside it.
What is deliberately not published: a book measured against its own closing price. It sounds like the obvious way to measure staleness and is close to useless, because it mostly measures how far the game moved and penalises a book for having quoted a game that later swung. The staleness study shows the working.
How the Parlay Builder works (Line Shop tab)
Most sportsbooks let you build parlays inside their app, but each book can only show you THEIR price. The Odds Gap parlay builder lets you pick legs from across the Line Shop, then shows you the combined parlay price at every sportsbook so you know which book is paying the most.
How to use it: click any pill on a Line Shop card to add it as a leg. The pill gets a gold border and a checkmark. Click it again to remove. The parlay drawer at the bottom of the screen shows your leg count and which book has the best combined price. Click the bar to expand it for full leg details, your stake, and the per-book leaderboard.
A few rules and constraints worth knowing:
- Cross-game only. No same-game parlays. If you click a second pill from a card that already has a leg in the parlay, the new pill replaces the old leg rather than adding alongside. This is intentional. Same-game legs are correlated (e.g., Lakers ML plus over total) and most sportsbooks won't accept them as a regular parlay anyway.
- Strict line matching. Spread and total parlays only count books that offer the EXACT line you picked. If you click Cavaliers -9 and one book is at Cavaliers -9.5, that book is excluded from the leaderboard. Books can't honor a -9 leg at their own -9.5 line. The leaderboard only ranks books where you can actually replicate the parlay.
- One book per parlay. You can't combine FanDuel's spread with DraftKings' total in a real bet, so the leaderboard shows the parlay price at each individual book. The "BEST" tag goes to whichever book has the highest combined price.
- Kalshi excluded. Kalshi recently launched its own parlay product called combos, which behaves like a sportsbook parlay (all legs must hit, single combined position). However, combo prices on Kalshi are set by a Request for Quote (RFQ) market: when a user creates a combo, market makers respond with live quotes, and the price isn't a deterministic function of the underlying contract prices. The Odds Gap can't honestly compute a Kalshi combo price by multiplying the leg prices the way it does for sportsbooks, so Kalshi doesn't appear in the leaderboard. If you want to take these legs on Kalshi, build the combo directly on Kalshi and use whatever quote you receive.
- Polymarket US excluded. Its combos are priced by request-for-quote, the same structure as Kalshi's, so the combo price is set by market makers rather than by the leg prices. Its single-leg prices still compete everywhere.
- ProphetX is priced at its parlay rate, not its straight-bet rate. ProphetX charges 2% commission on straight bets but 0% on parlays. Everywhere else on the site the ProphetX number is shown after the 2%, so in the parlay leaderboard that commission is stripped back out. Otherwise ProphetX would look worse than it really is on exactly the bet where it charges least.
- Novig is priced with its parlay fee applied. Novig runs real parlays and quotes them as one all-in price with a fee inside (see the Novig section above). Multiplying its leg prices would advertise a price nobody can get, so the fee is applied once to the combined price. The load is heaviest on near coin-flip parlays and fades toward heavy favorites and longshots.
- Stake input is live. Type your stake amount in the drawer, and the payout column updates in real time across every book.
- Survives page reload. Your parlay is saved in your browser. If you close the tab and come back, the legs are still there. If any of those games has already started, those legs are pruned automatically.
- Up to 12 legs. After that, new clicks are ignored.
To actually place the parlay, replicate the legs at the chosen book. The Odds Gap doesn't place bets and never will.
The confidence signal and the v1 record
Correction, August 12, 2026: v1 is retired and its record does not show an edge. About 86% of the graded plays in that record were priced at one exchange, and on that venue we derived a side's price from the opposite side's order book. That venue publishes both sides of a market as real offers, each funded by traders who want the other side, so the two always sum to more than 100%, and mirroring one into the other returns a price better than anything you could have bet. Checked against raw order books, 49 of 49 affected sides were quoted better than the price their own book actually filled a $100 bet at, a median gap of 7.9 points of implied probability with no exceptions. Repriced at that correction, the record's +7.59% becomes -3.46% and its top tier's +10.42% becomes -2.50%. Zero dollars were ever staked on any of it, nothing was ever sold, and the whole ledger stays published unchanged at /signal-record. Those prices stopped being published the day the bug was found. Everything the record appeared to establish, including the tier separation and the closing-line-value split described below, is demoted to an untested hypothesis until it is re-measured on clean data. The real-money forward test was canceled before its first stake. A v2 is targeted for October 2026 with its own gates, starting from zero. What follows describes v1 as it was built, and is kept for the record.
The signal scores +EV plays from 0 to 100 using the size of the edge multiplied by four reliability factors: line movement direction, market tightness, book depth, and price corroboration. Scores bucket into three tiers. The edge contribution deliberately saturates, so beyond a certain size a bigger quoted edge stops adding score, because past that point an outsized number is more often a data problem than more value.
The v1 ruleset is frozen. From the freeze forward, every scored play is logged and published, wins and losses, across all tiers, including the plays the score rated poorly. The record runs for 90 days from that date with a minimum of 5,000 graded plays in the flagged tiers, whichever comes later, across every player prop league active in that window, and the result stands either way. Nothing is filtered, retired, or restated. If the low tiers do not underperform the high tiers, the score is noise, and the record page says so in a sentence it writes itself from the live numbers.
Only a structural change can create a v2: a new league, a new data source, or a change in an exchange's fee model. Performance can never trigger a new version, and the v1 record stays published permanently regardless.
The freeze is enforced rather than promised. A fingerprint covers every value that can move a score: the thresholds, the daily caps, the switches that decide which venues price a market, the price and de-vig code, and the list of books allowed to produce a flagged play. It is re-checked on every restart and once per scan. If any of it moves, a new entry is recorded, the version label stops being applied to new plays, and the change is published on the record page with what moved.
Closing line value, and why we publish it split in two
Closing line value compares the price you took against where the market ended up. The usual single number blends two different things, and the blend flatters the score, so the record page publishes the split instead.
The published figure is the market's de-vigged fair probability at close, minus the raw implied probability of the price we flagged. Insert the market's fair probability at the moment of the flag and it separates exactly, with nothing left over:
- The market moved: closing fair minus entry fair. How far the market's own number travelled toward our side after we flagged it. This is the only half a confidence score can take credit for.
- We shopped: entry fair minus our price. How much better our price already was than the market when we took it. This is identical to the edge by construction, and it is line shopping across twenty books doing its job rather than the score predicting anything.
A stricter second reading is accruing forward from the day the split shipped: our entry price against the flagged book's own closing number, and against the best number available anywhere at close. That needs the whole closing price ladder stored, which nothing captured before that date, so it fills forward only and older plays show the combined figure with this note rather than a reconstruction.
The hash-verified log
Every settled play date is serialized in a fixed published format, hashed, and chained to the previous day's hash, with the chain mirrored outside our own database. A hash chain cannot stop an edit. It makes an edit impossible to hide: change one graded result and that day's hash moves, every link after it stops reproducing, and the break names the exact date. Late corrections are real, so a box score that arrives after a day is sealed produces a new link at a higher revision with the earlier one left in place. The exact format, the endpoints, and a short script that checks every link are at /signal-record/verify.
The full ledger, every tier and every weakness, is at /signal-record. That page is distinct from /record, which is the single featured +EV pick each day.
Sportsbooks tracked
US-licensed: DraftKings, FanDuel, BetMGM, Caesars, theScore Bet, Fanatics, BetRivers, Hard Rock Bet, BetPARX, Bally Bet
Prediction markets and exchanges: Kalshi, Polymarket US, ProphetX, Novig
Offshore and sweepstakes: Pinnacle, BetOnline, Bovada, MyBookie, LowVig, Fliff
Pinnacle is shown as a reference price. It is not legal in most US states. Offshore books carry counterparty risk that regulated US books do not.
Prices from the prediction markets and exchanges are shown after fees wherever a fee applies, and shown raw where none does. Each venue charges differently, so a raw order-book price is not comparable to a sportsbook line until its own fee is taken out of it. The per-venue detail is in the prediction markets section above. Where a venue charges nothing on a given bet, nothing is deducted: padding a price with a fee that is not charged misleads exactly as much as omitting one that is.
Exchange prices are also quoted as what you could actually fill, not as the best price available for a single dollar. The site walks the order book down for a $100 stake and quotes the price that stake would really get, because top-of-book dust on a thin market is not a price anyone can take.
That rule exists because this site broke it. For months the prop board mirrored one side of an exchange's order book into the other instead of reading a real offer, and the full account is published as the exchange price autopsy, which found that 19 percent of quoted exchange prop sides were derived rather than obtainable. The three permanent checks it ends with are the rules the pricing path now runs under: a served two-sided pair from one book may never sum below 100 percent implied, a price is never derived from the opposite side on a venue that already publishes both sides as offers, and a record concentrated in one venue has to be reported by venue and not only in total.
State filtering
The site has a state picker in the top nav. When you select a state, books that are not legally available in that state are hidden from every odds display. The list is maintained from public regulator records and is updated when new states approve new books.
The state filter is a convenience. It is your responsibility to know what is legal where you are.
What the site does NOT do
- The Odds Gap does not pick winners. There is no model predicting outcomes.
- The Odds Gap does not handicap. There is no expert handing you "locks."
- The Odds Gap does not factor in injury news, weather, or anything beyond price.
- The Odds Gap does not place bets for you, and never will.
- The Odds Gap does not track your bankroll, your bets, or your win-loss record.
The site does one thing: it shows you where the price is best, on the markets you've already chosen.
Reporting a methodology bug
If a number on the site looks wrong to you, email admin@theoddsgap.com with:
- The page (URL).
- The game and market.
- What you saw vs. what you expected.
- Roughly when you saw it (timestamp helps because the cache rotates).
The Odds Gap reads every report and replies.
Last updated: August 14, 2026