{"id":4629,"date":"2026-10-12T10:00:00","date_gmt":"2026-10-12T10:00:00","guid":{"rendered":"https:\/\/oddspapi.io\/blog\/?p=4629"},"modified":"2026-09-30T13:22:21","modified_gmt":"2026-09-30T13:22:21","slug":"superbet-api-odds-access","status":"publish","type":"post","link":"https:\/\/oddspapi.io\/blog\/superbet-api-odds-access\/","title":{"rendered":"Superbet API: Route 5 Tournaments to Their Tightest Home Feed"},"content":{"rendered":"<p>Looking for a Superbet API? You want Superbet&#8217;s prices as JSON, per fixture, without scraping superbet.ro, superbet.pl and superbet.rs one by one. OddsPapi returns them under six slugs: <code>superbet<\/code>, <code>superbet.ro<\/code>, <code>superbet.pl<\/code>, <code>superbet.rs<\/code>, <code>superbet.bet.br<\/code> and <code>napoleonsports.be<\/code>. All six carry <code>liveOdds: true<\/code>, and one API key reads all six.<\/p>\n<p>The six feeds share one Superbet event ID, but they do not share one price. We pulled 27 boards on 30 September 2026 and 15 played fixtures from 20-21 September. In the Romanian Superliga, the Ekstraklasa, the Serbian Superliga, the Brasileirao and the Belgian Pro League, <strong>the feed from the tournament&#8217;s own country closed the 1X2 tightest on 15 of 15 fixtures<\/strong>, between 0.99 and 3.48 points under its closest sibling. This guide shows how to pull the six feeds, route each tournament to its home feed, and check the closing line yourself.<\/p>\n<h2>Why one Superbet scraper gets you one country&#8217;s price<\/h2>\n<p>Superbet runs one platform with a site per country. The payload shows it: every feed&#8217;s <code>fixturePath<\/code> ends in the same <code>\/offer-event\/e-&lt;id&gt;<\/code> path, and <code>bookmakerFixtureId<\/code> carries the same number on all six. Napoleon Sports in Belgium uses the same path and the same event ID, so it runs on the Superbet platform too. If you want to group a whole board by platform this way, our <a href=\"https:\/\/oddspapi.io\/blog\/unibet-api-odds-access\/\">Unibet API guide<\/a> does it for the Kambi family.<\/p>\n<p>The event ID tells you the six feeds price the same fixture. It does not tell you what each one charges. A scraper on superbet.com gets you the Romanian price. On the Cluj derby that price is 8.11%. The Polish site charges 11.85% on the same fixture, and the Serbian site 11.06%. Point the scraper at Serbia instead and the numbers invert on Serbian football. So you need every country feed, and you need to know which one to trust for which tournament.<\/p>\n<figure class=\"wp-block-table\">\n<table>\n<thead>\n<tr>\n<th><\/th>\n<th>Scraping Superbet sites<\/th>\n<th>OddsPapi<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Superbet feeds<\/td>\n<td>One scraper per country site<\/td>\n<td>6 slugs, one key<\/td>\n<\/tr>\n<tr>\n<td>Which feed prices a league tightest<\/td>\n<td>Unknown until you scrape all of them<\/td>\n<td>Compare the six on one call, route per tournament<\/td>\n<\/tr>\n<tr>\n<td>Closing lines<\/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>Parked boards<\/td>\n<td>Look like live prices<\/td>\n<td>Book-level <code>suspended<\/code> flag on every row<\/td>\n<\/tr>\n<tr>\n<td>Rest of the board<\/td>\n<td>None<\/td>\n<td>350+ bookmakers in the catalogue, 169 to 271 on the Nations League and Brasileirao boards we pulled<\/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 Superbet slugs<\/h2>\n<p>Authentication is one query parameter, <code>apiKey<\/code>. The helper below waits out a 429 for as long as the error body says, backs off on a 5xx, and returns <code>None<\/code> on a 404. The first call lists the catalogue and keeps the Superbet platform feeds.<\/p>\n<pre class=\"wp-block-code\"><code>import os, time, requests\nfrom datetime import datetime, timedelta, timezone\nfrom statistics import median\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(5):\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 &gt;= 500:                      # transient: back off and retry\n            time.sleep(2)\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(f&quot;gave up on {path}&quot;)\n\nbooks = get(&quot;bookmakers&quot;)\nsuperbet = [b for b in books if b[&quot;slug&quot;].startswith((&quot;superbet&quot;, &quot;napoleonsports&quot;))]\nfor b in superbet:\n    print(f&quot;{b[&#x27;slug&#x27;]:&lt;18} {b[&#x27;bookmakerName&#x27;]:&lt;20} liveOdds={b[&#x27;liveOdds&#x27;]}  cloneOf={b[&#x27;cloneOf&#x27;]}&quot;)\nprint(f&quot;\\n{len(books)} bookmakers in the catalogue&quot;)<\/code><\/pre>\n<pre class=\"wp-block-code\"><code>napoleonsports.be  Napoleon Sports BE   liveOdds=True  cloneOf=None\nsuperbet           Superbet             liveOdds=True  cloneOf=superbet.ro\nsuperbet.bet.br    Superbet BR          liveOdds=True  cloneOf=None\nsuperbet.pl        Superbet PL          liveOdds=True  cloneOf=None\nsuperbet.ro        Superbet RO          liveOdds=True  cloneOf=None\nsuperbet.rs        Superbet RS          liveOdds=True  cloneOf=None\n\n361 bookmakers in the catalogue<\/code><\/pre>\n<p>The catalogue flags one relationship: <code>superbet<\/code> is a clone of <code>superbet.ro<\/code>. That flag is correct. Across the 25 boards where both appeared, the two feeds shared 12,720 prices and matched on all 12,720. Use <code>superbet.ro<\/code> and skip <code>superbet<\/code>. The other five carry <code>cloneOf: None<\/code>, and the catalogue says nothing about how their prices relate. The board does.<\/p>\n<h2>Step 2: read the six feeds on one fixture<\/h2>\n<p>This step finds the next Romanian Superliga fixture that has not kicked off and pulls it with <code>bookmakers=<\/code> set to the six slugs. The filter keeps the payload small. Without it, a full board on a Nations League fixture came back at up to 67 MB.<\/p>\n<pre class=\"wp-block-code\"><code># Reuses get() and the imports from Step 1.\nFEEDS = &quot;superbet,superbet.ro,superbet.pl,superbet.rs,superbet.bet.br,napoleonsports.be&quot;\n\ndef margin_1x2(book):\n    &quot;&quot;&quot;Overround on market 101 (1X2), or None if any leg is missing or suspended.&quot;&quot;&quot;\n    legs = book.get(&quot;markets&quot;, {}).get(&quot;101&quot;, {}).get(&quot;outcomes&quot;, {})\n    prices = [p[&quot;price&quot;] for o in legs.values() for p in o[&quot;players&quot;].values()\n              if p.get(&quot;active&quot;) and p.get(&quot;price&quot;, 0) &gt; 1.0]\n    return sum(1 \/ p for p in prices) - 1 if len(prices) == 3 else None\n\nnow = datetime.now(timezone.utc)\nfixtures = get(&quot;fixtures&quot;, tournamentId=152,                 # Romanian Superliga\n               **{&quot;from&quot;: now.strftime(&quot;%Y-%m-%d&quot;), &quot;to&quot;: (now + timedelta(days=10)).strftime(&quot;%Y-%m-%d&quot;)})\nfx = next(f for f in sorted(fixtures, key=lambda f: f[&quot;startTime&quot;])\n          if f[&quot;statusName&quot;] == &quot;Pre-Game&quot; and f[&quot;startTime&quot;] &gt; now.isoformat())\nprint(f&quot;{fx[&#x27;participant1Name&#x27;]} v {fx[&#x27;participant2Name&#x27;]}  {fx[&#x27;startTime&#x27;][:16]}Z\\n&quot;)\n\nboard = get(&quot;odds&quot;, fixtureId=fx[&quot;fixtureId&quot;], bookmakers=FEEDS)[&quot;bookmakerOdds&quot;]\nfor slug in FEEDS.split(&quot;,&quot;):\n    b = board.get(slug)\n    if not b:\n        print(f&quot;{slug:&lt;18} not on this board&quot;)\n        continue\n    m = margin_1x2(b) if not b.get(&quot;suspended&quot;) else None\n    print(f&quot;{slug:&lt;18} event {b[&#x27;bookmakerFixtureId&#x27;]}  {len(b[&#x27;markets&#x27;]):&gt;3} markets  &quot;\n          f&quot;suspended={b.get(&#x27;suspended&#x27;)!s:&lt;5}  1X2 margin {f&#x27;{m:.2%}&#x27; if m is not None else &#x27;-&#x27;}&quot;)<\/code><\/pre>\n<pre class=\"wp-block-code\"><code>FC CFR 1907 Cluj v FC Universitatea Cluj  2026-10-08T17:30Z\n\nsuperbet           event 14364939  120 markets  suspended=False  1X2 margin 8.11%\nsuperbet.ro        event 14364939  120 markets  suspended=False  1X2 margin 8.11%\nsuperbet.pl        event 14364939  112 markets  suspended=False  1X2 margin 11.85%\nsuperbet.rs        event 14364939  124 markets  suspended=False  1X2 margin 11.06%\nsuperbet.bet.br    event 14364939  135 markets  suspended=True   1X2 margin -\nnapoleonsports.be  event 14364939   63 markets  suspended=False  1X2 margin 11.06%<\/code><\/pre>\n<p>Three things to read in that output.<\/p>\n<ul>\n<li><strong>One event ID, three prices.<\/strong> All six rows carry <code>14364939<\/code>. The Romanian feed charges 8.11% on a Romanian fixture. The Serbian feed and Napoleon Sports charge 11.06%, and the Polish feed 11.85%.<\/li>\n<li><strong><code>superbet.bet.br<\/code> parks European domestic boards.<\/strong> It shipped <code>suspended: true<\/code> with zero active prices on all 16 Romanian, Polish, Serbian and Belgian domestic boards we pulled, 8 to 11 days before kick-off. Filter on the book-level <code>suspended<\/code> flag before you average anything. The price-level <code>active<\/code> flag alone is not enough on every book; our <a href=\"https:\/\/oddspapi.io\/blog\/bwin-api-odds-access\/\">Bwin API guide<\/a> shows a feed that parks its board and keeps every price marked active.<\/li>\n<li><strong>Menu width follows the country.<\/strong> On this fixture <code>superbet.bet.br<\/code> lists 135 markets and Napoleon Sports 63. On the Poland v Romania Nations League board, <code>superbet.rs<\/code> listed 278 markets against 203 on <code>superbet.ro<\/code>. Pick the feed for the price you need, then check that it lists the market.<\/li>\n<\/ul>\n<h2>Step 3: route each tournament to its home feed<\/h2>\n<p>This step runs Step 2 across five tournaments. For each one it takes the next three fixtures, reads the 1X2 margin from every Superbet feed, and prints the median. The star marks the feed from the tournament&#8217;s own country. It reuses <code>FEEDS<\/code> and <code>margin_1x2()<\/code> from Step 2.<\/p>\n<pre class=\"wp-block-code\"><code># Reuses FEEDS and margin_1x2() from Step 2.\nLEAGUES = {                      # tournamentId: (name, home feed)\n    152: (&quot;Romania Superliga&quot;, &quot;superbet.ro&quot;),\n    202: (&quot;Poland Ekstraklasa&quot;, &quot;superbet.pl&quot;),\n    210: (&quot;Serbia Superliga&quot;,  &quot;superbet.rs&quot;),\n    325: (&quot;Brasileirao A&quot;,     &quot;superbet.bet.br&quot;),\n    38:  (&quot;Belgium Pro League&quot;, &quot;napoleonsports.be&quot;),\n}\nCOLS = [&quot;superbet.ro&quot;, &quot;superbet.pl&quot;, &quot;superbet.rs&quot;, &quot;superbet.bet.br&quot;, &quot;napoleonsports.be&quot;]\n\nnow = datetime.now(timezone.utc)\nwindow = {&quot;from&quot;: now.strftime(&quot;%Y-%m-%d&quot;), &quot;to&quot;: (now + timedelta(days=14)).strftime(&quot;%Y-%m-%d&quot;)}\nprint(f&quot;{&#x27;league&#x27;:&lt;20}&quot; + &quot;&quot;.join(f&quot;{c:&gt;18}&quot; for c in COLS))\nfor tid, (name, home) in LEAGUES.items():\n    upcoming = [f for f in sorted(get(&quot;fixtures&quot;, tournamentId=tid, **window) or [], key=lambda f: f[&quot;startTime&quot;])\n                if f[&quot;statusName&quot;] == &quot;Pre-Game&quot; and f[&quot;startTime&quot;] &gt; now.isoformat()][:3]\n    margins = {c: [] for c in COLS}\n    for fx in upcoming:\n        board = get(&quot;odds&quot;, fixtureId=fx[&quot;fixtureId&quot;], bookmakers=FEEDS)[&quot;bookmakerOdds&quot;]\n        for c in COLS:\n            b = board.get(c)\n            m = margin_1x2(b) if b and not b.get(&quot;suspended&quot;) else None\n            if m is not None:\n                margins[c].append(m)\n        time.sleep(1.0)\n    cells = [(f&quot;{median(v):.2%}&quot; if v else &quot;parked&quot;) + (&quot;*&quot; if c == home else &quot; &quot;) for c, v in margins.items()]\n    print(f&quot;{name:&lt;20}&quot; + &quot;&quot;.join(f&quot;{x:&gt;18}&quot; for x in cells) + f&quot;   ({len(upcoming)} fixtures)&quot;)\nprint(&quot;\\n* = home feed; median 1X2 margin; &#x27;parked&#x27; = board shipped suspended&quot;)<\/code><\/pre>\n<pre class=\"wp-block-code\"><code>league                     superbet.ro       superbet.pl       superbet.rs   superbet.bet.br napoleonsports.be\nRomania Superliga               8.11%*           11.85%            11.04%            parked            11.04%    (3 fixtures)\nPoland Ekstraklasa             11.04%             8.75%*           11.04%            parked            11.04%    (3 fixtures)\nSerbia Superliga               11.26%            12.53%             8.64%*           parked            11.26%    (3 fixtures)\nBrasileirao A                   5.57%             9.38%             5.57%             7.10%*            5.57%    (3 fixtures)\nBelgium Pro League              9.07%             9.88%             9.07%            parked             8.07%*   (3 fixtures)\n\n* = home feed; median 1X2 margin; &#x27;parked&#x27; = board shipped suspended<\/code><\/pre>\n<p>On the four European leagues, the home feed sits 1.0 to 2.9 points under its closest sibling. The Romanian feed takes 8.11% on Romanian football and 11.04% on Polish football. The Polish feed flips that: 8.75% at home, 11.85% on Romanian fixtures. Napoleon Sports is the Belgian case, at 8.07% against 9.07% for the Romanian and Serbian feeds.<\/p>\n<p>Brazil breaks the pattern on this pull. With the next three Brasileirao fixtures still days away, <code>superbet.bet.br<\/code> charged 7.10% and <code>superbet.ro<\/code> charged 5.57%. Step 4 shows the order flips by kick-off.<\/p>\n<p>Two more cuts from the same session, outside the table:<\/p>\n<ul>\n<li><strong>Neutral fixtures collapse to one price.<\/strong> On five Nations League boards, <code>superbet.ro<\/code> and <code>superbet.rs<\/code> quoted the same 1X2 at a median 5.52%. Napoleon Sports ran 5.02%, <code>superbet.pl<\/code> 6.46% and <code>superbet.bet.br<\/code> 7.72%. Poland v Romania shows the routing at work: <code>superbet.ro<\/code> charged 5.36% against 6.38% on <code>superbet.pl<\/code>, and Pinnacle charged 5.63% on the same board.<\/li>\n<li><strong>Tennis follows a different map.<\/strong> On two ATP Tokyo fixtures, <code>superbet.rs<\/code> and Napoleon Sports ran 5.55% against 6.67% on <code>superbet.ro<\/code>. The home-feed rule is a domestic-football finding. Measure it again before you apply it to another sport.<\/li>\n<\/ul>\n<h2>Step 4: check the closing line on played fixtures<\/h2>\n<p>A live board 8 to 12 days out is not the price you bet into. <code>\/v4\/historical-odds<\/code> returns every snapshot a book posted on a played fixture, free, up to three bookmakers a call. This step takes three played fixtures per tournament from 20-21 September 2026, reads the last active 1X2 snapshot before kick-off from the home feed and two siblings, and compares.<\/p>\n<pre class=\"wp-block-code\"><code># Reuses get() from Step 1.\nPLAYED = {   # home feed: played fixtures, 20-21 Sep 2026\n    &quot;superbet.ro&quot;:       [&quot;id1000015272388004&quot;, &quot;id1000015272388006&quot;, &quot;id1000015272388002&quot;],\n    &quot;superbet.pl&quot;:       [&quot;id1000020272043176&quot;, &quot;id1000020272043174&quot;, &quot;id1000020272043178&quot;],\n    &quot;superbet.rs&quot;:       [&quot;id1000021072083054&quot;, &quot;id1000021072083058&quot;, &quot;id1000021072083066&quot;],\n    &quot;superbet.bet.br&quot;:   [&quot;id1000032566887034&quot;, &quot;id1000032566887018&quot;, &quot;id1000032566887032&quot;],\n    &quot;napoleonsports.be&quot;: [&quot;id1000003872203068&quot;, &quot;id1000003872203070&quot;, &quot;id1000003872203072&quot;],\n}\nKICKOFF = {&quot;id1000015272388004&quot;: &quot;2026-09-20T17:30&quot;, &quot;id1000015272388006&quot;: &quot;2026-09-21T15:00&quot;,\n           &quot;id1000015272388002&quot;: &quot;2026-09-21T18:00&quot;, &quot;id1000020272043176&quot;: &quot;2026-09-20T12:45&quot;,\n           &quot;id1000020272043174&quot;: &quot;2026-09-20T15:30&quot;, &quot;id1000020272043178&quot;: &quot;2026-09-20T18:15&quot;,\n           &quot;id1000021072083054&quot;: &quot;2026-09-20T15:00&quot;, &quot;id1000021072083058&quot;: &quot;2026-09-20T17:00&quot;,\n           &quot;id1000021072083066&quot;: &quot;2026-09-20T18:00&quot;, &quot;id1000032566887034&quot;: &quot;2026-09-20T19:00&quot;,\n           &quot;id1000032566887018&quot;: &quot;2026-09-20T21:30&quot;, &quot;id1000032566887032&quot;: &quot;2026-09-20T22:30&quot;,\n           &quot;id1000003872203068&quot;: &quot;2026-09-20T14:00&quot;, &quot;id1000003872203070&quot;: &quot;2026-09-20T16:30&quot;,\n           &quot;id1000003872203072&quot;: &quot;2026-09-20T17:15&quot;}\n\ndef closing_margin(book, kickoff):\n    &quot;&quot;&quot;1X2 overround on the last active pre-kick-off snapshot of each leg.&quot;&quot;&quot;\n    legs = book[&quot;markets&quot;][&quot;101&quot;][&quot;outcomes&quot;]            # 101 home, 102 draw, 103 away\n    close = []\n    for oid in (&quot;101&quot;, &quot;102&quot;, &quot;103&quot;):\n        snaps = [s for s in legs[oid][&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        close.append(snaps[-1][&quot;price&quot;])\n    return sum(1 \/ p for p in close) - 1\n\nwins = 0\nfor home, fixture_ids in PLAYED.items():\n    rivals = [s for s in (&quot;superbet.ro&quot;, &quot;superbet.pl&quot;, &quot;superbet.rs&quot;) if s != home][:2]\n    for fid in fixture_ids:\n        hist = get(&quot;historical-odds&quot;, fixtureId=fid, bookmakers=&quot;,&quot;.join([home] + rivals))[&quot;bookmakers&quot;]\n        closes = {slug: closing_margin(book, KICKOFF[fid]) for slug, book in hist.items()}\n        best_rival = min(closes[r] for r in rivals)\n        wins += closes[home] &lt; best_rival\n        print(f&quot;{fid}  {home:&lt;18} {closes[home]:6.2%}   best rival {best_rival:6.2%}   &quot;\n              f&quot;gap {100 * (best_rival - closes[home]):4.2f} pts&quot;)\n        time.sleep(4.6)                                      # \/historical-odds is rate limited\nprint(f&quot;\\nhome feed closed tightest on {wins} of {sum(map(len, PLAYED.values()))} fixtures&quot;)<\/code><\/pre>\n<pre class=\"wp-block-code\"><code>id1000015272388004  superbet.ro         4.52%   best rival  7.23%   gap 2.71 pts\nid1000015272388006  superbet.ro         4.42%   best rival  6.64%   gap 2.22 pts\nid1000015272388002  superbet.ro         4.33%   best rival  7.28%   gap 2.95 pts\nid1000020272043176  superbet.pl         4.94%   best rival  7.05%   gap 2.11 pts\nid1000020272043174  superbet.pl         5.24%   best rival  6.72%   gap 1.48 pts\nid1000020272043178  superbet.pl         5.44%   best rival  7.43%   gap 1.99 pts\nid1000021072083054  superbet.rs         5.08%   best rival  8.16%   gap 3.08 pts\nid1000021072083058  superbet.rs         5.53%   best rival  9.01%   gap 3.48 pts\nid1000021072083066  superbet.rs         5.11%   best rival  8.36%   gap 3.25 pts\nid1000032566887034  superbet.bet.br     4.06%   best rival  5.42%   gap 1.36 pts\nid1000032566887018  superbet.bet.br     4.06%   best rival  5.41%   gap 1.36 pts\nid1000032566887032  superbet.bet.br     3.87%   best rival  4.85%   gap 0.99 pts\nid1000003872203068  napoleonsports.be   3.57%   best rival  5.25%   gap 1.68 pts\nid1000003872203070  napoleonsports.be   3.74%   best rival  5.36%   gap 1.62 pts\nid1000003872203072  napoleonsports.be   3.47%   best rival  4.98%   gap 1.51 pts\n\nhome feed closed tightest on 15 of 15 fixtures<\/code><\/pre>\n<p>Fifteen of fifteen. The Serbian feed closed its own tournament at 5.08% to 5.53% while the Romanian and Polish feeds sat at 8.16% to 9.35%, the widest gap in the sample. The Brazilian feed, which ran wide on the live board in Step 3, closed the Brasileirao at 3.87% to 4.06%, 0.99 to 1.36 points under <code>superbet.ro<\/code>. Napoleon Sports closed three Belgian fixtures at 3.47% to 3.74%.<\/p>\n<p>If you backtest on Superbet, this is the table to rebuild first. A model tested against <code>superbet.pl<\/code> closes on Romanian football will look better than it is, because it trades against a price 3.5 to 4.0 points worse than the one a Romanian account sees. Our <a href=\"https:\/\/oddspapi.io\/blog\/backtest-betting-model-free-historical-odds\/\">backtesting guide<\/a> walks through the rest of the loop.<\/p>\n<h2>Step 5: give each Superbet price one vote<\/h2>\n<p>Six feeds on one platform are not six opinions. On a neutral fixture the Romanian and Serbian feeds quote one price. On a domestic fixture they split. So a static rule such as &#8220;count the Superbet family once&#8221; is wrong on exactly the boards where the home feed matters. Dedupe on the price tuple, per fixture. This step reuses <code>board<\/code> from Step 2.<\/p>\n<pre class=\"wp-block-code\"><code># Reuses FEEDS, margin_1x2() and board from Step 2.\ndef superbet_votes(board):\n    &quot;&quot;&quot;Collapse the Superbet feeds on one board to one vote per distinct 1X2 price tuple.&quot;&quot;&quot;\n    groups = {}\n    for slug in FEEDS.split(&quot;,&quot;):\n        b = board.get(slug)\n        if not b or b.get(&quot;suspended&quot;) or margin_1x2(b) is None:\n            continue\n        legs = b[&quot;markets&quot;][&quot;101&quot;][&quot;outcomes&quot;]\n        key = tuple(p[&quot;price&quot;] for oid in (&quot;101&quot;, &quot;102&quot;, &quot;103&quot;) for p in legs[oid][&quot;players&quot;].values())\n        groups.setdefault(key, []).append(slug)\n    return groups\n\nfor prices, slugs in superbet_votes(board).items():\n    print(f&quot;{&#x27;\/&#x27;.join(map(str, prices)):&lt;18} {&#x27;, &#x27;.join(slugs)}&quot;)<\/code><\/pre>\n<pre class=\"wp-block-code\"><code>2.75\/3.15\/2.5      superbet, superbet.ro\n2.65\/3.05\/2.42     superbet.pl\n2.67\/3.05\/2.45     superbet.rs, napoleonsports.be<\/code><\/pre>\n<p>Five priced feeds become three votes on the Cluj derby, and the home feed&#8217;s price is the best of the three on every leg. Feed those three into the <a href=\"https:\/\/oddspapi.io\/blog\/consensus-odds-fair-odds-calculator-python\/\">consensus calculator<\/a> and Superbet gets three votes, not five. When you shop for the best price, the <a href=\"https:\/\/oddspapi.io\/blog\/line-shopping-python-best-odds\/\">line-shopping script<\/a> will find the home feed on its own; the dedupe stops it from counting that price twice.<\/p>\n<p>For a feed-by-feed view of each slug, the sportsbook pages list what OddsPapi carries: <a href=\"https:\/\/oddspapi.io\/sportsbooks\/superbet-ro\">Superbet RO<\/a>, <a href=\"https:\/\/oddspapi.io\/sportsbooks\/superbet-pl\">Superbet PL<\/a>, <a href=\"https:\/\/oddspapi.io\/sportsbooks\/superbet-rs\">Superbet RS<\/a>, <a href=\"https:\/\/oddspapi.io\/sportsbooks\/superbet-bet-br\">Superbet BR<\/a> and <a href=\"https:\/\/oddspapi.io\/sportsbooks\/napoleonsports-be\">Napoleon Sports BE<\/a>. For the rest of the Brazilian board around <code>superbet.bet.br<\/code>, see the <a href=\"https:\/\/oddspapi.io\/blog\/brasileirao-odds-api\/\">Brasileirao odds API guide<\/a>.<\/p>\n<h2>Superbet API FAQ<\/h2>\n<h3>Does Superbet have a public API?<\/h3>\n<p>OddsPapi returns Superbet odds as JSON through <code>\/v4\/odds<\/code>, under six slugs: superbet, superbet.ro, superbet.pl, superbet.rs, superbet.bet.br and napoleonsports.be. One API key reads all six, alongside 350+ other bookmakers.<\/p>\n<h3>Which Superbet feed should I use?<\/h3>\n<p>Use the feed from the tournament&#8217;s own country. On 15 played fixtures in Romania, Poland, Serbia, Brazil and Belgium (20-21 September 2026), the home feed closed the 1X2 tightest every time, 0.99 to 3.48 points under its closest sibling.<\/p>\n<h3>Is superbet the same feed as superbet.ro?<\/h3>\n<p>Yes. The catalogue marks superbet as a clone of superbet.ro, and the two matched on 12,720 of 12,720 shared prices across 25 boards measured on 30 September 2026. Read superbet.ro.<\/p>\n<h3>Is Napoleon Sports part of Superbet?<\/h3>\n<p>Napoleon Sports runs on the Superbet platform: its rows carry the same Superbet event ID and the same offer-event path. It closed three Belgian Pro League fixtures at 3.47% to 3.74%, under superbet.ro and superbet.pl on every one.<\/p>\n<h3>Can I get historical Superbet odds?<\/h3>\n<p>Yes. \/v4\/historical-odds returns every snapshot for any three Superbet feeds per call on a played fixture, on the free tier. On Crvena Zvezda v Radnicki Nis (20 September 2026), superbet.rs closed the 1X2 at 5.53%.<\/p>\n<h3>How many bookmakers can I compare against Superbet?<\/h3>\n<p>The OddsPapi catalogue lists 361 bookmakers. The Nations League and Brasileirao boards we pulled on 30 September 2026 carried 169 to 271 books each, all in one \/v4\/odds call.<\/p>\n<h2>Pull all six Superbet feeds<\/h2>\n<p>Every call in this guide runs on the free key: 350+ bookmakers in the catalogue, free historical odds for the closing-line check in Step 4, and a WebSocket feed when polling gets too slow. <a href=\"https:\/\/oddspapi.io\/en\/sign-up\">Get a free API key<\/a> and run Step 3 on the next round.<\/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\": \"Does Superbet have a public API?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"OddsPapi returns Superbet odds as JSON through \/v4\/odds, under six slugs: superbet, superbet.ro, superbet.pl, superbet.rs, superbet.bet.br and napoleonsports.be. One API key reads all six, alongside 350+ other bookmakers.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"Which Superbet feed should I use?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Use the feed from the tournament's own country. On 15 played fixtures in Romania, Poland, Serbia, Brazil and Belgium (20-21 September 2026), the home feed closed the 1X2 tightest every time, 0.99 to 3.48 points under its closest sibling.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"Is superbet the same feed as superbet.ro?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Yes. The catalogue marks superbet as a clone of superbet.ro, and the two matched on 12,720 of 12,720 shared prices across 25 boards measured on 30 September 2026. Read superbet.ro.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"Is Napoleon Sports part of Superbet?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Napoleon Sports runs on the Superbet platform: its rows carry the same Superbet event ID and the same offer-event path. It closed three Belgian Pro League fixtures at 3.47% to 3.74%, under superbet.ro and superbet.pl on every one.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"Can I get historical Superbet odds?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Yes. \/v4\/historical-odds returns every snapshot for any three Superbet feeds per call on a played fixture, on the free tier. On Crvena Zvezda v Radnicki Nis (20 September 2026), superbet.rs closed the 1X2 at 5.53%.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"How many bookmakers can I compare against Superbet?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"The OddsPapi catalogue lists 361 bookmakers. The Nations League and Brasileirao boards we pulled on 30 September 2026 carried 169 to 271 books each, all in one \/v4\/odds call.\"\n      }\n    }\n  ]\n}\n<\/script><\/p>\n<p><!--\nFocus Keyphrase: superbet api\nSEO Title: Superbet API: Route 5 Tournaments to Their Tightest Home Feed\nMeta Description: Romania, Poland, Serbia, Brazil and Belgium each get a Superbet API feed. On 15 played fixtures, the home feed closed its tournament 1.0 to 3.5 points tighter.\nSlug: superbet-api-odds-access\n--><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Romania, Poland, Serbia, Brazil and Belgium each get a Superbet API feed. On 15 played fixtures, the home feed closed its tournament 1.0 to 3.5 points tighter.<\/p>\n","protected":false},"author":2,"featured_media":4630,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7],"tags":[4,9,11,10,104],"class_list":["post-4629","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-superbet"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.4 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Superbet API: Route 5 Tournaments to Their Tightest Home Feed | 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\/superbet-api-odds-access\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Superbet API: Route 5 Tournaments to Their Tightest Home Feed | OddsPapi Blog\" \/>\n<meta property=\"og:description\" content=\"Romania, Poland, Serbia, Brazil and Belgium each get a Superbet API feed. On 15 played fixtures, the home feed closed its tournament 1.0 to 3.5 points tighter.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/oddspapi.io\/blog\/superbet-api-odds-access\/\" \/>\n<meta property=\"og:site_name\" content=\"OddsPapi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-10-12T10:00:00+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/09\/superbet-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=\"16 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/oddspapi.io\/blog\/superbet-api-odds-access\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/superbet-api-odds-access\/\"},\"author\":{\"name\":\"Odds API Writer\",\"@id\":\"https:\/\/oddspapi.io\/blog\/#\/schema\/person\/b6f21e649c4f556f0a95c23a0f1efa13\"},\"headline\":\"Superbet API: Route 5 Tournaments to Their Tightest Home Feed\",\"datePublished\":\"2026-10-12T10:00:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/superbet-api-odds-access\/\"},\"wordCount\":1514,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/superbet-api-odds-access\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/09\/superbet-api-odds-access.webp\",\"keywords\":[\"historical odds\",\"Odds API\",\"Python\",\"Sports Betting API\",\"Superbet\"],\"articleSection\":[\"How To Guides\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/oddspapi.io\/blog\/superbet-api-odds-access\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/oddspapi.io\/blog\/superbet-api-odds-access\/\",\"url\":\"https:\/\/oddspapi.io\/blog\/superbet-api-odds-access\/\",\"name\":\"Superbet API: Route 5 Tournaments to Their Tightest Home Feed | OddsPapi Blog\",\"isPartOf\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/superbet-api-odds-access\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/superbet-api-odds-access\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/09\/superbet-api-odds-access.webp\",\"datePublished\":\"2026-10-12T10:00:00+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/superbet-api-odds-access\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/oddspapi.io\/blog\/superbet-api-odds-access\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/oddspapi.io\/blog\/superbet-api-odds-access\/#primaryimage\",\"url\":\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/09\/superbet-api-odds-access.webp\",\"contentUrl\":\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/09\/superbet-api-odds-access.webp\",\"width\":1200,\"height\":675,\"caption\":\"Superbet API featured image\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/oddspapi.io\/blog\/superbet-api-odds-access\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/oddspapi.io\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Superbet API: Route 5 Tournaments to Their Tightest Home Feed\"}]},{\"@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":"Superbet API: Route 5 Tournaments to Their Tightest Home Feed | 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\/superbet-api-odds-access\/","og_locale":"en_US","og_type":"article","og_title":"Superbet API: Route 5 Tournaments to Their Tightest Home Feed | OddsPapi Blog","og_description":"Romania, Poland, Serbia, Brazil and Belgium each get a Superbet API feed. On 15 played fixtures, the home feed closed its tournament 1.0 to 3.5 points tighter.","og_url":"https:\/\/oddspapi.io\/blog\/superbet-api-odds-access\/","og_site_name":"OddsPapi Blog","article_published_time":"2026-10-12T10:00:00+00:00","og_image":[{"width":1200,"height":675,"url":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/09\/superbet-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":"16 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/oddspapi.io\/blog\/superbet-api-odds-access\/#article","isPartOf":{"@id":"https:\/\/oddspapi.io\/blog\/superbet-api-odds-access\/"},"author":{"name":"Odds API Writer","@id":"https:\/\/oddspapi.io\/blog\/#\/schema\/person\/b6f21e649c4f556f0a95c23a0f1efa13"},"headline":"Superbet API: Route 5 Tournaments to Their Tightest Home Feed","datePublished":"2026-10-12T10:00:00+00:00","mainEntityOfPage":{"@id":"https:\/\/oddspapi.io\/blog\/superbet-api-odds-access\/"},"wordCount":1514,"commentCount":0,"publisher":{"@id":"https:\/\/oddspapi.io\/blog\/#organization"},"image":{"@id":"https:\/\/oddspapi.io\/blog\/superbet-api-odds-access\/#primaryimage"},"thumbnailUrl":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/09\/superbet-api-odds-access.webp","keywords":["historical odds","Odds API","Python","Sports Betting API","Superbet"],"articleSection":["How To Guides"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/oddspapi.io\/blog\/superbet-api-odds-access\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/oddspapi.io\/blog\/superbet-api-odds-access\/","url":"https:\/\/oddspapi.io\/blog\/superbet-api-odds-access\/","name":"Superbet API: Route 5 Tournaments to Their Tightest Home Feed | OddsPapi Blog","isPartOf":{"@id":"https:\/\/oddspapi.io\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/oddspapi.io\/blog\/superbet-api-odds-access\/#primaryimage"},"image":{"@id":"https:\/\/oddspapi.io\/blog\/superbet-api-odds-access\/#primaryimage"},"thumbnailUrl":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/09\/superbet-api-odds-access.webp","datePublished":"2026-10-12T10:00:00+00:00","breadcrumb":{"@id":"https:\/\/oddspapi.io\/blog\/superbet-api-odds-access\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/oddspapi.io\/blog\/superbet-api-odds-access\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/oddspapi.io\/blog\/superbet-api-odds-access\/#primaryimage","url":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/09\/superbet-api-odds-access.webp","contentUrl":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/09\/superbet-api-odds-access.webp","width":1200,"height":675,"caption":"Superbet API featured image"},{"@type":"BreadcrumbList","@id":"https:\/\/oddspapi.io\/blog\/superbet-api-odds-access\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/oddspapi.io\/blog\/"},{"@type":"ListItem","position":2,"name":"Superbet API: Route 5 Tournaments to Their Tightest Home Feed"}]},{"@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\/4629","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=4629"}],"version-history":[{"count":1,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/posts\/4629\/revisions"}],"predecessor-version":[{"id":4631,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/posts\/4629\/revisions\/4631"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/media\/4630"}],"wp:attachment":[{"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/media?parent=4629"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/categories?post=4629"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/tags?post=4629"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}