FanDuel Odds Scraper - Live Sports, Markets & Player Props
Pricing
from $1.40 / 1,000 odds records
FanDuel Odds Scraper - Live Sports, Markets & Player Props
Scrape FanDuel sportsbook odds, including moneylines, spreads, totals, player props and futures. Extract decimal, fractional and American odds, live event markers and kickoff times. Supports scheduled incremental monitoring to track odds changes.
Pricing
from $1.40 / 1,000 odds records
Rating
0.0
(0)
Developer
Abot API
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Security
Limited permissionsShare
FanDuel Odds Scraper
FanDuel sportsbook odds for the whole board: moneylines, spreads, totals, player props, futures and Same Game Parlay markets, each price delivered in decimal, fractional and American formats. Read the featured cross-sport board, walk any sport the book offers, or paste links to specific league pages and games. Live markers, kickoff times, the site's own SGP picks, and scheduled odds monitoring in one actor.
Why This Scraper?
- The board, all three formats. Every price ships as decimal, fractional and American side by side, so no conversion table is needed on your end.
- Beyond the main board. Alongside each event's moneyline, spread and total, the run collects the player-prop and futures markets the board carries (alternate rushing yards, championship winners, elimination stage and more) as their own rows.
- Any sport, not just the featured mix. Sports mode walks the board of any sport the book offers - all 19 of them, from NFL and NBA to rugby, darts and table tennis - instead of only what the featured page happens to show today.
- Same Game Parlay surface. The site's own SGP suggestions ship as pick rows with every leg named and priced, and an optional per-event toggle reads each game's full SGP market tab.
- Paste a link to any page. League pages, whole sports, or a single game's own board: paste the link, the run reads exactly that page.
- Built for line watching. Incremental mode keeps a per-scope baseline and emits NEW, UPDATED, REAPPEARED and EXPIRED records: odds movements are the change signal, and price history from the previous scan is retained in the baseline for movement analysis.
- State-region aware with honest live markers. Read any FanDuel state site (New Jersey default) with the region picker; every record carries the in-play flag and kickoff time straight from the sportsbook's own feed.
Use Cases
- Line shoppers: pull FanDuel's current prices across leagues and compare against other books before placing a bet.
- SGP builders: pull every SGP-eligible market for one game, or watch the site's own picks with their legs.
- Odds traders: schedule incremental runs to watch line movement and record every move between runs.
- Model builders: build datasets with decimal, fractional and American prices side by side for backtesting.
- Content pipelines: generate previews with current prices, team names, and market narratives.
Data You Get
Sample shape: values are illustrative placeholders, not from a live record.
| Field | Example |
|---|---|
id | fanduel:9c2f41ab77e31d |
matchup | JAX Jaguars @ BAL Ravens |
home / away | Baltimore Ravens / Jacksonville Jaguars |
homeAbbr / awayAbbr | BAL / JAX |
kickoffTime | 2026-11-06T01:16:00.000Z |
inplay | false |
moneyline | {"marketName": "Moneyline", "selections": [{"name": "BAL", "odds": {"decimal": 1.83, "fractional": "100/120", "american": -120}}]} |
spread | {"selections": [{"handicap": -9.5, "odds": {"american": -110}}]} |
total | {"selections": [{"handicap": 44.5, "odds": {"american": -105}}]} |
marketType | NBA_FINALS_WINNER |
marketName | 26-27 NBA Finals Winner |
selections[] | {"name": "Oklahoma City Thunder", "odds": {"decimal": 5.5, "american": 450}} |
marketId | 734.194084044 |
kind | futures |
competition | NBA |
eventTypeId | 7522 |
totalBets | 1013 |
legs[] | {"name": "D.Henry", "marketName": "Anytime TD Scorer", "odds": {"american": -150}} |
homeLogo / awayLogo | https://assets.sportsbook.fanduel.com/images/team/nfl/... |
selections[].odds.decimal | 1.83 |
selections[].odds.american | -120 |
oddsTimestamp | 2026-11-04T05:00:00+00:00 |
changeType / changedFields | UPDATED / ["moneyline"] |
firstSeenAt / lastSeenAt | 2026-11-01T... / 2026-11-04T... |
How to Use
The run reads FanDuel's own public odds feeds directly (no login, no browser): pick a mode and a region, set Max items, run.
- popular covers the site's featured cross-sport board: each event ships with its moneyline, spread and total, every prop/futures market ships as its own row, and the site's own Same Game Parlay picks ship with their legs.
- sports walks the board of every sport you pick - the league page the site maintains for the major US sports, the whole-sport page for the rest.
- urls reads exactly the pages you paste: league pages, whole sports, or one game's own board.
Run it from your code
Python:
from apify_client import ApifyClientclient = ApifyClient("YOUR_APIFY_TOKEN")run = client.actor("abotapi/fanduel-odds-scraper").call(run_input={"mode": "popular","region": "NJ","maxItems": 20,})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item)
JavaScript:
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });const run = await client.actor('abotapi/fanduel-odds-scraper').call({mode: 'popular',region: 'NJ',maxItems: 20,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
Scheduled line monitoring: turn on incremental mode with a stateKey; every run pushes only NEW, UPDATED, REAPPEARED or EXPIRED records.
Input examples
Default board snapshot:
{ "mode": "popular", "region": "NJ", "maxItems": 20 }
Scheduled incremental monitoring:
{ "mode": "popular", "region": "NJ", "incrementalMode": true, "stateKey": "nj-board", "maxItems": 200 }
Walk two whole sports:
{ "mode": "sports", "sports": ["American Football", "Soccer"], "region": "NJ", "maxItems": 200 }
One game's own board, with its SGP markets:
{ "mode": "urls", "urls": ["https://sportsbook.fanduel.com/football/nfl/team-a-@-team-b-36244870"], "fetchSgpMarkets": true, "maxItems": 100 }
Input Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
mode | Select | popular | popular = the featured cross-sport board; sports = walk whole sports; urls = read the pages you paste. |
sports | Multi-select | NFL, NBA | sports mode: which sports to walk (all 19 the book offers). |
urls | List | three example links | links mode: FanDuel league pages, whole-sport pages, or single-game links. |
region | Select | NJ | Which FanDuel state site to read; odds and availability vary by state. |
liveOnly | Boolean | false | Keep only records whose game is flagged in-play on the pages read this run. |
fetchSgpMarkets | Boolean | false | Also read each collected event's Same Game Parlay market tab; each event whose SGP markets are delivered counts as one enrichment read. |
maxItems | Integer | 20 | Stop after this many odds records (boards, markets, picks and SGP tabs all count). Leave 0 for no limit. |
proxy | Proxy | Residential US | Residential US exits are recommended for the most reliable results. |
resumeFromRunId | String | (empty) | Continue a previous run: records that run already delivered are skipped. |
incrementalMode | Boolean | false | Keep a per-scope baseline; emit NEW, UPDATED, REAPPEARED, EXPIRED records. |
stateKey | String | (empty) | Optional name for the incremental baseline; separate keys per scope. |
emitUnchanged | Boolean | false | Incremental mode: also push records whose odds did not move. |
emitExpired | Boolean | false | Incremental mode: after a complete scan, push rows for records no longer present. |
ignoreFieldsForChanges | List | (empty) | Extra fields that must never mark a row UPDATED. |
mcpConnectors | List | (empty) | Apify MCP connector IDs to notify with the first collected rows. Leave empty to skip. |
maxNotifyListings | Integer | 10 | Internal: how many of the first collected rows a connector export may send. |
notionParentPageUrl | String | (empty) | Internal: target page for a Notion connector export. |
Output Example
The dataset carries three record kinds behind the union view: event boards (moneyline/spread/total flattened per game), markets (props, futures, and - with the toggle on - each event's SGP market tab), and the site's own Same Game Parlay picks with their legs. The Output tabs split them.
Sample shape: values are illustrative placeholders, not from a live record.
{"id": "fanduel:9c2f41ab77e31d","matchup": "JAX Jaguars @ BAL Ravens","home": "Baltimore Ravens","away": "Jacksonville Jaguars","kickoffTime": "2026-11-06T01:16:00.000Z","inplay": false,"moneyline": {"marketName": "Moneyline","selections": [{ "name": "Baltimore Ravens", "odds": { "decimal": 1.83, "fractional": "100/120", "american": -120 } },{ "name": "Jacksonville Jaguars", "odds": { "decimal": 1.98, "fractional": "100/102", "american": -102 } }]},"oddsTimestamp": "2026-11-04T05:00:00+00:00"}
Send results into your apps (MCP connectors)
Give an MCP connector ID in mcpConnectors and the run notifies your connected app (Notion, Sheets and more) with the first collected rows, capped by the internal maxNotifyListings setting. No connector configured means the run skips the export step entirely.
Plan Requirement
This actor is billed per event: a start charge per run, a charge for each odds record delivered, and - with the SGP toggle on - one enrichment charge per event whose SGP market tab is delivered. A paid Apify plan is recommended; residential US proxy usage rides your plan's residential allowance.
FAQ
How much does a run cost?
The start event bills once per run and each delivered record bills once. The run reads the sportsbook's public feeds, so larger Max items barely increase cost: schedule fewer, larger runs for the lowest per-record price. Your run's Pricing tab shows live per-event prices for your plan.
Is it legal to scrape FanDuel?
The actor reads only the publicly displayed odds feeds of FanDuel's state sportsbooks, without logging in and without taking account-held data. You remain responsible for complying with FanDuel's terms and your local regulations; gambling availability depends on your jurisdiction.
Can I monitor line movement on a schedule?
Yes. Enable incremental mode with a stateKey and schedule runs: each run diffs against the previous scan and pushes only NEW, UPDATED, REAPPEARED or EXPIRED records. Odds movements are the change signal.
Why are some sports missing from my run?
In the default mode the run reads the site's featured cross-sport board, whose mix rotates with the sports calendar. Switch to sports mode and pick the sports you want to walk their whole boards regardless of what is featured today. A sport with no live or upcoming events serves an empty board - out-of-season sports simply have nothing to price.
Does this cover live (in-play) games?
The actor marks every record with the in-play flag and kickoff time the feed carries, and a Live games only filter keeps records whose game is running right now. The book's dedicated live page itself is not anonymously readable, so the filter works over the pages the run reads rather than walking a live-only feed.
What does the SGP toggle cost?
Each event whose Same Game Parlay market tab is read and delivered counts as one enrichment charge on top of the per-record charge; events whose tab cannot be read, runs with the toggle off, and events suppressed as unchanged are never charged. Your run's Pricing tab shows the live per-event prices for your plan.
Why did my run fail with "the site refused every connection"?
The sportsbook's edge can refuse connections in waves. The actor rides residential exits and retries, but a full wave fails honestly; re-run shortly.
Can I use this with AI agents and MCP?
Yes, via the Apify MCP server: add abotapi/fanduel-odds-scraper and ask for odds naturally. Every field is plain JSON.
🔗 Want more sports data?
Pair this actor with these related scrapers from the same team:
| ⚽ bet365 Odds Scraper Scrape bet365 live in-play and pre-match odds across 20+ sports. Extract fixture... | ⚽ Sportsbook Odds Scraper (1xBet, Melbet, Linebet, Paripulse) Collect live and prematch betting odds from 1xBet, Melbet, Linebet and Paripulse. Give it... |
| ⚽ SofaScore Scraper ⚽ Live Scores, Stats, Players & Odds Pull structured sports data from SofaScore across football, basketball, tennis, and 20+... | ⚽ FotMob Scraper ⚽ Match Details, Stats, Lineups & Players Pull structured football data from FotMob: match details with scores, team stats, events... |
| ⚽ Globo Esporte Scraper Scrape public sports content from ge.globo.com, including news, videos, matches and feed... | ⚽ JioHotstar Scraper Scrape the JioHotstar catalog by content type or URL. Extract shows, movies, episodes... |
💬 Support
- 🐞 Found a bug or a missing field? Open a ticket on the Issues tab. We usually reply within hours.
- 🛠️ Need another site, extra fields or a private build? Email contact@abotapi.com.
- ⭐ Enjoying it? A quick review on the actor page helps other users find it.