# PrizePicks, Underdog & Pick6 Props Scraper (`crawloop/dfs-multi-source-props-scraper`) Actor

Scrape PrizePicks, DraftKings Pick6, and Underdog player props in one run. Normalized rows, comparison keys, and a line-spread dataset for cross-book research.

- **URL**: https://apify.com/crawloop/dfs-multi-source-props-scraper.md
- **Developed by:** [Andrej Kiva](https://apify.com/crawloop) (community)
- **Categories:** Sports, Automation, Developer tools
- **Features:** Limited permissions
- **Stats:** 13 total users, 0 monthly users, 86.1% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.25 / 1,000 props

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
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, Underdog & Pick6 Props Scraper — Cross-Platform Lines

> **Disclaimer:** Unofficial tool — not affiliated with, sponsored by, or endorsed by PrizePicks, Betr, DraftKings, and Underdog Fantasy or its affiliates. Data is read from publicly accessible pages only. No login. You are responsible for complying with applicable law (including GDPR where personal data appears) and the site’s terms. No warranty on accuracy or availability. Provided for informational and research use.

| PrizePicks | DraftKings Pick6 | Underdog Fantasy | Multi-Source |
| :--- | :--- | :--- | :--- |
| [PrizePicks Scraper](https://apify.com/crawloop/prizepicks-player-props-scraper) | [Pick6 Scraper](https://apify.com/crawloop/draftkings-pick6-scraper) | [Underdog Props Scraper](https://apify.com/crawloop/underdog-fantasy-player-props-scraper-real-time-lines-odds) | **Props Board** ◄── you are here |

One Apify run → **PrizePicks**, **DraftKings Pick6**, and **Underdog Fantasy** in a single normalized dataset with shared schema, `comparison_key` for cross-platform joins, and an optional **comparisons** dataset with side-by-side line spreads.

Need only one platform? Use the single-source scrapers linked above.

### When not to use this Actor

- **Bet placement, automated wagering, picks, or tips** — this is a read-only informational/research data tool, not a betting product or advice service.
- Account, wallet, private-history, or login-gated workflows are out of scope.

### When to use this Actor

Use the **Multi-Source Board** when you need cross-platform line shopping, gap analysis, or a unified props feed — not when monitoring a single book at minimum cost.

### Key Features

- **Three live platforms** — `prizepicks`, `draftkings-pick6`, `underdog` (Betr Picks is retired and skipped if still selected).
- **Unified schema** — every row includes `source`, `player_name`, `line`, `market`, `comparison_key`.
- **Comparison dataset** — optional output with per-source lines and `line_spread`.
- **Partial results stay in the dataset** — a source that fails does not wipe the others. The run itself fails when fewer than two requested books return props, so a one-book dump is not a successful comparison.
- **Proven collectors** — same logic as the standalone suite Actors.

### Input Parameters

| Parameter | Description | Default |
| :--- | :--- | :--- |
| `sources` | Platforms to scrape. | prizepicks, pick6, underdog |
| `leagues` | Leagues across all sources (NFL, NBA, All). | `["NFL"]` |
| `outputComparisons` | Emit comparisons dataset with line spreads. | `true` |
| `maxProjectionsPerSource` | Cap per source. | platform default |
| `proxyConfiguration` | US residential recommended. | Apify RESIDENTIAL US |

#### Input Example

```json
{
  "sources": ["prizepicks", "draftkings-pick6", "underdog"],
  "leagues": ["NFL"],
  "outputComparisons": true,
  "maxProjectionsPerSource": 500
}
```

### Use cases

| Use case | What you get |
| :--- | :--- |
| **Line shopping** | Same prop across books with spreads |
| **Gap analysis** | Props missing on one board but present on others |
| **Unified feeds** | One schema for dashboards |
| **Research pipelines** | Node/Python/cURL + dataset exports |
| **AI / MCP workflows** | Apify API, clients, or MCP |

### Integration examples

#### Node.js

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('crawloop/dfs-multi-source-props-scraper').call({
  sources: ['prizepicks', 'draftkings-pick6', 'underdog'],
  leagues: ['NFL'],
  outputComparisons: true,
  maxProjectionsPerSource: 500,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.slice(0, 5));
```

#### Python

```python
from apify_client import ApifyClient

client = ApifyClient(token)
run = client.actor("crawloop/dfs-multi-source-props-scraper").call(
    run_input={
        "sources": ["prizepicks", "draftkings-pick6", "underdog"],
        "leagues": ["NFL"],
        "outputComparisons": True,
        "maxProjectionsPerSource": 500,
    }
)
items = list(client.dataset(run["defaultDatasetId"]).iterate_items())
print(len(items), items[:3])
```

#### cURL

```bash
curl "https://api.apify.com/v2/acts/crawloop~dfs-multi-source-props-scraper/runs?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "sources": ["prizepicks", "draftkings-pick6", "underdog"],
    "leagues": ["NFL"],
    "outputComparisons": true,
    "maxProjectionsPerSource": 500
  }'
```

### MCP and AI assistants

Use this Actor from AI tools via [Apify MCP](https://docs.apify.com/platform/integrations/mcp). Connect your Apify account, then call `crawloop/dfs-multi-source-props-scraper`.

Example prompts:

- "Run DFS Multi-Source Props Scraper for NFL on prizepicks, draftkings-pick6, and underdog, and summarize the widest line spreads"
- "Scrape multi-source NFL props and return top 20 comparison_key rows with source_count > 1"
- "Chain PrizePicks Scraper then DFS Multi-Source for the same slate and explain differences"

### Suite next step

For lowest-cost single-book monitoring, use [PrizePicks](https://apify.com/crawloop/prizepicks-player-props-scraper), [Pick6](https://apify.com/crawloop/draftkings-pick6-scraper), or [Underdog](https://apify.com/crawloop/underdog-fantasy-player-props-scraper-real-time-lines-odds).

### Related Actors — DFS Props

| Platform focus | Actor |
| :--- | :--- |
| PrizePicks demon/goblin tiers | [PrizePicks Player Props Scraper](https://apify.com/crawloop/prizepicks-player-props-scraper) |
| Pick6 payout multipliers | [DraftKings Pick6 Scraper](https://apify.com/crawloop/draftkings-pick6-scraper) |
| Underdog Fantasy props & odds | [Underdog Props Scraper](https://apify.com/crawloop/underdog-fantasy-player-props-scraper-real-time-lines-odds) |
| **All platforms + line spread** | **DFS Multi-Source Props Scraper** ◄── you are here |

# Actor input Schema

## `sources` (type: `array`):

Platforms to scrape in this run. Live defaults: prizepicks, draftkings-pick6, underdog. betr-picks is retired and skipped if still selected.

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

Leagues to collect across all selected sources. Use sport abbreviations like NFL, NBA, MLB, or All.

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

Comma-separated player names. Case-insensitive, partial matching across all sources.

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

Comma-separated stat types or market labels (Total Bases, Strikeouts, PTS). Applied after collection.

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

Comma-separated team names or abbreviations. Matches either side of the matchup.

## `maxProjectionsPerSource` (type: `integer`):

Maximum raw records to collect from each platform before merge and filters.

## `maxTotalProjections` (type: `integer`):

Maximum records in the final merged dataset.

## `collectionMode` (type: `string`):

Run source collectors in parallel (faster) or sequentially (lower peak memory).

## `includePartialResults` (type: `boolean`):

If one source fails, still output records from successful sources.

## `failOnAllSourcesFailed` (type: `boolean`):

Mark the run as failed when every selected source fails or returns zero records.

## `outputComparisons` (type: `boolean`):

Push side-by-side cross-platform line rows to the named comparisons dataset.

## `minComparisonSources` (type: `integer`):

Only emit comparison rows when at least this many platforms share the same comparison_key.

## `prizePicksStateCode` (type: `string`):

US state code used by PrizePicks public middleware fallback.

## `underdogBoardUrls` (type: `array`):

Optional direct Underdog JSON board URLs. When empty, the run calls the public v1 board over HTTP and uses CloakBrowser only if that board is empty.

## `underdogRequestHeaders` (type: `object`):

Optional headers for Underdog direct board URL mode.

## `underdogMaxPages` (type: `integer`):

Maximum paginated API pages to fetch for Underdog browser/direct collection.

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

US residential proxy is strongly recommended for all sources.

## Actor input object example

```json
{
  "sources": [
    "prizepicks",
    "draftkings-pick6",
    "underdog"
  ],
  "leagues": [
    "NFL"
  ],
  "playerNames": "",
  "statTypes": "",
  "teams": "",
  "maxProjectionsPerSource": 10000,
  "maxTotalProjections": 30000,
  "collectionMode": "parallel",
  "includePartialResults": true,
  "failOnAllSourcesFailed": true,
  "outputComparisons": true,
  "minComparisonSources": 2,
  "prizePicksStateCode": "GA",
  "underdogBoardUrls": [],
  "underdogRequestHeaders": {},
  "underdogMaxPages": 25,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}
```

# Actor output Schema

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

Default dataset items.

# 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 = {
    "sources": [
        "prizepicks",
        "draftkings-pick6",
        "underdog"
    ],
    "leagues": [
        "NFL"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawloop/dfs-multi-source-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 = {
    "sources": [
        "prizepicks",
        "draftkings-pick6",
        "underdog",
    ],
    "leagues": ["NFL"],
}

# Run the Actor and wait for it to finish
run = client.actor("crawloop/dfs-multi-source-props-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 '{
  "sources": [
    "prizepicks",
    "draftkings-pick6",
    "underdog"
  ],
  "leagues": [
    "NFL"
  ]
}' |
apify call crawloop/dfs-multi-source-props-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,crawloop/dfs-multi-source-props-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/AKIIRY8vcdp8IqqjL/builds/ZHYGM247jpVCoM1jr/openapi.json
