Loading ticker...
@TheOddsGap

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

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.

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"):

  1. Convert every available book's American odds to implied probability.
  2. Find the BEST price (highest implied payout) and the NEXT BEST price across all tracked books.
  3. 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. A 5pp+ gap 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:

  1. 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.
  2. 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.
  3. Anything where EV % is greater than zero is shown as a +EV play.

Caveats:

Prediction markets, and how The Odds Gap prices them

The Odds Gap tracks two prediction-market exchanges alongside the traditional sportsbooks: Kalshi and Polymarket. Both are venues where binary YES/NO contracts trade peer-to-peer, with the price of YES sitting between 1¢ and 99¢ as a direct implied probability. A contract trading at 68¢ is the market's implied 68% probability that YES happens.

Three things make these exchanges structurally different from a traditional sportsbook:

  1. 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%). Kalshi and Polymarket prices ARE the probability — there is no juice baked in. Both venues make their money differently from a book (per-contract taker fee on Kalshi, near-zero fees on Polymarket — both detailed below), not on a hidden vig.
  2. Peer to peer. When you bet on Kalshi or Polymarket, 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.
  3. Both regulated by the CFTC. Kalshi has been a CFTC-regulated Designated Contract Market since 2021. Polymarket's US entity (QCX LLC d/b/a Polymarket US) is also a CFTC-regulated DCM as of 2025. 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 practical upshot: 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.

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:

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, and 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:

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 by definition a taker fill. 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 — but 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), last verified against the Feb 5, 2026 effective version. 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: per-trade fee, baked into the displayed price

Polymarket's official trading-fees documentation lists a feeRate of 0.03 for Sports markets, with the fee funding the Maker Rebates Program. The Odds Gap verified the actual buy-flow math against six live UI screenshots and the formula reduces cleanly to:

fee_pct = 0.03 × (1 − P)  of the wager dollar amount, where P is the orderbook ask price in dollars (0 to 1).

Unlike Kalshi (symmetric P × (1 − P) parabola peaking at coin-flip), Polymarket's fee is asymmetric: higher on underdog buys, lower on favorite buys. The fee on a 39¢ contract is 1.83% of your wager; the same trade size on a 62¢ contract is 1.14%; on a 95¢ contract it would be 0.15%.

Six concrete data points verified against the live Polymarket buy-flow UI on May 13, 2026 — all match to the cent:

What The Odds Gap displays for Polymarket

For every Polymarket price on the site — Line Shop, Markets vs Books, Book Comparison, futures, anywhere — the site pulls the live orderbook for each market via Polymarket's CLOB API, applies the fee math above, and uses the resulting effective price as what a taker actually pays. The math is symmetric with how the site handles Kalshi's taker fee: raw ask + fee adjustment → effective price → American odds.

If the orderbook fetch ever fails (rare — Polymarket's API is generous and the result is cached alongside the events fetch), The Odds Gap falls back to the outcomePrices midpoint with the same fee adjustment applied. That fallback is slightly more favorable than the user would actually get because the midpoint is half-a-cent better than the inside ask, but it's a reasonable estimate when the orderbook isn't available.

A note on the Polymarket fee curve vs the docs table

Polymarket's docs page also publishes a "100 shares at $X" fee table that lists smaller numbers than the live buy-flow charges — peak 0.75% per their table versus the ~1.5% peak observed in the UI. Their stated formula C × p × feeRate × (p × (1 − p))^exponent would produce the smaller table values, but the live buy-flow on the markets tested consistently charges the higher rate that matches the empirical formula The Odds Gap uses. The 0.03 feeRate is consistent between the docs and the live UI — only the way that rate enters the formula differs.

The Odds Gap uses the empirically verified formula because it matches what users actually pay at checkout, exactly to the cent across all six data points tested. If Polymarket changes the formula or rate in the future, the math here is one line in polymarket_taker_fee_rate; email admin@theoddsgap.com if you spot a mismatch between what the site displays and what Polymarket quotes you at checkout.

How "Markets vs Books" is calculated (Markets vs Books tab)

For each game where a prediction market (Kalshi or Polymarket) and the sportsbooks both have a market:

  1. 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%.)
  2. Compare to each prediction market's effective price — Kalshi's yes_ask + taker fee, Polymarket's orderbook best ask.
  3. 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 both Kalshi and Polymarket 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.

Sanity check on Kalshi quotes

A Kalshi row is hidden, even when the gap is wide, if either of the following is true:

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). Same rule, both cases. It always picks the line that's 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.

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.

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.

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:

  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. Stake input is live. Type your stake amount in the drawer, and the payout column updates in real time across every book.
  6. 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.
  7. 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.

Sportsbooks tracked

US-licensed: DraftKings, FanDuel, BetMGM, Caesars, ESPN BET, Fanatics, BetRivers, Hard Rock Bet, BetParx, Bally Bet, WynnBet
Regulated exchange: Kalshi
Offshore and sweepstakes: Pinnacle, BetOnline, Bovada, 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.

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 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 Odds Gap reads every report and replies.

About this site →

Last updated: April 29, 2026