Sports Odds Scraper - DraftKings, Pinnacle, Underdog, Sleeper avatar

Sports Odds Scraper - DraftKings, Pinnacle, Underdog, Sleeper

Pricing

from $0.01 / 1,000 odds rows

Go to Apify Store
Sports Odds Scraper - DraftKings, Pinnacle, Underdog, Sleeper

Sports Odds Scraper - DraftKings, Pinnacle, Underdog, Sleeper

Pre-game odds and player props from DraftKings and Pinnacle, plus player lines from Underdog and Sleeper, in one shape. Each row: game, start time, market, player, line, and American and decimal odds or the payout multiplier. Filter by league, player or date. $0.01 per 1,000 rows.

Pricing

from $0.01 / 1,000 odds rows

Rating

0.0

(0)

Developer

Dami's Studio

Dami's Studio

Maintained by Community

Actor stats

0

Bookmarked

6

Total users

4

Monthly active users

3 days ago

Last modified

Share

Name a sport or a league and get odds and player props back as rows: the game, the start time, the market, the player where there is one, the line, and American and decimal odds or a payout multiplier. Two sportsbooks, DraftKings and Pinnacle, and two pick'em apps, Underdog and Sleeper, come back in the same shape so you can put them side by side.

It reads full-game main lines and player over/unders. Futures, alternate lines, halves and quarters of game lines, team totals and novelty props are not in there, and every row is a snapshot of the price at the second it was read.

InputSports or league names, plus optional players, markets, books and dates
OutputOne row per selection: game, start time, market, player, line, American and decimal odds or payout multiplier, and the source's own ids
Ceiling30,000 rows per run
SpeedMost runs take 3 to 35 seconds; 26,098 rows took 72 seconds
Account neededNone with any of the four
Price$0.01 per 1,000 rows, flat on every plan. The free plan's $5 a month covers about 500,000

🔍 What Sports Odds Scraper does

It walks each source you keep, in turn, and pulls the board for the sports or leagues you named. Every selection becomes a row with the same field names whatever produced it, so a DraftKings moneyline and a Sleeper player line sit in one table and join on the game.

The row limit is shared evenly between the sources you keep, and whatever one source does not use passes to the next. That is what stops a single busy board eating the whole run.

The fifteen best-known leagues are matched by their common name across all four sources, so Premier League means England's and not Canada's. Any other word is looked for inside each book's own league name, so WTA finds WTA - Guadalajara.

📋 What data you get from each odds row

What you getField
The book or app, the sport and the leaguebookmaker, source, sport, league
The game, both teams, the start time or game day, and whether it is under wayevent, homeTeam, awayTeam, startTime, gameDay, isLive
The market and the sidemarketType, market, selection
The player and their team, on propsplayer, playerTeam
The number being bet over or underline
The price: American and decimal odds, or the app's payout multiplieroddsAmerican, oddsDecimal, payoutMultiplier
Fractional odds and implied probability, when you tick themoddsFractional, impliedProbability
The source's own ids, when the app last moved the line, and when the row was readeventId, marketId, selectionId, sourceUpdatedAt, scrapedAt

▶️ How to scrape sports odds and player props

  1. Open Sports Odds Scraper and click Try for free.
  2. Tick a sport, or type league names into Leagues, one per line.
  3. Leave Bookmakers and apps on all four, or untick the ones you do not want.
  4. Set Maximum rows. Start around 200.
  5. Click Start, then download the dataset as JSON, CSV or Excel, or read it from the Apify API.

Want to see the row shape first? Clear the sport and the league and start it. You get one labelled sample row, and it is not charged.

💰 How much does it cost to scrape sports odds?

$0.01 per 1,000 rows. Flat on every Apify plan, no volume tiers. On the free plan, the $5 Apify gives you each month covers about 500,000 rows.

You pay per selection delivered. Selections your filters drop, live prices while Include games already under way is off, a selection already delivered in the same run, the sample row, and a source that could not be read are all uncharged. The extra odds formats cost nothing either.

📥 What you give it

