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

12

Total users

6

Monthly active users

2 days ago

Last modified

Share

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

The full FanDuel board. 22,026 selections. 16 games. Game lines, player props and period markets.

From Zen Studio, the team behind DraftKings Odds, BetMGM Odds and Bet365 Odds. Sportsbook data is an established part of our suite, from full game boards to dedicated player props.

Why choose this actor?

  • The board goes beyond moneyline, spread and totals. Collect player props, alternate lines and period markets alongside the main game lines. Export passing yards, strikeouts, touchdown scorers and inning or quarter markets wherever FanDuel offers them.
  • 22,026 selections across 16 games, in 93 seconds. A completed bulk run exported that board as individual priced selections, ready to compare or monitor. Each row includes its game, market, selection and odds. Choose how many games to collect; the number of selections follows the available board.
  • Three odds formats, plus the previous price. Decimal, fractional and American odds come together, with previous decimal and American prices where supplied. Use batch exports for analysis or the always-on API for fresh odds and live scores.

Explore the FanDuel board

Try one complete game board

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

Open actor input to choose a sport and league. maxEvents counts games, not selections: one game can produce hundreds of rows. This example collects one currently available MLB game and its markets. Export JSON, CSV or Excel.

Data comes from FanDuel Ontario. Market availability and prices vary by region and event. Simulated leagues are excluded by default.

Zen Studio · Sportsbook Data
FanDuel FanDuel
You are here
DraftKings DraftKings
Lines & props
BetMGM BetMGM
Lines & futures
Bet365 Bet365
Live & pre-match
PrizePicks PrizePicks
Player projections

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 To reach the maintainers, add feedback="<what you needed and did not get>" to any run, including one that worked: a missing field or option, a wrong or empty result, or which actor you are switching to or from and why. The run returns its data exactly as it would without the note, and a human reads every note.

Key Features

  • The complete board, not the headline markets: every tab FanDuel shows on a game page, plus the markets it prices for the game but shows on none of those tabs (quarter-by-quarter player yards, longest reception, listed-pitcher moneylines, flagged onGamePage: false), merged into one result. A pre-game NFL game returns about 380 markets, an international soccer match about 240.
  • 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.
  • Previous odds where supplied: previousDecimalOdds and previousAmericanOdds accompany the current price when FanDuel provides them, so the most recent move can be compared in one export.
  • 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; whole words match (NHL, Premier League). A league from another sport switches the run to that sport.
maxEventsinteger10Number of games, 1 to 500. Each returns its complete board. Free runs return 1 game whatever you set: the fullest board among games not yet started.
includeSimulatedbooleanfalseInclude FanDuel's computer-played leagues (eBasketball, eSoccer, eFootball).

What Data Can You Extract from FanDuel?

Every row is one bet option, so the row count follows the game: about 3,100 on a pre-game NFL game, 1,300 to 1,800 on an MLB, NHL or major soccer game, a few dozen on a minor fixture.

  • Game: sport, league, league region, name, start time, live flag, home and away teams, simulated flag
  • Market: name, type, status, same-game-parlay eligibility, whether FanDuel shows it on the game page (onGamePage), 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,
"onGamePage": 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,
"onGamePage": 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, and the number of markets /events/{eventId} returns for it. 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,
"onGamePage": 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,
"onGamePage": 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,
"onGamePage": 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.

These pull a full slate, so they need billing details on Apify: a free run returns 1 game and says so in the log.

Track line movement on tonight's slate

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

Where FanDuel supplies a previous price, 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 startApify's platform start fee

A pre-game NFL board is about 3,100 priced bet options, which works out to roughly $0.016 per 1,000 odds rows; smaller fixtures carry fewer. /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, Apify's platform start fee 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? Every market FanDuel prices for the game, merged across every game-page tab plus the markets it prices but does not show there (flagged onGamePage: false, so you can keep to exactly what the game page shows): moneyline, spread, totals and alternates, period and inning markets, same-game-parlay markets, and the full player prop set. A pre-game NFL game is about 380 markets and 3,100 bet options; an MLB game 180 to 250 markets.

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. The free game is the one with the fullest board among games that have not started, so the sample is a whole pre-game board rather than a game in progress with markets suspended. That is up to about 3,100 odds rows per run on an NFL game. maxEvents is capped to that one game on a free run, whatever you set it to, and the log says so; add billing details on Apify to pull a full slate.

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. Selections include a previous price where supplied, covering 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 whole word from its name: NHL, MLB, NBA, NFL, Premier League. Matching is case-insensitive and on whole words, so Premier League finds "English Premier League" while NBA does not also return WNBA games. If the league belongs to a different sport than the one selected, the run switches to that sport and the log says so, so {"league": "NFL"} on its own works. If the league is not running anywhere right now, the run finishes with an empty dataset, uncharged, and the log lists the leagues that are running in the selected 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

🎾 Live scores & match data

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.