DraftKings Odds API - Real-Time Lines & Player Props
Pricing
from $6.69 / 1,000 requests
DraftKings Odds API - Real-Time Lines & Player Props
Extract real-time DraftKings sportsbook odds for 28 sports and 280+ leagues. Get spreads, moneylines, totals, player props, and futures in 3 odds formats. Always-on HTTP API. Live in-play odds with scores. NBA, NFL, MLB, NHL, EPL, and more. No login required.
Pricing
from $6.69 / 1,000 requests
Rating
0.0
(0)
Developer
Zen Studio
Maintained by CommunityActor stats
2
Bookmarked
434
Total users
61
Monthly active users
4.2 days
Issues response
2 days ago
Last modified
Categories
Share
DraftKings Odds API — Real-Time Lines, Player Props & Futures
A recorded College Football run with all market types returned 104,639 selections. Each row is a selection, not a separate game or market. Available counts vary; the pictured odds are illustrative.
| Always-on HTTP API — send a GET request, get DraftKings odds back in milliseconds. |
| 28 sports, 280+ leagues. Spreads, moneylines, totals, player props, futures. Public betting percentages: share of bets and share of money per side. American, decimal, and fractional odds. Live in-play with scores. No account required. |
| Zen Studio Sports Betting | |||
You are here | DFS player props | Projections and lines | Markets & props |
Copy to your AI assistant
Help me use zen-studio/draftkings-odds, a batch Actor with an HTTP API on Apify. Read https://apify.com/zen-studio/draftkings-odds.md for documentation, input schema, pricing and limits. Choose settings for my requested outcome. If you cannot retrieve the page, ask me to paste the relevant sections. To reach the maintainers, add feedback="<what you needed and did not get>" to any batch 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.
DraftKings Odds API. Base: https://zen-studio--draftkings-odds.apify.actor Auth: token query parameter. Endpoints: GET /sports (free, list all sports), GET /leagues?sport=X (leagues for a sport), GET /leagues/{id}?market=game_lines|player_props|futures|all (events with odds), GET /events/{id}?market=X&league={leagueId} (single event detail). Pricing (pay per event, Free plan prices, lower on paid Apify plans): $9.99 per 1,000 requests to /leagues, /leagues/{id} and /events/{id} ($6.69 per 1,000 on Gold and higher), $0.20 per 1,000 dataset rows in batch mode ($0.134 per 1,000 on Gold and higher), plus Apify's platform start fee. /health and /sports are free. Batch mode inputs: sport (any slug from GET /sports, e.g. ALL|football|basketball|baseball|hockey|soccer|tennis|golf|mma|cricket|motorsports; read live, new sports work immediately), leagueIds (string, comma-separated league IDs, overrides sport), eventIds (string, comma-separated event IDs: collect single games and pay for their rows only, e.g. "34226148"; take IDs from the eventId column or GET /leagues/{id}, and pass the game's leagueIds too to skip straight to it), teams (string, comma-separated: the games a team plays, with no event ID needed - the code the board uses "NE", the nickname "Patriots", the name as the board writes it "NE Patriots" or the longer "New England Patriots"; words no team on the schedule uses are ignored, cities included, so prefer the code or the nickname; one entry naming both sides is that single game "NE at CHI", separate entries are every game either plays "NE, CHI"), dates (string, comma-separated YYYY-MM-DD, today or tomorrow: the games kicking off then, matched against the kickoff date in US Eastern, the sportsbook's own day, or in UTC, the startTime column's own zone, so a Thursday night game starting 00:15 UTC answers to both the Thursday and the Friday; a date that cannot be read stops the run rather than returning the whole board), dateFrom and dateTo (string, same values, an inclusive window with either side on its own open-ended). teams and dates read the games they match whole and charge for those rows alone, exactly as eventIds does, so a one-game pull never depends on the row limit reaching that game, and a team or date matching nothing is named in the log with the league's own schedule instead of returning an empty dataset. market (game_lines|player_props|futures|all; futures covers every season-long category the league lists, including championships, awards, division and conference winners, regular season win totals, playoff seeding and stat leaders, and the log names the categories read per league), propTypes (string, comma-separated prop filter for player_props and all, matched word by word against the market name in the results, so "passing yards" finds "Passing Yards" and "receiving" takes every receiving prop; a leading - excludes instead, so "receptions, -race to, -1st quarter" keeps the receptions markets without the ladder and quarter variants that otherwise fill the row limit, and excludes on their own keep everything they do not name; anything matching nothing is named in the log instead of returning an empty dataset), maxResults (int, default 500, 0=unlimited; a run that hits the cap says so and the game it stopped inside is incomplete, and with several eventIds the cap is shared between those games so each gets a share instead of the first game taking all of it). Every selection includes odds in 3 formats, impliedProbability, and DraftKings public betting splits betsPercent (share of bets) + handlePercent (share of money) where published. Free tier: 10 lifetime batch runs (capped to 200 rows per run, which maxResults cannot raise; a capped run logs how many rows it returned and how many it held back) or 50 lifetime API calls. League IDs: NBA=42648 NFL=88808 MLB=84240 NHL=42133 WNBA=94682 UFC=9034 College Football=87637 CFB FCS=154752 EPL=40253 Champions League=40685 La Liga=40031 Bundesliga=40481 Serie A=40030 F1=212334. 280+ leagues total, call /leagues for the current list.
Also available as an MCP server — add zen-studio/draftkings-odds for natural language access.
How to Scrape DraftKings Odds in Real Time
|
|
|
|
|
|
|
DraftKings Odds API Endpoints
Your API base URL:
https://zen-studio--draftkings-odds.apify.actor?token=YOUR_APIFY_TOKEN
Five endpoints, all GET. /health and /sports are free. The rest are billed per request.
The market parameter controls what you get back: game_lines (spread, moneyline, total), player_props (points, rebounds, assists, combos, H2H), futures (championship, MVP, division and conference winners, regular season win totals, playoff seeding, stat leaders), or all for everything. A futures run names the categories it read for each league in the log.
Pricing
Pay per use, no subscription. Prices drop on higher Apify plans.
| Event | Charged for | Free | Bronze | Silver | Gold and higher |
|---|---|---|---|---|---|
| Request | Each call to /leagues, /leagues/{id} or /events/{id}, and each league with results in a batch run | $9.99 per 1,000 | $8.99 per 1,000 | $7.99 per 1,000 | $6.69 per 1,000 |
| Dataset row | Each odds row written to the dataset in a batch run | $0.20 per 1,000 | $0.18 per 1,000 | $0.16 per 1,000 | $0.134 per 1,000 |
| Actor start | Each run start, one per GB of memory | Apify's platform start fee | Apify's platform start fee | Apify's platform start fee | Apify's platform start fee |
/health and /sports are always free. Standby responses are charged per request only, never per row.
DraftKings Odds JSON Output
Every response returns the full odds structure below. Real NBA game lines example:
{"success": true,"league": {"id": "42648","name": "NBA","sport": "Basketball","sportId": "2"},"eventCount": 8,"events": [{"id": "33841191","name": "OKC Thunder @ WAS Wizards","startTime": "2026-03-21T21:10:00Z","status": "NOT_STARTED","homeTeam": {"id": "32962","name": "WAS Wizards","abbreviation": "WAS"},"awayTeam": {"id": "32942","name": "OKC Thunder","abbreviation": "OKC"},"markets": [{"id": "1_84695475","name": "Spread","type": "spread","isMain": true,"selections": [{"label": "WAS Wizards","odds": "+1400","decimalOdds": 15.0,"fractionalOdds": "14/1","impliedProbability": 6.7,"betsPercent": 23.0,"handlePercent": 34.0,"points": 14.5,"outcome": "home"},{"label": "OKC Thunder","odds": "-2800","decimalOdds": 1.04,"fractionalOdds": "1/28","impliedProbability": 96.6,"points": -14.5,"outcome": "away"}]},{"id": "1_84695476","name": "Moneyline","type": "moneyline","isMain": true,"selections": [{"label": "WAS Wizards","odds": "+1200","decimalOdds": 13.0,"fractionalOdds": "12/1","impliedProbability": 7.7,"outcome": "home"},{"label": "OKC Thunder","odds": "-2500","decimalOdds": 1.04,"fractionalOdds": "1/25","impliedProbability": 96.2,"outcome": "away"}]},{"id": "1_84695477","name": "Total","type": "total","isMain": true,"selections": [{"label": "Over","odds": "-110","decimalOdds": 1.91,"fractionalOdds": "10/11","impliedProbability": 52.4,"points": 226.5,"outcome": "over"},{"label": "Under","odds": "-110","decimalOdds": 1.91,"fractionalOdds": "10/11","impliedProbability": 52.4,"points": 226.5,"outcome": "under"}]}]}],"scrapedAt": "2026-03-21T14:30:00Z"}
Main Lines vs Alternate Lines
One rule works on every board:
a row is the main line when the market is not
isAlternateand the selectionisMain.
In batch mode that is precomputed as the isMainLine column.
isAlternate(market) — the market is an alternate ladder (Spread Alternate,Total Alternate). Derived from the market name, so you can re-derive it yourself.isMain(selection) — the main rung of its own market. On an alternate ladder the top rung still carries it, which is why it is not sufficient alone.
Measured on a full college football board with 484 ladders: the rule leaves exactly one line on all 484 and never more than one. On an NFL player-prop board it leaves exactly one row per player, stat and side across 1,726 groups.
The source's own market-level main flag is deliberately not exposed. It is wrong in both
directions: set on alternate ladders, unset on 100 of those 484 ladders that do have a main
line, and on player props true almost only for combo markets such as
Player A & Player B - Receiving Yards Total.
DraftKings Public Betting Percentages
Every selection carries the share of bets and the share of money DraftKings reports for it, wherever DraftKings publishes them (typically 50-90% of a league's board):
{"label": "SEA Seahawks","odds": "-170","impliedProbability": 63.0,"betsPercent": 77.0,"handlePercent": 66.0}
betsPercent— share of bets placed on this side, the public/ticket counthandlePercent— share of money wagered on this side
The two diverging is the signal bettors look for: a side with 77% of tickets but 34% of the
money means many small bets against fewer large ones. Both are numbers, not strings, and are
absent on selections DraftKings does not publish splits for. Available in batch mode as the
betsPercent and handlePercent columns.
DraftKings Live In-Play Odds
When a game is in progress, each event includes live scoring data:
{"id": "33841191","name": "OKC Thunder @ WAS Wizards","status": "STARTED","live": {"period": 3,"clock": "04:22","clockRunning": true,"homeScore": 78,"awayScore": 95},"markets": [...]}
DraftKings Player Props Data
Use market=player_props to get player-level prop lines. Use the propTypes parameter (batch mode) to filter by stat type.
{"id": "1_84695478","name": "Shai Gilgeous-Alexander Over/Under Points","type": "player_prop","selections": [{"label": "Over","odds": "-115","decimalOdds": 1.87,"fractionalOdds": "20/23","impliedProbability": 53.5,"points": 30.5,"outcome": "over","participant": {"id": "1234567","name": "Shai Gilgeous-Alexander","type": "Player"}}]}
Batch Mode: One Game at a Time
Use eventIds to collect single games. Every market you asked for is returned for those games, nothing else is written, and you pay for their rows only: one college football game is a few hundred rows against roughly 35,000 for the whole league. Take the IDs from the eventId column of any run, or from GET /leagues/{id}.
{"leagueIds": "87637","eventIds": "34226148","market": "player_props","maxResults": 0}
Pass the game's league in leagueIds as well and the run goes straight to it instead of looking through every league.
When you name several games, a row limit is shared between them: each game gets a share of the rows rather than the first game taking all of them, and the run says how many rows it returned and how many it held back. Ask for fewer games per run, or narrow the markets with propTypes, to get them in full.
Batch Mode: Pick Games by Team or Kickoff Date
teams and dates select the same single games as eventIds without needing the ID. The games they match are read whole and charged for their rows alone, so a one-game pull never depends on a row limit reaching that game.
{"leagueIds": "88808","market": "player_props","teams": "NE at CHI","propTypes": "receiving yards, receptions, rushing yards, passing yards","maxResults": 0}
teams is comma-separated and takes the code the board uses (NE), the nickname (Patriots), the name as the board writes it (NE Patriots) or the longer name you know it by (New England Patriots). Words no team on the schedule uses are ignored, cities included, so prefer the code or the nickname. One entry naming both sides is that single game (NE at CHI); separate entries are every game either team plays (NE, CHI).
dates is comma-separated YYYY-MM-DD, today or tomorrow, and dateFrom/dateTo are an inclusive window, either side on its own being open-ended. A date matches a kickoff on that date in US Eastern, the sportsbook's own day, or in UTC, which is what the startTime column shows, so a Thursday night game that starts at 00:15 UTC answers to both the Thursday and the Friday.
{"leagueIds": "88808","market": "game_lines","dateFrom": "today","dateTo": "tomorrow"}
Set leagueIds as well and the run goes straight to that league instead of looking through every league of the sport. A team or date that matches nothing is named in the log, with the league's own schedule, instead of returning an empty dataset, and a date that cannot be read stops the run rather than returning the whole board.
Batch Mode: Prop Type Filter
In batch mode, use propTypes to narrow player props by stat type. Comma-separated and case-insensitive, matched word by word against the market name in the results, so passing yards finds Passing Yards and receiving takes every receiving prop. Prop types that match nothing are named in the run log rather than returning an empty dataset. The filter applies to market=player_props and market=all.
A pattern with a leading - excludes instead of includes. The ladder and quarter variants of a market carry the same words as the market itself, so receptions also returns Race to 3 Receptions and passing yards also returns 1st Quarter Passing Yards. On a run with a row limit those variants can fill it:
{"leagueIds": "88808","market": "player_props","propTypes": "receptions, attempts, -race to, -1st quarter"}
Excludes on their own keep every market they do not name. Seven NFL games asked for receptions and attempts collect about 1,900 rows; the two excludes above take that to about 1,200 without touching a single player market.
{"sport": "baseball","market": "player_props","propTypes": "Strikeouts","maxResults": 500}
{"sport": "basketball","market": "player_props","propTypes": "Points, Assists, Threes"}
Available prop types vary by sport:
- Baseball: Strikeouts, Hits, Home Runs, Total Bases, Stolen Bases, RBIs, Walks, Runs
- Basketball: Points, Rebounds, Assists, Threes, Double-Double, Triple-Double
- Hockey: Goals, Shots on Goal, Assists, Saves, Blocks, Power Play Points
- Soccer: Goalscorer, Shots, Assists, Tackles, Saves, Cards
DraftKings League IDs
Common leagues for quick reference. The full board covers 280+ leagues across 28 sports and tracks DraftKings as it adds and retires competitions, so call GET /leagues (or GET /leagues?sport=football) for the current list rather than hardcoding these.
| League | ID | Sport |
|---|---|---|
| NBA | 42648 | Basketball |
| NFL | 88808 | Football |
| MLB | 84240 | Baseball |
| NHL | 42133 | Hockey |
| English Premier League | 40253 | Soccer |
| Champions League | 40685 | Soccer |
| La Liga | 40031 | Soccer |
| Bundesliga | 40481 | Soccer |
| Serie A | 40030 | Soccer |
| Ligue 1 | 40032 | Soccer |
| College Football | 87637 | Football |
| College Football FCS | 154752 | Football |
| College Basketball | 92483 | Basketball |
| WNBA | 94682 | Basketball |
| UFC | 9034 | MMA |
| Formula 1 | 212334 | Motorsports |
Scheduling
| Cadence | Best For |
|---|---|
| Once or twice daily | Daily odds snapshots, content creation |
| Every 1-4 hours | Line comparison, data collection |
| Every 30-60 seconds | Live odds dashboards, arbitrage detection |
Data Export
Results are available in:
- JSON — structured nested data for programmatic use
- CSV — flattened rows (batch mode) for spreadsheets
- Excel — download from Apify Console
Export directly from Apify Console or via API.
FAQ — DraftKings Odds Scraper
How do I scrape DraftKings odds?
Use the Standby mode endpoints. Send GET /leagues/42648 to get NBA odds instantly. No setup, no login, no browser.
What odds formats are available? American (+150, -110), decimal (2.50, 1.91), and fractional (3/2, 10/11). All three in every response.
Does this include live in-play odds? Yes. When a game is in progress, the response includes live scores, game clock, current period, and updated odds.
How often are odds updated? Odds reflect the current DraftKings state at the time of your request. For live games, query every 30-60 seconds.
Do I need a DraftKings account? No. All data is publicly available. No login, cookies, or account required.
Can I get odds for a single event?
Yes. Use GET /events/{id}?league={leagueId}&market=all to get every market for one event.
What's the difference between Standby and Batch mode? Standby is an always-on HTTP API for real-time queries. Batch runs on a schedule and exports all odds to a dataset.
Can I track line movements? Schedule the actor to run periodically and compare odds values across runs using event and selection identifiers.
Legal Compliance
This Actor extracts publicly available odds data from DraftKings. Users must ensure compliance with DraftKings terms of service and applicable data protection and gambling regulations.
Start Getting DraftKings Odds Now
More Zen Studio scrapers for sports betting
🏟️ Sportsbook odds
Action Network
FanDuel
BetMGM
Bet365
- Bet365 Real-Time Odds API
- Bet365 Live Scores API
- Bet365 Sports Data Scraper (
zen-studio/bet365-sports-data)
🎯 Daily fantasy & player props
Player Props Aggregator
- Player Props Line Shopping (
zen-studio/player-props-aggregator)
- Player Props Line Shopping (
PrizePicks
- PrizePicks Player Props Scraper (
zen-studio/prizepicks-player-props)
- PrizePicks Player Props Scraper (
Underdog Fantasy
- Underdog Fantasy Player Props API (
zen-studio/underdog-player-props)
- Underdog Fantasy Player Props API (
Sleeper
- Sleeper Player Props (
zen-studio/sleeper-player-props)
- Sleeper Player Props (
DraftKings Pick6
- DraftKings Pick6 Player Props (
zen-studio/draftkings-pick6-player-props)
- DraftKings Pick6 Player Props (
Bet365
- Bet365 Player Props API (
zen-studio/bet365-player-props)
- Bet365 Player Props API (
🎾 Live scores & match data
Tennis Abstract
- Tennis Abstract Scraper (
zen-studio/tennis-abstract-scraper)
- Tennis Abstract Scraper (
Flashscore
- Flashscore Tennis Scraper & API (
zen-studio/flashscore-tennis-api)
- Flashscore Tennis Scraper & API (
SofaScore
- SofaScore Scraper (
zen-studio/sofascore-scraper) Full directory: Zen Studio on Apify
- SofaScore Scraper (



