Sports Betting Odds Scraper: NFL, NBA, MLB & Soccer Lines avatar

Sports Betting Odds Scraper: NFL, NBA, MLB & Soccer Lines

Pricing

from $1.00 / 1,000 game with odds

Go to Apify Store
Sports Betting Odds Scraper: NFL, NBA, MLB & Soccer Lines

Sports Betting Odds Scraper: NFL, NBA, MLB & Soccer Lines

Scrape prematch betting odds for NFL, NBA, MLB, NHL, college and top soccer. Every sportsbook's moneyline, spread and total in one row per game: 5 US books, up to 20 in the UK, 26 in Brazil. Opening price and movement on each, plus vig free fair odds and arbitrage.

Pricing

from $1.00 / 1,000 game with odds

Rating

0.0

(0)

Developer

Sourabh Kumar

Sourabh Kumar

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Share

Sports betting odds scraper: moneyline, spread, totals and line movement

Pull prematch betting lines for NFL, NBA, MLB, NHL, college and top soccer. One row per game, with every sportsbook's price nested side by side.

Every price carries its opening number, so you get line movement without storing yesterday's run.

$1.00 per 1,000 games on any paid plan, $2.00 on the Free plan. No per run fee.

Read the US market for DraftKings, FanDuel, BetMGM, Fanatics and bet365. Switch to the UK for up to 20 books, or Brazil for 26.

Why this scraper?

  • 🏦 Up to 26 sportsbooks per game, not the two or three you get from scrapers that hit each book directly.
  • 📉 Line movement is built in. Every price ships with the opening number and an up/down/unchanged flag.
  • 🧮 Vig free fair odds on every complete market, plus the average overround so you can see what the book is holding.
  • 💸 Arbitrage detection with stake splits, calculated from the best price on each outcome across all books.
  • 🛒 Best price per outcome and how far it beats the market average, which is line shopping done for you.
  • 🚫 No proxy, no API key, no browser. That is why it is cheap and why it does not break when a sportsbook tightens its bot rules.
  • 🧾 One row is one whole game. Scrapers that bill per bookmaker line charge you 20 to 60 times for the same fixture.
  • 🎯 No per run fee, and skipped games are never charged. Fixtures with no published prices are crawled silently and cost you nothing.
  • 🌍 Seven odds markets across the US, UK, Brazil and Germany, so you are not stuck with US books.

What data can you extract?

🏟️ Teams and logos🕒 Start time (UTC)🏆 League📊 Final score
💰 Moneyline📏 Spread / handicap🔢 Total (over / under)🏦 Bookmaker name
📈 Opening price📉 Movement direction🇺🇸 American odds🔟 Decimal odds
🎲 Implied probability🧮 Vig free fair odds💸 Arbitrage + stakes🛒 Best price per outcome

Leagues and odds markets covered

Leagues. NFL, NCAA Football, CFL, NBA, WNBA, NCAA Basketball, MLB, NHL, MLS, Premier League, LaLiga, Bundesliga, Serie A, Ligue 1, Champions League, Europa League, Conference League, ATP and WTA. Or sweep a whole sport instead of picking leagues.

Odds markets. Each game can be priced from a different country's bookmakers. The market you choose changes which books appear, not which games.

MarketBooksExamples
United States (New Jersey)5DraftKings, FanDuel, BetMGM, Fanatics, bet365
United Kingdomup to 20bet365, William Hill, Betfair, Paddy Power, Ladbrokes, Skybet
Brazilup to 26Betano, bet365, Betfair, KTO, Superbet, Betnacional
Germany7Betano, Interwetten, Winamax, Oddset, bet365

Colorado, Illinois and New York are also selectable for US runs. New Jersey is the default because it carries the widest book list.

How to scrape betting odds: step by step

  1. Create a free Apify account. Takes 30 seconds, no card needed.
  2. Open Sports Betting Odds Scraper in the Apify Console.
  3. Pick your leagues and an odds market. That is the whole setup.
  4. Click Start. A typical slate finishes in under a minute.
  5. Export as JSON, CSV, or Excel, or fetch it from the API.

