{"id":3934,"date":"2026-09-19T10:00:00","date_gmt":"2026-09-19T10:00:00","guid":{"rendered":"https:\/\/oddspapi.io\/blog\/?p=3934"},"modified":"2026-09-09T13:24:48","modified_gmt":"2026-09-09T13:24:48","slug":"euroleague-basketball-odds-api","status":"publish","type":"post","link":"https:\/\/oddspapi.io\/blog\/euroleague-basketball-odds-api\/","title":{"rendered":"EuroLeague Odds API: 205 Books, Two Result Markets, One Draw Leg"},"content":{"rendered":"<p>EuroLeague opening night is 24 September, and the board is already open. One call to the OddsPapi <strong>EuroLeague odds API<\/strong> on 9 September returned <strong>205 bookmakers, 2,933 market IDs and 46,720 prices<\/strong> on Dubai Basketball v Real Madrid, fifteen days before tip-off.<\/p>\n<p>Then the parsing problem starts. Basketball ships the match result under <strong>two different market IDs, and they are two different bets<\/strong>. Market <code>111<\/code> is the two-way winner including overtime. Market <code>113<\/code> is the three-way regular-time result, and it carries a draw leg priced between 9.0 and 21.0. Read one and you miss the other. Merge them and you have mixed two settlement rules into one number.<\/p>\n<h2>The Two Result Markets, Measured<\/h2>\n<p>Every number below comes from live calls made on 9 September 2026 against four EuroLeague fixtures on the 24 September slate.<\/p>\n<figure class=\"wp-block-table\">\n<table>\n<thead>\n<tr>\n<th>Market<\/th>\n<th>ID<\/th>\n<th>Legs<\/th>\n<th>Books quoting it<\/th>\n<th>Median margin<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Winner (incl. overtime)<\/td>\n<td><code>111<\/code><\/td>\n<td>2 (111 home, 112 away)<\/td>\n<td>188 to 192<\/td>\n<td>5.95% to 6.49%<\/td>\n<\/tr>\n<tr>\n<td>Regular Time Result<\/td>\n<td><code>113<\/code><\/td>\n<td>3 (113 home, 114 draw, 115 away)<\/td>\n<td>69 on all four fixtures<\/td>\n<td>9.12% to 9.41%<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>The three-way costs about 2.8 percentage points more margin than the two-way on the same fixture. That gap is the price of the draw leg, and a regulation tie is a real outcome in a EuroLeague game.<\/p>\n<p><strong>No sharp book and no exchange quotes market 113.<\/strong> On Puerto Rico v China at the FIBA Women&#8217;s World Cup, hours before tip-off, the board ran 248 books deep and the sharp menus looked like this:<\/p>\n<figure class=\"wp-block-table\">\n<table>\n<thead>\n<tr>\n<th>Bookmaker<\/th>\n<th>Markets on the fixture<\/th>\n<th>Quotes market 113?<\/th>\n<th>Market types carried<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>pinnacle<\/code><\/td>\n<td>63<\/td>\n<td>No<\/td>\n<td>spreads, totals, moneyline<\/td>\n<\/tr>\n<tr>\n<td><code>betfair-ex<\/code><\/td>\n<td>213<\/td>\n<td>No<\/td>\n<td>totals, spreads, moneyline<\/td>\n<\/tr>\n<tr>\n<td><code>kalshi<\/code><\/td>\n<td>18<\/td>\n<td>No<\/td>\n<td>spreads, moneyline, totals<\/td>\n<\/tr>\n<tr>\n<td><code>polymarket<\/code><\/td>\n<td>1<\/td>\n<td>No<\/td>\n<td>moneyline<\/td>\n<\/tr>\n<tr>\n<td><code>bet365<\/code><\/td>\n<td>204<\/td>\n<td>No<\/td>\n<td>team totals, totals, spreads, moneyline<\/td>\n<\/tr>\n<tr>\n<td><code>draftkings<\/code><\/td>\n<td>140<\/td>\n<td>No<\/td>\n<td>spreads, totals, team totals, moneyline<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>144 of the 248 books quoted the three-way. Not one of them was a sharp. Pinnacle carried 364 markets on last season&#8217;s EuroLeague final and market 113 was absent from all of them. If you want a fair price on the regular-time draw, you build it from the two-way sharp line and a tie model. There is no sharp anchor to copy.<\/p>\n<h2>Old Way vs OddsPapi<\/h2>\n<figure class=\"wp-block-table\">\n<table>\n<thead>\n<tr>\n<th>Task<\/th>\n<th>The old way<\/th>\n<th>OddsPapi<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Find EuroLeague fixtures<\/td>\n<td>Scrape a schedule page, map team names by hand<\/td>\n<td><code>\/v4\/fixtures?sportId=11&amp;tournamentId=138<\/code><\/td>\n<\/tr>\n<tr>\n<td>Get the winner price<\/td>\n<td>One book, one moneyline<\/td>\n<td>205 books in one call, both result markets<\/td>\n<\/tr>\n<tr>\n<td>Price the regular-time draw<\/td>\n<td>Not available from any sharp feed<\/td>\n<td>69 books on market <code>113<\/code>, draw leg included<\/td>\n<\/tr>\n<tr>\n<td>Backtest last season<\/td>\n<td>Paid history, or none<\/td>\n<td>Free <code>\/v4\/historical-odds<\/code>, snapshot by snapshot<\/td>\n<\/tr>\n<tr>\n<td>Grade the bet<\/td>\n<td>Match a box score to a market by hand<\/td>\n<td><code>\/v4\/settlements<\/code> returns WIN, LOSE, PUSH per outcome<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<h2>Step 1: Find the Fixtures<\/h2>\n<p>Basketball is <code>sportId<\/code> 11. EuroLeague is <code>tournamentId<\/code> 138, which you read once from <code>\/v4\/tournaments<\/code> and then cache. Auth is a query parameter, never a header.<\/p>\n<pre class=\"wp-block-code\"><code>import os, requests\n\nAPI_KEY = os.environ[\"ODDSPAPI_API_KEY\"]\nBASE = \"https:\/\/api.oddspapi.io\/v4\"\nEUROLEAGUE = 138          # tournamentId, from \/v4\/tournaments?sportId=11\n\ndef euroleague_fixtures(start, end):\n    r = requests.get(f\"{BASE}\/fixtures\", params={\n        \"apiKey\": API_KEY, \"sportId\": 11,\n        \"tournamentId\": EUROLEAGUE, \"from\": start, \"to\": end,\n    })\n    r.raise_for_status()\n    return r.json()\n\nfixtures = euroleague_fixtures(\"2026-09-09\", \"2026-11-30\")\nprint(f\"{len(fixtures)} fixtures, {sum(f['hasOdds'] for f in fixtures)} flagged hasOdds\")\nfor f in sorted(fixtures, key=lambda x: x[\"startTime\"])[:3]:\n    print(f[\"fixtureId\"], f[\"startTime\"][:16],\n          f[\"participant1Name\"], \"v\", f[\"participant2Name\"])<\/code><\/pre>\n<pre class=\"wp-block-code\"><code>140 fixtures, 140 flagged hasOdds\nid1100013873262938 2026-09-24T16:00 Dubai Basketball v Real Madrid\nid1100013873262940 2026-09-24T17:00 Hapoel Tel-Aviv v Bayern Munich\nid1100013873262942 2026-09-24T18:00 KK Crvena zvezda Belgrade v BC Zalgiris Kaunas<\/code><\/pre>\n<p>Adding <code>tournamentId<\/code> also lifts the ten-day cap that <code>\/fixtures<\/code> applies when <code>sportId<\/code> is the only filter. That is how the call above reaches into November.<\/p>\n<h3>hasOdds Is a Flag, Not a Board<\/h3>\n<p>All 140 EuroLeague fixtures come back with <code>hasOdds: true<\/code>. Fewer carry a live board today, because the books open the European competitions on their own schedule. Probe <code>\/odds<\/code> before you commit a fixture to a pipeline.<\/p>\n<pre class=\"wp-block-code\"><code>import os, time, requests\n\nAPI_KEY = os.environ[\"ODDSPAPI_API_KEY\"]\nBASE = \"https:\/\/api.oddspapi.io\/v4\"\n\ndef board(fixture_id):\n    r = requests.get(f\"{BASE}\/odds\",\n                     params={\"apiKey\": API_KEY, \"fixtureId\": fixture_id})\n    r.raise_for_status()\n    return r.json().get(\"bookmakerOdds\")   # absent when no book has opened\n\nfor fixture_id, label in [\n    (\"id1100013873262938\", \"EuroLeague  Dubai v Real Madrid\"),\n    (\"id1100014172902422\", \"EuroCup     Neptunas v Trento\"),\n    (\"id1100026473713458\", \"Liga ACB    Baskonia v Valencia\"),\n]:\n    books = board(fixture_id)\n    time.sleep(1.2)          # \/odds is rate limited; pace the loop\n    if not books:\n        print(f\"{label}: no book has opened this fixture yet\")\n        continue\n    prices = active = 0\n    markets = set()\n    for feed in books.values():\n        for market_id, market in feed[\"markets\"].items():\n            markets.add(market_id)\n            for outcome in market[\"outcomes\"].values():\n                for price in outcome[\"players\"].values():\n                    prices += 1\n                    active += 1 if price[\"active\"] else 0\n    print(f\"{label}: {len(books)} books, {len(markets)} market IDs, \"\n          f\"{prices} prices, {active\/prices:.1%} active\")<\/code><\/pre>\n<pre class=\"wp-block-code\"><code>EuroLeague  Dubai v Real Madrid: 205 books, 2933 market IDs, 46720 prices, 17.1% active\nEuroCup     Neptunas v Trento: 49 books, 35 market IDs, 796 prices, 100.0% active\nLiga ACB    Baskonia v Valencia: no book has opened this fixture yet<\/code><\/pre>\n<p>Three competitions, three answers, one API call each. EuroLeague runs 205 books deep. The EuroCup opener five days later runs 49 books and 35 market IDs. Liga ACB, the Basketball Champions League, the Adriatic League and the German BBL all return HTTP 200 with <code>bookmakerOdds<\/code> absent, because their boards had not opened when we measured.<\/p>\n<p>Look at the active rate in that output. The 205-book EuroLeague board is 17.1% active. The 49-book EuroCup board is 100% active. A wide board is mostly parked rungs waiting to be turned on, so <strong>filter on the price-level <code>active<\/code> flag or your depth count is three to six times too high<\/strong>.<\/p>\n<h2>Step 2: Read Both Result Markets<\/h2>\n<p>Now the core of it. One function reads a market and returns its active legs. The caller checks the leg count before it trusts the margin.<\/p>\n<pre class=\"wp-block-code\"><code>import os, statistics, requests\n\nAPI_KEY = os.environ[\"ODDSPAPI_API_KEY\"]\nBASE = \"https:\/\/api.oddspapi.io\/v4\"\n\nWINNER_OT = \"111\"    # Winner (incl. overtime)  -> outcomes 111 home, 112 away\nREG_TIME  = \"113\"    # Regular Time Result      -> outcomes 113 home, 114 draw, 115 away\n\ndef legs(feed, market_id):\n    \"\"\"Return {outcomeId: price} for one market, or None if the book skips it.\"\"\"\n    market = feed[\"markets\"].get(market_id)\n    if not market:\n        return None\n    out = {}\n    for outcome_id, outcome in market[\"outcomes\"].items():\n        price = outcome[\"players\"].get(\"0\")\n        if price and price[\"active\"] and price[\"price\"]:\n            out[outcome_id] = price[\"price\"]\n    return out\n\ndef read_both(fixture_id):\n    r = requests.get(f\"{BASE}\/odds\",\n                     params={\"apiKey\": API_KEY, \"fixtureId\": fixture_id})\n    r.raise_for_status()\n    books = r.json()[\"bookmakerOdds\"]\n    two_way, three_way = {}, {}\n    for slug, feed in books.items():\n        ml = legs(feed, WINNER_OT)\n        if ml and len(ml) == 2:                 # both legs, or the margin lies\n            two_way[slug] = ml\n        x2 = legs(feed, REG_TIME)\n        if x2 and len(x2) == 3:                 # home, draw, away\n            three_way[slug] = x2\n    return books, two_way, three_way\n\ndef margin(prices):\n    return sum(1 \/ p for p in prices.values()) - 1\n\nbooks, two_way, three_way = read_both(\"id1100013873262938\")\nprint(f\"{len(books)} books on the board\")\nprint(f\"  market 111 complete and active: {len(two_way)}  \"\n      f\"median margin {statistics.median(map(margin, two_way.values())):.2%}\")\nprint(f\"  market 113 complete and active: {len(three_way)}  \"\n      f\"median margin {statistics.median(map(margin, three_way.values())):.2%}\")\ndraws = sorted(p[\"114\"] for p in three_way.values())\nprint(f\"  draw leg: {draws[0]} to {draws[-1]}, median {statistics.median(draws)}\")<\/code><\/pre>\n<pre class=\"wp-block-code\"><code>205 books on the board\n  market 111 complete and active: 179  median margin 6.49%\n  market 113 complete and active: 67  median margin 9.12%\n  draw leg: 9.0 to 21.0, median 14.0<\/code><\/pre>\n<p>A draw leg spanning 9.0 to 21.0 across 67 books is a 6.4 point spread in implied probability on a single outcome. Nobody is competing on the regulation tie, which is what you would expect from a leg no sharp book prices.<\/p>\n<h3>Count the Legs Before You Compute a Margin<\/h3>\n<p>The <code>len(ml) == 2<\/code> and <code>len(x2) == 3<\/code> checks in that function are load-bearing. Three examples from the same four fixtures:<\/p>\n<ul>\n<li><strong><code>tipico<\/code> ships market 113 with the draw leg absent<\/strong>, and skips market 111 entirely. Its two remaining legs sum to a 6.4% overround, which reads like the best three-way on the board until you count the outcomes.<\/li>\n<li><strong><code>stake<\/code> shipped market 111 with one leg<\/strong>, an away price of 2.08 and no home price. Sum that pair and you get an overround of minus 52%.<\/li>\n<li><strong><code>sportwetten.de<\/code> did the same on two of the four fixtures.<\/strong><\/li>\n<\/ul>\n<p>An unguarded margin ranking puts all three at the top of the leaderboard. The same trap shows up on <a href=\"https:\/\/oddspapi.io\/blog\/afl-odds-api\/\">the AFL board, where 15 books ship the three-way without a draw<\/a>, and on <a href=\"https:\/\/oddspapi.io\/blog\/boxing-odds-api\/\">boxing, where one fight ships under three market IDs<\/a>.<\/p>\n<h2>Step 3: Dedupe, Then Shop the Line<\/h2>\n<p>205 slugs is not 205 opinions. Distinct bookmaker slugs quote byte-identical prices, and <code>cloneOf<\/code> does not catch all of them, so collapse on the price tuple before you count anything.<\/p>\n<pre class=\"wp-block-code\"><code>import collections, statistics\n\ntuples = collections.Counter(\n    tuple(sorted(quote.items())) for quote in two_way.values())\nprint(f\"{len(two_way)} quotes collapse to {len(tuples)} distinct prices \"\n      f\"({1 - len(tuples)\/len(two_way):.1%})\")\nprint(\"largest cluster:\", tuples.most_common(1)[0][1], \"slugs at\",\n      dict(tuples.most_common(1)[0][0]))\n\nfor outcome_id, label in [(\"111\", \"home\"), (\"112\", \"away\")]:\n    prices = [q[outcome_id] for q in two_way.values()]\n    mid = statistics.median(prices)\n    sane = {slug: q[outcome_id] for slug, q in two_way.items()\n            if 0.5 * mid &lt;= q[outcome_id] &lt;= 1.5 * mid}   # outlier band\n    best = max(sane, key=sane.get)\n    print(f\"{label}: median {mid}, best {sane[best]} at {best}, \"\n          f\"{len(prices) - len(sane)} price(s) outside the band\")<\/code><\/pre>\n<pre class=\"wp-block-code\"><code>179 quotes collapse to 48 distinct prices (73.2%)\nlargest cluster: 22 slugs at {'111': 1.74, '112': 2.04}\nhome: median 1.74, best 1.812 at 1xbet, 0 price(s) outside the band\naway: median 2.05, best 2.2 at hardrockbet, 0 price(s) outside the band<\/code><\/pre>\n<p>Collapse ran 71.9% to 75.9% across the four EuroLeague fixtures and 82.9% to 85.4% on the EuroCup, where 41 quotes fold into six or seven prices. Twenty-two slugs sitting on 1.74 \/ 2.04 is one price wearing 22 badges. Treat it as one vote when you build a consensus, or your <a href=\"https:\/\/oddspapi.io\/blog\/consensus-odds-fair-odds-calculator-python\/\">fair-odds calculation<\/a> inherits whichever feed happens to have the most skins.<\/p>\n<p>The outlier band matters even when it catches nothing today. A EuroLeague price of 80.0 on a two-way leg is a data error, and an unguarded <code>max()<\/code> hands it to you as free money. Keep the band. For the full walkthrough, see <a href=\"https:\/\/oddspapi.io\/blog\/line-shopping-python-best-odds\/\">line shopping across 350+ books<\/a>.<\/p>\n<h2>Step 4: Pull Last Season for Free<\/h2>\n<p><code>\/v4\/historical-odds<\/code> returns every snapshot the feed recorded, at no cost on the free tier. Cap it at three bookmakers per call. Here is Pinnacle on the 2026 EuroLeague final, Olympiakos v Real Madrid.<\/p>\n<pre class=\"wp-block-code\"><code>import os, requests\n\nAPI_KEY = os.environ[\"ODDSPAPI_API_KEY\"]\nBASE = \"https:\/\/api.oddspapi.io\/v4\"\nFINAL = \"id1100013870449608\"        # Olympiakos v Real Madrid, 24 May 2026\nTIP_OFF = \"2026-05-24T18:02:26\"\n\nr = requests.get(f\"{BASE}\/historical-odds\", params={\n    \"apiKey\": API_KEY, \"fixtureId\": FINAL, \"bookmakers\": \"pinnacle\",\n})                                   # max 3 bookmakers per call\nr.raise_for_status()\nmarkets = r.json()[\"bookmakers\"][\"pinnacle\"][\"markets\"]\nprint(f\"pinnacle carried {len(markets)} markets on this fixture; \"\n      f\"market 113 present: {'113' in markets}\")\n\nfor outcome_id, label in [(\"111\", \"Olympiakos\"), (\"112\", \"Real Madrid\")]:\n    snaps = [s for s in markets[\"111\"][\"outcomes\"][outcome_id][\"players\"][\"0\"]\n             if s[\"active\"] and s[\"createdAt\"][:19] &lt; TIP_OFF]\n    print(f\"{label:12s} {len(snaps):4d} pre-tip snapshots  \"\n          f\"open {snaps[0]['price']} -&gt; close {snaps[-1]['price']}  \"\n          f\"limit {snaps[0]['limit']:.0f} -&gt; {snaps[-1]['limit']:.0f}\")<\/code><\/pre>\n<pre class=\"wp-block-code\"><code>pinnacle carried 364 markets on this fixture; market 113 present: False\nOlympiakos    110 pre-tip snapshots  open 1.347 -> close 1.342  limit 864 -> 29239\nReal Madrid   108 pre-tip snapshots  open 3.22 -> close 3.41  limit 300 -> 10000<\/code><\/pre>\n<p>Pinnacle&#8217;s margin tightened from 5.29% at open to 3.84% at the close, which is the standard sharpening curve you want as a backtest anchor. And the <code>limit<\/code> field climbed from 864 to 29,239 on the Olympiakos leg, peaking at 51,813. Pinnacle raises its maximum stake as the line firms, so a historical price without its limit tells you half the story.<\/p>\n<p>Filter on <code>createdAt &lt; startTime<\/code> if you want a true closing line, because snapshots keep landing after tip-off. Before you decide how many books your study needs, read <a href=\"https:\/\/oddspapi.io\/blog\/how-many-bookmakers-backtest\/\">the 176-book study on where the consensus curve flattens<\/a>.<\/p>\n<h2>Step 5: Grade the Bet<\/h2>\n<p><code>\/v4\/scores<\/code> returns the period breakdown and <code>\/v4\/settlements<\/code> returns a graded result per outcome. Together they close the loop on both result markets and on all four quarter markets.<\/p>\n<pre class=\"wp-block-code\"><code>import os, collections, time, requests\n\nAPI_KEY = os.environ[\"ODDSPAPI_API_KEY\"]\nBASE = \"https:\/\/api.oddspapi.io\/v4\"\nFINAL = \"id1100013870449608\"\n\ndef call(path):\n    for _ in range(4):\n        r = requests.get(f\"{BASE}{path}\",\n                         params={\"apiKey\": API_KEY, \"fixtureId\": FINAL})\n        if r.status_code == 200:\n            return r.json()\n        time.sleep(2.5)                # \/settlements throttles harder than \/odds\n    r.raise_for_status()\n\nperiods = call(\"\/scores\")[\"scores\"][\"periods\"]\nfor key in [\"p1\", \"p2\", \"p3\", \"p4\", \"result\"]:\n    p = periods[key]\n    print(f\"{key:7s} {p['participant1Score']}-{p['participant2Score']}\")\n\nmarkets = call(\"\/settlements\")[\"markets\"]\nresults = collections.Counter(\n    price[\"result\"]\n    for market in markets.values()\n    for outcome in market[\"outcomes\"].values()\n    for price in outcome[\"players\"].values())\ngraded = sum(1 for m in markets.values()\n             if all(p[\"result\"] != \"UNDECIDED\"\n                    for o in m[\"outcomes\"].values()\n                    for p in o[\"players\"].values()))\nprint(f\"{len(markets)} markets, {graded} fully graded, {dict(results)}\")\n\nfor market_id, label in [(\"111\", \"Winner (incl. overtime)\"),\n                         (\"113\", \"Regular Time Result\"),\n                         (\"11341\", \"Fourth Quarter Result\")]:\n    grades = {outcome_id: list(o[\"players\"].values())[0][\"result\"]\n              for outcome_id, o in markets[market_id][\"outcomes\"].items()}\n    print(f\"{market_id:6s} {label:24s} {grades}\")<\/code><\/pre>\n<pre class=\"wp-block-code\"><code>p1      19-26\np2      27-18\np3      15-21\np4      31-20\nresult  92-85\n4902 markets, 3160 fully graded, {'WIN': 3146, 'LOSE': 3153, 'PUSH': 28, 'UNDECIDED': 3804}\n111    Winner (incl. overtime)  {'111': 'WIN', '112': 'LOSE'}\n113    Regular Time Result      {'113': 'WIN', '114': 'LOSE', '115': 'LOSE'}\n11341  Fourth Quarter Result    {'11341': 'WIN', '11342': 'LOSE', '11343': 'LOSE'}<\/code><\/pre>\n<p>3,160 of the 4,902 basketball markets graded on that fixture, with 28 PUSH results on the whole-number handicaps. The 3,804 UNDECIDED outcomes are rungs no book ever priced, so they never opened and never resolved. Olympiakos led at the end of regulation and won 92-85, so market 111 and market 113 graded the same way here. They would not have if the game had gone to overtime tied.<\/p>\n<h2>The Rest of the Basketball Menu<\/h2>\n<p>The sport catalogue carries <strong>4,902 market IDs for basketball<\/strong>. Beyond the two result markets, the useful families are:<\/p>\n<figure class=\"wp-block-table\">\n<table>\n<thead>\n<tr>\n<th>Family<\/th>\n<th>Example market ID<\/th>\n<th>Periods available<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Handicap (incl. overtime)<\/td>\n<td><code>11450<\/code> at -1.5<\/td>\n<td>result, halves, each quarter<\/td>\n<\/tr>\n<tr>\n<td>Over \/ Under (incl. overtime)<\/td>\n<td><code>11144<\/code> at 169.5<\/td>\n<td>result, halves, each quarter<\/td>\n<\/tr>\n<tr>\n<td>Team totals<\/td>\n<td><code>111408<\/code>, <code>111586<\/code><\/td>\n<td>result, halves, each quarter<\/td>\n<\/tr>\n<tr>\n<td>Quarter and half 1X2<\/td>\n<td><code>11332<\/code>, <code>11326<\/code><\/td>\n<td>p1 to p4, first and second half<\/td>\n<\/tr>\n<tr>\n<td>Player points, rebounds, assists<\/td>\n<td><code>112254<\/code>, <code>112305<\/code>, <code>112389<\/code><\/td>\n<td>result, first quarter<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>On the EuroLeague opener the deepest secondary markets were the 169.5 total (156 books) and the -1.5 handicap (147 books). Player props run as ladders of <code>10+<\/code>, <code>11+<\/code>, <code>12+<\/code> outcomes rather than a single over\/under line, and the player is keyed by player ID inside the <code>players<\/code> dictionary. The mechanics are the same as <a href=\"https:\/\/oddspapi.io\/blog\/player-props-api-nfl-nba-mlb-odds-python\/\">NFL, NBA and MLB props<\/a>.<\/p>\n<p>One catalogue note that will save you a debugging session: <code>\/v4\/markets<\/code> ignores the <code>sportId<\/code> parameter and returns all 33,115 market definitions. Filter on <code>m[\"sportId\"] == 11<\/code> in your own code.<\/p>\n<h2>Why OddsPapi<\/h2>\n<p>The catalogue holds <strong>357 bookmaker slugs<\/strong> across 69 sports, and a single EuroLeague fixture pulls 205 of them in one call. <strong>Historical odds are free<\/strong>, snapshot by snapshot, with Pinnacle&#8217;s stake limits attached. <strong>Native market structures<\/strong> mean the Asian handicap ladder and the quarter markets arrive as real market IDs rather than a text blob you have to parse. And a <a href=\"https:\/\/oddspapi.io\/blog\/websocket-odds-api-real-time-betting-data\/\">WebSocket feed<\/a> pushes in-play moves instead of making you poll.<\/p>\n<p>Start on the <a href=\"https:\/\/oddspapi.io\/blog\/free-odds-api-350-bookmakers\/\">free tier<\/a>, which covers every endpoint in this post. <a href=\"https:\/\/oddspapi.io\/en\/sign-up\">Get a key<\/a> and run the fixture call against tonight&#8217;s board.<\/p>\n<h2>FAQ<\/h2>\n<h3>What is the market ID for the EuroLeague match winner?<\/h3>\n<p>Market <code>111<\/code>, &#8220;Winner (incl. overtime)&#8221;, with outcome 111 for the home participant and 112 for the away participant. 192 of the 205 books on the 24 September opener quoted it.<\/p>\n<h3>Why does a basketball fixture have a draw market?<\/h3>\n<p>Market <code>113<\/code> is the &#8220;Regular Time Result&#8221;, which settles on the score at the end of the fourth quarter and before any overtime. A tie at that point is a real outcome, so the market carries three legs. 69 books quoted it on each of the four EuroLeague openers we measured, at a median 9.12% margin against 6.49% for the two-way.<\/p>\n<h3>Does Pinnacle price EuroLeague basketball?<\/h3>\n<p>Yes. Pinnacle carried 364 markets on the 2026 EuroLeague final, with 110 pre-tip price changes on the favourite and stake limits rising from 864 to 29,239. Its menu is moneyline, spreads and totals, so the three-way regular-time market is one you build from soft-book prices.<\/p>\n<h3>How much EuroLeague history can I pull on the free tier?<\/h3>\n<p>All of it. <code>\/v4\/historical-odds<\/code> is free and returns every recorded snapshot. On the 2026 final the Pinnacle history opened 35 hours before tip-off and ran to 708 snapshots on the home leg. Request up to three bookmakers per call.<\/p>\n<h3>How do I grade a EuroLeague bet after the game?<\/h3>\n<p><code>\/v4\/settlements<\/code> returns WIN, LOSE, PUSH, HALFWIN, HALFLOSS or UNDECIDED per outcome, and <code>\/v4\/scores<\/code> returns the quarter-by-quarter breakdown. On the 2026 final that graded 3,160 markets, including both result markets and all four quarter results.<\/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\": \"What is the market ID for the EuroLeague match winner?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Market 111, \\\"Winner (incl. overtime)\\\", with outcome 111 for the home participant and 112 for the away participant. 192 of the 205 books on the 24 September opener quoted it.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"Why does a basketball fixture have a draw market?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Market 113 is the Regular Time Result, which settles on the score at the end of the fourth quarter and before any overtime. A tie at that point is a real outcome, so the market carries three legs. 69 books quoted it on each of the four EuroLeague openers measured, at a median 9.12% margin against 6.49% for the two-way.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"Does Pinnacle price EuroLeague basketball?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Yes. Pinnacle carried 364 markets on the 2026 EuroLeague final, with 110 pre-tip price changes on the favourite and stake limits rising from 864 to 29,239. Its menu is moneyline, spreads and totals, so the three-way regular-time market is one you build from soft-book prices.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"How much EuroLeague history can I pull on the free tier?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"All of it. \/v4\/historical-odds is free and returns every recorded snapshot. On the 2026 final the Pinnacle history opened 35 hours before tip-off and ran to 708 snapshots on the home leg. Request up to three bookmakers per call.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"How do I grade a EuroLeague bet after the game?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"\/v4\/settlements returns WIN, LOSE, PUSH, HALFWIN, HALFLOSS or UNDECIDED per outcome, and \/v4\/scores returns the quarter-by-quarter breakdown. On the 2026 final that graded 3,160 markets, including both result markets and all four quarter results.\"\n      }\n    }\n  ]\n}\n<\/script><\/p>\n<p><!--\nFocus Keyphrase: euroleague odds api\nSEO Title: EuroLeague Odds API: 205 Books, Two Result Markets, One Draw Leg\nMeta Description: A EuroLeague odds API call returns two winner markets. Market 111 includes overtime. Market 113 adds a regular-time draw that 69 books price.\nSlug: euroleague-basketball-odds-api\n--><\/p>\n","protected":false},"excerpt":{"rendered":"<p>A EuroLeague odds API call returns two winner markets. Market 111 includes overtime. Market 113 adds a regular-time draw that 69 books price.<\/p>\n","protected":false},"author":2,"featured_media":3935,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7],"tags":[75,98,9,11,10],"class_list":["post-3934","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-how-to-guides","tag-basketball","tag-euroleague","tag-odds-api","tag-python","tag-sports-betting-api"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.4 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>EuroLeague Odds API: 205 Books, Two Result Markets, One Draw Leg | 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\/euroleague-basketball-odds-api\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"EuroLeague Odds API: 205 Books, Two Result Markets, One Draw Leg | OddsPapi Blog\" \/>\n<meta property=\"og:description\" content=\"A EuroLeague odds API call returns two winner markets. Market 111 includes overtime. Market 113 adds a regular-time draw that 69 books price.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/oddspapi.io\/blog\/euroleague-basketball-odds-api\/\" \/>\n<meta property=\"og:site_name\" content=\"OddsPapi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-09-19T10:00:00+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/09\/euroleague-basketball-odds-api.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=\"14 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/oddspapi.io\/blog\/euroleague-basketball-odds-api\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/euroleague-basketball-odds-api\/\"},\"author\":{\"name\":\"Odds API Writer\",\"@id\":\"https:\/\/oddspapi.io\/blog\/#\/schema\/person\/b6f21e649c4f556f0a95c23a0f1efa13\"},\"headline\":\"EuroLeague Odds API: 205 Books, Two Result Markets, One Draw Leg\",\"datePublished\":\"2026-09-19T10:00:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/euroleague-basketball-odds-api\/\"},\"wordCount\":1611,\"commentCount\":1,\"publisher\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/euroleague-basketball-odds-api\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/09\/euroleague-basketball-odds-api.webp\",\"keywords\":[\"Basketball\",\"EuroLeague\",\"Odds API\",\"Python\",\"Sports Betting API\"],\"articleSection\":[\"How To Guides\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/oddspapi.io\/blog\/euroleague-basketball-odds-api\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/oddspapi.io\/blog\/euroleague-basketball-odds-api\/\",\"url\":\"https:\/\/oddspapi.io\/blog\/euroleague-basketball-odds-api\/\",\"name\":\"EuroLeague Odds API: 205 Books, Two Result Markets, One Draw Leg | OddsPapi Blog\",\"isPartOf\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/euroleague-basketball-odds-api\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/euroleague-basketball-odds-api\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/09\/euroleague-basketball-odds-api.webp\",\"datePublished\":\"2026-09-19T10:00:00+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/euroleague-basketball-odds-api\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/oddspapi.io\/blog\/euroleague-basketball-odds-api\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/oddspapi.io\/blog\/euroleague-basketball-odds-api\/#primaryimage\",\"url\":\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/09\/euroleague-basketball-odds-api.webp\",\"contentUrl\":\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/09\/euroleague-basketball-odds-api.webp\",\"width\":1200,\"height\":675,\"caption\":\"EuroLeague Odds API featured image\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/oddspapi.io\/blog\/euroleague-basketball-odds-api\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/oddspapi.io\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"EuroLeague Odds API: 205 Books, Two Result Markets, One Draw Leg\"}]},{\"@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":"EuroLeague Odds API: 205 Books, Two Result Markets, One Draw Leg | 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\/euroleague-basketball-odds-api\/","og_locale":"en_US","og_type":"article","og_title":"EuroLeague Odds API: 205 Books, Two Result Markets, One Draw Leg | OddsPapi Blog","og_description":"A EuroLeague odds API call returns two winner markets. Market 111 includes overtime. Market 113 adds a regular-time draw that 69 books price.","og_url":"https:\/\/oddspapi.io\/blog\/euroleague-basketball-odds-api\/","og_site_name":"OddsPapi Blog","article_published_time":"2026-09-19T10:00:00+00:00","og_image":[{"width":1200,"height":675,"url":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/09\/euroleague-basketball-odds-api.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":"14 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/oddspapi.io\/blog\/euroleague-basketball-odds-api\/#article","isPartOf":{"@id":"https:\/\/oddspapi.io\/blog\/euroleague-basketball-odds-api\/"},"author":{"name":"Odds API Writer","@id":"https:\/\/oddspapi.io\/blog\/#\/schema\/person\/b6f21e649c4f556f0a95c23a0f1efa13"},"headline":"EuroLeague Odds API: 205 Books, Two Result Markets, One Draw Leg","datePublished":"2026-09-19T10:00:00+00:00","mainEntityOfPage":{"@id":"https:\/\/oddspapi.io\/blog\/euroleague-basketball-odds-api\/"},"wordCount":1611,"commentCount":1,"publisher":{"@id":"https:\/\/oddspapi.io\/blog\/#organization"},"image":{"@id":"https:\/\/oddspapi.io\/blog\/euroleague-basketball-odds-api\/#primaryimage"},"thumbnailUrl":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/09\/euroleague-basketball-odds-api.webp","keywords":["Basketball","EuroLeague","Odds API","Python","Sports Betting API"],"articleSection":["How To Guides"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/oddspapi.io\/blog\/euroleague-basketball-odds-api\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/oddspapi.io\/blog\/euroleague-basketball-odds-api\/","url":"https:\/\/oddspapi.io\/blog\/euroleague-basketball-odds-api\/","name":"EuroLeague Odds API: 205 Books, Two Result Markets, One Draw Leg | OddsPapi Blog","isPartOf":{"@id":"https:\/\/oddspapi.io\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/oddspapi.io\/blog\/euroleague-basketball-odds-api\/#primaryimage"},"image":{"@id":"https:\/\/oddspapi.io\/blog\/euroleague-basketball-odds-api\/#primaryimage"},"thumbnailUrl":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/09\/euroleague-basketball-odds-api.webp","datePublished":"2026-09-19T10:00:00+00:00","breadcrumb":{"@id":"https:\/\/oddspapi.io\/blog\/euroleague-basketball-odds-api\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/oddspapi.io\/blog\/euroleague-basketball-odds-api\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/oddspapi.io\/blog\/euroleague-basketball-odds-api\/#primaryimage","url":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/09\/euroleague-basketball-odds-api.webp","contentUrl":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/09\/euroleague-basketball-odds-api.webp","width":1200,"height":675,"caption":"EuroLeague Odds API featured image"},{"@type":"BreadcrumbList","@id":"https:\/\/oddspapi.io\/blog\/euroleague-basketball-odds-api\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/oddspapi.io\/blog\/"},{"@type":"ListItem","position":2,"name":"EuroLeague Odds API: 205 Books, Two Result Markets, One Draw Leg"}]},{"@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\/3934","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=3934"}],"version-history":[{"count":1,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/posts\/3934\/revisions"}],"predecessor-version":[{"id":3936,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/posts\/3934\/revisions\/3936"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/media\/3935"}],"wp:attachment":[{"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/media?parent=3934"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/categories?post=3934"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/tags?post=3934"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}