# Action Network Scraper & API (`parsebird/action-network-scraper`) Actor

Scrape Action Network odds for NFL, NBA, MLB, NHL, college, soccer, tennis and UFC: every sportsbook's moneyline, spread and total, public betting splits, expert picks, line movement, props and box scores.

- **URL**: https://apify.com/parsebird/action-network-scraper.md
- **Developed by:** [ParseBird](https://apify.com/parsebird) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.89 / 1,000 games

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

### Action Network Scraper & API

Action Network Scraper & API extracts betting odds, public betting splits, expert picks, line movement, player props and full box scores from [Action Network](https://www.actionnetwork.com) for the NFL, NBA, MLB, NHL, college football and basketball, WNBA, soccer, tennis, UFC and boxing. You don't need an Action Network account or API key.

<table><tr>
<td style="border-left:4px solid #1C1917;padding:12px 16px;font-weight:600">
Get one structured row per game with every selected sportsbook's moneyline, spread and total, ticket and money percentages, no-vig probabilities, best price per side, opening-to-current movement, graded results, expert picks with verified records, and optional full price history, prop boards, standings and injury reports across 21 leagues.
</td>
</tr></table>

##### Copy to your AI assistant

Copy this block into ChatGPT, Claude, Cursor or any other LLM to start using this Actor.

```
Use the Apify Actor "parsebird/action-network-scraper" (Action Network Scraper & API) to get sports betting odds, public betting splits and expert picks from Action Network. Call it with the apify-client package: Python `ApifyClient("<APIFY_TOKEN>").actor("parsebird/action-network-scraper").call(run_input={...})`, or JavaScript `new ApifyClient({ token }).actor('parsebird/action-network-scraper').call({...})`, then read items from the run's default dataset. Every input is optional; empty input returns the current NFL week. Inputs: leagues (array; nfl, ncaaf, nba, ncaab, wnba, ncaaw, mlb, nhl, soccer, epl, laliga, bundesliga, seriea, ligue1, mls, champions, europa, atp, wta, ufc, boxing), date (string YYYY-MM-DD, US Eastern; not allowed with nfl/ncaaf), week (int, NFL/NCAAF), season (int 2015-2030), seasonType ("reg"|"post"|"pre"), gameIds (array of Action Network game IDs), gameUrls (array of game page URLs), gameStatus (array of "upcoming"|"live"|"finished"), teams (array of names or abbreviations), onlyTrending (bool, default false), minBets (int), books (array of sportsbook IDs, default 68,69,75,79,71,123; consensus 15 and open 30 always added), periods (array: event, firsthalf, secondhalf, firstquarter..fourthquarter, firstperiod..thirdperiod, firstinning, firstfiveinnings), maxGames (int), includeExpertPicks (bool, default true), includeLineMovement (bool, default false), includeProps (bool, default false), includeStandings (bool, default false), includeInjuries (bool, default false). Game rows (eventType "game") include gameId, gameUrl, league, season, week, startTime, status, awayTeam, homeTeam, score, consensus (moneyline/spread/total sides with odds, decimalOdds, line, impliedProbability, noVigProbability, ticketPercent, moneyPercent, sharpGap, plus holdPercent), teamTotals, bestPrices, lineMovement, booksPricing, result (winner, againstTheSpread, overUnder), players, playerStats, plays, venue, weather, teamStats, expertPicks, lineMovementHistory, props. Tennis/UFC/boxing rows (eventType "competition") carry competitors instead of teams. Standings and injury rows have recordType "standings" or "injuries". API docs: https://apify.com/parsebird/action-network-scraper/api. Get a token at https://console.apify.com/settings/integrations.
```

### What is Action Network Scraper & API?

**Action Network Scraper & API** turns [Action Network](https://www.actionnetwork.com) game pages and odds screens into clean JSON. Pick the leagues and a date or NFL week, and the Actor returns **every sportsbook's odds**, the **public betting percentages** (share of tickets and share of money on each side), **expert picks** with their records, and the game's **score, box score and play-by-play** in one row per game.

It works as an **Action Network API alternative**. Action Network has no public data API, and this Actor gives you its odds and betting data on a schedule, over the [Apify API](https://docs.apify.com/api/v2), or as a CSV or Excel download. To try it, open the Input tab and click **Start**: the default settings pull a few games from today's slate.

### What can Action Network Scraper & API do?

- 🏈 **21 leagues in one run**: NFL, NCAA Football, NBA, NCAA Basketball (men and women), WNBA, MLB, NHL, the Premier League, La Liga, Bundesliga, Serie A, Ligue 1, MLS, Champions League, Europa League, ATP, WTA, UFC and boxing. The "Soccer (all leagues)" option takes Action Network's combined soccer slate.
- 📊 **Odds from every selected sportsbook**: moneyline, spread, total and team totals per book, for the full game and, if you choose, halves, quarters, hockey periods, the first inning or the first five innings. DraftKings, FanDuel, BetMGM, bet365, BetRivers and Caesars are priced by default, and you can add up to 38 books.
- 👥 **Public betting splits**: ticket % and money % on each side, plus `sharpGap` (money % minus ticket %), which shows where the bigger bets are going.
- 🧮 **Computed fields**: no-vig probabilities, hold and overround for each consensus market, the best available price per side and line, and the move from the opening line to the current line.
- ✅ **Graded results**: the final score by period, with the winner, against-the-spread result and over/under result graded against the consensus closing line.
- 🎯 **Expert picks**: each Action Network expert's pick on the game, with their win/loss record, units won, ROI, current streak and follower count.
- 📈 **Full line history (optional)**: every timestamped price change per sportsbook, back to the opening line.
- 🎲 **Prop boards (optional)**: every player and game prop Action Network lists for the game (for an NFL game, 100+ prop markets such as anytime TD scorer, receiving yards and passing yards), priced across your sportsbooks.
- 🏟️ **Game detail**: rosters, player box score stats, play-by-play with live win probability, lineups, MLB pitching matchups and umpires, venue, game-time weather, injuries, depth charts and team stat sheets, wherever Action Network publishes them.
- 📋 **League reports (optional)**: one standings row and one injury-report row per league.
- ⚙️ **Built for automation**: [schedule runs](https://docs.apify.com/platform/schedules) before kickoff, call the Actor from the [API](https://apify.com/parsebird/action-network-scraper/api), connect it to [Make, Zapier, n8n or Google Sheets](https://apify.com/integrations), and export as JSON, CSV, Excel or HTML.

### What data can you extract from Action Network?

| Field | Description |
|-------|-------------|
| `gameId`, `gameUrl`, `league`, `season`, `week`, `seasonType` | Game identity and a link to the Action Network game page |
| `startTime`, `status`, `statusDetail`, `isLive`, `isComplete` | Kickoff time (UTC) and game state |
| `awayTeam`, `homeTeam` | Team name, abbreviation, logo, colors, conference, division and current record |
| `broadcast`, `attendance`, `totalBets`, `isTrending`, rotation numbers | Game metadata and Action Network's bet count |
| `consensus` | Consensus moneyline, spread and total for each side: odds, decimal odds, line, implied and no-vig probability, ticket %, money %, sharpGap, plus hold % and overround % |
| `teamTotals` | Consensus over/under for each team, de-vigged per team |
| `bestPrices` | Best price per side and line across your sportsbooks, with the book's name |
| `lineMovement` | Opening line and odds compared with the current consensus |
| `booksPricing` | One entry per sportsbook, market, segment and side |
| `score`, `result` | Score by period, timeouts, live situation, latest odds by segment, and the graded result |
| `players`, `playerStats`, `playerSeasonStats`, `lineups` | Rosters with names, box score stats, season stat lines and starting lineups |
| `plays`, `lastPlay` | Play-by-play with score, clock, situation and live win probability |
| `venue`, `weather`, `officials`, `injuries`, `depthCharts`, `teamStats` | Stadium details, forecast, umpires and referees with their betting records, injury notes and team stats |
| `expertPicks` | Expert name, record, units, ROI and their picks on this game |
| `lineMovementHistory` | (optional) Every price change per book with timestamps |
| `props` | (optional) Player and game prop markets with each book's price |
| `competitors` | Tennis, UFC and boxing: both competitors with nationality, handedness and image |

Not every game carries every block. Odds appear once books have priced a game, expert picks once handicappers have posted one, and box score details once the game has started.

### How to scrape Action Network odds and betting data

1. Open [Action Network Scraper & API](https://apify.com/parsebird/action-network-scraper) on Apify Store and click **Try for free**.
2. Under **Leagues**, pick the leagues you want. Leave it empty to get the current NFL week.
3. Choose the games: leave the date empty for today, set a date (YYYY-MM-DD) for other leagues, or set **Week** and **Season** for NFL and NCAA Football. To cover specific games, paste their IDs or URLs instead.
4. If you want to narrow the slate, set **Game status**, **Teams**, **Minimum bet count** or **Maximum games**.
5. Turn on any extras you need: **Full line movement history**, **Player and game props**, **Standings** or **Injury report**.
6. Click **Start**. When the run finishes, download the dataset as JSON, CSV, Excel or HTML, or read it from the [dataset API](https://docs.apify.com/api/v2/dataset-items-get).

### Input parameters

Every field is optional. The [Input tab](https://apify.com/parsebird/action-network-scraper/input-schema) documents each one.

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `leagues` | array | `["nfl"]` | Leagues to cover. Out-of-season leagues return nothing. |
| `date` | string | today | Day to cover, `YYYY-MM-DD` (US Eastern). Not allowed with NFL or NCAA Football, which are scheduled by week. |
| `week` | integer | current | NFL and NCAA Football week. |
| `season` | integer | current | Season year (2015–2030). Used with `week`. |
| `seasonType` | string | current | `reg`, `post` or `pre`. |
| `gameIds` | array | — | Action Network game IDs. Overrides the league and date selection. |
| `gameUrls` | array | — | Action Network game page URLs. Overrides the league and date selection. |
| `gameStatus` | array | all | `upcoming`, `live`, `finished`. |
| `teams` | array | all | Team names or abbreviations (or competitor names for tennis, UFC and boxing). |
| `onlyTrending` | boolean | `false` | Keep only games Action Network flags as trending. |
| `minBets` | integer | — | Skip games with fewer tracked bets. |
| `books` | array | `68, 69, 75, 79, 71, 123` | Sportsbook IDs to price, up to 38. Consensus (15) and Open (30) are always added. |
| `periods` | array | `["event"]` | Game segments to price. The full game is always included. |
| `maxGames` | integer | no limit | Cap on games per run, shared across leagues. |
| `includeExpertPicks` | boolean | `true` | Attach expert picks. No extra charge. |
| `includeLineMovement` | boolean | `false` | Attach every timestamped price change. |
| `includeProps` | boolean | `false` | Attach the full prop board. |
| `includeStandings` | boolean | `false` | Add one standings row per league. |
| `includeInjuries` | boolean | `false` | Add one injury-report row per league. |

#### Sportsbook IDs

The defaults are DraftKings NJ (`68`), FanDuel NJ (`69`), BetMGM NJ (`75`), bet365 NJ (`79`), BetRivers NJ (`71`) and Caesars NJ (`123`). Action Network lists many state-specific feeds. Here are some IDs that returned NFL prices in our tests: Caesars NY `1005`, FanDuel NY `1006`, BetRivers NY `972`, DraftKings MD `1963`, Hard Rock FL `2725`, Fanatics CT `2821`, Fanatics LA `3614`, Kalshi `4727` and Polymarket `4795`. The book's name comes back as `bookName` on every price.

#### Example input

```json
{
    "leagues": ["nfl"],
    "week": 1,
    "season": 2026,
    "seasonType": "reg",
    "gameStatus": ["finished"],
    "includeExpertPicks": true,
    "includeLineMovement": true,
    "includeProps": true,
    "maxGames": 12
}
```

### Output example

Each game is one row. Below is a real row for Patriots at Seahawks (NFL Week 1, 2026). Arrays are trimmed to one item. The full row also contains `players` (94 entries), `plays` (181), `playerStats`, `teamStats`, `leagueInfo`, 42 `booksPricing` entries and 53 experts with 126 picks.

```json
{
    "gameId": 290843,
    "eventType": "game",
    "gameUrl": "https://www.actionnetwork.com/nfl-game/patriots-seahawks-score-odds-september-9-2026/290843",
    "league": "nfl",
    "season": 2026,
    "week": 1,
    "seasonType": "reg",
    "startTime": "2026-09-10T00:20:00.000Z",
    "status": "complete",
    "statusDetail": "Final",
    "awayTeam": { "teamId": 129, "name": "New England Patriots", "abbreviation": "NE", "conference": "AFC", "division": "EAST", "record": { "wins": 4, "losses": 2, "ties": 0 } },
    "homeTeam": { "teamId": 156, "name": "Seattle Seahawks", "abbreviation": "SEA", "conference": "NFC", "division": "WEST", "record": { "wins": 3, "losses": 3, "ties": 0 } },
    "winningTeamId": 156,
    "broadcast": { "network": "NBC/Peacock", "networkShort": "NBC/Peacock" },
    "attendance": 68744,
    "totalBets": 292189,
    "score": {
        "awayScore": 10, "homeScore": 13, "totalPoints": 23,
        "awayFirstHalfPoints": 7, "homeFirstHalfPoints": 0,
        "byPeriod": [{ "period": "1st", "periodName": "1st Quarter", "awayPoints": 0, "homePoints": 0 }]
    },
    "consensus": {
        "moneyline": {
            "sides": [{
                "side": "home", "teamId": 156, "odds": -175, "decimalOdds": 1.5714, "line": 0,
                "impliedProbability": 0.636364, "noVigProbability": 0.615922,
                "ticketPercent": 82, "moneyPercent": 53, "sharpGap": -29
            }],
            "holdPercent": 3.2123,
            "overroundPercent": 3.3189
        },
        "spread": {
            "sides": [{ "side": "home", "teamId": 156, "odds": -110, "line": -3.5, "noVigProbability": 0.5, "ticketPercent": 46, "moneyPercent": 35, "sharpGap": -11 }],
            "holdPercent": 4.5455,
            "overroundPercent": 4.7619
        }
    },
    "bestPrices": {
        "moneyline": [{ "side": "away", "teamId": 129, "odds": 165, "decimalOdds": 2.65, "bookId": 75, "bookName": "BetMGM NJ", "isLive": false }],
        "total": [{ "side": "over", "odds": -108, "line": 44.5, "bookId": 68, "bookName": "DK NJ", "isLive": false }]
    },
    "lineMovement": {
        "moneyline": [{ "side": "home", "teamId": 156, "openingOdds": -210, "currentOdds": -175, "oddsDelta": 35 }],
        "spread": [{ "side": "home", "teamId": 156, "openingLine": -4.5, "currentLine": -3.5, "lineDelta": 1.0, "openingOdds": -107, "currentOdds": -110, "oddsDelta": -3 }]
    },
    "booksPricing": [{
        "bookId": 69, "bookName": "FanDuel NJ", "market": "spread", "period": "event", "side": "away", "teamId": 129,
        "odds": -122, "decimalOdds": 1.8197, "line": 3.5, "impliedProbability": 0.549550,
        "ticketPercent": 54, "moneyPercent": 65, "sharpGap": 11, "deeplinkId": "ML2669500982"
    }],
    "result": { "winner": "home", "againstTheSpread": "away", "overUnder": "under", "spreadMargin": -0.5, "totalLine": 44.5, "totalPoints": 23 },
    "venue": { "name": "Lumen Field", "city": "Seattle, WA", "surface": "grass", "roofType": "outdoor" },
    "plays": [{ "type": "game_over", "period": 4, "clock": "0:00", "homePoints": 13, "awayPoints": 10, "text": "End Game", "homeWinPct": 1 }],
    "expertPicks": [{
        "expertId": 158, "name": "YBK Picks.com", "username": "ybk", "followers": 46365,
        "record": { "window": "last_month", "wins": 38, "losses": 43, "pushes": 1, "unitsNet": -15.57, "roi": -9, "count": 82 },
        "picks": [{ "pickId": 554871770, "play": "NE +3.5", "market": "spread_away", "line": 3.5, "odds": -105, "units": 2, "unitsNet": 1.9048, "result": "win", "isVerified": true }]
    }],
    "lineMovementHistory": null,
    "props": null
}
```

With **Full line movement history** on, `lineMovementHistory` holds one entry per book, market and side, with a `history` array of `{ odds, line, recordedAt, lineStatus }`. With **Player and game props** on, `props` holds `playerProps`, `gameProps`, `propOrder` and `marketRules`. Each prop market carries the player and one `selections` entry per book and side.

Tennis, UFC and boxing rows have `eventType: "competition"`, a `title` such as `"ATP Brussels, Belgium Singles - Round Of 16"` and a `competitors` array in place of teams. Standings and injury rows have `recordType: "standings"` or `"injuries"`, the `league`, an `entryCount`, and the `standings` or `injuries` array.

### Use Action Network Scraper & API from Python or JavaScript

Install the Apify API client ([Python](https://docs.apify.com/api/client/python) or [JavaScript](https://docs.apify.com/api/client/js)) and use your [API token](https://console.apify.com/settings/integrations).

#### Python

```python
from apify_client import ApifyClient

client = ApifyClient("<APIFY_TOKEN>")

run = client.actor("parsebird/action-network-scraper").call(run_input={
    "leagues": ["nba", "nhl"],
    "gameStatus": ["upcoming"],
    "books": [68, 69, 75],
})

for game in client.dataset(run["defaultDatasetId"]).iterate_items():
    ml = (game.get("consensus") or {}).get("moneyline") or {}
    for side in ml.get("sides", []):
        print(game["league"], game["gameId"], side["side"], side["odds"],
              side["ticketPercent"], side["moneyPercent"], side["sharpGap"])
```

#### JavaScript

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: '<APIFY_TOKEN>' });

const run = await client.actor('parsebird/action-network-scraper').call({
    leagues: ['nfl'],
    includeProps: true,
    maxGames: 3,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
for (const game of items) {
    console.log(game.awayTeam?.abbreviation, '@', game.homeTeam?.abbreviation,
        game.props?.playerProps.length ?? 0, 'player props');
}
```

### Use cases

- **Sharp money tracking**: flag games where money % and ticket % split widely (`sharpGap`), and watch for reverse line movement against `lineMovement`.
- **Line shopping**: compare `bestPrices` and `booksPricing` across DraftKings, FanDuel, BetMGM, Caesars and the rest before you place a bet.
- **Betting models and backtests**: pull past weeks back to 2015 with graded `result` fields. Full prices and splits start with the 2024 season.
- **Prop research**: download whole prop boards with each book's price and line in one run.
- **Handicapper tracking**: collect expert picks with records, units and ROI to see who is winning.
- **Dashboards and alerts**: schedule runs every few minutes before kickoff and send changes to Google Sheets, Slack or a database through [integrations](https://apify.com/integrations).

### How it works

1. The Actor reads the slate for each selected league and date or week from Action Network, including prices for the sportsbooks and segments you selected.
2. It applies your filters (status, teams, trending, minimum bets, maximum games) **before** collecting game details, so filtered-out games are never fetched or charged.
3. For each remaining game it collects the box score, play-by-play, rosters and stats. It then attaches expert picks, plus line history and props if you turned them on.
4. It computes consensus summaries, no-vig probabilities, hold, best prices, opening-to-current movement and graded results, and saves one row per game.
5. If you turned them on, it adds one standings row and one injury-report row per league at the end.

### How much does it cost to scrape Action Network?

Action Network Scraper & API uses pay-per-event pricing. Platform usage (compute and data transfer) is included in the event prices, so you are not billed separately for it.

| Event | When it is charged | Free | Bronze | Silver | Gold |
|-------|-------------------|------|--------|--------|------|
| Game | Each game, match or fight saved. Includes every sportsbook's moneyline, spread and total, betting splits, best prices, opening-to-current movement, no-vig probabilities, score, graded result and expert picks | $3.49 / 1,000 | $3.29 / 1,000 | $3.09 / 1,000 | **$2.89 / 1,000** |
| History | Each game whose full line movement history is attached | $3.49 / 1,000 | $3.29 / 1,000 | $3.09 / 1,000 | **$2.89 / 1,000** |
| Prop board | Each game whose prop board is attached | $4.49 / 1,000 | $3.99 / 1,000 | $3.69 / 1,000 | **$3.29 / 1,000** |
| Injury report | Each league injury report saved | $6.99 / 1,000 | $5.99 / 1,000 | $5.49 / 1,000 | **$4.99 / 1,000** |

History and Prop board are only charged when you turn them on and the game actually has that data. Expert picks and standings rows are included at no extra charge.

**Examples (Free plan prices):** a full NFL week of 16 games costs about **$0.06**. The same week with line history and props for every game costs about **$0.18** (16 × ($0.00349 + $0.00349 + $0.00449)). A daily run across the NBA, NHL and MLB with 30 games costs about **$0.10**. To control spend, use `maxGames` and the filters. The run also stops when it reaches the maximum cost per run you set in Apify Console.

### Is it legal to scrape Action Network?

Action Network Scraper & API only collects data that Action Network shows publicly on its website, without logging in. It doesn't access subscriber-only (PRO) content or personal data beyond the public expert profiles that Action Network displays. You should still check that your use of the data complies with Action Network's terms of service and the laws that apply to you, and consult a lawyer if you're unsure. For more background, read Apify's article [Is web scraping legal?](https://blog.apify.com/is-web-scraping-legal/)

### Other sports and betting scrapers from ParseBird

| Actor | What it does |
|-------|--------------|
| [Sports Betting Odds Scraper](https://apify.com/parsebird/sports-betting-odds-scraper) | Moneyline, spread and total odds for 18 leagues, one row per book and outcome |
| [Sports Injury Reports API](https://apify.com/parsebird/sports-injury-reports-api) | NFL, NBA, WNBA, MLB and NHL injury reports with return dates |
| [PrizePicks Scraper](https://apify.com/parsebird/prizepicks-scraper) | PrizePicks player projections and lines |
| [Kalshi Scraper](https://apify.com/parsebird/kalshi-scraper) | Kalshi prediction market data |
| [Polymarket Market Scraper](https://apify.com/parsebird/polymarket-market-scraper) | Polymarket markets, prices and volume |

### FAQ

**Do I need an Action Network account or API key?**
No. The Actor reads the same public data that the Action Network website shows to logged-out visitors.

**How do I get odds for a past NFL week?**
Set `week`, `season` and `seasonType` (for example week 1, season 2025, `reg`) and leave `date` empty. For other leagues, set `date`. Results, box scores and play-by-play go back to 2015. Full sportsbook prices and betting splits are available from the 2024 season. 2023 games carry only the consensus and opening lines, and older games carry results without prices.

**Why is `lineMovementHistory` or `props` empty for some games?**
Action Network removes prop boards once a game is finished, and in our tests line history was dropped about a week after a game ended. Turn these options on for upcoming, live and recently finished games. You are only charged for history or props when the game actually has them. Both options cover team sports. Tennis, UFC and boxing rows still include consensus, best prices and opening-to-current movement.

**Why did my run return no games?**
The league may be out of season, or there may be no games on that date. Check the date (US Eastern) or week, or loosen `gameStatus`, `teams`, `onlyTrending` and `minBets`.

**Why does the run stop when I set a date with the NFL?**
NFL and NCAA Football are scheduled by week. To avoid returning the wrong week, the Actor stops and asks you to use `week` and `season` instead. Run date-based leagues in a separate run.

**What does `sharpGap` mean?**
It is money % minus ticket %. A positive value means a side is drawing a bigger share of the money than of the bets, which usually means larger bets are on that side.

**How is the best price chosen?**
For each side, the Actor compares the selected sportsbooks' prices at each line and keeps the one with the lowest implied probability, which is the best payout. Pre-game and in-play prices are kept apart (`isLive`).

**Is the team record the record at game time?**
No. `awayTeam.record` and `homeTeam.record` are the teams' current records as Action Network shows them now.

**Can I run it on a schedule or connect it to other tools?**
Yes. Use [Apify schedules](https://docs.apify.com/platform/schedules), call it from the [API](https://apify.com/parsebird/action-network-scraper/api), or connect it to Make, Zapier, n8n, Google Sheets, Slack or a webhook through [integrations](https://apify.com/integrations).

**Something is missing or wrong. What should I do?**
Open an issue in the [Issues tab](https://apify.com/parsebird/action-network-scraper/issues). We read every report.

# Changelog

This Actor's version history is a separate document: https://apify.com/parsebird/action-network-scraper/changelog.md

# Actor input Schema

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

Pick the leagues to cover. Out-of-season leagues return nothing. ATP, WTA, UFC and Boxing return one row per match or fight, with the two competitors instead of teams. Soccer (all leagues) is Action Network's combined soccer slate; a fixture reached both through it and through a single league is collected and charged once.

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

Enter the day to cover (YYYY-MM-DD, US Eastern). Leave empty for today. Leave it empty for NFL and NCAA Football, which are scheduled by week: a date combined with either of them stops the run instead of returning the wrong week.

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

Enter the week number. Only NFL and NCAA Football are scheduled by week; every other league uses the date. Regular season runs 1-18, postseason 1-4, preseason 1-3, and a week outside its range returns nothing. Leave empty for the current week. Without a season, the current season is used.

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

Enter the season year, for example 2025. Used with the week for NFL and NCAA Football. Results, box scores and play-by-play reach back to 2015. Full sportsbook pricing and betting splits start with the 2024 season; 2023 carries only the consensus and opening lines, and earlier seasons carry results without prices. A season without a week returns the week that matches today's date in that season.

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

Pick regular season, postseason or preseason. Used with the week for NFL and NCAA Football.

## `gameIds` (type: `array`):

Add Action Network game IDs (the number at the end of a game page URL) to cover only those games. Overrides the league and date selection. Works for team sports; tennis, UFC and boxing are reached through their league.

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

Paste Action Network game page links instead of IDs. Overrides the league and date selection.

## `gameStatus` (type: `array`):

Keep only games in these states. Leave empty for all.

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

Keep only games involving these teams. Enter names or abbreviations (Patriots, NE, Boston Bruins). For tennis, UFC and boxing, enter a competitor's name.

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

Keep only games Action Network flags as trending.

## `minBets` (type: `integer`):

Skip games with fewer bets tracked by Action Network than this. Useful for ignoring thin markets.

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

Enter Action Network sportsbook IDs to price. Leave empty for the majors: DraftKings 68, FanDuel 69, BetMGM 75, bet365 79, BetRivers 71, Caesars 123. The consensus (15) and opening (30) lines are always included, so betting splits and line movement never go missing. See the README for more book IDs.

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

Pick the segments to price. The full game is always included. Halves and quarters apply to football and basketball, periods to hockey, innings to baseball and halves to soccer.

## `maxGames` (type: `integer`):

Stop after this many games, matches or fights. The cap is shared across the selected leagues, earliest start first in each league. Leave empty for no limit.

## `includeExpertPicks` (type: `boolean`):

Attach expert selections on each game with their win/loss record, units and ROI. Included at no extra charge.

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

Add every timestamped price change per sportsbook, back to the opening line. Opening and current prices are always included without this. Available for upcoming, live and recently finished team games; charged per game that has history.

## `includeProps` (type: `boolean`):

Add the full prop board per game across the selected sportsbooks. Props are listed until a game is finished. Adds a lot of data (100+ prop markets per NFL game), so expect longer runs; charged per game that has props.

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

Add one row per league with the current league table, including against-the-spread and over/under records. Leagues without a published table (most soccer leagues, tennis, UFC, boxing) add no row.

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

Add one row per league with the current injury report. Leagues with no listed injuries add no row and are not charged.

## Actor input object example

```json
{
  "leagues": [
    "nfl",
    "nba",
    "nhl",
    "mlb",
    "soccer"
  ],
  "onlyTrending": false,
  "maxGames": 5,
  "includeExpertPicks": true,
  "includeLineMovement": false,
  "includeProps": false,
  "includeStandings": false,
  "includeInjuries": false
}
```

# Actor output Schema

## `dataset` (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",
        "nba",
        "nhl",
        "mlb",
        "soccer"
    ],
    "maxGames": 5
};

// Run the Actor and wait for it to finish
const run = await client.actor("parsebird/action-network-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 = {
    "leagues": [
        "nfl",
        "nba",
        "nhl",
        "mlb",
        "soccer",
    ],
    "maxGames": 5,
}

# Run the Actor and wait for it to finish
run = client.actor("parsebird/action-network-scraper").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",
    "nba",
    "nhl",
    "mlb",
    "soccer"
  ],
  "maxGames": 5
}' |
apify call parsebird/action-network-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,parsebird/action-network-scraper"
        }
    }
}
```

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/ZK9gMNFXMg9pU3uIA/builds/dybtLMrYhInmQlzJs/openapi.json
