Sports Odds Scraper: Football Odds Comparison by Bookmaker avatar

Sports Odds Scraper: Football Odds Comparison by Bookmaker

Pricing

from $2.50 / 1,000 event with odds

Go to Apify Store
Sports Odds Scraper: Football Odds Comparison by Bookmaker

Sports Odds Scraper: Football Odds Comparison by Bookmaker

Pre-match betting odds from BetExplorer, bookmaker by bookmaker: football (soccer) 1X2, Asian handicap and over/under, plus tennis, basketball, ice hockey, baseball, volleyball and handball. Every league listed, NHL, NBA and MLB included. A proxy country picks the books, e.g. 15 UK ones. No API key.

Pricing

from $2.50 / 1,000 event with odds

Rating

0.0

(0)

Developer

Michal Pšenčík

Michal Pšenčík

Maintained by Community

Actor stats

0

Bookmarked

5

Total users

3

Monthly active users

17 days ago

Last modified

Share

Sports Odds Scraper: football odds comparison, bookmaker by bookmaker

Scrape pre-match betting odds from every bookmaker quoting an event, from the odds comparison site BetExplorer. One dataset item per event, with each bookmaker's moneyline (1X2 on football, ice hockey and handball, home/away elsewhere), Asian handicap and over/under nested inside it, plus the league, the kick-off time in UTC and a stable event id.

It covers seven sports and every league the site lists for them: football (soccer) from the Premier League, LaLiga and the Champions League down to lower divisions worldwide, plus tennis (ATP, WTA, Challenger, ITF), basketball (NBA and European cups), ice hockey (NHL, KHL, AHL), baseball (MLB, KBO, NPB), volleyball and handball.

You choose which country's bookmakers you get by setting a country on Apify Proxy. A GB run returned 15 UK bookmakers on one football match (bet365, William Hill, Paddy Power, Betfred, Betway, bwin, BetVictor and more) at the same price per event as a 4-bookmaker run. No login, no API key, no browser.

Leave the input at its defaults and click Start for today's and tomorrow's football odds.

What data do you get?

FieldExampleNotes
eventIdGzrJ32nLThe source's id, stable across reruns. Use it as your key.
sportfootballThe sport this run covered.
countrySpainCountry or region of the competition.
competitionLaLigaCompetition name.
leagueSpain: LaLigaThe two joined as the source prints them.
home, awayReal Sociedad, Celta VigoThe two sides (players on tennis).
startTime2026-09-03T19:00:00.000ZKick-off, ISO 8601 in UTC.
statusscheduledscheduled, live or finished.
eventUrllinkThe event page on BetExplorer.
moneylineType1x21x2 on three-way sports, home-away on two-way ones.
bookmakerCount15How many bookmakers quote the event. Always 1 or more.
bookmakersarrayOne entry per bookmaker, see below.
scrapedAt2026-09-03T17:15:51.597ZWhen this run read the odds. Diff on it to get line movement.

Each entry of bookmakers:

FieldShapeNotes
bookmaker"William Hill"Name as the source prints it.
moneyline{ type, home, draw, away }Decimal odds. draw is null on two-way sports.
spread{ handicap, home, away }Asian handicap on the main line. handicap applies to the home side: -0.5 = home gives half a goal.
total{ line, over, under }Over/under on the main line.

Any of the three markets is null when that bookmaker does not price it. All odds are decimal.

Sports and leagues covered

SportMoneylineLeagues seen on the source (examples)
Football (soccer)1X2Premier League, LaLiga, Ligue 1, Serie A, Champions League, cups, lower divisions on every continent
Tennishome/awayATP, WTA, Challenger, ITF, singles and doubles
Basketballhome/awayNBA, Eurocup, FIBA Europe Cup, Champions League, national leagues
Ice hockey1X2NHL, AHL, KHL, Champions League, junior leagues
Baseballhome/awayMLB, KBO, NPB, CPBL
Volleyballhome/awayEuropean national leagues and cups
Handball1X2European national leagues and cups

A run returns whatever the source lists for that sport on the chosen days, so out-of-season leagues simply do not appear. American football (NFL), MMA and golf are not covered: the source does not carry them.

