Sports Odds API: Pinnacle, Bovada, Kambi + Fair Odds & EV
Pricing
from $6.00 / 1,000 odds rows
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
Maintained by CommunityActor 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
| league | Pinnacle | Kambi | LeoVegas | Bovada (opt-in, best effort) |
|---|---|---|---|---|
| NFL, NCAA football | yes | yes | yes | no |
| NBA, NHL, MLB | yes | yes | yes | best effort |
| Premier League, La Liga, Serie A, Bundesliga, Ligue 1, Champions League, MLS | yes | yes | yes | no |
| Brasileirão Série A and B | yes | yes | yes | best 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}
| field | meaning |
|---|---|
eventKey | Same value for the same game at every book, so you can group by it |
market | moneyline (1X2 with draw in soccer), spread (Asian handicap in soccer), total |
line | Spread points for that side, or the total. null for moneyline |
fairProb | Probability with the bookmaker margin removed. Taken from Pinnacle when Pinnacle quotes the same line, otherwise from the row's own book |
evPercent | Expected value of the price against Pinnacle's fair probability. Only filled when Pinnacle quotes the same line: no reference, no EV |
isBestPrice | Highest price for that outcome among the books, on the same line only (a -3.0 spread is never compared with a -2.5) |
arbitrage, arbMarginPercent | Set on the best-priced rows when the best prices across books add up to a guaranteed margin |
bookMarginPercent | The book's overround on that line |
previousPriceDecimal, previousLine, isChanged, isNew | Movement since your previous run (see below) |
maxStake | Pinnacle'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
STATUSrecord (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
kambibook. 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
daysAheadwindows 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.