FanDuel Odds API | Live Lines, Player Props & Scores avatar

FanDuel Odds API | Live Lines, Player Props & Scores

Pricing

from $50.00 / 1,000 games

Go to Apify Store
FanDuel Odds API | Live Lines, Player Props & Scores

FanDuel Odds API | Live Lines, Player Props & Scores

Scrape the complete FanDuel odds board for any game: moneyline, spread, totals, every inning and quarter, and the full player prop set. 25 sports, three odds formats, previous line on every selection, live scores for in-play games. Batch export or always-on REST API.

Pricing

from $50.00 / 1,000 games

Rating

0.0

(0)

Developer

Zen Studio

Zen Studio

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

5 hours ago

Last modified

Share

FanDuel Odds Scraper | Live Lines, Player Props & In-Play Scores (2026)

A full MLB game is 159 markets and 1,100 priced bet options: moneyline, spread, totals, every inning and quarter, and the complete player prop board, in three odds formats with the previous line on every selection.

FanDuel odds scraper: every market and player prop for a game, with moneyline, spread, totals, three odds formats and line movement, as structured JSON

⚡ One request returns the whole board. FanDuel splits a game across ten to sixteen tabs; pulling only the default tab yields 9 of 151 markets on an NFL game and no player props at all.
Zen Studio Sports Betting   •  Real-time odds across every major sportsbook
 FanDuel Odds
➤ You are here
 DraftKings Odds
Lines, props, SGP
 BetMGM Odds
Lines, props, futures
 Bet365 Odds
Live and pre-match

Copy to your AI assistant

zen-studio/fanduel-odds on Apify. Batch: ApifyClient("TOKEN").actor("zen-studio/fanduel-odds").call(run_input={"sport":"baseball","maxEvents":10}), then client.dataset(run["defaultDatasetId"]).list_items().items. Always-on API: https://zen-studio--fanduel-odds.apify.actor?token=TOKEN with GET /sports, /competitions, /events, /live, /events/{eventId}, /events/{eventId}/odds; get IDs from the list endpoints before the detail ones. Full spec: GET https://api.apify.com/v2/acts/zen-studio~fanduel-odds/builds/default (Bearer TOKEN) → inputSchema, actorDefinition.storages.dataset, actorDefinition.webServerSchema, readme. Token: https://console.apify.com/account/integrations

Key Features

  • The complete board, not the headline markets: every tab FanDuel shows on a game page is merged into one result. A live NFL game returns about 150 markets, a soccer match about 214.
  • Player props included: passing, rushing and receiving yards, touchdown scorers, strikeouts, total bases, hits, RBIs, goals, assists, shots, cards and corners, each flagged with isPlayerProp and a player headshot.
  • Line movement on every selection: previousDecimalOdds and previousAmericanOdds ship with the current price, so drift is a subtraction rather than a second run.
  • Real fixtures only: FanDuel's computer-played leagues (eBasketball, eSoccer) are filtered out by default and flagged with isSimulated when you ask for them.
  • Free tier: 5 runs, one complete game board each, no credit card.

How to Scrape FanDuel Odds

  1. Open the Input tab and pick a sport from the dropdown.
  2. Set Number of games to the size of the slate you want.
  3. Press Start and wait; a game takes a few seconds.
  4. Open Storage and download the dataset as JSON, CSV, Excel or XML.

Every game exports its full board, one row per bet option.

Basic: one league's slate

{
"sport": "basketball",
"league": "NBA",
"maxEvents": 10
}

Partial league names work, so NHL, MLB, NFL and Premier League all match. Leave league out for every league in the sport.

One game, every market it has

{
"sport": "baseball",
"maxEvents": 1
}
{
"sport": "ALL",
"maxEvents": 100
}

ALL works through American football, basketball, baseball, ice hockey, soccer, tennis, MMA and golf in that order until it reaches your game limit.

Include the computer-played leagues

{
"sport": "soccer",
"maxEvents": 20,
"includeSimulated": true
}

Input Parameters

ParameterTypeDefaultDescription
sportstringbasketballSport to pull. ALL walks the eight most popular in order.
leaguestringall leaguesNarrow to one league; partial names match (NHL, Premier League).
maxEventsinteger10Number of games, 1 to 500. Each returns its complete board.
includeSimulatedbooleanfalseInclude FanDuel's computer-played leagues (eBasketball, eSoccer, eFootball).

