Sports Odds Scraper
Moneylines, spreads, totals and player props from DraftKings and Pinnacle, plus Underdog and Sleeper player lines, one row per selection.
How it works
- 1Open it on Apify
Hit Run on Apify — it opens the tool in the cloud, no install.
- 2Set the inputs
Adjust
sports,leagues,sources(sensible defaults are pre-filled). - 3Click Run
The tool runs on Apify’s cloud and collects the data for you.
- 4Export the results
Download as JSON, CSV or Excel, or pipe straight into your app, Google Sheets, or an AI agent.
Pricing
$0.00001 per odds row = $0.01 per 1,000
| You are charged for | When | Price |
|---|---|---|
| Odds row returned | One odds or player-prop row returned in the dataset. | $0.00001 |
Pay-per-event pricing: you are billed per result, not per subscription. Billing is handled by Apify on your own account. These are the live Apify store prices, in effect since 2026-09-14, and they are what you are actually charged.
Inputs
| Field | What it does | Type |
|---|---|---|
sports | Every league of the sports you tick, on every source you keep. Leave it empty and fill in Leagues instead if you only want one or two. Soccer on Pinnacle alone is close to 300 leagues, so for soccer it's worth naming them. | array |
leagues | League names, for example NFL, MLB, WNBA, Premier League, La Liga or UFC. Short forms work too: EPL, NCAAF, NCAAB. The big leagues are matched by name across all four sources, so Premier League means England's, not Canada's or Malta's. Any other name is looked for inside each book's own league name, so WTA finds WTA - Guadalajara. Case doesn't matter. | array |
sources | DraftKings and Pinnacle are sportsbooks: game lines and player props, priced in odds. Underdog and Sleeper are pick'em apps: player lines only. Underdog gives its own American and decimal price and a payout multiplier; Sleeper gives the multiplier alone. | array |
marketTypes | Game lines are the full-game main lines. Player props are over/under lines on one player's stat. Futures, alternate lines, halves and quarters of game lines, and novelty props aren't included. | array |
playerNames | Only props on these players. A last name is enough, and accents don't matter: Mbappe finds Kylian Mbappé. Game lines are left out when this is filled in, because they aren't about a player. | array |
startFrom | Only games that start on or after this day (UTC), written like 2026-09-13. Leave it empty for everything on the board. | string |
startTo | Only games that start on or before the end of this day (UTC). Sleeper gives a game's day but not its start time, so its rows are matched on the day. | string |
includeLive | Off, you get pre-game prices only. On, games that have started are included too, at whatever price the book showed at that second. | boolean |
maxRows | The most rows one run returns, shared fairly between the sources you keep. Each row is one charge. | integer |
What you get
A structured dataset — each result includes fields like:
bookmakerleagueeventstartTimegameDaymarketplayerselectionlineoddsAmericanoddsDecimalpayoutMultiplierisLivescrapedAtExport every run as JSON, CSV or Excel, or send it to your app, a database, Google Sheets, or an AI agent.
Related tools in Developer & Research Tools
Other ready-to-run tools in the same category — all pay-per-use on the Apify cloud.
GitHub Scraper
Search GitHub repos and users: stars, forks, language, topics, licence, plus user bio, company and followers. No token needed. $0.90 per 1,000 rows.
Stack Overflow / Stack Exchange Scraper
Search Stack Overflow and Stack Exchange by keyword or tag. Score, answer count, views, reputation and body text. $2 per 1,000 questions.
Package Registry Scraper (npm + PyPI)
Get npm and PyPI package metadata as JSON. Version, license, author, repo, keywords and npm monthly downloads. $2 per 1,000 packages.
arXiv Scraper
Search arXiv papers by title, author, abstract or category. Get full abstracts, authors, categories, DOI, dates and PDF links. $2 per 1,000 papers.
OpenAlex Scholarly Works Scraper
Search 250M+ OpenAlex papers with no API key. Get titles, authors, venue, year, citations, DOI, OA links and full abstracts. $2.00 per 1,000 papers.
Crossref Scholarly Works Scraper
Search 150M+ papers on Crossref: DOI, title, authors, journal, publisher, date, citations and abstract. No API key. $1.00 per 1,000 works.
Where this tool sits
- Categories
- Developer & Research Tools
Sports Odds Scraper
Pick a sport or a league and get what's on the board right now. That means game lines and player props from two sportsbooks, DraftKings and Pinnacle, and player lines from two pick'em apps, Underdog and Sleeper. Every row is one selection: the game and when it starts, the market, the player if it's a prop, the line, and the price.
It reads the odds each book's own website or app shows its visitors. There's no API key to get and no account to log in to.
For scale: on 13 September 2026, the first Sunday of the NFL season, Underdog's board held 9,166 player lines and Pinnacle listed 780 NFL player props.
What it doesn't do
- No PrizePicks. It isn't covered.
- It doesn't place bets and never touches an account.
- No futures, alternate lines, half or quarter game lines, or novelty props. Game lines are the full-game main line. Player props are the over/under on one player's stat.
- Sleeper shows multipliers, not odds. Its rows carry the payout multiplier and leave the odds columns empty. Sleeper also gives the day of a game rather than its start time, and for soccer, CS2 and tennis it doesn't say which game a line belongs to.
- Prices are the moment of the run. Lines move, sometimes by the second close to kick-off. Nothing here is historical.
- DraftKings prices are its New Jersey site's. Other states can differ now and then.
Input
Sports. Tick the ones you want and you get every league of those sports, on every source you keep.
Leagues. League names: NFL, MLB, WNBA, Premier League, La Liga, UFC. Short forms work as well (EPL, NCAAF, NCAAB). The big leagues are matched by name across all four sources, so Premier League means England's, not Canada's or Malta's. Those are NFL, College Football, MLB, NBA, WNBA, College Basketball, NHL, Premier League, La Liga, Serie A, Bundesliga, Ligue 1, MLS, Champions League and UFC. Any other name is looked for inside each book's own league name, so WTA finds WTA - Guadalajara and Brazil - Serie A finds Brazil's. Case doesn't matter, and you can fill in Leagues without ticking a sport.
Bookmakers and apps. All four unless you untick some. Underdog and Sleeper only list player props, so they sit out a run that asks for game lines only.
Markets. Moneyline, spread, total and player props. Run lines and puck lines count as spreads.
Players. Only props on these players. A last name is enough, and accents don't matter: Mbappe finds Kylian Mbappé. Game lines drop out when this is filled in, since they aren't about a player.
Starting from, Starting up to. Days in UTC, written like 2026-09-13. Sleeper rows are matched on their game day.
Include games already under way. Off by default, so you get pre-game prices only.
Maximum rows. 1,000 unless you change it, and up to 30,000 per run. The limit is shared between the sources you keep, so a small one still gives each source a turn, and whatever one source doesn't use goes to the next.
{
"leagues": ["NFL"],
"marketTypes": ["player-prop"],
"playerNames": ["Josh Allen", "Jalen Hurts"],
"maxRows": 500
}
Output
One row per selection.
| Field | Example | Notes |
|---|---|---|
bookmaker | DraftKings | DraftKings, Pinnacle, Underdog or Sleeper |
sport | football | American football is football, association football is soccer |
league | NFL | the big leagues get one name across all four sources, so Premier League reads the same everywhere |
event | NO Saints @ DET Lions | away team first, in the book's own spelling |
homeTeam, awayTeam | DET Lions, NO Saints | |
startTime | 2026-09-13T17:00:00.000Z | UTC. Empty on Sleeper rows |
gameDay | 2026-09-13 | Sleeper rows only |
isLive | false | true only when you include games already under way |
marketType | player-prop | moneyline, spread, total or player-prop |
market | Passing Yards | |
selection | Over | a team, Over, Under or Draw. Underdog's Higher and Lower come through as Over and Under |
player | Jared Goff | props only |
playerTeam | DET Lions | when the book says |
line | 259.5 | the spread, total or prop number. Empty for a moneyline |
oddsAmerican | -113 | |
oddsDecimal | 1.885 | DraftKings' exact price to three places; worked out from the American odds for Pinnacle |
payoutMultiplier | 1.6 | Underdog and Sleeper |
eventId, marketId, selectionId | the book's own ids, handy for matching one run against the next | |
sourceUpdatedAt | 2026-09-13T12:23:35.000Z | when the book last changed the line, where it says (Underdog, Sleeper) |
scrapedAt | 2026-09-13T14:25:04.238Z | when this run read it |
The run also leaves a report, RUN_REPORT, in its key-value store: what each source returned, which leagues it read, what was left out and why, and why the run stopped.
What you pay
Each row in your dataset is one charge. Nothing else is charged: not a source that doesn't answer, not rows your filters leave out, not games already under way while that box is off, and not a selection a book happens to list twice. If you set a maximum charge for the run, it stops when that's reached, and every row you get has been paid for. The price is on the Pricing tab.
Limits
- 30,000 rows per run.
- Pinnacle lists close to 300 soccer leagues. Asking for all of soccer reads every one of them, which takes a few minutes, so name the leagues if you only want some.
- DraftKings player props are read one market at a time, about 30 for an NFL week, so props take longer than game lines.
- Underdog's board arrives as one download of about 25 MB, whatever you filter.
Where the data comes from
Each book's own public odds, the same numbers its site or app shows. Treat them as information rather than advice, and check the price in the book before you bet, because odds can change between the run and your click. Whether you can bet at all depends on where you live.
Questions
Why are the odds columns empty on Sleeper rows? Sleeper pays by multiplier: a pick at 1.6x pays 1.6 times its share of the entry. It doesn't publish odds, so the actor doesn't invent any.
A price doesn't match what I see in the app. Check scrapedAt first. Lines move, and a few minutes is plenty. DraftKings can also differ a little from state to state.
Can I watch lines move? Schedule the actor every few minutes and compare rows on selectionId from one run to the next. Each run is a fresh read of the board.