bet365 Odds Scraper - Live Sports, Fixtures & Betting Markets avatar

bet365 Odds Scraper - Live Sports, Fixtures & Betting Markets

Pricing

from $3.40 / 1,000 odds snapshots

Go to Apify Store
bet365 Odds Scraper - Live Sports, Fixtures & Betting Markets

bet365 Odds Scraper - Live Sports, Fixtures & Betting Markets

Scrape bet365 live in-play and pre-match odds across 20+ sports. Extract fixture listings, full event betting markets, decimal odds and price snapshots. Supports scheduled incremental monitoring to track odds changes over time.

Pricing

from $3.40 / 1,000 odds snapshots

Rating

0.0

(0)

Developer

Abot API

Abot API

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Categories

Security

Limited permissions

Share

Bet365 Odds Scraper

Live and pre-match bet365 odds snapshots for every sport on the board: in-play fixtures with their current displayed prices, sport-by-sport pre-match walks, and full per-event market boards. One actor for the odds, the live state, and scheduled odds monitoring.

Why This Scraper?

  • Six sports, competition by competition. Soccer, tennis, basketball, ice hockey, baseball and American football. Sport mode walks every competition the site lists for the sport and reads each fixture's listed prices and start time; the live In-Play grid is read for the region you pick.
  • The live state rides along. Each fixture snapshot carries the game-status line (period, clock state) and a broadcast marker where bet365 offers live video, so in-play monitoring needs no second source.
  • Full market boards per event. Paste bet365 event links and the run reads the complete market board: every listed group and selection with its displayed price, converted to decimal alongside the book's own display.
  • Built for scheduled monitoring. Incremental mode keeps a per-scope baseline and emits NEW, UPDATED, REAPPEARED and EXPIRED fixtures. Odds movements are the change signal, while the ticking status line and clock never bill a phantom update.
  • Residential by default. bet365 refuses datacenter connections outright; the actor ships with residential exits in your chosen region and honours your own proxy URLs if you bring them.

Use Cases

  • Traders and model builders: pull pre-match and in-play prices for the sports you follow on a schedule, and diff odds movements between runs.
  • Live-betting monitors: watch the In-Play board for a region and alert when a fixture's displayed price moves.
  • Tipster and content pipelines: read full market boards for pasted event links to publish a match's complete market list.
  • Multi-region coverage: run one scope per region (GB, Ontario/CA, AU and more) with separate incremental baselines.

Data You Get

Sample shape: values are illustrative placeholders, not from a live record.

FieldExample
idbet365:9c2f41ab77e31d
matchupA Rublev vs T Etcheverry
home / awayA Rublev / T Etcheverry
sporttennis
status84:04 (live clock) or Wed 04 Nov 10:00 UTC (pre-match start)
eventStatusWed 04 Nov 10:00 UTC (event reads)
prices[]{"label": "1", "handicap": null, "displayPrice": "4/11", "decimalPrice": 1.364, "suspended": false, "selectionId": "375600849"}
competition / competitionIdATP Paris / 21181217 (sport mode)
startTime / round2026-11-04T10:00:00+00:00 / Round 2 (sport mode)
fixtureId / sportId / leagueCode204006513 / B13 / ATP1-R2
homeTeamId / awayTeamId199708 / 93817 where the site lists them
inPlay / scoretrue / 0-2 (live rows; inPlay is false on pre-match rows). score is the two-number score of football-style fixtures; set-based sports such as tennis show several score cells, so score is left out for them
resultOdds{"home": 1.667, "away": 2.2} named decimal match-result odds, plus draw for three-way sports (sport mode)
selections[]{"market": "Total Games 2-Way", "marketId": "130107", "selectionId": "375743553", "name": "Over 23.5", "column": "Over", "line": "23.5", "odds": "5/6", "decimalPrice": 1.833, "handicap": "23.5", "suspended": false}
marketGroups[]["Match Result", "Both Teams to Score"]
hasLiveMediatrue
urlhttps://www.bet365.com/#/AA/...
oddsTimestamp2026-11-03T10:00:00+00:00
changeType / changedFieldsUPDATED / ["prices"]
firstSeenAt / lastSeenAt2026-11-01T... / 2026-11-03T...
detailFetchedtrue

How to Use

The run reads bet365 as its own app renders it, a real browser session on a residential exit in your chosen region. Pick a mode, set Max items, and run.

Run it from your code

Python:

from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("abotapi/bet365-odds-scraper").call(run_input={
"mode": "live",
"region": "GB",
"maxItems": 20,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)

JavaScript:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });
const run = await client.actor('abotapi/bet365-odds-scraper').call({
mode: 'live',
region: 'GB',
maxItems: 20,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

Search the live board: set Mode to live for the In-Play snapshot.

Walk a sport's pre-match board: set Mode to sport and choose the sport. Each fixture lists the prices the site shows for it, one entry per selection with the column label (1/X/2 for match result, Spread for US sports). Fixtures that have already started or have no pre-match prices listed are skipped, so every sport-mode row carries at least one price (use the live board for in-play games). For US-style fixtures (basketball, ice hockey, baseball, American football) the site lists the away side first, so the two entries follow that order; the handicap sign tells you the line.

Read pasted events: set Mode to urls and paste bet365 event links. Each link routes the live app to that event's page; the row ships with detailFetched true when the full market board was read, false when the site's current board layout was not recognized (the row still identifies the event).

Input examples

Live board snapshot (default):

{ "mode": "live", "region": "GB", "maxItems": 20 }

Walk one sport's pre-match board:

{ "mode": "sport", "sport": "soccer", "region": "GB", "maxItems": 50 }

Read pasted events with full market boards:

{
"mode": "urls",
"urls": [{ "url": "https://www.bet365.com/#/AA/as/" }],
"region": "GB"
}

Scheduled incremental monitoring (Ontario region):

{
"mode": "live",
"region": "CA",
"incrementalMode": true,
"stateKey": "ontario-live",
"maxItems": 100
}

Input Parameters

ParameterTypeDefaultDescription
modeSelectlivelive = In-Play board snapshot; sport = one sport's pre-match board; urls = pasted event links, full board each.
sportSelectsoccerWhich sport board to walk in sport mode (soccer, tennis, basketball, ice hockey, baseball, American football).
urlsList-bet365 event page links (www.bet365.com/#/... deep links) for urls mode.
regionSelectGBWhich bet365 regional site to read; the run exits from this region. Use CA for the Ontario site.
fetchDetailsBooleantrueUrls mode always reads each pasted event's full board; documents the board surcharge.
maxItemsInteger20Stop after this many fixture snapshots. Leave 0 for no limit.
proxyProxyResidential, region exitResidential exits in the selected region are required; the site refuses datacenter connections.
resumeFromRunIdString-Continue a previous run: fixtures that run already delivered are skipped.
incrementalModeBooleanfalseScheduled monitoring: keep a per-scope baseline and emit NEW, UPDATED, REAPPEARED, EXPIRED fixtures.
stateKeyString-Optional name for the incremental baseline; use separate keys per scope.
emitUnchangedBooleanfalseIncremental mode: also push fixtures whose odds did not move.
emitExpiredBooleanfalseIncremental mode: after a complete scan, push rows for fixtures no longer present.
ignoreFieldsForChangesList-Incremental mode: extra fields that must never mark a row UPDATED. The ticking status and clock are already ignored.
mcpConnectorsList-Apify MCP connector IDs to notify with the first collected rows.

Output Example

The dataset carries fixture snapshots; the Output tabs split fixtures, displayed prices, full market boards and incremental changes.

Sample shape: values are illustrative placeholders, not from a live record.

{
"id": "bet365:9c2f41ab77e31d",
"matchup": "A Rublev vs T Etcheverry",
"home": "A Rublev",
"away": "T Etcheverry",
"status": "Set 1 Game 4",
"hasLiveMedia": true,
"prices": [
{ "handicap": null, "displayPrice": "4/11", "decimalPrice": 1.364 },
{ "handicap": null, "displayPrice": "11/5", "decimalPrice": 3.2 }
],
"oddsTimestamp": "2026-11-03T10:00:00+00:00"
}

Plan Requirement

This actor is billed per event: a start charge per run, a charge for each fixture snapshot delivered, and a charge for each full market board read in urls mode. A paid Apify plan is required. Residential proxy usage is included with your plan's residential allowance, and datacenter plans cannot run this actor because bet365 refuses datacenter connections.

FAQ

How much does a run cost?

Each run bills the start event once, each fixture snapshot delivered, and each full market board read in urls mode. The run reads the site as a real app session, so the start cost is the same whether you collect 5 snapshots or 500: schedule fewer, larger runs (a high Max items) instead of many small ones, and the per-row cost drops accordingly. A default 20-item run reads the In-Play board once and bills 20 snapshots plus the start. Your run's Pricing tab shows the live per-event prices for your plan.

The actor reads only the publicly displayed odds board of bet365's regional sites, without logging in and without taking any account-held data. Scraping publicly available sports-odds data is a common, widely served use case; you remain responsible for complying with bet365's terms and your local regulations, and gambling availability depends on your jurisdiction.

Can I schedule recurring odds monitoring?

Yes. Turn on incremental mode, set a stateKey, and schedule the actor. Each run keeps a baseline per scope and pushes only NEW, UPDATED, REAPPEARED or EXPIRED fixtures. Odds movements are the change signal; the ticking status line and clock never mark a row UPDATED.

Why did my run fail with "the site refused every connection"?

bet365 fronts aggressive connection scoring and refuses a large share of fresh exits; the actor rotates across fresh exits per read, but a wave can close every exit for a while. Re-run later; this is the site's edge, not a bug in the input.

Why does a sportboard sometimes show fewer fixtures than the site?

The live board rotates through the day: overnight windows genuinely have few live events, and suspended markets can hide rows. Pre-match walks (sport mode) carry the fullest board for the chosen sport.

Can I use this with AI agents and MCP?

Yes, the actor works from the Apify MCP server: add abotapi/bet365-odds-scraper and ask for odds naturally. Every field in the dataset is plain JSON for agents.

🔗 Want more sports data?

Pair this actor with these related scrapers from the same team:

⚽ Sportsbook Odds Scraper (1xBet, Melbet, Linebet, Paripulse)
Collect live and prematch betting odds from 1xBet, Melbet, Linebet and Paripulse. Give it...
⚽ SofaScore Scraper ⚽ Live Scores, Stats, Players & Odds
Pull structured sports data from SofaScore across football, basketball, tennis, and 20+...
⚽ FotMob Scraper ⚽ Match Details, Stats, Lineups & Players
Pull structured football data from FotMob: match details with scores, team stats, events...
⚽ OneFootball Scraper
Scrape public OneFootball data including football news, upcoming fixtures, match results...
⚽ Globo Esporte Scraper
Scrape public sports content from ge.globo.com, including news, videos, matches and feed...
⚽ JioHotstar Scraper
Scrape the JioHotstar catalog by content type or URL. Extract shows, movies, episodes...

👉 Browse all abotapi scrapers

💬 Support

  • 🐞 Found a bug or a missing field? Open a ticket on the Issues tab. We usually reply within hours.
  • 🛠️ Need another site, extra fields or a private build? Email contact@abotapi.com.
  • ⭐ Enjoying it? A quick review on the actor page helps other users find it.