How much does Sports Betting Odds Scraper cost?

You pay per game delivered. Every paid Apify plan pays $1.00 per 1,000 games, and the Free plan pays $2.00 per 1,000. There is no per run fee, so a run costs exactly what it delivers.

One row is one whole game with every bookmaker nested inside it. Scrapers that bill per bookmaker line charge you 20 to 60 times for that same game, so compare on games, not rows.

The Free plan's $5 of monthly credit covers roughly 2,500 games. The $29/month Starter plan covers about 29,000 games a month.

Games that have no published odds are skipped and never billed, so a run over an empty slate costs you nothing at all.

Input

{
"leagues": ["nfl", "nba", "mlb", "nhl"],
"oddsCountry": "US",
"markets": ["moneyline", "spread", "total"],
"includeAlternateLines": false,
"computeFairLines": true,
"computeArbitrage": true,
"maxItems": 100
}
FieldTypeDefaultNote
leaguesarraynoneAny of the 19 leagues listed above.
sportsarraynoneSweep every competition in a sport instead of picking leagues.
oddsCountrystringUSWhich country's bookmakers price the games.
marketsarraymoneyline, spread, totalAdd btts, double_chance, draw_no_bet, correct_score, odd_even.
statusesarrayallLimit to scheduled, live or finished.
dateFrom / dateTostringtoday, tomorrowYYYY-MM-DD. Leave both out for today and tomorrow. You can reach 7 days back through tomorrow, and nothing beyond that.
includeAlternateLinesbooleanfalseEvery published spread and total, not just the primary line.
includePeriodMarketsbooleanfalseAdd first half, second half and first quarter markets.
computeFairLinesbooleantrueVig free consensus probabilities per market.
computeArbitragebooleantrueFlag guaranteed profit opportunities with stake splits.
onlyArbitragebooleanfalseReturn only games that contain one. Others are skipped unbilled.
minArbitrageProfitPctinteger0Ignore arbitrage below this guaranteed return. 0 reports any positive edge.
matchIdsarraynonePrice specific games directly, ignoring league and date filters.
maxItemsinteger100One game is one row and one charge. 0 for no limit.

Only arbitrage, priced from the widest market:

{ "sports": ["soccer"], "oddsCountry": "BR", "onlyArbitrage": true, "maxItems": 50 }

Output

One row per game. Prices, best prices, fair lines and arbitrage are nested inside it.

{
"matchId": "OfrMA53K",
"url": "https://www.flashscore.com/match/OfrMA53K/",
"sport": "americanFootball",
"league": "nfl",
"leagueLabel": "NFL",
"country": "USA",
"startTime": "2026-08-13T23:30:00.000Z",
"status": "finished",
"home": { "name": "New England Patriots", "teamId": "f9amdMmC", "slug": "new-england-patriots" },
"away": { "name": "Indianapolis Colts", "teamId": "SMcef0IO", "slug": "indianapolis-colts" },
"homeScore": 13,
"awayScore": 13,
"winner": null,
"oddsCountry": "US",
"bookmakerCount": 5,
"priceCount": 26,
"marketCount": 7,
"movedCount": 24,
"hasArbitrage": false
}

Each entry in prices is one book's number for one side of one market:

{
"bookmakerName": "bet365.us",
"market": "moneyline",
"side": "home",
"teamName": "New England Patriots",
"selection": null,
"line": null,
"decimal": 2.5,
"american": 150,
"openingDecimal": 1.74,
"movement": "up",
"impliedProbability": 0.4,
"isActive": true
}

How spread and total lines are written

On a spread, each side carries its own number: the home team at +1.5 and the away team at -1.5 are the two halves of one market. Totals work the same way, with selection set to OVER or UNDER on a shared line.

So every entry that belongs to a market also carries marketLine, which is identical on both sides. Group by marketLine to put a market back together; read line to see the number you would actually be betting.

