# DFS Multi-Source Player Props Scraper (`crawloop/dfs-multi-source-props-scraper`) Actor

Scrape PrizePicks, Betr, DraftKings Pick6, and Underdog player props in one run. Normalized schema, comparison\_key joins, and line spread dataset. Crawloop DFS Props Suite.

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

## Pricing

from $0.25 / 1,000 results

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?

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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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

## DFS Multi-Source Player Props Scraper — Cross-Platform Lines

> **Crawloop DFS Player Props Suite** — Real-time player props from US DFS pick'em platforms in one normalized dataset.

| PrizePicks | Betr Picks | DraftKings Pick6 | Underdog Fantasy | Multi-Source |
| :--- | :--- | :--- | :--- | :--- |
| [PrizePicks Scraper](https://apify.com/crawloop/prizepicks-player-props-scraper) | [Betr Picks Scraper](https://apify.com/crawloop/betr-picks-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 |

> **Disclaimer:** Unofficial integrations developed independently of PrizePicks, Betr, DraftKings, and Underdog Fantasy. Not affiliated with or endorsed by those companies. For informational and research purposes only — not betting advice.

One Apify run → **PrizePicks**, **Betr Picks**, **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 cheaper single-source scrapers linked above.

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

- **Four platforms** — `prizepicks`, `betr-picks`, `draftkings-pick6`, `underdog`.
- **Unified schema** — every row includes `source`, `player_name`, `line`, `market`, `comparison_key`.
- **Comparison dataset** — optional output with per-source lines and `line_spread`.
- **Partial success** — if one source fails, successful sources still land in the dataset.
- **Proven collectors** — same logic as the standalone suite Actors.

### Input Parameters

| Parameter | Description | Default |
| :--- | :--- | :--- |
| `sources` | Platforms to scrape. | all four |
| `leagues` | Leagues across all sources (MLB, NBA, All). | `["MLB"]` |
| `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", "betr-picks", "underdog"],
  "leagues": ["NBA"],
  "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', 'betr-picks', 'underdog'],
  leagues: ['NBA'],
  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", "betr-picks", "underdog"],
        "leagues": ["NBA"],
        "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", "betr-picks", "underdog"],
    "leagues": ["NBA"],
    "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 NBA on prizepicks, betr-picks, and underdog, and summarize the widest line spreads"
- "Scrape multi-source MLB 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), [Betr](https://apify.com/crawloop/betr-picks-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) |
| Betr Picks GraphQL lobby | [Betr Picks Scraper](https://apify.com/crawloop/betr-picks-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. Choose one for a single book or all for a full cross-platform snapshot.

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

Leagues to collect across all selected sources. Use sport abbreviations like MLB, NBA, NFL, 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, Underdog uses CloakBrowser automation (slower, no manual setup).

## `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": [
    "underdog"
  ],
  "leagues": [
    "All"
  ],
  "playerNames": "",
  "statTypes": "",
  "teams": "",
  "maxProjectionsPerSource": 100,
  "maxTotalProjections": 200,
  "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": [
        "underdog"
    ],
    "leagues": [
        "All"
    ],
    "maxProjectionsPerSource": 100,
    "maxTotalProjections": 200,
    "outputComparisons": false
};

// 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": ["underdog"],
    "leagues": ["All"],
    "maxProjectionsPerSource": 100,
    "maxTotalProjections": 200,
    "outputComparisons": False,
}

# 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": [
    "underdog"
  ],
  "leagues": [
    "All"
  ],
  "maxProjectionsPerSource": 100,
  "maxTotalProjections": 200,
  "outputComparisons": false
}' |
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/73fxjSCfWyRTLs1qS/openapi.json
