Flashscore Betting Odds & Opening Lines Scraper avatar

Flashscore Betting Odds & Opening Lines Scraper

Pricing

from $0.43 / 1,000 bookmaker lines

Go to Apify Store
Flashscore Betting Odds & Opening Lines Scraper

Flashscore Betting Odds & Opening Lines Scraper

Scrape pre-match betting odds from Flashscore: 1X2, over/under, Asian handicap, BTTS and more from 100+ bookmakers across countries, with opening prices and margins, plus outright winner odds for leagues and teams. 21 sports, one flat row per bookmaker line. No API key, no proxy.

Pricing

from $0.43 / 1,000 bookmaker lines

Rating

0.0

(0)

Developer

Elena Vance

Elena Vance

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Share

Scrape pre-match betting odds from Flashscore's odds comparison — 1X2, moneyline, over/under, Asian and European handicap, both teams to score and more — from 100+ bookmakers across countries, with every outcome's opening price next to its current one and the bookmaker's margin worked out. Football, tennis, basketball, hockey and 17 more sports.

One flat row per bookmaker line, ready for a spreadsheet, pandas or SQL. No API key, no login, no proxy, no browser. Export to JSON, CSV, Excel, XML or pull it from the API.


What you get

One row per bookmaker × market × line × period. Real, unedited output for bet365's main over/under line on Girona v Albacete:

FieldValue
eventId / eventUrlMNThRu6l / https://www.flashscore.com/match/MNThRu6l/
sport / tournamentfootball / SPAIN: LaLiga2 - Round 7
startTime / status2026-09-25T18:30:00Z / finished
homeName / awayNameGirona / Albacete
homeScore / awayScore2 / 0
bookmakerName / bookmakerIdbet365 / 16
bookmakerCountryGB
market / period / lineOVER_UNDER / FULL_TIME / 2.75
overOdds / overOpeningOdds1.83 / 1.78
underOdds / underOpeningOdds1.98 / 2.03
margin / openingMargin0.0515 / 0.0544
outcomes[{"name":"over","odds":1.83,"openingOdds":1.78,"change":0.05,"active":true}, …]
scrapedAt2026-09-27T12:02:09Z

The prices most people want sit in fixed columns — homeOdds, drawOdds, awayOdds, overOdds, underOdds, yesOdds, noOdds, each beside its …OpeningOdds — so filtering to market = "HOME_DRAW_AWAY" and pivoting on bookmakerName gives you an odds-comparison table without unpicking any JSON. Markets with many outcomes (correct score, half-time/full-time) live in outcomes, which every row also carries, with the price change per outcome.

Opening and closing prices

Every outcome has its opening price and its current price. For a finished match the current price is the last pre-match price Flashscore recorded — the closing line. That pair is what line-movement tracking, closing-line-value analysis and model backtesting are built on, and Flashscore keeps it for matches years old: pass an old match's id in matchIds.

Handicaps are always from the home side

line: -1.5 on an Asian handicap row means the home side gives 1.5, with homeOdds and awayOdds on the same row. Flashscore quotes each side from its own point of view (home −1.5, away +1.5); this Actor pairs them, so a handicap row is always a complete two-way book with a real margin.

In tennis, set and game lines are kept apart by lineType (SETS or GAMES) — "+1.5" means very different things in each.


More bookmakers: pick several countries

Flashscore shows the bookmakers licensed in one country at a time. List several in bookmakerCountries and they are merged into one dataset, each bookmaker once:

CountryBookmakers (one LaLiga2 match)
GB20 — bet365, Betfair, William Hill, Paddy Power, Ladbrokes, Coral, Sky Bet, Betfred, BetVictor, Betway, Unibet, …
BR20
IT13 — SNAI, Sisal, Lottomatica, Eurobet, GoldBet, Planetwin365, bwin.it, …
CA-ON10
ES, FR, SE, DE, PL6–9 each
US-NJ5 — DraftKings, FanDuel, BetMGM, Fanatics, bet365.us

