{"id":2833,"date":"2026-04-16T10:00:00","date_gmt":"2026-04-16T10:00:00","guid":{"rendered":"https:\/\/oddspapi.io\/blog\/?p=2833"},"modified":"2026-10-15T13:17:37","modified_gmt":"2026-10-15T13:17:37","slug":"polymarket-api-gamma-clob-json-format","status":"publish","type":"post","link":"https:\/\/oddspapi.io\/blog\/polymarket-api-gamma-clob-json-format\/","title":{"rendered":"Polymarket API: Trace 28 NFL Tokens From Gamma to CLOB"},"content":{"rendered":"<h2>Polymarket Has Two APIs, and the Order Book Reads Upside Down<\/h2>\n<p>Search <code>polymarket api<\/code> and you land on two subdomains and a docs site that assumes you know what a <em>condition ID<\/em> is. Polymarket splits its public data across two services. <strong>Gamma<\/strong> is the catalogue. <strong>CLOB<\/strong> is the order book. They do not share a schema, and you need both.<\/p>\n<p>This post maps the two services with payloads captured on 15 October 2026. It then traces one token from Gamma to CLOB to a decimal-odds feed. We ran that trace on all 14 NFL Week 7 fixtures, 28 outcomes in total, and every top-of-book price and size matched to the share. You will learn:<\/p>\n<ul>\n<li>What Gamma and CLOB each return, and which one holds the number you want.<\/li>\n<li>Three parser traps we hit on live data: the stringified arrays, the worst-first order book, and a <code>\/price<\/code> endpoint whose <code>BUY<\/code> side returns the bid.<\/li>\n<li>How to convert share prices (0 to 1) to decimal odds and back.<\/li>\n<li>How to pull Polymarket next to Pinnacle and bet365 in one call, then check that feed against CLOB yourself.<\/li>\n<\/ul>\n<p>Reads need no key and no wallet. You only need <code>requests<\/code>.<\/p>\n<h2>The Landscape: Gamma vs CLOB<\/h2>\n<p>Polymarket settles on Polygon, but you do not query the chain. Two off-chain APIs wrap the market state:<\/p>\n<figure class=\"wp-block-table\">\n<table>\n<thead>\n<tr>\n<th>Service<\/th>\n<th>Base URL<\/th>\n<th>Purpose<\/th>\n<th>Auth<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>Gamma<\/strong><\/td>\n<td><code>https:\/\/gamma-api.polymarket.com<\/code><\/td>\n<td>Discovery: events, markets, metadata, volume, mid price. The catalogue.<\/td>\n<td>None<\/td>\n<\/tr>\n<tr>\n<td><strong>CLOB<\/strong><\/td>\n<td><code>https:\/\/clob.polymarket.com<\/code><\/td>\n<td>Order book depth, best bid and ask, midpoint, price history, order placement.<\/td>\n<td>None for reads. Signed EIP-712 payloads plus L2 headers for writes.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>Rule of thumb: <strong>Gamma tells you what exists. CLOB tells you what you can trade at.<\/strong> Most developers start at CLOB and then stall, because every CLOB endpoint wants a 77-digit <code>token_id<\/code>. Gamma hands you the token IDs.<\/p>\n<h3>The four ID types<\/h3>\n<figure class=\"wp-block-table\">\n<table>\n<thead>\n<tr>\n<th>ID<\/th>\n<th>Example (Chargers v Chiefs)<\/th>\n<th>Where it comes from<\/th>\n<th>What it refers to<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>Event slug<\/strong><\/td>\n<td><code>nfl-lac-kc-2026-10-18<\/code><\/td>\n<td>Gamma <code>\/events<\/code><\/td>\n<td>The fixture. This event holds 308 markets: moneyline, spreads, totals.<\/td>\n<\/tr>\n<tr>\n<td><strong>Market ID<\/strong><\/td>\n<td><code>4329891<\/code><\/td>\n<td>Gamma <code>\/markets<\/code><\/td>\n<td>One question, here &#8220;Chargers vs. Chiefs&#8221;.<\/td>\n<\/tr>\n<tr>\n<td><strong>Condition ID<\/strong><\/td>\n<td><code>0xa70da744\u2026b546<\/code><\/td>\n<td>Gamma <code>markets[].conditionId<\/code><\/td>\n<td>The on-chain market hash. CLOB returns it as <code>market<\/code>.<\/td>\n<\/tr>\n<tr>\n<td><strong>Token ID<\/strong> (<code>asset_id<\/code>)<\/td>\n<td><code>58167714289864\u2026<\/code> (77 digits)<\/td>\n<td>Gamma <code>markets[].clobTokenIds<\/code><\/td>\n<td>One outcome. <strong>Every CLOB endpoint wants this.<\/strong><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>A two-way market has one condition ID and two token IDs. On an NFL moneyline the tokens are the two participants, not Yes and No.<\/p>\n<h2>Gamma API: The Catalogue<\/h2>\n<p>Gamma is plain REST. You will use <code>\/markets<\/code> and <code>\/events<\/code> most of the time.<\/p>\n<h3>Listing active markets<\/h3>\n<pre class=\"wp-block-code\"><code>import requests, json\n\nGAMMA = \"https:\/\/gamma-api.polymarket.com\"\n\nr = requests.get(f\"{GAMMA}\/markets\", params={\n    \"limit\": 3,\n    \"active\": \"true\",\n    \"closed\": \"false\",\n})\nfor m in r.json():\n    # outcomes \/ outcomePrices \/ clobTokenIds are stringified JSON arrays\n    outcomes = json.loads(m[\"outcomes\"])\n    prices   = json.loads(m[\"outcomePrices\"])\n    tokens   = json.loads(m[\"clobTokenIds\"])\n    print(m[\"question\"])\n    for o, p, t in zip(outcomes, prices, tokens):\n        print(f\"  {o}: {p}  (token {t[:12]}...)\")\n<\/code><\/pre>\n<p>Output on 15 October 2026:<\/p>\n<pre class=\"wp-block-code\"><code>Xi Jinping out before 2027?\n  Yes: 0.0285  (token 323382201900...)\n  No: 0.9715  (token 256593106749...)\nWill Gavin Newsom win the 2028 Democratic presidential nomination?\n  Yes: 0.1545  (token 545330438199...)\n  No: 0.8455  (token 878541741480...)\nWill Alexandria Ocasio-Cortez win the 2028 Democratic presidential nomination?\n  Yes: 0.1685  (token 107064985435...)\n  No: 0.8315  (token 651760722613...)\n<\/code><\/pre>\n<p><strong>Trap 1: the stringified arrays.<\/strong> Gamma ships <code>outcomes<\/code>, <code>outcomePrices<\/code> and <code>clobTokenIds<\/code> as JSON <em>inside<\/em> strings. Skip the <code>json.loads<\/code> and you iterate over characters, so the first outcome becomes the letter <code>[<\/code>.<\/p>\n<p>The Chiefs moneyline as Gamma returns it (captured 15 Oct 2026, 13:13 UTC, trimmed from 90+ keys):<\/p>\n<pre class=\"wp-block-code\"><code>{\n  \"id\": \"4329891\",\n  \"question\": \"Chargers vs. Chiefs\",\n  \"conditionId\": \"0xa70da744210533416edb26fb4ee19ea7a7acdaef6daabb5077c4dec89494b546\",\n  \"slug\": \"nfl-lac-kc-2026-10-18\",\n  \"outcomes\": \"[\\\"Chargers\\\", \\\"Chiefs\\\"]\",\n  \"outcomePrices\": \"[\\\"0.215\\\", \\\"0.785\\\"]\",\n  \"clobTokenIds\": \"[\\\"25975613657668487250673927756557799100593582472155421789800705293576427824049\\\", \\\"58167714289864717825087991545150213770744040987591942526721915426213133665357\\\"]\",\n  \"volume\": \"3512.5369280000004\",\n  \"liquidity\": \"149784.2895\",\n  \"lastTradePrice\": 0.21,\n  \"bestBid\": 0.21,\n  \"bestAsk\": 0.22,\n  \"spread\": 0.01,\n  \"negRisk\": false,\n  \"active\": true,\n  \"closed\": false,\n  \"orderPriceMinTickSize\": 0.01,\n  \"orderMinSize\": 5\n}\n<\/code><\/pre>\n<p>Three details matter here. <code>outcomePrices<\/code> holds the <strong>midpoint<\/strong> (0.785 for the Chiefs), not a price you can fill. <code>bestBid<\/code> and <code>bestAsk<\/code> belong to the <strong>first<\/strong> outcome only, so 0.21 \/ 0.22 is the Chargers. And Gamma lists the <strong>away participant first<\/strong>: &#8220;Chargers vs. Chiefs&#8221; for a Chiefs home fixture. Gamma did this on 14 of 14 Week 7 fixtures. If you zip Gamma outcomes against a feed that puts the home side first, you flip every price. Match on the token ID, never on position.<\/p>\n<h3>Finding an event from its slug<\/h3>\n<pre class=\"wp-block-code\"><code>import requests\n\nGAMMA = \"https:\/\/gamma-api.polymarket.com\"\n\n# fixturePath from OddsPapi ends in the Gamma event slug\nev = requests.get(f\"{GAMMA}\/events\", params={\"slug\": \"nfl-lac-kc-2026-10-18\"}).json()[0]\nprint(ev[\"title\"], \"|\", len(ev[\"markets\"]), \"markets\")\nfor m in ev[\"markets\"][:4]:\n    print(\"  -\", m[\"question\"], \"| condition\", m[\"conditionId\"][:10] + \"...\")\n<\/code><\/pre>\n<pre class=\"wp-block-code\"><code>Chargers vs. Chiefs | 308 markets\n  - Chargers vs. Chiefs | condition 0xa70da744...\n  - Spread: Chiefs (-0.5) | condition 0x97aa81e2...\n  - Spread: Chiefs (-1.5) | condition 0x1f349328...\n  - Spread: Chiefs (-2.5) | condition 0xd0071583...\n<\/code><\/pre>\n<p><strong>Gamma notes:<\/strong><\/p>\n<ul>\n<li><code>active=true&amp;closed=false<\/code> filters to tradeable markets. <code>active<\/code> alone still returns resolved ones.<\/li>\n<li>Market <code>volume<\/code> is a string, but event <code>volume<\/code> is a number. Wrap both in <code>float()<\/code> before you sort.<\/li>\n<li><code>\/markets?clob_token_ids=&lt;token&gt;<\/code> takes you from a token back to its market. It resolved 28 of 28 NFL tokens in our run.<\/li>\n<li>Paginate with <code>limit<\/code> and <code>offset<\/code>, and do not assume a stable order between calls.<\/li>\n<\/ul>\n<h2>CLOB API: The Order Book<\/h2>\n<p>CLOB serves depth and history for one token at a time. Read endpoints need no auth.<\/p>\n<pre class=\"wp-block-code\"><code>import requests\n\nCLOB = \"https:\/\/clob.polymarket.com\"\nCHIEFS = \"58167714289864717825087991545150213770744040987591942526721915426213133665357\"\n\nbook = requests.get(f\"{CLOB}\/book\", params={\"token_id\": CHIEFS}).json()\n# both sides arrive worst-first: the touch is the LAST element\nbest_bid, best_ask = book[\"bids\"][-1], book[\"asks\"][-1]\nprint(\"tick\", book[\"tick_size\"], \"| min order\", book[\"min_order_size\"], \"| neg_risk\", book[\"neg_risk\"])\nprint(\"best bid\", best_bid, \"| best ask\", best_ask)\n\n# side=BUY returns the best BID, side=SELL the best ASK\nbuy  = requests.get(f\"{CLOB}\/price\", params={\"token_id\": CHIEFS, \"side\": \"BUY\"}).json()\nsell = requests.get(f\"{CLOB}\/price\", params={\"token_id\": CHIEFS, \"side\": \"SELL\"}).json()\nmid  = requests.get(f\"{CLOB}\/midpoint\", params={\"token_id\": CHIEFS}).json()\nprint(\"BUY\", buy[\"price\"], \"| SELL\", sell[\"price\"], \"| mid\", mid[\"mid\"])\n\nhist = requests.get(f\"{CLOB}\/prices-history\", params={\n    \"market\": CHIEFS,     # named \"market\", takes a token_id\n    \"interval\": \"1d\",\n    \"fidelity\": \"60\",     # 60-minute buckets\n}).json()[\"history\"]\nprint(len(hist), \"points, first\", hist[0])\n<\/code><\/pre>\n<pre class=\"wp-block-code\"><code>tick 0.01 | min order 5 | neg_risk False\nbest bid {'price': '0.78', 'size': '39472.87'} | best ask {'price': '0.79', 'size': '2495.56'}\nBUY 0.78 | SELL 0.79 | mid 0.785\n24 points, first {'t': 1791986416, 'p': 0.785}\n<\/code><\/pre>\n<p><strong>Trap 2: the book reads worst-first.<\/strong> <code>bids<\/code> run from 0.01 up to 0.78, and <code>asks<\/code> run from 0.99 down to 0.79. The first rows you print are deep, far-from-the-money orders. The touch sits at index <code>-1<\/code> on both sides. Every number is a string, so cast before you do math.<\/p>\n<p><strong>Trap 3: <code>side=BUY<\/code> returns the bid.<\/strong> The <code>side<\/code> names the resting orders, not your trade. If you want to buy the Chiefs now, you pay the <code>SELL<\/code> price, 0.79. A bot that reads <code>BUY<\/code> as &#8220;my cost to buy&#8221; quotes one tick too cheap on every market.<\/p>\n<p><code>\/prices-history<\/code> returns <code>{t, p}<\/code> points, where <code>p<\/code> is the midpoint. <code>interval<\/code> accepts <code>1h<\/code>, <code>6h<\/code>, <code>1d<\/code>, <code>1w<\/code>, <code>1m<\/code> and <code>max<\/code>. <code>fidelity<\/code> is the bucket size in minutes.<\/p>\n<p>Order placement is out of scope. It needs a funded Polygon wallet, an EIP-712 signature and L2 headers; Polymarket documents the flow in <a href=\"https:\/\/docs.polymarket.com\/trading\/place-orders\">Place Orders<\/a>. Baskets with <code>neg_risk: true<\/code> (multi-outcome events) behave differently again; our <a href=\"https:\/\/oddspapi.io\/blog\/polymarket-negative-risk-arbitrage\/\">negative-risk post<\/a> sizes one at the bid.<\/p>\n<h2>One Price, Three Shapes<\/h2>\n<figure class=\"wp-block-table\">\n<table>\n<thead>\n<tr>\n<th>Source<\/th>\n<th>Endpoint<\/th>\n<th>Path to the price you can fill<\/th>\n<th>Units<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Gamma<\/td>\n<td><code>\/markets?slug=\u2026<\/code><\/td>\n<td>None. <code>outcomePrices<\/code> is the mid; <code>bestAsk<\/code> covers outcome 0 only.<\/td>\n<td>Share (0 to 1)<\/td>\n<\/tr>\n<tr>\n<td>CLOB<\/td>\n<td><code>\/book?token_id=\u2026<\/code><\/td>\n<td><code>book[\"asks\"][-1][\"price\"]<\/code> (string)<\/td>\n<td>Share (0 to 1)<\/td>\n<\/tr>\n<tr>\n<td>OddsPapi<\/td>\n<td><code>\/v4\/odds?fixtureId=\u2026<\/code><\/td>\n<td><code>bookmakerOdds[\"polymarket\"][\"markets\"][\"141\"][\"outcomes\"][oid][\"players\"][\"0\"][\"price\"]<\/code><\/td>\n<td>Decimal (1 or more)<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<h2>Share Prices to Decimal Odds<\/h2>\n<p>Polymarket quotes shares. Sportsbooks quote decimal odds. One line converts each way:<\/p>\n<pre class=\"wp-block-code\"><code>def share_to_decimal(share: float) -> float:\n    \"\"\"0.79 -> 1.2658...\"\"\"\n    return 1 \/ share\n\ndef decimal_to_share(decimal: float) -> float:\n    \"\"\"1.266 -> 0.7899...\"\"\"\n    return 1 \/ decimal\n\ndef implied_pct(price, is_decimal=True):\n    \"\"\"Implied probability as a percentage.\"\"\"\n    return round((1 \/ price if is_decimal else price) * 100, 2)\n\nprint(implied_pct(0.79, is_decimal=False))   # -> 79.0\nprint(round(share_to_decimal(0.79), 3))      # -> 1.266\nprint(implied_pct(1.244))                    # -> 80.39 (Pinnacle, same outcome)\n<\/code><\/pre>\n<p>The math is the easy part. The work is doing it for every outcome on every fixture, matching Polymarket slugs to sportsbook fixtures, and keeping the home and away sides straight when Gamma lists them in reverse. For a converter that also covers American and fractional odds, see <a href=\"https:\/\/oddspapi.io\/blog\/polymarket-odds-converter-python\/\">Odds Converter in Python<\/a>.<\/p>\n<h2>Skip the Plumbing: Polymarket Next to 350+ Books<\/h2>\n<p>OddsPapi carries <code>polymarket<\/code> as a bookmaker slug among 350+ books and converts every price to decimal odds. It keys Polymarket on the same market IDs as Pinnacle and bet365:<\/p>\n<pre class=\"wp-block-code\"><code>import requests\n\nAPI_KEY = \"YOUR_API_KEY\"\nBASE    = \"https:\/\/api.oddspapi.io\/v4\"\n\nr = requests.get(f\"{BASE}\/odds\", params={\n    \"apiKey\": API_KEY,\n    \"fixtureId\": \"id1400003171515918\",          # Chiefs v Chargers, NFL Week 7\n    \"bookmakers\": \"polymarket,pinnacle,bet365\",\n})\nbo = r.json()[\"bookmakerOdds\"]\n\n# NFL moneyline is market 141. Outcome 141 = participant 1 (Chiefs), 142 = Chargers.\nfor slug in (\"polymarket\", \"pinnacle\", \"bet365\"):\n    outcomes = bo.get(slug, {}).get(\"markets\", {}).get(\"141\", {}).get(\"outcomes\", {})\n    for oid in (\"141\", \"142\"):\n        p = outcomes.get(oid, {}).get(\"players\", {}).get(\"0\", {})\n        print(f\"{slug:11s} {oid}: {p.get('price')}  limit={p.get('limit')}\")\n<\/code><\/pre>\n<pre class=\"wp-block-code\"><code>polymarket  141: 1.266  limit=1971.49\npolymarket  142: 4.545  limit=8684.03\npinnacle    141: 1.244  limit=18442.0\npinnacle    142: 4.28  limit=4500.0\nbet365      141: 1.18  limit=None\nbet365      142: 4.6  limit=None\n<\/code><\/pre>\n<p>On that board Polymarket ran the moneyline at a 0.99% margin, Pinnacle at 3.75% and bet365 at 6.48%. Polymarket held the best Chiefs price and bet365 the best Chargers price. <code>limit<\/code> on Polymarket is the stake you can place at the top price; bet365 publishes none. For margins and depth across 88 fixtures and three prediction venues, read <a href=\"https:\/\/oddspapi.io\/blog\/polymarket-api-kalshi-api-vs-sportsbooks-the-developers-guide\/\">Polymarket API &amp; Kalshi API: Compare 1% Markets to Pinnacle<\/a>.<\/p>\n<h3>The CLOB book lives in <code>exchangeMeta<\/code><\/h3>\n<p>Each Polymarket outcome carries a three-level ladder:<\/p>\n<pre class=\"wp-block-code\"><code>\"exchangeMeta\": {\n  \"back\": [ {\"cents\": 0.79, \"price\": 1.266, \"size\": 2495.56, \"limit\": 1971.49}, ... x3 ],\n  \"lay\":  [ {\"cents\": 0.22, \"price\": 4.545, \"size\": 39472.87, \"limit\": 8684.03}, ... x3 ],\n  \"bookmakerLayOutcomeId\": \"25975613657668487250673927756557799100593582472155421789800705293576427824049\"\n}\n<\/code><\/pre>\n<p>Read it like this. <code>cents<\/code> is the native share price and <code>price<\/code> is <code>1 \/ cents<\/code>. <code>size<\/code> is shares, which is also the payout in dollars. <code>limit<\/code> is the stake: <code>size \u00d7 cents<\/code>. The outcome&#8217;s <code>bookmakerOutcomeId<\/code> is its CLOB token, and <code>bookmakerLayOutcomeId<\/code> is the other participant&#8217;s token. Other exchanges on OddsPapi use different ladder shapes, so parse each venue on its own terms.<\/p>\n<h3>Check the feed against CLOB yourself<\/h3>\n<p>The token IDs let you audit the decimal feed against the source book:<\/p>\n<pre class=\"wp-block-code\"><code>import requests\n\nAPI_KEY = \"YOUR_API_KEY\"\nCLOB    = \"https:\/\/clob.polymarket.com\"\n\nodds = requests.get(\"https:\/\/api.oddspapi.io\/v4\/odds\", params={\n    \"apiKey\": API_KEY,\n    \"fixtureId\": \"id1400003171515918\",\n    \"bookmakers\": \"polymarket\",\n}).json()\npm = odds[\"bookmakerOdds\"][\"polymarket\"]\nprint(\"event:\", pm[\"fixturePath\"])\n\nfor oid, oc in pm[\"markets\"][\"141\"][\"outcomes\"].items():\n    p    = oc[\"players\"][\"0\"]\n    meta = p[\"exchangeMeta\"]\n    back, lay = meta[\"back\"][0], meta[\"lay\"][0]\n    book = requests.get(f\"{CLOB}\/book\", params={\"token_id\": p[\"bookmakerOutcomeId\"]}).json()\n    ask, bid = book[\"asks\"][-1], book[\"bids\"][-1]\n    print(f\"outcome {oid}: back {back['cents']} x {back['size']:,.2f} | CLOB ask {ask['price']} x {ask['size']}\")\n    print(f\"             lay  {lay['cents']} x {lay['size']:,.2f} | CLOB bid {bid['price']} x {bid['size']}\"\n          f\"  (1 - bid = {1 - float(bid['price']):.2f})\")\n    print(f\"             limit {back['limit']:,.2f} = size x cents {back['size'] * back['cents']:,.2f}\")\n<\/code><\/pre>\n<pre class=\"wp-block-code\"><code>event: https:\/\/polymarket.com\/event\/nfl-lac-kc-2026-10-18\noutcome 141: back 0.79 x 2,495.56 | CLOB ask 0.79 x 2495.56\n             lay  0.22 x 39,472.87 | CLOB bid 0.78 x 39472.87  (1 - bid = 0.22)\n             limit 1,971.49 = size x cents 1,971.49\noutcome 142: back 0.22 x 39,472.87 | CLOB ask 0.22 x 39472.87\n             lay  0.79 x 2,495.56 | CLOB bid 0.21 x 2495.56  (1 - bid = 0.79)\n             limit 8,684.03 = size x cents 8,684.03\n<\/code><\/pre>\n<p>The output shows how Polymarket builds a two-way market. A bid for the Chiefs at 0.78 is the same order as an ask for the Chargers at 0.22, so the two tokens share one book. OddsPapi&#8217;s <code>back<\/code> ladder is the token&#8217;s ask side. Its <code>lay<\/code> ladder is the token&#8217;s bid side, quoted as the other participant&#8217;s price.<\/p>\n<p>We ran this check on all 14 NFL Week 7 fixtures on 15 October 2026, 13:09 UTC, with about one second between the OddsPapi call and each CLOB call:<\/p>\n<figure class=\"wp-block-table\">\n<table>\n<thead>\n<tr>\n<th>Check<\/th>\n<th>Matched<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>bookmakerOutcomeId<\/code> answers on CLOB <code>\/book<\/code><\/td>\n<td>28 of 28 outcomes<\/td>\n<\/tr>\n<tr>\n<td>Top <code>back<\/code> cents and size = CLOB best ask<\/td>\n<td>28 of 28<\/td>\n<\/tr>\n<tr>\n<td>Top <code>lay<\/code> cents = 1 minus CLOB best bid, size = bid size<\/td>\n<td>28 of 28<\/td>\n<\/tr>\n<tr>\n<td>Back levels 2 and 3 = CLOB asks 2 and 3<\/td>\n<td>54 of 56 (two sizes moved inside the one-second gap)<\/td>\n<\/tr>\n<tr>\n<td><code>limit = size \u00d7 cents<\/code><\/td>\n<td>168 of 168 ladder levels<\/td>\n<\/tr>\n<tr>\n<td><code>price = 1 \/ cents<\/code>, three decimals<\/td>\n<td>28 of 28<\/td>\n<\/tr>\n<tr>\n<td><code>bookmakerLayOutcomeId<\/code> = the other outcome&#8217;s token<\/td>\n<td>28 of 28<\/td>\n<\/tr>\n<tr>\n<td>Gamma <code>\/markets?clob_token_ids=<\/code> finds the market<\/td>\n<td>28 of 28<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>For ladder depth across seven prediction venues on the same sport, see <a href=\"https:\/\/oddspapi.io\/blog\/nfl-prediction-market-liquidity\/\">NFL Prediction Market Liquidity<\/a>. If you want those ladders pushed to you instead of polled, the <a href=\"https:\/\/oddspapi.io\/blog\/websocket-odds-api-real-time-betting-data\/\">WebSocket odds API<\/a> streams them.<\/p>\n<h2>Free Historical Polymarket Odds<\/h2>\n<p>CLOB&#8217;s <code>\/prices-history<\/code> gives you midpoints for one token. OddsPapi&#8217;s <code>\/v4\/historical-odds<\/code> gives you every price change with the stake behind it, on the free tier. Polymarket has one rule: pass <strong>one bookmaker and exactly one <code>outcomeId<\/code><\/strong> per call. A call with <code>bookmakers=polymarket,pinnacle<\/code> returns HTTP 400 <code>INVALID_PARAMETER<\/code>, so pull Pinnacle in a second call.<\/p>\n<pre class=\"wp-block-code\"><code>import requests\n\nAPI_KEY = \"YOUR_API_KEY\"\n\nr = requests.get(\"https:\/\/api.oddspapi.io\/v4\/historical-odds\", params={\n    \"apiKey\": API_KEY,\n    \"fixtureId\": \"id1400003171515892\",   # Packers v Bears, 11 Oct 2026, 31-7\n    \"bookmakers\": \"polymarket\",          # polymarket: one book per call...\n    \"outcomeId\": 141,                    # ...and exactly one outcome\n})\nsnaps = r.json()[\"bookmakers\"][\"polymarket\"][\"markets\"][\"141\"][\"outcomes\"][\"141\"][\"players\"][\"0\"]\nsnaps.sort(key=lambda s: s[\"createdAt\"])\n\nlive  = [s for s in snaps if s[\"active\"] and s[\"price\"] > 1]\nclose = [s for s in live if s[\"createdAt\"] < \"2026-10-11T17:00:00\"][-1]\nprint(len(snaps), \"snapshots,\", len(live), \"active\")\nprint(\"first active:\", live[0])\nprint(\"close:       \", close)\n<\/code><\/pre>\n<pre class=\"wp-block-code\"><code>18191 snapshots, 17337 active\nfirst active: {'createdAt': '2026-08-31T12:42:37.650Z', 'price': 1.031, 'limit': 21.06, 'active': True, 'exchangeMeta': None}\nclose:        {'createdAt': '2026-10-11T16:59:57.490Z', 'price': 2.0, 'limit': 80312.12, 'active': True, 'exchangeMeta': None}\n<\/code><\/pre>\n<p>The Packers book opened 41 days out at 1.031 with $21 behind it, a placeholder price. It closed three seconds before kick-off at 2.0 with $80,312. Pinnacle closed the same outcome at 2.0 with a $56,250 limit (a second call, <code>bookmakers=pinnacle<\/code>). Two things to know: <code>exchangeMeta<\/code> is <code>null<\/code> on every historical snapshot, so use the snapshot <code>limit<\/code> for depth, and one Polymarket outcome on one NFL fixture is about 1.9 MB. To score closing prices against results, follow the <a href=\"https:\/\/oddspapi.io\/blog\/prediction-market-accuracy-backtest-polymarket-sportsbooks\/\">prediction market accuracy backtest<\/a>.<\/p>\n<h2>Where to Go From Here<\/h2>\n<ul>\n<li><strong>Kalshi too?<\/strong> <a href=\"https:\/\/oddspapi.io\/blog\/kalshi-vs-polymarket-api\/\">Kalshi API vs Polymarket API: A Python Developer's Comparison<\/a>.<\/li>\n<li><strong>Cross-venue arbitrage?<\/strong> <a href=\"https:\/\/oddspapi.io\/blog\/polymarket-arbitrage-local-bookmakers\/\">Polymarket Arbitrage: A 0.44% Median Edge on $4,023 of Depth<\/a>.<\/li>\n<li><strong>Quoting on Polymarket?<\/strong> <a href=\"https:\/\/oddspapi.io\/blog\/market-making-polymarket-sportsbook-odds\/\">Market Making on Polymarket<\/a>.<\/li>\n<li><strong>A live tracker?<\/strong> <a href=\"https:\/\/oddspapi.io\/blog\/prediction-market-dashboard-python-streamlit\/\">Prediction Market Dashboard with Python &amp; Streamlit<\/a>.<\/li>\n<li><strong>Pricing?<\/strong> <a href=\"https:\/\/oddspapi.io\/blog\/odds-api-pricing-2026-comparison\/\">Odds API Pricing 2026<\/a>.<\/li>\n<\/ul>\n<h2>One Schema for Polymarket and the Sportsbooks<\/h2>\n<p>Gamma plus CLOB is the right stack if you trade inside Polymarket. If you compare Polymarket against sportsbooks, you want the prices in decimal, keyed on shared market IDs, with history you can backtest for free. That is what OddsPapi gives you, and the token IDs let you audit every Polymarket price against CLOB.<\/p>\n<p><strong><a href=\"https:\/\/oddspapi.io\/en\/sign-up\">Get your free API key<\/a><\/strong> and pull <code>polymarket<\/code> next to Pinnacle, bet365, DraftKings, FanDuel and 350+ more books in one call.<\/p>\n<h2>FAQ<\/h2>\n<h3>What is the difference between Gamma and CLOB?<\/h3>\n<p>Gamma is Polymarket's catalogue API: events, markets, volume, midpoint prices and the <code>clobTokenIds<\/code> for each outcome. CLOB is the order book API: depth, best bid and ask, midpoint, price history and order placement. You use Gamma to find a market's token IDs, then CLOB to read the book for each token.<\/p>\n<h3>Is the Polymarket API free?<\/h3>\n<p>Yes, for reads. Gamma and the CLOB read endpoints need no key. Placing orders needs a funded Polygon wallet and EIP-712 signed payloads.<\/p>\n<h3>Why does CLOB <code>\/price<\/code> with <code>side=BUY<\/code> return a lower price than I can buy at?<\/h3>\n<p>The <code>side<\/code> parameter names the resting orders. <code>side=BUY<\/code> returns the best bid and <code>side=SELL<\/code> returns the best ask. On the Chiefs token on 15 October 2026, <code>BUY<\/code> returned 0.78 and <code>SELL<\/code> returned 0.79. To buy now, you pay the <code>SELL<\/code> price.<\/p>\n<h3>Can I place Polymarket trades through OddsPapi?<\/h3>\n<p>No. OddsPapi is a read-only data API. For execution you sign orders against Polymarket's CLOB yourself. OddsPapi gives you the <code>bookmakerOutcomeId<\/code> token, which is the ID CLOB expects.<\/p>\n<h3>Where do I get historical Polymarket odds?<\/h3>\n<p>Polymarket's CLOB <code>\/prices-history<\/code> returns midpoint points for one token. OddsPapi's <code>\/v4\/historical-odds<\/code> returns every Polymarket price change with its stake limit, in decimal odds, on the free tier. For Polymarket, pass one bookmaker and one <code>outcomeId<\/code> per call; a Packers outcome from 11 October 2026 returned 18,191 snapshots.<\/p>\n<h3>What format are Polymarket prices in?<\/h3>\n<p>Share prices from 0 to 1, read as implied probability. A Chiefs ask of 0.79 means 79%, or decimal odds of 1 \/ 0.79 = 1.266. Gamma and CLOB send prices as strings, so cast them before you do math. OddsPapi sends the decimal price and keeps the share price as <code>cents<\/code> on each ladder level.<\/p>\n<h3>Why are Gamma outcomes in a different order from my sportsbook feed?<\/h3>\n<p>Gamma lists the away participant first on NFL markets (\"Chargers vs. Chiefs\" for a Chiefs home fixture); it did so on all 14 Week 7 fixtures. OddsPapi puts participant 1 (the home side) in outcome 141. Match outcomes on the token ID, never on array position.<\/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 difference between Polymarket Gamma and CLOB APIs?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Gamma is Polymarket's catalogue API: events, markets, volume, midpoint prices and the clobTokenIds for each outcome. CLOB is the order book API: depth, best bid and ask, midpoint, price history and order placement. Use Gamma to find a market's token IDs, then CLOB to read the book for each token.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"Is the Polymarket API free?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Yes, for reads. Gamma and the CLOB read endpoints need no key. Placing orders needs a funded Polygon wallet and EIP-712 signed payloads.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"Why does Polymarket CLOB \/price with side=BUY return a lower price than I can buy at?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"The side parameter names the resting orders. side=BUY returns the best bid and side=SELL returns the best ask. On the Chiefs token on 15 October 2026, BUY returned 0.78 and SELL returned 0.79. To buy now, you pay the SELL price.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"Can I place Polymarket trades through OddsPapi?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"No. OddsPapi is a read-only data API. For execution you sign orders against Polymarket's CLOB yourself. OddsPapi gives you the bookmakerOutcomeId token, which is the ID CLOB expects.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"Where do I get historical Polymarket odds?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Polymarket's CLOB \/prices-history returns midpoint points for one token. OddsPapi's \/v4\/historical-odds returns every Polymarket price change with its stake limit, in decimal odds, on the free tier. For Polymarket, pass one bookmaker and one outcomeId per call; a Packers outcome from 11 October 2026 returned 18,191 snapshots.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"What format are Polymarket prices in?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Share prices from 0 to 1, read as implied probability. A Chiefs ask of 0.79 means 79%, or decimal odds of 1 \/ 0.79 = 1.266. Gamma and CLOB send prices as strings, so cast them before you do math. OddsPapi sends the decimal price and keeps the share price as cents on each ladder level.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"Why are Polymarket Gamma outcomes in a different order from my sportsbook feed?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Gamma lists the away participant first on NFL markets, for example Chargers vs. Chiefs for a Chiefs home fixture; it did so on all 14 Week 7 fixtures. OddsPapi puts participant 1, the home side, in outcome 141. Match outcomes on the token ID, never on array position.\"\n      }\n    }\n  ]\n}\n<\/script><\/p>\n<p><!--\nFocus Keyphrase: polymarket api\nSEO Title: Polymarket API: Trace 28 NFL Tokens From Gamma to CLOB\nMeta Description: (excerpt field)\nSlug: polymarket-api-gamma-clob-json-format\nRefreshed: 2026-10-15\n--><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Polymarket API reads need no key. On 14 NFL fixtures the OddsPapi ladder matched CLOB to the share on 28 of 28 outcomes, and Gamma listed the away side first.<\/p>\n","protected":false},"author":2,"featured_media":2835,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7],"tags":[9,14,35,34,11],"class_list":["post-2833","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-how-to-guides","tag-odds-api","tag-polymarket","tag-polymarket-api","tag-prediction-markets","tag-python"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.4 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Polymarket API: Trace 28 NFL Tokens From Gamma to CLOB | 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\/polymarket-api-gamma-clob-json-format\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Polymarket API: Trace 28 NFL Tokens From Gamma to CLOB | OddsPapi Blog\" \/>\n<meta property=\"og:description\" content=\"Polymarket API reads need no key. On 14 NFL fixtures the OddsPapi ladder matched CLOB to the share on 28 of 28 outcomes, and Gamma listed the away side first.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/oddspapi.io\/blog\/polymarket-api-gamma-clob-json-format\/\" \/>\n<meta property=\"og:site_name\" content=\"OddsPapi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-04-16T10:00:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-10-15T13:17:37+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/04\/polymarket-api-gamma-clob-json-format-scaled.webp\" \/>\n\t<meta property=\"og:image:width\" content=\"2560\" \/>\n\t<meta property=\"og:image:height\" content=\"1429\" \/>\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\/polymarket-api-gamma-clob-json-format\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/polymarket-api-gamma-clob-json-format\/\"},\"author\":{\"name\":\"Odds API Writer\",\"@id\":\"https:\/\/oddspapi.io\/blog\/#\/schema\/person\/b6f21e649c4f556f0a95c23a0f1efa13\"},\"headline\":\"Polymarket API: Trace 28 NFL Tokens From Gamma to CLOB\",\"datePublished\":\"2026-04-16T10:00:00+00:00\",\"dateModified\":\"2026-10-15T13:17:37+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/polymarket-api-gamma-clob-json-format\/\"},\"wordCount\":1758,\"commentCount\":1,\"publisher\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/polymarket-api-gamma-clob-json-format\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/04\/polymarket-api-gamma-clob-json-format-scaled.webp\",\"keywords\":[\"Odds API\",\"Polymarket\",\"Polymarket API\",\"Prediction Markets\",\"Python\"],\"articleSection\":[\"How To Guides\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/oddspapi.io\/blog\/polymarket-api-gamma-clob-json-format\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/oddspapi.io\/blog\/polymarket-api-gamma-clob-json-format\/\",\"url\":\"https:\/\/oddspapi.io\/blog\/polymarket-api-gamma-clob-json-format\/\",\"name\":\"Polymarket API: Trace 28 NFL Tokens From Gamma to CLOB | OddsPapi Blog\",\"isPartOf\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/polymarket-api-gamma-clob-json-format\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/polymarket-api-gamma-clob-json-format\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/04\/polymarket-api-gamma-clob-json-format-scaled.webp\",\"datePublished\":\"2026-04-16T10:00:00+00:00\",\"dateModified\":\"2026-10-15T13:17:37+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/polymarket-api-gamma-clob-json-format\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/oddspapi.io\/blog\/polymarket-api-gamma-clob-json-format\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/oddspapi.io\/blog\/polymarket-api-gamma-clob-json-format\/#primaryimage\",\"url\":\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/04\/polymarket-api-gamma-clob-json-format-scaled.webp\",\"contentUrl\":\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/04\/polymarket-api-gamma-clob-json-format-scaled.webp\",\"width\":2560,\"height\":1429,\"caption\":\"Polymarket API Deep Dive - OddsPapi API Blog\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/oddspapi.io\/blog\/polymarket-api-gamma-clob-json-format\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/oddspapi.io\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Polymarket API: Trace 28 NFL Tokens From Gamma to CLOB\"}]},{\"@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":"Polymarket API: Trace 28 NFL Tokens From Gamma to CLOB | 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\/polymarket-api-gamma-clob-json-format\/","og_locale":"en_US","og_type":"article","og_title":"Polymarket API: Trace 28 NFL Tokens From Gamma to CLOB | OddsPapi Blog","og_description":"Polymarket API reads need no key. On 14 NFL fixtures the OddsPapi ladder matched CLOB to the share on 28 of 28 outcomes, and Gamma listed the away side first.","og_url":"https:\/\/oddspapi.io\/blog\/polymarket-api-gamma-clob-json-format\/","og_site_name":"OddsPapi Blog","article_published_time":"2026-04-16T10:00:00+00:00","article_modified_time":"2026-10-15T13:17:37+00:00","og_image":[{"width":2560,"height":1429,"url":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/04\/polymarket-api-gamma-clob-json-format-scaled.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\/polymarket-api-gamma-clob-json-format\/#article","isPartOf":{"@id":"https:\/\/oddspapi.io\/blog\/polymarket-api-gamma-clob-json-format\/"},"author":{"name":"Odds API Writer","@id":"https:\/\/oddspapi.io\/blog\/#\/schema\/person\/b6f21e649c4f556f0a95c23a0f1efa13"},"headline":"Polymarket API: Trace 28 NFL Tokens From Gamma to CLOB","datePublished":"2026-04-16T10:00:00+00:00","dateModified":"2026-10-15T13:17:37+00:00","mainEntityOfPage":{"@id":"https:\/\/oddspapi.io\/blog\/polymarket-api-gamma-clob-json-format\/"},"wordCount":1758,"commentCount":1,"publisher":{"@id":"https:\/\/oddspapi.io\/blog\/#organization"},"image":{"@id":"https:\/\/oddspapi.io\/blog\/polymarket-api-gamma-clob-json-format\/#primaryimage"},"thumbnailUrl":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/04\/polymarket-api-gamma-clob-json-format-scaled.webp","keywords":["Odds API","Polymarket","Polymarket API","Prediction Markets","Python"],"articleSection":["How To Guides"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/oddspapi.io\/blog\/polymarket-api-gamma-clob-json-format\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/oddspapi.io\/blog\/polymarket-api-gamma-clob-json-format\/","url":"https:\/\/oddspapi.io\/blog\/polymarket-api-gamma-clob-json-format\/","name":"Polymarket API: Trace 28 NFL Tokens From Gamma to CLOB | OddsPapi Blog","isPartOf":{"@id":"https:\/\/oddspapi.io\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/oddspapi.io\/blog\/polymarket-api-gamma-clob-json-format\/#primaryimage"},"image":{"@id":"https:\/\/oddspapi.io\/blog\/polymarket-api-gamma-clob-json-format\/#primaryimage"},"thumbnailUrl":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/04\/polymarket-api-gamma-clob-json-format-scaled.webp","datePublished":"2026-04-16T10:00:00+00:00","dateModified":"2026-10-15T13:17:37+00:00","breadcrumb":{"@id":"https:\/\/oddspapi.io\/blog\/polymarket-api-gamma-clob-json-format\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/oddspapi.io\/blog\/polymarket-api-gamma-clob-json-format\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/oddspapi.io\/blog\/polymarket-api-gamma-clob-json-format\/#primaryimage","url":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/04\/polymarket-api-gamma-clob-json-format-scaled.webp","contentUrl":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/04\/polymarket-api-gamma-clob-json-format-scaled.webp","width":2560,"height":1429,"caption":"Polymarket API Deep Dive - OddsPapi API Blog"},{"@type":"BreadcrumbList","@id":"https:\/\/oddspapi.io\/blog\/polymarket-api-gamma-clob-json-format\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/oddspapi.io\/blog\/"},{"@type":"ListItem","position":2,"name":"Polymarket API: Trace 28 NFL Tokens From Gamma to CLOB"}]},{"@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\/2833","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=2833"}],"version-history":[{"count":3,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/posts\/2833\/revisions"}],"predecessor-version":[{"id":5086,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/posts\/2833\/revisions\/5086"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/media\/2835"}],"wp:attachment":[{"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/media?parent=2833"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/categories?post=2833"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/tags?post=2833"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}