{ "market": "spread", "side": "home", "teamName": "New England Patriots", "line": "1.5", "marketLine": "1.5", "decimal": 2.1, "american": 110, "bookmakerName": "Fanatics", "edgeVsAveragePct": 0, "bookCount": 2 }
{ "market": "spread", "side": "away", "teamName": "Indianapolis Colts", "line": "-1.5", "marketLine": "1.5", "decimal": 1.74, "american": -135, "bookmakerName": "Fanatics", "edgeVsAveragePct": 0.87, "bookCount": 2 }

That is bestPrices: the top number available on each side, which book is offering it, and how far it beats the average of every book pricing that same side.

Each entry in fairLines is the same market with the bookmaker margin stripped out. overround is what the average book is holding, so 1.043 means 4.3%:

{
"market": "moneyline",
"line": null,
"overround": 1.04332,
"outcomes": [
{ "side": "home", "teamName": "New England Patriots", "line": null, "fairProbability": 0.391377, "fairDecimal": 2.5551 },
{ "side": "away", "teamName": "Indianapolis Colts", "line": null, "fairProbability": 0.608623, "fairDecimal": 1.6431 }
]
}

arbitrage gives the legs of any guaranteed profit spot, each with the line to take, the book offering it, and the share of your stake it should get.

Use cases

  • 📉 Line movement tracking. Every price ships with its opening number, so steam moves show up on the first run.
  • 🛒 Line shopping. Compare up to 26 books on one game and take the best number on each side.
  • 💸 Arbitrage scanning. Surface guaranteed profit spots across books, with the stake split already worked out.
  • 🧮 Model building and backtesting. Vig free fair probabilities are a cleaner training target than raw prices.
  • 🎯 Closing line value. Prices freeze at kickoff, so the last prematch number is the closing line.
  • 📰 Odds widgets and previews. Feed a "tonight's lines" table on a sports content site.
  • 🤖 Alert bots. Schedule a run every few minutes and push moves into Slack or Discord.
  • 📊 Market efficiency research. Compare overround across books, leagues and countries.

Limitations

  • Prematch only. Prices freeze once a game goes in play, so this is not a live in-play odds feed.
  • No player props or futures. The source carries game lines only: moneyline, spread, total and related markets.
  • 9 day window. You can reach 7 days back through tomorrow. There is no historical archive.
  • Older finished games lose their odds. Prices stay available for a while after a game ends, then the source removes them. Scrape before kickoff if you want a guaranteed closing line.
  • Fair odds are a consensus, not a sharp line. They average the books present rather than anchoring to a single sharp book.
  • Out of season leagues return nothing. Ask for the NBA in July and the run tells you so instead of failing.

FAQ

How much does Sports Betting Odds Scraper cost?

It uses pay per result pricing. You pay $1.00 for 1,000 games on any paid plan, or $2.00 per 1,000 on the Free plan, with no per run fee. The Apify Free plan gives you $5 in usage credits a month, enough for around 2,500 games. If you run regularly, the $29/month Starter plan covers about 29,000 games.

No subscription lock in. Pause whenever.

Scraping public data is generally allowed in the US and most of the EU, as long as you don't collect personal data covered by GDPR or CCPA without a lawful basis. This actor only touches publicly accessible pages, and odds are commercial pricing data rather than personal data. How you use the output is on you.

Apify's full breakdown: Is web scraping legal?.

Can I integrate it with other tools?

Push results into Make, Zapier, Slack, Airbyte, GitHub, Google Sheets, Google Drive, and more. Apify treats every actor as a webhook source, so anything that consumes webhooks or pulls from an API works.

Full list: Apify integrations.

Can I use it with the Apify API?

Yes. Every run is available via the Apify REST API:

curl -X POST "https://api.apify.com/v2/acts/sourabhbgp~sports-odds-scraper/runs?token=APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"leagues": ["nfl", "nba", "mlb", "nhl"], "oddsCountry": "US", "maxItems": 50}'

Docs: Apify API reference.

Can I use it through an MCP Server?

Yes. Apify ships an MCP server that exposes every actor as a tool, so Claude Desktop, Cursor, and any other MCP capable client can call it. Setup: Apify MCP docs.

Your feedback

Bug, missing field, or odd behavior? Drop a note in the Issues tab. Reports go to a human and fixes usually ship the same week.