# bet365 Live Odds Scraper (`tomko5peter/bet365-de-odds-scraper`) Actor

Extract live, in-play betting odds from bet365 regional sites (DE, ES, IT, UK, and more) in real time. Clean, structured dataset of matches, markets, and prices — ready for odds comparison, trading signals, or analytics. Residential proxy required.

- **URL**: https://apify.com/tomko5peter/bet365-de-odds-scraper.md
- **Developed by:** [Peter Tomko](https://apify.com/tomko5peter) (community)
- **Categories:** Automation, Developer tools, Integrations
- **Features:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 75.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$2.00 / 1,000 odds records

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

### What does bet365 Odds Scraper do?

**bet365 Odds Scraper extracts live, in-play betting odds** from [bet365](https://www.bet365.com) regional sites (Germany, Spain, Italy, UK, Greece, and more) in real time. It captures the same live price feed that powers bet365's own in-play coupon — matches, markets, outcomes, and prices — and delivers it as a clean, structured dataset within seconds of starting a run. No bet365 account, API key, or browser extension needed: just pick a domain and run it on Apify's infrastructure, with proxy rotation, scheduling, and API access built in.

#### Why use bet365 Odds Scraper?

- **Odds comparison & arbitrage research** — feed live bet365 prices into a comparison engine alongside other bookmakers.
- **Trading & quant models** — use real-time price movement as a signal source.
- **Market monitoring** — track how odds shift during a live match, minute by minute.
- **Historical archiving** — schedule runs on Apify to build a time-series dataset of odds movement.
- **Media & analytics dashboards** — power a live-odds widget or sports-data product without maintaining your own scraping infrastructure.

#### How to use bet365 Odds Scraper

1. Click **Try for free** and open the Actor's **Input** tab.
2. Pick a bet365 **domain** (e.g. `www.bet365.de`) and leave the default **start route** to scrape the live soccer coupon, or point it at another sport.
3. Click **Start** and wait while it captures the live odds stream (a few seconds to a few minutes, depending on the capture window).
4. Open the **Dataset** tab and export your results as JSON, CSV, Excel, or HTML — or pull them via the Apify API.

#### Input

The Actor takes a small, well-defined input — see the **Input** tab for the full form:

| Field | Description |
|---|---|
| `domain` | Which bet365 regional site to scrape (`www.bet365.de`, `www.bet365.com`, `www.bet365.es`, ...) |
| `startPath` | Which SPA route to open — defaults to the soccer coupon, but any in-play route works |
| `captureSeconds` | How long to capture the live odds stream before parsing (longer = more matches/markets captured) |
| `maxRetries` | How many times to retry a blocked or failed page load |
| `proxyConfiguration` | Proxy settings — a residential proxy in the target country is required and pre-filled by default |

Example input:

```json
{
  "domain": "www.bet365.de",
  "startPath": "#/AS/B1/",
  "captureSeconds": 30,
  "maxRetries": 3,
  "proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"], "apifyProxyCountry": "DE" }
}
```

#### Output

Each dataset item is one priced outcome — a single selection within a single market of a single match. Example:

```json
{
  "match_id": "203568702",
  "match_name": "Valencia v Real Madrid",
  "sport": "Football",
  "competition": "Spain - La Liga",
  "market_name": "Match Result",
  "market_id": "1777",
  "outcome_name": "Valencia",
  "odd": 3.01,
  "odd_fractional": "2/1",
  "handicap": null,
  "active": true,
  "selection_id": "390161112",
  "downloaded_at": "2026-11-07T21:38:00.630Z"
}
```

You can download the dataset in various formats such as JSON, HTML, CSV, or Excel, or access it programmatically via the Apify API.

#### Data table

| Field | Description |
|---|---|
| `match_name` | The two competing teams/players |
| `competition` | League or tournament name |
| `sport` | Sport the match belongs to |
| `market_name` | Betting market (e.g. Match Result, Total Goals) |
| `outcome_name` | The specific selection within the market |
| `odd` | Decimal odd |
| `odd_fractional` | Fractional odd, as shown on bet365 |
| `handicap` | Handicap/line value, where applicable |
| `active` | Whether the selection is currently open for betting |
| `selection_id` | bet365's internal ID for the selection — stable across runs, useful for tracking price movement |
| `downloaded_at` | Timestamp the row was captured |

#### Pricing / Cost estimation

This Actor uses **pay-per-event** pricing: you pay **$0.002 per odds record** delivered, and nothing else — there's no flat run fee, so a blocked or empty run costs you nothing. A typical 30-second capture of a busy live-sport coupon returns roughly 100-400 priced outcomes, so most runs cost well under $1.

#### Tips & advanced options

- Increase `captureSeconds` to catch more in-play matches and markets in one run; decrease it to keep runs fast and cheap.
- Change `startPath` to target a different sport's coupon (e.g. `#/AS/B18/` for basketball).
- Match the `proxyConfiguration` country to the `domain` you're scraping (e.g. DE proxy for `bet365.de`).
- Use the Apify **Scheduler** to run this Actor every few minutes and build a time-series of odds movement.

#### FAQ, disclaimers, and support

**Is this legal?** This Actor only extracts data that bet365 already serves publicly to any visitor's browser — no account login or paywalled content is involved. That said, scraping may be restricted by bet365's own Terms of Service, and rules on sports-betting data vary by jurisdiction. You're responsible for checking your local regulations and using the data in line with bet365's terms before relying on this Actor commercially.

**Known limitations:** a residential proxy in the target country is required — the Actor won't reliably return data through datacenter proxies. Occasional retries happen when bet365's anti-bot check needs a moment to clear.

This Actor isn't affiliated with, endorsed by, or sponsored by bet365. Found a bug or need a custom version (another bookmaker, extra fields, scheduled delivery)? Open an issue on the Actor's **Issues** tab, or get in touch for a custom solution.

# Actor input Schema

## `domain` (type: `string`):

Which bet365 regional site to scrape, e.g. www.bet365.de, www.bet365.com, www.bet365.es.

## `startPath` (type: `string`):

The bet365 SPA route to open after the homepage. Default opens the soccer coupon. Examples: #/AS/B1/ (soccer), #/AS/B18/ (basketball).

## `captureSeconds` (type: `integer`):

How long to capture the live odds WebSocket stream before parsing.

## `maxRetries` (type: `integer`):

Retries for a failed page load / blocked session before giving up.

## `proxyConfiguration` (type: `object`):

Residential proxy is REQUIRED to clear bet365's Cloudflare. Pick a country matching the domain (e.g. DE for bet365.de).

## Actor input object example

```json
{
  "domain": "www.bet365.de",
  "startPath": "#/AS/B1/",
  "captureSeconds": 25,
  "maxRetries": 3,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "DE"
  }
}
```

# Actor output Schema

## `dataset` (type: `string`):

Default dataset for this run — match snapshot rows (snapshot mode) or full market/outcome rows (extended mode). A fresh dataset is created per run.

## `summary` (type: `string`):

Key-value store record with { last_run, numberOfRecords, mode }.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "domain": "www.bet365.de",
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "DE"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("tomko5peter/bet365-de-odds-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "domain": "www.bet365.de",
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "DE",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("tomko5peter/bet365-de-odds-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "domain": "www.bet365.de",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "DE"
  }
}' |
apify call tomko5peter/bet365-de-odds-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,tomko5peter/bet365-de-odds-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/3Wv9KlnnyBFnglucy/builds/tcknq1D7szXphg7aZ/openapi.json
