Sports Betting Odds Scraper - Live Lines, Arbitrage & +EV
Pricing
from $4.40 / 1,000 game / event odds records
Sports Betting Odds Scraper - Live Lines, Arbitrage & +EV
Scrape live sports betting odds from FanDuel, Bovada & Pinnacle (sharp lines): moneyline, spread & totals for NFL, NBA, MLB, NHL, UFC, soccer & more. Best price per outcome, no-vig fair odds, arbitrage & +EV value detection, line-movement monitoring. No third-party API key. JSON, CSV, Excel.
Pricing
from $4.40 / 1,000 game / event odds records
Rating
0.0
(0)
Developer
Scrape Sage
Maintained by CommunityActor stats
3
Bookmarked
528
Total users
59
Monthly active users
8 minutes ago
Last modified
Categories
Share
Sports Betting Odds Scraper - Live Lines, Best Price, Arbitrage & +EV
Disclaimer: This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by the sportsbooks and odds sites it covers, or any of their owners or subsidiaries. All trademarks mentioned are the property of their respective owners. Site names are referenced only to describe the publicly available sources this Actor collects data from.
Pull live sports betting odds from FanDuel, Bovada and Pinnacle in one run - moneyline, spread/handicap and totals for NFL, NBA, MLB, NHL, NCAA football and basketball, CFL, WNBA, UFC/MMA, boxing, tennis, golf matchups and soccer (Premier League, Champions League, Europa League, La Liga, Serie A, Bundesliga, Ligue 1, MLS, Liga MX, World Cup). Every game comes back as one clean record with every book's price side by side, the best price per outcome (line shopping), no-vig fair odds for moneylines, spreads and totals, and automatic arbitrage and +EV value-bet detection - plus the game's rotation number, team short names and logos, Pinnacle's bet limit on every line, a direct link to the game page and the moment each book's prices were current.
No third-party odds API key. The actor reads each sportsbook's own JSON directly - fast, keyless, no browser. Add monitoring mode to capture only new games and line movement since your last run.
Why this sports odds scraper?
This actor aggregates multiple books directly and ships a complete, actionable odds dataset:
| Feature | This actor |
|---|---|
| Books in a single run | ✅ FanDuel + Bovada + Pinnacle (sharp) |
| Needs a paid third-party odds API key | ✅ No - direct from each book |
| Best price per outcome (line shopping) | ✅ |
| No-vig fair odds & implied probability | ✅ moneyline, every spread and total line, per book + sharp/consensus |
| Arbitrage detection with stake split | ✅ legs always from two or more books |
| +EV value bets vs the sharp line | ✅ moneylines, spreads and totals |
| Moneyline + spread + totals (full game) | ✅ all three, quarter (Asian) lines read exactly |
| 2-way and 3-way (soccer draw) markets | ✅ |
| Rotation numbers, team short names & logos | ✅ |
| Bet limits on the sharp book's lines | ✅ Pinnacle, per line |
Price freshness per book (pricesAsOf) | ✅ |
| Deep link to the book's game page | ✅ |
| Live / in-play odds | ✅ opt-in |
| Line-movement monitoring (only changes) | ✅ |
| Output as rich per-game records or flat rows | ✅ both |
Pinnacle is the book sharp bettors price off because it runs the lowest margin (often ~2% vs 4-5% at recreational books). This actor uses Pinnacle's no-vig line as the fair-value reference, so a FanDuel or Bovada price that beats it is flagged as +EV automatically - and Pinnacle's bet limit on each line tells you how much the sharp book trusts its own number.
Accurate cross-book matching
The value of an odds feed is only as good as its matching. Each game is merged across books only when both teams match under rules built for how each kind of league writes names (pro "City Mascot" names, college schools, soccer clubs, fighters and tennis players), within that sport's start-time window, with one listing per book. Every price is placed on the right side from the book's own home / away / draw marker, never by guessing from a name. In practice that means:
- "Man City", "Manchester City" and "Paris St-G" / "Paris Saint-Germain" merge into one game; "Kansas" and "Kansas State", or "Ohio" and "Miami Ohio", never do.
- A book's esports games (eBasketball, eSoccer) and its season, series and team-total markets never mix into league game lines.
- Tennis spreads and totals are game lines at every book (Pinnacle's set lines are not mixed in).
- An arbitrage always uses prices from at least two different books, and a live game only compares prices that were current within the last 90 seconds.
What you get
| Field | What it is |
|---|---|
eventName, homeTeam, awayTeam, startTime | The game with a UTC start time, plus isLive for in-play games |
rotationNumber | The rotation number Pinnacle lists for the matchup - the id bettors, odds screens and other feeds key on |
homeTeamAbbr, awayTeamAbbr | Short display names as the books show them (e.g. "LA Angels", "Yankees") |
homeTeamLogo, awayTeamLogo | Team logo image URLs (player-nationality flags for tennis), ready for a dashboard or comparison widget |
books, bookCount, sharpBook | Which books priced the game and which one is the sharp reference |
markets.moneyline / spread / total | Every book's price per outcome with American and decimal odds, implied probability, the best price - and on Pinnacle lines the betLimit |
fairProbabilities, noVigByBook | No-vig fair odds per book and the sharp/consensus fair line (each spread and total line carries its own fairProbabilities too) |
arbitrage, valueBets | Guaranteed-profit opportunities with the exact stake split, and +EV prices vs the fair line |
pricesAsOf | When each book's prices were current (the book's answer, minus its cache age); each flat row carries its own book's time as priceAsOf |
booksCompared | The books whose prices took part in this game's arbitrage and +EV checks |
eventUrls | Direct link to the game page at the books that publish one (Bovada) |
sources | Per-book facts: the book's own event id, last odds update time and number of markets (Bovada), betting cutoff, live-betting and alternate-line availability (Pinnacle), same-game-parlay eligibility and competition name (FanDuel), and that book's pricesAsOf |
Use cases
- Line shopping - always bet the best available number. Each outcome shows every book's price and which book has the best one.
- Arbitrage / sure bets - surface games where the best price on each side guarantees a profit, with the exact stake split per leg.
- +EV / value betting - find recreational-book prices that beat Pinnacle's sharp no-vig fair odds on moneylines, spreads and totals, and read the bet limit to see how firm the sharp line is.
- Line-movement & steam tracking - schedule the actor with monitoring mode to capture only odds that moved, perfect for alerts.
- Models & backtesting - feed clean, normalized moneyline/spread/total data (American + decimal + implied probability) into your prediction or pricing models; rotation numbers make it easy to join with other feeds.
- Odds comparison sites, bots & dashboards - power a comparison widget, Discord/Telegram bot, or BI dashboard with structured multi-book odds, team logos and short names ready to render.
How to use
- Sign up for Apify - the free plan is enough to try this actor.
- Open the Sports Betting Odds Scraper, pick your leagues, books and markets, set Max events, and click Start.
- Watch games stream into the dataset table.
- Export as JSON, CSV, Excel, XML or RSS - or pull results via the Apify API.
Input
{"leagues": ["NFL", "NBA", "NHL", "EPL", "UCL"],"books": ["pinnacle", "fanduel", "bovada"],"markets": ["moneyline", "spread", "total"],"outputMode": "events","includeLive": true,"onlyArbitrage": false,"maxEvents": 200}
- leagues - MLB, NBA, WNBA, NCAAB, NFL, NCAAF, CFL, NHL, UFC, Boxing, ATP, WTA, PGA (matchups), and soccer: EPL, UCL, UEL (Europa League), La Liga, Serie A, Bundesliga, Ligue 1, MLS, Liga MX, FIFA World Cup. Out-of-season leagues simply return nothing.
- books -
pinnacle(sharp reference),fanduel,bovada. Use 2+ to unlock best price + arbitrage. - markets -
moneyline,spread(run line / puck line / handicap),total(over/under). - outputMode -
events(one rich record per game, default) orrows(one flat row per book × market × selection). - includeLive (default true) - include in-play games.
- includeAlternateLines (default false) - capture every alternate spread & total, not just the main line.
- onlyArbitrage / onlyValueBets - emit only games with an arbitrage or a +EV bet.
- minArbitrageProfit / minValueEdge - minimum % thresholds for those flags.
- monitorMode (default false) - emit only new games and moved lines since the last run (great with Schedules).
- maxEvents - cap on games per run (live games first, then the soonest). Leave it empty for up to 200. An API call that sets no leagues, books, markets or Max events runs a 25-game preview.
- fanduelState - which state's FanDuel lines to read (default Virginia).
Output
Event mode - one rich record per game (type: "event"):
{"type": "event","eventKey": "MLB|2026-06-17|cincinnati reds-new york mets","sport": "Baseball","league": "MLB","leagueName": "MLB","eventName": "New York Mets @ Cincinnati Reds","homeTeam": "Cincinnati Reds","awayTeam": "New York Mets","startTime": "2026-06-17T16:40:00.000Z","isLive": false,"books": ["pinnacle", "fanduel", "bovada"],"bookCount": 3,"sharpBook": "pinnacle","markets": {"moneyline": {"selections": {"home": {"team": "Cincinnati Reds","prices": [{ "book": "pinnacle", "american": 115, "decimal": 2.15, "impliedProbability": 0.4651, "betLimit": 2500 },{ "book": "fanduel", "american": 114, "decimal": 2.14, "impliedProbability": 0.4673, "betLimit": null },{ "book": "bovada", "american": 111, "decimal": 2.11, "impliedProbability": 0.4739, "betLimit": null }],"best": { "book": "pinnacle", "american": 115, "decimal": 2.15 }},"away": { "team": "New York Mets", "prices": [ "..." ], "best": { "book": "pinnacle", "american": -127 } }},"fairProbabilities": { "home": 0.454, "away": 0.546 },"fairReference": "pinnacle","bestPrice": { "home": { "book": "pinnacle", "american": 115 }, "away": { "book": "pinnacle", "american": -127 } }},"spread": { "lines": [ { "point": 1.5, "awayPoint": -1.5, "home": { "best": { "book": "pinnacle", "american": -141 } }, "away": { "best": { "book": "bovada", "american": 125 } }, "fairProbabilities": { "home": 0.567, "away": 0.433 }, "fairReference": "pinnacle" } ] },"total": { "lines": [ { "point": 9, "over": { "best": { "book": "fanduel", "american": -108 } }, "under": { "best": { "book": "bovada", "american": -105 } }, "fairProbabilities": { "over": 0.492, "under": 0.508 }, "fairReference": "pinnacle" } ] }},"arbitrage": { "exists": false, "count": 0, "opportunities": [] },"valueBets": [],"sourceEventIds": { "pinnacle": "1612345678", "fanduel": "34821316", "bovada": "30196588" },"rotationNumber": 973,"homeTeamAbbr": "CIN Reds","awayTeamAbbr": "NY Mets","homeTeamLogo": "https://assets.sportsbook.fanduel.com/images/team/mlb/cincinnati_reds.png","awayTeamLogo": "https://assets.sportsbook.fanduel.com/images/team/mlb/new_york_mets.png","eventUrls": { "bovada": "https://www.bovada.lv/sports/baseball/mlb/new-york-mets-cincinnati-reds-202606171240" },"sources": {"pinnacle": { "eventId": "1612345678", "rotationNumber": 973, "marketCount": 12, "liveBettingOffered": true, "cutoffAt": "2026-06-17T16:40:00Z", "altSpreadsOffered": true, "altTotalsOffered": true, "leagueName": "MLB", "pricesAsOf": "2026-06-17T15:24:10.000Z" },"fanduel": { "eventId": "34821316", "homeTeamAbbr": "CIN Reds", "awayTeamAbbr": "NY Mets", "homeTeamLogo": "https://…/cincinnati_reds.png", "awayTeamLogo": "https://…/new_york_mets.png", "sameGameParlay": true, "competitionName": "MLB", "pricesAsOf": "2026-06-17T15:29:51.000Z" },"bovada": { "eventId": "30196588", "url": "https://www.bovada.lv/sports/baseball/mlb/…", "updatedAt": "2026-06-17T15:21:04.000Z", "marketCount": 47, "sameGameParlay": true, "homeTeamAbbr": "Reds", "awayTeamAbbr": "Mets", "pricesAsOf": "2026-06-17T15:29:56.000Z" }},"pricesAsOf": { "pinnacle": "2026-06-17T15:24:10.000Z", "fanduel": "2026-06-17T15:29:51.000Z", "bovada": "2026-06-17T15:29:56.000Z" },"booksCompared": ["pinnacle", "fanduel", "bovada"],"scrapedAt": "2026-06-17T15:30:00.000Z"}
Rows mode - one flat record per price (type: "oddsRow"):
{ "type": "oddsRow", "league": "MLB", "eventName": "New York Mets @ Cincinnati Reds", "market": "moneyline", "selection": "home", "team": "Cincinnati Reds", "point": null, "book": "pinnacle", "american": 115, "decimal": 2.15, "impliedProbability": 0.4651, "isBestPrice": true, "fairProbability": 0.454, "betLimit": 2500, "bookEventId": "1612345678", "bookEventUrl": null, "rotationNumber": 973, "homeTeamAbbr": "CIN Reds", "awayTeamAbbr": "NY Mets", "bookCount": 3, "sharpBook": "pinnacle", "homeTeamLogo": "https://…/cincinnati_reds.png", "awayTeamLogo": "https://…/new_york_mets.png", "arbitrageExists": false, "bestArbitrageProfitPercent": null, "valueBetCount": 0, "bestValueEdgePercent": null, "priceAsOf": "2026-06-17T15:24:10.000Z" }
When an arbitrage exists, each opportunity includes the legs and the exact stake split:
{ "market": "moneyline", "profitPercent": 1.84, "impliedBookSum": 0.982,"legs": [ { "side": "home", "book": "bovada", "american": 118, "stakePercent": 47.1 },{ "side": "away", "book": "fanduel", "american": -115, "stakePercent": 52.9 } ] }
Dataset views - alongside the raw table, the dataset ships three ready-made views you can switch between in the Storage tab or select through the API: Games & odds, Flat odds rows (flat-rows output), and Teams, logos & rotation numbers. Rich-event runs fill Games & odds and Teams; flat-rows runs fill all three.
Good to know
- What each book contributes. FanDuel prices soccer (EPL, UCL, La Liga, Serie A, Bundesliga, Ligue 1, MLS, Liga MX), tennis and boxing as moneylines (3-way for soccer), and lists only some fixtures of the smaller soccer leagues; spreads and totals for those leagues come from Bovada and Pinnacle. FanDuel does not list UFC, Bovada prices golf only as tournament markets, so PGA matchups come from Pinnacle.
- How fresh the prices are.
pricesAsOftells you when each book's prices were current. FanDuel and Bovada are read straight from the book (seconds old). Pinnacle's public feed is cached for up to about 15 minutes, so its prices can be that old; on live games, a book whose prices are more than 90 seconds old is left out of the arbitrage and +EV checks (its prices are still listed), and live +EV is graded only against a fresh Pinnacle line. - Rotation numbers, betting cutoffs and bet limits come from Pinnacle. A game only priced by FanDuel or Bovada carries
nullthere.betLimitis Pinnacle's maximum risk stake on that exact line as its public site shows it; the other books do not publish limits. - Logos come from FanDuel, short names from FanDuel or Bovada, and the game-page link from Bovada - a game a book does not price has no value from that book.
- Soccer quarter lines. Asian handicaps and totals such as -0.25 or 2.75 are recorded at their exact quarter point at every book, so lines from different books compare like for like.
- Out-of-season leagues return nothing. Pick in-season leagues; the run card tells you which leagues had no games and which books could not be read.
- Suspended markets are left out. While a book suspends a market or a single selection (often for a few seconds at a time during live games), it keeps showing the last price, which cannot be bet. Those prices are not returned and never feed the best price, arbitrage or +EV checks.
- Live games move fast. Odds, cutoffs and
sources.bovada.updatedAtreflect the moment of the run; schedule the actor with monitoring mode to track changes.
How much does it cost?
This Actor uses Apify's pay-per-event pricing: you are charged only for the results it delivers, with no monthly rental and no start fee. The events it can charge are:
- Game / event odds record - One game as a rich record: every selected book's moneyline, spread & total nested, best price per outcome, no-vig fair odds, arbitrage opportunities & +EV value bets. (default events mode)
- Odds row - One flat price row: a single book's price for one selection of one market (book, market, selection, point, American/decimal odds, implied probability, best-price flag). (rows mode)
The current price of each event is shown on the Pricing tab of this page. Set a maximum total charge on the run if you want a hard cap on spend, and use the input limits to control how much the Actor fetches.
Automate & schedule
Run this actor on autopilot and pull odds into your own stack:
- Apify API - start runs, fetch datasets, manage schedules over REST.
- apify-client for JavaScript and apify-client for Python - official SDKs.
- Schedules - run every few minutes/hourly to track line movement, or daily to grab the next slate. Combine with monitoring mode to capture only what changed.
- Webhooks - fire a Slack/Discord alert or CRM/sheet update the moment a run finds an arbitrage or a moved line.
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'MY_APIFY_TOKEN' });const run = await client.actor('scrapesage/sports-betting-odds-scraper').call({leagues: ['NFL', 'NBA', 'EPL'],books: ['pinnacle', 'fanduel', 'bovada'],markets: ['moneyline', 'spread', 'total'],maxEvents: 200,onlyArbitrage: false,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(`Got odds for ${items.length} games`);
Integrate with any app
Connect the dataset to 5,000+ apps - no code required:
- Make - multi-step automation scenarios.
- Zapier - push arbs or line moves straight into a sheet or chat.
- Slack - get notified when a monitored slate has a value bet.
- Google Drive / Sheets - auto-export every run to a spreadsheet.
- Airbyte - pipe odds into your data warehouse.
- GitHub - trigger runs from commits or releases.
Use with AI assistants (MCP)
The output is clean, LLM-ready JSON. Call this actor from Claude, ChatGPT or any agent framework through the Apify MCP server - ask your assistant to "find tonight's NFL games where FanDuel beats the Pinnacle no-vig line" and let it run this scraper for you.
Agent-ready: autonomous payments (x402 & Skyfire)
This actor is agent-ready: AI agents can discover it, run it, and pay for it autonomously, with no Apify account and no human in the loop. It uses pay-per-event pricing and limited permissions, so it qualifies for Apify's agentic-payment standards:
- x402: an open, HTTP-native payment protocol. Agents pay per run in USDC on the Base network directly through the Apify MCP server, with no account and no API key.
- Skyfire: agent-to-service payments for fully autonomous AI-agent workflows.
Building an AI agent, MCP tool, or autonomous data pipeline? This scraper is ready to plug in and pay as it goes.
More scrapers from scrapesage
Build a complete real-time data stack:
- CoinGecko Crypto Scraper - crypto prices, markets, NFTs & exchanges with monitoring.
- Yahoo Finance Scraper - stocks, ETFs, FX, crypto quotes, financials & analyst ratings.
- Google News Scraper - articles, full text & related coverage with monitoring.
- Google Trends Scraper - search-demand & trending topics across Google surfaces.
- Eventbrite Scraper - events, ticket prices & organizer leads.
- Resident Advisor Scraper - electronic-music events, venues & promoter leads.
- Steam Scraper - game store data, prices & reviews.
- YouTube Scraper - channels, videos & creator contacts.
Tips
- Get data right now: pick an in-season league. Fall and winter: NFL, NCAA football, NBA, NHL and European soccer. Summer: MLB, WNBA and MLS. All year: UFC, boxing and tennis.
- Best price & arbitrage need 2+ books - keep at least two books selected (Pinnacle + one recreational book is the most useful pairing).
- More opportunities: arbitrage and +EV fire most often on live games, alternate lines, soccer and less efficient markets - enable
includeLiveandincludeAlternateLines. - Line-movement monitoring: turn on
monitorModeand schedule the run; you'll only get games whose odds changed. - Proxies: the default Apify Proxy (datacenter) works for all three books. If one starts blocking, switch to Residential in the proxy settings.
FAQ
Do I need a sportsbook account or a paid odds API key? No. The actor reads each sportsbook's own public JSON directly. No login, no third-party odds API, no browser.
Which books are supported? FanDuel, Bovada and Pinnacle. Pinnacle is included as the sharp reference book used for no-vig fair odds and +EV detection.
What are no-vig / fair odds? Sportsbooks bake a margin ("vig") into their prices. Removing it gives the implied "fair" probability of each outcome. The actor reports per-book no-vig probabilities and a sharp/consensus fair line for the moneyline and for every spread and total line, so you can spot mispriced sides.
How does arbitrage detection work? For each market it takes the best available price on every outcome across your selected books; if their implied probabilities sum to under 100% and the legs come from at least two different books, it's an arbitrage, and the actor returns the guaranteed profit % and the stake split per leg.
How fresh are the odds? Every record carries pricesAsOf, the moment each book's prices were current. FanDuel and Bovada are seconds old; Pinnacle's public feed can be up to about 15 minutes old, which is why stale prices are kept out of live arbitrage and +EV checks.
Why does a game show only one book? Not every book lists every game (FanDuel shows only some fixtures of the smaller soccer leagues, Pinnacle lists FCS football sparingly, FanDuel has no UFC). Best price, arbitrage and +EV need the game at two or more books.
Can I get only the opportunities? Yes - enable onlyArbitrage and/or onlyValueBets, and set minArbitrageProfit / minValueEdge thresholds.
How do I track line movement? Turn on monitorMode and run on a Schedule. The actor remembers prior odds and emits only games that are new or whose lines moved.
American or decimal odds? Both - every price includes American odds, decimal odds and implied probability.
Is scraping odds legal? This actor collects publicly available odds data. You are responsible for using the data in compliance with applicable laws and each site's terms, and for gambling responsibly where legal.
Disclaimer
This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by the sportsbooks and odds sites it covers, or any of their owners or subsidiaries. All trademarks mentioned are the property of their respective owners.
Site and brand names are referenced only in a descriptive, nominative sense - to identify the publicly accessible sources this Actor collects data from. It is not an official product of any of them, is not authorised or certified by them, and does not distribute their software. It collects only publicly available information; you are responsible for ensuring your use of that data complies with applicable laws, regulations and the terms of each source.
Need help?
Open an issue on the actor's Issues tab, or visit the Apify help center. Feature requests (more books, leagues, player props) are welcome - this actor is actively maintained.