What Data Can You Extract from FanDuel?

Every row is one bet option, so a single game produces 800 to 1,300 rows.

  • Game: sport, league, league region, name, start time, live flag, home and away teams, simulated flag
  • Market: name, type, status, same-game-parlay eligibility, betting type, runner and winner counts
  • Selection: name, abbreviation, team logo, player headshot, player-prop flag, side, handicap, status
  • Odds: decimal, fractional and American, plus the previous decimal and American price
  • Identifiers: game, market, selection and league IDs, and the capture timestamp

decimalOdds is the exact value rather than FanDuel's rounded display price, so -138 comes back as 1.72463768115942. Round it yourself if you are showing it to people; keep it if you are computing edge.

Output Example

Two rows from a real MLB export: a team selection with its logo, and a player prop with the player's headshot.

[
{
"sport": "Baseball",
"sportSlug": "baseball",
"league": "MLB",
"leagueId": "2926d8429ed53300",
"leagueRegion": "USA",
"isSimulated": false,
"event": "Chicago Cubs (K Gausman) @ Arizona Diamondbacks (M Kelly)",
"eventId": "d88a7e1ed6edb5a7",
"startDate": "2026-08-25T01:41:00.000Z",
"isLive": false,
"homeTeam": "Arizona Diamondbacks",
"awayTeam": "Chicago Cubs",
"market": "4th Inning Result",
"marketType": "4TH_INNING_RESULT",
"marketId": "37c22a7209b7d630",
"marketStatus": "OPEN",
"sgmMarket": true,
"bettingType": "ODDS",
"numberOfRunners": 3,
"numberOfWinners": 1,
"selection": "Chicago Cubs",
"selectionId": "504c77ec8bbec3f5",
"selectionStatus": "ACTIVE",
"isPlayerProp": false,
"side": null,
"nameAbbr": "CHI Cubs",
"logo": "https://assets.sportsbook.fanduel.com/images/team/mlb/chicago_cubs.png",
"secondaryLogo": null,
"handicap": 0,
"decimalOdds": 3.5,
"fractionalOdds": "25/10",
"americanOdds": 250,
"previousDecimalOdds": 3.4,
"previousAmericanOdds": 240,
"timestamp": "2026-08-24T15:22:10.233534+00:00"
},
{
"sport": "Baseball",
"sportSlug": "baseball",
"league": "MLB",
"leagueId": "2926d8429ed53300",
"leagueRegion": "USA",
"isSimulated": false,
"event": "Chicago Cubs (K Gausman) @ Arizona Diamondbacks (M Kelly)",
"eventId": "d88a7e1ed6edb5a7",
"startDate": "2026-08-25T01:41:00.000Z",
"isLive": false,
"homeTeam": "Arizona Diamondbacks",
"awayTeam": "Chicago Cubs",
"market": "To Record 5+ Total Bases",
"marketType": "TO_RECORD_5+_TOTAL_BASES",
"marketId": "c322273951ed882c",
"marketStatus": "OPEN",
"sgmMarket": true,
"bettingType": "ODDS",
"numberOfRunners": 18,
"numberOfWinners": 1,
"selection": "Pete Crow-Armstrong",
"selectionId": "c879d9ac41822ae6",
"selectionStatus": "ACTIVE",
"isPlayerProp": true,
"side": null,
"nameAbbr": null,
"logo": "https://fdx-api.sportsbook.fanduel.com/images/headshots/mlb/2025/e9734861-bc3f-4157-88eb-007b1ed65984/120x120.png",
"secondaryLogo": "https://assets.sportsbook.fanduel.com/images/team/mlb/chicago_cubs.png",
"handicap": 0,
"decimalOdds": 5.4,
"fractionalOdds": "44/10",
"americanOdds": 440,
"previousDecimalOdds": 5.2,
"previousAmericanOdds": 420,
"timestamp": "2026-08-24T15:22:10.233534+00:00"
}
]

Always-On REST API

The same data is available as a hosted API that stays warm. Open the Standby tab for your URL, then call it with your Apify token.

Endpoints

