# Action Network Odds & Public Betting Scraper (`confidential_gnat/action-network-odds-scraper`) Actor

Scrapes sportsbook odds, public betting splits, opening lines, line movement, sharp-money signals, arbitrage and middles, player props, weather, injuries, futures and ATS standings for NFL, NBA, MLB, NHL, college, soccer and more from Action Network.

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

## Pricing

from $1.50 / 1,000 results

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 Odds & Public Betting Scraper

**Scrape sportsbook odds and public betting data from Action Network (actionnetwork.com)**: consensus and opening lines, tickets vs money splits, line movement, sharp-money signals, best prices across books, final scores, player props, weather, injuries, futures and ATS standings. Export as JSON, CSV or Excel, or call it as an **API**. Choose a league, press Start.

**Target website:** [Action Network (actionnetwork.com)](https://www.actionnetwork.com)

### ✨ Features of this Action Network odds scraper

- **Odds extraction** — moneyline, spread and total for every game, from the consensus, the opening line and up to seven sportsbooks (DraftKings, FanDuel, BetMGM, Caesars, bet365, BetRivers, Unibet), with hold and no-vig win probability.
- **Public betting splits** — percentage of tickets and percentage of money on each side, plus the gap between them as a sharp-money indicator.
- **Betting signals** — reverse line moves, steam moves, cross-book arbitrage and middles, flagged per game.
- **Line movement and snapshots** — movement since the open, and with a snapshot name, movement since your previous scheduled run.
- **Graded results** — final score, winner, against-the-spread and over/under result and closing line value for finished games.
- **Optional detail blocks** — player props, venue and weather, injuries and team stats.
- **Futures, injuries and standings** — championship and award markets, the league injury report and ATS / over-under records.
- **Alerts** — post flagged games to a Slack, Discord or custom webhook.
- **Filtering** — by league, date or week, game status, team, minimum bets and minimum sharp-money gap.
- **Proxy support** — configurable, off by default.
- **No browser required** — fast and cheap runs.

### 🚀 How to scrape Action Network odds in 5 steps

1. [Sign up](https://apify.com/sign-up) for a free Apify account — includes **$5 monthly credit**.
2. Open the actor page and click **Try for free**.
3. Pick one or more **leagues** (or paste a league page such as `https://www.actionnetwork.com/nfl/odds`).
4. Click **Start** and wait for the run to complete.
5. Download results from the **Output** tab in JSON, CSV, or Excel format.

You can also run this actor via the [Apify API](https://docs.apify.com/api/v2) or integrate it directly into your workflows using [Zapier](https://zapier.com/apps/apify), [Make](https://www.make.com/), or [n8n](https://n8n.io/).

### 💰 Pricing

This actor uses **pay-per-event** billing: a charge for each result saved, plus a small extra charge for each game enriched with props, weather, injuries or team stats.

- New Apify accounts include **$5 of free monthly credit**.
- It uses plain HTTP requests, so it costs significantly less to run than browser-based scrapers.
- Proxies are off by default, which keeps runs cheapest.

### 🔧 Input configuration

| Field | Type | Required | Default | Description |
| ----- | ---- | -------- | ------- | ----------- |
| Data to scrape | string | — | games | games, futures, injuries or standings. |
| League page URLs | array | — | NFL odds page | League pages like `/nfl/odds`; the league is read from the URL. |
| Leagues | array | — | nfl | NFL, NBA, MLB, NHL, NCAA football and basketball, WNBA, CFL, MLS, Premier League, La Liga, Bundesliga, Serie A, Ligue 1. |
| Dates | array | — | current slate | YYYY-MM-DD, for all leagues except NFL and NCAA football. |
| Weeks | array | — | current week | Week numbers for NFL and NCAA football. |
| Sportsbooks | array | — | DraftKings, FanDuel, BetMGM | Books included in per-book odds. Consensus and opening lines are always included. |
| Game status | string | — | all | all, upcoming, live or finished. |
| Teams | array | — | — | Team names or abbreviations to keep. |
| Minimum bets | integer | — | 0 | Skip games with fewer tracked bets. |
| Minimum sharp money gap (%) | integer | — | 0 | Keep games where money share beats ticket share by this many points. |
| Include venue & weather | boolean | — | false | Adds venue, roof and weather. |
| Include game injuries | boolean | — | false | Adds both teams' injury report. |
| Include team stats | boolean | — | false | Adds season team stats. |
| Include player props | boolean | — | false | Adds prop lines per player. |
| Prop types | array | — | first three per sport | For example passing_yards, anytime_td, points, strikeouts. |
| Futures markets | array | — | first market | Words from the market name, for example Superbowl or MVP. |
| Snapshot name | string | — | — | Enables changeSinceLastRun across scheduled runs. |
| Alert webhook URL | string | — | — | Receives flagged games as a JSON POST. |
| Alert on | array | — | reverse line move, steam, arbitrage | Also middle, sharp gap and line moved since last run. |
| Alert: minimum line move | number | — | 1 | Points since the last run. |
| Alert: minimum sharp gap (%) | integer | — | 20 | Money minus tickets. |
| Max items per league | integer | — | 5 | Cap per league. |
| Proxy configuration | object | — | no proxy | Enable only if requests are blocked. |

![Action Network odds scraper input form with the league page URL, leagues and sportsbooks fields marked 1, 2 and 3](https://i.postimg.cc/wMg7XzGP/image.png)

The numbered markers in the screenshot show the three fields most runs need:

1. **League page URLs** — paste an Action Network league page such as `https://www.actionnetwork.com/nfl/odds`. The league is read from the URL.
2. **Leagues** — or pick leagues directly (for example `nfl`, `nba`). Fields 1 and 2 are combined, so you can use either or both.
3. **Sportsbooks** — the books whose odds are listed for each game (DraftKings, FanDuel and BetMGM by default). Consensus and opening lines are always included.

Leave **Dates** and **Weeks** empty to scrape the current slate.

![Action Network odds scraper input form with the minimum bets, sharp money gap and optional detail checkboxes marked 1 to 6](https://i.postimg.cc/NM4gwHdd/image.png)

The numbered markers in this screenshot show the filters and optional detail blocks:

1. **Minimum bets** — skip games with fewer tracked bets than this number. Leave at 0 to keep every game.
2. **Minimum sharp money gap (%)** — keep only games where, on some side, the share of money beats the share of tickets by at least this many percentage points.
3. **Include venue & weather** — adds the stadium, roof type and game-time weather to each game.
4. **Include game injuries** — adds the injury report for both teams to each game.
5. **Include team stats** — adds season team stats for both teams to each game.
6. **Include player props** — adds player prop lines (consensus, opening and per sportsbook). Choose which ones in **Prop types**, for example `passing_yards` or `anytime_td`.

Options 3 to 6 are billed as a game-details event for each game they enrich.

**Supported URL types:**

- `https://www.actionnetwork.com/nfl/odds` and the same page for any supported league (`/nba/odds`, `/mlb/odds`, `/nhl/odds`, `/ncaaf/odds`, ...)

### 📦 Action Network odds scraper output data

The dataset is JSON, one record per game, with the keys `gameId`, `league`, `status`, `startTime`, `season`, `week`, `network`, `totalBets`, `away`, `home`, `winner`, `consensus`, `opening`, `lineMovement`, `publicBetting`, `sharpMoneyGaps`, `maxSharpMoneyGap`, `impliedProbability`, `bestOdds`, `signals`, `arbitrage`, `middles`, `result`, `closingLineValue`, `changeSinceLastRun`, `books` and `scrapedAt`, plus `details` and `props` when switched on. Futures, injuries and standings runs return their own record shapes.

There are 4 dataset views: **Games** (lines, bets and signals), **Futures** (outright prices), **Injuries** (league injury report) and **Standings** (records with ATS and over/under).

**Output at a glance:**

| League | Game | Date | Home spread | Total | Bets | Max sharp gap |
| ------ | ---- | ---- | ----------- | ----- | ---- | ------------- |
| NBA | BKN @ CHA | 2026-10-06 | -5.5 | 211.5 | 353 | 24 |
| NBA | NOP @ OKC | 2026-10-07 | -3.5 | 222.5 | 419 | 10 |

**Sample output (raw JSON):**

```json
[
  {
    "gameId": 295971,
    "league": "nba",
    "status": "scheduled",
    "statusDisplay": null,
    "startTime": "2026-10-06T23:00:00.000Z",
    "season": 2026,
    "seasonType": "pre",
    "week": null,
    "network": "NBA TV",
    "totalBets": 353,
    "away": {
      "id": 165,
      "name": "Brooklyn Nets",
      "abbr": "BKN",
      "logo": "https://static.sprtactn.co/teamlogos/nba/100/bkn.png",
      "record": "0-0",
      "rotationNumber": 555,
      "score": null
    },
    "home": {
      "id": 158,
      "name": "Charlotte Hornets",
      "abbr": "CHA",
      "logo": "https://static.sprtactn.co/teamlogos/nba/100/cha.png",
      "record": "0-0",
      "rotationNumber": 556,
      "score": null
    },
    "winner": null,
    "consensus": {
      "moneyline": {
        "away": 170,
        "home": -205,
        "draw": null,
        "hold": 0.0425
      },
      "spread": {
        "awayLine": 5.5,
        "awayOdds": -108,
        "homeLine": -5.5,
        "homeOdds": -113,
        "hold": 0.0497
      },
      "total": {
        "line": 211.5,
        "overOdds": -117,
        "underOdds": -115,
        "hold": 0.0741
      }
    },
    "opening": {
      "moneyline": {
        "away": 164,
        "home": -205,
        "draw": null,
        "hold": 0.0509
      },
      "spread": {
        "awayLine": 4.5,
        "awayOdds": -100,
        "homeLine": -4.5,
        "homeOdds": -122,
        "hold": 0.0495
      },
      "total": {
        "line": 211.5,
        "overOdds": -112,
        "underOdds": -112,
        "hold": 0.0566
      }
    },
    "lineMovement": {
      "spreadHome": -1,
      "total": 0,
      "moneylineAway": 6,
      "moneylineHome": 0
    },
    "publicBetting": {
      "moneyline": {
        "awayTickets": 16,
        "homeTickets": 84,
        "awayMoney": 40,
        "homeMoney": 60
      },
      "spread": {
        "awayTickets": 43,
        "homeTickets": 57,
        "awayMoney": 57,
        "homeMoney": 43
      },
      "total": {
        "overTickets": 71,
        "underTickets": 29,
        "overMoney": 51,
        "underMoney": 49
      }
    },
    "sharpMoneyGaps": {
      "moneylineAway": 24,
      "moneylineHome": -24,
      "spreadAway": 14,
      "spreadHome": -14,
      "totalOver": -20,
      "totalUnder": 20
    },
    "maxSharpMoneyGap": 24,
    "impliedProbability": {
      "away": 0.3553,
      "home": 0.6447
    },
    "bestOdds": {
      "moneylineAway": {
        "odds": 170,
        "book": "DraftKings"
      },
      "moneylineHome": {
        "odds": -205,
        "book": "DraftKings"
      },
      "spreadAway": {
        "odds": -105,
        "book": "FanDuel"
      },
      "spreadHome": {
        "odds": -115,
        "book": "FanDuel"
      },
      "totalOver": {
        "odds": -110,
        "book": "DraftKings"
      },
      "totalUnder": {
        "odds": -110,
        "book": "DraftKings"
      }
    },
    "books": [
      {
        "book": "DraftKings",
        "moneyline": {
          "away": 170,
          "home": -205,
          "draw": null,
          "hold": 0.0425
        },
        "spread": {
          "awayLine": 7.5,
          "awayOdds": -115,
          "homeLine": -7.5,
          "homeOdds": -105,
          "hold": 0.0471
        },
        "total": {
          "line": 211.5,
          "overOdds": -110,
          "underOdds": -110,
          "hold": 0.0476
        }
      },
      {
        "book": "FanDuel",
        "moneyline": {
          "away": 164,
          "home": -205,
          "draw": null,
          "hold": 0.0509
        },
        "spread": {
          "awayLine": 5.5,
          "awayOdds": -105,
          "homeLine": -5.5,
          "homeOdds": -115,
          "hold": 0.0471
        },
        "total": {
          "line": 212.5,
          "overOdds": -112,
          "underOdds": -112,
          "hold": 0.0566
        }
      }
    ],
    "scrapedAt": "2026-10-06T14:55:26.539Z",
    "signals": [],
    "arbitrage": [],
    "middles": [
      {
        "market": "spread",
        "windowPoints": 2,
        "legs": [
          {
            "book": "DraftKings",
            "side": "away",
            "odds": -115,
            "line": 7.5
          },
          {
            "book": "FanDuel",
            "side": "home",
            "odds": -115,
            "line": -5.5
          }
        ]
      },
      {
        "market": "total",
        "windowPoints": 1,
        "legs": [
          {
            "book": "DraftKings",
            "side": "over",
            "odds": -110,
            "line": 211.5
          },
          {
            "book": "FanDuel",
            "side": "under",
            "odds": -112,
            "line": 212.5
          }
        ]
      }
    ],
    "result": null,
    "closingLineValue": null,
    "changeSinceLastRun": null
  }
]
```

### 🐍 How to scrape Action Network with Python, JavaScript or the API

Run the actor programmatically with the official Apify clients. Replace `<YOUR_API_TOKEN>` with the token from your [Apify Console](https://console.apify.com/account/integrations).

**Python** (`pip install apify-client`):

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_API_TOKEN>")

run = client.actor("confidential_gnat/action-network-odds-scraper").call(run_input={
    "leagues": ["nfl", "nba"],
    "books": ["draftkings", "fanduel"],
    "maxItems": 10,
})

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)
```

**JavaScript** (`npm install apify-client`):

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: '<YOUR_API_TOKEN>' });

const run = await client.actor('confidential_gnat/action-network-odds-scraper').call({
    leagues: ['nfl', 'nba'],
    books: ['draftkings', 'fanduel'],
    maxItems: 10,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

**cURL** — start a run and wait for the dataset:

```bash
curl -X POST "https://api.apify.com/v2/acts/confidential_gnat~action-network-odds-scraper/run-sync-get-dataset-items?token=<YOUR_API_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"leagues": ["nfl", "nba"], "books": ["draftkings", "fanduel"], "maxItems": 10}'
```

### 💡 What you can use Action Network odds data for

- Line shopping and arbitrage detection across sportsbooks
- Tracking public betting percentages against line movement to spot sharp money
- Building betting models with opening, closing and graded results
- Daily alerts on reverse line moves and steam
- Futures and player-prop price comparison for content and research

Sports bettors, analysts, tipster sites, sports media and fintech or odds-comparison teams typically use this data.

### ⚠️ Limitations & known issues

- **Soccer leagues** — Premier League, La Liga, Bundesliga, Serie A and Ligue 1 return games only when matches are on the schedule.
- **Tennis, UFC and boxing** — not supported.
- **Finished games** — sportsbook lines are usually gone once a game is final; only the consensus and opening lines remain.
- **Player futures** — player-based futures return a player id, not a name.
- **Public splits** — splits come from Action Network's consensus feed and are the same for every book.

### ❓ Frequently asked questions

#### Can I scrape Action Network legally?

The actor only collects data already publicly visible on actionnetwork.com — no login, paywall or private content is accessed. Scraping publicly available data is generally considered lawful (see *hiQ Labs v. LinkedIn*), but you are responsible for complying with the site's Terms of Service and applicable laws.

#### What data does the Action Network scraper return?

Per game: teams, records, scores, consensus and opening odds, public ticket and money splits, line movement, best prices, betting signals and per-book odds. Optional blocks add player props, weather, injuries and team stats.

#### How many games can I scrape from one league?

`maxItems` limits the games saved for each league, not the whole run. The default is 5.

#### Do I need a proxy to scrape actionnetwork.com?

No. Proxies are off by default and runs work without one. Turn on a proxy only if you see blocked requests.

#### How do I scrape Action Network with Python?

Use the Python example above and iterate over the dataset items returned by the run.

#### Can I run this Action Network scraper on a schedule?

Yes, with Apify Schedules. Set the same **Snapshot name** on every scheduled run and each game gets `changeSinceLastRun`, showing how its lines moved since the last run. Add an alert webhook to be notified of reverse line moves, steam or arbitrage.

#### What output formats are supported?

JSON, CSV, Excel, XML and RSS, either from the **Output** tab or through the Apify API.

#### What are reverse line moves and steam?

A reverse line move is when most tickets are on one side but the line moves toward the other. Steam is when the share of money runs well ahead of the share of tickets on a side and the line moves toward it.

### 🔗 Other actors you may find useful

| Actor | Description |
| ----- | ----------- |
| [🎟️ Gametime Events Website Scraper](https://apify.com/confidential_gnat/gametime-events-scraper) | Collects event listings, ticket availability, and pricing data from Gametime. |
| [📈 Nasdaq Short Interest Scraper](https://apify.com/confidential_gnat/nasdaq-short-interest-scraper) | Scrapes short interest history for any Nasdaq-listed stock or ETF from nasdaq.com. |
| [📰 Google News AI Scraper](https://apify.com/confidential_gnat/google-news-ai-scraper) | Searches Google News by keyword with optional full article text and AI summaries. |
| [✈️ Kiwi Flight Scraper](https://apify.com/confidential_gnat/kiwi-flight-scraper) | Scrapes flight prices, schedules and layovers from Kiwi.com. |
| [🚗 Cheapest Cars & Bids Scraper](https://apify.com/confidential_gnat/cheapest-carsandbids-scraper) | Scrapes the cheapest vehicle listings from Cars & Bids to find best-value auction deals. |

### 💬 Support & contact

If you encounter any issues or have questions, please [open an issue](https://apify.com/confidential_gnat/action-network-odds-scraper/issues/open).

You can also find more of our actors on the [Actor Flow](https://apify.com/confidential_gnat) page.

# Actor input Schema

## `dataType` (type: `string`):

Games = odds, public betting and signals. Futures = outright markets (championship, MVP, win totals). Injuries = league injury report. Standings = records including against-the-spread and over/under.

## `startUrls` (type: `array`):

Optional Action Network league pages, e.g. https://www.actionnetwork.com/nfl/odds. The league is read from the URL.

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

Leagues to scrape. Combined with any league taken from the URLs above.

## `dates` (type: `array`):

Dates (YYYY-MM-DD) to scrape for date-based leagues (everything except NFL and NCAA Football). Leave empty for the current slate.

## `weeks` (type: `array`):

Week numbers for NFL and NCAA Football. Leave empty for the current week.

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

Sportsbooks to include in the per-book odds. Consensus (public splits) and opening lines are always included.

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

Keep only games in this state.

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

Keep only games (or injury reports) involving one of these teams (name or abbreviation, e.g. Cowboys, DAL).

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

Skip games with fewer tracked bets than this.

## `minSharpMoneyGap` (type: `integer`):

Keep only games where, on some side, the share of money exceeds the share of tickets by at least this many percentage points.

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

Adds venue, roof type and game-time weather to each game. Billed as a game-details event.

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

Adds the injury report for both teams to each game. Billed as a game-details event.

## `includeTeamStats` (type: `boolean`):

Adds season team stats for both teams to each game. Billed as a game-details event.

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

Adds player prop lines (consensus, opening and per-book). Billed as a game-details event.

## `propTypes` (type: `array`):

Short names such as passing_yards, rushing_yards, receiving_yards, receptions, anytime_td (NFL/NCAAF); points, rebounds, assists, threes (basketball); strikeouts, hits, total_bases, home_runs (MLB); shots_on_goal, points, saves (NHL). Raw core_bet_type\_\* ids also work. Empty uses the first three for each sport.

## `futureCategories` (type: `array`):

For the Futures data type: words that must appear in the market name, e.g. Superbowl, MVP, Total Wins. Empty returns the first market only.

## `snapshotName` (type: `string`):

Give scheduled runs the same name and each game gets changeSinceLastRun: how its spread, total and moneyline moved since the previous run.

## `alertWebhookUrl` (type: `string`):

Slack, Discord or any HTTPS endpoint. Receives a JSON POST with the flagged games after the run.

## `alertOn` (type: `array`):

What triggers an alert. Empty means reverse line moves, steam and arbitrage.

## `alertMinLineMove` (type: `number`):

Points the spread or total must move since the last run (needs a snapshot name).

## `alertMinSharpGap` (type: `integer`):

Money share minus ticket share needed for a sharp-gap alert.

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

Maximum games (or futures rows, injuries, teams) saved for each league.

## `proxyConfiguration` (type: `object`):

Not needed for normal use. Enable only if you see blocked requests.

## Actor input object example

```json
{
  "dataType": "games",
  "startUrls": [
    {
      "url": "https://www.actionnetwork.com/nfl/odds"
    }
  ],
  "leagues": [
    "nfl"
  ],
  "dates": [],
  "weeks": [],
  "books": [
    "draftkings",
    "fanduel",
    "betmgm"
  ],
  "gameStatus": "all",
  "teams": [],
  "minBets": 0,
  "minSharpMoneyGap": 0,
  "includeWeather": false,
  "includeInjuries": false,
  "includeTeamStats": false,
  "includeProps": false,
  "propTypes": [],
  "futureCategories": [],
  "alertOn": [],
  "alertMinLineMove": 1,
  "alertMinSharpGap": 20,
  "maxItems": 5,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `overview` (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 = {
    "startUrls": [
        {
            "url": "https://www.actionnetwork.com/nfl/odds"
        }
    ],
    "leagues": [
        "nfl"
    ],
    "books": [
        "draftkings",
        "fanduel",
        "betmgm"
    ],
    "maxItems": 5,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("confidential_gnat/action-network-odds-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 = {
    "startUrls": [{ "url": "https://www.actionnetwork.com/nfl/odds" }],
    "leagues": ["nfl"],
    "books": [
        "draftkings",
        "fanduel",
        "betmgm",
    ],
    "maxItems": 5,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("confidential_gnat/action-network-odds-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 '{
  "startUrls": [
    {
      "url": "https://www.actionnetwork.com/nfl/odds"
    }
  ],
  "leagues": [
    "nfl"
  ],
  "books": [
    "draftkings",
    "fanduel",
    "betmgm"
  ],
  "maxItems": 5,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call confidential_gnat/action-network-odds-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,confidential_gnat/action-network-odds-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/bKUQhmUvEqljLlCep/builds/gEeWzh0pz0vaUumyM/openapi.json