GB + DE + IT + ES + FR + BR returned 69 bookmakers on one match. Each country is one extra request per match. Where betting is licensed per state, give the region (US-PA, CA-ON); a bare US means New Jersey and CA means Ontario. A bookmaker licensed in two of your countries appears once, from whichever you listed first.


Outrights: who wins the league

Set mode to outrights and give league or team URLs in outrightUrls to get winner odds — the title race, not single matches:

{
"mode": "outrights",
"outrightUrls": [
"https://www.flashscore.com/football/england/premier-league/",
"https://www.flashscore.com/team/arsenal/hA1Zm19f/"
],
"bookmakerCountries": ["GB", "DE"]
}
  • A league URL gives every bookmaker's price on every team to win the current season — the Premier League from GB + DE was 100 rows: 20 teams × bet365, Betfred, Betway, 7BetUK and Betano.de.
  • A team URL gives that team's price in every competition it is quoted in — Arsenal: Premier League, Champions League, EFL Cup.

One row per bookmaker × participant × competition:

FieldValue
recordType / marketoutright / WINNER
tournament / tournamentId / seasonPremier League / SY30SsKF / 2026/2027
participantName / participantIdArsenal / hA1Zm19f
bookmakerName / bookmakerCountryBetway / GB
odds / oddsChange / isBestOdds1.57 / down / true

isBestOdds marks the highest price across the bookmakers Flashscore shows for that country. Outright rows are charged like match lines (one row, one charge); bookmakers, bookmakerCountries and maxItems apply, the match filters do not. A URL Flashscore does not have, or one no bookmaker in your countries prices, is one unbilled NO_OUTRIGHTS row.


Input

{
"sports": ["football", "tennis"],
"days": ["0", "1"],
"status": "scheduled",
"leagues": ["https://www.flashscore.com/football/england/premier-league/"],
"bookmakerCountries": ["GB", "DE", "US-NJ"],
"bookmakers": [],
"markets": ["HOME_DRAW_AWAY", "OVER_UNDER", "ASIAN_HANDICAP"],
"periods": ["FULL_TIME"],
"lines": "main",
"maxMatches": 100,
"maxItems": 1000
}
InputWhat it does
sportsAny of 21: football, tennis, basketball, hockey, american-football, baseball, handball, volleyball, rugby-union, rugby-league, cricket, futsal, floorball, aussie-rules, badminton, water-polo, field-hockey, table-tennis, boxing, mma, esports.
daysOffsets from today (0, 1, -1) or dates (2026-09-28). UTC days, from 7 days back to 7 ahead.
statusall, scheduled, live or finished.
leaguesA Flashscore league URL (exact) or part of the name as Flashscore shows it (ENGLAND: Premier League). Empty = every competition.
matchIds8-character ids or match URLs, of any age. Replaces sports/days/status/leagues.
bookmakerCountriesTwo-letter codes, with a region for per-state markets. Default GB.
bookmakersPart of a name or a numeric id. bet365 also matches bet365.it and bet365.us.
marketsDefault: 1X2, moneyline, over/under, Asian handicap, BTTS. Also draw no bet, double chance, European handicap, correct score, HT/FT, odd/even. Empty = all.
periodsFULL_TIME by default; FIRST_HALF, SECOND_HALF, FIRST_SET, … Empty = all.
linesmain keeps each bookmaker's line nearest even money; all keeps every alternative total and handicap.
maxMatchesMatches with odds to price, soonest first, taking sports in turn. Default 100.
maxItemsHard cap on charged rows. Default 1000.
modematches (default) or outrights — see above.
outrightUrlsLeague or team URLs for outrights mode, up to 100.

⚠️ How many rows a match is

