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
473
Total users
99
Monthly active users
6 days 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, WNBA, UFC/MMA, FIFA World Cup, soccer, tennis, golf and more. 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, 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 and a direct link to the game page.
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?
Most odds scrapers give you one book, or wrap a paid third-party odds API, and return raw prices with no analysis. This actor aggregates multiple books directly and ships the richest, most actionable odds dataset in the category:
| Feature | Typical scrapers | This actor |
|---|---|---|
| Books in a single run | 1 | ✅ FanDuel + Bovada + Pinnacle (sharp) |
| Needs a paid third-party odds API key | often | ✅ No — direct from each book |
| Best price per outcome (line shopping) | ❌ | ✅ |
| No-vig fair odds & implied probability | ❌ | ✅ per book + sharp/consensus |
| Arbitrage detection with stake split | ❌ | ✅ |
| +EV value bets vs the sharp line | ❌ | ✅ |
| Moneyline + spread + totals (full game) | partial | ✅ all three |
| 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 |
| 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.
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 |
arbitrage, valueBets | Guaranteed-profit opportunities with the exact stake split, and +EV prices vs the fair line |
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) |
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, 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, 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": ["MLB", "WORLDCUP", "NBA", "UFC"],"books": ["pinnacle", "fanduel", "bovada"],"markets": ["moneyline", "spread", "total"],"outputMode": "events","includeLive": true,"onlyArbitrage": false,"maxEvents": 200}
- leagues — MLB, NBA, WNBA, NCAAB, NFL, NCAAF, NHL, UFC, FIFA World Cup, EPL, UCL, MLS, La Liga, ATP, WTA, PGA, Boxing. 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.
- 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": "bovada", "american": 111, "decimal": 2.11, "impliedProbability": 0.4739, "betLimit": null },{ "book": "fanduel", "american": 114, "decimal": 2.14, "impliedProbability": 0.4673, "betLimit": null },{ "book": "pinnacle", "american": 115, "decimal": 2.15, "impliedProbability": 0.4651, "betLimit": 2500 }],"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 } } } ] },"total": { "lines": [ { "point": 9, "over": { "best": { "book": "fanduel", "american": -108 } }, "under": { "best": { "book": "bovada", "american": -105 } } } ] }},"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" },"fanduel": { "eventId": "34821316", "homeTeamAbbr": "CIN Reds", "awayTeamAbbr": "NY Mets", "homeTeamLogo": "https://…/cincinnati_reds.png", "awayTeamLogo": "https://…/new_york_mets.png", "sameGameParlay": true, "competitionName": "MLB" },"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" }},"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" }
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, and Teams, logos & rotation numbers.
Good to know
- What each book contributes. FanDuel prices soccer (EPL, UCL, MLS, La Liga), tennis and boxing as moneylines (3-way for soccer); spreads and totals for those leagues come from Bovada and Pinnacle. FanDuel does not list UFC, and golf has no head-to-head game lines, so PGA only returns what the books price as matchups.
- Bovada and datacenter networks. Bovada withholds its MLB, NFL and NHL feeds from datacenter IP ranges (its other leagues come through fine). The actor fetches those three coupons through a residential exit automatically, so nothing needs configuring; if a run card ever still says Bovada served no data, set the proxy to Residential and re-run.
- 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.
- Out-of-season leagues return nothing. Pick in-season leagues; the run card tells you when a selected league has no games listed.
- 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: ['MLB', 'WORLDCUP', 'NBA'],books: ['pinnacle', 'fanduel', 'bovada'],markets: ['moneyline', 'spread', 'total'],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 MLB 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 — no account, 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. In summer, MLB, WNBA and the FIFA World Cup are live; in fall/winter, NFL, NBA, NHL and college sports.
- 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, US) 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 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%, it's an arbitrage, and the actor returns the guaranteed profit % and the stake split per leg.
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.