Bookmaker.eu Odds API: 131 NBA Markets, Quarter Lines Included
The best provider for Bookmaker.eu odds is the one that lets you read the feed before you pay: on OddsPapi the free plan returns Bookmaker.eu’s live and historical prices next to Pinnacle and 300+ other bookmakers. SportsGameOdds and odds-api.io also list the book, and the table below sets out what each one charges for it.
Before you pick, know one thing about this feed. Bookmaker.eu, Betcris, JustBet and Sports411 are four brands on one price board. On 2 November 2026 the four slugs returned byte-identical prices on all 16 US fixtures we pulled. Count them as one book, and spend your bookmaker slots on something else.
Which Provider Is Best for Bookmaker.eu Odds?
We read each provider’s public pricing and bookmaker pages on 2 November 2026. Plans change, so check the linked page before you sign up.
| OddsPapi | SportsGameOdds | odds-api.io | OpticOdds | |
|---|---|---|---|---|
| Bookmaker.eu listed | Yes, bookmaker.eu |
Yes, bookmakereu |
Yes, BookMaker.eu | Not named on its public pages |
| Betcris, JustBet, Sports411 | All three, flagged cloneOf: bookmaker.eu |
Not listed | JustBet and Sports411 | Not named |
| Free plan | Yes, all sports and bookmakers, 250 requests a month | Amateur: 9 books, Bookmaker.eu not among them | New free keys paused | Not offered publicly |
| Entry price | Free | Plan for this book not stated; Rookie $99, Pro $299 | Solo £49 a month for 2 bookmakers | No public price; book a demo |
| Historical odds | On the free plan | From the Pro plan | On every plan | On request |
| WebSocket | B2B plan | All-Star (custom) plan | Any plan, at 2x the plan price | Not stated publicly |
The clone row matters more than it looks. On odds-api.io’s Solo plan you choose 2 bookmakers. If you pick BookMaker.eu and JustBet, you pay for two slots and get one set of prices. On OddsPapi the catalogue tells you which slugs share a feed, so you can pull Bookmaker.eu once and put Pinnacle in the same call. The Odds API does not list any of the four brands. For price across the whole market, see the 2026 odds API pricing comparison.
Find the Four Slugs Behind One Feed
The /bookmakers endpoint names every slug and the feed it copies. Filter on cloneOf to see the family.
import os, requests
API_KEY = os.environ["ODDSPAPI_API_KEY"]
BASE = "https://api.oddspapi.io/v4"
books = requests.get(f"{BASE}/bookmakers", params={"apiKey": API_KEY}).json()
family = [b for b in books
if b["slug"] == "bookmaker.eu" or b.get("cloneOf") == "bookmaker.eu"]
for b in family:
print(f'{b["slug"]:14} {b["bookmakerName"]:14} cloneOf={b.get("cloneOf")} liveOdds={b["liveOdds"]}')
Output on 2 November 2026:
betcris Betcris cloneOf=bookmaker.eu liveOdds=True
bookmaker.eu Bookmaker EU cloneOf=None liveOdds=True
justbet JustBet cloneOf=bookmaker.eu liveOdds=True
sports411.ag Sports411 cloneOf=bookmaker.eu liveOdds=True
Here the flag is right, but cloneOf does not catch every copy across the catalogue, so prove the identity on prices. The function below pulls all four slugs in one /odds call, turns each board into a sorted tuple of (marketId, outcomeId, price), and groups the slugs that match.
import os, time, requests
API_KEY = os.environ["ODDSPAPI_API_KEY"]
BASE = "https://api.oddspapi.io/v4"
FAMILY = ["bookmaker.eu", "betcris", "justbet", "sports411.ag"]
def price_tuples(fixture_id):
r = requests.get(f"{BASE}/odds", params={
"apiKey": API_KEY, "fixtureId": fixture_id, "bookmakers": ",".join(FAMILY)})
r.raise_for_status()
out = {}
for slug, book in r.json()["bookmakerOdds"].items():
out[slug] = tuple(sorted(
(mid, oid, o["players"]["0"]["price"])
for mid, m in book["markets"].items()
for oid, o in m["outcomes"].items()
if "0" in o["players"] and o["players"]["0"].get("active") is not False))
return out
def distinct_feeds(fixture_id):
tuples = price_tuples(fixture_id)
groups = {}
for slug, t in tuples.items():
groups.setdefault(t, []).append(slug)
return list(groups.values())
if __name__ == "__main__":
import sys
print(distinct_feeds(sys.argv[1]))
We ran it on 16 fixtures between 18:00 and 18:30 UTC on 2 November 2026: six NFL, six NBA and four NHL. Every run printed one group, [['betcris', 'bookmaker.eu', 'justbet', 'sports411.ag']]. If you average prices across books for a consensus line, drop three of the four first, or this one feed counts four times. The same trap applies to other US books; the sportsbook API guide covers the dedupe step for the rest of the board.
Read the NBA Markets Pinnacle Does Not Price
The feed leans to US sports. On the same evening it priced NFL, NBA and NHL fixtures, and none of the six Premier League fixtures we checked. On the NBA it runs a wider board than Pinnacle, because it prices quarter and half lines before tip-off.
import os, time, requests
from datetime import datetime, timedelta, timezone
API_KEY = os.environ["ODDSPAPI_API_KEY"]
BASE = "https://api.oddspapi.io/v4"
def get(path, **params):
while True:
r = requests.get(f"{BASE}/{path}", params={"apiKey": API_KEY, **params})
if r.status_code == 429:
time.sleep(r.json().get("retryMs", 2000) / 1000)
continue
r.raise_for_status()
return r.json()
names = {str(m["marketId"]): m["marketName"]
for m in get("markets", sportId=11)}
now = datetime.now(timezone.utc)
fixtures = get("fixtures", sportId=11, tournamentId=132,
**{"from": now.strftime("%Y-%m-%d"),
"to": (now + timedelta(days=2)).strftime("%Y-%m-%d")})
fixture = next(f for f in sorted(fixtures, key=lambda f: f["startTime"])
if f["hasOdds"] and f["startTime"] > now.isoformat())
time.sleep(1.0)
odds = get("odds", fixtureId=fixture["fixtureId"], bookmakers="bookmaker.eu,pinnacle")
def active_markets(slug):
markets = odds["bookmakerOdds"].get(slug, {}).get("markets", {})
return {mid for mid, m in markets.items()
if any(o["players"].get("0", {}).get("active") is not False
for o in m["outcomes"].values())}
bm, pin = active_markets("bookmaker.eu"), active_markets("pinnacle")
print(fixture["participant1Name"], "v", fixture["participant2Name"])
print("bookmaker.eu active markets:", len(bm), "| pinnacle:", len(pin))
for mid in sorted(bm - pin, key=lambda m: names.get(m, m))[:10]:
print(" ", mid, names.get(mid))
On Cleveland Cavaliers v Oklahoma City Thunder, about six hours before tip-off, the script printed:
Cleveland Cavaliers v Oklahoma City Thunder
bookmaker.eu active markets: 131 | pinnacle: 107
11354 Fourth Quarter Winner
118404 Handicap First Half
119150 Handicap First Quarter
119984 Handicap Fourth Quarter (incl. overtime)
119988 Handicap Fourth Quarter (incl. overtime)
...
Across six NBA fixtures that night, the extra markets were mostly third-quarter and fourth-quarter handicaps and totals. Each line number is its own market ID, so one “Handicap Fourth Quarter” family shows up as many rows. Two clocks matter here: the fourth-quarter markets that settle with overtime included carry (incl. overtime) in the name. Key on the name and the period, not on the line. The NBA alternate lines guide walks through the full ladder.
The Margin Against Pinnacle
A wider board does not mean a tighter price. We computed the overround (the sum of implied probabilities minus 1) on every market where both books priced every outcome.
| Tournament | Fixtures | Shared complete markets | Bookmaker.eu median margin | Pinnacle median margin | Winner market, Bookmaker.eu |
|---|---|---|---|---|---|
| NFL | 6 | 102 | 5.63% | 3.69% | 3.65% to 4.02% |
| NBA | 6 | 358 | 5.84% | 3.96% | 4.08% to 4.31% |
| NHL | 4 | 41 | 5.44% | 3.89% | 3.36% to 4.60% |
Pinnacle was tighter on all but six of the 501 shared markets. The one NFL winner market where Bookmaker.eu came in tighter was Kansas City Chiefs v New York Jets, at 3.99% against 4.41%. Use Bookmaker.eu for the markets it adds and as a US offshore price to shop against. Use Pinnacle as the reference.
Pull Bookmaker.eu History on a Played Fixture
The /historical-odds endpoint is on the free plan, and it keeps the record after the final whistle. The function below reads the Winner market (ID 111 on basketball), drops repeated snapshots, and returns one row per price change.
import os, requests
API_KEY = os.environ["ODDSPAPI_API_KEY"]
BASE = "https://api.oddspapi.io/v4"
def winner_history(fixture_id, slug="bookmaker.eu", market_id="111"):
r = requests.get(f"{BASE}/historical-odds", params={
"apiKey": API_KEY, "fixtureId": fixture_id, "bookmakers": slug})
r.raise_for_status()
outcomes = r.json()["bookmakers"][slug]["markets"][market_id]["outcomes"]
rows = []
for outcome_id, o in outcomes.items():
last = None
for snap in o["players"]["0"]: # a list of snapshots, oldest first
if snap["price"] != last: # keep price changes, drop repeats
rows.append((snap["createdAt"], outcome_id, snap["price"]))
last = snap["price"]
return sorted(rows)
if __name__ == "__main__":
import sys
rows = winner_history(sys.argv[1])
print(len(rows), "price changes; first", rows[0], "last", rows[-1])
On Minnesota Timberwolves v LA Clippers, tipped off at 00:00 UTC on 31 October 2026, it returned 925 price changes. The first came at 01:26 UTC on 30 October, 22.5 hours before tip-off. Only 76 of the 925 are pre-match; the other 849 are in-play. The last pre-match pair was 1.38 on the Timberwolves and 3.17 on the Clippers, which is your closing line. Cut at startTime before you compute closing-line value, or the in-play rows swamp the result. The historical odds API guide explains that cut in full, and sleep 4.6 seconds between historical calls to stay inside the rate limit.
Check that the board is fresh
Compare each price’s changedAt to the clock before you act on it. On the NFL fixtures four to six days out, the newest Bookmaker.eu move was up to 219 minutes old, which is normal for a weekly line. For in-play and match-day work, drop the book if its newest changedAt is older than your tolerance. The Sportradar alternative post shows that guard in a best-price scan.
Scraping Bookmaker.eu Against One API Call
| Task | Scraping the four sites | OddsPapi |
|---|---|---|
| Getting a price | Four scrapers, four logins or geo-blocks | One GET, bookmakers=bookmaker.eu |
| Knowing they share a feed | Diff the pages yourself | cloneOf in /bookmakers, plus the price check above |
| Price history | Whatever you captured, from today | Snapshots on the free plan, in-play included |
| Comparison books | Another scraper per book | 300+ slugs under one schema |
| Quarter and half lines | Parse each layout | Native market IDs with names from /markets |
| Push delivery | Poll and hope | WebSocket streaming on the B2B plan |
Our Bookmaker.eu sportsbook page shows the live board, and the Circa Sports post covers the other US-facing book that sharp bettors shop against.
Frequently Asked Questions
Which provider is best for Bookmaker.eu odds?
OddsPapi, if you want to read the feed before you pay. Its free plan returns live and historical Bookmaker.eu prices next to Pinnacle and 300+ other bookmakers. SportsGameOdds lists the book as bookmakereu, and odds-api.io lists it on plans from £49 a month for 2 bookmakers (checked 2 November 2026).
Are Bookmaker.eu, Betcris, JustBet and Sports411 the same odds?
Yes, on the boards we tested. On 2 November 2026 the four slugs returned byte-identical prices on 16 NFL, NBA and NHL fixtures, and the OddsPapi catalogue flags betcris, justbet and sports411.ag as cloneOf bookmaker.eu. Pull one of them, and drop the other three before you average prices across books.
Which sports does Bookmaker.eu price?
The feed leans to US sports. On 2 November 2026 it priced NFL, NBA and NHL fixtures, with 89 to 131 active markets on NBA fixtures on the day of the game, including quarter and half lines.
Is Bookmaker.eu historical odds data free?
On OddsPapi, yes. The historical-odds endpoint is on the free plan. On a played NBA fixture, Timberwolves v Clippers on 31 October 2026, it returned 925 Bookmaker.eu price changes on the Winner market, 76 pre-match and 849 in-play.
How does the Bookmaker.eu margin compare with Pinnacle?
Bookmaker.eu runs wider. On 2 November 2026 its median margin on shared complete markets was 5.63% on the NFL, 5.84% on the NBA and 5.44% on the NHL, against 3.69%, 3.96% and 3.89% for Pinnacle. Its Winner markets ran 3.4% to 4.6%.
Can I get Bookmaker.eu odds in-play?
Yes. The catalogue lists bookmaker.eu with liveOdds true, and the historical record of a played NBA fixture holds 849 in-play price changes on the Winner market. Use the /odds endpoint for current prices, or WebSocket streaming on the B2B plan for push delivery.