# PrizePicks Scraper (`parsebird/prizepicks-scraper`) Actor

Scrape PrizePicks player props, projections, and lines for every active league via the live board API. Filter by league, stat type, and odds type.

- **URL**: https://apify.com/parsebird/prizepicks-scraper.md
- **Developed by:** [ParseBird](https://apify.com/parsebird) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.19 / 1,000 records

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

### PrizePicks Scraper

PrizePicks Scraper extracts live **player prop projections, lines, and odds** from [PrizePicks](https://prizepicks.com)'s daily fantasy sports board — every active league, every stat type, updated as the board moves.

<table><tr>
<td style="border-left:4px solid #1C1917;padding:12px 16px;font-weight:600">
Pull the full PrizePicks board or a single league, filter by stat type, odds type (standard, goblin, demon), game status, or promo/live-only lines — get clean, structured projection data ready for analysis, line tracking, or model building.
</td>
</tr></table>

<br>

##### Copy to your AI assistant

```
Use the Apify Actor "parsebird/prizepicks-scraper" via the ApifyClient to scrape PrizePicks player-prop projections. Example: const client = new ApifyClient({ token: "YOUR_API_TOKEN" }); const run = await client.actor("parsebird/prizepicks-scraper").call({ mode: "projections", maxResults: 1000 }); const { items } = await client.dataset(run.defaultDatasetId).listItems(); Key inputs: mode (string, default "projections" — "projections" for the full board, "league" for one league, "leagues" to list every league id/name), league (string, dropdown league id, used with mode "league"), leagueName (string, league name or id, overrides league), statTypes (array of strings, substring filter e.g. ["Points","Assists"]), oddsType (string, "standard"/"goblin"/"demon"), status (string, "pre_game"/"in_progress"/"final"), promoOnly (boolean), includeLiveOnly (boolean), maxResults (integer, default 10 — raise it to pull more rows), perPage (integer, default 1000), proxyConfiguration (object, RESIDENTIAL US proxy enabled by default — required, PrizePicks blocks non-US traffic). Output fields per projection: projectionId, playerName, playerTeam, playerPosition, league, leagueId, statType, statDisplayName, lineScore, oddsType, status, isPromo, isLive, startTime, opponent, gameId, projectionUrl, scrapedAt. Full API reference: https://apify.com/parsebird/prizepicks-scraper/api. Get an API token at https://console.apify.com/settings/integrations.
```

#### What does PrizePicks Scraper do?

PrizePicks Scraper calls PrizePicks' own live board API to pull player prop projections the moment they're posted — no browser rendering, no manual copy-pasting from the app.

- 🏀 Scrapes the **full active board** across every league PrizePicks currently offers lines for (NBA, NFL, MLB, NHL, WNBA, soccer, MMA, golf, tennis, and more)
- 🎯 Scrapes a **single league** by id or name
- 📋 Returns a **league catalog** (`mode: "leagues"`) so you can discover every active league's id, name, and current projection count
- 🔍 Filters by **stat type** (Points, Rebounds, Passing Yards, Kills, etc.), **odds type** (standard, goblin, demon), and **game status** (pre-game, in progress, final)
- 🔥 Filters for **promo / flash-sale lines** or **live in-game projections** only
- 📊 Returns player, team, position, jersey number, and combo-projection details alongside every line

#### Data fields you get from PrizePicks

| Field | Description |
|-------|-------------|
| `playerName` / `playerTeam` / `playerPosition` | Player (or combo) identity and team |
| `league` / `leagueId` | League name and PrizePicks league id |
| `statType` / `statDisplayName` | The stat being projected (e.g. Points, Passing Yards) |
| `lineScore` / `flashSaleLineScore` | The projection line and any discounted flash-sale line |
| `oddsType` | `standard`, `goblin` (easier), or `demon` (harder) |
| `status` / `isLive` | Game state (pre-game / in progress / final) and live flag |
| `startTime` / `boardTime` / `updatedAt` | Event start time, when the line was posted, last update |
| `opponent` / `gameId` / `tvChannel` | Matchup context and broadcast info |
| `projectionUrl` | Deep link back to the projection in the PrizePicks app |

#### How to scrape PrizePicks player props

1. Click **Try for free** (or **Start**) on the [PrizePicks Scraper page](https://apify.com/parsebird/prizepicks-scraper).
2. Leave `mode` at its default (`projections`) for a quick 10-row sample, or set `mode: "leagues"` first to look up a specific league's id.
3. Raise `maxResults` (e.g. to 1000) to pull the full board, and optionally narrow results with `statTypes`, `oddsType`, `status`, `promoOnly`, or `includeLiveOnly`.
4. Click **Start** and watch the run log — PrizePicks lines only take a US proxy warm-up plus one API call to appear.
5. Download the dataset as **JSON, CSV, Excel, HTML, or XML**, or pull it via the [Apify API](https://docs.apify.com/api/v2) / [ApifyClient](https://docs.apify.com/api/client) straight into your own pipeline.

#### Input examples

**Option A — Full active board.** Leave `mode` at its default (`projections`) and raise `maxResults` to pull more than the default 10-row sample.

```json
{
  "mode": "projections",
  "maxResults": 1000
}
```

**Option B — One league**, by dropdown or name. `leagueName` wins if both are set.

```json
{
  "mode": "league",
  "league": "7",
  "maxResults": 500
}
```

```json
{
  "mode": "league",
  "leagueName": "EuroLeague",
  "statTypes": ["Points", "Rebounds"],
  "oddsType": "demon"
}
```

To discover league ids for leagues not in the dropdown (soccer competitions, esports, golf events, etc.), run `mode: "leagues"` first — it lists every active league with its id and current projection count.

#### Input parameters

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| mode | select | No | `projections` | `projections` (full board), `league` (one league), or `leagues` (catalog) |
| league | select | No | `""` | League dropdown for `league` mode (`""` = all leagues) |
| leagueName | string | No | `""` | League name or numeric id; overrides the `league` dropdown |
| statTypes | array | No | `[]` | Keep only projections whose stat type matches one of these (substring, case-insensitive) |
| oddsType | select | No | `""` | Keep only `standard`, `goblin`, or `demon` lines |
| status | select | No | `""` | Keep only `pre_game`, `in_progress`, or `final` |
| promoOnly | boolean | No | `false` | Keep only flash-sale / promo lines |
| includeLiveOnly | boolean | No | `false` | Keep only live in-game projections |
| maxResults | integer | No | 10 | Upper bound on rows returned (kept low by default to keep first runs cheap — raise it for a full board pull) |
| perPage | integer | No | 1000 | JSON:API page size while paginating (advanced) |
| proxyConfiguration | object | No | RESIDENTIAL (US) | PrizePicks blocks non-US traffic — a US proxy is required |

#### Output example

```json
{
  "_mode": "projections",
  "projectionId": "13312345",
  "playerName": "LeBron James",
  "playerTeam": "LAL",
  "playerPosition": "SF",
  "league": "NBA",
  "leagueId": 7,
  "statType": "Points",
  "statDisplayName": "Points",
  "lineScore": 27.5,
  "oddsType": "demon",
  "projectionType": "Single Stat",
  "status": "pre_game",
  "isPromo": false,
  "isLive": false,
  "startTime": "2026-07-24T23:30:00.000-04:00",
  "opponent": "LAL @ BOS",
  "gameId": "NBA_2026_LALBOS",
  "projectionUrl": "https://app.prizepicks.com/?projection=13312345",
  "scrapedAt": "2026-07-24T18:20:11.031Z"
}
```

Download results as **JSON, CSV, Excel, HTML, or XML** from the Console, or fetch them straight from the [Dataset API](https://docs.apify.com/api/v2#/reference/datasets).

#### Use cases

- Track player-prop lines across every league for a betting model or dashboard
- Monitor line movement by comparing `boardTime`, `updatedAt`, and `lineScore` across scheduled runs
- Build a goblin/demon odds tracker for a specific league or stat type
- Feed flash-sale / promo lines into an alerting workflow
- Pull live in-game projections for real-time tools

#### How it works

1. The Actor opens PrizePicks' app in a proxied session to establish a valid board session, then calls the same live projections API the PrizePicks app itself uses.
2. Responses are paginated automatically up to `maxResults`.
3. Player, team, league, and stat-type details are joined onto each projection from the API's related records.
4. Records are filtered by `statTypes`, `oddsType`, `status`, `promoOnly`, and `includeLiveOnly` before being pushed to the dataset.

#### API access, scheduling, and integrations

Run PrizePicks Scraper on a **schedule** (every few minutes, hourly, daily) directly from the Apify Console to track line movement over time, or call it programmatically via the [Apify API](https://docs.apify.com/api/v2) and [ApifyClient](https://docs.apify.com/api/client) SDKs. It also connects to [Make, Zapier, and other integrations](https://apify.com/integrations) so new projections can flow straight into a spreadsheet, database, or alert.

**Python**

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_API_TOKEN")
run = client.actor("parsebird/prizepicks-scraper").call(run_input={
    "mode": "projections",
    "statTypes": ["Points", "Assists"],
    "maxResults": 1000,
})

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["playerName"], item["statType"], item["lineScore"])
```

**JavaScript**

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

const client = new ApifyClient({ token: 'YOUR_API_TOKEN' });
const run = await client.actor('parsebird/prizepicks-scraper').call({
    mode: 'league',
    leagueName: 'NBA',
    oddsType: 'demon',
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

#### How much does it cost to scrape PrizePicks?

PrizePicks Scraper uses **Pay-Per-Event (PPE)** pricing — you only pay for projections actually returned, not for compute time.

| Event | Free | Bronze | Silver | Gold |
|-------|------|--------|--------|------|
| `record-scraped` (per 1,000) | $1.79 | $1.49 | $1.29 | $1.19 |

The default run (`maxResults: 10`) costs a fraction of a cent so you can try it risk-free; scraping the full active board (roughly 1,000–3,000 projections depending on the day and season, set `maxResults` accordingly) typically costs **under $5**. Apify's [subscription plans](https://apify.com/pricing) include monthly platform usage credits that apply toward this cost.

#### Is it legal to scrape PrizePicks?

Scraping publicly accessible data is generally legal, and PrizePicks' projection board is publicly viewable to any visitor. This Actor only reads the same projection data PrizePicks already displays to the public — it does not access accounts, place picks, or bypass any paywall. You are responsible for using the scraped data in compliance with PrizePicks' terms of service and any applicable laws in your jurisdiction. See Apify's [guide on the legality of web scraping](https://www.apify.com/blog/is-web-scraping-legal) for more detail.

#### Related Actors

- [Kalshi Scraper — Prediction Market API](https://apify.com/parsebird/kalshi-scraper) — event-contract prices from Kalshi's prediction markets
- [Polymarket Leaderboard Scraper](https://apify.com/parsebird/polymarket-scraper) — top-trader leaderboard data from Polymarket
- [StubHub Event Scraper](https://apify.com/parsebird/stubhub-event-scraper) — live sports and event listings from StubHub

#### FAQ

**How fresh is the projection data?**
Every run pulls PrizePicks' live board at request time — there's no caching layer. Schedule repeated runs to track line movement over the day.

**Can I get only goblin or demon lines?**
Yes. Set `oddsType` to `goblin` or `demon` to keep only that odds type, or leave it empty to keep all three.

**Does this Actor work outside the US?**
The Actor itself runs on Apify's infrastructure with a US proxy enabled by default (PrizePicks blocks non-US traffic), so it works regardless of where you run it from.

**Can I schedule recurring runs?**
Yes. Use Apify's built-in [Scheduler](https://docs.apify.com/platform/schedules) to run this Actor every few minutes, hourly, or daily.

**What if a league or stat type isn't in the dropdown?**
Run `mode: "leagues"` to get the full catalog of active league ids and names, then paste the id or name into `leagueName`.

**I found a bug or have a feature request — where do I report it?**
Open an issue on the Actor's **Issues** tab in Apify Console — it's the fastest way to reach the maintainer.

# Changelog

This Actor's version history is a separate document: https://apify.com/parsebird/prizepicks-scraper/changelog.md

# Actor input Schema

## `mode` (type: `string`):

'projections' scrapes the full active board across every league. 'league' scrapes a single league (pick it below). 'leagues' returns the league catalog with ids and current projection counts, useful for discovering ids to use in League name / id.

## `league` (type: `string`):

Only used when Mode is 'league'. Pick a common league, or leave as 'All leagues' and use League name / id instead. Not every active league is listed here — run Mode 'leagues' first to find ids for leagues not shown (soccer competitions, esports, golf events, etc.).

## `leagueName` (type: `string`):

Only used when Mode is 'league'. A league name (e.g. "EuroLeague") or numeric league id. Overrides the League dropdown when both are set. Run Mode 'leagues' first to look up the exact id for a league that isn't in the dropdown.

## `statTypes` (type: `array`):

Keep only projections whose stat type matches one of these (case-insensitive substring match), e.g. "Points", "Rebounds", "Passing Yards". Leave empty to keep every stat type.

## `oddsType` (type: `string`):

Keep only standard lines, easier 'goblin' lines, or harder 'demon' lines. Leave as 'All' to keep every odds type.

## `status` (type: `string`):

Keep only projections in this game state. Leave as 'All' to keep every status.

## `promoOnly` (type: `boolean`):

Keep only flash-sale / promotional lines.

## `includeLiveOnly` (type: `boolean`):

Keep only projections that are currently live / in-game.

## `maxResults` (type: `integer`):

Upper bound on the number of rows returned. Kept low by default to keep first runs cheap and fast — raise it (e.g. to 1000) to pull the full board.

## `perPage` (type: `integer`):

JSON:API page size used while paginating the PrizePicks projections endpoint. The default works well for almost every run — only lower it if you hit response-size issues.

## `proxyConfiguration` (type: `object`):

PrizePicks blocks all traffic from outside the United States, so a US proxy is required. Residential (US) is enabled by default and is the most reliable option.

## Actor input object example

```json
{
  "mode": "projections",
  "league": "",
  "leagueName": "",
  "statTypes": [],
  "oddsType": "",
  "status": "",
  "promoOnly": false,
  "includeLiveOnly": false,
  "maxResults": 5,
  "perPage": 1000,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}
```

# Actor output Schema

## `dataset` (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 = {
    "mode": "projections",
    "maxResults": 5,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "US"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("parsebird/prizepicks-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 = {
    "mode": "projections",
    "maxResults": 5,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "US",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("parsebird/prizepicks-scraper").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 '{
  "mode": "projections",
  "maxResults": 5,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}' |
apify call parsebird/prizepicks-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,parsebird/prizepicks-scraper"
        }
    }
}
```

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/eNgNFcZjL0N3zSCna/builds/INOJ9HTfQ7yUAQ0A7/openapi.json
