Skip to content

ukoddsapi/ukoddsapi-python-sdk

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

3 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

UKOddsApi Python SDK

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

Install

pip install ukoddsapi

Quick start

from 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']}")

Features

  • 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

Usage

Get odds from all bookmakers

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']}")

Get best odds per selection

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']}")

Filter by bookmaker

# 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")

Player props (Pro plan)

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']}")

Find arbitrage opportunities (Scale plan)

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']}")

Batch odds (up to 50 events)

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")

Efficient polling with ETags

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)

Historical odds timeline

timeline = client.get_odds_timeline(
    event_id="evt_arsenal_chelsea_2026_04_25",
    market_id=101,
    selection_name="Arsenal",
    bookmaker_code="UO004",
)

Odds formats

# 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")

Error handling

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}")

API reference

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

Bookmaker codes

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))

Links

License

MIT

About

Official Python client for UKOddsApi (https://ukoddsapi.com) — prematch sport odds from 25+ UK bookmakers.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages