Sports Betting Odds Scraper & Line Move Monitor - NFL, MLB, NBA avatar

Sports Betting Odds Scraper & Line Move Monitor - NFL, MLB, NBA

Pricing

from $5.84 / 1,000 bookmaker price returneds

Go to Apify Store
Sports Betting Odds Scraper & Line Move Monitor - NFL, MLB, NBA

Sports Betting Odds Scraper & Line Move Monitor - NFL, MLB, NBA

Turn monitoring on and every later run returns only the prices that have actually moved, so you are never charged for the same line twice. Every ESPN bookmaker line as JSON: spread, total and moneyline, plus the opening line and how far it has moved since. NFL, MLB, NBA and NHL.

Pricing

from $5.84 / 1,000 bookmaker price returneds

Rating

0.0

(0)

Developer

NeverEmpty

NeverEmpty

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

19 hours ago

Last modified

Share

Sports Betting Odds Scraper & Line Move Monitor — NFL, MLB, NBA, NHL

Turn monitoring on and every later run returns only the prices that have actually moved, so you are never charged for the same line twice.

Every bookmaker line ESPN publishes, as one flat row: spread, total and moneyline for both sides — plus the opening line and how far it has moved since.

Unofficial. This Actor is not affiliated with or endorsed by ESPN or any bookmaker. It reads ESPN's public feeds — no key, no login, no HTML parsing. It reports published prices; it does not give betting advice.

What it does

  • 📈 The opening line and the move, not just today's number. ESPN's feed carries both open and current, so every row says where the line started and how far it travelled. Move is computed in decimal odds, because American odds (−110 next to +110) are not a continuous scale you can subtract.
  • 🔁 Monitoring follows movement. The remembered key is the game plus the bookmaker plus the actual numbers, so a price comes back only when it really changed.
  • 🔀 Favourite flips. Every row says whether the side favoured now is the side favoured at open.
  • 🧾 Four leagues: NFL, MLB, NBA, NHL.

🔴 The trap this Actor avoids

ESPN's scoreboard embeds odds for some leagues and not others. On 2026-09-06 all 16 NFL games carried an embedded line, while 0 of the 15 MLB games did — yet every MLB game checked had a line in ESPN's core odds endpoint.

A scraper that reads only the embedded odds silently returns nothing for MLB and looks like it worked. This Actor always reads the core endpoint, and uses the scoreboard only for the fixture.

It also separates "no odds yet" from "no odds": on 2026-09-06 the NBA board (next game 2026-10-03) and the NHL board (2026-09-19) carried no lines at all, because bookmakers had not posted them. That comes back as its own row saying so, and is not charged.

What you get in every row

FieldWhat it is
gameId, gameName, gameShortName, gameDateESPN's game and when it starts
gameStatus, gameState, isCompletedScheduled / pre, in, post
venue, venueCityWhere it is played
homeTeam, awayTeam (+ …Id, …Abbreviation)Both sides
provider, providerIdThe bookmaker ESPN is quoting
detailsESPN's own summary, e.g. SEA -3.5
spread, overUnderThe current line
homeMoneyLine, awayMoneyLineAmerican odds, e.g. -185 / 154
homeSpreadOdds, awaySpreadOdds, overOdds, underOddsThe price attached to each side
openSpread, openOverUnderWhere the line opened
openHomeMoneyLineDecimal, currentHomeMoneyLineDecimal (+ away)Decimal odds then and now
spreadMove, totalMove, homeMoneyLineMove, awayMoneyLineMoveHow far each has moved — null, never 0, when the opening value is not published
homeIsFavorite, homeWasFavoriteAtOpen, favoriteFlippedWho is favoured, and whether that changed
oddsKeyChanges when any number changes — this is what monitoring compares

A real row from the fixtures: NE @ SEA, DraftKings, spread -3.5, total 44.5, home moneyline -185, away 154; the home moneyline opened at decimal 1.52 and sits at 1.54, a move of +0.02; the favourite did not flip.

Two things worth knowing about the data

  • spread does not mean the same thing in every league. In the NFL it is a point spread (-3.5); in MLB it is the run line, which is ±1.5 on almost every game. Compare within a league, not across.
  • Moves are null when the opening value is not published, not 0. A filter on movement never drops a row whose opening line is unknown — unknown is not the same as unmoved.

What you can do with it

📉 Track line movement. Monitoring mode on a schedule returns a row only when a number actually changes.

🔀 Catch favourite flips. onlyFavoriteFlips returns the games where the market changed its mind.

🎯 Watch one team. teams: ["SEA"] plus monitoring gives a movement log for one club.

📊 Build a closing-line dataset. Finished games keep their closing numbers, so a daily run builds an open-to-close history.

Configure the run

Today's NFL and MLB boards:

{
"leagues": ["nfl", "mlb"],
"maxPrices": 200
}

Follow movement on a schedule, paying only for moves:

{
"leagues": ["nfl"],
"monitoringMode": true,
"maxGames": 20
}

Only games where the line moved at least a point:

{
"leagues": ["nfl", "mlb"],
"onlyMoved": true,
"minSpreadMove": 1
}

Input reference

Every field is optional; the defaults read today's NFL and MLB boards.

FieldTypeDefaultWhat it does
leaguesarray["nfl", "mlb"]Which leagues to read. Odds appear closer to the game: on 2026-09-06, all 4 NFL games checked carried a line and all 4 MLB games did, while NBA (next game 2026-10-03) and NHL…
datestring(empty)Which day's board to read. Empty = ESPN's current board for each league.
maxGamesinteger40Each game costs one extra request for its odds, so this caps how much of the board is read. Reading is free; only returned prices are charged.
maxPricesinteger200How many rows to return. One row is one game at one bookmaker. You are charged for the rows you actually receive.
monitoringModebooleanfalseOff = return every price for the games you picked. On = remember the exact numbers already returned and, on later runs, return a price again only when it has actually changed.…
resetMonitoringStatebooleanfalseClear the remembered prices before this run, so everything counts as new again.
providersarray[]Keep a price only if the bookmaker name contains one of these (case-insensitive, partial). ESPN's own feed carried DraftKings on every priced game checked on 2026-09-06.
teamsarray[]Keep a game only if either side's name or abbreviation contains one of these (case-insensitive, partial). Example: Seahawks, SEA.
gameStatesarray[]ESPN's own state for the game: pre (not started), in (in progress), post (finished). Empty = all. Note that finished games still carry the closing line.
onlyMovedbooleanfalseKeep a price only if at least one of spread, total or moneyline differs from where it opened. Prices whose opening line is not published are kept, because unknown is not the…
minSpreadMoveinteger0Keep a price only if the spread has moved at least this far from its open, in points, in either direction. 0 = no limit. Prices with no opening spread are kept.
onlyFavoriteFlipsbooleanfalseKeep only games where the side favoured now is not the side favoured when the line opened.
requireMoneyLinebooleanfalseDrop rows where neither side has a moneyline price.
keywordsarray[]Keep a price only if one (Any) or all (All) of these appear in the game name, either team, the bookmaker or the line summary.
keywordMatchstringanyAny = at least one keyword. All = every keyword.
excludeKeywordsarray[]Drop a price if any of these appear in the same fields.
useProxybooleanfalseOff by default: ESPN's public feeds answered 200 from a plain Apify datacentre address when this Actor was built (2026-09-06). If they start answering 403, 429 or 503, the…

Pricing

Pay per result: you are charged for the price rows you actually receive. Rows that only explain why there is nothing (no-results, no-odds-yet, no-such-league, unreadable, no-filter-match, no-line-move) are never charged. Reading a board is free — only returned prices cost anything.

What is deliberately not included

ESPN's odds carry affiliate-tagged links into the bookmakers' own betting slips. Those are not returned, and a test fails if one ever appears in the output.

Every number in this README is checked

The fixtures in test/fixtures/ are the real feeds this Actor was built from (2026-09-06). The test suite re-counts every figure quoted above — 16, 15, 1, 7, 4, 0, 44.5, -3.5, -185, 154, 1.52, 1.54, 0.02 — so if ESPN changes its feed, the tests fail rather than the data going quietly wrong.