Sports Betting Odds Scraper avatar

Sports Betting Odds Scraper

Pricing

$1.50 / 1,000 odds rows

Go to Apify Store
Sports Betting Odds Scraper

Sports Betting Odds Scraper

Collects pre-match and live betting odds from many bookmakers for football, tennis, basketball and 20+ other sports from Flashscore's odds comparison, with opening odds and price movement, to compare prices and track how they move.

Pricing

$1.50 / 1,000 odds rows

Rating

0.0

(0)

Developer

Mina

Mina

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

11 days ago

Last modified

Share

What does Sports Betting Odds Scraper do?

Sports Betting Odds Scraper collects betting odds from many bookmakers at once from Flashscore's public odds comparison, for football, tennis, basketball, hockey, baseball, American football and 20 more sports. For every match it gives each bookmaker's current price, opening price and how far the price has moved, for markets such as 1X2, home/away (moneyline), over/under, Asian handicap and both teams to score, before the match and, if you turn it on, live (in-play) for matches being played.

Paste a match or competition link from Flashscore, or just pick a sport and a day. Try it with the prefilled input: it reads the 1X2 odds of three of today's football matches and finishes in a few seconds. Because it runs on the Apify platform, you also get API access, scheduled runs, integrations (Google Sheets, Make, Zapier, webhooks) and run monitoring.

Why scrape betting odds?

  • Compare prices across bookmakers. One row per bookmaker and market line puts every bookmaker's price for the same outcome side by side.
  • Track odds movement. Each price comes with the bookmaker's opening price and the change in percent; schedule the Actor to take regular snapshots and see how the market moves towards kick-off.
  • Sports analytics and modelling. Use market prices as a benchmark for prediction models, or study how closing prices relate to results. Finished matches keep their closing odds.
  • Research and journalism. Collect what the market expected for a match, a league or a whole day.

The Actor only reads publicly displayed odds. It does not place bets, and it does not collect bonus offers or promotional content.

How to scrape betting odds from Flashscore

  1. Open a match on Flashscore (any country version) and copy the link from the address bar, or copy a league page such as https://www.flashscore.com/football/england/premier-league/.
  2. Paste it into Match links or Competition links, one per line. To read a whole day instead, leave both empty and pick a Sport and Day.
  3. Choose where the bookmakers should be licensed (Bookmakers licensed in), the Markets and Periods you need.
  4. Click Start, then download the odds when the run finishes.

Odds follow the bookmakers Flashscore shows in each country: about 20 for the United Kingdom, fewer elsewhere, and by state in the US.

Input

Everything is set on the Input tab. In JSON, the input looks like this:

{
"match_urls": [
"https://www.flashscore.com/match/football/arsenal-hA1Zm19f/leeds-tUxUbLR2/?mid=xtmHKGT0"
],
"league_urls": [
"https://www.flashscore.com/basketball/usa/nba/"
],
"bookmaker_country": "GB",
"markets": ["1x2", "home_away", "over_under", "asian_handicap", "both_teams_to_score"],
"periods": ["full_time"],
"all_lines": false,
"include_live_odds": false,
"max_events": 20
}
FieldWhat it does
match_urlsFlashscore match links from any country site (flashscore.co.uk, flashscore.de, livesport.cz…), with or without https://, or the bare 8-character match id. Upcoming, live and finished matches all work; finished ones give the closing odds.
league_urlsLeague or tournament pages (a team page works too). The Actor reads the upcoming matches in kick-off order. Names always come out in English, whichever country site the link is from.
sport, dayUsed only when the input has no link at all (API callers may also send links as startUrls or urls; they are read as links, never ignored): every match of that sport on today, tomorrow, yesterday or a date such as 2026-10-12 (up to 7 days either way, UTC days). Matches still to be played or in play come first, then finished ones.
bookmaker_countryWhere the bookmakers are licensed: a country code such as GB, DE or NG, a US state such as US-NJ, CA-ON for Ontario, or INT for the international set. Default: GB. Countries where Flashscore switches its odds comparison off (France, the Netherlands, Australia and most US states) are not offered.
markets1x2, home_away, over_under, asian_handicap, both_teams_to_score, double_chance, draw_no_bet, european_handicap, to_qualify, odd_even, correct_score, half_time_full_time and next_goal (live only). Default: the first five.
periodsfull_time (also covers prices that include overtime), first_half, second_half, first_period, first_quarter, first_set, second_set. Default: full_time.
all_linesOff (default): only each over/under and handicap market's main line, the one quoted by the most bookmakers with the most even prices. On: every line.
include_live_oddsOff by default. On: for matches in play, also save each bookmaker's in-play prices, about 20 more rows per live match.
max_eventsFor each competition link and for the day: stop after this many matches with odds. Default: 20. Matches without odds don't count, and match links are always all read.
proxy_configurationUsually not needed. The Actor connects directly and falls back to Apify's proxies on its own.

