Sports Odds Scraper: Football Odds Comparison by Bookmaker
Pricing
from $2.50 / 1,000 event with odds
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
Maintained by CommunityActor stats
0
Bookmarked
5
Total users
3
Monthly active users
17 days ago
Last modified
Categories
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?
| Field | Example | Notes |
|---|---|---|
eventId | GzrJ32nL | The source's id, stable across reruns. Use it as your key. |
sport | football | The sport this run covered. |
country | Spain | Country or region of the competition. |
competition | LaLiga | Competition name. |
league | Spain: LaLiga | The two joined as the source prints them. |
home, away | Real Sociedad, Celta Vigo | The two sides (players on tennis). |
startTime | 2026-09-03T19:00:00.000Z | Kick-off, ISO 8601 in UTC. |
status | scheduled | scheduled, live or finished. |
eventUrl | link | The event page on BetExplorer. |
moneylineType | 1x2 | 1x2 on three-way sports, home-away on two-way ones. |
bookmakerCount | 15 | How many bookmakers quote the event. Always 1 or more. |
bookmakers | array | One entry per bookmaker, see below. |
scrapedAt | 2026-09-03T17:15:51.597Z | When this run read the odds. Diff on it to get line movement. |
Each entry of bookmakers:
| Field | Shape | Notes |
|---|---|---|
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
| Sport | Moneyline | Leagues seen on the source (examples) |
|---|---|---|
| Football (soccer) | 1X2 | Premier League, LaLiga, Ligue 1, Serie A, Champions League, cups, lower divisions on every continent |
| Tennis | home/away | ATP, WTA, Challenger, ITF, singles and doubles |
| Basketball | home/away | NBA, Eurocup, FIBA Europe Cup, Champions League, national leagues |
| Ice hockey | 1X2 | NHL, AHL, KHL, Champions League, junior leagues |
| Baseball | home/away | MLB, KBO, NPB, CPBL |
| Volleyball | home/away | European national leagues and cups |
| Handball | 1X2 | European 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 byscrapedAt. - 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
statustofinishedanddaysto[-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
- Click Try for free to open the Actor in Apify Console.
- Pick a Sport.
- Set Days as offsets from today:
[0, 1]is today and tomorrow,[-1]is yesterday. Seven days either side of today are available. - Pick the Markets. Moneyline only is the fastest run; Asian handicap and totals add one request per event each.
- Optional: turn on Apify Proxy with the
RESIDENTIALgroup and a country to choose the bookmakers (see Choosing which bookmakers you get). - Click Start. A 50-event football run takes about 15 seconds.
- 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:
apifyProxyCountry | Bookmakers returned |
|---|---|
| none (Apify's own datacenter IP) | Stake.com, BetMGM.us, bet365.us, Fanduel |
GB | 10bet, 7BetUK, AllBritishCasino, BetUK, BetVictor, Betano.uk, Betfred, Betway, LeoVegasUK, Midnite, Paddy Power, Unibetuk, William Hill, bet365, bwin |
DE | Bet365.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)
| Run | Cost |
|---|---|
| Default input, 50 football events | $0.13 |
| A full weekday of football, about 100 events | about $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 ApifyClientclient = 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.
Related Actors
- Kalshi Prediction Markets Scraper: prediction-market prices, volume and order book, the other side of the odds.
- Flashscore Table Tennis Scraper, Flashscore Snooker Scraper and Flashscore Darts Scraper: live scores, results and fixtures.