Sports Odds API: Pinnacle, Bovada, Kambi + Fair Odds & EV avatar

Sports Odds API: Pinnacle, Bovada, Kambi + Fair Odds & EV

Pricing

from $6.00 / 1,000 odds rows

Go to Apify Store
Sports Odds API: Pinnacle, Bovada, Kambi + Fair Odds & EV

Sports Odds API: Pinnacle, Bovada, Kambi + Fair Odds & EV

Pre-match odds from Pinnacle, Bovada, Kambi and LeoVegas, matched across books, with no-vig fair odds, EV vs Pinnacle, arbitrage and line movement.

Pricing

from $6.00 / 1,000 odds rows

Rating

0.0

(0)

Developer

Caio Medeiros de Paula

Caio Medeiros de Paula

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

20 days ago

Last modified

Categories

Share

Pre-match odds from Pinnacle, Kambi, LeoVegas and Bovada, with the same game matched across books, plus no-vig fair odds, EV against Pinnacle, arbitrage flags and line movement between runs.

Built for European and Brazilian football as much as for US sports: Premier League, La Liga, Serie A, Bundesliga, Ligue 1, Champions League, Brasileirão Série A and B, MLS, NFL, NCAA football, NBA, MLB and NHL.

Coverage

leaguePinnacleKambiLeoVegasBovada (opt-in, best effort)
NFL, NCAA footballyesyesyesno
NBA, NHL, MLByesyesyesbest effort
Premier League, La Liga, Serie A, Bundesliga, Ligue 1, Champions League, MLSyesyesyesno
Brasileirão Série A and Byesyesyesbest effort

Bovada is off by default. From cloud servers it sometimes sends an empty board for a league it served minutes earlier; when you turn it on, the STATUS record tells you on every run whether it answered.

What you get

One row per game × market × outcome × bookmaker:

{
"eventKey": "nfl|2026-10-02T00:15Z|cleveland-browns|pittsburgh-steelers",
"startTime": "2026-10-02T00:15:00Z",
"league": "nfl",
"home": "Cleveland Browns",
"away": "Pittsburgh Steelers",
"book": "bovada",
"market": "moneyline",
"outcome": "away",
"line": null,
"priceDecimal": 1.69,
"priceAmerican": -145,
"impliedProb": 0.5917,
"fairProb": 0.58,
"fairSource": "pinnacle",
"bookMarginPercent": 3.62,
"isBestPrice": true,
"evPercent": -1.99,
"arbitrage": false,
"previousPriceDecimal": null,
"isChanged": false,
"booksInGame": 4
}
fieldmeaning
eventKeySame value for the same game at every book, so you can group by it
marketmoneyline (1X2 with draw in soccer), spread (Asian handicap in soccer), total
lineSpread points for that side, or the total. null for moneyline
fairProbProbability with the bookmaker margin removed. Taken from Pinnacle when Pinnacle quotes the same line, otherwise from the row's own book
evPercentExpected value of the price against Pinnacle's fair probability. Only filled when Pinnacle quotes the same line: no reference, no EV
isBestPriceHighest price for that outcome among the books, on the same line only (a -3.0 spread is never compared with a -2.5)
arbitrage, arbMarginPercentSet on the best-priced rows when the best prices across books add up to a guaranteed margin
bookMarginPercentThe book's overround on that line
previousPriceDecimal, previousLine, isChanged, isNewMovement since your previous run (see below)
maxStakePinnacle's maximum risk stake on that line, when published

Line movement

The actor keeps the last price of every line in a named key-value store in your account (sports-odds-line-state by default). Each run reports what moved since the previous one, including when the main line itself moves (for example from -3.0 to -2.5).

Schedule it every 10 minutes with Only new or changed lines on and it becomes a line-movement feed. The first run returns everything.

Examples

Every NFL line with EV, next 7 days

{ "leagues": ["nfl"], "daysAhead": 7 }

Premier League and Brasileirão, moneyline only, next 10 days

{ "leagues": ["epl", "brasileirao_a"], "markets": ["moneyline"], "daysAhead": 10 }

NBA movement feed (schedule every 10 minutes)

{ "leagues": ["nba"], "onlyChanges": true }

Reliability

  • Every run writes a STATUS record (key-value store of the run) with one entry per league and book: rows returned, HTTP status, error. A source that returns nothing is reported as a problem, never as an empty success.
  • If no odds come back and a source failed, the run fails, so Apify's failure notification reaches you when you schedule it.
  • One broken source does not stop the others.

Honest limitations

  • Kambi counts as two books, not ten. Unibet, Paf, BetRivers and other Kambi brands return identical prices (measured), so they are served as one kambi book. LeoVegas runs on Kambi with its own margin and is a separate book.
  • Bovada is opt-in and best effort. It sends an empty board to cloud servers for the NFL, NCAA, the big European leagues, the Champions League and MLS, so it is never asked for them, and it is intermittent for the rest.
  • DraftKings, FanDuel and ESPN are not included in this version.
  • Pre-match main lines only: no player props, no alternate lines, no in-play.
  • Kambi needs one request per game for spreads and totals, so long daysAhead windows make runs slower.
  • Pinnacle and Bovada answer only from some countries. The default US datacenter proxy handles that; residential proxies are not needed. If your Apify plan does not include the proxy country you pick, the status record says so (HTTP 407).

Pricing

Pay per result: you are charged per odds row returned. Status records are free.

Disclaimer

Data comes from the public JSON feeds the bookmakers' own websites load. It is provided for information and research. Not affiliated with any bookmaker. Check the rules that apply where you live before betting.