Bookmaker.eu Odds API: 131 NBA Markets, Quarter Lines Included

Bookmaker.eu Odds API
How To Guides November 5, 2026

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.