With the defaults, one match priced by the 20 GB bookmakers is 60–70 rows: about 20 each of 1X2 and BTTS, and one main over/under and handicap line per bookmaker that offers them. Every extra country adds its new bookmakers; lines: "all" multiplies over/under and handicap rows by 5–10; correct score is one row per bookmaker holding ~25 outcomes. maxItems is the cost control.

A line is one charge however many outcomes it has. A 1X2 row is one row, not three.


What you are not charged for

  • Matches with no odds. A day list is full of youth, amateur and ITF fixtures no bookmaker prices, and tennis is often unpriced until hours before play. They are skipped and counted in the run's status message.
  • Match ids Flashscore does not have — one unbilled MATCH_NOT_FOUND row.
  • A requested match with no odds — one unbilled NO_ODDS row saying which countries were asked, so you can try others.
  • Bad input — an INVALID_INPUT row explaining the problem, not a failed run.
  • The same bookmaker twice when two of your countries list it.
  • Failures. A match whose odds could not be fetched from every requested country is reported by id in the status message and not charged; re-running usually succeeds.

Why this is cheap to run

Flashscore's data comes from two keyless APIs that do not gate on IP, and the bookmaker country is a query parameter, not your IP address — so several countries cost one small request each rather than a residential proxy per country. A run is one request per sport per day plus one per match per country. Ten matches take about five seconds.

The Actor start fee is $0.00005 and the default memory is 512 MB, under the 1 GB line, so Apify's per-gigabyte start fee is charged once.

Leave proxyConfiguration off. A proxy adds cost and no bookmakers; a datacenter IP is tried automatically only if Flashscore ever refuses a request.


What this Actor does NOT return

  • Live in-play odds. Flashscore's comparison is pre-match. For a live or finished match you get the last pre-match price.
  • Price history between open and close. Flashscore publishes the opening and the current price only. Schedule the Actor every N minutes to build a movement history — every row carries scrapedAt.
  • Player props, top-scorer or relegation markets, golf, horse racing or motorsport. Outrights are the winner market only.
  • Pinnacle. Flashscore does not list it in any country checked.

What makes this different

  • Several countries, one dataset. 100+ bookmakers are reachable; no other Store Actor merges countries.
  • Opening price on every outcome, the change since open, and the margin on both — computed only over complete books, never over a partial one.
  • Flat rows. One bookmaker line per row with fixed price columns, not one nested object per match.
  • Handicaps paired from the home side, and tennis set and game lines kept apart, so every line is a real two- or three-way book.
  • 21 sports, any day from a week back to a week ahead, or any match by id.
  • Never billed for nothing — no-odds matches, missing ids, duplicate bookmakers and failures are free.
  • A weekly canary runs the deployed build against live Flashscore and opens a GitHub issue if field coverage drops.

Example runs

Today's football, GB bookmakers, 1X2 only:

{ "sports": ["football"], "days": ["0"], "markets": ["1X2"], "maxMatches": 50 }

This weekend's Premier League across six countries:

{
"days": ["2026-10-03", "2026-10-04"],
"leagues": ["https://www.flashscore.com/football/england/premier-league/"],
"bookmakerCountries": ["GB", "DE", "IT", "ES", "FR", "BR"]
}

US sportsbooks on basketball and hockey:

{ "sports": ["basketball", "hockey"], "bookmakerCountries": ["US-NJ", "US-PA"], "status": "scheduled" }

Closing lines for matches you already know, every market and line:

{ "matchIds": ["MNThRu6l"], "markets": [], "periods": [], "lines": "all" }

NBA championship odds from US sportsbooks:

{ "mode": "outrights", "outrightUrls": ["https://www.flashscore.com/basketball/usa/nba/"], "bookmakerCountries": ["US-NJ"] }

Only bet365 and Betfair, every alternative total:

{ "bookmakers": ["bet365", "betfair"], "markets": ["OVER_UNDER"], "lines": "all" }

Ready-made examples

Open one, press Try for free, and change the input to your own:

More Flashscore Actors

Same data source, same flat rows and pay-per-result pricing: