# Betting Odds, Public Splits & Props Tracker (`scrapermaster/betting-odds-splits-tracker`) Actor

Track sportsbook lines with public betting percentages across NFL, NBA, MLB, NHL, college sports, soccer, UFC and tennis. Optional line history, props, injuries, weather and standings.

- **URL**: https://apify.com/scrapermaster/betting-odds-splits-tracker.md
- **Developed by:** [Scraper Master](https://apify.com/scrapermaster) (community)
- **Categories:** Automation, Integrations
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.56 / 1,000 game rows

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

## Betting Odds, Public Splits & Props Tracker

A single run returns the games you ask for with sportsbook prices and how the public is betting. Turn on the extras you need and leave the rest off to keep runs lean.

### Coverage

Leagues: NFL, NBA, MLB, NHL, college football and basketball, WNBA, soccer, UFC and tennis. Sportsbooks are selectable, and a consensus line is included.

### Core output (one row per game and period)

- teams, start time and status
- spread, total and moneyline per sportsbook
- bet percentages and money percentages (the gap between them is the "sharp gap")
- bet count

### Optional add-ons

Switch on only what you need:

- **Line movement** - every price posted per sportsbook, with timestamps
- **Player props** and **game props**
- **Rosters, depth charts and trends**
- **Weather and venue**
- **Injury reports**
- **Standings and ATS records**
- **Futures markets** - extra rows for season-long markets

### Filtering

Narrow results before they are written: `teams`, `gameStatus`, `startsAfter` / `startsBefore`, `minNumBets`, `minSharpGap`, `onlyTrending`, `onlyWithOdds`. Use `sortBy` so a small run keeps the games that matter.

#### Example input

```json
{
  "leagues": ["nfl"],
  "week": 6,
  "seasonType": "reg",
  "books": ["draftkings", "fanduel"],
  "minSharpGap": 10,
  "includeInjuries": true,
  "maxItems": 50
}
```

### Notes

- Add-ons are billed separately from the base game row, so disabled options cost nothing.
- The free plan returns a limited preview.

### Support

Open an issue with your input JSON and run ID if a league or market looks incomplete.

# Actor input Schema

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

Which league slates to read. Each league is one scoreboard request per period. Leave empty for NFL.

## `gameUrls` (type: `array`):

Action Network game URLs or numeric game IDs. When set, only these games are kept out of their league's slate. Example: https://www.actionnetwork.com/nfl/bills-vs-chiefs-odds/290857

## `date` (type: `string`):

Slate date as YYYY-MM-DD, for the date-scheduled leagues (MLB, NBA, NHL, WNBA, NCAAB, soccer). Ignored by NFL and NCAAF, which are addressed by week.

## `week` (type: `integer`):

Week number, for NFL and NCAAF. Combine with Season type. Leave empty for the current week.

## `seasonType` (type: `string`):

Which part of the season the week belongs to. Only used with Week.

## `season` (type: `integer`):

Season year, for pulling a past slate. Results and box scores go back to 2015; sportsbook prices start filling in around 2023 and are complete from 2024.

## `periods` (type: `array`):

Which segment of the game to price. Each period is a separate row per game and a separate scoreboard request. Not every league posts every period.

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

Which sportsbooks to price the game at. The Action Network consensus line and the opening line are always included — they carry the public betting splits and the line-movement baseline.

## `extraBookIds` (type: `string`):

Comma-separated Action Network book IDs for sportsbooks not in the list above, e.g. state-specific skins. Added to whatever the picker selects.

## `gameStatus` (type: `string`):

Keep only games in this state. Filters run before anything optional is bought, so a filtered-out game costs nothing.

## `teams` (type: `array`):

Keep only games involving one of these teams. Matches team name or abbreviation, case-insensitive, e.g. "Chiefs" or "KC".

## `startsAfter` (type: `string`):

Keep only games starting at or after this moment. YYYY-MM-DD or a full ISO timestamp.

## `startsBefore` (type: `string`):

Keep only games starting at or before this moment. YYYY-MM-DD or a full ISO timestamp.

## `minNumBets` (type: `integer`):

Keep only games with at least this many bets placed through Action Network. A rough handle proxy for filtering out dead games.

## `minSharpGap` (type: `integer`):

Keep only games where money percentage exceeds ticket percentage by at least this much on some side — the classic sign that the dollars disagree with the crowd. Try 15.

## `onlyTrending` (type: `boolean`):

Keep only games Action Network flags as trending.

## `onlyWithOdds` (type: `boolean`):

Drop games where no sportsbook has posted a line for the chosen period yet.

## `sortBy` (type: `string`):

Order rows before the item cap is applied, so a small run keeps the games you care about.

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

Cap on game rows written. Futures rows are counted separately.

## `includeLineMovement` (type: `boolean`):

Every price each sportsbook posted on the game's core markets, with the timestamp of each move. One extra request per market on the game.

## `includePlayerProps` (type: `boolean`):

Passing, rushing, receiving, strikeout, hits, points, rebounds and assists markets with every book's price. One extra request per game.

## `includeGameProps` (type: `boolean`):

Team totals, alternate lines, race-to markets and novelty props. Shares the same request as player props when both are on.

## `includeGameDetail` (type: `boolean`):

Full player list, depth charts, situational trends, team stat rankings and the last five head-to-head meetings. One extra request per game.

## `includeWeather` (type: `boolean`):

Hourly forecast around kickoff plus the venue's surface and roof type. One request per league, shared by every game in it.

## `includeInjuries` (type: `boolean`):

Both teams' injury lists with status, description and whether the player is a starter. One request per league, shared by every game in it.

## `includeStandings` (type: `boolean`):

Straight-up, against-the-spread, over/under and unit records overall, at home, on the road, as favourite and as underdog. One request per league.

## `includeFutures` (type: `boolean`):

Season-long markets as extra rows: championship and division odds, win totals, award races and player milestones. One request per futures market in the league.

## Actor input object example

```json
{
  "leagues": [
    "nfl"
  ],
  "date": "2026-09-13",
  "periods": [
    "event"
  ],
  "books": [
    "draftkings",
    "fanduel",
    "betmgm",
    "caesars",
    "bet365"
  ],
  "extraBookIds": "2724,4693",
  "gameStatus": "any",
  "startsAfter": "2026-09-13T17:00:00Z",
  "startsBefore": "2026-09-14",
  "onlyTrending": false,
  "onlyWithOdds": false,
  "sortBy": "startTime",
  "maxItems": 100,
  "includeLineMovement": false,
  "includePlayerProps": false,
  "includeGameProps": false,
  "includeGameDetail": false,
  "includeWeather": false,
  "includeInjuries": false,
  "includeStandings": false,
  "includeFutures": false
}
```

# Actor output Schema

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

Every game row with its per-book lines, betting splits and computed market signals

## `summary` (type: `string`):

Row count, leagues, periods and request count for this run

# 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"
    ],
    "periods": [
        "event"
    ],
    "books": [
        "draftkings",
        "fanduel",
        "betmgm",
        "caesars",
        "bet365"
    ],
    "maxItems": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapermaster/betting-odds-splits-tracker").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"],
    "periods": ["event"],
    "books": [
        "draftkings",
        "fanduel",
        "betmgm",
        "caesars",
        "bet365",
    ],
    "maxItems": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("scrapermaster/betting-odds-splits-tracker").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"
  ],
  "periods": [
    "event"
  ],
  "books": [
    "draftkings",
    "fanduel",
    "betmgm",
    "caesars",
    "bet365"
  ],
  "maxItems": 100
}' |
apify call scrapermaster/betting-odds-splits-tracker --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,scrapermaster/betting-odds-splits-tracker"
        }
    }
}
```

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/Kcbz3f56ZPvOFluXA/builds/zaDMnmm1a50jZORim/openapi.json
