William Hill API: How to Access William Hill Odds Without Official API
Does William Hill have a public API? No. William Hill does not offer a public odds API, developer portal, or self-serve API key. Their pricing sits behind enterprise data contracts and — in the US — behind Caesars’ internal stack. An individual developer is not getting a William Hill API key.
If you have searched for “William Hill API,” “William Hill odds API,” or “William Hill API documentation,” you already hit the dead end. The official answer is no. But the odds themselves are not locked — you just need a different route to them.
OddsPapi aggregates William Hill odds alongside 350+ other bookmakers — including sharps like Pinnacle and Singbet, plus prediction markets like Kalshi and Polymarket — into a single REST API. Free tier. No enterprise contract. No scraping. Here is how to pull William Hill data in under five minutes, plus a finding most people miss: in the US feed, William Hill is Caesars.
Why William Hill Has No Public API
William Hill is one of the oldest bookmaker brands in the world (founded 1934), but “old and famous” does not mean “open.” There is no public developer program, and the corporate structure makes it messier than most:
- The brand is split in two. In 2021, Caesars Entertainment acquired William Hill, kept the US operations, and sold the international (UK/Europe) business to 888 Holdings. So “William Hill” is now two different operations running under one name.
- US pricing is Caesars’ pricing. William Hill US was folded into the Caesars trading stack. As you will see below, the OddsPapi feed shows William Hill and Caesars quoting byte-identical lines — because under the hood, they are the same book.
- Proprietary, regulated, and walled off. Like DraftKings, Bet365, and Pinnacle, William Hill has zero incentive to hand its prices to third-party developers for free. Any external access runs through private affiliate or enterprise deals, not a documented API.
This is the same wall every major sportsbook puts up — the same story as the Bet365 API and every other big book. Aggregators like OddsPapi collect the data through licensed feeds and expose it through one standardized endpoint — so you skip the contracts and the scraping entirely.
Scraping vs. Enterprise vs. OddsPapi
| Method | William Hill Data | Cost | Reliability | Legal Risk |
|---|---|---|---|---|
| Scraping William Hill | Partial (HTML parsing) | Free (your time) | Breaks constantly | Violates ToS |
| Enterprise / Affiliate Feed | Full | $5,000+/month | Stable | None (contracted) |
| OddsPapi API | Full (90+ markets per fixture) | Free tier available | 99.9% uptime, licensed feeds | None |
Scraping William Hill is fragile, rate-limited, and gets your IP banned the moment they touch their frontend. Enterprise feeds cost thousands a month and require a business relationship. OddsPapi gives you the same data through a clean REST API with a free tier — no contracts, no scraping, no ToS violations.
The William Hill = Caesars Finding (Proven in the Feed)
Here is the part you will not find in a press release. Query OddsPapi’s /v4/bookmakers catalog and you will see a slug called williamhill-nj with a cloneOf value of caesars — OddsPapi is literally telling you the New Jersey William Hill book is a Caesars clone.
You can confirm it from the live odds too. On a June 2026 MLB game (Baltimore Orioles vs. Toronto Blue Jays, 14 books on the fixture), William Hill and Caesars posted the exact same moneyline:
| Bookmaker | Orioles (Home) | Blue Jays (Away) | Vig / Margin | Type |
|---|---|---|---|---|
| William Hill | 1.80 | 2.05 | 4.34% | Soft (US = Caesars) |
| Caesars | 1.80 | 2.05 | 4.34% | Soft |
| FanDuel | 1.79 | 2.08 | 3.94% | Soft |
| DraftKings | 1.80 | 2.04 | 4.51% | Soft |
| Kalshi | 1.818 | 2.083 | 3.01% | Prediction market |
| Polymarket | 1.852 | 2.128 | ~1.0% | Prediction market |
| Pinnacle | 1.84 | 2.10 | 1.97% | Sharp benchmark |
Two takeaways. First, William Hill and Caesars are not “close” — they are identical to the third decimal, because in the US they are the same trading operation. If you are building a line-shopping tool, treat williamhill and caesars as one source in the US, not two independent quotes — see our Caesars Sportsbook API guide for the other half of this book. Second, William Hill’s 4.34% margin is a classic soft-book number, and both sides sit worse than Pinnacle’s no-vig fair price (Orioles ~1.88, Blue Jays ~2.14). The best available price on the underdog was at Polymarket (2.128) and Kalshi (2.083), not William Hill (2.05) — the prediction markets land right on Pinnacle’s fair line while the sportsbook clips you for the margin. That is exactly the kind of gap you only see when all seven books are in one API call.
What William Hill Data Is Available Through OddsPapi
OddsPapi pulls William Hill odds across major sports. On the MLB fixture above, William Hill alone priced 91 markets — not just the moneyline:
| Market Type | Example (MLB) | Market ID |
|---|---|---|
| Moneyline (Winner, incl. extra innings) | Orioles 1.80 / Blue Jays 2.05 | 131 |
| Run Line / Handicap | Handicap ±1.5 | 1386, 1368 |
| Totals (Over/Under, many lines) | Over 2.9 / Under 1.365 | 1334, 1324, 1332… |
| Inning Results | First Inning, Eighth Inning | 13100, 13121 |
| Odd / Even, First To Score | Team 1 Odd/Even, First Run | 13131, 13139 |
That is the full depth of a William Hill fixture — moneylines, run lines, totals across every line, inning props, and team specials — all updated in real time. Coverage is strongest where William Hill US (Caesars) trades: MLB, NBA, NFL, NHL, and major soccer. For a deeper MLB walkthrough (run lines, totals, props), see our MLB Odds API guide.
Step 1: Authenticate
OddsPapi authenticates with an API key passed as a query parameter — not a header. Grab a free key and test it:
import requests
API_KEY = "YOUR_API_KEY"
BASE_URL = "https://api.oddspapi.io/v4"
# apiKey is a QUERY PARAMETER, not a header
resp = requests.get(f"{BASE_URL}/sports", params={"apiKey": API_KEY})
print(resp.status_code) # 200 = you are in
Step 2: Find Fixtures With William Hill Odds
Pull fixtures for a sport in a date range, then keep only the ones flagged hasOdds. MLB is sport ID 13:
from datetime import datetime, timedelta, timezone
def get_fixtures(sport_id=13, days=2):
now = datetime.now(timezone.utc)
resp = requests.get(f"{BASE_URL}/fixtures", params={
"apiKey": API_KEY,
"sportId": sport_id,
"from": now.strftime("%Y-%m-%d"),
"to": (now + timedelta(days=days)).strftime("%Y-%m-%d"),
})
return [f for f in resp.json() if f.get("hasOdds")]
fixtures = get_fixtures()
print(f"{len(fixtures)} fixtures with odds")
for f in fixtures[:5]:
print(f["fixtureId"], f["participant1Name"], "vs", f["participant2Name"])
Step 3: Pull William Hill Odds for a Fixture
Request a single fixture’s odds and filter to the books you care about with the bookmakers parameter. The live /odds response nests prices under bookmakerOdds[slug]["markets"][marketId]["outcomes"][outcomeId]["players"]["0"]["price"]:
def get_odds(fixture_id, books="williamhill,caesars,pinnacle"):
resp = requests.get(f"{BASE_URL}/odds", params={
"apiKey": API_KEY,
"fixtureId": fixture_id,
"bookmakers": books,
})
return resp.json().get("bookmakerOdds", {})
def moneyline(book_data, market_id="131"):
# MLB Winner: outcome 131 = home (1), 132 = away (2)
outcomes = book_data["markets"][market_id]["outcomes"]
return {
"home": outcomes["131"]["players"]["0"]["price"],
"away": outcomes["132"]["players"]["0"]["price"],
}
odds = get_odds(fixtures[0]["fixtureId"])
for slug, data in odds.items():
try:
ml = moneyline(data)
print(f"{slug:14} Home {ml['home']} | Away {ml['away']}")
except KeyError:
pass # this book did not price the moneyline
Run this against a fixture both books price and you will see William Hill and Caesars print the same two numbers — the clone, live.
Step 4: Spot Value vs. the Sharp Line
William Hill is a soft book — it prices for recreational bettors and builds in a fat margin. Pinnacle is a sharp book whose no-vig line is the closest thing to true probability. When you de-vig Pinnacle and compare, you find where William Hill (and the wider market) is mispriced:
def devig_two_way(home, away):
inv_h, inv_a = 1 / home, 1 / away
total = inv_h + inv_a
return inv_h / total, inv_a / total # fair probabilities
def find_value(fixture_id, edge_threshold=0.02):
odds = get_odds(fixture_id, "williamhill,pinnacle,kalshi,polymarket")
if "pinnacle" not in odds:
return []
pin = moneyline(odds["pinnacle"])
p_home, p_away = devig_two_way(pin["home"], pin["away"])
fair = {"home": 1 / p_home, "away": 1 / p_away}
bets = []
for slug, data in odds.items():
try:
ml = moneyline(data)
except KeyError:
continue
for side in ("home", "away"):
edge = (ml[side] / fair[side]) - 1
if edge > edge_threshold:
bets.append((slug, side, ml[side],
round(fair[side], 3), round(edge * 100, 2)))
return sorted(bets, key=lambda x: x[4], reverse=True)
for slug, side, price, fair_price, edge in find_value(fixtures[0]["fixtureId"]):
print(f"+{edge}% {slug} {side} @ {price} (fair {fair_price})")
On the Orioles vs. Blue Jays game, Pinnacle’s de-vigged fair price on the underdog was about 2.14. William Hill offered just 2.05, while Polymarket (2.128) and Kalshi (2.083) sat right on the sharp fair line — the prediction markets gave you a materially better price than the sportsbook on the same outcome. Pulling William Hill, the sharps, and the prediction markets in one call is the entire point.
William Hill vs. Pinnacle: Why You Need Both
| Factor | William Hill (Soft) | Pinnacle (Sharp) |
|---|---|---|
| Target Market | Recreational bettors | Professional bettors |
| Margin (Overround) | 4-7% | 2-3% |
| Line Accuracy | Follows the market | Sets the market |
| Account Limits | Limits winning bettors | No limits |
| Best For | Finding +EV mispricing | True-odds benchmark |
When William Hill’s line diverges from Pinnacle’s, that is a signal — either William Hill mispriced the market or it is shading the line to manage recreational action. Either way you need both data sets to exploit it, and OddsPapi hands you both (plus Kalshi and Polymarket) in one request.
Free Historical William Hill Odds
Most providers charge for historical data. OddsPapi includes it on the free tier — hit /v4/historical-odds with a fixtureId and up to three bookmaker slugs to get the full price history for backtesting. The response shape differs from live odds: the top-level key is bookmakers (not bookmakerOdds), and each outcome’s players["0"] is a list of timestamped snapshots, not a single price.
def historical(fixture_id, books="williamhill,pinnacle"):
resp = requests.get(f"{BASE_URL}/historical-odds", params={
"apiKey": API_KEY,
"fixtureId": fixture_id,
"bookmakers": books, # max 3 per call
})
return resp.json().get("bookmakers", {})
hist = historical(fixtures[0]["fixtureId"])
for snap in (hist.get("williamhill", {})
.get("markets", {}).get("131", {})
.get("outcomes", {}).get("131", {})
.get("players", {}).get("0", [])):
print(snap["createdAt"], snap["price"])
That is a free William Hill closing-line dataset you can backtest a model against — something competitors gate behind four-figure plans.
Frequently Asked Questions
Does William Hill have a public API?
No. William Hill does not offer a public API, developer portal, or self-serve API key. Access exists only through enterprise and affiliate agreements. OddsPapi aggregates William Hill odds through licensed data feeds and exposes them via a standard REST API with a free tier.
Is William Hill the same as Caesars?
In the US, effectively yes. Caesars acquired William Hill in 2021, kept the US business, and migrated it onto the Caesars trading stack (the international William Hill business went to 888 Holdings). In the OddsPapi feed, William Hill and Caesars quote identical lines, and the williamhill-nj slug is tagged as a clone of caesars. For line shopping in the US, treat them as one source.
Can I scrape William Hill for odds data?
Technically possible, but it violates William Hill’s Terms of Service, breaks every time they update their frontend, and gets your IP rate-limited or banned. An aggregator API like OddsPapi is more reliable, legal, and maintainable.
What William Hill markets does OddsPapi cover?
OddsPapi pulls 90+ William Hill markets per fixture on major sports (MLB, NBA, NFL, NHL, soccer), including moneylines, run lines/spreads, totals across every line, inning props, and team specials — all updated in real time.
Can I get historical William Hill odds?
Yes. OddsPapi includes free historical odds on the free tier via the /v4/historical-odds endpoint. You can backtest models against William Hill closing lines without paying extra.
How much does it cost to access William Hill odds through OddsPapi?
OddsPapi offers a free tier with 250 requests per month — enough to build and test an app. Paid plans start at $29/month for higher rate limits and WebSocket access.
Stop Hunting for a William Hill API That Does Not Exist
William Hill will not give you an API key, and scraping their site is a maintenance trap. OddsPapi gives you William Hill odds — plus Caesars, Pinnacle, Kalshi, Polymarket, and 350+ more books — through one free odds API, with free historical data and a free tier to start. Get your free API key and pull your first William Hill line in five minutes.