{"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-04-11T16:15:07","modified_gmt":"2026-04-11T16:15:07","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 Deep Dive: Gamma vs CLOB JSON Format Explained"},"content":{"rendered":"<h2>Polymarket Has Two APIs. Most Devs Hit the Wrong One.<\/h2>\n<p>If you&#8217;ve ever typed <code>polymarket api<\/code> into a search bar, you&#8217;ve probably been bounced between three GitHub repos, two subdomains, and a <code>docs.polymarket.com<\/code> page that assumes you already know what a <em>condition ID<\/em> is. It&#8217;s not you \u2014 Polymarket&#8217;s public surface is genuinely split into two different services that do different things, and they don&#8217;t share a schema.<\/p>\n<p>This post is the map. By the end you&#8217;ll know:<\/p>\n<ul>\n<li>What <strong>Gamma<\/strong> is, what <strong>CLOB<\/strong> is, and which one you actually want.<\/li>\n<li>The exact JSON shape each one returns (captured live, not from memory).<\/li>\n<li>Why Polymarket returns <em>share prices<\/em> (0.00\u20131.00) while every sportsbook on earth returns <em>decimal odds<\/em>, and how to convert between them.<\/li>\n<li>How to skip all of it and pull Polymarket alongside Pinnacle and Bet365 in a single HTTP call.<\/li>\n<\/ul>\n<p>No enterprise account. No wallet signing. Just <code>requests<\/code>.<\/p>\n<h2>The Landscape: Gamma vs CLOB<\/h2>\n<p>Polymarket runs on Polygon as an on-chain CLOB (Central Limit Order Book), but on-chain data is painful to query directly. So Polymarket exposes two off-chain APIs that wrap different slices of the same 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>Read-only discovery: events, markets, metadata, volume, last trade. The &#8220;catalogue.&#8221;<\/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, live price, historical prices, trade placement.<\/td>\n<td>None for reads; EIP-712 + L2 headers for writes.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>Rule of thumb: <strong>if you want to know what exists, hit Gamma. If you want the live book or historical price curve for a specific outcome, hit CLOB.<\/strong> Most devs start at CLOB because that&#8217;s where the &#8220;trading&#8221; verbs live, then get stuck because CLOB wants a 77-digit <code>token_id<\/code> they don&#8217;t have. You get token IDs from Gamma.<\/p>\n<h3>The four ID types (and why you need all of them)<\/h3>\n<p>Polymarket&#8217;s schema uses four different identifiers and you will confuse them at some point:<\/p>\n<figure class=\"wp-block-table\">\n<table>\n<thead>\n<tr>\n<th>ID<\/th>\n<th>Example<\/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 ID<\/strong><\/td>\n<td><code>16167<\/code><\/td>\n<td>Gamma <code>\/events<\/code><\/td>\n<td>A group of related markets (e.g. &#8220;US Election 2028&#8221;)<\/td>\n<\/tr>\n<tr>\n<td><strong>Market slug<\/strong><\/td>\n<td><code>russia-ukraine-ceasefire-before-gta-vi-554<\/code><\/td>\n<td>Gamma <code>\/markets<\/code><\/td>\n<td>Human-readable market handle (used in URLs)<\/td>\n<\/tr>\n<tr>\n<td><strong>Condition ID<\/strong><\/td>\n<td><code>0x9c1a953f\u20265cb5763<\/code><\/td>\n<td>Gamma <code>markets[].conditionId<\/code><\/td>\n<td>On-chain market hash (used to group outcome tokens)<\/td>\n<\/tr>\n<tr>\n<td><strong>Token ID<\/strong> (a.k.a. <code>asset_id<\/code>)<\/td>\n<td><code>85014971590839487\u2026<\/code> (77 digits)<\/td>\n<td>Gamma <code>markets[].clobTokenIds<\/code><\/td>\n<td>ERC-1155 position for one specific outcome (Yes or No). <strong>This is what CLOB endpoints want.<\/strong><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>A typical binary market (&#8220;Will X happen by Y?&#8221;) has one condition ID and two token IDs \u2014 one for Yes, one for No. Multi-outcome markets (&#8220;Who wins the 2028 election?&#8221;) are usually modelled as a bundle of linked binary markets, each with its own condition ID and token pair.<\/p>\n<h2>Gamma API: The Catalogue<\/h2>\n<p>Gamma is unauthenticated, REST, and returns plain JSON. The two endpoints you&#8217;ll use 90% of the time are <code>\/events<\/code> and <code>\/markets<\/code>.<\/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\": 5,\n    \"active\": \"true\",\n    \"closed\": \"false\",\n})\nmarkets = r.json()\n\nfor m in markets:\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(f\"{m['question']}\")\n    for o, p, t in zip(outcomes, prices, tokens):\n        print(f\"  {o}: {p}  (token {t[:12]}\u2026)\")\n<\/code><\/pre>\n<p><strong>The stringified-array quirk is real.<\/strong> Gamma ships <code>outcomes<\/code>, <code>outcomePrices<\/code>, and <code>clobTokenIds<\/code> as JSON <em>inside<\/em> strings, not as native arrays. You <em>must<\/em> <code>json.loads<\/code> them or you&#8217;ll be indexing into a character string and wondering why &#8220;Yes&#8221; is the letter <code>Y<\/code>.<\/p>\n<p>A real market object (captured April 11, 2026, trimmed):<\/p>\n<pre class=\"wp-block-code\"><code>{\n  \"id\": \"540816\",\n  \"question\": \"Russia-Ukraine Ceasefire before GTA VI?\",\n  \"conditionId\": \"0x9c1a953fe92c8357f1b646ba25d983aa83e90c525992db14fb726fa895cb5763\",\n  \"slug\": \"russia-ukraine-ceasefire-before-gta-vi-554\",\n  \"outcomes\":      \"[\\\"Yes\\\", \\\"No\\\"]\",\n  \"outcomePrices\": \"[\\\"0.535\\\", \\\"0.465\\\"]\",\n  \"clobTokenIds\": \"[\\\"8501497159083948713316135768103773293754490207922884688769443031624417212426\\\", \\\"2527312495175492857904889758552137141356236738032676480522356889996545113869\\\"]\",\n  \"volume\": \"1480024.8395290007\",\n  \"liquidity\": \"74814.5449\",\n  \"lastTradePrice\": 0.54,\n  \"bestBid\": 0.53,\n  \"bestAsk\": 0.54,\n  \"active\": true,\n  \"closed\": false\n}\n<\/code><\/pre>\n<p>Every price in that payload is a <strong>share price<\/strong> in the range [0, 1]. Think of it as &#8220;what the market says the probability is.&#8221; <code>0.535<\/code> means the market is pricing a Yes outcome at 53.5%. We&#8217;ll convert it to decimal odds in a minute.<\/p>\n<h3>Listing events and drilling down<\/h3>\n<p>Events wrap one or more markets. Use them when you want the full context for a topic:<\/p>\n<pre class=\"wp-block-code\"><code>r = requests.get(f\"{GAMMA}\/events\", params={\n    \"limit\": 3,\n    \"active\": \"true\",\n    \"closed\": \"false\",\n})\nfor ev in r.json():\n    print(f\"{ev['title']}  (vol ${float(ev['volume']):,.0f})\")\n    for m in ev.get(\"markets\", []):\n        print(f\"  - {m['question']}  [condition {m['conditionId'][:10]}\u2026]\")\n<\/code><\/pre>\n<p><strong>Gamma quirks worth knowing:<\/strong><\/p>\n<ul>\n<li><code>active=true&amp;closed=false<\/code> is the correct filter for &#8220;tradeable right now.&#8221; <code>active<\/code> alone will still include resolved markets.<\/li>\n<li>Volume is a string. Cast to <code>float<\/code> before sorting.<\/li>\n<li>Gamma doesn&#8217;t have a stable pagination cursor; use <code>limit<\/code> + <code>offset<\/code> and don&#8217;t assume stable ordering between calls.<\/li>\n<\/ul>\n<h2>CLOB API: The Order Book<\/h2>\n<p>Once you have a <code>token_id<\/code> from Gamma, CLOB gives you the depth and price history for that specific outcome. All read endpoints are unauthenticated.<\/p>\n<h3>Fetching the order book<\/h3>\n<pre class=\"wp-block-code\"><code>CLOB = \"https:\/\/clob.polymarket.com\"\n\n# Yes token from the market above\nYES_TOKEN = \"8501497159083948713316135768103773293754490207922884688769443031624417212426\"\n\nbook = requests.get(f\"{CLOB}\/book\", params={\"token_id\": YES_TOKEN}).json()\nprint(f\"tick_size: {book['tick_size']}  last trade: {book['last_trade_price']}\")\nprint(\"top 3 bids:\", book[\"bids\"][:3])\nprint(\"top 3 asks:\", book[\"asks\"][:3])\n<\/code><\/pre>\n<p>Real response (captured April 11, 2026, trimmed):<\/p>\n<pre class=\"wp-block-code\"><code>{\n  \"market\": \"0x9c1a953fe92c8357f1b646ba25d983aa83e90c525992db14fb726fa895cb5763\",\n  \"asset_id\": \"8501497159083948713316135768103773293754490207922884688769443031624417212426\",\n  \"timestamp\": \"1775923619253\",\n  \"tick_size\": \"0.01\",\n  \"neg_risk\": false,\n  \"last_trade_price\": \"0.540\",\n  \"bids\": [\n    {\"price\": \"0.01\", \"size\": \"1041530.39\"},\n    {\"price\": \"0.02\", \"size\": \"110\"},\n    {\"price\": \"0.03\", \"size\": \"23200\"}\n  ],\n  \"asks\": [\n    {\"price\": \"0.99\", \"size\": \"530924.17\"},\n    {\"price\": \"0.98\", \"size\": \"792.33\"},\n    {\"price\": \"0.97\", \"size\": \"7250\"}\n  ]\n}\n<\/code><\/pre>\n<p><strong>Two things to notice.<\/strong> First, every number is a <em>string<\/em>. CLOB does this so clients don&#8217;t lose precision on big integers. Cast to <code>Decimal<\/code> or <code>float<\/code> before doing math. Second, the bids and asks you see at the edges (0.01 and 0.99) are deep-book liquidity parked far from the mid \u2014 the <em>real<\/em> spread is found by iterating inward until cumulative size crosses whatever fill size you care about. CLOB does not give you a &#8220;touch&#8221; endpoint; you compute the touch yourself from the book.<\/p>\n<h3>Price, midpoint, and history<\/h3>\n<pre class=\"wp-block-code\"><code># Best buy \/ sell\nbuy  = requests.get(f\"{CLOB}\/price\", params={\"token_id\": YES_TOKEN, \"side\": \"BUY\"}).json()\nsell = requests.get(f\"{CLOB}\/price\", params={\"token_id\": YES_TOKEN, \"side\": \"SELL\"}).json()\nmid  = requests.get(f\"{CLOB}\/midpoint\", params={\"token_id\": YES_TOKEN}).json()\nprint(f\"buy={buy['price']}  sell={sell['price']}  mid={mid['mid']}\")\n\n# Historical price curve\nhist = requests.get(f\"{CLOB}\/prices-history\", params={\n    \"market\": YES_TOKEN,      # note: this param is named \"market\" but it takes a token_id\n    \"interval\": \"1d\",\n    \"fidelity\": \"60\",          # 60-minute buckets\n}).json()\nprint(f\"{len(hist['history'])} price points\")\nprint(\"first point:\", hist[\"history\"][0])\n<\/code><\/pre>\n<p>Real response from <code>\/prices-history<\/code>:<\/p>\n<pre class=\"wp-block-code\"><code>{\n  \"history\": [\n    {\"t\": 1775840401, \"p\": 0.535},\n    {\"t\": 1775847653, \"p\": 0.535},\n    {\"t\": 1775869248, \"p\": 0.535}\n  ]\n}\n<\/code><\/pre>\n<p>Each point is a Unix timestamp + a share price. <code>interval<\/code> accepts <code>1h<\/code>, <code>6h<\/code>, <code>1d<\/code>, <code>1w<\/code>, <code>1m<\/code>, <code>max<\/code>. <code>fidelity<\/code> is the bucket size in minutes and is advisory \u2014 if you ask for <code>fidelity=1<\/code> on <code>interval=max<\/code>, CLOB will happily downsample for you.<\/p>\n<p><strong>Out of scope for this post:<\/strong> placing orders. That requires an EIP-712 signed payload + an L2 auth header derived from a funded Polygon wallet, plus proxy-wallet approvals. The official <a href=\"https:\/\/docs.polymarket.com\/developers\/CLOB\/orders\/create-order\">Polymarket docs<\/a> cover that flow; skip it unless you actually plan to trade.<\/p>\n<h2>JSON Format Head-to-Head<\/h2>\n<p>Here is the same concept \u2014 &#8220;what&#8217;s the price of this outcome right now?&#8221; \u2014 answered by Gamma, CLOB, and OddsPapi. The takeaway is that the first two make you do work the third one has already done.<\/p>\n<figure class=\"wp-block-table\">\n<table>\n<thead>\n<tr>\n<th>Source<\/th>\n<th>Endpoint<\/th>\n<th>Path to price<\/th>\n<th>Units<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Gamma<\/td>\n<td><code>\/markets?limit=1&amp;slug=\u2026<\/code><\/td>\n<td><code>json.loads(m[\"outcomePrices\"])[0]<\/code><\/td>\n<td>Share (0\u20131)<\/td>\n<\/tr>\n<tr>\n<td>CLOB<\/td>\n<td><code>\/price?token_id=\u2026&amp;side=BUY<\/code><\/td>\n<td><code>json[\"price\"]<\/code> (string)<\/td>\n<td>Share (0\u20131)<\/td>\n<\/tr>\n<tr>\n<td>OddsPapi<\/td>\n<td><code>\/v4\/odds?fixtureId=\u2026<\/code><\/td>\n<td><code>bookmakerOdds[\"polymarket\"][\"markets\"][mid][\"outcomes\"][oid][\"players\"][\"0\"][\"price\"]<\/code><\/td>\n<td>Decimal (\u2265 1)<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>Three endpoints, three shapes, three unit conventions. If you want to compare Polymarket&#8217;s implied probability against Pinnacle&#8217;s sharp line, options 1 and 2 force you to do the conversion yourself for every call. Option 3 does it for you before the JSON ever leaves the server.<\/p>\n<h2>The Normalization Problem<\/h2>\n<p>Polymarket prices are share prices. Sportsbooks quote decimal odds. If you want to say &#8220;Polymarket thinks Trump is 62% to win, DraftKings thinks he&#8217;s 65%,&#8221; you have to unify the units first.<\/p>\n<p>The math is one line in each direction:<\/p>\n<pre class=\"wp-block-code\"><code>def share_to_decimal(share: float) -> float:\n    \"\"\"0.535 -> 1.8691...\"\"\"\n    return 1 \/ share\n\ndef decimal_to_share(decimal: float) -> float:\n    \"\"\"1.87 -> 0.5347...\"\"\"\n    return 1 \/ decimal\n\ndef implied_pct(price, is_decimal=True):\n    \"\"\"Return implied probability as a percentage.\"\"\"\n    return round((1 \/ price if is_decimal else price) * 100, 2)\n\n# Gamma gives share: 0.535\nprint(implied_pct(0.535, is_decimal=False))   # -> 53.5\n# Decimal odds equivalent:\nprint(share_to_decimal(0.535))                # -> 1.8691588...\n\n# Sportsbook gives decimal: 1.87\nprint(implied_pct(1.87))                      # -> 53.48\n<\/code><\/pre>\n<p>This is trivial until you need to do it for every outcome of every market, every 30 seconds, while also stripping overround, handling stale quotes, and matching Polymarket market slugs to sportsbook fixtures that spell team names differently. At that point you&#8217;re building an aggregation service, which is the part you probably wanted to skip.<\/p>\n<h2>Or: Skip Gamma and CLOB Entirely<\/h2>\n<p>OddsPapi aggregates Polymarket alongside 350+ sportsbooks and normalizes every price to decimal odds before you see it. The same endpoint that serves Pinnacle, Bet365, and DraftKings serves <code>polymarket<\/code>:<\/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\": \"id1100168067058948\",\n    \"bookmakers\": \"polymarket,pinnacle,bet365\",\n})\nbo = r.json()[\"bookmakerOdds\"]\n\n# Moneyline market is 111 in basketball. Outcome 111 = home, 112 = away.\nfor slug in (\"polymarket\", \"pinnacle\", \"bet365\"):\n    if slug not in bo:\n        continue\n    market = bo[slug][\"markets\"].get(\"111\", {})\n    for oid in (\"111\", \"112\"):\n        price = market.get(\"outcomes\", {}).get(oid, {}).get(\"players\", {}).get(\"0\", {}).get(\"price\")\n        print(f\"{slug:12s} outcome {oid}: {price}\")\n<\/code><\/pre>\n<p>Eight lines of business logic, one HTTP call, already in decimal odds, already keyed by the same market ID as every other book in the response. No token IDs, no stringified arrays, no casting prices from string to <code>Decimal<\/code>, no second endpoint for history (<code>\/v4\/historical-odds<\/code> is the same shape).<\/p>\n<h3>Polymarket-specific data lives in <code>exchangeMeta<\/code><\/h3>\n<p>Because Polymarket is an exchange, OddsPapi keeps the lay price and the opposite-side token on the outcome object under <code>exchangeMeta<\/code>:<\/p>\n<pre class=\"wp-block-code\"><code>{\n  \"price\": 1.342,\n  \"active\": false,\n  \"bookmakerOutcomeId\": \"221285127206339595430079217709898417...\",\n  \"changedAt\": \"2026-04-11T11:24:10.509988+00:00\",\n  \"exchangeMeta\": {\n    \"lay\": 3.922,\n    \"bookmakerLayOutcomeId\": \"788357230734469575963529682307211026...\"\n  }\n}\n<\/code><\/pre>\n<p>Sharp bettors can read this as &#8220;back Yes at 1.342, lay Yes at 3.922&#8221; \u2014 which is exactly how you&#8217;d read a Betfair quote, except the counterparty is a pool of Polymarket LPs instead of another punter. The <code>bookmakerOutcomeId<\/code> and <code>bookmakerLayOutcomeId<\/code> fields are Polymarket token IDs \u2014 drop them straight into CLOB if you need deep-book context.<\/p>\n<h3>A quick honesty note on sports coverage<\/h3>\n<p>Polymarket is a prediction market, not a sportsbook. Its depth on day-to-day sports fixtures (mid-table soccer, pre-playoff NBA, MLB regular season) is thin and often inactive \u2014 the volume concentrates on headline games, majors, elections, crypto, and culture markets. If you query <code>\/v4\/odds<\/code> for an average soccer fixture and expect <code>polymarket<\/code> in <code>bookmakerOdds<\/code>, you&#8217;ll be disappointed most of the time. For <strong>cross-book sharp-vs-soft analysis<\/strong>, pin your Polymarket usage to markets where the platform actually has liquidity.<\/p>\n<h2>Free Historical Data (Sidebar)<\/h2>\n<p>CLOB&#8217;s <code>\/prices-history<\/code> gives you share-price candles for a single <code>token_id<\/code> at a time, which is fine for one market but painful when you want to backtest a model against, say, every NBA playoff moneyline next to the matching Pinnacle line. You&#8217;d have to reconcile Polymarket slugs against sportsbook fixture IDs by hand.<\/p>\n<p>OddsPapi&#8217;s <code>\/v4\/historical-odds<\/code> endpoint returns the full price history for a fixture across any set of books in one shape. Every tier \u2014 including the free tier \u2014 gets historical access. Pull the same market from Polymarket and Pinnacle side by side, with a shared timestamp axis and shared market IDs, in one loop. That&#8217;s the part most competitor APIs charge for and the part that makes calibration analysis actually tractable. We wrote this up in detail in the <a href=\"https:\/\/oddspapi.io\/blog\/prediction-market-accuracy-backtest-polymarket-sportsbooks\/\">prediction market accuracy backtest<\/a> if you want to see the pattern end-to-end.<\/p>\n<h2>Where to Go From Here<\/h2>\n<ul>\n<li><strong>Building a live tracker?<\/strong> See <a href=\"https:\/\/oddspapi.io\/blog\/prediction-market-dashboard-python-streamlit\/\">Prediction Market Dashboard: Build a Live Tracker with Python &amp; Streamlit<\/a>.<\/li>\n<li><strong>Want the CLI version?<\/strong> <a href=\"https:\/\/oddspapi.io\/blog\/prediction-market-terminal-python-cli\/\">Prediction Market Terminal: Build a CLI Trading Monitor with Python<\/a>.<\/li>\n<li><strong>Cross-market arbitrage?<\/strong> <a href=\"https:\/\/oddspapi.io\/blog\/polymarket-arbitrage-local-bookmakers\/\">Polymarket Arbitrage: Find Arbs Between Prediction Markets and Your Sportsbook<\/a>.<\/li>\n<li><strong>Market-making niche Polymarket books with sportsbook edge?<\/strong> <a href=\"https:\/\/oddspapi.io\/blog\/market-making-polymarket-sportsbook-odds\/\">Market Making on Polymarket<\/a>.<\/li>\n<li><strong>Background on Polymarket + Kalshi together?<\/strong> <a href=\"https:\/\/oddspapi.io\/blog\/polymarket-api-kalshi-api-vs-sportsbooks-the-developers-guide\/\">Polymarket API &amp; Kalshi API: Python Guide to Prediction Market Data<\/a>.<\/li>\n<li><strong>Pricing context?<\/strong> <a href=\"https:\/\/oddspapi.io\/blog\/odds-api-pricing-2026-comparison\/\">Odds API Pricing in 2026: 4 Providers Compared<\/a>.<\/li>\n<\/ul>\n<h2>Stop Stitching Two APIs<\/h2>\n<p>Gamma + CLOB is a fine stack if you&#8217;re building inside Polymarket&#8217;s ecosystem. But if your job is &#8220;compare prediction market prices against 350+ sportsbooks, in decimal, with one schema, and backtest it for free&#8221; \u2014 that&#8217;s a different product, and that&#8217;s what OddsPapi is for.<\/p>\n<p><strong><a href=\"https:\/\/oddspapi.io\/#pricing\">Get your free API key<\/a><\/strong> and query <code>polymarket<\/code> alongside Pinnacle, Bet365, DraftKings, FanDuel, and 350+ more in a single call.<\/p>\n<h2>FAQ<\/h2>\n<h3>What&#8217;s the difference between Gamma and CLOB?<\/h3>\n<p>Gamma is Polymarket&#8217;s read-only catalogue API \u2014 events, markets, volume, last trade. CLOB is the order book and trading API \u2014 depth, best bid\/ask, historical prices, and order placement. You almost always need both: Gamma to discover which markets exist and fetch their <code>clobTokenIds<\/code>, then CLOB for live depth and history on specific outcomes.<\/p>\n<h3>Is the Polymarket API free?<\/h3>\n<p>Yes. Both Gamma and CLOB read endpoints are unauthenticated and free. Placing orders requires a funded Polygon wallet and EIP-712 signed payloads, but reading data has no key, no plan, and no paywall \u2014 rate limits are undocumented but in practice generous for polling.<\/p>\n<h3>Can I place Polymarket trades via OddsPapi?<\/h3>\n<p>No. OddsPapi is strictly read-only and data-aggregation focused. For order placement you need Polymarket&#8217;s CLOB directly with an EIP-712 signer and a funded Polygon wallet. OddsPapi gives you the data layer; execution stays with you.<\/p>\n<h3>Where do I get historical Polymarket odds?<\/h3>\n<p>Two options. Directly: Polymarket CLOB&#8217;s <code>\/prices-history<\/code> endpoint accepts a <code>token_id<\/code> and returns share-price candles for that one outcome. Via OddsPapi: <code>\/v4\/historical-odds?fixtureId=\u2026&amp;bookmakers=polymarket,pinnacle,bet365<\/code> returns the full price history for every requested book in a single response, already normalized to decimal odds, on a shared timestamp axis. The latter is free-tier accessible.<\/p>\n<h3>What format are Polymarket prices in?<\/h3>\n<p>Gamma and CLOB return <strong>share prices<\/strong> in the range [0, 1], which you can read as implied probability. <code>0.535<\/code> means the market is pricing that outcome at 53.5%. OddsPapi converts these to <strong>decimal odds<\/strong> (<code>1 \/ share_price<\/code>, so <code>0.535 \u2192 1.869<\/code>) so Polymarket can be compared directly to sportsbook quotes. Both Polymarket endpoints return prices as JSON strings, not numbers \u2014 cast before doing math.<\/p>\n<h3>Are Polymarket outcomes and prices returned as arrays?<\/h3>\n<p>Not exactly. Gamma&#8217;s <code>\/markets<\/code> endpoint ships <code>outcomes<\/code>, <code>outcomePrices<\/code>, and <code>clobTokenIds<\/code> as <strong>stringified JSON arrays<\/strong> \u2014 i.e. strings that contain JSON that you then have to <code>json.loads<\/code> a second time. Miss this and you&#8217;ll end up iterating over characters instead of values.<\/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's the difference between Polymarket Gamma and CLOB APIs?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Gamma is Polymarket's read-only catalogue API for events, markets, volume and last trade. CLOB is the order book and trading API for depth, best bid\/ask, historical prices, and order placement. You almost always need both: Gamma to discover markets and fetch clobTokenIds, then CLOB for live depth and history on specific outcomes.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"Is the Polymarket API free?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Yes. Both Gamma and CLOB read endpoints are unauthenticated and free. Placing orders requires a funded Polygon wallet and EIP-712 signed payloads, but reading data has no key, no plan, and no paywall.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"Can I place Polymarket trades via OddsPapi?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"No. OddsPapi is strictly read-only and data-aggregation focused. For order placement you need Polymarket's CLOB directly with an EIP-712 signer and a funded Polygon wallet.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"Where do I get historical Polymarket odds?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Directly from Polymarket CLOB's \/prices-history endpoint (one token_id at a time, share-price candles) or from OddsPapi's \/v4\/historical-odds endpoint, which returns the full price history for every requested book in one response, normalized to decimal odds, on a shared timestamp axis. OddsPapi historical access is free-tier accessible.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"What format are Polymarket prices in?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Share prices in the range [0, 1], interpretable as implied probability. A price of 0.535 means 53.5% implied. To convert to decimal odds, use 1 \/ share_price. OddsPapi returns Polymarket already converted to decimal odds so they can be compared directly with sportsbook quotes.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"Are Polymarket outcomes and prices returned as arrays?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Gamma's \/markets endpoint returns outcomes, outcomePrices and clobTokenIds as stringified JSON arrays, not native arrays. You must call json.loads on them before iterating or you will index into characters instead of values.\"\n      }\n    }\n  ]\n}\n<\/script><\/p>\n<p><!--\nFocus Keyphrase: polymarket api\nSEO Title: Polymarket API: Gamma vs CLOB JSON Format Explained\nMeta Description: Polymarket has two APIs. Gamma vs CLOB, JSON shape, share vs decimal odds \u2014 or skip both and pull polymarket alongside 350+ books in one call.\nSlug: polymarket-api-gamma-clob-json-format\n--><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Polymarket has two APIs: Gamma and CLOB. Full JSON format breakdown, share vs decimal odds, plus how to pull polymarket alongside 350+ books in one call.<\/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 Deep Dive: Gamma vs CLOB JSON Format Explained | Odds API Development 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 Deep Dive: Gamma vs CLOB JSON Format Explained | Odds API Development Blog\" \/>\n<meta property=\"og:description\" content=\"Polymarket has two APIs: Gamma and CLOB. Full JSON format breakdown, share vs decimal odds, plus how to pull polymarket alongside 350+ books in one call.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/oddspapi.io\/blog\/polymarket-api-gamma-clob-json-format\/\" \/>\n<meta property=\"og:site_name\" content=\"Odds API Development Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-04-16T10:00:00+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=\"12 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 Deep Dive: Gamma vs CLOB JSON Format Explained\",\"datePublished\":\"2026-04-16T10:00:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/polymarket-api-gamma-clob-json-format\/\"},\"wordCount\":1840,\"commentCount\":0,\"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 Deep Dive: Gamma vs CLOB JSON Format Explained | Odds API Development 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\",\"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 Deep Dive: Gamma vs CLOB JSON Format Explained\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/oddspapi.io\/blog\/#website\",\"url\":\"https:\/\/oddspapi.io\/blog\/\",\"name\":\"OddsPapi\",\"description\":\"Sports Odds APIs 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 Deep Dive: Gamma vs CLOB JSON Format Explained | Odds API Development 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 Deep Dive: Gamma vs CLOB JSON Format Explained | Odds API Development Blog","og_description":"Polymarket has two APIs: Gamma and CLOB. Full JSON format breakdown, share vs decimal odds, plus how to pull polymarket alongside 350+ books in one call.","og_url":"https:\/\/oddspapi.io\/blog\/polymarket-api-gamma-clob-json-format\/","og_site_name":"Odds API Development Blog","article_published_time":"2026-04-16T10:00:00+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":"12 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 Deep Dive: Gamma vs CLOB JSON Format Explained","datePublished":"2026-04-16T10:00:00+00:00","mainEntityOfPage":{"@id":"https:\/\/oddspapi.io\/blog\/polymarket-api-gamma-clob-json-format\/"},"wordCount":1840,"commentCount":0,"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 Deep Dive: Gamma vs CLOB JSON Format Explained | Odds API Development 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","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 Deep Dive: Gamma vs CLOB JSON Format Explained"}]},{"@type":"WebSite","@id":"https:\/\/oddspapi.io\/blog\/#website","url":"https:\/\/oddspapi.io\/blog\/","name":"OddsPapi","description":"Sports Odds APIs 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":1,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/posts\/2833\/revisions"}],"predecessor-version":[{"id":2834,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/posts\/2833\/revisions\/2834"}],"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}]}}