EndpointPriceReturns
/sportsfreeThe 25 sports and their slugs
/competitions?sport=SLUG$0.005Leagues with name, region and market count
/events?sport=SLUG$0.005Games with name, league, start time and market count
/live?sport=SLUG$0.005In-play games with per-sport live detail
/events/{eventId}$0.05One game's complete board
/events/{eventId}/odds$0.05The same board, prices only, for polling

Find a league, then a game, then its board

$curl "https://zen-studio--fanduel-odds.apify.actor/competitions?sport=baseball&token=YOUR_APIFY_TOKEN"
$curl "https://zen-studio--fanduel-odds.apify.actor/events?sport=baseball&token=YOUR_APIFY_TOKEN"
$curl "https://zen-studio--fanduel-odds.apify.actor/events/d88a7e1ed6edb5a7?token=YOUR_APIFY_TOKEN"

Leagues

{
"success": true,
"sport": "baseball",
"count": 3,
"competitions": [
{
"competitionId": "2926d8429ed53300",
"name": "MLB",
"region": "USA",
"isSimulated": false,
"marketCount": 1762
},
{
"competitionId": "23ce837210fc2ab7",
"name": "Japan - Baseball",
"region": "JPN",
"isSimulated": false,
"marketCount": 36
}
]
}

Games

{
"success": true,
"count": 21,
"simulatedHidden": 0,
"events": [
{
"eventId": "e4590d23b98a146a",
"name": "Tampa Bay Rays (D Rasmussen) @ Detroit Tigers (F Valdez)",
"sport": "Baseball",
"league": "MLB",
"leagueId": "2926d8429ed53300",
"isSimulated": false,
"startDate": "2026-08-24T22:41:00.000Z",
"marketCount": 177,
"isLive": false
},
{
"eventId": "d849ad0380b54774",
"name": "Boston Red Sox (R Suarez) @ Miami Marlins (S Alcantara)",
"sport": "Baseball",
"league": "MLB",
"leagueId": "2926d8429ed53300",
"isSimulated": false,
"startDate": "2026-08-24T22:41:00.000Z",
"marketCount": 180,
"isLive": false
}
]
}

marketCount is what FanDuel lists for the game. simulatedHidden tells you how many computer-played fixtures were filtered out.

One game's board

Three markets from a real response: the moneyline with both team logos, a player prop with the player's headshot, and a total with OVER and UNDER labelled.

