Devig and exchange fees
Two optional query parameters, devig and fees, add fields next to each outcome's price. They never change price. Both need the Starter plan or above; a Free key gets 403 PLAN_REQUIRED naming starter. They work on /odds, /odds/live, a single event's odds, the props routes, the historical odds, openers and closing routes, and the live feed (add "devig" and "fees" to the subscribe message). A request still counts once.
devig: fair probabilities
devig=true adds fair_prob (0 to 1) and fair_price (in your oddsFormat) to every outcome whose complete set of sides is present: the book's price with its margin removed. devig=true uses the power method. To pick another method, pass it by name:
devig= | What it does |
|---|---|
power (same as true) | Raises each implied probability to one common power so the set adds to 100 %. Takes proportionally more margin off the longshots, which is where books keep it. |
multiplicative | Divides each implied probability by the total. The method a basic no-vig calculator uses. |
shin | Shin's model of informed money. For a two-way market it gives the same numbers as additive. |
additive | Takes the same slice of margin off every side. |
On a balanced line (-110 / -110) every method gives 50 %. They part ways on lopsided markets: at 1.20 / 5.00 the favourite is 82.2 % under power and 80.7 % under multiplicative, and at 1.05 / 11.00 it is 94.3 % against 91.3 %. If you compare against a multiplicative no-vig calculator, pass devig=multiplicative. The method used is returned in the X-Devig-Method response header.
Which outcomes get a fair value
- Each side needs its partner at the same line: Over with Under, a team at
-3.5with the other team at+3.5, every leg of a moneyline. Alternate lines are paired one line at a time. - A soccer moneyline must carry all three of home, draw and away; a book that lists only two gets nothing.
- A missing side means
fair_probandfair_priceare absent. They are never zero and never estimated. Double chance and one-sided markets (anytime scorer) are skipped. - A set that is crossed (the prices add to less than 100 %) or a stub (more than 125 %) is skipped.
- On an exchange or prediction market the price is the ask on each side, so the gap between the two sides is the spread, not a margin.
fair_probis then the middle of the spread.
The maths starts from the American price, so fair_price in decimal has three places while price keeps two.
fees: price after the exchange's taker fee
An exchange's or prediction market's price is the best resting price you would take, before its fee. fees=taker adds net_price to those outcomes, in your oddsFormat (decimal to three places), and a fees object to the market that says which published schedule was used (rate_elsewhere appears where the rate depends on your country):
"fees": {"basis": "taker", "model": "per_contract", "rate": 0.05, "rate_source": "published", "effective": "2026-07-10"}model: per_contract venues charge a fee per contract that grows with price x (1 - price), so the price you effectively pay is price + rate x price x (1 - price). model: on_winnings venues take a commission from winnings, so net_price is the price if the bet wins. A book or date with no published schedule here carries neither field.
| Venue | Published taker fee (read 28 Oct 2026) | Source |
|---|---|---|
| Polymarket | Per contract, rate x price x (1 - price). Sports markets: 0.05 since July 2026, 0.03 on NFL and college football. Makers pay nothing. Polymarket sets the rate per market; we apply each sport's schedule (rate_source: "schedule"), so a market created before 10 July 2026 that still trades at 0.03 is shown at its sport's current rate. | docs.polymarket.com/trading/fees, market fee schedules |
| Kalshi | Per contract, 0.07 x price x (1 - price), rounded up to the cent per order. MLB 0.035 since 7 Aug 2026. | Kalshi fee schedule, series fee settings |
| Novig | Per contract, 0.06 x price x (1 - price), on fills made while the game is live. Pre-match: none. | docs.novig.com/fees |
| SX Bet | 1 % of net winnings, takers only. | docs.sx.bet/user-guides/trading/fees |
| ProphetX | 2 % of net gains per market (straight bets). | prophetx.co/t-c/trading-fees |
| Betfair | 5 % default market base rate (UK, Ireland, Italy, Gibraltar, Malta; rate), 6.5 % in most other countries (rate_elsewhere); lower with a Rewards package or a Discount Rate. | support.betfair.com, "Market Base Rate" |
| Matchbook | Commission on net winnings, none on losing bets: 2 % for customers in the UK, Isle of Man, Channel Islands and Ireland (rate), 4 % for everyone else (rate_elsewhere). Enhanced special markets are 2 % for all. Commercial members can pay additional fees, which are not shown. | Matchbook terms, section 6.4, and FAQ "Commissions" |
| 4Casters | 1 % commission (0.75 % on MLB moneylines). Losing bets also pay a commission, which net_price does not include. | 4casters documentation, "Commission Fee" |
| Fanatics Markets | Fee already inside price ($0.00034 to $0.02 per contract). fees.model is included; there is no net_price. | fanaticsmarkets.com, fee disclosure, effective 2 Sep 2026 |
What you actually pay can differ: order size (Kalshi and Fanatics round each order up to the next cent), account tier, discounts and promotions, and maker versus taker. We show the published taker schedule and nothing we cannot source.
Historical routes
On the historical odds, openers and closing routes the same fields appear. Fees use the schedule in force on the quote's own timestamp (recorded_at). A quote counts as in-play, for Novig's live-only fee, from five minutes after kickoff, so a closing price stamped a minute or two late is still pre-match. History has no fees before a venue's schedule start here: Polymarket from 30 March 2026, Kalshi from 5 February 2026, Novig from 15 October 2026, Fanatics Markets (already inside price) from 2 September 2026, and Betfair, Matchbook, 4Casters, SX Bet and ProphetX from 28 October 2026 (their pages carry no start date). On a change series, the first point is the full market and later points carry changed outcomes; with devig a point also repeats the other side of a changed outcome when that side's fair_prob moved although its price did not. Exchange quotes in history keep bid_prob, ask_prob and mid_prob; mid_prob is already the fair value there.
Example
curl -H "X-API-Key: $ODDSLINK_API_KEY" \
"https://oddslink.app/v1/sports/nba/odds?markets=h2h&bookmakers=pinnacle,kalshi&oddsFormat=decimal&devig=true&fees=taker"