# Underdog Fantasy Player Props API - Lines & Odds (`zen-studio/underdog-player-props`) Actor

Scrape real-time player prop lines and odds from Underdog Fantasy API across 16 leagues. Get over/under lines, American and decimal odds, payout multipliers, player stats, team matchups, and game schedules. Filter by league, player name, stat type, or team. 45 fields per prop. JSON & CSV export.

- **URL**: https://apify.com/zen-studio/underdog-player-props.md
- **Developed by:** [Zen Studio](https://apify.com/zen-studio) (community)
- **Categories:** Integrations, Developer tools, Automation
- **Features:** Limited permissions
- **Stats:** 213 total users, 30 monthly users, 100.0% runs succeeded, 3 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.15 / 1,000 lines

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Underdog Fantasy Player Props Scraper | Real-Time Lines & Odds Across 21 Leagues

[![Underdog. 68 fields per prop. Higher & lower odds. Payout multipliers and tiers.](https://api.apify.com/v2/key-value-stores/pJ7iaZsTFhR3k9tjV/records/underdog-player-props-readme-hero-v1.png)](https://console.apify.com/actors/09TtSjF9Uzs5qfvLc/input)

From **Zen Studio**, creators of [PrizePicks Player Props](https://apify.com/zen-studio/prizepicks-player-props), [Sleeper Player Props](https://apify.com/zen-studio/sleeper-player-props) and [Bet365 Player Props](https://apify.com/zen-studio/bet365-player-props). The same team behind [Player Props Line Shopping](https://apify.com/zen-studio/player-props-aggregator).

### Why choose this Underdog Fantasy player props scraper?

- **68 fields per prop, with both sides together.** Collect higher and lower American odds, decimal odds, payout multipliers, the payout tier each side sits in (`boosted`, `standard` or `discounted`) and its implied probability in the same row. Keep the player, stat and line alongside both prices, ready for comparison or export.
- **Useful detail beyond the line.** Include player positions, full team names, matchups and start times. Where published, collect venue details, probable MLB starting pitchers and their throwing hands, plus the original value of a discounted line.
- **Compare platforms and track changes.** Shared fields align with our PrizePicks actor. Join datasets by player, stat and line, or save repeated Underdog exports to track price and line changes. Filter by league, player, stat or team before billing.

<a href="https://console.apify.com/actors/09TtSjF9Uzs5qfvLc/input"><img src="https://api.apify.com/v2/key-value-stores/pJ7iaZsTFhR3k9tjV/records/underdog-player-props-readme-cta-v1.svg" width="280" height="48" alt="Explore Underdog props" /></a>

#### Try MLB hits, runs and RBIs

```json
{
  "leagues": [
    "MLB"
  ],
  "statTypes": "hits_runs_rbis"
}
```

[Open actor input](https://console.apify.com/actors/09TtSjF9Uzs5qfvLc/input) to choose your leagues and filters. This example collects **Hits + Runs + RBIs** props. Remove `statTypes` for the league's full available board, or choose `"All"` in `leagues` for all available leagues. Export JSON, CSV or Excel.

Collects **pre-game props**. The 68-field record includes optional details that can be empty when not published. `has_alternates` reports availability; this actor collects the primary line. Free Apify accounts can try **5 lifetime runs, up to 50 results each**.

<table>
<tr><td colspan="5" style="background:#FFFF00;color:#181A1B;padding:10px 12px;border:none"><strong style="color:#181A1B">Zen Studio · Player Props</strong></td></tr>
<tr><td style="background:#FFFFA3;color:#28230C;padding:10px;min-width:110px;border:1px solid #E5E5A3;vertical-align:top"><span style="white-space:nowrap"><img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/NWYsOG96fMDy8ycdf-actor-09TtSjF9Uzs5qfvLc-f9HhMKXsLt-underdog-fantasy-picks-api-logo.png" width="20" height="20" alt="Underdog" style="display:inline;vertical-align:middle">&nbsp;<a href="https://apify.com/zen-studio/underdog-player-props" style="color:#28230C;font-size:13px;font-weight:700;text-decoration:none">Underdog</a></span><br><span style="white-space:nowrap;font-size:12px;color:#5E501F">You are here</span></td><td style="background:#FFFFDB;color:#28230C;padding:10px;min-width:110px;border:1px solid #E5E5A3;vertical-align:top"><span style="white-space:nowrap"><img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/NWYsOG96fMDy8ycdf-actor-4AmgQeem8dEgMEiRF-VGffbe665M-prizepicks-scraper-logo.jpeg" width="20" height="20" alt="PrizePicks" style="display:inline;vertical-align:middle">&nbsp;<a href="https://apify.com/zen-studio/prizepicks-player-props" style="color:#28230C;font-size:13px;font-weight:700;text-decoration:none">PrizePicks</a></span><br><span style="white-space:nowrap;font-size:12px;color:#5E501F">Player projections</span></td><td style="background:#FFFFDB;color:#28230C;padding:10px;min-width:110px;border:1px solid #E5E5A3;vertical-align:top"><span style="white-space:nowrap"><img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/NWYsOG96fMDy8ycdf-actor-l6JP3yaLczAdUaiSf-yDHq17ycGp-bet365-icon_lc6m4t.png" width="20" height="20" alt="Bet365" style="display:inline;vertical-align:middle">&nbsp;<a href="https://apify.com/zen-studio/bet365-player-props" style="color:#28230C;font-size:13px;font-weight:700;text-decoration:none">Bet365</a></span><br><span style="white-space:nowrap;font-size:12px;color:#5E501F">Odds & last 5</span></td><td style="background:#FFFFDB;color:#28230C;padding:10px;min-width:110px;border:1px solid #E5E5A3;vertical-align:top"><span style="white-space:nowrap"><img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/NWYsOG96fMDy8ycdf-actor-vZGwNIMCrwkjp76uR-6jWYFxsPSD-sleeper-fantasy-api-logo.jpg" width="20" height="20" alt="Sleeper" style="display:inline;vertical-align:middle">&nbsp;<a href="https://apify.com/zen-studio/sleeper-player-props" style="color:#28230C;font-size:13px;font-weight:700;text-decoration:none">Sleeper</a></span><br><span style="white-space:nowrap;font-size:12px;color:#5E501F">Props & history</span></td><td style="background:#FFFFDB;color:#28230C;padding:10px;min-width:110px;border:1px solid #E5E5A3;vertical-align:top"><span style="white-space:nowrap"><img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/NWYsOG96fMDy8ycdf-actor-T7UhK2GorZOzjDabC-G6oqyipvZe-player-props-aggregator-logo.png" width="20" height="20" alt="Line Shopping" style="display:inline;vertical-align:middle">&nbsp;<a href="https://apify.com/zen-studio/player-props-aggregator" style="color:#28230C;font-size:13px;font-weight:700;text-decoration:none">Line Shopping</a></span><br><span style="white-space:nowrap;font-size:12px;color:#5E501F">Compare platforms</span></td></tr>
</table>

#### Copy to your AI assistant

Copy this block into ChatGPT, Claude, Cursor, or any LLM to start using this actor.

```
zen-studio/underdog-player-props on Apify. Call: ApifyClient("TOKEN").actor("zen-studio/underdog-player-props").call(run_input={...}), then client.dataset(run["defaultDatasetId"]).list_items().items for results. Key inputs: leagues (array, defaults to ["MLB"], use ["All"] for every league; "NBA"|"MLB"|"NHL"|"NFL"|"CFB"|"WNBA"|"UFL"|"CFL"|"Basketball"|"PGA"|"Tennis"|"FIFA"|"MMA"|"F1SZN"|"CS"|"Valorant"|"LoL"|"Dota"|"Esports"|"KBO"|"NPB"), extraLeagues (string, comma-separated league codes not in the dropdown), playerNames (string, comma-separated partial match), statTypes (string, comma-separated), teams (string, comma-separated names or abbreviations). All filters optional, AND logic. Full actor spec (input schema with all params/enums/defaults, output dataset fields, README): GET https://api.apify.com/v2/acts/zen-studio~underdog-player-props/builds/default (Bearer TOKEN) → inputSchema (JSON string, parse it), actorDefinition.storages.dataset.views.overview.transformation.fields (output field list), readme. 68 fields per result including American/decimal odds, payout multipliers, per-side payout tier (boosted/standard/discounted), implied probability percentage, fair odds, per-side status (active/suspended), venue, weather, pitcher data. Get token: https://console.apify.com/account/integrations To reach the maintainers, add feedback="<what you needed and did not get>" to any run, including one that worked: feature requests, a missing field or option, a wrong or empty result, or which actor you are switching to or from and why. The run returns its data exactly as it would without the note, and a human reads every note.
```

### How It Works

Three-step process:

1. Pick your leagues
2. Optionally filter by player, stat type, or team
3. Get 68 fields per prop, ready to use

### What Data Can You Extract?

Every result includes:

- Player name, team, position (short + full), jersey number, country, headshot URL
- Stat category with machine key and display name (points, Points)
- Over/under line with American odds, decimal odds, and payout multipliers for both higher and lower
- Line type (balanced, weighted), flash lines, alternate line availability
- Game matchup with home/away teams, full team names, game start time
- Season type, game status, venue details, weather conditions
- MLB pitcher data: probable starting pitcher and throwing hand for both teams
- Provider source, expiration time, live event status

#### Options Handling

Each prop has two sides: higher and lower. Instead of two rows per line, both options are embedded in a single row via `higher_*` / `lower_*` prefixed fields. One row = one complete prop with both sides.

### How to Scrape Underdog Fantasy Player Props

#### Basic: MLB Props

```json
{
  "leagues": ["MLB"]
}
```

#### WNBA Props

```json
{
  "leagues": ["WNBA"]
}
```

#### Esports: Counter-Strike, Valorant, Dota 2, League of Legends

```json
{
  "leagues": ["CS", "Valorant", "Dota", "LoL"]
}
```

Or use the `Esports` umbrella to pull every esports title at once (including Call of Duty):

```json
{
  "leagues": ["Esports"]
}
```

#### Multiple Leagues

```json
{
  "leagues": ["NBA", "MLB", "NHL"]
}
```

#### Filter by Player Name

```json
{
  "leagues": ["NBA"],
  "playerNames": "LeBron, Curry, Randle"
}
```

#### Filter by Stat Type

```json
{
  "leagues": ["NBA"],
  "statTypes": "Points, Rebounds, Assists"
}
```

#### Filter by Team

```json
{
  "leagues": ["NBA"],
  "teams": "MIN, Lakers"
}
```

#### Combine Filters (AND logic)

```json
{
  "leagues": ["NBA"],
  "statTypes": "Points",
  "teams": "Timberwolves",
  "playerNames": "Randle"
}
```

#### Everything at Once

```json
{
  "leagues": ["All"]
}
```

### Input Parameters

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `leagues` | array | `["MLB"]` | One or more leagues. Select "All" for every available league |
| `extraLeagues` | string | none | Comma-separated league codes not in the dropdown (e.g. `CFL`). Use the code shown in the `league` field of your results |
| `playerNames` | string | none | Comma-separated player names. Case-insensitive, diacritic-insensitive (Jokic matches Jokić). Partial matching |
| `statTypes` | string | none | Comma-separated stat types. Accepts display names or machine keys (Points, points). Exact match, case-insensitive |
| `teams` | string | none | Comma-separated team names or abbreviations (MIN, Timberwolves, Minnesota Timberwolves). Matches player's team or either side of matchup |

All filters are optional and combine with AND logic. Filtered-out lines are not billed.

### More Zen Studio scrapers for sports betting

- [Action Network Odds API](https://apify.com/zen-studio/action-network-odds)
- [FanDuel Odds API](https://apify.com/zen-studio/fanduel-odds)
- [DraftKings Odds API](https://apify.com/zen-studio/draftkings-odds)
- [BetMGM Odds API](https://apify.com/zen-studio/betmgm-odds)
- [Bet365 Real-Time Odds API](https://apify.com/zen-studio/bet365-real-time-odds)

Also from the same studio (name, then `account/slug` for the URL `https://apify.com/account/slug`):

- Bet365 Live Scores API (`zen-studio/bet365-live-scores`)
- Bet365 Sports Data Scraper (`zen-studio/bet365-sports-data`)
- Player Props Line Shopping (`zen-studio/player-props-aggregator`)
- PrizePicks Player Props Scraper (`zen-studio/prizepicks-player-props`)
- Sleeper Player Props (`zen-studio/sleeper-player-props`)
- DraftKings Pick6 Player Props (`zen-studio/draftkings-pick6-player-props`)
- Bet365 Player Props API (`zen-studio/bet365-player-props`)
- Tennis Abstract Scraper (`zen-studio/tennis-abstract-scraper`)
- Flashscore Tennis Scraper & API (`zen-studio/flashscore-tennis-api`)

Full directory: [Zen Studio on Apify](https://apify.com/zen-studio)

### Integrations and scheduling

Run the Underdog Fantasy player props scraper on a schedule in Apify Console, hourly on game days, daily otherwise. Each run can call a webhook when it finishes, so n8n, Make and Zapier flows pick up new rows without polling. The Apify API and the Apify MCP server take the same input, for scripts and AI agents.

### Supported Leagues

**Major US Sports:** NBA, MLB, NHL, NFL, College Football (CFB), WNBA, UFL, CFL

**Basketball (International):** EuroLeague and national-team games beyond the NBA/WNBA

**Golf:** PGA

**Individual Sports:** Tennis, MMA, Formula 1 (season long)

**International:** Soccer (FIFA), KBO (Korean Baseball), NPB (Japanese Baseball)

**Esports:** Counter-Strike, Valorant, Dota 2, League of Legends. The `Esports` option selects every esports title at once, including Call of Duty.

League availability varies daily based on scheduled events. Off-season leagues (for example NBA in summer) return no lines until their next game is posted.

A league not in the list? Put its code in `extraLeagues`: the code is the one you see in the `league` field of any result, and it works as soon as Underdog posts lines for it.

### Stat Types by League

Pass these as comma-separated values in `statTypes`. Both machine key (points) and display name (Points) work.

**NBA / WNBA:** Points, Rebounds, Assists, 3-Pointers Made, Steals, Blocks, Turnovers, Pts + Rebs + Asts, Pts + Rebs, Pts + Asts, Rebs + Asts, Blks + Stls, Fantasy Points, Double-Double

**MLB:** Hits, Runs, RBIs, Home Runs, Total Bases, Stolen Bases, Walks, Strikeouts (Pitcher), Hits + Runs + RBIs, Earned Runs Allowed, Pitching Outs, Hits Allowed, Walks Allowed

**NHL:** Points, Goals, Assists, Shots On Goal, Blocked Shots, Saves, Power Play Points

**Soccer (FIFA):** Goals, Assists, Shots, Shots On Target, Passes, Tackles, Clearances, Saves

**Tennis:** Aces, Double Faults, Games Won, Sets Won, Tie Breaks

**Tennis history:** [Tennis Abstract Scraper](https://apify.com/zen-studio/tennis-abstract-scraper) returns every past ATP and WTA singles match for a player, with aces, double faults, games, sets, tie breaks and break points, so you can compare a line with past results.

**MMA:** Significant Strikes, Takedowns

**Esports:** Kills, Deaths, Assists, Maps Won

Stat types vary daily based on scheduled games. Run once without a `statTypes` filter and inspect the `stat_display` field to see what's available.

### Pricing: Pay Per Event (PPE)

**$0.15 per 1,000 lines.**

#### Cost Examples

Line charges for a single run.

| What You Fetch | Lines | Cost |
|----------------|-------|------|
| NFL (full slate) | ~3,900 | ~$0.59 |
| MLB (typical day) | ~2,300 | ~$0.35 |
| NFL + College Football | ~5,900 | ~$0.89 |
| All 21 leagues | ~11,500 | ~$1.73 |
| Single player filter | ~10 | < $0.01 |

#### Monthly Estimates

Line charges, assuming ~2,000 lines per MLB pull and ~4,500 for three leagues.

| Usage Pattern | Runs / Month | Cost |
|---------------|--------------|------|
| MLB twice daily | 60 | ~$18 |
| 3 leagues twice daily | 60 | ~$41 |
| MLB hourly | 720 | ~$216 |

#### Cost Optimization

- Use `leagues` to fetch only the sports you need
- Use `statTypes` to narrow to specific stats
- Use `teams` to focus on specific matchups
- Use `playerNames` to narrow to specific players

Filters combine with AND logic, and filtered-out lines are not billed.

**Free tier:** 5 lifetime runs, 50 results per run.

### What data you get from Underdog Fantasy

Real result from the MLB board with all 68 fields:

```json
{
  "projection_id": "32875498-ac41-43a2-810f-efc7a0b3459b",
  "line": 0.5,
  "stat": "hits_runs_rbis",
  "stat_display": "Hits + Runs + RBIs",
  "status": "active",
  "is_live": false,
  "flash_line": null,
  "rank": 35199127005099,
  "updated_at": "2026-10-18T06:27:47.248Z",
  "player_name": "Nathaniel Lowe",
  "player_team": "CLE",
  "player_team_name": "Cleveland Guardians",
  "player_position": "1B",
  "player_position_full": "First Baseman",
  "player_country": null,
  "player_image": "https://assets.underdogfantasy.com/player-images/mlb/20260813_14-479ea4a2-43ea-4f5f-93be-b875aab7088d.png",
  "player_jersey": "46",
  "player_id": "7e90a559-c555-4c96-bfc8-ee09df77d864",
  "league": "MLB",
  "game_start": "2026-10-18T21:08:00Z",
  "game_status": "scheduled",
  "season_type": "post",
  "home_team": "CLE",
  "away_team": "TB",
  "home_team_name": "Cleveland Guardians",
  "away_team_name": "Tampa Bay Rays",
  "line_type": "balanced",
  "live_event_stat": null,
  "category": "player_prop",
  "has_alternates": true,
  "provider": "manual",
  "expires_at": null,
  "higher_american_odds": "-179",
  "higher_decimal_odds": "1.56",
  "higher_payout_multiplier": "0.81",
  "lower_american_odds": "+131",
  "lower_decimal_odds": "2.31",
  "lower_payout_multiplier": "1.15",
  "higher_payout_tier": "discounted",
  "lower_payout_tier": "boosted",
  "higher_implied_probability_pct": 62.0,
  "lower_implied_probability_pct": 43.0,
  "higher_fair_american_odds": "-186",
  "lower_fair_american_odds": "+113",
  "higher_fair_decimal_odds": "1.54",
  "lower_fair_decimal_odds": "2.13",
  "higher_option_status": "active",
  "lower_option_status": "active",
  "higher_choice_display": "Higher",
  "lower_choice_display": "Lower",
  "higher_short_label": "1+",
  "lower_short_label": "0-",
  "favored_side": "none",
  "boost": null,
  "supercharge_type": null,
  "stat_title": "Nathaniel Lowe Hits + Runs + RBIs O/U",
  "graded_by": "high_score",
  "stable_id": "3ed2d401-050d-4d27-bada-345f9d086921|balanced",
  "entry_stable_id": "3ed2d401-050d-4d27-bada-345f9d086921|0.5",
  "provider_type": "probability",
  "venue_name": "Progressive Field",
  "venue_type": "outdoor",
  "weather_condition": "Sunny",
  "weather_temperature": 61,
  "home_pitcher": "P. Messick",
  "away_pitcher": "D. Rasmussen",
  "home_pitcher_hand": "LHP",
  "away_pitcher_hand": "RHP"
}
```

### PrizePicks Compatibility

Field names are aligned with the [PrizePicks Player Props Scraper](https://apify.com/zen-studio/prizepicks-player-props) where fields overlap. Shared fields use identical names (`player_name`, `stat`, `line`, `league`, `game_start`, etc.), making it straightforward to merge datasets from both platforms for line comparison. PrizePicks tiers map onto `higher_payout_tier` and `lower_payout_tier`: a `boosted` side pays more than a straight pick (the PrizePicks demon equivalent), a `discounted` side pays less (the goblin equivalent), and `standard` is an untouched line.

### Scheduling

| Cadence | Best For |
|---------|----------|
| Once or twice daily | Daily picks newsletters, content creation |
| Every 1-4 hours | Line comparison tools, data collection |
| Every 2-5 minutes | Near real-time monitoring, Discord bots |

### Data Export

Results are available in:

- **JSON**: structured data for programmatic analysis
- **CSV**: flat tables for spreadsheets
- **Excel**: formatted data for reporting

Export directly from Apify Console or via API.

### FAQ

**How many props are typically available?**
Around 11,000-12,000 across all leagues on a busy day. NFL alone is ~3,900 on a full slate, College Football ~1,900, MLB ~2,300. Counts move with the schedule.

**How often do lines change?**
Lines update every few minutes. The `updated_at` field shows exactly when each prop was last changed.

**What's the difference between higher and lower?**
Higher means the player exceeds the line. Lower means they fall short. Each side has its own American odds, decimal odds, and payout multiplier.

**What does "balanced" vs other line types mean?**
Balanced means the odds are roughly equal on both sides. Other types indicate the book has weighted one side.

**Does this work outside the US?**
Yes. The scraper uses a US residential proxy internally. You can run it from anywhere.

**What happens if a league has no games today?**
Zero results for that league with an info message. No error, no charge.

**Can I track line movements?**
Schedule the scraper to run periodically and compare `line` and odds values across runs using `projection_id` as the key.

**What are flash lines?**
Flash lines (`flash_line` field) show the original line before a discount was applied. When non-null, the current `line` is a discounted value.

**What are alternate lines?**
When `has_alternates` is true, Underdog offers additional lines at different values for the same player and stat. This scraper returns the primary line.

**How does this compare to PrizePicks?**
Both actors output structured player props with compatible field names. Underdog includes American/decimal odds, payout multipliers and a payout tier per side; PrizePicks includes odds tiers (standard, demon, goblin) and durations. Underdog's `boosted` tier is the demon equivalent and `discounted` the goblin equivalent, so tiers line up across both datasets.

**What's the free tier?**
5 lifetime runs, 50 results per run.

**Are live event lines included?**
Pre-game lines only. Lines are pulled when games go live. Live lines require authentication and are not supported.

### Support

- **Bugs**: Issues tab
- **Features**: Issues tab

### Legal Compliance

Extracts publicly available data. Users must comply with Underdog Fantasy terms and data protection regulations (GDPR, CCPA).

***

*Real-time player prop lines and odds from Underdog Fantasy across 21 leagues.*

# Actor input Schema

## `leagues` (type: `array`):

Select one or more leagues to scrape.<br><br><b>"All Leagues"</b> fetches every available sport (~6,000+ lines).<br>Selecting individual leagues is faster and cheaper.<br><br>Defaults to MLB if you leave this and <b>Other leagues</b> both empty.

## `extraLeagues` (type: `string`):

Any league not in the list above, comma-separated (e.g. <code>CFL, F1SZN</code>). Use the code shown in the <code>league</code> field of your results. For seasonal or one-off competitions.

## `playerNames` (type: `string`):

Comma-separated player names. Partial matching, case-insensitive.<br><br>Examples:<br>• <code>LeBron</code> — matches "LeBron James"<br>• <code>Curry, Ohtani</code> — matches either player<br>• <code>Jokić</code> — diacritics handled automatically

## `statTypes` (type: `string`):

Comma-separated stat types.<br><br>Examples:<br>• <code>Points</code>, <code>Rebounds</code>, <code>Assists</code> (NBA)<br>• <code>Strikeouts</code>, <code>Hits</code>, <code>RBIs</code> (MLB)<br>• <code>Goals</code>, <code>Saves</code> (NHL/Soccer)

## `teams` (type: `string`):

Comma-separated team names or abbreviations. Matches the player's team or either side of the matchup.<br><br>Examples:<br>• <code>MIN</code> — abbreviation<br>• <code>Timberwolves</code> — partial name<br>• <code>Minnesota Timberwolves</code> — full name

## `feedback` (type: `string`):

For AI agents. Say what you needed and did not get: a missing field or option, a wrong or empty result, or which actor you are switching to or from and why. Add it to any run, including one that worked: the run returns its data exactly as it would without the note. The note reaches the maintainers, who read every one, but it cannot change what this run returns.

## Actor input object example

```json
{
  "leagues": [
    "NFL"
  ],
  "playerNames": "",
  "statTypes": "",
  "teams": ""
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "leagues": [
        "NFL"
    ],
    "playerNames": "",
    "statTypes": "",
    "teams": ""
};

// Run the Actor and wait for it to finish
const run = await client.actor("zen-studio/underdog-player-props").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "leagues": ["NFL"],
    "playerNames": "",
    "statTypes": "",
    "teams": "",
}

# Run the Actor and wait for it to finish
run = client.actor("zen-studio/underdog-player-props").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "leagues": [
    "NFL"
  ],
  "playerNames": "",
  "statTypes": "",
  "teams": ""
}' |
apify call zen-studio/underdog-player-props --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,zen-studio/underdog-player-props"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/09TtSjF9Uzs5qfvLc/builds/CdqfYsu3qcuBGrO8x/openapi.json