{
"success": true,
"event": {
"eventId": "d88a7e1ed6edb5a7",
"name": "Chicago Cubs (K Gausman) @ Arizona Diamondbacks (M Kelly)",
"sport": "Baseball",
"sportSlug": "baseball",
"league": "MLB",
"leagueId": "2926d8429ed53300",
"leagueRegion": "USA",
"isSimulated": false,
"startDate": "2026-08-25T01:41:00.000Z",
"isLive": false,
"videoAvailable": true,
"primaryMarketId": "2f23cd1c21d30ca8",
"awayTeam": "Chicago Cubs",
"homeTeam": "Arizona Diamondbacks"
},
"markets": [
{
"marketId": "e546214a2e8993cd",
"marketName": "Moneyline",
"marketType": "MONEY_LINE",
"marketStatus": "OPEN",
"sgmMarket": true,
"sortPriority": 10,
"bettingType": "ODDS",
"marketTime": "2026-08-25T01:41:00.000Z",
"isLive": false,
"canGoLive": true,
"eachWayAvailable": false,
"numberOfRunners": 2,
"numberOfActiveRunners": 2,
"numberOfWinners": 1,
"selections": [
{
"selectionId": "504c77ec8bbec3f5",
"runnerName": "Chicago Cubs",
"nameAbbr": "CHI Cubs",
"logo": "https://assets.sportsbook.fanduel.com/images/team/mlb/chicago_cubs.png",
"secondaryLogo": null,
"isPlayerProp": false,
"side": "AWAY",
"sortPriority": 1,
"handicap": 0,
"runnerStatus": "ACTIVE",
"decimalOdds": 1.72463768115942,
"fractionalOdds": "100/138",
"americanOdds": -138,
"previousDecimalOdds": 1.735294117647059,
"previousAmericanOdds": -136
},
{
"selectionId": "a2f14986d62aaa25",
"runnerName": "Arizona Diamondbacks",
"nameAbbr": "ARI Diamondbacks",
"logo": "https://assets.sportsbook.fanduel.com/images/team/mlb/arizona_diamondbacks.png",
"secondaryLogo": null,
"isPlayerProp": false,
"side": "HOME",
"sortPriority": 2,
"handicap": 0,
"runnerStatus": "ACTIVE",
"decimalOdds": 2.28,
"fractionalOdds": "128/100",
"americanOdds": 128,
"previousDecimalOdds": 2.26,
"previousAmericanOdds": 126
}
]
},
{
"marketId": "c322273951ed882c",
"marketName": "To Record 5+ Total Bases",
"marketType": "TO_RECORD_5+_TOTAL_BASES",
"marketStatus": "OPEN",
"sgmMarket": true,
"sortPriority": 1764,
"bettingType": "ODDS",
"marketTime": "2026-08-25T01:41:00.000Z",
"isLive": false,
"canGoLive": true,
"eachWayAvailable": false,
"numberOfRunners": 18,
"numberOfActiveRunners": 18,
"numberOfWinners": 1,
"selections": [
{
"selectionId": "c879d9ac41822ae6",
"runnerName": "Pete Crow-Armstrong",
"nameAbbr": null,
"logo": "https://fdx-api.sportsbook.fanduel.com/images/headshots/mlb/2025/e9734861-bc3f-4157-88eb-007b1ed65984/120x120.png",
"secondaryLogo": "https://assets.sportsbook.fanduel.com/images/team/mlb/chicago_cubs.png",
"isPlayerProp": true,
"side": null,
"sortPriority": 1,
"handicap": 0,
"runnerStatus": "ACTIVE",
"decimalOdds": 5.4,
"fractionalOdds": "44/10",
"americanOdds": 440,
"previousDecimalOdds": 5.2,
"previousAmericanOdds": 420
},
{
"selectionId": "3b8d98990455bb36",
"runnerName": "Corbin Carroll",
"nameAbbr": null,
"logo": "https://fdx-api.sportsbook.fanduel.com/images/headshots/mlb/2025/d06b32aa-b9c4-4e48-ae0f-058e3ebdbbfd/120x120.png",
"secondaryLogo": "https://assets.sportsbook.fanduel.com/images/team/mlb/arizona_diamondbacks.png",
"isPlayerProp": true,
"side": null,
"sortPriority": 2,
"handicap": 0,
"runnerStatus": "ACTIVE",
"decimalOdds": 7,
"fractionalOdds": "60/10",
"americanOdds": 600,
"previousDecimalOdds": 7.5,
"previousAmericanOdds": 650
}
]
},
{
"marketId": "9ba55eebd4bcaae1",
"marketName": "Total Runs",
"marketType": "TOTAL_POINTS_(OVER/UNDER)",
"marketStatus": "OPEN",
"sgmMarket": true,
"sortPriority": 30,
"bettingType": "MOVING_HANDICAP",
"marketTime": "2026-08-25T01:41:00.000Z",
"isLive": false,
"canGoLive": true,
"eachWayAvailable": false,
"numberOfRunners": 2,
"numberOfActiveRunners": 2,
"numberOfWinners": 1,
"selections": [
{
"selectionId": "de578cc91cd9e21b",
"runnerName": "Over",
"nameAbbr": null,
"logo": null,
"secondaryLogo": null,
"isPlayerProp": false,
"side": "OVER",
"sortPriority": 1,
"handicap": 9,
"runnerStatus": "ACTIVE",
"decimalOdds": 1.909090909090909,
"fractionalOdds": "100/110",
"americanOdds": -110,
"previousDecimalOdds": 1.952380952380952,
"previousAmericanOdds": -105
},
{
"selectionId": "6f43bd63917f07f5",
"runnerName": "Under",
"nameAbbr": null,
"logo": null,
"secondaryLogo": null,
"isPlayerProp": false,
"side": "UNDER",
"sortPriority": 2,
"handicap": 9,
"runnerStatus": "ACTIVE",
"decimalOdds": 1.909090909090909,
"fractionalOdds": "100/110",
"americanOdds": -110,
"previousDecimalOdds": 1.869565217391304,
"previousAmericanOdds": -115
}
]
}
]
}

