Sports Odds Scraper - DraftKings, Pinnacle, Underdog, Sleeper
Pricing
from $0.01 / 1,000 odds rows
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
Maintained by CommunityActor stats
0
Bookmarked
6
Total users
4
Monthly active users
3 days ago
Last modified
Categories
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.
| Input | Sports or league names, plus optional players, markets, books and dates |
| Output | One row per selection: game, start time, market, player, line, American and decimal odds or payout multiplier, and the source's own ids |
| Ceiling | 30,000 rows per run |
| Speed | Most runs take 3 to 35 seconds; 26,098 rows took 72 seconds |
| Account needed | None 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 get | Field |
|---|---|
| The book or app, the sport and the league | bookmaker, source, sport, league |
| The game, both teams, the start time or game day, and whether it is under way | event, homeTeam, awayTeam, startTime, gameDay, isLive |
| The market and the side | marketType, market, selection |
| The player and their team, on props | player, playerTeam |
| The number being bet over or under | line |
| The price: American and decimal odds, or the app's payout multiplier | oddsAmerican, oddsDecimal, payoutMultiplier |
| Fractional odds and implied probability, when you tick them | oddsFractional, impliedProbability |
| The source's own ids, when the app last moved the line, and when the row was read | eventId, marketId, selectionId, sourceUpdatedAt, scrapedAt |
▶️ How to scrape sports odds and player props
- Open Sports Odds Scraper and click Try for free.
- Tick a sport, or type league names into Leagues, one per line.
- Leave Bookmakers and apps on all four, or untick the ones you do not want.
- Set Maximum rows. Start around 200.
- 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}
| Field | Default | What it is |
|---|---|---|
sports | none, the box starts at football | Every league of the sports you tick. Soccer on Pinnacle alone is close to 300 leagues, so for soccer name the leagues instead. |
leagues | none, the box starts at NFL | League names, up to 40. NFL, MLB, WNBA, Premier League, La Liga, UFC. Short forms work: EPL, NCAAF, NCAAB. Case does not matter. |
sources | all four | DraftKings and Pinnacle are sportsbooks, priced in odds. Underdog and Sleeper are pick'em apps and carry player lines only. |
marketTypes | all four | moneyline, spread, total, player-prop. Drop player-prop and the two apps sit the run out. |
playerNames | none | Up 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. |
startFrom | none | Only games starting on or after this UTC day, written 2026-10-04. |
startTo | none | Only games starting on or before the end of this UTC day. |
includeLive | off | On, games already under way come too, at whatever price showed that second. |
extraOddsFormats | none | fractional 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. |
maxRows | 1000, the box starts at 200 | Rows 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"}
| Field | How to read it |
|---|---|
event | Always written "away @ home", whichever source it came from. |
startTime | UTC, and null on every Sleeper row. Sleeper publishes the day, which lands in gameDay. |
oddsAmerican, oddsDecimal | Both filled for DraftKings, Pinnacle and Underdog. Empty on Sleeper rows, which price in a multiplier only. |
oddsFractional, impliedProbability | Only 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. |
payoutMultiplier | Underdog and Sleeper. null on the two sportsbooks. |
market | The source's own name for it. On the apps that can be a part-game player stat, like 1H Rush Yards above. |
line | The number being bet over or under. null on a moneyline. |
player, playerTeam | Filled on player props, null on game lines. |
selectionId | The source's own id. Combined with source it is unique in a run, which is how repeats get dropped. |
sourceUpdatedAt | When the app last touched the line. Underdog and Sleeper only. |
🧾 Reading the output
| Row | How to spot it | Charged |
|---|---|---|
| A selection | it has a selectionId | yes |
| The sample row | _sample: true | no |
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
sourceandselectionId. - 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
oddsAmericanandoddsDecimalempty. - 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
scrapedAtsays 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 want | Use |
|---|---|
| Game lines and player props from two books and two apps | This one |
| Tennis results, surface and round, with average match odds | Tennis Results & Odds Scraper |
| Fixtures, live scores, results and league tables across 21 sports | Sofascore Scraper |
| Prediction-market prices on politics, economics, sport and weather | Kalshi Markets Scraper |
| Large Polymarket trades and the wallets behind them | Polymarket 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.
Is scraping betting odds legal?
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.