Output

Each row is one match, one bookmaker, one market and one line. Here are two real rows (bet365's 1X2 and over/under 2.5 prices for Arsenal v Leeds):

[
{
"event_id": "xtmHKGT0",
"event_url": "https://www.flashscore.com/match/football/arsenal-hA1Zm19f/leeds-tUxUbLR2/?mid=xtmHKGT0",
"sport": "football",
"country": "England",
"league": "Premier League",
"home_team": "Arsenal",
"away_team": "Leeds",
"start_time": "2026-10-10T11:30:00+00:00",
"status": "scheduled",
"bookmaker": "bet365",
"bookmaker_id": 16,
"bookmaker_country": "GB",
"odds_type": "prematch",
"market": "1x2",
"period": "full_time",
"home": 1.4,
"home_opening": 1.25,
"home_change_pct": 12,
"draw": 4.75,
"draw_opening": 5.5,
"draw_change_pct": -13.6,
"away": 8,
"away_opening": 12,
"away_change_pct": -33.3,
"is_active": true,
"scraped_at": "2026-10-10T07:33:14+00:00"
},
{
"event_id": "xtmHKGT0",
"home_team": "Arsenal",
"away_team": "Leeds",
"bookmaker": "bet365",
"odds_type": "prematch",
"market": "over_under",
"period": "full_time",
"line": 2.5,
"line_unit": null,
"over": 1.8,
"over_opening": 1.67,
"over_change_pct": 7.8,
"under": 2,
"under_opening": 2.2,
"under_change_pct": -9.1,
"is_active": true
}
]

The second row is shortened; every row carries the full match details. You can download the dataset in various formats such as JSON, HTML, CSV, or Excel. The Output tab has two views: Odds (prices side by side) and Odds movement (current, opening and change for each outcome).

Data fields

FieldDescription
event_id, event_urlFlashscore's match id and the match page.
sport, country, leagueThe sport, the country (or tour, such as ATP - SINGLES) and the competition.
home_team, away_teamTeam or player names; doubles pairs are joined with /.
start_timeKick-off time in UTC (ISO 8601).
statusscheduled, live, finished, or how an unplayed match ended (postponed, cancelled, walkover…).
bookmaker, bookmaker_idThe bookmaker as Flashscore names it, and its id.
bookmaker_countryThe bookmaker_country setting the row was collected with.
odds_typeprematch (before kick-off; once a match has started these are the closing prices) or live (in-play).
marketThe market, as named in the markets input.
periodfull_time, full_time_incl_overtime, first_half, second_half, first_period, first_quarter, first_set or second_set.
lineOver/under and handicap markets only: the total, or the home side's handicap (-1.5 means the home side gives 1.5).
line_unitOver/under and handicap markets only: games, sets, points… when Flashscore names the unit; null when it does not (most football lines).
outcomeCorrect score and half time/full time only: the score (2:1) or result pair (X/1). These markets have one row per outcome.
home, draw, awayDecimal odds for 1X2, home/away, draw no bet, to qualify, handicaps and (live) next goal.
over, under, yes, no, odd, evenDecimal odds for over/under, both teams to score and odd/even.
home_or_draw, home_or_away, draw_or_awayDecimal odds for double chance.
no_goalNext goal (live) only: the price of no further goal.
oddsCorrect score and half time/full time: the price of outcome.
<outcome>_openingThe opening price for that outcome, such as home_opening. For live rows, the price when in-play betting began, close to the pre-match closing price.
<outcome>_change_pctChange from the opening price in percent: negative means the price has shortened.
is_activefalse when the bookmaker has suspended or closed any outcome of the row.
scraped_atWhen the row was collected, in UTC.

Only the fields that apply to a row's market are present: a 1X2 row has no line, an over/under row has no home.

How much does it cost to scrape betting odds?

The Actor uses pay-per-event pricing: you pay for the rows saved (see the Pricing tab for the current price), plus a small amount of Apify platform usage. Runs are quick: three matches take about 5 seconds, forty matches about 10.

A row is one bookmaker's prices for one market of one match (one line of it, for over/under and handicaps), so the cost of a match is roughly its number of bookmakers times the markets you pick. Examples at $1.50 per 1,000 rows:

What you readRowsCost at $1.50 per 1,000 rows
1X2 only, a football match with UK bookmakers (the prefilled input reads three)about 20 per matchabout $0.03 per match
The five default markets, a Premier League match with UK bookmakers67about $0.10
The same with live odds on, while the match is in play75 to 87about $0.12
The five default markets, an NBA game with New Jersey bookmakers12about $0.02
20 football matches of a day, default markets (a default run)about 1,000about $1.50

Smaller competitions have fewer bookmakers: 40 football matches with the default markets gave 2 to 71 rows each (52 on average). Rows are never saved for links or matches without odds, so you are not charged for them, and if you set a maximum cost for a run, the Actor stops as soon as it is reached.

Tips for scraping odds

  • Pick only the markets you need. Each market adds a row per bookmaker and line; correct score adds 30 to 40 rows per bookmaker. Live odds add about 20 rows per match in play.
  • Keep all_lines off unless you need the whole ladder of over/under and handicap lines: it can multiply rows five to tenfold.
  • Track movement with a schedule. Run the same links every hour or every day; compare prices across runs with scraped_at.
  • Compare regions by running the same matches with different bookmaker_country values: each country sees different bookmakers.
  • Closing odds: run on yesterday or paste links to finished matches to get the last prices before kick-off.
  • Pasting the same match twice, or a match that is also in a pasted league, reads it once.

FAQ, disclaimers and support

Which bookmakers are covered? The ones Flashscore shows for the chosen country, such as bet365, Betfred, Ladbrokes, Sky Bet and William Hill in the United Kingdom, or FanDuel, DraftKings and BetMGM in New Jersey. The list changes with Flashscore's partnerships and local licensing.

Why do some matches return no odds? Smaller competitions are often not priced by the bookmakers of every country, and matches that were cancelled or ended in a walkover usually have none (a postponed match can keep its odds). Links that give nothing are listed with the reason in the FAILED_INPUTS record of the run's key-value store, and the run's status message gives the counts. A run fails only when Flashscore could not be reached for any input.

How fresh are the odds? They are the prices Flashscore showed when the row was collected (scraped_at). Bookmakers change prices often, especially in play, so always check the current price before relying on it.

Is it legal to scrape betting odds? This Actor reads odds that Flashscore displays publicly to every visitor and collects no personal data: only match, team and bookmaker information. You are responsible for making sure your use complies with Flashscore's terms and with the laws that apply to you, including local rules on betting. The data is meant for analysis and research. If in doubt, ask a lawyer.

Found a problem or need a custom solution? Open an issue on the Issues tab and we will look into it. Custom data feeds are available on request.