Sleeper Player Props Scraper - Lines, Odds & Line Moves
Pricing
from $0.11 / 1,000 line returneds
Sleeper Player Props Scraper - Lines, Odds & Line Moves
For betting-model builders: every line on Sleeper's Picks board as one row - player name, team, stat, line value and the over and under payout multipliers. 2,855 lines across 9 sports in one request on 2026-09-22. Monitoring returns only the lines that moved, with the previous value.
Pricing
from $0.11 / 1,000 line returneds
Rating
0.0
(0)
Developer
NeverEmpty
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
For betting-model builders and sports-data teams: every line on Sleeper's Picks board as one row - player id and name, team, position, sport, game id, stat, line value, the over and the under payout multiplier, line and game status, how the crowd is picking it, and the recent games Sleeper shows beside it. One request returned 2,855 lines across 9 sports with 5,710 over/under sides on 2026-09-22. You get the whole board in a single run, and in monitoring mode only the lines that actually moved, each carrying its own previous value - so you can diff a board without storing it yourself.
Export as JSON, CSV or Excel.
What one row contains
| Column | What it is |
|---|---|
lineKey | Stable id of this line: sport, game, player and market. It does not change when the price moves, so you can join runs on it. |
sport, league | Sleeper's own value (nfl, cfb, clubsoccer:mls) and a short league name (NFL, CFB, MLS). |
gameId, gameStatus | Sleeper's game id and state. Sleeper does not publish the two team names in this feed, so the game id is how you group the lines of one match. |
playerId, playerName, playerFirstName, playerLastName | The id is always there; the names come from Sleeper's player record, which this Actor reads for you. playerDetailsFound says whether the name was actually found. |
playerTeam, playerPosition, playerPositionRank, playerTeamFull, playerStatus | Team code and position as written on the line, plus the team and status from the player record. |
statType, statLabel, marketType | Sleeper's stat (receiving_yards), the same value formatted (Receiving Yards), and the raw market key. |
lineValue, overLineValue, underLineValue | The number the pick is over or under. Every side read on 2026-09-22 sat on a half point. |
overPayoutMultiplier, underPayoutMultiplier | What one unit of stake returns on each side, as a decimal. On 2026-09-22 the range was 1.15 to 3.53 and 1.78 was the most common. |
overLineId, underLineId, overStatus, underStatus, lineStatus, optionCount, outcomes | Sleeper's own ids and states for each side. |
pickPopularity, pickCountOver, pickCountUnder, pickCountTotal | How Sleeper's users are picking this line, when Sleeper publishes it (1,718 of the 2,855 lines carried it). |
recentPerformance, recentGamesCount, recentAverage | The recent games Sleeper shows next to the line (date, opponent, value) and their mean. |
updatedAt, updatedAtMs, scrapedAt | When Sleeper last touched the line, and when this run read it. |
isNewSinceLastRun, changedFields, previousLineValue, lineValueChange, previousOverPayoutMultiplier, overPayoutMultiplierChange, previousUnderPayoutMultiplier, underPayoutMultiplierChange, previousLineStatus, previousGameStatus, previousSeenAt | Filled in monitoring mode: what moved, what it was before, and by how much. |
Inputs
| Input | What it does |
|---|---|
sports | Keep only these sports, written as Sleeper writes them (nfl, cfb, mlb, clubsoccer:mls). The short league name (MLS) works too. Empty = every sport on the board. |
players | Keep only these players. Part of a name is enough; a Sleeper player id (digits only) is matched without looking any name up. |
statTypes | Keep only these stats (49 stat types were on the board). Spaces and underscores are the same: receiving yards = receiving_yards. |
teams | Keep only players on these teams, written as they appear on the line (KC, GB). Individual sports carry no team, so those lines drop out. |
gameIds | Keep only these Sleeper game ids (113 games were on the board). |
gameStatuses | Keep only games in these states. Every line read on 2026-09-22 was pre_game. |
keywords / keywordMatch / excludeKeywords | Keep or drop lines by words in the player name, team, position, stat, market type, league or sport. any or all. |
minPayoutMultiplier / maxPayoutMultiplier | Keep only lines where the over or the under pays inside this band. Lines with no multiplier drop out when you set either. |
maxLines | Stop after this many line rows (monitoring mode ignores it, so nothing is silently left behind). |
includePlayerDetails | Look up each returned player's name, team and status. On by default; Sleeper's line feed has only the id. |
includeRecentPerformance | Include the recent games Sleeper shows beside the line, with their count and mean. |
playerLookupCap | How many player records one run may read. Rows past it keep the id, team and position and say so in a free row. |
monitoringMode | Return only the lines that moved since the last run with the same filters. |
onlyLineValueMoves / minLineValueMove | Narrow what counts as a move: line value only, and by at least this much. |
resetMonitoringState | Forget everything remembered and start over on the next run. |
requestTimeoutSecs / maxRetries | How long one request to Sleeper may take, and how many attempts it gets. |
useProxy | Route through an Apify datacenter address and take a new session on each retry. Off by default; every measurement so far went through without it. |
Filtering
Everything is filtered inside this Actor, after the board has been read: sports, players (name or Sleeper id), statTypes (49 stat types were on the board), teams, gameIds (113 games), gameStatuses, keywords / excludeKeywords, and a payout-multiplier band.
Sleeper's own sport parameter is ignored by its server - asking for sport=nfl returned the same whole board with baseball first - so filtering server-side is not possible here and this Actor does not pretend otherwise.
Monitoring mode
Turn monitoringMode on and schedule the run. The Actor remembers, for your exact set of filters, the line value, both payout multipliers, the line status and the game status of every line it read. Later runs return only the lines that moved, that changed status, or that are new - each with its earlier values in the same row. The first run returns every matching line once as a baseline.
Pick popularity and pick counts are deliberately not watched. Reading the same board twice 120 seconds apart on 2026-09-22 changed the popularity of 1,060 lines and the pick counts of 143, against 18 payout moves and 1 line-value move. Watching the crowd numbers would hand you almost the whole board on every poll.
onlyLineValueMoves and minLineValueMove narrow it further. A line that moved but not far enough keeps its earlier remembered value, so two moves of 0.5 add up to 1 and the line reaches you; the free row of a run with nothing to return says how many lines moved too little. resetMonitoringState forgets everything and starts over.
Do not put the same filters in two schedules that can run at the same time: Apify's key-value store has no atomic update, so two runs finishing together can lose part of what one of them remembered, and a few lines can come back once more as new. The Actor writes its memory, reads it back and retries up to three times, and warns in the log if it still cannot confirm it.
Reliability
Sleeper's available-lines feed is 5.28 MB of JSON and its speed swings: 14.2 s and 14.6 s through an Apify datacenter proxy on 2026-09-22, but under 2 s straight from an Apify container on 2026-09-23. Timeouts, refusals and 5xx answers are retried (maxRetries, default 4, waiting 1.5 s, 3 s and 4.5 s), the per-request timeout is yours to set (requestTimeoutSecs, default 90 s), and useProxy takes a fresh Apify datacenter session on every retry if you ever need it.
A run that could never read the feed is not charged at all - not even the run start. Runs that read the board and found nothing to return charge the run start only, and say why in a free row.
Rows that are free
Nothing is guessed and nothing empty is sold. These rows are written to the dataset and never charged: an empty board (no-results), a feed that could not be read (unreadable), lines with no usable side (no-usable-option), a sport you asked for that is not on the board (unknown-sport, with the sports that are), filters that matched nothing (no-filter-match), a monitoring run with no move (no-line-move), the maxLines or player-lookup cap (not-returned-limit), and the run's own charge limit (charge-limit-reached).
Pricing
Two events: one per line row returned, and one per run start. The run start is charged only after Sleeper's feed has actually been read, so a run that fails to read it costs nothing. In monitoring mode you pay the run start plus only the lines that moved - a poll that finds no move costs one run start.
Sister Actors
Same shelf, same build: Sports Betting Odds Scraper (sportsbook spreads, totals and money lines with the opening line beside the current one), ESPN Injury Report Scraper, UFC Stats Scraper and Kalshi Markets Scraper.
Notes
Unofficial. Public data only. This Actor is not affiliated with, endorsed by or connected to Sleeper. It reads api.sleeper.app, which is served without a login; api.sleeper.app/robots.txt was fetched on 2026-09-23 and every line in it is a comment, so it sets no rule. Nothing behind a login is touched and no personal data is collected: the people in the output are professional athletes, named as Sleeper names them.
This Actor reports what Sleeper publishes. It is data, not advice, and it does not tell you what to pick. Every number in this README was measured from the feed itself on 2026-09-22 and 2026-09-23 and is a snapshot of that moment: how many lines are on the board, and which sports, change with the season and with the day.