Official Python client for UKOddsApi — live football odds from 25+ UK bookmakers.
Bet365 · Sky Bet · Paddy Power · William Hill · Ladbrokes · Coral · Betfred · BetVictor · 888sport · Unibet · BoyleSports · Betway · Betfair Exchange · Matchbook · Smarkets · and more
pip install ukoddsapifrom ukoddsapi import UKOddsApi
client = UKOddsApi("your_api_key")
# Get today's Premier League fixtures
events = client.get_events(league="premier-league", schedule_date="2026-04-25")
# Get odds from all UK bookmakers
odds = client.get_odds(events["events"][0]["event_id"])
for market in odds["markets"]:
print(market["market_name"])
for sel in market["selections"]:
print(f" {sel['selection_name']}: {sel['odds']} @ {sel['bookmaker_name']}")- 25+ UK bookmakers — every major UK high street brand plus exchanges
- 100+ markets — match odds, player props, team props, corners, cards
- Arbitrage detection — built-in endpoint with stake plans (Scale plan)
- Best odds — instantly find the highest price per selection
- Batch requests — odds for up to 50 events in one call
- ETag caching — skip unchanged data and save API calls
- Historical odds — track odds movement over time
- Automatic retries — handles rate limits and server errors gracefully
odds = client.get_odds("evt_arsenal_chelsea_2026_04_25")
for market in odds["markets"]:
for sel in market["selections"]:
print(f"{sel['selection_name']}: {sel['odds']} @ {sel['bookmaker_name']}")best = client.get_best_odds("evt_arsenal_chelsea_2026_04_25")
for market in best["markets"]:
for sel in market["selections"]:
print(f"{sel['selection_name']}: {sel['odds']} @ {sel['bookmaker_name']}")# Bet365 only
odds = client.get_odds("evt_arsenal_chelsea_2026_04_25", bookmaker_codes="UO004")
# Bet365 + Sky Bet
odds = client.get_odds("evt_arsenal_chelsea_2026_04_25", bookmaker_codes="UO004,UO020")odds = client.get_odds(
"evt_arsenal_chelsea_2026_04_25",
package="full",
market="goalscorer",
)
for market in odds["markets"]:
for sel in market["selections"]:
print(f"{sel['selection_name']}: {sel['odds']} @ {sel['bookmaker_name']}")from datetime import date
arbs = client.get_arbitrage(
date=date.today().isoformat(),
min_profit=0.5,
total_stake=500,
)
for arb in arbs["arbitrages"]:
print(f"{arb['event_title']} — {arb['market_name']}")
print(f"Profit: {arb['profit_percentage']:.2f}%")
for leg in arb["stake_plan"]["legs"]:
print(f" {leg['bookmaker_name']}: {leg['selection']} @ {leg['odds']} — £{leg['stake_amount_final']}")events = client.get_events(league="premier-league")
event_ids = [e["event_id"] for e in events["events"][:20]]
batch = client.get_odds_batch(event_ids)
print(f"Fetched odds for {batch['returned']} events")import time
while True:
odds = client.get_odds("evt_arsenal_chelsea_2026_04_25", use_etag=True)
if odds is None:
print("No change")
else:
print(f"Updated: {odds['captured_at']}")
# Process new odds...
time.sleep(30)timeline = client.get_odds_timeline(
event_id="evt_arsenal_chelsea_2026_04_25",
market_id=101,
selection_name="Arsenal",
bookmaker_code="UO004",
)# Decimal (default)
odds = client.get_odds(event_id, odds_format="decimal")
# Fractional (UK-style)
odds = client.get_odds(event_id, odds_format="fractional")
# American
odds = client.get_odds(event_id, odds_format="american")from ukoddsapi import UKOddsApi, RateLimitError, AuthenticationError, UKOddsApiError
client = UKOddsApi("your_api_key")
try:
odds = client.get_odds("evt_example")
except AuthenticationError:
print("Invalid API key")
except RateLimitError as e:
print(f"Rate limited — retry after {e.retry_after} seconds")
except UKOddsApiError as e:
print(f"API error {e.status_code}: {e.detail}")| Method | Description | Plan |
|---|---|---|
verify() |
Check API key is valid | All |
get_bookmakers() |
List all 25+ UK bookmakers | All |
get_sports() |
List supported sports | All |
get_leagues() |
List football leagues | All |
get_countries() |
List football countries | All |
get_competitions() |
List competitions (catalog) | All |
get_markets() |
List available market types | All |
get_events() |
List fixtures by date/league | All |
get_event_markets() |
Markets available on an event | All |
get_odds() |
Full odds from all bookmakers | Starter+ |
get_best_odds() |
Best price per selection | Starter+ |
get_odds_batch() |
Odds for up to 50 events | Starter+ |
get_arbitrage() |
Find arb opportunities by date | Scale |
get_event_arbitrage() |
Arbs on a specific event | Scale |
get_odds_timeline() |
Historical odds movement | Pro+ |
get_account() |
Account info and usage | All |
This table is a partial excerpt of common UK bookmakers. The full (and most up-to-date) list is returned by the API.
| Code | Bookmaker | Type |
|---|---|---|
| UO004 | Bet365 | Sportsbook |
| UO020 | Sky Bet | Sportsbook |
| UO018 | Paddy Power | Sportsbook |
| UO027 | William Hill | Sportsbook |
| UO015 | Ladbrokes | Sportsbook |
| UO013 | Coral | Sportsbook |
| UO007 | Betfred | Sportsbook |
| UO005 | BetVictor | Sportsbook |
| UO002 | 888sport | Sportsbook |
| UO024 | Unibet | Sportsbook |
| UO012 | BoyleSports | Sportsbook |
| UO008 | Betway | Sportsbook |
| UO006 | Betfair | Exchange |
| UO017 | Matchbook | Exchange |
Fetch the full list:
from ukoddsapi import UKOddsApi
import os
client = UKOddsApi(os.environ["UKODDS_API_KEY"])
bookmakers = client.get_bookmakers()["bookmakers"]
print("\n".join(f"{b['bookmaker_code']} {b['name']} ({b['type']})" for b in bookmakers))- UKOddsApi — sign up for an API key
- API documentation
- Node.js SDK
MIT