{
"sports": ["football"],
"leagues": ["NFL"],
"sources": ["draftkings", "pinnacle", "underdog", "sleeper"],
"marketTypes": ["moneyline", "spread", "total", "player-prop"],
"startFrom": "2026-10-04",
"maxRows": 200
}
FieldDefaultWhat it is
sportsnone, the box starts at footballEvery league of the sports you tick. Soccer on Pinnacle alone is close to 300 leagues, so for soccer name the leagues instead.
leaguesnone, the box starts at NFLLeague names, up to 40. NFL, MLB, WNBA, Premier League, La Liga, UFC. Short forms work: EPL, NCAAF, NCAAB. Case does not matter.
sourcesall fourDraftKings and Pinnacle are sportsbooks, priced in odds. Underdog and Sleeper are pick'em apps and carry player lines only.
marketTypesall fourmoneyline, spread, total, player-prop. Drop player-prop and the two apps sit the run out.
playerNamesnoneUp to 100. A last name is enough and accents do not matter, so Mbappe finds Kylian Mbappé. Filling this in drops game lines, since they are not about a player.
startFromnoneOnly games starting on or after this UTC day, written 2026-10-04.
startTononeOnly games starting on or before the end of this UTC day.
includeLiveoffOn, games already under way come too, at whatever price showed that second.
extraOddsFormatsnonefractional adds oddsFractional, like 5/2. impliedProbability adds impliedProbability, which is 1 divided by the decimal odds, with the book's edge still in, so the two sides of a bet add up to a little over 1. Worked out from the price on the row, so it changes no rows and costs nothing extra.
maxRows1000, the box starts at 200Rows in one run, up to 30,000, shared between the sources.

📤 What you get back

Two real rows: a DraftKings moneyline from a run on 13 September 2026, and an Underdog player prop from a run on 3 October.

{
"bookmaker": "DraftKings",
"source": "draftkings",
"sport": "football",
"league": "NFL",
"event": "DAL Cowboys @ NY Giants",
"homeTeam": "NY Giants",
"awayTeam": "DAL Cowboys",
"startTime": "2026-09-14T00:20:00.000Z",
"gameDay": null,
"isLive": false,
"marketType": "moneyline",
"market": "Moneyline",
"selection": "DAL Cowboys",
"player": null,
"playerTeam": null,
"line": null,
"oddsAmerican": -166,
"oddsDecimal": 1.602,
"payoutMultiplier": null,
"eventId": "34118096",
"marketId": "1_84695529",
"selectionId": "0ML84695529_3",
"sourceUpdatedAt": null,
"scrapedAt": "2026-09-13T21:26:17.516Z"
}
{
"bookmaker": "Underdog",
"source": "underdog",
"sport": "football",
"league": "NFL",
"event": "Tennessee Titans @ Baltimore Ravens",
"homeTeam": "Baltimore Ravens",
"awayTeam": "Tennessee Titans",
"startTime": "2026-10-04T17:00:00.000Z",
"gameDay": null,
"isLive": false,
"marketType": "player-prop",
"market": "1H Rush Yards",
"selection": "Over",
"player": "Derrick Henry",
"playerTeam": "Baltimore Ravens",
"line": 46.5,
"oddsAmerican": -110,
"oddsDecimal": 1.91,
"payoutMultiplier": 1,
"eventId": "179009",
"marketId": "085f2409-4769-478c-ba39-4ca956f29f7a",
"selectionId": "7ad61f2a-9ac9-40c2-9796-d02a1016a140",
"sourceUpdatedAt": "2026-10-03T04:24:05.621Z",
"scrapedAt": "2026-10-03T13:10:19.346Z"
}
FieldHow to read it
eventAlways written "away @ home", whichever source it came from.
startTimeUTC, and null on every Sleeper row. Sleeper publishes the day, which lands in gameDay.
oddsAmerican, oddsDecimalBoth filled for DraftKings, Pinnacle and Underdog. Empty on Sleeper rows, which price in a multiplier only.
oddsFractional, impliedProbabilityOnly there when you tick them in extraOddsFormats. The fraction is the American price reduced exactly, so -325 reads 4/13 and +150 reads 3/2. Empty on Sleeper rows.
payoutMultiplierUnderdog and Sleeper. null on the two sportsbooks.
marketThe source's own name for it. On the apps that can be a part-game player stat, like 1H Rush Yards above.
lineThe number being bet over or under. null on a moneyline.
player, playerTeamFilled on player props, null on game lines.
selectionIdThe source's own id. Combined with source it is unique in a run, which is how repeats get dropped.
sourceUpdatedAtWhen the app last touched the line. Underdog and Sleeper only.

