Underdog Fantasy Player Props Scraper
Pricing
Pay per event
Underdog Fantasy Player Props Scraper
Export current Underdog Fantasy Pick em lines with prices, payout multipliers, player details, filters, and joined game context.
Pricing
Pay per event
Rating
0.0
(0)
Developer
Stas Persiianenko
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
Export current Underdog Fantasy Pick'em lines as normalized, integration-ready records. Each row combines the line and Higher/Lower prices with player, appearance, and available game context.
Use it for scheduled odds snapshots, DFS research, line-change alerts, comparison products, sports analysis, and content workflows. No Underdog login is required.
What this Actor does
The Actor requests Underdog Fantasy's public Pick'em feed and turns nested source objects into one row per player-prop line. It joins player and game data where the feed supplies matching IDs, applies your filters, and saves accepted rows to the default Apify dataset.
The result is easier to query than the source response:
- one normalized record per line;
- player name, sport, position, and team ID;
- stat name, displayed label, threshold, status, and live flag;
- Higher and Lower American prices, decimal prices, and payout multipliers;
- game title, schedule, status, venue, and broadcasts when available;
- source IDs and timestamps for deduplication and change tracking;
- optional original line objects for advanced consumers.
Who is it for
DFS modelers
Take frequent snapshots and compare available thresholds or payout multipliers with your projections.
Odds and line comparison products
Feed normalized Underdog records into a broader market table without maintaining the source joins yourself.
Alerting and automation teams
Schedule the Actor, compare each dataset with a previous snapshot, and notify users when a target player or stat changes.
Sports analysts and content teams
Filter a current slate by sport, player, team, or stat and export it to JSON, CSV, Excel, or a BI tool.
Why use this Actor
- Purpose-built output: rows are normalized instead of returning one large nested feed.
- Transparent filters: combine sport, player, team, stat, status, active, and live filters.
- Joined context: player and available game entities are linked by their source IDs.
- Stable integration surface: use the default dataset through the Apify API and SDKs.
- Fail-closed behavior: blocking responses and schema changes fail the run instead of pretending there were no results.
- Bounded retries: transient network, rate-limit, and server failures use limited backoff.
Extracted data
| Field group | Example fields | Notes |
|---|---|---|
| Line identity | lineId, stableId, lineType, status | Useful for deduplication and version tracking |
| Market | statValue, title, category, stat, statDisplay | Numeric values are normalized to numbers |
| Player | playerId, playerName, sport, position, teamId | Team names may only be present in joined game titles |
| Appearance | appearanceId, matchId, matchType | Source join keys are retained |
| Game | gameId, gameTitle, gameStatus, scheduledAt, venue, broadcasts | Nullable when a line has no matching game entity |
| Higher | higherAmericanPrice, higherDecimalPrice, higherPayoutMultiplier | Includes option status |
| Lower | lowerAmericanPrice, lowerDecimalPrice, lowerPayoutMultiplier | Includes option status |
| Freshness | updatedAt, scrapedAt | Source update and collection times |
| Original data | raw | Included only when includeRaw is enabled |
All source fields can be absent or change independently. Treat nullable game and price fields as normal and use IDs rather than display text as durable keys.
Getting started
- Open the Actor input page.
- Keep the prefilled sport filter or replace it with a currently active sport such as
MLBorNFL. - Set Maximum items to the number of matching lines you need.
- Add optional player, team, or stat filters.
- Click Start.
- Open the Dataset tab to inspect or export the normalized rows.
- For recurring monitoring, create an Apify Schedule and compare datasets between runs.
A small unfiltered snapshot:
{"maxItems": 100,"activeOnly": true,"includeRaw": false}
A focused workflow:
{"sports": ["MLB"],"players": ["Shohei"],"stats": ["home_runs"],"activeOnly": true,"liveOnly": false,"includeRaw": true,"maxItems": 25}
Input reference
| Input | Type | Default | Description |
|---|---|---|---|
sports | string array | [] | Sport or league codes, for example MLB, NFL, PGA, or CS |
leagues | string array | [] | Alias for sports; values from both fields are combined |
players | string array | [] | Case-insensitive full or partial player names |
teams | string array | [] | Team names in game context or source team IDs |
stats | string array | [] | Machine or display stat names, such as home_runs |
statuses | string array | [] | Case-insensitive source line statuses |
activeOnly | boolean | true | Exclude non-active lines |
liveOnly | boolean | false | Include only lines marked as live events |
includeRaw | boolean | false | Add the original source line to each record |
maxItems | integer | 100 | Save 1–10,000 matching records |
maxRetries | integer | 3 | Make 1–5 attempts for transient feed failures |
Filters are combined with AND across fields and OR within each array. For example, two player names match either player, while a sport and stat filter must both match.
An empty filter array does not restrict results. activeOnly is applied independently from statuses; disable it if you intentionally request non-active statuses.
Output example
This shortened record reflects the current output contract:
{"sourceUrl": "https://api.underdogfantasy.com/beta/v6/over_under_lines","lineId": "7d456538-b226-4ec2-adc7-4f4ac2a22d23","stableId": "ff4d0922-a6e0-405b-99ed-be7177920c29|balanced","lineType": "balanced","status": "active","isLive": false,"statValue": 9.5,"title": "Example Player Regular Season Games Started O/U","stat": "regular_season_games_started","statDisplay": "Regular Season Games Started","playerName": "Example Player","sport": "NFL","position": "QB","higherAmericanPrice": "-122","higherDecimalPrice": 1.82,"higherPayoutMultiplier": 0.94,"lowerAmericanPrice": "+100","lowerDecimalPrice": 2,"lowerPayoutMultiplier": 1.03,"updatedAt": "2026-06-22T11:24:44Z","scrapedAt": "2026-07-25T08:19:40.721Z"}
The default dataset can be exported as JSON, CSV, Excel, XML, or RSS. Use the dataset API for automated retrieval and pagination.
How much does it cost to scrape Underdog Fantasy player props?
The Actor uses pay per event:
- Actor start: $0.021 per run.
- Player prop line: a tier-dependent amount for each saved line.
| Apify tier | Price per saved line |
|---|---|
| Free | $0.000041071 |
| Bronze | $0.000035714 |
| Silver | $0.000027857 |
| Gold | $0.000021429 |
| Platinum | $0.000014286 |
| Diamond | $0.00001 |
Only accepted rows saved to the dataset are charged as player-prop lines. Filtered-out and failed records are not line events.
Example Free-tier Actor charges:
| Saved lines | Actor charge |
|---|---|
| 100 | $0.0251 |
| 1,000 | $0.0621 |
| 5,000 | $0.2264 |
Platform compute and residential proxy usage are handled by the Actor run and can vary with source response size. Check the run's Usage tab for the final total.
Scheduling and change monitoring
Underdog lines can change throughout a slate. For repeated monitoring:
- create a schedule at an interval appropriate for your workflow;
- keep filters narrow when only selected players or markets matter;
- retain
lineId,stableId,statValue, prices, andupdatedAt; - compare the newest dataset with your prior snapshot;
- send changes to a webhook, database, Slack, email, or queue.
The Actor returns a snapshot, not a persistent streaming connection. A schedule is the normal way to collect a time series.
Integration patterns
Warehouse ingestion
Run on a schedule, fetch the default dataset, and upsert by lineId. Store scrapedAt to preserve snapshot history.
Player alerts
Use players and stats to keep datasets small, then trigger an Apify webhook when a run succeeds. Compare values in your automation platform.
Cross-source comparison
Map playerName, sport, stat, and scheduledAt to your canonical entities. Do not rely only on display names when multiple players share a name.
Content preparation
Export the current filtered slate to CSV or Google Sheets, then review it before publishing. Source odds and availability can change after export.
API usage with cURL
Start a run and wait for completion:
curl -X POST \"https://api.apify.com/v2/acts/automation-lab~underdog-fantasy-player-props-scraper/run-sync-get-dataset-items?token=$APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"sports":["MLB"],"maxItems":100,"activeOnly":true}'
Keep your Apify token in an environment variable or secret manager. Never commit it to source control.
API usage with JavaScript
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('automation-lab/underdog-fantasy-player-props-scraper').call({sports: ['MLB'],players: ['Shohei'],maxItems: 100,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
Install the client with npm install apify-client.
API usage with Python
import osfrom apify_client import ApifyClientclient = ApifyClient(os.environ["APIFY_TOKEN"])run = client.actor("automation-lab/underdog-fantasy-player-props-scraper").call(run_input={"sports": ["MLB"], "maxItems": 100, "activeOnly": True})items = client.dataset(run["defaultDatasetId"]).list_items().itemsprint(items)
Install the client with pip install apify-client.
Use through MCP
Claude Code
Add the Actor to Claude Code through Apify MCP:
claude mcp add --transport http apify \"https://mcp.apify.com?tools=automation-lab/underdog-fantasy-player-props-scraper"
Claude Desktop, Cursor, and VS Code
Claude Desktop, Cursor, and VS Code can use equivalent MCP JSON configuration:
{"mcpServers": {"apify": {"url": "https://mcp.apify.com?tools=automation-lab/underdog-fantasy-player-props-scraper"}}}
Example prompts:
- "Get up to 50 active MLB Underdog lines and show the largest payout multipliers."
- "Collect current props for this player and return stat, threshold, and both prices."
- "Create a compact table of live NFL lines currently available."
Limits and freshness
- The Actor depends on an undocumented public Underdog endpoint. Its shape or protection can change.
- Direct requests are blocked by Cloudflare, so the Actor uses an Apify US residential proxy.
- Results reflect the feed at run time; they are not guaranteed to remain available.
- The source may have no live lines, no matching filters, or nullable game context.
- Team filtering matches source team IDs and names available in joined game titles; the feed does not provide a separate team directory.
- Some season-long or series props reference an appearance without a matching
gamesorsolo_gamesentity. maxItemslimits accepted rows, but the current feed must still be downloaded once before filters are applied.- The Actor does not place entries, access user accounts, or calculate recommendations.
Failure behavior and retries
The Actor validates input before making a request. Invalid array or numeric values fail with a non-zero exit.
Network timeouts, HTTP 429, and temporary 5xx responses use bounded exponential backoff. Stable access blocks, non-JSON responses, and changed response shapes fail clearly rather than returning an empty success.
A successful run with zero rows means the feed was valid but no line matched every filter. Broaden filters or disable liveOnly and try again.
Legality and responsible use
This Actor collects anonymously available sports-market data. Access can still be subject to Underdog Fantasy's terms, local law, contractual restrictions, and applicable gaming rules.
Use the data for lawful analysis and automation. Do not use it to evade access controls, impersonate users, manipulate markets, or automate prohibited gaming activity. Avoid publishing personal profiles or making high-stakes decisions from a single snapshot. You are responsible for your use and retention of the output.
Underdog Fantasy is a third-party service and is not affiliated with this Actor or Automation Lab.
Troubleshooting
The dataset is empty
Confirm that the requested sport is currently in season and has lines. Remove player, team, and stat filters one at a time. Set liveOnly to false; there may be no live events at that moment.
The run reports a source block or proxy error
Retry once after a short delay. The Actor already uses bounded residential-proxy retries. If repeated runs fail, inspect the run log and source status rather than increasing concurrency.
Some game fields are null
This is expected for series, season-long, and some solo-event lines when the appearance has no matching game object. Player and line fields remain usable.
A player has several rows
Each row is a separate source line. A player can have multiple stats, alternate thresholds, promotions, or line types. Use lineId, stableId, and stat to distinguish them.
How do I get every current line?
Leave all filter arrays empty, keep activeOnly enabled or disable it as needed, and set maxItems high enough. The source's available volume changes over time.
FAQ
Is this an official Underdog Fantasy API?
No. The Actor uses an anonymous endpoint exposed by the Underdog application. The endpoint is undocumented and may change.
Does it include both Higher and Lower prices?
Yes, when both options exist in the source line. Missing options remain null.
Does it provide historical lines?
No. Each run is a current snapshot. Build history by scheduling runs and retaining datasets externally.
Can I filter by league instead of sport?
Yes. leagues is an alias for sports, and both arrays are combined.
Does the Actor require my Underdog account?
No. It does not accept or use Underdog credentials.
Can it place picks?
No. It only extracts public line data and does not perform gaming transactions.
Related Actors
This Actor currently has a standalone role in the Automation Lab portfolio: normalized Underdog Pick'em line snapshots. Combine its dataset with your own projections, database, alert service, or other lawful sports-data sources through Apify integrations.
Support
If a valid input repeatedly fails or the output no longer matches this documented schema, open an issue from the Actor's Apify page. Include the run ID, sanitized input, expected behavior, and affected fields. Do not include API tokens or private account information.