# Bet365 Player Props API | NFL, MLB, NBA, NHL Over/Under (`zen-studio/bet365-player-props`) Actor

Every active Bet365 player prop as structured JSON. Over/under lines and anytime markets for NFL, MLB, NBA, NHL and more, with player recent-form and decimal/American/fractional odds. Field-aligned to the PrizePicks and Underdog actors for line comparison.

- **URL**: https://apify.com/zen-studio/bet365-player-props.md
- **Developed by:** [Zen Studio](https://apify.com/zen-studio) (community)
- **Categories:** Sports, Developer tools, Integrations
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.50 / 1,000 player props

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

## Bet365 Player Props API | NFL, MLB, NBA, NHL Over/Under & Anytime Odds

<blockquote style="margin:0 0 16px;border-left:5px solid #4C945E;background:#F0FDF4;padding:16px 20px"><span style="font-size:18px;font-weight:700;color:#1C1917">Every live Bet365 player prop as structured JSON: 30+ leagues, thousands of lines, 3 odds formats.</span></blockquote>

<a href="https://console.apify.com/actors/cBL36jl8WfC5P7f7v/input"><img src="https://api.apify.com/v2/key-value-stores/pJ7iaZsTFhR3k9tjV/records/bet365-player-props-hero.png" alt="Bet365 player props API: NFL, MLB, NBA, NHL, soccer, tennis, AFL, NRL and cricket over/under and anytime lines as structured JSON with decimal, American and fractional odds" style="max-width:100%"></a>

⚡ **Line-shop the book against DFS.** Field names align to the [PrizePicks](https://apify.com/zen-studio/prizepicks-player-props) and [Underdog](https://apify.com/zen-studio/underdog-player-props) actors, so you can merge on player, stat, and line to see where Bet365 disagrees with the pick'em line.

### What is the Bet365 Player Props API?

This actor turns Bet365's player-prop board into clean, one-row-per-prop JSON. It covers **NFL, MLB, NBA, NHL player props** plus soccer, tennis, AFL, NRL, and cricket.

Every over/under line, anytime market, and milestone threshold Bet365 is currently offering comes through: the player, the stat, the line, the odds in three formats, and player recent-form where the book publishes it.

No account and no scraping setup. Pick your leagues and run.

### What data can you extract?

**One row per prop.** Over/under markets carry both sides; anytime markets carry a single price. Where the book prices several bet types on one market (`First` and `Anytime` touchdown scorer, `2 or More` and `3 or More`), each is its own row with its own `bet_type`, so nothing the book publishes is left out. Every field below appears in the dataset.

```json
{
  "player_name": "Drake Maye",
  "player_team": "NE Patriots",
  "stat": "Passing Yards",
  "stat_display": "Passing Yards",
  "market_type": "over_under",
  "line": 226.5,
  "over_decimal_odds": 1.909,
  "over_american_odds": -110,
  "over_fractional_odds": "10/11",
  "under_decimal_odds": 1.909,
  "under_american_odds": -110,
  "under_fractional_odds": "10/11",
  "milestone_threshold": null,
  "is_alternate": false,
  "last_5": null,
  "league": "NFL",
  "home_team": "NE Patriots",
  "away_team": "SEA Seahawks",
  "game_start": "2026-09-10T00:20:00+00:00",
  "event_id": "68ae05fe4db3",
  "book": "bet365",
  "suspended": false,
  "is_live": false,
  "status": "active",
  "updated_at": "2026-09-04T19:41:08+00:00"
}
```

**Milestone market** (single price + player recent form). `1+ home runs` is the over/under market at `0.5`, so it merges straight onto a DFS line; the book's own label stays in `milestone_threshold`:

```json
{
  "player_name": "José Ramírez",
  "player_team": "CLE Guardians",
  "stat": "Home Runs",
  "market_type": "milestone",
  "line": 0.5,
  "milestone_threshold": 1,
  "is_alternate": false,
  "decimal_odds": 5.75,
  "american_odds": 475,
  "fractional_odds": "19/4",
  "last_5": [1, 0, 1, 5, 2],
  "league": "MLB",
  "home_team": "DET Tigers",
  "away_team": "CLE Guardians",
  "book": "bet365",
  "suspended": false,
  "is_live": false,
  "status": "active",
  "updated_at": "2026-09-04T19:41:08+00:00"
}
```

**Other-sports grid** (AFL/NRL/cricket):

```json
{
  "player_name": "Caiden Cleary",
  "market_name": "Disposals",
  "bet_type": null,
  "stat": "Disposals",
  "market_type": "grid",
  "line": null,
  "decimal_odds": 1.08,
  "american_odds": -1250,
  "fractional_odds": "2/25",
  "last_5": [18, 5, 17, 7, 19],
  "league": "AFL",
  "home_team": "Sydney Swans",
  "away_team": "Brisbane Lions",
  "book": "bet365"
}
```

#### Field reference

| Field | Description |
|-------|-------------|
| `player_name` | Player the prop is on |
| `player_team` | Player's team, where the book publishes it |
| `stat` / `stat_display` | Clean stat name (Passing Yards, Home Runs, Points, Aces, Disposals…). A market the book splits by bet type carries it here too, so `Anytime Touchdown Scorers` and `First Touchdown Scorers` never collapse into one market when you join on it |
| `market_name` | The book's own name for the market (`Touchdown Scorers`, `Disposals`) |
| `bet_type` | Which side of a multi-bet market the row is, where the book offers several (`First`, `Anytime`, `2 or More`). Null when the market has only one |
| `market_type` | `over_under`, `milestone`, `single`, or `grid` |
| `line` | The over/under number. A milestone market is expressed the same way, so `1+` is `0.5` and `150+` is `149.5` |
| `milestone_threshold` | The book's own label for a milestone market (`1`, `2`, `150`), null elsewhere. Tennis included: `10+ aces` is `line: 9.5`, `milestone_threshold: 10` |
| `is_alternate` | `true` on the rungs above the lowest line of a ladder, which only appear when you ask for them |
| `over_*` / `under_*` odds | Both sides of an over/under, in decimal, American, and fractional |
| `decimal_odds` / `american_odds` / `fractional_odds` | Single-price odds for anytime and grid markets |
| `last_5` | Player's last five results for the stat, where published |
| `league` | Clean league label (NFL, Premier League, US Open…) |
| `home_team` / `away_team` | The matchup |
| `game_start` | Kickoff / first pitch in ISO-8601 UTC |
| `event_id` | Stable game identifier for joining rows |
| `suspended` / `status` | Whether the price is currently accepting bets or suspended |
| `is_live` | Whether the game's scheduled start time has passed. It does not turn off again when a game ends, so pair it with `game_start` if you need a finished-or-not answer |
| `book` | Always `bet365` |
| `updated_at` | When the row was captured |

### Supported leagues

**US sports:** NFL, MLB, NBA, NHL, NCAAF, NCAAB, WNBA.

**Soccer:** Premier League, La Liga, Bundesliga, Serie A, Ligue 1, MLS, Champions League, Europa League, Conference League, Championship, Eredivisie, Primeira Liga, Scottish Premiership, Saudi Pro League, Liga MX, Brazil Serie A, Greece Super League, J-League, Austria Bundesliga.

**Tennis:** ATP & WTA tour, men's and women's singles, Grand Slams through Masters/1000 events (Aces, Double Faults).

**AFL:** Australian Football League (Goalscorers, Disposals). **NRL:** National Rugby League (Tryscorers). **Cricket:** T20 and other formats (Batter Runs, Bowler Wickets, milestones).

Coverage follows the sports calendar: leagues out of season return no props. Not listed? Type any competition into **Other leagues** (free-text, e.g. `KBO, IPL`) and it works without waiting for an update. Set **List available leagues only** to see what's live right now.

### Filters (you only pay for what you keep)

- **Leagues**: pick from the list or choose *All in-season*.
- **Other leagues**: free-text any competition not in the list.
- **Players**: comma-separated, partial and accent-insensitive (`Mahomes, Judge`, `Jose` matches `José`).
- **Stat types**: e.g. `Passing Yards, Home Runs, Points`.
- **Teams**: matches either side of the matchup (`Chiefs, Yankees`).
- **Max games per league**: cap to the next few games, or 0 for the full slate.
- **Include alternate lines**: off by default, so each market returns its lowest line only, which on a milestone market (`1+ home runs`) is the headline one. Turn it on for the whole ladder (1+, 2+, 3+ home runs, 150 through 350 passing yards), which multiplies the rows and the cost by the ladder's depth. Those extra rows carry `is_alternate: true`.

Filtered-out props are never counted against your cost, and an empty run costs only the start fee.

### Use cases

- **Line shopping vs DFS**: merge with the PrizePicks / Underdog actors on `player_name + stat + line` to find where the book and the pick'em app disagree.
- **Prop model backtesting**: pull the full board daily and store lines and `last_5` form for your own projections.
- **Odds-movement tracking**: schedule hourly runs and diff `line` / odds over time to catch steam and injury moves.
- **Best-price aggregation**: combine with the [Bet365 Odds](https://apify.com/zen-studio/bet365-real-time-odds), FanDuel, DraftKings, and BetMGM odds actors for a cross-book player-prop table.

### Integrations & export

Every run writes a dataset you can export as **JSON, CSV, or Excel**, or pull through the Apify API. Send props straight into:

- **Google Sheets**: auto-populate a prop-comparison sheet after each run.
- **Make / Zapier**: trigger a scenario on new rows (e.g. alert when a player's line moves).
- **Webhooks**: POST the dataset to your own model or database when a run finishes.
- **Slack / email**: notify on runs that match your player or stat filters.

### Scheduling

Player-prop lines move all day, so schedule recurring runs and diff the board over time (join rows on `event_id + player_name + stat`). No code needed, set it on the actor's Schedule tab.

| Cadence | Best for |
|---------|----------|
| Once each morning | Opening-line snapshots, daily picks content |
| Every hour or two on game day | Line-movement tracking, model inputs |
| Every few minutes | Near-real-time monitoring, alert bots |

New to scheduling on Apify? This walkthrough covers it:

https://www.youtube.com/watch?v=1jI7WcVQmwM

### How much does it cost to scrape Bet365 player props?

Pay per prop: about **$0.50 per 1,000 props** ($0.0005 each), plus a small one-time start fee per run.

Filtered-out props and capped games are never charged, and a run that finds nothing costs only the start fee.

A single game runs under a dime; a couple of leagues, about a quarter; the whole in-season slate, under two dollars. See the **Pricing** tab for exact per-event rates.

### Copy to your AI assistant

Paste this into ChatGPT, Claude, or Cursor to start building with the actor.

```
Apify actor zen-studio/bet365-player-props. Batch actor: returns Bet365 player props as one JSON row per prop (player_name, player_team, stat, market_type, line (milestone markets are expressed as the equivalent over/under line, 1+ = 0.5, with the book label in milestone_threshold), is_alternate, over_/under_ or single decimal/american/fractional odds, last_5 form, league, home_team, away_team, game_start (ISO-8601 UTC), event_id, book, suspended, is_live (game under way), status, updated_at). Input: leagues[] (NFL, MLB, NBA, NHL, NCAAF, NCAAB, WNBA, 19 soccer leagues, Tennis, AFL, NRL, Cricket, or "All"), extraLeagues (free-text CSV for any other competition), playerNames / statTypes / teams (CSV filters, partial + accent-insensitive), maxGamesPerLeague (int, 0=all), includeAlternateLines (bool, adds the alternate line ladder, off by default), listLeagues (bool, lists live leagues then stops). Run via API: POST https://api.apify.com/v2/acts/zen-studio~bet365-player-props/runs?token=APIFY_TOKEN with the JSON input, then read the run's default dataset. Full input schema + output fields + README: https://api.apify.com/v2/acts/zen-studio~bet365-player-props/builds/default. Field-aligned to zen-studio/prizepicks-player-props and zen-studio/underdog-player-props for line comparison (merge on player_name + stat + line).
```

### FAQ

**Does Bet365 have a player props API?**
Bet365 doesn't offer a public API for player props. This actor is the practical alternative: it delivers the same live over/under and anytime lines as clean JSON you can pull on a schedule or through the Apify API, with no Bet365 account to manage.

**How do I get Bet365 player props as data?**
Pick your leagues (or *All in-season*), optionally add player/stat/team filters, and run. You get one JSON row per prop, ready to export to CSV/Excel or pull via the API. No Bet365 account and no scraping setup required.

**Which sports and leagues are covered?**
NFL, MLB, NBA, NHL, NCAAF, NCAAB, WNBA, 19 global soccer leagues, ATP/WTA tennis, AFL, NRL, and cricket. Anything else is reachable through the free-text **Other leagues** field. Coverage tracks the sports calendar.

**What odds formats are included?**
Decimal, American, and fractional: all three on every prop. No conversion or extra calls needed.

**Can I compare Bet365 props to PrizePicks or Underdog?**
Yes. Field names are aligned to the [PrizePicks](https://apify.com/zen-studio/prizepicks-player-props) and [Underdog](https://apify.com/zen-studio/underdog-player-props) actors. Merge on `player_name + stat + line` to line-shop the sportsbook price against the DFS pick.

**What's a prop line versus an anytime market?**
Over/under markets (Passing Yards, Points, Total Bases) carry a `line` and both `over_*` and `under_*` odds. Anytime markets (Touchdown Scorers, Home Runs, Goalscorers) carry a single price and no line. Both come through in the same run.

**How often do the lines update?**
Bet365 moves lines continuously, especially close to kickoff. Schedule runs every hour or two on game day for a fresh board; each row's `updated_at` tells you when it was captured.

**Do you provide historical lines?**
No. Each run captures the board as it stands right now. Schedule recurring runs and keep the datasets to build your own history.

**Is this affiliated with Bet365?**
No. This actor delivers publicly available betting-market information for research and analytics. It is not affiliated with or endorsed by Bet365.

### Support

Want a league or stat that isn't covered yet, or hit something odd? Open a ticket on the **Issues** tab of the actor page. Need a tailored feed or a higher-volume plan? Reach out through the actor page and we'll help.

### Legal

Delivers publicly available betting-market information for research and analytics. Not affiliated with or endorsed by Bet365. Comply with the laws and terms applicable in your jurisdiction, and confirm sports-betting data use is permitted where you operate.

***

*Bet365 player props as structured JSON. NFL, MLB, NBA, NHL, soccer, tennis, AFL, NRL, and cricket. Over/under and anytime odds in decimal, American, and fractional, one row per prop.*

### More Zen Studio scrapers for sports betting

**🏟️ Sportsbook odds**

- <img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/NWYsOG96fMDy8ycdf-actor-PReplR3mQf3tUpbKG-zUBywwwF1K-bet365-icon_lc6m4t.png" width="16" height="16" style="vertical-align:middle;border-radius:3px"> **Bet365**
  - [Bet365 Real-Time Odds API](https://apify.com/zen-studio/bet365-real-time-odds)
  - [Bet365 Live Scores API](https://apify.com/zen-studio/bet365-live-scores)
  - [Bet365 Sports Data Scraper](https://apify.com/zen-studio/bet365-sports-data)
- <img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/NWYsOG96fMDy8ycdf-actor-oLjv3CSV3BhHm5dGN-62o7r64lQq-fanduel-odds-api-logo.png" width="16" height="16" style="vertical-align:middle;border-radius:3px"> **FanDuel**
  - [FanDuel Odds API](https://apify.com/zen-studio/fanduel-odds)
- <img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/NWYsOG96fMDy8ycdf-actor-W8rOXiLSj8wrgF96k-PQehXxTEV5-draftkings-real-time-api-logo.png" width="16" height="16" style="vertical-align:middle;border-radius:3px"> **DraftKings**
  - [DraftKings Odds API](https://apify.com/zen-studio/draftkings-odds)
- <img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/NWYsOG96fMDy8ycdf-actor-TjShOnNguT17e9hfQ-ntCswWAqze-betmgm-real-time-api-logo-padded.png" width="16" height="16" style="vertical-align:middle;border-radius:3px"> **BetMGM**
  - [BetMGM Odds API](https://apify.com/zen-studio/betmgm-odds)

**🎯 Daily fantasy & player props**

- <img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/NWYsOG96fMDy8ycdf-actor-4AmgQeem8dEgMEiRF-VGffbe665M-prizepicks-scraper-logo.jpeg" width="16" height="16" style="vertical-align:middle;border-radius:3px"> **PrizePicks**
  - [PrizePicks Player Props Scraper](https://apify.com/zen-studio/prizepicks-player-props)
- <img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/NWYsOG96fMDy8ycdf-actor-09TtSjF9Uzs5qfvLc-f9HhMKXsLt-underdog-fantasy-picks-api-logo.png" width="16" height="16" style="vertical-align:middle;border-radius:3px"> **Underdog Fantasy**
  - [Underdog Fantasy Player Props API](https://apify.com/zen-studio/underdog-player-props)
- <img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/NWYsOG96fMDy8ycdf-actor-vZGwNIMCrwkjp76uR-6jWYFxsPSD-sleeper-fantasy-api-logo.jpg" width="16" height="16" style="vertical-align:middle;border-radius:3px"> **Sleeper**
  - [Sleeper Player Props](https://apify.com/zen-studio/sleeper-player-props)
- <img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/NWYsOG96fMDy8ycdf-actor-otCGHYjTnE0YKgVNJ-iYqrcfxJiq-draftkings-pick6-api-logo.png" width="16" height="16" style="vertical-align:middle;border-radius:3px"> **DraftKings Pick6**
  - [DraftKings Pick6 Player Props](https://apify.com/zen-studio/draftkings-pick6-player-props)

# Actor input Schema

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

Leagues to pull player props for. Choose <b>All</b> for every league in season. Not listed? Add it under <b>Other leagues</b>.

## `extraLeagues` (type: `string`):

Any league name not in the list above, comma-separated (e.g. <code>KBO, Serie A</code>). For seasonal or niche competitions.

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

Comma-separated player names to keep. Partial and accent-insensitive (e.g. <code>Mahomes, Judge</code>). Leave empty for all players.

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

Comma-separated stat types to keep (e.g. <code>Passing Yards, Home Runs, Points</code>). Leave empty for all stats.

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

Comma-separated team names to keep. Matches either side of the matchup (e.g. <code>Chiefs, Yankees</code>). Leave empty for all teams.

## `maxGamesPerLeague` (type: `integer`):

Cap the number of games pulled per league (e.g. the next few). Leave at 0 for the full slate.

## `includeAlternateLines` (type: `boolean`):

Also return the alternate line ladder on each market (1+, 2+ and 3+ home runs, or 150 through 350 passing yards) instead of the lowest line only. This multiplies the rows, and the cost, by however deep the ladder goes. Extra rows are marked <code>is\_alternate: true</code>.

## `listLeagues` (type: `boolean`):

Output the built-in league list (the options above) as data, then stop. Ignores all other inputs. No games are fetched and nothing is charged.

## Actor input object example

```json
{
  "leagues": [
    "NFL",
    "MLB"
  ],
  "maxGamesPerLeague": 0,
  "includeAlternateLines": false,
  "listLeagues": 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 = {
    "leagues": [
        "NFL",
        "MLB"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("zen-studio/bet365-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 = { "leagues": [
        "NFL",
        "MLB",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("zen-studio/bet365-player-props").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 '{
  "leagues": [
    "NFL",
    "MLB"
  ]
}' |
apify call zen-studio/bet365-player-props --silent --output-dataset

```

## MCP server setup

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

```

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/cBL36jl8WfC5P7f7v/builds/10imrSLbdE2UiUEYd/openapi.json
