TutorialPythonBet365

How to Get Real-Time Bet365 Odds in Python

6 min read

Bet365 Odds in Python

This tutorial shows you how to fetch real-time Bet365 odds using Python — from a simple GET request to a persistent WebSocket connection.

Prerequisites

bash
pip install requests websockets

You'll also need a PulseScore API key. Get one free here.

Method 1: REST API with requests

The simplest approach — make a GET request and parse the JSON response:

python
import requests

API_KEY = "YOUR_API_KEY"

# Fetch all live soccer events
response = requests.get(
    "https://api.pulsescore.net/api/v2/bet365/live-events",
    headers={"X-Secret": API_KEY},
    params={"sport": "soccer"}
)

events = response.json()

for event in events:
    print(f"{event['home']} vs {event['away']}")
    print(f"  Sport: {event['sport']}")
    print(f"  League: {event['league']}")

    for mg in event.get("mg", []):
        print(f"  Market: {mg['name']}")
        for ma in mg.get("ma", []):
            decimal = ma["pa"][0]["decimal"] if ma.get("pa") else "N/A"
            print(f"    {ma['name']}: {decimal}")
    print()

Method 2: Filter by Sport

python
# Soccer only
soccer = requests.get(
    "https://api.pulsescore.net/api/v2/bet365/live-events",
    headers={"X-Secret": API_KEY},
    params={"sport": "soccer"}
).json()

# Tennis only
tennis = requests.get(
    "https://api.pulsescore.net/api/v2/bet365/live-events",
    headers={"X-Secret": API_KEY},
    params={"sport": "tennis"}
).json()

print(f"Live soccer events: {len(soccer)}")
print(f"Live tennis events: {len(tennis)}")

Method 3: Pre-Match Odds

Pre-match data is organized by sport. First fetch leagues, then events for a league:

python
# Fetch soccer leagues
leagues = requests.get(
    "https://api.pulsescore.net/api/v2/bet365/leagues",
    headers={"X-Secret": API_KEY}
).json()

for league in leagues:
    print(f"{league['league']} — {len(league['events'])} events")

# Fetch events for a specific league
events = requests.get(
    "https://api.pulsescore.net/api/v2/bet365/events",
    headers={"X-Secret": API_KEY},
    params={"league": "Premier League"}
).json()

for event in events:
    print(f"{event['home']} vs {event['away']} (fi: {event['fi']})")

Method 4: WebSocket for Real-Time Streaming

For live applications that need instant updates (PRO/MAX plan required):

python
import asyncio
import json
import websockets

API_KEY = "YOUR_API_KEY"
WS_URL = f"wss://api.pulsescore.net/api/v2/bet365/ws/live?key={API_KEY}&sport=soccer"

async def stream_odds():
    async with websockets.connect(WS_URL) as ws:
        print("Connected to PulseScore WebSocket")

        async for message in ws:
            data = json.loads(message)

            if data.get("type") == "data":
                events = data.get("events", [])
                print(f"Received {len(events)} live events")

                for event in events[:3]:  # Print first 3
                    print(f"  {event['home']} vs {event['away']}")
                    for mg in event.get("mg", [])[:1]:
                        for ma in mg.get("ma", []):
                            print(f"    {ma['name']}: {ma['pa'][0]['decimal']}")

asyncio.run(stream_odds())

Error Handling

Always handle API errors gracefully:

python
def safe_fetch(sport="soccer"):
    try:
        response = requests.get(
            "https://api.pulsescore.net/api/v2/bet365/live-events",
            headers={"X-Secret": API_KEY},
            params={"sport": sport},
            timeout=10
        )
        response.raise_for_status()
        return response.json()
    except requests.exceptions.Timeout:
        print("Request timed out")
    except requests.exceptions.HTTPError as e:
        if e.response.status_code == 401:
            print("Invalid API key")
        elif e.response.status_code == 429:
            print("Rate limit exceeded")
        else:
            print(f"HTTP error: {e.response.status_code}")
    except requests.exceptions.RequestException as e:
        print(f"Request failed: {e}")
    return None

Next Steps