Prices only, for polling

{
"success": true,
"eventId": "d88a7e1ed6edb5a7",
"marketCount": 159,
"markets": [
{
"marketId": "78035921d4563890",
"marketStatus": "OPEN",
"isLive": false,
"selections": [
{
"selectionId": "f53474bf917098d7",
"handicap": 0.0,
"runnerStatus": "ACTIVE",
"sortPriority": 10,
"decimalOdds": 1.066666666666667,
"fractionalOdds": "10/150",
"americanOdds": -1500,
"previousDecimalOdds": 1.071428571428571,
"previousAmericanOdds": -1400
},
{
"selectionId": "cd6c6faeac30d06c",
"handicap": 0.0,
"runnerStatus": "ACTIVE",
"sortPriority": 20,
"decimalOdds": 8.9,
"fractionalOdds": "79/10",
"americanOdds": 790,
"previousDecimalOdds": 8.6,
"previousAmericanOdds": 760
}
]
}
]
}

Live scores

Detail varies by sport. Soccer carries cards, corners, booking points and a match timeline; tennis is set by set with the server; basketball and hockey are per period; baseball is a box score; cricket is innings; snooker is frames.

{
"success": true,
"count": 1,
"events": [
{
"eventId": "4d2d9b50705e9580",
"sport": "Tennis",
"isLive": true,
"mediaTypes": [],
"homeScore": 0,
"awayScore": 0,
"currentSet": 1,
"totalSets": 3,
"serving": "AWAY",
"homePoints": "15",
"awayPoints": "30",
"homeGamesPerSet": [
2
],
"awayGamesPerSet": [
0
]
}
]
}

A score of 0 is returned as 0, not null, so a goalless first half is distinguishable from missing data.

Response Format

Every response carries the same envelope, errors included.

CodeMeaningWhat to do
400Invalid parameterCheck the sport slug or the ID
402Usage limit reachedRaise the billing limit on Apify
404Unknown ID or endpointDiscover IDs via /events or /competitions first
405Wrong methodEvery endpoint is GET
502Upstream unavailableRetry in a few seconds

An empty result is a success, not an error. /events, /competitions and /live return count: 0 with a message explaining why, most often that the sport is between seasons, and nothing is charged for it.

Advanced Usage

Ready-made configurations for line-movement tracking, arbitrage screening, player-prop modelling and in-play monitoring.

Track line movement on tonight's slate

{
"sport": "football",
"league": "NFL",
"maxEvents": 16
}

Every selection ships with its previous price, so one run gives you the current line and the last move together.

Build a player-prop dataset

{
"sport": "baseball",
"league": "MLB",
"maxEvents": 15
}

Filter the export on isPlayerProp to keep only player markets. Each carries the player's headshot in logo and the team badge in secondaryLogo.

Compare against another sportsbook

{
"sport": "basketball",
"league": "NBA",
"maxEvents": 12
}

Run DraftKings Odds or BetMGM Odds with the same slate and join on team names and market type.

Poll a single game while it is in play

Use the always-on API rather than batch. /events/{eventId}/odds returns the same board with the metadata stripped, so responses stay small on a tight loop.

Pricing

Billed per game board, not per request, so the price tracks the data you receive.

WhatPrice
One game's complete board$0.05
List request (leagues, games, live scores)$0.005
Run start$0.03

A board averages about 1,100 priced bet options, which works out to roughly $0.045 per 1,000 odds rows. /sports is free, and an empty result is never charged.

Free tier: 5 runs, one complete game board each.

Keeping the cost down

  • Set maxEvents to the slate you actually need; games are billed as you go.
  • Browse with /events and /competitions at $0.005 and pull only the boards you want.
  • On the always-on API, the $0.03 start applies per container rather than per request, and a container stays warm for five minutes after the last call. Frequent callers pay it rarely; if you poll on a long interval, batch mode is the cheaper shape.

FAQ

What is FanDuel? FanDuel is one of the largest sportsbooks in North America, operating in most regulated US states and in Ontario, alongside its daily fantasy product. This Actor covers the sportsbook side: the odds board for every game FanDuel prices, including the full player prop set. For its daily fantasy contests, see PrizePicks or Underdog Fantasy, which cover the same market from the DFS angle.

