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 websocketsYou'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 NoneNext Steps
- Check out our guide on building an arbitrage bot
- Read the full API documentation for all endpoints and parameters
- Explore the live demo to see real-time data in action