{"id":4569,"date":"2026-10-08T10:00:00","date_gmt":"2026-10-08T10:00:00","guid":{"rendered":"https:\/\/oddspapi.io\/blog\/?p=4569"},"modified":"2026-09-28T13:15:39","modified_gmt":"2026-09-28T13:15:39","slug":"unibet-api-odds-access","status":"publish","type":"post","link":"https:\/\/oddspapi.io\/blog\/unibet-api-odds-access\/","title":{"rendered":"Unibet API: Map 39 Sportsbook Feeds Through One Event ID"},"content":{"rendered":"<p>Looking for a Unibet API? You want Unibet&#8217;s prices as JSON, per fixture, without a scraper that breaks every time unibet.com ships a new front end. OddsPapi returns them under eight slugs: <code>unibet<\/code>, <code>unibet.be<\/code>, <code>unibet.com.au<\/code>, <code>unibet.dk<\/code>, <code>unibet.fr<\/code>, <code>unibet.ie<\/code>, <code>unibet.nl<\/code> and <code>unibet.se<\/code>. All eight carry <code>liveOdds: true<\/code> in the catalogue.<\/p>\n<p>The useful part sits one field deeper. Every bookmaker row in <code>\/v4\/odds<\/code> carries a <code>bookmakerFixtureId<\/code>, the event ID that the book&#8217;s own platform uses. On 28 September 2026 we pulled 22 full boards across the UEFA Nations League, the NFL, the NHL, the SHL and the EuroLeague. On 21 of them, Unibet&#8217;s event ID also tagged <strong>38 other feeds<\/strong>: LeoVegas, BetRivers, Paf, Svenska Spel, 888sport Italy, BetParx and more. That is <strong>39 feeds you can map with one string compare<\/strong>, and they do not all quote the same price. This guide shows how to pull the Unibet feeds, find the family, dedupe it, and read its closing lines.<\/p>\n<h2>Why one Unibet scraper gets you one brand<\/h2>\n<p>The family is the Kambi sportsbook platform, and the payload says so: BetParx&#8217;s <code>fixturePath<\/code> is <code>nj.betparx.com\/kambi#event\/...<\/code> and Four Winds points at <code>retail.kambicdn.com<\/code>. Every brand in the family reads the same event from the platform. Each brand then sets its own margin, or keeps the platform price.<\/p>\n<p>That creates two problems for a scraper. First, you need a separate scraper per brand and per country, because unibet.se, unibet.nl and leovegas.es are different sites with different markups. Second, when you do get all of them, you cannot tell which prices are independent. Feed 26 copies of the same moneyline into a consensus model and you have weighted one opinion 26 times.<\/p>\n<p>The <code>bookmakerFixtureId<\/code> field solves the first problem and makes the second one measurable. Group the board on it, and the platform family falls out. Compare prices inside the family, and you see which brands reprice.<\/p>\n<figure class=\"wp-block-table\">\n<table>\n<thead>\n<tr>\n<th><\/th>\n<th>Scraping unibet.com<\/th>\n<th>OddsPapi<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Unibet feeds<\/td>\n<td>One site per scraper<\/td>\n<td>8 slugs, one key<\/td>\n<\/tr>\n<tr>\n<td>Same-platform feeds<\/td>\n<td>A new scraper per brand and country<\/td>\n<td>38 more on Unibet&#8217;s event ID, same call<\/td>\n<\/tr>\n<tr>\n<td>Which prices are independent<\/td>\n<td>Unknown<\/td>\n<td>Group on <code>bookmakerFixtureId<\/code>, dedupe on the price<\/td>\n<\/tr>\n<tr>\n<td>Price history<\/td>\n<td>Only what you stored yourself<\/td>\n<td><code>\/v4\/historical-odds<\/code>, free tier<\/td>\n<\/tr>\n<tr>\n<td>Rest of the board<\/td>\n<td>None<\/td>\n<td>350+ bookmakers in the catalogue, 236 to 289 on each board we measured<\/td>\n<\/tr>\n<tr>\n<td>Push updates<\/td>\n<td>Poll and diff the page<\/td>\n<td>WebSocket feed on the same fixture IDs<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<h2>Step 1: find the Unibet slugs<\/h2>\n<p>Authentication is one query parameter, <code>apiKey<\/code>. The helper below retries on a 429 and waits for as long as the error body tells it to. The first call lists the catalogue and keeps every slug that starts with <code>unibet<\/code>.<\/p>\n<pre class=\"wp-block-code\"><code>import os, time, requests\nfrom collections import Counter, defaultdict\nfrom datetime import datetime, timedelta, timezone\n\nAPI_KEY = os.environ[&quot;ODDSPAPI_API_KEY&quot;]\nBASE = &quot;https:\/\/api.oddspapi.io\/v4&quot;\n\ndef get(path, **params):\n    params[&quot;apiKey&quot;] = API_KEY\n    for _ in range(4):\n        r = requests.get(f&quot;{BASE}\/{path}&quot;, params=params, timeout=180)\n        if r.status_code == 429:                      # rate limited: wait as told\n            time.sleep(r.json().get(&quot;error&quot;, {}).get(&quot;retryMs&quot;, 2000) \/ 1000 + 0.5)\n            continue\n        if r.status_code == 404:                      # empty window\n            return None\n        r.raise_for_status()\n        return r.json()\n    raise RuntimeError(&quot;rate limited&quot;)\n\nbooks = get(&quot;bookmakers&quot;)\nunibet = [b for b in books if b[&quot;slug&quot;].startswith(&quot;unibet&quot;)]\nprint(f&quot;{len(books)} bookmakers in the catalogue, {len(unibet)} Unibet feeds\\n&quot;)\nfor b in unibet:\n    print(f&quot;{b[&#x27;slug&#x27;]:&lt;15}{b[&#x27;bookmakerName&#x27;]:&lt;12} liveOdds={b[&#x27;liveOdds&#x27;]!s:&lt;6} cloneOf={b[&#x27;cloneOf&#x27;]}&quot;)<\/code><\/pre>\n<pre class=\"wp-block-code\"><code>361 bookmakers in the catalogue, 8 Unibet feeds\n\nunibet         Unibet       liveOdds=True   cloneOf=None\nunibet.be      Unibet BE    liveOdds=True   cloneOf=None\nunibet.com.au  Unibet AU    liveOdds=True   cloneOf=None\nunibet.dk      Unibet DK    liveOdds=True   cloneOf=None\nunibet.fr      Unibet FR    liveOdds=True   cloneOf=None\nunibet.ie      Unibet IE    liveOdds=True   cloneOf=None\nunibet.nl      Unibet NL    liveOdds=True   cloneOf=None\nunibet.se      Unibet SE    liveOdds=True   cloneOf=None<\/code><\/pre>\n<p>Every one of the eight shows <code>cloneOf: None<\/code>. The catalogue does not tell you that seven of them share a platform, or that <code>unibet.fr<\/code> runs on a different one. The board does.<\/p>\n<h2>Step 2: group the board on the event ID<\/h2>\n<p>This step takes the first priced NHL fixture in the next four days, pulls the whole board in one <code>\/v4\/odds<\/code> call, and groups every bookmaker row on <code>bookmakerFixtureId<\/code>. Then it prints the family around <code>unibet<\/code> and the family around <code>unibet.fr<\/code>.<\/p>\n<pre class=\"wp-block-code\"><code># Reuses get() and the imports from Step 1.\nnow = datetime.now(timezone.utc)\nfixtures = get(&quot;fixtures&quot;, tournamentId=234,        # 234 = NHL\n               **{&quot;from&quot;: now.strftime(&quot;%Y-%m-%d&quot;),\n                  &quot;to&quot;: (now + timedelta(days=4)).strftime(&quot;%Y-%m-%d&quot;)}) or []\nfx = next(f for f in fixtures if f[&quot;hasOdds&quot;] and f[&quot;statusName&quot;] == &quot;Pre-Game&quot;)\nboard = get(&quot;odds&quot;, fixtureId=fx[&quot;fixtureId&quot;])[&quot;bookmakerOdds&quot;]\nprint(f&quot;{fx[&#x27;participant1Name&#x27;]} v {fx[&#x27;participant2Name&#x27;]}, {len(board)} books on the board\\n&quot;)\n\n# Group every feed on the board by the event ID its own platform uses\nevents = defaultdict(list)\nfor slug, book in board.items():\n    events[book.get(&quot;bookmakerFixtureId&quot;)].append(slug)\n\nfor slug in (&quot;unibet&quot;, &quot;unibet.fr&quot;):\n    event_id = board[slug][&quot;bookmakerFixtureId&quot;]\n    family = sorted(events[event_id])\n    print(f&quot;{slug} event {event_id}: {len(family)} feeds&quot;)\n    print(&quot;  &quot; + &quot;, &quot;.join(family) + &quot;\\n&quot;)<\/code><\/pre>\n<pre class=\"wp-block-code\"><code>Carolina Hurricanes v Florida Panthers, 274 books on the board\n\nunibet event 1028398381: 39 feeds\n  888sport.it, atg.se, ballybet, betcity.nl, betmgm.co.uk, betparx, betplay, betrivers, betuk, bingoal.be, casumo, expekt.se, fourwinds, grosvenor, jacks.nl, kto, kto.bet.br, leovegas, leovegas.es, leovegas.it, livescorebet, paf, paf.es, pmu, prolineplus, rushbet.co, scooore.be, stake.bet.br, sugarhouse, svenskaspel, tabtouch, unibet, unibet.be, unibet.com.au, unibet.dk, unibet.ie, unibet.nl, unibet.se, virginbet\n\nunibet.fr event 3364764: 3 feeds\n  fdj, unibet.fr, zebet.fr<\/code><\/pre>\n<p>Unibet&#8217;s event ID is the biggest family on this board: 39 of 274 feeds. The next two families on the same fixture hold 24 and 23 feeds. The French Unibet feed sits on a different event ID with FDJ and ZEbet, and that split held on all 22 boards we measured. If you want the French prices, read <code>unibet.fr<\/code> as its own book. Our <a href=\"https:\/\/oddspapi.io\/blog\/winamax-api-odds-access\/\">Winamax API guide<\/a> measures what the French licence does to those prices.<\/p>\n<p>The 39-feed family held on 21 of 22 boards. The exception was Turkiye v Italy in the Nations League, where the three US feeds (<code>ballybet<\/code>, <code>betrivers<\/code>, <code>sugarhouse<\/code>) did not quote the fixture and the family dropped to 36.<\/p>\n<h2>Step 3: dedupe the family and rank the prices<\/h2>\n<p>Inside the family, prices split. This step reads the NHL moneyline (market <code>151<\/code>, Winner including overtime) for every feed in the family, drops suspended books, inactive markets and incomplete quotes, and groups the feeds on the exact price pair. It reuses <code>board<\/code> and <code>events<\/code> from Step 2.<\/p>\n<pre class=\"wp-block-code\"><code># Reuses board and events from Step 2.\nMARKET = &quot;151&quot;                     # NHL Winner (incl. overtime), 2-way\n\ndef moneyline(book):\n    m = book.get(&quot;markets&quot;, {}).get(MARKET)\n    if book.get(&quot;suspended&quot;) or not m or m.get(&quot;marketActive&quot;) is False:\n        return None\n    legs = [(oid, p[&quot;price&quot;]) for oid, o in m[&quot;outcomes&quot;].items()\n            for p in o[&quot;players&quot;].values() if p.get(&quot;active&quot;) and p[&quot;price&quot;] &gt; 1.0]\n    return tuple(sorted(legs)) if len(legs) == 2 else None\n\nfamily = events[board[&quot;unibet&quot;][&quot;bookmakerFixtureId&quot;]]\nprices = defaultdict(list)\nfor slug in family:\n    legs = moneyline(board[slug])\n    if legs:\n        prices[legs].append(slug)\n\nprint(f&quot;{sum(map(len, prices.values()))} feeds quote the moneyline, &quot;\n      f&quot;{len(prices)} distinct prices\\n&quot;)\nfor legs, slugs in sorted(prices.items(), key=lambda kv: sum(1 \/ p for _, p in kv[0])):\n    margin = sum(1 \/ p for _, p in legs) - 1\n    shown = &quot;, &quot;.join(sorted(slugs)[:6]) + (&quot; ...&quot; if len(slugs) &gt; 6 else &quot;&quot;)\n    print(f&quot;{margin:6.2%}  {legs[0][1]:.2f} \/ {legs[1][1]:.2f}  {len(slugs):&gt;2} feed{&quot;s&quot; if len(slugs) &gt; 1 else &quot; &quot;}  {shown}&quot;)\n\nboard_margins = sorted(sum(1 \/ p for _, p in legs) - 1\n                       for legs in map(moneyline, board.values()) if legs)\nprint(f&quot;\\nWhole board: {len(board_margins)} complete moneylines, &quot;\n      f&quot;median margin {board_margins[len(board_margins) \/\/ 2]:.2%}&quot;)<\/code><\/pre>\n<pre class=\"wp-block-code\"><code>39 feeds quote the moneyline, 10 distinct prices\n\n 3.19%  1.83 \/ 2.06   3 feeds  atg.se, leovegas, svenskaspel\n 3.73%  1.82 \/ 2.05   2 feeds  betrivers, sugarhouse\n 4.27%  1.81 \/ 2.04  26 feeds  888sport.it, ballybet, betcity.nl, betmgm.co.uk, betparx, betplay ...\n 5.06%  1.80 \/ 2.02   1 feed   stake.bet.br\n 6.18%  1.78 \/ 2.00   1 feed   tabtouch\n 7.00%  1.77 \/ 1.98   1 feed   betuk\n 7.32%  1.76 \/ 1.98   2 feeds  kto, kto.bet.br\n 8.49%  1.74 \/ 1.96   1 feed   leovegas.it\n 9.69%  1.72 \/ 1.94   1 feed   leovegas.es\n12.43%  1.68 \/ 1.89   1 feed   pmu\n\nWhole board: 163 complete moneylines, median margin 5.42%<\/code><\/pre>\n<p>Thirty-nine feeds collapse to ten prices. Twenty-six of them, Unibet included, quote the platform price at 4.27%, which already beats the 5.42% median across the whole board. Svenska Spel, ATG and LeoVegas shave it to 3.19%. PMU adds eight points on top.<\/p>\n<p>The pattern held across all 22 boards. Inside the family, the main market carried a median 7.5 distinct prices, and the largest identical group held a median 26 feeds. Median margins on the main market (1X2 on soccer, the moneyline elsewhere) across the 22 boards:<\/p>\n<figure class=\"wp-block-table\">\n<table>\n<thead>\n<tr>\n<th>Feed<\/th>\n<th>Median margin<\/th>\n<th>Nations League 1X2<\/th>\n<th>NHL and SHL moneyline<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>svenskaspel<\/code><\/td>\n<td>4.02%<\/td>\n<td>3.94%<\/td>\n<td>3.19%<\/td>\n<\/tr>\n<tr>\n<td><code>atg.se<\/code><\/td>\n<td>4.21%<\/td>\n<td>3.94%<\/td>\n<td>3.19%<\/td>\n<\/tr>\n<tr>\n<td><code>unibet.se<\/code><\/td>\n<td>4.38%<\/td>\n<td>3.97%<\/td>\n<td>4.27%<\/td>\n<\/tr>\n<tr>\n<td><code>paf<\/code><\/td>\n<td>4.75%<\/td>\n<td>4.96%<\/td>\n<td>4.27%<\/td>\n<\/tr>\n<tr>\n<td><code>betrivers<\/code><\/td>\n<td>5.08%<\/td>\n<td>8.16%<\/td>\n<td>3.73%<\/td>\n<\/tr>\n<tr>\n<td><code>unibet<\/code><\/td>\n<td>5.27%<\/td>\n<td>6.82%<\/td>\n<td>4.27%<\/td>\n<\/tr>\n<tr>\n<td><code>leovegas<\/code><\/td>\n<td>5.60%<\/td>\n<td>8.10%<\/td>\n<td>3.19%<\/td>\n<\/tr>\n<tr>\n<td><code>kto<\/code><\/td>\n<td>7.10%<\/td>\n<td>7.31%<\/td>\n<td>7.30%<\/td>\n<\/tr>\n<tr>\n<td><code>leovegas.it<\/code><\/td>\n<td>9.72%<\/td>\n<td>12.27%<\/td>\n<td>8.67%<\/td>\n<\/tr>\n<tr>\n<td><code>pmu<\/code><\/td>\n<td>12.32%<\/td>\n<td>10.22%<\/td>\n<td>12.39%<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>On soccer, the Swedish feeds price the Nations League at 3.94% while <code>unibet<\/code> sits at 6.82%, on the same event ID. And <code>unibet<\/code> itself moves with the sport: wider than the board median on 6 of 8 Nations League boards, tighter on all 6 NFL boards and all 5 hockey boards.<\/p>\n<p>Across every price the family shared with <code>unibet<\/code> on those boards, <code>unibet.dk<\/code> and <code>unibet.ie<\/code> matched on 5,101 of 5,104. <code>stake.bet.br<\/code> matched on 41.0% and <code>888sport.it<\/code> on 44.1%. Dedupe on the price, per market. Our <a href=\"https:\/\/oddspapi.io\/blog\/consensus-odds-fair-odds-calculator-python\/\">consensus odds guide<\/a> shows what to do with the deduplicated prices, and the <a href=\"https:\/\/oddspapi.io\/blog\/bwin-api-odds-access\/\">Bwin API guide<\/a> runs the same check on the Entain feeds.<\/p>\n<p>Each price in the family also ships a <code>betslip<\/code> template in the form <code>https:\/\/www.unibet.com\/betting\/sports\/event\/&lt;event&gt;?coupon={pickType}|&lt;outcome&gt;|{wagerAmounts}|replace<\/code>. It carries the brand&#8217;s own domain, so a best-price table can link each cell straight to the brand that offers the price.<\/p>\n<h2>Step 4: read the closing line for three family feeds<\/h2>\n<p>The live board shows who reprices now. <code>\/v4\/historical-odds<\/code> shows who repriced on the way to kick-off. This step pulls the Manchester derby from 13 September 2026 for <code>unibet<\/code>, <code>leovegas<\/code> and <code>svenskaspel<\/code> in one call (the endpoint takes up to three bookmakers), and prints the first and last active 1X2 before kick-off.<\/p>\n<pre class=\"wp-block-code\"><code># Reuses get() from Step 1.\nFIXTURE = &quot;id1000001772221266&quot;          # Man Utd v Man City, 13 Sep 2026\nplayed = get(&quot;fixtures&quot;, tournamentId=17, **{&quot;from&quot;: &quot;2026-09-13&quot;, &quot;to&quot;: &quot;2026-09-14&quot;})\nkickoff = next(f[&quot;startTime&quot;] for f in played if f[&quot;fixtureId&quot;] == FIXTURE)\n\nhist = get(&quot;historical-odds&quot;, fixtureId=FIXTURE,\n           bookmakers=&quot;unibet,leovegas,svenskaspel&quot;)[&quot;bookmakers&quot;]\n\nfor slug, book in hist.items():\n    legs = book[&quot;markets&quot;][&quot;101&quot;][&quot;outcomes&quot;]          # 1X2: 101 home, 102 draw, 103 away\n    snaps = {oid: [s for s in o[&quot;players&quot;][&quot;0&quot;]\n                   if s[&quot;active&quot;] and s[&quot;price&quot;] &gt; 1.0 and s[&quot;createdAt&quot;] &lt; kickoff]\n             for oid, o in legs.items()}\n    open_ = [snaps[o][0][&quot;price&quot;] for o in (&quot;101&quot;, &quot;102&quot;, &quot;103&quot;)]\n    close = [snaps[o][-1][&quot;price&quot;] for o in (&quot;101&quot;, &quot;102&quot;, &quot;103&quot;)]\n    moves = sum(sum(a[&quot;price&quot;] != b[&quot;price&quot;] for a, b in zip(s, s[1:])) for s in snaps.values())\n    print(f&quot;{slug:&lt;12} open {&#x27;\/&#x27;.join(map(str, open_)):&lt;16} {sum(1\/p for p in open_)-1:6.2%}&quot;\n          f&quot;   close {&#x27;\/&#x27;.join(map(str, close)):&lt;16} {sum(1\/p for p in close)-1:6.2%}&quot;\n          f&quot;   {moves} price moves&quot;)<\/code><\/pre>\n<pre class=\"wp-block-code\"><code>leovegas     open 3.05\/3.8\/2.1      6.72%   close 3.1\/3.7\/2.14      6.01%   72 price moves\nsvenskaspel  open 3.05\/3.8\/2.1      6.72%   close 3.2\/3.85\/2.2      2.68%   69 price moves\nunibet       open 3.05\/3.8\/2.1      6.72%   close 3.15\/3.75\/2.15    4.92%   70 price moves<\/code><\/pre>\n<p>All three opened on the identical platform price at 6.72%. Then they split. Unibet closed at 4.92%, LeoVegas at 6.01%, and Svenska Spel at 2.68%. For reference, Pinnacle closed the same fixture at 2.78% after 382 price moves. If you backtest against &#8220;the Unibet close&#8221;, you are backtesting one brand&#8217;s margin policy on top of a shared opening line. Pull the brand you would actually bet at. Our <a href=\"https:\/\/oddspapi.io\/blog\/backtest-betting-model-free-historical-odds\/\">backtesting guide<\/a> covers the rest of that loop.<\/p>\n<h2>What to build with it<\/h2>\n<ul>\n<li><strong>A deduplicated line-shopping table.<\/strong> Group on <code>bookmakerFixtureId<\/code>, collapse identical prices, and show one row per distinct price with every brand that offers it. The <a href=\"https:\/\/oddspapi.io\/blog\/line-shopping-python-best-odds\/\">line shopping guide<\/a> has the best-price logic.<\/li>\n<li><strong>A platform-weighted consensus.<\/strong> Count the Kambi family once, then add the prices that broke away from it as separate opinions.<\/li>\n<li><strong>A margin monitor per brand.<\/strong> Track when Svenska Spel or BetRivers cut below the platform price. On this board the cut was worth a full point.<\/li>\n<li><strong>A live version.<\/strong> The same fixture IDs and slugs run on the <a href=\"https:\/\/oddspapi.io\/blog\/websocket-odds-api-real-time-betting-data\/\">WebSocket feed<\/a>, so the grouping code works on pushed updates without a polling loop.<\/li>\n<\/ul>\n<h2>Unibet API FAQ<\/h2>\n<h3>How do I get Unibet odds as JSON?<\/h3>\n<p>Call <code>\/v4\/odds<\/code> with a fixture ID and read the <code>unibet<\/code> key under <code>bookmakerOdds<\/code>. OddsPapi carries eight Unibet feeds: unibet, unibet.be, unibet.com.au, unibet.dk, unibet.fr, unibet.ie, unibet.nl and unibet.se. All eight quoted every one of the 22 boards we measured on 28 September 2026.<\/p>\n<h3>Which bookmakers share Unibet&#8217;s odds platform?<\/h3>\n<p>On 21 of 22 boards measured on 28 September 2026, 39 feeds shared Unibet&#8217;s event ID, including LeoVegas, BetRivers, SugarHouse, Paf, Svenska Spel, ATG, 888sport Italy, BetMGM UK, Grosvenor, Virgin Bet, PMU and KTO. Group the <code>\/v4\/odds<\/code> board on <code>bookmakerFixtureId<\/code> to rebuild the list on any fixture.<\/p>\n<h3>Does BetRivers use the same odds as Unibet?<\/h3>\n<p>BetRivers shares Unibet&#8217;s event ID and matched Unibet on 93.1% of shared prices across 21 boards. It sets its own margin on some markets: on an NHL moneyline it quoted 3.73% against Unibet&#8217;s 4.27%.<\/p>\n<h3>Is unibet.fr the same feed as unibet?<\/h3>\n<p>No. unibet.fr uses a separate event ID, shared with FDJ and ZEbet, on all 22 boards measured. Treat it as its own book.<\/p>\n<h3>Can I get historical Unibet odds?<\/h3>\n<p>Yes. <code>\/v4\/historical-odds<\/code> returns the full price history for unibet and the other family feeds, up to three bookmakers a call, on the free tier. On the 13 September 2026 Manchester derby, Unibet made 70 price moves on the 1X2 before kick-off.<\/p>\n<h3>Which Unibet-platform feed has the lowest margin?<\/h3>\n<p>Svenska Spel, with a median 4.02% on the main market across 22 boards measured on 28 September 2026, ahead of ATG at 4.21% and unibet.se at 4.38%. The unibet feed ran at 5.27%.<\/p>\n<h2>Pull Unibet and the other 38 feeds<\/h2>\n<p>Every call in this guide runs on the free key: 350+ bookmakers in the catalogue, free historical odds for your closing-line checks, and the WebSocket feed when polling gets too slow. <a href=\"https:\/\/oddspapi.io\/en\/sign-up\">Get a free API key<\/a> and run Step 2 on the next fixture you care about.<\/p>\n<p><script type=\"application\/ld+json\">\n{\n  \"@context\": \"https:\/\/schema.org\",\n  \"@type\": \"FAQPage\",\n  \"mainEntity\": [\n    {\n      \"@type\": \"Question\",\n      \"name\": \"How do I get Unibet odds as JSON?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Call \/v4\/odds with a fixture ID and read the unibet key under bookmakerOdds. OddsPapi carries eight Unibet feeds: unibet, unibet.be, unibet.com.au, unibet.dk, unibet.fr, unibet.ie, unibet.nl and unibet.se. All eight quoted every one of the 22 boards we measured on 28 September 2026.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"Which bookmakers share Unibet's odds platform?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"On 21 of 22 boards measured on 28 September 2026, 39 feeds shared Unibet's event ID, including LeoVegas, BetRivers, SugarHouse, Paf, Svenska Spel, ATG, 888sport Italy, BetMGM UK, Grosvenor, Virgin Bet, PMU and KTO. Group the \/v4\/odds board on bookmakerFixtureId to rebuild the list on any fixture.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"Does BetRivers use the same odds as Unibet?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"BetRivers shares Unibet's event ID and matched Unibet on 93.1% of shared prices across 21 boards. It sets its own margin on some markets: on an NHL moneyline it quoted 3.73% against Unibet's 4.27%.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"Is unibet.fr the same feed as unibet?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"No. unibet.fr uses a separate event ID, shared with FDJ and ZEbet, on all 22 boards measured. Treat it as its own book.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"Can I get historical Unibet odds?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Yes. \/v4\/historical-odds returns the full price history for unibet and the other family feeds, up to three bookmakers a call, on the free tier. On the 13 September 2026 Manchester derby, Unibet made 70 price moves on the 1X2 before kick-off.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"Which Unibet-platform feed has the lowest margin?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Svenska Spel, with a median 4.02% on the main market across 22 boards measured on 28 September 2026, ahead of ATG at 4.21% and unibet.se at 4.38%. The unibet feed ran at 5.27%.\"\n      }\n    }\n  ]\n}\n<\/script><\/p>\n<p><!--\nFocus Keyphrase: unibet api\nSEO Title: Unibet API: Map 39 Sportsbook Feeds Through One Event ID\nMeta Description: Unibet API data shares one event ID with LeoVegas, BetRivers and 36 more feeds. On an NHL moneyline they quoted 10 prices, and Svenska Spel's was tightest.\nSlug: unibet-api-odds-access\n--><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Unibet API data shares one event ID with LeoVegas, BetRivers and 36 more feeds. On an NHL moneyline they quoted 10 prices, and Svenska Spel&#8217;s was tightest.<\/p>\n","protected":false},"author":2,"featured_media":4570,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7],"tags":[4,9,11,10,103],"class_list":["post-4569","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-how-to-guides","tag-historical-odds","tag-odds-api","tag-python","tag-sports-betting-api","tag-unibet"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.4 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Unibet API: Map 39 Sportsbook Feeds Through One Event ID | OddsPapi Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/oddspapi.io\/blog\/unibet-api-odds-access\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Unibet API: Map 39 Sportsbook Feeds Through One Event ID | OddsPapi Blog\" \/>\n<meta property=\"og:description\" content=\"Unibet API data shares one event ID with LeoVegas, BetRivers and 36 more feeds. On an NHL moneyline they quoted 10 prices, and Svenska Spel&#039;s was tightest.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/oddspapi.io\/blog\/unibet-api-odds-access\/\" \/>\n<meta property=\"og:site_name\" content=\"OddsPapi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-10-08T10:00:00+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/09\/unibet-api-odds-access.webp\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"675\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/webp\" \/>\n<meta name=\"author\" content=\"Odds API Writer\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/oddspapi.io\/logo-v2.webp\" \/>\n<meta name=\"twitter:creator\" content=\"@oddspapiapi\" \/>\n<meta name=\"twitter:site\" content=\"@oddspapiapi\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Odds API Writer\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"12 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/oddspapi.io\/blog\/unibet-api-odds-access\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/unibet-api-odds-access\/\"},\"author\":{\"name\":\"Odds API Writer\",\"@id\":\"https:\/\/oddspapi.io\/blog\/#\/schema\/person\/b6f21e649c4f556f0a95c23a0f1efa13\"},\"headline\":\"Unibet API: Map 39 Sportsbook Feeds Through One Event ID\",\"datePublished\":\"2026-10-08T10:00:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/unibet-api-odds-access\/\"},\"wordCount\":1400,\"commentCount\":1,\"publisher\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/unibet-api-odds-access\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/09\/unibet-api-odds-access.webp\",\"keywords\":[\"historical odds\",\"Odds API\",\"Python\",\"Sports Betting API\",\"Unibet\"],\"articleSection\":[\"How To Guides\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/oddspapi.io\/blog\/unibet-api-odds-access\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/oddspapi.io\/blog\/unibet-api-odds-access\/\",\"url\":\"https:\/\/oddspapi.io\/blog\/unibet-api-odds-access\/\",\"name\":\"Unibet API: Map 39 Sportsbook Feeds Through One Event ID | OddsPapi Blog\",\"isPartOf\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/unibet-api-odds-access\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/unibet-api-odds-access\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/09\/unibet-api-odds-access.webp\",\"datePublished\":\"2026-10-08T10:00:00+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/unibet-api-odds-access\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/oddspapi.io\/blog\/unibet-api-odds-access\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/oddspapi.io\/blog\/unibet-api-odds-access\/#primaryimage\",\"url\":\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/09\/unibet-api-odds-access.webp\",\"contentUrl\":\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/09\/unibet-api-odds-access.webp\",\"width\":1200,\"height\":675,\"caption\":\"Unibet API header: map 39 sportsbook feeds through one event ID\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/oddspapi.io\/blog\/unibet-api-odds-access\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/oddspapi.io\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Unibet API: Map 39 Sportsbook Feeds Through One Event ID\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/oddspapi.io\/blog\/#website\",\"url\":\"https:\/\/oddspapi.io\/blog\/\",\"name\":\"OddsPapi\",\"description\":\"Sports Odds API Tutorials &amp; Guides\",\"publisher\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/#organization\"},\"alternateName\":\"Odds Papi\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/oddspapi.io\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/oddspapi.io\/blog\/#organization\",\"name\":\"OddsPapi\",\"url\":\"https:\/\/oddspapi.io\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/oddspapi.io\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2025\/11\/oddspapi.png\",\"contentUrl\":\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2025\/11\/oddspapi.png\",\"width\":135,\"height\":135,\"caption\":\"OddsPapi\"},\"image\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/x.com\/oddspapiapi\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/oddspapi.io\/blog\/#\/schema\/person\/b6f21e649c4f556f0a95c23a0f1efa13\",\"name\":\"Odds API Writer\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/oddspapi.io\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/33b204f24af3d02e35b25ae730c0536121ca6a783fdb196e7611c9e49fcd13eb?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/33b204f24af3d02e35b25ae730c0536121ca6a783fdb196e7611c9e49fcd13eb?s=96&d=mm&r=g\",\"caption\":\"Odds API Writer\"},\"url\":\"https:\/\/oddspapi.io\/blog\/author\/andy-lavelle\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Unibet API: Map 39 Sportsbook Feeds Through One Event ID | OddsPapi Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/oddspapi.io\/blog\/unibet-api-odds-access\/","og_locale":"en_US","og_type":"article","og_title":"Unibet API: Map 39 Sportsbook Feeds Through One Event ID | OddsPapi Blog","og_description":"Unibet API data shares one event ID with LeoVegas, BetRivers and 36 more feeds. On an NHL moneyline they quoted 10 prices, and Svenska Spel's was tightest.","og_url":"https:\/\/oddspapi.io\/blog\/unibet-api-odds-access\/","og_site_name":"OddsPapi Blog","article_published_time":"2026-10-08T10:00:00+00:00","og_image":[{"width":1200,"height":675,"url":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/09\/unibet-api-odds-access.webp","type":"image\/webp"}],"author":"Odds API Writer","twitter_card":"summary_large_image","twitter_image":"https:\/\/oddspapi.io\/logo-v2.webp","twitter_creator":"@oddspapiapi","twitter_site":"@oddspapiapi","twitter_misc":{"Written by":"Odds API Writer","Est. reading time":"12 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/oddspapi.io\/blog\/unibet-api-odds-access\/#article","isPartOf":{"@id":"https:\/\/oddspapi.io\/blog\/unibet-api-odds-access\/"},"author":{"name":"Odds API Writer","@id":"https:\/\/oddspapi.io\/blog\/#\/schema\/person\/b6f21e649c4f556f0a95c23a0f1efa13"},"headline":"Unibet API: Map 39 Sportsbook Feeds Through One Event ID","datePublished":"2026-10-08T10:00:00+00:00","mainEntityOfPage":{"@id":"https:\/\/oddspapi.io\/blog\/unibet-api-odds-access\/"},"wordCount":1400,"commentCount":1,"publisher":{"@id":"https:\/\/oddspapi.io\/blog\/#organization"},"image":{"@id":"https:\/\/oddspapi.io\/blog\/unibet-api-odds-access\/#primaryimage"},"thumbnailUrl":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/09\/unibet-api-odds-access.webp","keywords":["historical odds","Odds API","Python","Sports Betting API","Unibet"],"articleSection":["How To Guides"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/oddspapi.io\/blog\/unibet-api-odds-access\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/oddspapi.io\/blog\/unibet-api-odds-access\/","url":"https:\/\/oddspapi.io\/blog\/unibet-api-odds-access\/","name":"Unibet API: Map 39 Sportsbook Feeds Through One Event ID | OddsPapi Blog","isPartOf":{"@id":"https:\/\/oddspapi.io\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/oddspapi.io\/blog\/unibet-api-odds-access\/#primaryimage"},"image":{"@id":"https:\/\/oddspapi.io\/blog\/unibet-api-odds-access\/#primaryimage"},"thumbnailUrl":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/09\/unibet-api-odds-access.webp","datePublished":"2026-10-08T10:00:00+00:00","breadcrumb":{"@id":"https:\/\/oddspapi.io\/blog\/unibet-api-odds-access\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/oddspapi.io\/blog\/unibet-api-odds-access\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/oddspapi.io\/blog\/unibet-api-odds-access\/#primaryimage","url":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/09\/unibet-api-odds-access.webp","contentUrl":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/09\/unibet-api-odds-access.webp","width":1200,"height":675,"caption":"Unibet API header: map 39 sportsbook feeds through one event ID"},{"@type":"BreadcrumbList","@id":"https:\/\/oddspapi.io\/blog\/unibet-api-odds-access\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/oddspapi.io\/blog\/"},{"@type":"ListItem","position":2,"name":"Unibet API: Map 39 Sportsbook Feeds Through One Event ID"}]},{"@type":"WebSite","@id":"https:\/\/oddspapi.io\/blog\/#website","url":"https:\/\/oddspapi.io\/blog\/","name":"OddsPapi","description":"Sports Odds API Tutorials &amp; Guides","publisher":{"@id":"https:\/\/oddspapi.io\/blog\/#organization"},"alternateName":"Odds Papi","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/oddspapi.io\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/oddspapi.io\/blog\/#organization","name":"OddsPapi","url":"https:\/\/oddspapi.io\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/oddspapi.io\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2025\/11\/oddspapi.png","contentUrl":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2025\/11\/oddspapi.png","width":135,"height":135,"caption":"OddsPapi"},"image":{"@id":"https:\/\/oddspapi.io\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/x.com\/oddspapiapi"]},{"@type":"Person","@id":"https:\/\/oddspapi.io\/blog\/#\/schema\/person\/b6f21e649c4f556f0a95c23a0f1efa13","name":"Odds API Writer","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/oddspapi.io\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/33b204f24af3d02e35b25ae730c0536121ca6a783fdb196e7611c9e49fcd13eb?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/33b204f24af3d02e35b25ae730c0536121ca6a783fdb196e7611c9e49fcd13eb?s=96&d=mm&r=g","caption":"Odds API Writer"},"url":"https:\/\/oddspapi.io\/blog\/author\/andy-lavelle\/"}]}},"_links":{"self":[{"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/posts\/4569","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/comments?post=4569"}],"version-history":[{"count":1,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/posts\/4569\/revisions"}],"predecessor-version":[{"id":4571,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/posts\/4569\/revisions\/4571"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/media\/4570"}],"wp:attachment":[{"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/media?parent=4569"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/categories?post=4569"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/tags?post=4569"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}