{"id":4841,"date":"2026-10-15T10:00:00","date_gmt":"2026-10-15T10:00:00","guid":{"rendered":"https:\/\/oddspapi.io\/blog\/?p=4841"},"modified":"2026-10-07T13:41:54","modified_gmt":"2026-10-07T13:41:54","slug":"1xbet-api-odds-access","status":"publish","type":"post","link":"https:\/\/oddspapi.io\/blog\/1xbet-api-odds-access\/","title":{"rendered":"1xBet API: Which of 8 Feeds Quotes the Tighter Line?"},"content":{"rendered":"<p>If you searched for a 1xBet API, you want 1xBet&#8217;s lines as JSON, next to the books you already price against. OddsPapi carries the book under the <code>1xbet<\/code> slug, in the same schema as Pinnacle and 350+ other bookmakers. One call returns it. Read it with care, because <code>1xbet<\/code> is one of eight slugs on our board that carry the same 1xBet event ID.<\/p>\n<p>The other seven link to 22bet.com: <code>22bet<\/code>, <code>1xbit<\/code>, <code>betwinner<\/code>, <code>fairpari<\/code>, <code>megapari<\/code>, <code>melbet<\/code> and <code>spelet.lv<\/code>. Those seven quote byte-identical prices. <code>1xbet<\/code> runs a second price book on the same event, and on 19 live boards (7 October 2026) <strong>it priced the main line at a 4.16% median margin against 5.40% on <code>22bet<\/code><\/strong>. By the close the gap narrows: on 54 played fixtures the two books closed identical on 19. The 22bet line carries the bigger menu. This guide shows you how to find the eight slugs, collapse them to two price books, and decide which one to read for each market.<\/p>\n<h2>Why a 1xBet scraper gives you one feed out of eight<\/h2>\n<p>A scraper pointed at one 1xBet site gives you one price book and one site&#8217;s HTML to maintain. It does not tell you that seven more slugs carry the same event, or that two of the eight price it differently. If you add all eight to a consensus, one price counts seven times. Our <a href=\"https:\/\/oddspapi.io\/blog\/consensus-odds-fair-odds-calculator-python\/\">consensus odds guide<\/a> covers why that skews a fair-value line.<\/p>\n<p>OddsPapi gives every book a <code>bookmakerFixtureId<\/code>, the event ID from the bookmaker&#8217;s own site, and a <code>fixturePath<\/code> deep link. Those two fields group the eight slugs for you. We used the same method for the Kambi feeds in the <a href=\"https:\/\/oddspapi.io\/blog\/unibet-api-odds-access\/\">Unibet API guide<\/a> and for Bwin&#8217;s regional sites in the <a href=\"https:\/\/oddspapi.io\/blog\/bwin-api-odds-access\/\">Bwin API guide<\/a>.<\/p>\n<figure class=\"wp-block-table\">\n<table>\n<thead>\n<tr>\n<th><\/th>\n<th>Scrape one 1xBet site<\/th>\n<th>OddsPapi <code>1xbet<\/code> and <code>22bet<\/code><\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Feeds<\/td>\n<td>The one site you scrape<\/td>\n<td>8 slugs on one event ID, plus 350+ other books in the same call<\/td>\n<\/tr>\n<tr>\n<td>Duplicate detection<\/td>\n<td>You match events across sites yourself<\/td>\n<td><code>bookmakerFixtureId<\/code> and <code>fixturePath<\/code> on every book<\/td>\n<\/tr>\n<tr>\n<td>Schema<\/td>\n<td>The site&#8217;s own markup<\/td>\n<td>One JSON shape for every book, with native market IDs for spreads, totals and props<\/td>\n<\/tr>\n<tr>\n<td>Played fixtures<\/td>\n<td>Only what your recorder saved<\/td>\n<td><code>\/v4\/historical-odds<\/code> on the free tier<\/td>\n<\/tr>\n<tr>\n<td>Live updates<\/td>\n<td>Your polling loop<\/td>\n<td>REST or WebSocket<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<h2>Step 1: find the 1xBet slugs in the catalogue<\/h2>\n<p>Authentication is one query parameter, <code>apiKey<\/code>. The helper 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.<\/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(8):\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;)\nprint(f&quot;{len(books)} bookmakers in the catalogue\\n&quot;)\n\n# 1xbet itself, 22bet, and every slug the catalogue flags as a 22bet clone\nfamily = [b for b in books\n          if b[&quot;slug&quot;] in (&quot;1xbet&quot;, &quot;22bet&quot;) or b.get(&quot;cloneOf&quot;) == &quot;22bet&quot;]\nfor b in family:\n    print(f&#x27;{b[&quot;slug&quot;]:&lt;10} {b[&quot;bookmakerName&quot;]:&lt;10} &#x27;\n          f&#x27;liveOdds={b[&quot;liveOdds&quot;]!s:&lt;5} cloneOf={b[&quot;cloneOf&quot;]}&#x27;)<\/code><\/pre>\n<pre class=\"wp-block-code\"><code>365 bookmakers in the catalogue\n\n1xbet      1xBet      liveOdds=True  cloneOf=None\n1xbit      1xBit      liveOdds=True  cloneOf=22bet\n22bet      22Bet      liveOdds=True  cloneOf=None\nbetwinner  BetWinner  liveOdds=True  cloneOf=22bet\nfairpari   FairPari   liveOdds=True  cloneOf=22bet\nmegapari   MegaPari   liveOdds=True  cloneOf=22bet\nmelbet     MelBet     liveOdds=True  cloneOf=22bet\nspelet.lv  Spelet LV  liveOdds=True  cloneOf=22bet<\/code><\/pre>\n<p>The catalogue flags six slugs as clones of <code>22bet<\/code> and leaves <code>1xbet<\/code> unflagged. Nothing in <code>\/v4\/bookmakers<\/code> links <code>1xbet<\/code> to the other seven. The event ID does that, in Step 2.<\/p>\n<h2>Step 2: group the eight slugs by event ID<\/h2>\n<p>This step takes the next NHL fixture, asks for the eight slugs, and groups them twice: first by <code>bookmakerFixtureId<\/code> and the host in <code>fixturePath<\/code>, then by the set of active prices each slug quotes.<\/p>\n<pre class=\"wp-block-code\"><code># Reuses get() and the imports from Step 1.\nimport json\nfrom collections import defaultdict\n\nFAMILY = [&quot;1xbet&quot;, &quot;22bet&quot;, &quot;1xbit&quot;, &quot;betwinner&quot;, &quot;fairpari&quot;,\n          &quot;megapari&quot;, &quot;melbet&quot;, &quot;spelet.lv&quot;]\nNHL = 234  # tournamentId, from \/v4\/fixtures\n\ndef active_prices(book):\n    &quot;&quot;&quot;Every active price a book quotes, keyed by (market, outcome, player).&quot;&quot;&quot;\n    return {(mid, oid, pid): p[&quot;price&quot;]\n            for mid, m in book[&quot;markets&quot;].items()\n            for oid, o in m[&quot;outcomes&quot;].items()\n            for pid, p in (o.get(&quot;players&quot;) or {}).items()\n            if p.get(&quot;active&quot;) and p.get(&quot;price&quot;)}\n\nnow = datetime.now(timezone.utc)\nfixtures = get(&quot;fixtures&quot;, tournamentId=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;)})\nfx = next(f for f in fixtures if f[&quot;hasOdds&quot;] and f[&quot;startTime&quot;] &gt; now.isoformat())\nprint(fx[&quot;participant1Name&quot;], &quot;v&quot;, fx[&quot;participant2Name&quot;], fx[&quot;startTime&quot;])\n\nodds = get(&quot;odds&quot;, fixtureId=fx[&quot;fixtureId&quot;], bookmakers=&quot;,&quot;.join(FAMILY))\nboard = odds[&quot;bookmakerOdds&quot;]\n\n# 1. group the slugs by the bookmaker&#x27;s own event ID and the host they link to\nevents = defaultdict(list)\nfor slug, book in board.items():\n    host = book[&quot;fixturePath&quot;].split(&quot;\/&quot;)[2]\n    events[book[&quot;bookmakerFixtureId&quot;]].append(f&quot;{slug} ({host})&quot;)\nfor event_id, slugs in events.items():\n    print(f&quot;\\nevent ID {event_id}: {len(slugs)} slugs&quot;)\n    for s in slugs:\n        print(&quot;  &quot;, s)\n\n# 2. collapse slugs that quote byte-identical prices\nbooks = defaultdict(list)\nfor slug, book in board.items():\n    prices = active_prices(book)\n    books[json.dumps(sorted(prices.items()))].append((slug, len(prices),\n          sum(1 for m in book[&quot;markets&quot;].values()\n              if any(p.get(&quot;active&quot;) for o in m[&quot;outcomes&quot;].values()\n                     for p in (o.get(&quot;players&quot;) or {}).values()))))\nprint(f&quot;\\n{len(board)} slugs, {len(books)} distinct price books&quot;)\nfor members in books.values():\n    slugs = [m[0] for m in members]\n    print(f&quot;  {len(slugs)} slug(s), {members[0][2]} active markets, &quot;\n          f&quot;{members[0][1]} active prices: {&#x27;, &#x27;.join(slugs)}&quot;)<\/code><\/pre>\n<pre class=\"wp-block-code\"><code>Washington Capitals v Pittsburgh Penguins 2026-10-07T23:30:00.000Z\n\nevent ID 351619128: 8 slugs\n   1xbet (1xbet.com)\n   1xbit (22bet.com)\n   22bet (22bet.com)\n   betwinner (22bet.com)\n   fairpari (22bet.com)\n   megapari (22bet.com)\n   melbet (22bet.com)\n   spelet.lv (22bet.com)\n\n8 slugs, 2 distinct price books\n  1 slug(s), 54 active markets, 332 active prices: 1xbet\n  7 slug(s), 118 active markets, 574 active prices: 1xbit, 22bet, betwinner, fairpari, megapari, melbet, spelet.lv<\/code><\/pre>\n<p>Eight slugs, one event ID, two price books. The seven 22bet.com slugs matched price for price on all 15 boards we compared on 7 October, across the NFL, MLB, NHL, EuroLeague, ATP Shanghai and the EFL Championship. Keep one of them in a consensus and drop the other six.<\/p>\n<p>The <code>1xbet<\/code> book is not a copy. On the NHL boards, most of its active prices matched <code>22bet<\/code>, but the moneyline did not. Across the 7 October sample, the 22bet line carried 1.05 to 6.3 times as many active markets on 29 boards: 346 against 193 on West Ham v QPR, 363 against 271 on Cowboys v Buccaneers. Read the menu from <code>22bet<\/code> and the headline price from <code>1xbet<\/code>.<\/p>\n<h2>Step 3: compare the main-line margin across a slate<\/h2>\n<p>This step reads the main market (moneyline, winner or 1X2) for the next three fixtures in seven tournaments and prints the margin for <code>1xbet<\/code>, <code>22bet<\/code> and <code>pinnacle<\/code>. A market counts only when every leg is active.<\/p>\n<pre class=\"wp-block-code\"><code># Reuses get() and the imports from Step 1.\n# tournamentId -&gt; the market that carries the headline price\nSLATE = {31: &quot;141&quot;,    # NFL, Winner (incl. overtime)\n         234: &quot;151&quot;,   # NHL, Winner (incl. overtime and penalties)\n         109: &quot;131&quot;,   # MLB, Winner (incl. extra innings)\n         138: &quot;111&quot;,   # EuroLeague, Winner (incl. overtime)\n         3085: &quot;121&quot;,  # ATP Shanghai singles, Winner\n         325: &quot;101&quot;,   # Brasileiro Serie A, Full Time Result\n         18: &quot;101&quot;}    # EFL Championship, Full Time Result\nBOOKS = [&quot;1xbet&quot;, &quot;22bet&quot;, &quot;pinnacle&quot;]\n\ndef overround(book, market_id):\n    &quot;&quot;&quot;Margin in % on one market, or None unless every leg is active.&quot;&quot;&quot;\n    m = book[&quot;markets&quot;].get(market_id) if book else None\n    if not m:\n        return None\n    legs = [o[&quot;players&quot;][&quot;0&quot;] for o in m[&quot;outcomes&quot;].values()]\n    if not all(l.get(&quot;active&quot;) and l.get(&quot;price&quot;) for l in legs):\n        return None\n    return (sum(1 \/ l[&quot;price&quot;] for l in legs) - 1) * 100\n\nnow = datetime.now(timezone.utc)\nwindow = {&quot;from&quot;: now.strftime(&quot;%Y-%m-%d&quot;),\n          &quot;to&quot;: (now + timedelta(days=4)).strftime(&quot;%Y-%m-%d&quot;)}\nrows = []\nfor tid, market_id in SLATE.items():\n    fixtures = get(&quot;fixtures&quot;, tournamentId=tid, **window) or []\n    upcoming = [f for f in fixtures\n                if f[&quot;hasOdds&quot;] and f[&quot;startTime&quot;] &gt; now.isoformat()][:3]\n    for f in upcoming:\n        odds = get(&quot;odds&quot;, fixtureId=f[&quot;fixtureId&quot;], bookmakers=&quot;,&quot;.join(BOOKS))\n        board = (odds or {}).get(&quot;bookmakerOdds&quot;, {})\n        m = {s: overround(board.get(s), market_id) for s in BOOKS}\n        if m[&quot;1xbet&quot;] is None or m[&quot;22bet&quot;] is None:\n            continue\n        rows.append(m)\n        name = f&#x27;{f[&quot;participant1Name&quot;]} v {f[&quot;participant2Name&quot;]}&#x27;[:34]\n        pin = f&#x27;{m[&quot;pinnacle&quot;]:.2f}%&#x27; if m[&quot;pinnacle&quot;] is not None else &quot;-&quot;\n        print(f&#x27;{f[&quot;tournamentName&quot;][:14]:&lt;14} {name:&lt;34} &#x27;\n              f&#x27;1xbet {m[&quot;1xbet&quot;]:.2f}%  22bet {m[&quot;22bet&quot;]:.2f}%  pinnacle {pin}&#x27;)\n        time.sleep(1)\n\ntighter = sum(1 for r in rows if r[&quot;1xbet&quot;] &lt; r[&quot;22bet&quot;] - 0.005)\nsame = sum(1 for r in rows if abs(r[&quot;1xbet&quot;] - r[&quot;22bet&quot;]) &lt;= 0.005)\nprint(f&quot;\\n{len(rows)} fixtures: 1xbet tighter on {tighter}, &quot;\n      f&quot;identical on {same}, wider on {len(rows) - tighter - same}&quot;)\nfor s in BOOKS:\n    vals = [r[s] for r in rows if r[s] is not None]\n    print(f&quot;median {s:&lt;8} {median(vals):.2f}%  ({len(vals)} fixtures)&quot;)<\/code><\/pre>\n<pre class=\"wp-block-code\"><code>NFL            Dallas Cowboys v Tampa Bay Buccane 1xbet 4.29%  22bet 5.42%  pinnacle 3.77%\nNHL            Washington Capitals v Pittsburgh P 1xbet 3.09%  22bet 5.21%  pinnacle 2.46%\nNHL            Winnipeg Jets v Colorado Avalanche 1xbet 3.12%  22bet 5.41%  pinnacle 2.66%\nNHL            Anaheim Ducks v Edmonton Oilers    1xbet 3.12%  22bet 5.18%  pinnacle 2.61%\nMLB            Chicago White Sox v Cleveland Guar 1xbet 2.03%  22bet 5.25%  pinnacle 2.01%\nMLB            Atlanta Braves v Los Angeles Dodge 1xbet 2.03%  22bet 5.29%  pinnacle 1.95%\nMLB            New York Yankees v Tampa Bay Rays  1xbet 2.06%  22bet 5.27%  pinnacle 2.02%\nEuroleague     Paris Basketball v ASVEL Lyon-Vill 1xbet 3.63%  22bet 5.39%  pinnacle 3.78%\nEuroleague     Maccabi Tel-Aviv v Olimpia Milano  1xbet 3.62%  22bet 5.15%  pinnacle 3.80%\nEuroleague     Dubai Basketball v KK Crvena zvezd 1xbet 3.65%  22bet 5.30%  pinnacle 3.89%\nATP Shanghai,  Borges, Nuno v Diaz Acosta, Facund 1xbet 4.19%  22bet 5.43%  pinnacle 2.94%\nATP Shanghai,  Munar, Jaume v Brooksby, Jenson    1xbet 4.18%  22bet 5.29%  pinnacle 2.87%\nATP Shanghai,  Coppejans, Kimmer v Tsitsipas, Ste 1xbet 4.24%  22bet 5.51%  pinnacle 3.74%\nBrasileiro Ser Red Bull Bragantino SP v Mirassol  1xbet 4.16%  22bet 5.45%  pinnacle 3.01%\nBrasileiro Ser SC Internacional RS v SC Corinthia 1xbet 4.23%  22bet 5.40%  pinnacle 2.73%\nBrasileiro Ser Clube do Remo PA v Gremio FB Porto 1xbet 4.21%  22bet 5.45%  pinnacle 2.80%\nChampionship   West Ham United v Queens Park Rang 1xbet 7.07%  22bet 7.07%  pinnacle 5.68%\nChampionship   Charlton Athletic v Bristol City   1xbet 7.01%  22bet 7.01%  pinnacle 5.03%\nChampionship   Swansea City v Norwich City        1xbet 7.44%  22bet 7.44%  pinnacle 4.85%\n\n19 fixtures: 1xbet tighter on 16, identical on 3, wider on 0\nmedian 1xbet    4.16%  (19 fixtures)\nmedian 22bet    5.40%  (19 fixtures)\nmedian pinnacle 2.94%  (19 fixtures)<\/code><\/pre>\n<p>We ran this on 7 October 2026 at 13:25 UTC. <code>1xbet<\/code> priced the main line tighter than <code>22bet<\/code> on 16 of 19 fixtures and matched it on the three Championship boards. The gap runs about 1.1 to 3.3 points. On MLB, <code>1xbet<\/code> sat within 0.08 points of Pinnacle. On the EuroLeague, it priced the winner market tighter than Pinnacle on all three fixtures.<\/p>\n<p>Check the price age before you trust a gap. On 18 of 29 pre-match boards we read that day, the <code>1xbet<\/code> book carried <code>bookmakerIsActive: false<\/code>, and on 10 of those 18 its newest price had changed inside the last 30 minutes. For this book, read the price-level <code>active<\/code> flag and each price&#8217;s <code>changedAt<\/code>. Our <a href=\"https:\/\/oddspapi.io\/blog\/line-shopping-python-best-odds\/\">line shopping guide<\/a> shows how to pick the best price per leg once you have both books.<\/p>\n<h2>Step 4: check the closing line on played fixtures<\/h2>\n<p>A live margin tells you about one moment. The close tells you what the book settled on. This step pulls every played NFL Week 5 fixture from <code>\/v4\/historical-odds<\/code> and takes the last active price before kickoff on each side. Pass <code>outcomeId<\/code> to cut the payload: one Brasileiro fixture came back at 14.8 MB for three books, and 0.1 MB for one outcome.<\/p>\n<pre class=\"wp-block-code\"><code># Reuses get() and the imports from Step 1.\nBOOKS = &quot;1xbet,22bet,pinnacle&quot;\nNFL, MONEYLINE = 31, [&quot;141&quot;, &quot;142&quot;]   # Winner (incl. overtime), both legs\n\ndef closing_prices(fixture_id, kickoff, outcome_id):\n    &quot;&quot;&quot;Last active price before kickoff, per book, for one outcome.&quot;&quot;&quot;\n    hist = get(&quot;historical-odds&quot;, fixtureId=fixture_id,\n               bookmakers=BOOKS, outcomeId=outcome_id)\n    time.sleep(4.6)                    # \/historical-odds needs a longer gap\n    close = {}\n    for slug, book in (hist or {}).get(&quot;bookmakers&quot;, {}).items():\n        for market in book[&quot;markets&quot;].values():\n            for o in market[&quot;outcomes&quot;].values():\n                snaps = [s for s in o[&quot;players&quot;].get(&quot;0&quot;, [])\n                         if s[&quot;active&quot;] and s[&quot;createdAt&quot;] &lt; kickoff]\n                if snaps:\n                    close[slug] = snaps[-1][&quot;price&quot;]\n    return close\n\nplayed = get(&quot;fixtures&quot;, tournamentId=NFL,\n             **{&quot;from&quot;: &quot;2026-10-02&quot;, &quot;to&quot;: &quot;2026-10-07&quot;})\nplayed = [f for f in played if f[&quot;statusName&quot;] == &quot;Finished&quot;]\n\nmargins = {s: [] for s in BOOKS.split(&quot;,&quot;)}\npairs = []\nfor f in played:\n    kickoff = f[&quot;trueStartTime&quot;] or f[&quot;startTime&quot;]\n    legs = [closing_prices(f[&quot;fixtureId&quot;], kickoff, oid) for oid in MONEYLINE]\n    row = {}\n    for slug in margins:\n        if all(slug in leg for leg in legs):\n            row[slug] = (sum(1 \/ leg[slug] for leg in legs) - 1) * 100\n            margins[slug].append(row[slug])\n    if &quot;1xbet&quot; in row and &quot;22bet&quot; in row:\n        pairs.append((row[&quot;1xbet&quot;], row[&quot;22bet&quot;]))\n    print(f&#x27;{f[&quot;participant1Abbr&quot;] or &quot;&quot;:&gt;4} v {f[&quot;participant2Abbr&quot;] or &quot;&quot;:&lt;4}&#x27;,\n          &quot;  &quot;.join(f&quot;{s} {v:.2f}%&quot; for s, v in row.items()))\n\nprint(f&quot;\\n{len(played)} played NFL Week 5 fixtures, closing moneyline:&quot;)\nfor slug, vals in margins.items():\n    print(f&quot;  {slug:&lt;8} median {median(vals):.2f}%  ({len(vals)} fixtures)&quot;)\nprint(f&quot;  1xbet tighter than 22bet at the close on &quot;\n      f&quot;{sum(1 for a, b in pairs if a &lt; b - 0.005)} of {len(pairs)}, &quot;\n      f&quot;identical on {sum(1 for a, b in pairs if abs(a - b) &lt;= 0.005)}&quot;)<\/code><\/pre>\n<pre class=\"wp-block-code\"><code> CLE v PIT  1xbet 5.33%  22bet 5.33%  pinnacle 2.51%\n WAS v IND  1xbet 5.91%  22bet 5.39%  pinnacle 4.91%\n BAL v TEN  1xbet 5.26%  22bet 5.29%  pinnacle 3.21%\n BUF v NE   1xbet 5.19%  22bet 5.26%  pinnacle 3.00%\n CHI v NYJ  1xbet 5.21%  22bet 5.21%  pinnacle 2.71%\n CIN v JAX  1xbet 5.23%  22bet 5.23%  pinnacle 2.48%\n HOU v DAL  1xbet 5.23%  22bet 5.23%  pinnacle 2.58%\n NYG v ARI  1xbet 5.25%  22bet 5.25%  pinnacle 2.44%\n PHI v LA   1xbet 5.21%  22bet 5.21%  pinnacle 2.69%\n  TB v GB   1xbet 5.23%  22bet 5.23%  pinnacle 2.44%\n MIN v MIA  1xbet 5.18%  22bet 5.22%  pinnacle 3.20%\n  LV v KC   1xbet 4.34%  22bet 5.33%  pinnacle 2.72%\n SEA v LAC  1xbet 4.56%  22bet 5.34%  pinnacle 2.99%\n  SF v DEN  1xbet 4.09%  22bet 5.20%  pinnacle 2.51%\n CAR v DET  1xbet 4.44%  22bet 5.26%  pinnacle 2.64%\n  NO v ATL  1xbet 5.31%  22bet 5.31%  pinnacle 2.41%\n\n16 played NFL Week 5 fixtures, closing moneyline:\n  1xbet    median 5.22%  (16 fixtures)\n  22bet    median 5.25%  (16 fixtures)\n  pinnacle median 2.66%  (16 fixtures)\n  1xbet tighter than 22bet at the close on 7 of 16, identical on 8<\/code><\/pre>\n<p>On the NFL, the gap mostly closes by kickoff. The two books closed identical on 8 of 16 moneylines, and <code>1xbet<\/code> stayed tighter on 7. We ran the same check on 54 played fixtures across seven tournaments between 2 and 6 October:<\/p>\n<figure class=\"wp-block-table\">\n<table>\n<thead>\n<tr>\n<th>Tournament (played, 2 to 6 Oct 2026)<\/th>\n<th>Fixtures<\/th>\n<th><code>1xbet<\/code> tighter at the close<\/th>\n<th>Identical<\/th>\n<th>Median close, <code>1xbet<\/code><\/th>\n<th>Median close, <code>22bet<\/code><\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>NFL<\/td>\n<td>12<\/td>\n<td>5<\/td>\n<td>6<\/td>\n<td>5.21%<\/td>\n<td>5.25%<\/td>\n<\/tr>\n<tr>\n<td>MLB<\/td>\n<td>8<\/td>\n<td>6<\/td>\n<td>2<\/td>\n<td>2.05%<\/td>\n<td>5.27%<\/td>\n<\/tr>\n<tr>\n<td>NHL<\/td>\n<td>10<\/td>\n<td>5<\/td>\n<td>5<\/td>\n<td>4.71%<\/td>\n<td>4.77%<\/td>\n<\/tr>\n<tr>\n<td>ATP Shanghai singles<\/td>\n<td>10<\/td>\n<td>3<\/td>\n<td>5<\/td>\n<td>7.92%<\/td>\n<td>8.04%<\/td>\n<\/tr>\n<tr>\n<td>UEFA Nations League<\/td>\n<td>9<\/td>\n<td>4<\/td>\n<td>1<\/td>\n<td>4.25%<\/td>\n<td>5.25%<\/td>\n<\/tr>\n<tr>\n<td>WTA Beijing singles<\/td>\n<td>3<\/td>\n<td>2<\/td>\n<td>0<\/td>\n<td>4.85%<\/td>\n<td>4.69%<\/td>\n<\/tr>\n<tr>\n<td>Brasileiro Serie A<\/td>\n<td>2<\/td>\n<td>1<\/td>\n<td>0<\/td>\n<td>4.17%<\/td>\n<td>4.14%<\/td>\n<\/tr>\n<tr>\n<td><strong>All<\/strong><\/td>\n<td><strong>54<\/strong><\/td>\n<td><strong>26<\/strong><\/td>\n<td><strong>19<\/strong><\/td>\n<td><\/td>\n<td><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>MLB is where the second book earns its slot. <code>1xbet<\/code> closed six of eight postseason moneylines between 2.04% and 2.06%, while <code>22bet<\/code> held 5.2% to 5.4%. On the Nations League, the two books split. So route per market and per tournament, and re-run the check on your own slate. The NFL sample in the table is the 12 fixtures from our bulk run; the snippet above reads all 16 Week 5 games.<\/p>\n<p>Snapshots record polling, so collapse identical consecutive prices before you count line moves. For a full strategy test on these closes, start from our <a href=\"https:\/\/oddspapi.io\/blog\/backtest-betting-model-free-historical-odds\/\">backtesting guide<\/a>. For the speed question, our <a href=\"https:\/\/oddspapi.io\/blog\/soft-book-lag-pinnacle\/\">soft book lag study<\/a> timed how fast <code>1xbet<\/code> follows a Pinnacle move. To read the book live without a polling loop, use the <a href=\"https:\/\/oddspapi.io\/blog\/websocket-odds-api-real-time-betting-data\/\">WebSocket feed<\/a>.<\/p>\n<p>For a one-page view of the slug, see the <a href=\"https:\/\/oddspapi.io\/sportsbooks\/1xbet\">1xBet sportsbook page<\/a>. For Stake and the other crypto and offshore sportsbooks, read the <a href=\"https:\/\/oddspapi.io\/blog\/crypto-bookmaker-api-1xbet-stake-odds\/\">crypto bookmaker API guide<\/a>.<\/p>\n<h2>1xBet API FAQ<\/h2>\n<h3>How do I get 1xBet odds in Python?<\/h3>\n<p>Call \/v4\/odds with a fixtureId and bookmakers=1xbet, and pass your key as the apiKey query parameter. Add 22bet to the same call to get the second 1xBet price book, which carries the larger market menu.<\/p>\n<h3>Which bookmaker feeds share 1xBet&#8217;s event ID?<\/h3>\n<p>On 7 October 2026, eight slugs carried the same bookmakerFixtureId: 1xbet, plus 22bet, 1xbit, betwinner, fairpari, megapari, melbet and spelet.lv, which all link to 22bet.com.<\/p>\n<h3>Do 22Bet, MelBet and BetWinner quote the same odds as 1xBet?<\/h3>\n<p>22bet, 1xbit, betwinner, fairpari, megapari, melbet and spelet.lv quoted byte-identical prices on every board we checked. 1xbet runs its own price book on the same event, and priced the main line at a 4.16% median margin against 5.40% on 22bet across 19 live boards.<\/p>\n<h3>Does cloneOf tell me which books copy 1xBet?<\/h3>\n<p>It flags six slugs as clones of 22bet and leaves 1xbet unflagged. Group books on bookmakerFixtureId and on identical price sets to find the full family.<\/p>\n<h3>Can I get historical 1xBet odds?<\/h3>\n<p>Yes. \/v4\/historical-odds returns every 1xbet and 22bet snapshot on a played fixture, on the free tier. Across 54 played fixtures from 2 to 6 October 2026, 1xbet closed the main line tighter than 22bet on 26 and identical on 19.<\/p>\n<h2>Read both 1xBet price books from one key<\/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, 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 tonight&#8217;s slate.<\/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 1xBet odds in Python?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Call \/v4\/odds with a fixtureId and bookmakers=1xbet, and pass your key as the apiKey query parameter. Add 22bet to the same call to get the second 1xBet price book, which carries the larger market menu.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"Which bookmaker feeds share 1xBet's event ID?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"On 7 October 2026, eight slugs carried the same bookmakerFixtureId: 1xbet, plus 22bet, 1xbit, betwinner, fairpari, megapari, melbet and spelet.lv, which all link to 22bet.com.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"Do 22Bet, MelBet and BetWinner quote the same odds as 1xBet?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"22bet, 1xbit, betwinner, fairpari, megapari, melbet and spelet.lv quoted byte-identical prices on every board we checked. 1xbet runs its own price book on the same event, and priced the main line at a 4.16% median margin against 5.40% on 22bet across 19 live boards.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"Does cloneOf tell me which books copy 1xBet?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"It flags six slugs as clones of 22bet and leaves 1xbet unflagged. Group books on bookmakerFixtureId and on identical price sets to find the full family.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"Can I get historical 1xBet odds?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Yes. \/v4\/historical-odds returns every 1xbet and 22bet snapshot on a played fixture, on the free tier. Across 54 played fixtures from 2 to 6 October 2026, 1xbet closed the main line tighter than 22bet on 26 and identical on 19.\"\n      }\n    }\n  ]\n}\n<\/script><\/p>\n<p><!--\nFocus Keyphrase: 1xbet api\nSEO Title: 1xBet API: Which of 8 Feeds Quotes the Tighter Line?\nMeta Description: Read the 1xBet API as two price books. On 19 live boards, 1xbet priced the main line at a 4.16% median margin and the seven 22bet.com feeds at 5.40%.\nSlug: 1xbet-api-odds-access\n--><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Read the 1xBet API as two price books. On 19 live boards, 1xbet priced the main line at a 4.16% median margin and the seven 22bet.com feeds at 5.40%.<\/p>\n","protected":false},"author":2,"featured_media":4842,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7],"tags":[28,4,9,11,10],"class_list":["post-4841","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-how-to-guides","tag-1xbet","tag-historical-odds","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>1xBet API: Which of 8 Feeds Quotes the Tighter Line? | 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\/1xbet-api-odds-access\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"1xBet API: Which of 8 Feeds Quotes the Tighter Line? | OddsPapi Blog\" \/>\n<meta property=\"og:description\" content=\"Read the 1xBet API as two price books. On 19 live boards, 1xbet priced the main line at a 4.16% median margin and the seven 22bet.com feeds at 5.40%.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/oddspapi.io\/blog\/1xbet-api-odds-access\/\" \/>\n<meta property=\"og:site_name\" content=\"OddsPapi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-10-15T10:00:00+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/10\/1xbet-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\/1xbet-api-odds-access\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/1xbet-api-odds-access\/\"},\"author\":{\"name\":\"Odds API Writer\",\"@id\":\"https:\/\/oddspapi.io\/blog\/#\/schema\/person\/b6f21e649c4f556f0a95c23a0f1efa13\"},\"headline\":\"1xBet API: Which of 8 Feeds Quotes the Tighter Line?\",\"datePublished\":\"2026-10-15T10:00:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/1xbet-api-odds-access\/\"},\"wordCount\":1254,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/1xbet-api-odds-access\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/10\/1xbet-api-odds-access.webp\",\"keywords\":[\"1xBet\",\"historical odds\",\"Odds API\",\"Python\",\"Sports Betting API\"],\"articleSection\":[\"How To Guides\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/oddspapi.io\/blog\/1xbet-api-odds-access\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/oddspapi.io\/blog\/1xbet-api-odds-access\/\",\"url\":\"https:\/\/oddspapi.io\/blog\/1xbet-api-odds-access\/\",\"name\":\"1xBet API: Which of 8 Feeds Quotes the Tighter Line? | OddsPapi Blog\",\"isPartOf\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/1xbet-api-odds-access\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/1xbet-api-odds-access\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/10\/1xbet-api-odds-access.webp\",\"datePublished\":\"2026-10-15T10:00:00+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/1xbet-api-odds-access\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/oddspapi.io\/blog\/1xbet-api-odds-access\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/oddspapi.io\/blog\/1xbet-api-odds-access\/#primaryimage\",\"url\":\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/10\/1xbet-api-odds-access.webp\",\"contentUrl\":\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/10\/1xbet-api-odds-access.webp\",\"width\":1200,\"height\":675,\"caption\":\"1xBet API\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/oddspapi.io\/blog\/1xbet-api-odds-access\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/oddspapi.io\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"1xBet API: Which of 8 Feeds Quotes the Tighter Line?\"}]},{\"@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":"1xBet API: Which of 8 Feeds Quotes the Tighter Line? | 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\/1xbet-api-odds-access\/","og_locale":"en_US","og_type":"article","og_title":"1xBet API: Which of 8 Feeds Quotes the Tighter Line? | OddsPapi Blog","og_description":"Read the 1xBet API as two price books. On 19 live boards, 1xbet priced the main line at a 4.16% median margin and the seven 22bet.com feeds at 5.40%.","og_url":"https:\/\/oddspapi.io\/blog\/1xbet-api-odds-access\/","og_site_name":"OddsPapi Blog","article_published_time":"2026-10-15T10:00:00+00:00","og_image":[{"width":1200,"height":675,"url":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/10\/1xbet-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\/1xbet-api-odds-access\/#article","isPartOf":{"@id":"https:\/\/oddspapi.io\/blog\/1xbet-api-odds-access\/"},"author":{"name":"Odds API Writer","@id":"https:\/\/oddspapi.io\/blog\/#\/schema\/person\/b6f21e649c4f556f0a95c23a0f1efa13"},"headline":"1xBet API: Which of 8 Feeds Quotes the Tighter Line?","datePublished":"2026-10-15T10:00:00+00:00","mainEntityOfPage":{"@id":"https:\/\/oddspapi.io\/blog\/1xbet-api-odds-access\/"},"wordCount":1254,"commentCount":0,"publisher":{"@id":"https:\/\/oddspapi.io\/blog\/#organization"},"image":{"@id":"https:\/\/oddspapi.io\/blog\/1xbet-api-odds-access\/#primaryimage"},"thumbnailUrl":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/10\/1xbet-api-odds-access.webp","keywords":["1xBet","historical odds","Odds API","Python","Sports Betting API"],"articleSection":["How To Guides"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/oddspapi.io\/blog\/1xbet-api-odds-access\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/oddspapi.io\/blog\/1xbet-api-odds-access\/","url":"https:\/\/oddspapi.io\/blog\/1xbet-api-odds-access\/","name":"1xBet API: Which of 8 Feeds Quotes the Tighter Line? | OddsPapi Blog","isPartOf":{"@id":"https:\/\/oddspapi.io\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/oddspapi.io\/blog\/1xbet-api-odds-access\/#primaryimage"},"image":{"@id":"https:\/\/oddspapi.io\/blog\/1xbet-api-odds-access\/#primaryimage"},"thumbnailUrl":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/10\/1xbet-api-odds-access.webp","datePublished":"2026-10-15T10:00:00+00:00","breadcrumb":{"@id":"https:\/\/oddspapi.io\/blog\/1xbet-api-odds-access\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/oddspapi.io\/blog\/1xbet-api-odds-access\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/oddspapi.io\/blog\/1xbet-api-odds-access\/#primaryimage","url":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/10\/1xbet-api-odds-access.webp","contentUrl":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/10\/1xbet-api-odds-access.webp","width":1200,"height":675,"caption":"1xBet API"},{"@type":"BreadcrumbList","@id":"https:\/\/oddspapi.io\/blog\/1xbet-api-odds-access\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/oddspapi.io\/blog\/"},{"@type":"ListItem","position":2,"name":"1xBet API: Which of 8 Feeds Quotes the Tighter Line?"}]},{"@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\/4841","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=4841"}],"version-history":[{"count":2,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/posts\/4841\/revisions"}],"predecessor-version":[{"id":4844,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/posts\/4841\/revisions\/4844"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/media\/4842"}],"wp:attachment":[{"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/media?parent=4841"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/categories?post=4841"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/tags?post=4841"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}