🧾 Reading the output

RowHow to spot itCharged
A selectionit has a selectionIdyes
The sample row_sample: trueno

Run with no sport, no league and no player and you get that one sample row and nothing else. It is a real DraftKings NFL price, there to show you the shape.

No diagnostic rows go into the dataset. The run's status message leads with the split, like "Returned 200 odds rows: DraftKings 50, Underdog 75, Sleeper 75", then names anything that did not come through. RUN_REPORT in the key-value store has the long version: per source, how many rows, how much of its share it used, which leagues were read and which pages were not, plus counts for everything dropped on live, dates, market, sport, league, player and repeats.

A source that cannot be read on a given run is reported as not read. It returns nothing and nothing is charged for it, and the other sources carry on.

💡 What people use it for

  • Comparing the same game across two sportsbooks and two pick'em apps in one table.
  • Tracking a line through the week on a schedule, keyed on source and selectionId.
  • Pulling every prop on a handful of players before a slate, with Players filled in.
  • Feeding a model, since the American and decimal prices are both there and the ids are stable.
  • Checking whether an app's multiplier is worth more or less than a book's price on the same line.

🚧 What it does not do

  • Main lines and player over/unders only. No futures, alternates, halves or quarters of game lines, team totals or novelty props.
  • Sleeper rows have no start time, and no game at all for soccer, CS2 and tennis lines. They carry gameDay.
  • A multiplier is not odds. Sleeper rows leave oddsAmerican and oddsDecimal empty.
  • Season-long app lines are left out. Weekly and per-game lines only.
  • DraftKings prices come from one state's board. Another state can price differently.
  • Naming players removes game lines from that run, because a moneyline is not about a player.
  • It is not a live feed. Each row is what the source showed when it was read, and scrapedAt says when.
  • Only these four sources, and none of them is a betting account: this returns numbers, it does not place anything.
  • Soccer across a whole sport is slow. Close to 300 leagues on Pinnacle alone, so name the league you want.
  • It is not an official tool of any platform or company named on this page. Dami's Studio is independent and is not affiliated with or endorsed by any of them.

🧭 Which odds or sports data scraper do you need?

If you wantUse
Game lines and player props from two books and two appsThis one
Tennis results, surface and round, with average match oddsTennis Results & Odds Scraper
Fixtures, live scores, results and league tables across 21 sportsSofascore Scraper
Prediction-market prices on politics, economics, sport and weatherKalshi Markets Scraper
Large Polymarket trades and the wallets behind themPolymarket Whale Tracker

❓ Questions people ask

Do I need an account with any of the sportsbooks or apps?

No. No login, no key, nothing to apply for.

Why did one source return fewer rows than the others?

The row limit is split evenly, so a source with a thin board for your league returns fewer and hands its unused share on. A source that was only partly read on a run is named in the status message, and you pay only for the rows that arrived.

Can I get odds from just one sportsbook?

Yes. Untick the rest in Bookmakers and apps and the whole row limit goes to the one you kept.

Why are the pick'em apps missing from my run?

They only carry player lines. Without player-prop in Markets they sit it out, and the status message says so.

How do I follow a line through the week?

Schedule it with the same league and a small Maximum rows, and key your store on source plus selectionId.

Can I call it from code or connect it to an AI assistant?

Yes. The API tab has ready-made code for Python, JavaScript and the command line. For Claude, ChatGPT or another MCP client, connect https://mcp.apify.com/?tools=fetch-actor-details,dami_studio/sports-odds-scraper. Either way the run happens on your Apify account at the same price.

These are public prices on public pages. Read the terms of whichever source you care about and decide for yourself. Apify's write-up on the legality of web scraping is a starting point, and we are not lawyers.

🆘 If something breaks

Open the Issues tab on the actor page. Send the run ID and the input. The status message and RUN_REPORT name which source fell short.