# Player Prop Bets: Odds by Player, Stat and Line (`scrapemint/sportsbook-player-props`) Actor

Per player betting markets from a sportsbook: strikeouts, hits, goals, assists, points and more, with the line, both prices and the implied probability. One row per player per market, filterable by player name or stat. Keyless, no proxy.

- **URL**: https://apify.com/scrapemint/sportsbook-player-props.md
- **Developed by:** [Ken M](https://apify.com/scrapemint) (community)
- **Categories:** Business, News
- **Stats:** 1 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

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

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

## Player Prop Bets: Odds by Player, Stat and Line

The per player markets a sportsbook prices on a game: strikeouts, hits, home runs, goals, assists, points. One row per player per market, with the line, both prices and what they imply. No API key, no account, no proxy.

This is the layer that `Sportsbook Odds Tracker` deliberately leaves out. That actor returns the three headline lines on an event. This one opens the event and reads the rest.

### Three modes

**Props.** One row per player per market. Filter by player name or by stat, so you can pull every market on one pitcher, or every strikeout line in the league.

**Players.** One row per player on a game, listing every stat the book prices on them and how many markets that is. Useful for seeing who the book has an opinion on before you pull prices.

**Markets.** The non player depth on the same games: game props, alternate lines, correct score, corners, innings.

### The two shapes of a prop, which is why this actor exists

A book builds player markets two different ways, and a parser written for one returns nothing at all on the other:

- **One market per player.** `Total Hits Allowed - Shane McClanahan (TB)` with Over and Under outcomes, or a ladder of thresholds such as `3+ Strikeouts`, `6+ Strikeouts`. The player is inside the market name.
- **One market per stat.** `Anytime Goal Scorer` with 38 outcomes, each one a player. The player is inside the outcome.

Both are normalised to the same row: player, team, stat, line, price, implied probability, with `propShape` telling you which one it came from. Non player outcomes that sit in the same list, such as `No Goalscorer`, are never published as players.

### An overround is not always a margin

The sum of implied probabilities across a market is the book's margin only when the outcomes are mutually exclusive, so exactly one can win. Two cases here are not:

- `Player to hit a Home Run` bundles 18 independent Yes bets. Several players can homer in the same game. Summed, it reads **-81.83%**, as though the book were paying you to bet.
- A threshold ladder is nested, not exclusive: `6+ strikeouts` already contains `4+`.

Nothing in the source distinguishes these from a genuine either/or market, so `marketOverroundPercent` is published only where exclusivity is certain, and `outcomesMutuallyExclusive` plus `overroundNotPublishedReason` travel with every other row. A one sided market, where the book prices only the Over, also publishes no overround rather than half of one.

### Things worth knowing about the source

- **Player markets load close to game time.** A fixture weeks out has none: an NFL game in September returned 21 markets and no player props, while an MLB game the same day returned 80 markets including 47 player ones. Games are opened soonest first for this reason, and a game with nothing priced yet comes back as a free note rather than a silent zero.
- **The book's team tag can name a team that is not playing.** A Rangers against Rays game listed `Austin Wynns (ATL)`. The tag is reported as the book gives it, never corrected, with `teamMatchesEvent` so you can drop those rows. On a clean run 46 of 50 rows matched.
- **This is one book's depth, and not all of it.** The feed returns up to 62 markets on an event where the book itself counts 111; the rest are parlay only or live only. Every row carries both numbers.
- **An even money price arrives as the word `EVEN`**, so prices are read from the decimal odds, which are always present.
- **Suspended markets keep their last price** and are excluded by default.

### Billing

Pay per event. `prop_row` at $0.005 covers one player on one market, one player summary, or one game market. The first 2 rows of every run are free. Notes and diagnostics are never charged, including a game that has no player markets priced yet.

Each game opened costs one extra request. A default run of 5 games and 50 rows costs $0.25 and takes about 6 seconds.

# Actor input Schema

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

props = one row per player per market. players = one row per player listing every stat priced on them. markets = the non player depth on the same games, such as game props, alternate lines and correct score.

## `leaguePaths` (type: `array`):

Which league to open games in. Examples: baseball/mlb, football/nfl, basketball/nba, soccer/north-america/united-states/mls, tennis. Books load player markets close to game time, so a league playing today returns far more than one out of season.

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

Partial names work. Empty returns every player the book prices on the games opened.

## `statContains` (type: `array`):

Match on the stat name, for example strikeouts, hits, goal, assist, rebounds. Empty returns every stat.

## `maxEvents` (type: `integer`):

Each game costs one extra request, and the soonest games are opened first because that is where the player markets are.

## `includeSuspended` (type: `boolean`):

Off by default. A suspended market keeps its last price even though no bet can be taken on it.

## `maxRows` (type: `integer`):

The first 2 rows of every run are free.

## Actor input object example

```json
{
  "mode": "props",
  "leaguePaths": [
    "baseball/mlb"
  ],
  "players": [],
  "statContains": [],
  "maxEvents": 5,
  "includeSuspended": false,
  "maxRows": 50
}
```

# 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 = {
    "leaguePaths": [
        "baseball/mlb"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapemint/sportsbook-player-props").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 = { "leaguePaths": ["baseball/mlb"] }

# Run the Actor and wait for it to finish
run = client.actor("scrapemint/sportsbook-player-props").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 '{
  "leaguePaths": [
    "baseball/mlb"
  ]
}' |
apify call scrapemint/sportsbook-player-props --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/5uPM1vhH4I3foeVKx/builds/Rl9gcn1MeYcF77HCD/openapi.json
