How to Scrape Bet365 Odds Around the World (2026)

Bet365 is the world’s largest online bookmaker by active users, and for quant modelers and odds arbitrageurs, scraping Bet365 odds is one of the highest-value data collection tasks you can tackle in 2026. the site serves localized odds across 90+ countries, runs aggressive anti-bot infrastructure, and geo-gates entire sports markets by region. getting clean, reliable data out of it requires more than a basic requests script.

What Bet365 Protects and Why It’s Hard

Bet365 runs Cloudflare Enterprise plus a proprietary fingerprinting layer that inspects TLS JA3 signatures, browser canvas/webGL hashes, and mouse entropy before serving any odds payload. attempts to fetch odds via raw HTTP fail at the TLS handshake level — Cloudflare drops connections with a non-standard JA3 that doesn’t match a real browser.

the odds themselves aren’t served as JSON in the initial HTML. they load via WebSocket subscriptions after page render. this means Playwright or Puppeteer in headed mode is the baseline, not requests or httpx. if you’re building a multi-book pipeline, read How to Scrape Betting Odds from Multiple Bookmakers first — it covers the shared infrastructure patterns that apply here too.

key protections to plan around:

  • TLS fingerprint checks (JA3 + JA3S)
  • WebSocket-delivered odds (no REST endpoint)
  • IP reputation scoring with aggressive banning
  • Session token rotation every 8-12 minutes
  • Country-gated markets (AU odds differ from UK odds by design)

Geo-Access Strategy: Which IPs Work Where

Bet365 segments odds by country. UK users see different lines than Australian users, and US-state-level access is blocked entirely (Bet365 has no US license). to collect global odds, you need residential or mobile IPs in each target jurisdiction.

RegionIP Type NeededAvg Session DurationBlock Rate (2026)
UKResidential12-20 minLow
AustraliaResidential / Mobile8-15 minMedium
CanadaResidential10-18 minLow-Medium
SingaporeMobile (4G/5G)15-25 minLow
GermanyResidential6-12 minHigh
Hong KongMobile20-30 minLow

mobile IPs outperform datacenter and even most residential proxies on Bet365 because they carry real carrier ASNs and rotating IPs tied to actual SIM sessions. for Singapore and HK coverage specifically, SG-based 4G mobile proxies give unusually long sessions before triggering blocks.

for comparison, datacenter IPs get banned within 1-3 requests on average in 2026. don’t use them.

Extracting Odds via Playwright + WebSocket Interception

the cleanest approach is to intercept the WebSocket frames after authentication. Bet365 sends odds updates as MessagePack-encoded binary frames over wss://premws-pt3.365lpcdn.com. here’s a working skeleton:

from playwright.async_api import async_playwright
import asyncio, msgpack

async def capture_odds(proxy_url: str):
    async with async_playwright() as p:
        browser = await p.chromium.launch(
            proxy={"server": proxy_url},
            args=["--disable-blink-features=AutomationControlled"]
        )
        ctx = await browser.new_context(
            user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36",
            viewport={"width": 1440, "height": 900}
        )
        page = await ctx.new_page()

        ws_frames = []

        page.on("websocket", lambda ws: ws.on(
            "framereceived",
            lambda f: ws_frames.append(msgpack.unpackb(f.payload, raw=False))
            if isinstance(f.payload, bytes) else None
        ))

        await page.goto("https://www.bet365.com/#/AS/B1/", wait_until="networkidle")
        await asyncio.sleep(8)  # allow WS subscription to populate
        await browser.close()

    return ws_frames

pass a residential or mobile proxy via proxy_url. run this without a real proxy and you’ll hit a Cloudflare block within seconds. session warm-up (visiting the homepage first, then navigating to a sport) reduces detection significantly compared to direct deep-linking.

Session Management and Rotation

Bet365 sessions expire silently. the WebSocket disconnects, the page stops updating, and you continue collecting stale odds without knowing it. build explicit session health checks:

  1. monitor the WebSocket ping interval — Bet365 pings every 30 seconds; if you miss two pings, the session is dead
  2. track X-Bet365-Session-Token headers in network requests and compare against a known-good baseline
  3. set a hard session ceiling of 10 minutes regardless of apparent health, then rotate the proxy IP and re-authenticate
  4. on re-auth, clear all cookies and localStorage before navigating — carrying stale cookies from a flagged session poisons the new IP

the rotation ceiling matters more than it seems. most teams that get banned in bulk are over-rotating (hammering new IPs every 60 seconds) rather than under-rotating. 8-10 minutes per session is the sweet spot empirically.

if you’re also collecting US sportsbooks and need a contrast — How to Scrape DraftKings Odds and Lines (2026) covers a platform with a public API tier that makes rotation far less critical. similarly, How to Scrape FanDuel Sportsbook Odds Programmatically (2026) shows how structured API access changes the scraping architecture entirely.

Parsing the Odds Payload

once you have raw WebSocket frames, the schema is proprietary but consistent. Bet365 sends:

  • a subscription confirmation frame on connect (type byte 0x01)
  • full market snapshot on first subscription (type 0x02, large payload)
  • delta updates as odds shift (type 0x03, small targeted patches)

extract the following fields from each market object:

  • fi — fixture ID, maps to match
  • id — selection ID
  • od — decimal odds (as string, convert to float)
  • su — suspension flag (1 = suspended, skip)
  • ha — handicap value where applicable

store raw frames alongside parsed output. Bet365 schema has changed 3 times in the last 18 months, and having the raw binary lets you replay and re-parse without re-scraping.

for sharp model inputs using closing line value, How to Scrape Pinnacle Sports Lines for Sharp Models (2026) pairs well here — Pinnacle’s closing lines are the standard benchmark for CLV calculations. and for multi-state US market coverage, How to Scrape BetMGM Lines Across States (2026) walks through the geo-routing approach for a licensed US operator.

Error Handling and Failure Modes

Bet365 doesn’t return friendly 403s. common failure signatures:

  • ERR_CONNECTION_RESET at page load: IP banned or flagged ASN
  • page loads but odds section shows “unavailable”: country mismatch or VPN-detected residential IP
  • WebSocket connects but no frames after 15 seconds: session token rejected
  • odds load once, then freeze: session expired silently (most common issue)

build a retry wrapper that classifies failures before retrying. blind retries with the same IP after a CONNECTION_RESET burn through your proxy pool for nothing. rotate IP first, then retry.

short checklist before a scraping run:

  • confirm proxy IP resolves to correct country (check ASN via ipinfo.io)
  • verify no prior cookies from flagged sessions in browser context
  • test WebSocket connectivity in isolation before full scraping loop
  • confirm target sport and market is available in that jurisdiction

Bottom Line

scraping Bet365 odds globally in 2026 is a Playwright-plus-mobile-proxy problem, not a simple HTTP scraping task. residential IPs with real carrier ASNs in your target jurisdiction, WebSocket interception, and strict 8-10 minute session ceilings get you reliable, low-ban-rate collection. skip datacenter IPs entirely. DRT covers the full sportsbook scraping landscape including tooling comparisons and proxy infrastructure guides for anyone building a serious odds pipeline.

Related guides on dataresearchtools.com

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top

Resources

Proxy Signals Podcast
Operator-level insights on mobile proxies and access infrastructure.

Multi-Account Proxies: Setup, Types, Tools & Mistakes (2026)