# Underdog Fantasy Player Props Scraper (`automation-lab/underdog-fantasy-player-props-scraper`) Actor

Export current Underdog Fantasy Pick em lines with prices, payout multipliers, player details, filters, and joined game context.

- **URL**: https://apify.com/automation-lab/underdog-fantasy-player-props-scraper.md
- **Developed by:** [Stas Persiianenko](https://apify.com/automation-lab) (community)
- **Categories:** Sports
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js/docs.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## Underdog Fantasy Player Props Scraper

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

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:

```json
{
  "maxItems": 100,
  "activeOnly": true,
  "includeRaw": false
}
````

A focused workflow:

```json
{
  "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:

```json
{
  "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:

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:

```bash
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

```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

```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:

```bash
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:

```json
{
  "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.

### 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.

# Actor input Schema

## `sports` (type: `array`):

Only include sports or league codes containing one of these values, for example NBA, NFL, MLB, NHL, PGA, or CS2.

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

Alias for Sports. Values from both fields are combined.

## `players` (type: `array`):

Case-insensitive player-name filters. Partial names are supported.

## `teams` (type: `array`):

Case-insensitive team-name or team-ID filters matched against player and game context.

## `stats` (type: `array`):

Case-insensitive stat filters, such as points, rebounds, or passing\_yards.

## `statuses` (type: `array`):

Only include line statuses containing one of these values.

## `activeOnly` (type: `boolean`):

Exclude suspended or inactive lines. Disable to include every status returned by the feed.

## `liveOnly` (type: `boolean`):

Only include lines marked as live events.

## `includeRaw` (type: `boolean`):

Include the original source line object in each normalized record for advanced analysis.

## `maxItems` (type: `integer`):

Maximum number of matching player-prop records to save.

## `maxRetries` (type: `integer`):

Maximum bounded attempts for transient network, rate-limit, or server failures.

## Actor input object example

```json
{
  "sports": [
    "NFL"
  ],
  "leagues": [],
  "players": [],
  "teams": [],
  "stats": [],
  "statuses": [],
  "activeOnly": true,
  "liveOnly": false,
  "includeRaw": false,
  "maxItems": 10,
  "maxRetries": 3
}
```

# Actor output Schema

## `dataset` (type: `string`):

Default dataset containing all accepted player-prop records.

# 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 = {
    "sports": [
        "NFL"
    ],
    "maxItems": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("automation-lab/underdog-fantasy-player-props-scraper").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 = {
    "sports": ["NFL"],
    "maxItems": 10,
}

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

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

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

```

## CLI example

```bash
echo '{
  "sports": [
    "NFL"
  ],
  "maxItems": 10
}' |
apify call automation-lab/underdog-fantasy-player-props-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=automation-lab/underdog-fantasy-player-props-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Underdog Fantasy Player Props Scraper",
        "description": "Export current Underdog Fantasy Pick em lines with prices, payout multipliers, player details, filters, and joined game context.",
        "version": "0.1",
        "x-build-id": "au89Hwu8q2MRTRSXs"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/automation-lab~underdog-fantasy-player-props-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-automation-lab-underdog-fantasy-player-props-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/automation-lab~underdog-fantasy-player-props-scraper/runs": {
            "post": {
                "operationId": "runs-sync-automation-lab-underdog-fantasy-player-props-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/automation-lab~underdog-fantasy-player-props-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-automation-lab-underdog-fantasy-player-props-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "sports": {
                        "title": "Sports",
                        "type": "array",
                        "description": "Only include sports or league codes containing one of these values, for example NBA, NFL, MLB, NHL, PGA, or CS2.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "leagues": {
                        "title": "Leagues",
                        "type": "array",
                        "description": "Alias for Sports. Values from both fields are combined.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "players": {
                        "title": "Players",
                        "type": "array",
                        "description": "Case-insensitive player-name filters. Partial names are supported.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "teams": {
                        "title": "Teams",
                        "type": "array",
                        "description": "Case-insensitive team-name or team-ID filters matched against player and game context.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "stats": {
                        "title": "Stat types",
                        "type": "array",
                        "description": "Case-insensitive stat filters, such as points, rebounds, or passing_yards.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "statuses": {
                        "title": "Line statuses",
                        "type": "array",
                        "description": "Only include line statuses containing one of these values.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "activeOnly": {
                        "title": "Active lines only",
                        "type": "boolean",
                        "description": "Exclude suspended or inactive lines. Disable to include every status returned by the feed.",
                        "default": true
                    },
                    "liveOnly": {
                        "title": "Live lines only",
                        "type": "boolean",
                        "description": "Only include lines marked as live events.",
                        "default": false
                    },
                    "includeRaw": {
                        "title": "Include raw line",
                        "type": "boolean",
                        "description": "Include the original source line object in each normalized record for advanced analysis.",
                        "default": false
                    },
                    "maxItems": {
                        "title": "Maximum items",
                        "minimum": 1,
                        "maximum": 10000,
                        "type": "integer",
                        "description": "Maximum number of matching player-prop records to save.",
                        "default": 100
                    },
                    "maxRetries": {
                        "title": "Maximum request attempts",
                        "minimum": 1,
                        "maximum": 5,
                        "type": "integer",
                        "description": "Maximum bounded attempts for transient network, rate-limit, or server failures.",
                        "default": 3
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