Use cases

  • Odds comparison and line shopping. Every bookmaker's price for the same event sits in one item, so the best price on each outcome and the gap between books fall straight out of the data.
  • Line movement and steam detection. Schedule the same input every 5 or 15 minutes and join on eventId + bookmaker, ordered by scrapedAt.
  • Arbitrage and value screens. 1X2, Asian handicap and totals from one snapshot. The Actor returns the prices; the arbitrage or +EV maths is yours to run on top.
  • Betting models and backtesting. Closing odds are the standard benchmark: set status to finished and days to [-1] for yesterday's closing prices.
  • Odds widgets and content. A "today's football odds" table for a tipster site, a Telegram or Discord bot.

How to use it

  1. Click Try for free to open the Actor in Apify Console.
  2. Pick a Sport.
  3. Set Days as offsets from today: [0, 1] is today and tomorrow, [-1] is yesterday. Seven days either side of today are available.
  4. Pick the Markets. Moneyline only is the fastest run; Asian handicap and totals add one request per event each.
  5. Optional: turn on Apify Proxy with the RESIDENTIAL group and a country to choose the bookmakers (see Choosing which bookmakers you get).
  6. Click Start. A 50-event football run takes about 15 seconds.
  7. Export the dataset as JSON, CSV, Excel or HTML, or read it through the API.

Input example

All fields are optional. These are the defaults:

{
"sport": "football",
"days": [0, 1],
"markets": ["moneyline", "spread", "total"],
"status": "scheduled",
"maxItems": 50
}

Today's ice hockey card (NHL, KHL and the rest) through a GB proxy, moneyline only:

{
"sport": "hockey",
"days": [0],
"markets": ["moneyline"],
"maxItems": 0,
"proxyConfiguration": {
"useApifyProxy": true,
"apifyProxyGroups": ["RESIDENTIAL"],
"apifyProxyCountry": "GB"
}
}

There is no league filter. To get one league, set maxItems to 0 and filter on league (for example USA: NHL or England: Premier League) on your side. Events no bookmaker quotes are never returned and never billed.

Output example

A real item from a cloud run on 2026-09-03 with no proxy, which is why the books are the US-facing ones:

{
"eventId": "GzrJ32nL",
"sport": "football",
"country": "Spain",
"competition": "LaLiga",
"league": "Spain: LaLiga",
"home": "Real Sociedad",
"away": "Celta Vigo",
"startTime": "2026-09-03T19:00:00.000Z",
"status": "scheduled",
"eventUrl": "https://www.betexplorer.com/football/spain/laliga/real-sociedad-celta-vigo/GzrJ32nL/",
"moneylineType": "1x2",
"bookmakerCount": 4,
"bookmakers": [
{
"bookmaker": "BetMGM.us",
"moneyline": { "type": "1x2", "home": 1.77, "draw": 3.8, "away": 4.4 },
"spread": { "handicap": -0.5, "home": 1.7, "away": 2 },
"total": { "line": 2.5, "over": 1.77, "under": 1.95 }
},
{
"bookmaker": "Fanduel",
"moneyline": { "type": "1x2", "home": 1.77, "draw": 3.7, "away": 4.6 },
"spread": null,
"total": null
},
{
"bookmaker": "Stake.com",
"moneyline": { "type": "1x2", "home": 1.79, "draw": 3.8, "away": 4.6 },
"spread": { "handicap": -0.5, "home": 1.79, "away": 2.05 },
"total": { "line": 2.5, "over": 1.8, "under": 1.98 }
},
{
"bookmaker": "bet365.us",
"moneyline": { "type": "1x2", "home": 1.75, "draw": 3.9, "away": 4.75 },
"spread": { "handicap": -0.5, "home": 1.73, "away": 2.08 },
"total": { "line": 2.5, "over": 1.8, "under": 1.95 }
}
],
"scrapedAt": "2026-09-03T17:15:51.597Z"
}

On tennis, basketball, baseball and volleyball moneylineType is home-away and draw is always null.

Choosing which bookmakers you get

BetExplorer shows each visitor the bookmakers licensed in their country, decided from the IP making the request. The Actor passes your proxy settings straight through, so the country you set on Apify Proxy is the bookmaker market you get back.

The same match, Real Sociedad v Celta Vigo on 2026-09-03, run three times with only the proxy country changed:

apifyProxyCountryBookmakers returned
none (Apify's own datacenter IP)Stake.com, BetMGM.us, bet365.us, Fanduel
GB10bet, 7BetUK, AllBritishCasino, BetUK, BetVictor, Betano.uk, Betfred, Betway, LeoVegasUK, Midnite, Paddy Power, Unibetuk, William Hill, bet365, bwin
DEBet365.de, Betano.de, Interwetten.de, Neobet, bet-at-home.de

The GB run quoted the home side anywhere between 1.73 and 1.80 across its 15 books, which is exactly the spread a line-shopping screen exists to find, and it cost the same $0.0025 as the 4-book event.

Only GB and DE were tested through Apify Proxy. The mechanism is the same for any country code, but how many books come back is up to the source and varies by market. Country selection needs the RESIDENTIAL proxy group, which Apify meters by traffic on your plan, so keep markets short when you use it. If a country is served no bookmakers at all, the run logs a warning naming that as the cause.

How much does it cost?

Pay per event, with platform usage included:

  • $0.0025 per event returned, that is $2.50 per 1,000 events, whatever the number of bookmakers and markets on it
  • $0.005 per run start (one start per GB of memory; the default is 1 GB)
RunCost
Default input, 50 football events$0.13
A full weekday of football, about 100 eventsabout $0.26
1,000 events in one run$2.505

Some odds scrapers bill per odds row, meaning one bookmaker's price on one market. Here one charge covers the whole event, so a 15-bookmaker event with three markets is still one $0.0025 charge. Proxy traffic, if you turn on the residential proxy, is billed by Apify on your plan as usual. To cap a run, set maxItems or a maximum cost in the run options.

API, integrations and AI agents

Run it and get the items back in one call:

curl -X POST "https://api.apify.com/v2/acts/thatmike1~sports-odds-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"sport": "football", "days": [0], "markets": ["moneyline"], "maxItems": 100}'

Python:

from apify_client import ApifyClient
client = ApifyClient("YOUR_TOKEN")
run = client.actor("thatmike1/sports-odds-scraper").call(run_input={"sport": "tennis", "days": [0, 1]})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
best_home = max((b["moneyline"]["home"] for b in item["bookmakers"] if b["moneyline"] and b["moneyline"]["home"]), default=None)
print(item["home"], "v", item["away"], best_home)
  • Schedules in Apify Console run it every few minutes for line movement.
  • Webhooks, Zapier, Make, Google Sheets and the other Apify integrations take the dataset from there.
  • AI agents (MCP). Add it as a tool in Claude, Cursor or any MCP client through the Apify MCP server, then ask for "today's Premier League odds from UK bookmakers".

Tips

  • Cheapest line-shopping feed: markets: ["moneyline"] is one request per event instead of three.
  • One run, many days: days: [0, 1, 2] costs one run start, not three.
  • Which line you get on spreads and totals: bookmakers quote a dozen handicaps and totals per event. The Actor returns the main line, the one the most bookmakers quote on both sides, with ties going to the most balanced prices. That is the line a comparison site shows by default.
  • Not every event has every market. Small competitions often have a moneyline and nothing else; the missing markets come back null, never guessed.
  • Pick the country before the sport. A GB proxy turns a 4-bookmaker event into a 15-bookmaker one at the same price per event.

FAQ

Does it need a login or an API key? No. It reads public pages.

Are these live in-play odds? No. They are the pre-match prices the comparison site publishes. status: live returns events already under way, but with the site's published prices, not an in-play feed.

Does it cover the NFL, UFC or player props? No. The source carries the seven sports above and match markets only: moneyline or 1X2, Asian handicap and over/under. No props, futures, double chance or both-teams-to-score.

Can I get only bet365, or only William Hill? Set the proxy country to a market that bookmaker is licensed in and it appears in bookmakers, then filter on your side. There is no per-bookmaker input, and since you pay per event, filtering costs nothing extra.

American or fractional odds? Decimal only. Divide 1 by an odd for its implied probability before the bookmaker's margin.

Why did I get fewer events than maxItems? Events no bookmaker quotes are dropped and not billed. Small tennis and basketball circuits are often listed with no odds at all.

Why do two runs minutes apart show different prices? Bookmakers move their lines; that is what scrapedAt is for. If the bookmakers themselves changed between runs, the proxy country changed.

Is scraping betting odds legal? The Actor reads publicly available pages and collects match facts and published prices, no personal data. Scraping public information is generally lawful in the EU and the US, but you are responsible for how you use the output, including the source's terms of service, database rights where you operate, and gambling rules in your jurisdiction. Get legal advice before redistributing the data commercially.

Something broken, or a market missing? Open an issue on the Issues tab. Requests for more markets (double chance, both teams to score, draw no bet), every handicap line rather than the main one, or another sport are welcome there.