
Website Content Crawler
scrape.ly/store/querystone/website-content-crawlerAIDeveloper tools
1 monthly user

Every Underdog Fantasy pick'em player prop in one run: player, stat, line, higher and lower odds, payout multipliers, game, teams and start time. No login needed.
Get every Underdog Fantasy pick'em line as clean rows: player, stat, line, higher and lower odds (American, decimal and fair), payout multipliers and tiers, game, both teams and start time. Pick the leagues you want, or the whole board, and get results in seconds. No login, no account and no API key.
standard, boosted, discounted), implied probability and fair odds side by side.updated_at, stable_id and projection_id show what moved.Not sure which leagues have lines right now? Turn on List available leagues: you get one row per league with its live line count, free of result charges.
| Field | What it does |
|---|---|
leagues | Leagues to read, e.g. ["NBA", "NFL"]. All reads the whole board, Esports every esports title, EPL/UCL/La Liga/... one soccer competition. |
maxItems | Most lines to save (default 20). 0 saves everything that matches. |
extraLeagues | Any other league by its Underdog code or name (e.g. PFL, RUGBY, Overwatch). |
playerNames | Only these players. Partial, case- and accent-insensitive (Jokic matches Nikola Jokić). |
statTypes | Only these stats, display name or key (Points, Pts + Rebs + Asts, rush_rec_tds). |
teams | Team abbreviation, name or full name; matches the player's team or either side of the game. |
payoutTiers | standard, boosted and/or discounted (matches either side). |
hoursAhead | Only games starting within this many hours. |
listLeagues | List the leagues and their live line counts instead of lines. |
{
"leagues": ["NBA", "NFL"],
"maxItems": 0,
"statTypes": ["Points", "Pass Yards"],
"payoutTiers": ["boosted"]
}
One row per line: a player, a stat and a line with both the higher and the lower side.
| Field | Example |
|---|---|
player_name, player_team, player_position, player_jersey, player_image | Scottie Barnes, TOR, PF |
league, competition | NBA; for soccer and tennis the competition, e.g. EPL, ATP Lyon |
stat, stat_display, line | points, Points, 19.5 |
higher_american_odds, higher_decimal_odds, higher_payout_multiplier, higher_payout_tier | +113, 2.13, 1.09, boosted |
lower_american_odds, lower_decimal_odds, lower_payout_multiplier, lower_payout_tier | -139, 1.72, 0.87, discounted |
*_implied_probability_pct, *_fair_american_odds, *_fair_decimal_odds | fair price of each side |
game_title, game_start, home_team, away_team (+ names) | the matchup and start time (UTC) |
venue_name, broadcasts, home_pitcher, away_pitcher | where posted |
has_alternates, flash_line, favored_side, boost | extra line details |
projection_id, stable_id, player_id, game_id | ids for joining runs |
updated_at, scraped_at | when the line changed and when it was read |
Example (one row from a test run, trimmed):
{
"projection_id": "0ef36fb9-363f-47d5-ba4b-4438286da3bb",
"line": 19.5,
"stat": "points",
"stat_display": "Points",
"status": "active",
"player_name": "Scottie Barnes",
"player_team": "TOR",
"player_team_name": "Toronto Raptors",
"player_position": "PF",
"league": "NBA",
"game_title": "Chicago Bulls @ Toronto Raptors",
"game_start": "2026-10-21T23:30:00Z",
"home_team": "TOR",
"away_team": "CHI",
"has_alternates": true,
"higher_american_odds": "+113",
"higher_decimal_odds": "2.13",
"higher_payout_multiplier": "1.09",
"higher_payout_tier": "boosted",
"higher_implied_probability_pct": 46,
"higher_fair_american_odds": "+102",
"lower_american_odds": "-139",
"lower_decimal_odds": "1.72",
"lower_payout_multiplier": "0.87",
"lower_payout_tier": "discounted",
"lower_implied_probability_pct": 57,
"lower_fair_american_odds": "-157",
"stat_title": "Scottie Barnes Points O/U",
"stable_id": "fc7ec4a1-fd5b-4afa-9046-ee7945b54dfc|balanced",
"updated_at": "2026-10-21T06:31:15.771Z",
"scraped_at": "2026-10-21T08:09:46.106Z"
}
With List available leagues on, each row is a league: league, league_name, available_lines, games, players, competitions and is_esports.
Pay per event: $0.12 per 1,000 lines plus $0.005 per run start.
Platform usage (compute and proxy traffic) is billed on top and is small: under one cent per run in our tests (about $0.001 for one league, $0.003 for the whole board).
Is it legal? It reads the public pick'em board any visitor sees, with no login. Use the data in line with Underdog's terms and the laws where you live.
Do I need an Underdog account or a proxy? No account. Underdog only serves visitors in the US and Canada, so the run uses US exits by default; you don't need to set anything.
How many lines can I get? Everything on the board. It changes all day: in our tests an October weekday morning had about 8,700 lines in 16 leagues, and leagues out of season have none. Use List available leagues to see the counts right now.
Why is a field empty? Some fields only exist for some lines: about half of the lines are higher-only, so the lower_* fields are empty; team fields stay empty for one-on-one sports such as tennis and UFC (the two players are in home_team_name and away_team_name); venue, weather and probable pitchers only appear when Underdog posts them.
Can I schedule it or use the API? Yes. Schedule runs (hourly on game days works well) and read the dataset over the API, or connect it to webhooks and automation tools.
Do filtered-out lines cost money? No. Only saved lines are charged.
scraped_at.has_alternates) are flagged but not expanded, and live in-game lines and account data such as your own entries are not covered.Every field below can be set in the run form, passed through the API, or saved as a task. Unset fields fall back to the defaults shown.
leaguesarrayOptionalLeagues
Leagues to read. All leagues reads the whole board in one request; Esports reads every esports title. Leagues out of season have no lines and return no rows.
maxItemsintegerOptionaldefault 20Max lines
Most lines to save across all leagues. Leagues are mixed so a small limit still shows each one. 0 saves every matching line on the board.
extraLeaguesarrayOptionalOther leagues
Any other league by its Underdog code or name (for example PFL, RUGBY, Overwatch), added to the leagues above. Turn on List available leagues to see every code.
Optional, combined with AND. Filtered-out lines are not saved and not charged.
playerNamesarrayOptionalPlayers
Only lines for these players. Partial, case- and accent-insensitive: Jokic matches Nikola Jokić.
statTypesarrayOptionalStat types
Only these stats, matched on the display name or the stat key, case-insensitive. For example Points, Pts + Rebs + Asts, rush_rec_tds, Shots On Goal.
teamsarrayOptionalTeams
Only lines whose player's team or either side of the game matches: abbreviation (LAL), name (Lakers) or full name (Los Angeles Lakers).
payoutTiersarrayOptionalPayout tiers
Only lines where the higher or lower side pays in these tiers. Boosted pays more than 1x, discounted less. Empty keeps all.
hoursAheadintegerOptionalStarts within (hours)
Only lines for games starting within this many hours. 0 keeps every game on the board.
See which leagues have lines right now and how many.
listLeaguesbooleanOptionaldefault falseList available leagues
Save one row per Underdog league with its live line count instead of lines, then stop. League rows are free.
proxyConfigurationobjectOptionaldefault {"useScrapelyProxy":true,"scrapelyProxyGroups":["DATACENTER…Proxy configuration
Underdog serves US and Canadian visitors only, so the run uses US datacenter exits by default and switches to US residential exits on its own after a refusal.
Every run writes its results to a dataset. Preview it in the dashboard, then export it or read it through the API.
| Field | Type | Description |
|---|---|---|
| projection_id | string | null | Underdog line id (stable while the line is posted) |
| line | number | null | Over/under line |
| stat | string | null | Stat key, e.g. points |
| stat_display | string | null | Stat as shown on the board, e.g. Points |
| status | string | null | Line status |
| is_live | boolean | null | Line is for a game in progress |
| flash_line | number | null | Original line before a discount, when the line is discounted |
| rank | number | null | Board sort rank |
| updated_at | string | null | When Underdog last changed the line |
| player_name | string | null | Player name |
| player_team | string | null | Player's team abbreviation |
| player_team_name | string | null | Player's team full name |
| player_position | string | null | Position short name |
| player_position_full | string | null | Position full name |
| player_country | string | null | Player country, when published |
| player_image | string | null | Player headshot URL |
| player_jersey | string | null | Jersey number |
| player_id | string | null | Underdog player id |
| league | string | null | Underdog league code, e.g. NBA |
| league_name | string | null | League name as Underdog shows it |
| competition | string | null | Competition inside the league (soccer league, tennis tournament) |
| game_id | string | null | Underdog game id |
| game_title | string | null | Matchup title |
| game_start | string | null | Scheduled start (UTC) |
| game_status | string | null | Game status |
| season_type | string | null | regular, post, ... |
| home_team | string | null | Home team abbreviation |
| away_team | string | null | Away team abbreviation |
| home_team_name | string | null | Home team (or home player in one-on-one sports) |
| away_team_name | string | null | Away team (or away player in one-on-one sports) |
| line_type | string | null | balanced or weighted |
| live_event_stat | string | null | Live stat, for live lines |
| category | string | null | Prop category |
| has_alternates | boolean | null | Underdog offers alternate lines for this prop |
| provider | string | null | Line provider |
| expires_at | string | null | Line expiry, when set |
| higher_american_odds | string | null | Higher side American odds |
| higher_decimal_odds | string | null | Higher side decimal odds |
| higher_payout_multiplier | string | null | Higher side payout multiplier |
| higher_payout_tier | string | null | standard, boosted or discounted |
| higher_implied_probability_pct | number | null | Higher side implied probability (%) |
| higher_fair_american_odds | string | null | Higher side fair American odds |
| higher_fair_decimal_odds | string | null | Higher side fair decimal odds |
| higher_option_status | string | null | Higher side status |
| higher_choice_display | string | null | Higher side label |
| higher_short_label | string | null | Higher side short label, e.g. 25+ |
| lower_american_odds | string | null | Lower side American odds |
| lower_decimal_odds | string | null | Lower side decimal odds |
| lower_payout_multiplier | string | null | Lower side payout multiplier |
| lower_payout_tier | string | null | standard, boosted or discounted |
| lower_implied_probability_pct | number | null | Lower side implied probability (%) |
| lower_fair_american_odds | string | null | Lower side fair American odds |
| lower_fair_decimal_odds | string | null | Lower side fair decimal odds |
| lower_option_status | string | null | Lower side status |
| lower_choice_display | string | null | Lower side label |
| lower_short_label | string | null | Lower side short label, e.g. 25+ |
| favored_side | string | null | Side Underdog favors (none, higher, lower) |
| boost | any | Boost details, when boosted |
| supercharge_type | string | null | Supercharge type, when set |
| stat_title | string | null | Prop title |
| graded_by | string | null | How the prop is graded |
| stable_id | string | null | Stable prop id |
| entry_stable_id | string | null | Stable prop id with the line |
| provider_type | string | null | Provider type |
| venue_name | string | null | Venue |
| venue_type | string | null | Venue type (outdoor, dome, ...) |
| weather_condition | string | null | Weather condition, when published |
| weather_temperature | number | null | Temperature, when published |
| home_pitcher | string | null | Home probable starting pitcher (MLB) |
| away_pitcher | string | null | Away probable starting pitcher (MLB) |
| home_pitcher_hand | string | null | Home pitcher hand |
| away_pitcher_hand | string | null | Away pitcher hand |
| broadcasts | string | null | TV broadcasts |
| scraped_at | string | null | When the line was read (UTC) |
| available_lines | number | null | League listing: lines posted right now |
| games | number | null | League listing: games with lines |
| players | number | null | League listing: players with lines |
| competitions | string | null | League listing: competitions with lines |
| is_esports | boolean | null | League listing: esports title |
| game_type | string | null | League listing: Game or SoloGame |
You pay for the events the actor reports, such as each result or page it produces. Platform usage is included in the event prices.
| Event | Charged when | Price |
|---|---|---|
| Prop line | Each player prop line saved to the dataset. Lines removed by your filters are free. | $0.00012 |
| Actor start | Charged once per run. | $0.005 |
Run this actor from your own code. Swap in your API token and the examples work as-is.
import { ScrapelyClient } from 'scrapely-client'
const client = new ScrapelyClient({ token: process.env.SCRAPELY_TOKEN })
// Start the actor and wait for the run to finish.
const run = await client.actor('querystone/underdog-fantasy-scraper').call({
"leagues": [
"NBA"
],
"maxItems": 20,
"proxyConfiguration": {
"useScrapelyProxy": true,
"scrapelyProxyGroups": [
"DATACENTER"
],
"scrapelyProxyCountry": "US"
}
})
// Read the dataset the run produced.
const { items } = await client.dataset(run.defaultDatasetId).listItems()
console.log(items)Tokens live in your account settings. Keep them server-side: a token carries the full permissions of your account.
Connect the Scrape.ly MCP server once and your agent can run this actor as a tool. Pick your tool:
Fetch scrape.ly/agents.md and run querystone/underdog-fantasy-scraperPaste into Claude Code, Codex, Cursor or any AI agent. It signs you in once in the browser.
{
"mcpServers": {
"scrapely": {
"url": "https://api.scrape.ly/mcp?tools=actors,runs,storage,docs&actors=querystone/underdog-fantasy-scraper"
}
}
}No key in the file: your client opens the browser to sign you in the first time it connects.
Inputs the developer prepared for common jobs. Open one to see its input, then copy it to your account to run it as-is or adjust it.
Player prop lines with odds and payouts from the five biggest leagues on Underdog, mixed in one run.
A sample of every pick'em line on the board right now, across all sports.
Only lines on the Points stat, from the whole board.
Soccer leagues and tennis tournaments, with the competition name on each line.
Lines from every esports title Underdog lists right now.
One free row per league: how many lines, games and players are live right now.
Scrape.ly gives you the infrastructure, the tooling, and the team to extract, process, and operationalize web data at any scale. Setup takes minutes. The advantage lasts forever.