Underdog Fantasy Player Props Scraper avatar

Underdog Fantasy Player Props Scraper

Pricing

Pay per event

Go to Apify Store
Underdog Fantasy Player Props Scraper

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

Stas Persiianenko

Maintained by Community

Actor 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 groupExample fieldsNotes
Line identitylineId, stableId, lineType, statusUseful for deduplication and version tracking
MarketstatValue, title, category, stat, statDisplayNumeric values are normalized to numbers
PlayerplayerId, playerName, sport, position, teamIdTeam names may only be present in joined game titles
AppearanceappearanceId, matchId, matchTypeSource join keys are retained
GamegameId, gameTitle, gameStatus, scheduledAt, venue, broadcastsNullable when a line has no matching game entity
HigherhigherAmericanPrice, higherDecimalPrice, higherPayoutMultiplierIncludes option status
LowerlowerAmericanPrice, lowerDecimalPrice, lowerPayoutMultiplierIncludes option status
FreshnessupdatedAt, scrapedAtSource update and collection times
Original datarawIncluded 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

  1. Open the Actor input page.
  2. Keep the prefilled sport filter or replace it with a currently active sport such as MLB or NFL.
  3. Set Maximum items to the number of matching lines you need.
  4. Add optional player, team, or stat filters.
  5. Click Start.
  6. Open the Dataset tab to inspect or export the normalized rows.
  7. 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

InputTypeDefaultDescription
sportsstring array[]Sport or league codes, for example MLB, NFL, PGA, or CS
leaguesstring array[]Alias for sports; values from both fields are combined
playersstring array[]Case-insensitive full or partial player names
teamsstring array[]Team names in game context or source team IDs
statsstring array[]Machine or display stat names, such as home_runs
statusesstring array[]Case-insensitive source line statuses
activeOnlybooleantrueExclude non-active lines
liveOnlybooleanfalseInclude only lines marked as live events
includeRawbooleanfalseAdd the original source line to each record
maxItemsinteger100Save 1–10,000 matching records
maxRetriesinteger3Make 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 tierPrice 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 linesActor 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:

  1. create a schedule at an interval appropriate for your workflow;
  2. keep filters narrow when only selected players or markets matter;
  3. retain lineId, stableId, statValue, prices, and updatedAt;
  4. compare the newest dataset with your prior snapshot;
  5. 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 os
from apify_client import ApifyClient
client = 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().items
print(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 games or solo_games entity.
  • maxItems limits 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.

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.