What markets are included? The complete board FanDuel shows on a game page, merged across every tab: moneyline, spread, totals and alternates, period and inning markets, same-game-parlay markets, and the full player prop set. A live NFL game is about 150 markets and 1,100 bet options; an MLB game about 159.

Does FanDuel have an API? Not a public one. FanDuel offers no developer API, no documentation and no keys for its odds board, and its official partner feeds are enterprise agreements rather than something you can sign up for. This Actor gives you the same board as a normal REST response, with stable IDs and three odds formats, and no rate limit beyond your own budget.

Can I connect this to Google Sheets, Make or Zapier? Yes. Every run writes a normal Apify dataset, so the Google Sheets, Make, Zapier and Slack integrations on the Actor's Integrations tab work without any extra setup, and a webhook can push each finished run straight to your own endpoint.

How often should I schedule it? For pre-match line movement, hourly on the day of the slate is usually enough; lines move most in the last few hours before a start. For in-play, use the always-on API and poll /events/{eventId}/odds rather than scheduling batch runs.

How fresh are the odds? Every run fetches live. There is no cache between you and the board, and each row carries the timestamp it was captured.

How do I export the data? JSON, CSV, Excel, XML or HTML from the run's Storage tab, or through the Apify API. JSON preserves the exact decimal odds; CSV and Excel are flat already, since every row is one bet option.

Is it legal to scrape FanDuel odds? The Actor reads publicly visible odds pages, nothing behind a login and no personal data. You are responsible for complying with FanDuel's terms and with the data protection law that applies to you, including GDPR, CCPA and PIPEDA in Canada. Odds data is factual pricing information, but gambling advertising and data use are separately regulated in many jurisdictions.

What is the free tier? 5 runs, one complete game board each, no credit card. That is roughly 1,100 odds rows per run.

What are simulated leagues? FanDuel prices computer-played leagues that use real team names, such as "eBasketball H2H GG League 4x5 Mins". A new one starts every few minutes, so in start-soonest order they crowd out real fixtures. Batch runs, /events and /live all skip them by default and flag them with isSimulated. Genuine esports competitions between human players are not affected.

Why is side null on some selections? side carries HOME, AWAY, OVER or UNDER on the markets where FanDuel provides it, which is mainly the main lines, roughly one selection in eight. Elsewhere it is null and the selection name is the label.

Do I get suspended lines? Yes. An in-play game suspends most of its board between plays, and dropping those would leave you with nothing during the moments that matter most. Every selection comes through with its status, so filter on selectionStatus if you only want tradeable prices.

What are the opaque IDs? Game, market, selection and league IDs are 16-character hex strings. They are stable and deterministic, so an ID you stored yesterday still works today. Discover them via /events or /competitions, then use them on the detail endpoints.

Can I get historical odds? Not as a back catalogue. Each selection carries its previous price, which covers the most recent move. For a longer series, run on a schedule and keep the exports; every row is timestamped.

How do I get just one league? Set league to any part of its name: NHL, MLB, NBA, NFL, Premier League. Matching is a case-insensitive substring, so a short name is usually enough. Out of season the run finishes with an empty dataset and the log lists the leagues that are actually running in that sport, which is the fastest way to find the right spelling.

Which sports are covered? 25: American football, basketball, baseball, ice hockey, soccer, tennis, MMA, golf, boxing, cricket, darts, snooker, table tennis, volleyball, handball, rugby union, rugby league, Australian rules, Gaelic games, lacrosse, motor sport, cycling, surfing, politics and special bets. Coverage follows the season, so an out-of-season sport returns an explained empty result rather than an error.

What is Standby mode? An always-on HTTP server. No queue and no cold start while it is warm; Apify keeps it running and routes requests straight to it.

More Zen Studio scrapers for sports betting

🏟️ Sportsbook odds

🎯 Daily fantasy & player props

Support

  • Bugs: Issues tab
  • Features: Issues tab

Extracts publicly available data. Users must comply with FanDuel's terms and applicable data protection regulations, including GDPR, CCPA and PIPEDA.


Real-time FanDuel Sportsbook odds for 25 sports: the complete board per game, player props included, with line movement and live scores.