Bet365 Odds Scraper - Live, Pre-Match & Player Props
Pricing
from $2.49 / 1,000 odds selections
Bet365 Odds Scraper - Live, Pre-Match & Player Props
Scrape Bet365 betting odds in one run: live in-play, pre-match 1X2, player props, and outrights across 30+ sports. Event, market, selection, plus decimal, American, and fractional prices. Unofficial Bet365 API alternative — Python, Node.js, MCP.
Pricing
from $2.49 / 1,000 odds selections
Rating
0.0
(0)
Developer
Andrej Kiva
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
4 days ago
Last modified
Categories
Share
Unofficial community Actor. Not affiliated with Bet365 or Hillside. For informational and research use only — this Actor does not place bets or provide betting advice. You are responsible for complying with applicable laws and platform terms.
Bet365 scraper and Bet365 API alternative for live in-play odds, pre-match lines, player props, outrights, and the sports / competition catalog. One run returns one row per selection (or catalog entity) you can export as JSON, CSV, or Excel, call from Python or Node.js, or drive from MCP / AI assistants. No Bet365 login.
Sports betting suite
| Actor | Role |
|---|---|
| Bet365 Odds Scraper ◄── you are here | Bet365 live, pre-match, props, outrights |
| PrizePicks Player Props Scraper | US DFS pick'em lines |
| Underdog Fantasy Player Props | Underdog props & odds |
| DFS Multi-Source Props Scraper | Cross-platform props board |
| FotMob Scraper | Football scores, xG, ratings |
Suite next step: after a Bet365 snapshot, run DFS Multi-Source Props Scraper to compare sportsbook lines with PrizePicks / Underdog / Pick6 boards, or FotMob Scraper for match xG and ratings.
When to use
- Pull a live in-play board (event, market, current prices) for soccer, tennis, basketball, and 30+ other sports
- Snapshot pre-match 1X2 and listed markets for a sport
- Expand a match into player props / extra markets via event mode
- Export outrights (league winner, top scorer, futures)
- Build a sports and competition directory (PDs and event ids) to feed later runs
When not to use: historical closing-line warehouses, multi-book aggregators, or account-gated bet history. This Actor reads the public sportsbook board only.
Key features
- Six modes —
sports,competitions,inplay,prematch,event,outrights(+auto) - One row per selection — CSV-friendly unroll (market × outcome), plus catalog rows when you only need the directory
- Three odds formats — decimal (default), American, fractional; all three stored when a price exists
- 30+ sports — soccer, tennis, NBA/WNBA, NFL, MLB, NHL, MMA, esports, golf, cricket, darts, rugby, racing, …
- Geo hosts —
es(default English sportsbook),de,it,nl,com - Browser intercept for prices — Camoufox captures live splash / in-play coupons; catalog stays on HTTP
- Residential ES/GB proxy required for odds — datacenter IPs typically see empty coupons
- Empty coupons not billed as odds — failed price lookups are not written as fake selections
Input
| Field | Type | Default | Description |
|---|---|---|---|
mode | string | prematch | auto, sports, competitions, inplay, prematch, event, outrights |
sport | string | soccer | Sport slug, or all |
eventIds | string[] | [] | Event / competition ids (event mode) |
eventPds | string[] | [] | Native path descriptors |
eventUrls | string[] | [] | Sportsbook hash URLs |
oddsFormat | string | decimal | decimal / american / fractional |
site | string | es | es, de, it, nl, com |
language | string | en | Menu language |
maxItems | integer | 0 | Cap dataset size (0 = unlimited) |
proxyConfiguration | object | residential ES | Apify Proxy; residential Spain or UK for live / pre-match odds |
Example — live soccer in-play:
{"mode": "inplay","sport": "soccer","oddsFormat": "decimal","site": "es"}
Example — Premier League PD (from competitions mode) then event markets:
{"mode": "event","eventPds": ["#AC#B1#C1#D1002#E91422157#G40#"],"oddsFormat": "american","site": "es"}
Example URL inside input (not a markdown link):
{"mode": "event","eventUrls": ["https://www.bet365.es/#/AC/B1/C1/D8/E149821034/F2/"]}
Output
| Field | Description |
|---|---|
recordType | sport · competition · event · odds |
sport / sportSlug / sportId | Classification |
league / eventName / eventId / pd | Fixture keys (reuse pd in event mode) |
homeTeam / awayTeam | Split from event name when possible |
marketName / selection / handicap | Market unroll |
odds | Price in oddsFormat |
oddsDecimal / oddsAmerican / oddsFractional | Always filled together when a price exists |
isInPlay / suspended / capturedAt | Live flags + UTC snapshot |
Example odds row:
{"recordType": "odds","sport": "Football","sportSlug": "soccer","league": "MLS","eventName": "Inter Miami v Toronto FC","eventId": "199038810","homeTeam": "Inter Miami","awayTeam": "Toronto FC","marketName": "Full Time Result","selection": "Inter Miami","odds": "1.36","oddsDecimal": 1.36,"oddsAmerican": "-278","oddsFractional": "4/11","isInPlay": false,"capturedAt": "2026-08-21T22:51:18.000Z"}
Use cases
- In-play monitoring — schedule the Actor on soccer/tennis live boards
- Pre-match dumps — daily coupon snapshot for modeling or CMS widgets
- Props research — event mode after you have a Bet365 event id from competitions
- DFS line shop — join Bet365 player markets with PrizePicks / Underdog on player name
- Outrights tracker — league winner / top scorer futures into a sheet
Integration examples
Node.js
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('crawloop/bet365-odds-scraper').call({mode: 'prematch',sport: 'soccer',oddsFormat: 'decimal',site: 'es',maxItems: 200,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items[0]);
Python
from apify_client import ApifyClientclient = ApifyClient("YOUR_TOKEN")run = client.actor("crawloop/bet365-odds-scraper").call(run_input={"mode": "inplay", "sport": "soccer", "site": "es"})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item.get("eventName"), item.get("selection"), item.get("odds"))
cURL
curl "https://api.apify.com/v2/acts/crawloop~bet365-odds-scraper/runs?token=$APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"mode":"sports","site":"es","maxItems":50}'
MCP and AI assistants
Use this Actor from AI tools via Apify MCP. Add the Apify MCP server in Claude Desktop, Cursor, or any MCP client, connect your Apify account, then call this Actor by its Store name crawloop/bet365-odds-scraper.
Example prompts:
- "Run Bet365 Odds Scraper in inplay mode for soccer and return the top 30 rows as JSON"
- "Scrape Bet365 pre-match basketball odds in American format and summarize the shortest prices"
- "Chain Bet365 Odds Scraper then DFS Multi-Source Props Scraper for the same NBA slate"
FAQ
Is this an official Bet365 API? No. It is an unofficial scraper of the public sportsbook board.
Why do I get catalog rows instead of odds? Live prices are geo-sensitive. Set site to es and use Apify residential proxies in Spain or the UK (apifyProxyCountry: ES or GB), then rerun inplay or prematch. Catalog modes (sports, competitions) do not need prices.
How do I get a match’s player props? Run competitions or prematch first, copy eventId / pd, then run event mode.
Does it need a Bet365 account? No. Login-gated pages are out of scope.
Python, Node.js, or MCP? All three. Use the Apify client snippets above, or call the Actor from an MCP-connected assistant.