Action Network Odds & Public Betting Scraper avatar

Action Network Odds & Public Betting Scraper

Pricing

from $1.50 / 1,000 results

Go to Apify Store
Action Network Odds & Public Betting Scraper

Action Network Odds & Public Betting Scraper

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.

Pricing

from $1.50 / 1,000 results

Rating

0.0

(0)

Developer

ActorFlow

ActorFlow

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

1

Monthly active users

13 hours ago

Last modified

Categories

Share

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)

✨ 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 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 or integrate it directly into your workflows using Zapier, Make, or n8n.

💰 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

FieldTypeRequiredDefaultDescription
Data to scrapestring—gamesgames, futures, injuries or standings.
League page URLsarray—NFL odds pageLeague pages like /nfl/odds; the league is read from the URL.
Leaguesarray—nflNFL, NBA, MLB, NHL, NCAA football and basketball, WNBA, CFL, MLS, Premier League, La Liga, Bundesliga, Serie A, Ligue 1.
Datesarray—current slateYYYY-MM-DD, for all leagues except NFL and NCAA football.
Weeksarray—current weekWeek numbers for NFL and NCAA football.
Sportsbooksarray—DraftKings, FanDuel, BetMGMBooks included in per-book odds. Consensus and opening lines are always included.
Game statusstring—allall, upcoming, live or finished.
Teamsarray——Team names or abbreviations to keep.
Minimum betsinteger—0Skip games with fewer tracked bets.
Minimum sharp money gap (%)integer—0Keep games where money share beats ticket share by this many points.
Include venue & weatherboolean—falseAdds venue, roof and weather.
Include game injuriesboolean—falseAdds both teams' injury report.
Include team statsboolean—falseAdds season team stats.
Include player propsboolean—falseAdds prop lines per player.
Prop typesarray—first three per sportFor example passing_yards, anytime_td, points, strikeouts.
Futures marketsarray—first marketWords from the market name, for example Superbowl or MVP.
Snapshot namestring——Enables changeSinceLastRun across scheduled runs.
Alert webhook URLstring——Receives flagged games as a JSON POST.
Alert onarray—reverse line move, steam, arbitrageAlso middle, sharp gap and line moved since last run.
Alert: minimum line movenumber—1Points since the last run.
Alert: minimum sharp gap (%)integer—20Money minus tickets.
Max items per leagueinteger—5Cap per league.
Proxy configurationobject—no proxyEnable 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

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

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:

LeagueGameDateHome spreadTotalBetsMax sharp gap
NBABKN @ CHA2026-10-06-5.5211.535324
NBANOP @ OKC2026-10-07-3.5222.541910

Sample output (raw 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.

Python (pip install apify-client):

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):

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:

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

ActorDescription
🎟️ Gametime Events Website ScraperCollects event listings, ticket availability, and pricing data from Gametime.
📈 Nasdaq Short Interest ScraperScrapes short interest history for any Nasdaq-listed stock or ETF from nasdaq.com.
📰 Google News AI ScraperSearches Google News by keyword with optional full article text and AI summaries.
✈️ Kiwi Flight ScraperScrapes flight prices, schedules and layovers from Kiwi.com.
🚗 Cheapest Cars & Bids ScraperScrapes 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.

You can also find more of our actors on the Actor Flow page.