Action Network Scraper - Public Betting Splits Monitor avatar

Action Network Scraper - Public Betting Splits Monitor

Pricing

from $3.65 / 1,000 game returneds

Go to Apify Store
Action Network Scraper - Public Betting Splits Monitor

Action Network Scraper - Public Betting Splits Monitor

Action Network public betting splits: tickets % and money % for moneyline, spread and total, one row per game with the consensus line, the opening line and each sportsbook's line. NFL, NCAAF, MLB, NHL, NBA, WNBA, NCAAB. Monitoring returns only games whose splits or lines moved.

Pricing

from $3.65 / 1,000 game returneds

Rating

0.0

(0)

Developer

NeverEmpty

NeverEmpty

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

0

Monthly active users

18 days ago

Last modified

Share

Get Action Network's public betting splits - the share of tickets (bets) and the share of money (handle) on each side of the moneyline, the spread and the total - as one clean row per game, together with the consensus line, the opening line and every sportsbook's line from the same page. Turn on monitoring and schedule it: later runs return only the games whose percentages, consensus line, consensus odds or status changed, with the previous values in the same row.

Leagues: nfl, ncaaf, mlb, nhl, nba, wnba, ncaab (one Action Network public betting page each).

What you get for each game

ColumnMeaning
league, gameId, startTime, gameStatusWhich game, when, and whether it is scheduled, inprogress or complete
awayTeam, homeTeam (+ abbreviations and ids)The teams as Action Network names them
numBetsNumber of bets Action Network says it tracks for the game
mlAwayTicketsPct, mlAwayMoneyPct, mlHomeTicketsPct, mlHomeMoneyPctMoneyline: % of tickets and % of money on each side
spreadAwayTicketsPct ... spreadHomeMoneyPctThe same for the spread (run line / puck line)
overTicketsPct ... underMoneyPctThe same for the total
mlHomeMoneyMinusTickets, spreadHomeMoneyMinusTickets, overMoneyMinusTicketsMoney % minus tickets % on that side, in points (positive = fewer but bigger bets on it)
consensus...Consensus moneyline, spread and total with odds (Action Network's "Consensus" column)
openMlAway, openMlHome, openSpreadHome, openTotalThe page's "Open" column
booksOne entry per sportsbook on the page (for example DK NJ, FanDuel NJ, BetMGM NJ, bet365 NJ, BetRivers NJ, Caesars NJ, Fanatics NJ, Kalshi): its moneyline, spread and total with odds
splitsSourceWhere the percentages came from (normally Consensus)
snapshotAt, copyAgeSecondsWhen the copy of the page this row came from was made, and how old it was when read (see "Freshness")

A percentage is empty (null), never 0, when Action Network shows no number for that market. The value fields next to the percentages on the page are 0 for every outcome we measured, so they are not returned.

Why one row per game and not one row per sportsbook

On the NFL page read on 2026-09-28, the ticket and money percentages were identical at all 9 sportsbooks for all 96 game sides that had them. Selling one row per game per sportsbook would sell the same percentages nine times. Here you pay once per game and still get every sportsbook's line inside the row.

Coverage measured on 2026-09-28 (US residential connection)

PageGamesMoneyline %Spread %Total %
NFL16161616
NCAAF5953756
MLB440 (run line shows no %)4
NHL5555
WNBA2222
NBA (pre-season)1000

The pages list the current slate only - today's or this week's games, including games that already ended that week with their final percentages. Coverage changes with the season and the day.

Monitoring mode

  1. Run once with Monitoring mode on: every game is new and is returned.
  2. Schedule the same input (for example every 15 minutes). Each later run returns a game only when one of its 12 percentages, its consensus spread or total, its consensus odds or its status changed, with changeKinds (splits, line, odds, status), biggestSplitMove and the previous... columns filled in.
  3. Minimum percentage move returns a game only after a ticket or money percentage moved at least that many points since it was last returned. Smaller moves are not remembered, so they add up.

When nothing changed, the run returns one free no-change row. Do not put the same input into two schedules that run at the same moment: Apify key-value stores have no atomic update, so two runs finishing together can overwrite each other's memory.

Freshness: the same page is served from caches of different ages

Action Network serves these pages from a cache. On 2026-09-28 the copies we received were between 5 seconds and 8,240 seconds old, and reading the same page twice could return an older copy the second time (the number of bets for a college football game went from 1,681 to 1,544 to 35 across reads). This Actor handles that openly:

  • Every row carries snapshotAt (when that copy was made) and copyAgeSeconds.
  • If the copy is older than 15 minutes, the Actor asks once more and keeps the fresher copy.
  • In monitoring mode, a copy older than the one compared last time is not treated as a change: nothing from it is returned or charged (free older-copy row), and the memory is left as it was. A game whose number of bets went down since last time is treated the same way.

Pricing

  • $0.05 per run that read at least one usable page (charged once per run as actor-start, before the first game row).
  • $0.005 per game row returned (game-split, $5 per 1,000).
  • Free rows are never charged: a page that could not be read, a challenge, an empty page, an older copy, filters that matched nothing, no change since the last run, and a run that reached a limit.
  • The start fee is charged only when a page listed at least one game this Actor can return (a game with percentages, or any game when "Include games without percentages" is on). A run that read no usable page, or only games without percentages, is not charged at all. A run whose own filters match nothing, and a monitoring run in which nothing changed, are charged the start fee: the pages were read and compared.
  • A run that has used 600 seconds does not request the remaining leagues (free rows say so), so it is never cut off by the default 900-second timeout after charging.

Example: the NFL page with 16 games costs $0.05 + 16 x $0.005 = $0.13. A monitoring run in which nothing changed costs $0.05.

Input

FieldWhat it does
leaguesPages to read: nfl, ncaaf, mlb, nhl, nba, wnba, ncaab. Empty with monitoring off = the NFL page (the league column says so); monitoring needs at least one league
teamsOnly games with these teams: an exact abbreviation (GB, CHI) or a word of 4+ letters in the team name (Packers)
onlyNotStartedOnly games whose status is scheduled
startsWithinHoursOnly games starting within this many hours (games already started are kept)
includeGamesWithoutSplitsAlso return games that carry lines but no percentages yet (off by default)
minMoneyVsTicketsGapOnly games where money % and tickets % differ by at least this many points on some side
maxGamesMaximum game rows per run (default 500)
monitoringModeReturn only games that changed since the last run with the same input
resetMonitoringStateForget what was returned for this input, so every game is new again
minSplitMoveMonitoring only: return a changed game only after a percentage moved at least this many points

Input example

{
"leagues": ["nfl", "ncaaf"],
"onlyNotStarted": true,
"monitoringMode": true,
"minSplitMove": 3
}

Output example (shortened)

{
"league": "nfl",
"gameId": "290887",
"startTime": "2026-09-29T00:15:00.000Z",
"gameStatus": "scheduled",
"awayTeam": "Philadelphia Eagles",
"homeTeam": "Chicago Bears",
"numBets": 45584,
"mlAwayTicketsPct": 93,
"mlAwayMoneyPct": 93,
"spreadAwayTicketsPct": 78,
"spreadAwayMoneyPct": 72,
"overTicketsPct": 52,
"overMoneyPct": 47,
"consensusSpreadHome": 3.5,
"consensusTotal": 41.5,
"books": [{ "bookName": "DK NJ", "spreadHome": 3.5, "spreadHomeOdds": -108, "total": 41.5 }],
"snapshotAt": "2026-09-28T12:16:19.000Z",
"copyAgeSeconds": 347
}

Limits (read before scheduling)

  • Current slate only. The Actor reads each league's public betting page without query parameters, as Action Network's robots.txt allows. It does not read past dates and does not use Action Network's API host, whose robots.txt disallows all crawling.
  • US residential connection only. Action Network answers datacenter addresses with a challenge after a few requests, so this Actor always reads through Apify's US residential proxy and never switches connections after a challenge. If the residential proxy is not available to a run, it stops with a free row.
  • Challenges are not solved. If Action Network answers with a challenge (for example an AWS WAF page), the run stops asking: that league and the remaining ones come back as free rows. On 2026-09-28 the NCAAB page (out of season) answered one request from a US residential address with a challenge.
  • The percentages are Action Network's own figures as published on the page; this Actor does not verify them against the sportsbooks.
  • Pro-only data on Action Network (for example sharp report or detailed line history) is not included.

FAQ

Is the "money %" the same at every sportsbook? On the pages we measured, yes - the page repeats the same split under each sportsbook, so it is returned once per game.

Why are some spread percentages empty? Action Network shows no percentage for those markets (for example most college football spreads and the MLB run line on 2026-09-28). An empty value means "not shown", not 0%.

How often should I schedule monitoring? Action Network refreshes the cached page about every 5 minutes at best, so running more often than every 5 minutes mostly returns no-change rows while still costing the start fee.