# Action Network Sports Odds Scraper (`jungle_synthesizer/actionnetwork-sports-odds-line-movement-scraper`) Actor

Scrapes multi-sportsbook odds (DraftKings, FanDuel, BetMGM, Caesars, and more) from Action Network's API across NFL, NBA, MLB, NHL, NCAAF, and NCAAB. Returns moneyline, spread, and totals for each game alongside Action Network's public betting volume signal (num\_bets) — all in one normalized schema.

- **URL**: https://apify.com/jungle\_synthesizer/actionnetwork-sports-odds-line-movement-scraper.md
- **Developed by:** [BowTiedRaccoon](https://apify.com/jungle_synthesizer) (community)
- **Categories:** Sports, AI
- **Stats:** 2 total users, 1 monthly users, 50.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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

## Action Network Sports Odds Scraper

Scrapes multi-sportsbook odds from Action Network's API across six US sports leagues (NFL, NBA, MLB, NHL, NCAAF, NCAAB). Returns moneyline, spread, and totals from major sportsbooks (DraftKings, FanDuel, BetMGM, Caesars, and more) side-by-side, along with Action Network's public betting volume signal (`num_bets`) — all in one normalized, flat schema.

### What it does

The actor fetches the Action Network scoreboard for each requested league and flattens the per-sportsbook odds data into individual rows. Each output row represents one game × one sportsbook combination, making it easy to compare lines across books or track line movement over time by scheduling repeat runs.

**Key data points per record:**
- Teams (home and away), game ID, start time, league
- Moneyline odds (home and away)
- Spread (point spread value + juice per side)
- Totals (over/under line + juice per side)
- `num_bets` — Action Network's public betting volume count per game

### Why use this over competitors?

Most betting-odds actors cover a single sportsbook. This actor delivers **multi-book odds in one run** — DraftKings, FanDuel, BetMGM, and Caesars side-by-side — plus Action Network's unique `num_bets` public-money signal. You get the data that arbitrage modelers, sharp bettors, and content sites actually need without stitching together multiple actors.

### Input

| Field | Type | Default | Description |
|-------|------|---------|-------------|
| `leagues` | `string[]` | All 6 leagues | Leagues to fetch. Valid values: `nfl`, `nba`, `mlb`, `nhl`, `ncaaf`, `ncaab` |
| `bookIds` | `string[]` | Top 10 US books | Action Network sportsbook IDs. See table below for the default set |
| `maxItems` | `integer` | `0` (no limit) | Cap on total output records |

#### Default sportsbook IDs

| ID | Book |
|----|------|
| 15 | DraftKings |
| 30 | FanDuel |
| 75 | BetMGM |
| 123 | Caesars |
| 69 | PointsBet |
| 68 | BetRivers |
| 972 | Unibet |
| 71 | WynnBET |
| 247 | BetUS |
| 79 | FoxBet |

### Output

One record per game × sportsbook combination. Fields with no line posted (e.g. a league in pre-season) will be `null` for the odds columns; game metadata (teams, start_time) is always populated.

```json
{
  "game_id": 290288,
  "league": "mlb",
  "start_time": "2026-06-01T22:40:00.000Z",
  "away_team": "Detroit Tigers",
  "home_team": "Tampa Bay Rays",
  "book_id": 15,
  "book_name": "DraftKings",
  "away_moneyline": 145,
  "home_moneyline": -176,
  "spread": 1.5,
  "spread_away_odds": -144,
  "spread_home_odds": 119,
  "total": 8,
  "over_odds": -102,
  "under_odds": -115,
  "num_bets": 5250,
  "source": "https://api.actionnetwork.com/web/v2/scoreboard/mlb?bookIds=15"
}
````

### Usage tips

- **Line movement tracking**: Schedule repeated runs and store results with a timestamp to track how lines move from open to game time.
- **Multi-league single run**: Include multiple leagues in one run to get the full day's slate.
- **Arbitrage scanning**: Filter to games where the same market has favorable odds across two or more books.
- **Off-season behavior**: Leagues in the off-season return scheduled future games — some books post opening lines months in advance. Null odds fields indicate no line is posted yet for that book.

# Actor input Schema

## `sp_intended_usage` (type: `string`):

Please describe how you plan to use the data extracted by this crawler.

## `sp_improvement_suggestions` (type: `string`):

Provide any feedback or suggestions for improvements.

## `sp_contact` (type: `string`):

Provide your email address so we can get in touch with you.

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

Sports leagues to fetch odds for. Valid values: nfl, nba, mlb, nhl, ncaaf, ncaab.

## `bookIds` (type: `array`):

Action Network sportsbook IDs to include. Defaults to the major US books (DraftKings=15, FanDuel=30, BetMGM=75, Caesars=123, PointsBet=69, BetRivers=68, Unibet=972, WynnBET=71, BetUS=247, FoxBet=79).

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

Maximum number of odds records to return. 0 means no limit.

## Actor input object example

```json
{
  "sp_intended_usage": "Describe your intended use...",
  "sp_improvement_suggestions": "Share your suggestions here...",
  "sp_contact": "Share your email here...",
  "leagues": [
    "nfl",
    "nba"
  ],
  "bookIds": [
    "15",
    "30",
    "75",
    "123"
  ],
  "maxItems": 100
}
```

# 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 = {
    "sp_intended_usage": "Describe your intended use...",
    "sp_improvement_suggestions": "Share your suggestions here...",
    "sp_contact": "Share your email here...",
    "leagues": [
        "nfl",
        "nba"
    ],
    "bookIds": [
        "15",
        "30",
        "75",
        "123"
    ],
    "maxItems": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("jungle_synthesizer/actionnetwork-sports-odds-line-movement-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 = {
    "sp_intended_usage": "Describe your intended use...",
    "sp_improvement_suggestions": "Share your suggestions here...",
    "sp_contact": "Share your email here...",
    "leagues": [
        "nfl",
        "nba",
    ],
    "bookIds": [
        "15",
        "30",
        "75",
        "123",
    ],
    "maxItems": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("jungle_synthesizer/actionnetwork-sports-odds-line-movement-scraper").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 '{
  "sp_intended_usage": "Describe your intended use...",
  "sp_improvement_suggestions": "Share your suggestions here...",
  "sp_contact": "Share your email here...",
  "leagues": [
    "nfl",
    "nba"
  ],
  "bookIds": [
    "15",
    "30",
    "75",
    "123"
  ],
  "maxItems": 100
}' |
apify call jungle_synthesizer/actionnetwork-sports-odds-line-movement-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=jungle_synthesizer/actionnetwork-sports-odds-line-movement-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Action Network Sports Odds Scraper",
        "description": "Scrapes multi-sportsbook odds (DraftKings, FanDuel, BetMGM, Caesars, and more) from Action Network's API across NFL, NBA, MLB, NHL, NCAAF, and NCAAB. Returns moneyline, spread, and totals for each game alongside Action Network's public betting volume signal (num_bets) — all in one normalized schema.",
        "version": "0.1",
        "x-build-id": "b0rcmioviLDY59UfV"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/jungle_synthesizer~actionnetwork-sports-odds-line-movement-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-jungle_synthesizer-actionnetwork-sports-odds-line-movement-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/jungle_synthesizer~actionnetwork-sports-odds-line-movement-scraper/runs": {
            "post": {
                "operationId": "runs-sync-jungle_synthesizer-actionnetwork-sports-odds-line-movement-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/jungle_synthesizer~actionnetwork-sports-odds-line-movement-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-jungle_synthesizer-actionnetwork-sports-odds-line-movement-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "leagues",
                    "bookIds"
                ],
                "properties": {
                    "sp_intended_usage": {
                        "title": "What is the intended usage of this data?",
                        "minLength": 1,
                        "type": "string",
                        "description": "Please describe how you plan to use the data extracted by this crawler."
                    },
                    "sp_improvement_suggestions": {
                        "title": "How can we improve this crawler for you?",
                        "minLength": 1,
                        "type": "string",
                        "description": "Provide any feedback or suggestions for improvements."
                    },
                    "sp_contact": {
                        "title": "Contact Email",
                        "minLength": 1,
                        "type": "string",
                        "description": "Provide your email address so we can get in touch with you."
                    },
                    "leagues": {
                        "title": "Leagues",
                        "type": "array",
                        "description": "Sports leagues to fetch odds for. Valid values: nfl, nba, mlb, nhl, ncaaf, ncaab.",
                        "items": {
                            "type": "string"
                        },
                        "default": [
                            "nfl",
                            "nba",
                            "mlb",
                            "nhl",
                            "ncaaf",
                            "ncaab"
                        ]
                    },
                    "bookIds": {
                        "title": "Sportsbook IDs",
                        "type": "array",
                        "description": "Action Network sportsbook IDs to include. Defaults to the major US books (DraftKings=15, FanDuel=30, BetMGM=75, Caesars=123, PointsBet=69, BetRivers=68, Unibet=972, WynnBET=71, BetUS=247, FoxBet=79).",
                        "items": {
                            "type": "string"
                        },
                        "default": [
                            "15",
                            "30",
                            "75",
                            "123",
                            "69",
                            "68",
                            "972",
                            "71",
                            "247",
                            "79"
                        ]
                    },
                    "maxItems": {
                        "title": "Max Items",
                        "type": "integer",
                        "description": "Maximum number of odds records to return. 0 means no limit.",
                        "default": 0
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
