# PrizePicks Props & Player Prop +EV Finder vs Sportsbooks (`artsiom_k/prizepicks-player-props-finder`) Actor

PrizePicks lines next to DraftKings, FanDuel, Caesars, bet365 and more: the chance of More/Less at each PrizePicks number from the sportsbooks' no-vig prices, plus +EV and arbitrage on sportsbook player props. NBA, NFL, NCAA, WNBA, MLB, NHL.

- **URL**: https://apify.com/artsiom_k/prizepicks-player-props-finder.md
- **Developed by:** [Artsiom Kunitsyn](https://apify.com/artsiom_k) (community)
- **Categories:** Other
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.80 / 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.
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 Props & Player Prop +EV Finder vs Sportsbooks

Puts every **PrizePicks** line next to the same player prop at **DraftKings, FanDuel, Caesars, BetMGM,
Fanatics, bet365, BetRivers, Hard Rock Bet, Parx** and more. It works out the **chance of More or Less**
at the PrizePicks number from the sportsbooks' no-vig prices, and finds **+EV bets** and **arbitrage**
on sportsbook player props.

NBA, NFL, NCAA Football, NCAA Basketball, WNBA, MLB and NHL. Points, rebounds, assists, PRA, threes,
passing/rushing/receiving yards, receptions, strikeouts, shots and every other over/under player prop
the books list. A run takes seconds.

### Contents

- [Why this finder](#-why-this-finder)
- [How the pick chance and edge are worked out](#-how-the-pick-chance-and-edge-are-worked-out)
- [Output](#-output)
- [Input](#️-input)
- [Input examples](#-input-examples)
- [Use it from an AI assistant](#-use-it-from-an-ai-assistant)
- [Good to know](#-good-to-know)
- [FAQ](#-faq)

### ✅ Why this finder

- **PrizePicks lines checked against the market.** A PrizePicks line is a number with no price; the
  sportsbooks' over and under odds at the same number say how likely More or Less really is.
- **Many sportsbooks, each counted once.** DraftKings in 15 states is one opinion, not 15.
- **Bad prices filtered out.** A book that prices a prop far from every other book (a stale or
  mislabelled line) is dropped from that line instead of showing up as a fake edge or arbitrage.
- **Sportsbook props too.** The same run finds +EV over/unders and over/under arbitrage between books.
- **Your books only.** Pick the sportsbooks you can bet at; bets are only suggested there.
- **Best first.** Strongest PrizePicks picks first, then arbitrage, then the highest edges.

### 🧮 How the pick chance and edge are worked out

1. For every player, stat and number, each sportsbook's over and under prices are turned into
   probabilities and its margin (the "vig") is removed.
2. The **fair chance** of over and under is the median across books.
3. **PrizePicks picks:** the chance of More and Less at the PrizePicks number, from the books that
   offer that exact number (at least 2). If too few do, the row shows the sportsbooks' line and the
   difference instead (PrizePicks 54.5 receiving yards, books at 61.5: the books expect more).
4. **Edge (EV %)** for sportsbook bets = fair chance × decimal odds − 1.
5. **Arbitrage:** an over at one book and an under at another whose prices add up to less than 100%.

### 📋 Output

Rows are `pick` (a PrizePicks line), `bet` (one side of a sportsbook prop) or `arbitrage`. The
**Output** tab's **Picks and bets** view shows them as a table.

**PrizePicks pick:**

```json
{
  "row_type": "pick",
  "league": "nfl",
  "start_time": "2026-11-01T18:00:00.000Z",
  "player": "Keon Coleman",
  "player_team": "Buffalo Bills",
  "stat": "receptions",
  "stat_name": "Receptions",
  "app": "PrizePicks",
  "app_line": 2.5,
  "selection": "Keon Coleman Less 2.5 Receptions",
  "pick": "less",
  "pick_probability_pct": 56.63,
  "over_probability_pct": 43.37,
  "under_probability_pct": 56.63,
  "fair_price_books": ["Caesars", "DraftKings", "FanDuel", "Parx"],
  "sportsbook_line": 2.5,
  "line_difference": 0,
  "sportsbook_lines": [
    {"book": "DraftKings", "line": 2.5, "over_odds_american": 122, "under_odds_american": -156},
    {"book": "FanDuel", "line": 2.5, "over_odds_american": 112, "under_odds_american": -148}
  ],
  "scanned_at": "2026-10-28T07:08:02Z"
}
```

**+EV sportsbook prop:**

```json
{
  "row_type": "bet",
  "league": "nfl",
  "player": "Justice Hill",
  "stat_name": "Receptions",
  "line": 1.5,
  "side": "under",
  "selection": "Justice Hill Under 1.5 Receptions",
  "fair_probability_pct": 42.66,
  "best_book": "bet365",
  "best_odds_american": 150,
  "ev_pct": 6.66,
  "prices": [
    {"book": "bet365", "odds_american": 150, "ev_pct": 6.66},
    {"book": "Bet99", "odds_american": 145, "ev_pct": 4.52}
  ]
}
```

**Arbitrage** rows have `legs`: the book, odds and stake share for the over and the under.

Every row also has the game id, start time (UTC), teams, the game's Action Network page and the time
the odds were read. Download as JSON, CSV or Excel, or read it through the Apify API.

### ⚙️ Input

| Parameter | Default | Description |
|---|---|---|
| `leagues` | all 7 | `nfl`, `ncaaf`, `nba`, `ncaab`, `wnba`, `mlb`, `nhl`. |
| `opportunities` | all | `dfsPicks`, `positiveEv`, `arbitrage`. |
| `stats` | all | e.g. `points`, `pra`, `3fgm`, `passing_yards`, `receptions`. |
| `players` | all | Names or parts of names, e.g. `["Jokic", "Mahomes"]`. |
| `minPickProbabilityPct` | `54` | Smallest chance of More/Less for a pick to be returned. |
| `minLineDifferencePct` | `5` | For picks no book prices at the same number: smallest line difference, in % of the line. |
| `books` | all | Only suggest bets at these sportsbooks. |
| `minEvPct` | `2` | Smallest edge for a sportsbook bet, in %. |
| `maxEdgePct` | `20` | Hide edges and arbitrage above this % (nearly always a stale price). `null` = show all. |
| `daysAhead` | `0` | Daily leagues: also scan this many days after today. NFL/NCAAF always scan this week. |
| `startsWithinHours` | none | Only games starting within this many hours. |
| `allOutcomes` | `false` | For the selected types: every PrizePicks line and every sportsbook prop side, edge or not. |
| `minBooks` | `3` | Books needed for a sportsbook prop's fair price (PrizePicks picks need one fewer, at least 2). |
| `devigMethod` | `multiplicative` | Or `power`. |
| `maxItems` | `50` | Max rows, best first. `null` = all. |

### 🧪 Input examples

**Tonight's best NBA PrizePicks picks:**

```json
{ "leagues": ["nba"], "opportunities": ["dfsPicks"], "maxItems": null }
```

**Every NFL receiving-yards line this week, PrizePicks next to the books:**

```json
{ "leagues": ["nfl"], "stats": ["receiving_yards"], "opportunities": ["dfsPicks"], "allOutcomes": true, "maxItems": null }
```

**+EV player props at DraftKings and FanDuel only:**

```json
{ "leagues": ["nba", "nfl"], "opportunities": ["positiveEv"], "books": ["DraftKings", "FanDuel"], "maxItems": null }
```

**One player:**

```json
{ "leagues": ["nba"], "players": ["Jokic"], "allOutcomes": true, "maxItems": null }
```

### 🤖 Use it from an AI assistant

Connect Claude, ChatGPT, Cursor or any MCP client to Apify's MCP server and this Actor becomes a tool
it can call:

- "Best PrizePicks plays in the NBA tonight?" → `leagues: ["nba"]`, `opportunities: ["dfsPicks"]`
- "What do the books say about Jokic's PRA line?" → `players: ["Jokic"]`, `stats: ["pra"]`, `allOutcomes: true`
- "Any player prop arbitrage in the NFL this week?" → `leagues: ["nfl"]`, `opportunities: ["arbitrage"]`

Every run's status message sums it up ("26 games, 2362 player props (620 DFS lines) scanned: 5 DFS
picks at 54.0%+, 36 arbitrage, 65 +EV of 2.0%+"), and rows come back best first.

### ℹ️ Good to know

- **PrizePicks lines come from Action Network's odds feed**, which lists a share of PrizePicks'
  board (in testing ~20–60 lines per NFL game and fewer per NBA game; it varies through the day).
  The feed sometimes drops every PrizePicks line for a few minutes; a run that lands in such a gap
  waits and checks again (up to 3 minutes) before returning sportsbook rows only. Underdog and Sleeper are requested too and used when the feed lists them;
  at launch it listed none. Demons and goblins (alternative-payout lines) aren't included.
- **Prices move fast.** Rows carry `scanned_at`; check the line before you play it.
- **Only over/under props.** Yes/no props (anytime touchdown, double-double, "X or more" milestones)
  have no under to remove the margin with, so they're skipped.
- **Games that have started are skipped.** In-play prices lag.
- Each book counts once per number; bet365, BetVictor and Bet99 often post identical prop lines.
- **bet365 is most often the best price** on props, and on prop arbitrage. Check that its line is
  still up before betting the other side.
- This is data, not betting advice. Play only where it's legal for you.

### ❓ FAQ

**What does "pick chance 56%" mean?** By the sportsbooks' prices with their margin removed, that side
of the PrizePicks line wins 56% of the time. Whether that's enough depends on your entry type: commonly
quoted break-evens are about 54.2% for 5- and 6-pick Flex and 57.7% for a 2-pick Power Play.

**Why does a pick have no chance, only a line difference?** Fewer than 2 sportsbooks offer that
exact number. The books' own line (`sportsbook_line`) and the gap still show which side they lean to.

**How often should I run it?** Lines move most in the last hours before a game. Every 10–15 minutes
with `startsWithinHours` set works well, with an Apify Schedule and a webhook or Slack/email
integration for alerts.

### 🔗 You might also like

- [+EV & Arbitrage Betting Finder: 18 Sportsbooks + Exchanges](https://apify.com/artsiom_k/betting-ev-arbitrage-finder)
- [Action Network Odds, Betting Splits & Line Movement Scraper](https://apify.com/artsiom_k/actionnetwork-scraper)
- [Kalshi & Polymarket Prediction Markets Scraper](https://apify.com/artsiom_k/prediction-markets-scraper)
- [FantasyPros Rankings, ADP & Projections](https://apify.com/artsiom_k/fantasypros-scraper)

# Actor input Schema

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

Leagues to scan; out-of-season leagues return nothing. NFL and NCAA Football scan this week's games; the other leagues scan today (US Eastern), plus more days with "Days ahead".

## `opportunities` (type: `array`):

"dfsPicks": PrizePicks (and Underdog/Sleeper, when listed) lines with the chance of More/Less at that number, worked out from the sportsbooks. "positiveEv": sportsbook player-prop bets priced better than the fair price. "arbitrage": an over at one book and an under at another that win whatever happens.

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

Only these stats, e.g. points, rebounds, assists, 3fgm, points_rebounds_assists (or pra), passing_yards, rushing_yards, receiving_yards, receptions, strikeouts, hits, shots_on_goal. Empty = all.

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

Only players whose name contains one of these, e.g. "Jokic" or "Patrick Mahomes". Empty = all.

## `minPickProbabilityPct` (type: `number`):

Only return DFS picks whose More or Less side wins at least this often by the sportsbooks' no-vig prices at the app's number (at least 2 books needed). Commonly quoted break-evens are about 54.2% for 5- and 6-pick Flex entries and 57.7% for 2-pick Power Plays.

## `minLineDifferencePct` (type: `number`):

When too few sportsbooks offer the app's exact number, the pick is returned only if the sportsbooks' line differs from it by at least this percent (e.g. 5% = 2.5 yards on a 50.5 line).

## `books` (type: `array`):

Only suggest +EV and arbitrage bets at these sportsbooks (for example the ones legal in your state). Leave empty for all. The fair price always uses every book.

## `minEvPct` (type: `number`):

Only return +EV bets whose expected profit is at least this percent of the stake.

## `maxEdgePct` (type: `number`):

Edges and arbitrage profits above this are almost always a stale or wrong price, so they're left out. Clear it to see everything.

## `daysAhead` (type: `integer`):

For daily leagues (all but NFL and NCAA Football): also scan this many days after today. 0 = today only (props for later days are often not posted yet).

## `startsWithinHours` (type: `number`):

Ignore games that start later than this. Lines close to kickoff are the sharpest. Empty = no limit.

## `allOutcomes` (type: `boolean`):

For the types selected in "Find": return every DFS line (picks) and every side of every sportsbook prop (+EV bets), with the fair price and every book's odds, edge or not. Many more rows.

## `minBooks` (type: `integer`):

A prop number gets a fair price only when at least this many sportsbooks price both the over and the under.

## `devigMethod` (type: `string`):

"multiplicative" scales each book's probabilities down to 100%. "power" takes more of the margin off long shots.

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

Return at most this many rows, best first (DFS picks, then arbitrage, then the highest edges). Set to null for all.

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

Not needed: the odds source answers Apify's servers directly.

## Actor input object example

```json
{
  "leagues": [
    "nfl",
    "ncaaf",
    "nba",
    "ncaab",
    "wnba",
    "mlb",
    "nhl"
  ],
  "opportunities": [
    "dfsPicks",
    "positiveEv",
    "arbitrage"
  ],
  "minPickProbabilityPct": 54,
  "minLineDifferencePct": 5,
  "minEvPct": 2,
  "maxEdgePct": 20,
  "daysAhead": 0,
  "allOutcomes": false,
  "minBooks": 3,
  "devigMethod": "multiplicative",
  "maxItems": 50,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("artsiom_k/prizepicks-player-props-finder").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 = {}

# Run the Actor and wait for it to finish
run = client.actor("artsiom_k/prizepicks-player-props-finder").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 '{}' |
apify call artsiom_k/prizepicks-player-props-finder --silent --output-dataset

```

## MCP server setup

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

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/OlGk9xcWE3eEcrRnP/builds/yFxhIxqtymi90KRaB/openapi.json
