{"id":3713,"date":"2026-09-04T10:00:00","date_gmt":"2026-09-04T10:00:00","guid":{"rendered":"https:\/\/oddspapi.io\/blog\/?p=3713"},"modified":"2026-09-07T14:01:47","modified_gmt":"2026-09-07T14:01:47","slug":"nfl-prediction-market-liquidity","status":"publish","type":"post","link":"https:\/\/oddspapi.io\/blog\/nfl-prediction-market-liquidity\/","title":{"rendered":"NFL Prediction Market Liquidity: Depth Ladders From 7 Venues"},"content":{"rendered":"<p>Pull the NFL Week 1 opener from 169 bookmakers and rank them by margin. The winner is <code>polymarket.us<\/code> at <strong>0.49%<\/strong>, roughly six times tighter than Pinnacle. Then read the ladder behind that price and find <strong>$0.00<\/strong>. Nothing. The best number on the board cannot be filled for a dollar.<\/p>\n<p>This is the part of prediction-market data that a price feed alone will never tell you. Kalshi, Polymarket, Betfair Exchange, Novig, SX Bet and Duel all quote NFL now, and their prices are excellent. Their <em>depth<\/em> ranges from five figures to literally zero, and the ranking by depth is close to the reverse of the ranking by price.<\/p>\n<p>This post measures it. Seven venues across all 16 Week 1 fixtures, then the same measurement run backwards over Super Bowl LX with free historical data, so you can see what a fully-loaded NFL prediction market actually looks like. Everything below runs on the free tier.<\/p>\n<h2>The finding in one table<\/h2>\n<p>Every venue below quotes a complete, active moneyline on all 16 NFL Week 1 fixtures. Measured 26 August 2026, about 14 days before the opener. &#8220;Thinnest side&#8221; means the worse of the two outcomes, because that is the side that caps an arbitrage or a hedge.<\/p>\n<figure class=\"wp-block-table\">\n<table>\n<thead>\n<tr>\n<th>Venue<\/th>\n<th>Median margin<\/th>\n<th>Thinnest side, top of book<\/th>\n<th>Thinnest side, full ladder<\/th>\n<th>Deepest fixture<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>polymarket.us<\/code><\/td>\n<td><strong>0.50%<\/strong><\/td>\n<td>$0.00<\/td>\n<td>$0.00<\/td>\n<td>$0.00<\/td>\n<\/tr>\n<tr>\n<td><code>kalshi<\/code><\/td>\n<td>1.01%<\/td>\n<td>$751.29<\/td>\n<td><strong>$3,901.06<\/strong><\/td>\n<td><strong>$15,341.74<\/strong><\/td>\n<\/tr>\n<tr>\n<td><code>polymarket<\/code><\/td>\n<td>1.99%<\/td>\n<td>$79.03<\/td>\n<td>$2,393.52<\/td>\n<td>$3,458.21<\/td>\n<\/tr>\n<tr>\n<td><code>duel<\/code><\/td>\n<td>2.10%<\/td>\n<td>not published<\/td>\n<td>not published<\/td>\n<td>not published<\/td>\n<\/tr>\n<tr>\n<td><code>betfair-ex<\/code><\/td>\n<td>2.76%<\/td>\n<td>$2.33<\/td>\n<td>$2.33<\/td>\n<td>$199.45<\/td>\n<\/tr>\n<tr>\n<td><code>novig.us<\/code><\/td>\n<td>2.76%<\/td>\n<td>$231.06<\/td>\n<td>$624.44<\/td>\n<td>$1,341.00<\/td>\n<\/tr>\n<tr>\n<td><code>sx.bet<\/code><\/td>\n<td>no active quote<\/td>\n<td>$0.00<\/td>\n<td>$0.00<\/td>\n<td>$0.00<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>Read the first column and the third column together. <code>polymarket.us<\/code> is first on price and last on depth. <code>kalshi<\/code> is third on price and first on depth by a factor of six. <code>sx.bet<\/code> is on all 16 fixtures and has <strong>zero<\/strong> two-sided active quotes: both legs ship <code>active: false<\/code> at a price of zero.<\/p>\n<p>For contrast, the sharp sportsbook on the same fixture: Pinnacle ranks <strong>8th of 150<\/strong> books at 3.04% margin, and it will take <strong>$2,717<\/strong> on New England and <strong>$1,500<\/strong> on Seattle. It is six times wider than <code>polymarket.us<\/code> and it is the only quote in the top eight that you can put real money into.<\/p>\n<h2>Where liquidity lives in the payload<\/h2>\n<p>OddsPapi exposes two separate depth fields, and they are not interchangeable.<\/p>\n<ul>\n<li><strong><code>limit<\/code><\/strong> sits on the price object. On a sportsbook it is the maximum stake the book accepts. Only Pinnacle and the exchanges populate it; the other 140-odd books on an NFL fixture return <code>null<\/code>.<\/li>\n<li><strong><code>exchangeMeta<\/code><\/strong> sits on the same price object and only appears on exchange-type venues. It carries a <code>back<\/code> and a <code>lay<\/code> ladder, each a <em>list<\/em> of price levels, best first. Each level has a <code>price<\/code>, a <code>size<\/code> (the payout available) and a <code>limit<\/code> (the stake needed to take it).<\/li>\n<\/ul>\n<p>The top of the <code>back<\/code> ladder equals the outcome&#8217;s headline <code>price<\/code>. So a venue can post a beautiful number with one rung holding three dollars, which is exactly what Polymarket does on the opener.<\/p>\n<pre class=\"wp-block-code\"><code>import requests\n\nAPI_KEY = \"YOUR_API_KEY\"\nBASE_URL = \"https:\/\/api.oddspapi.io\/v4\"\n\n# apiKey is a QUERY PARAMETER, not a header.\nr = requests.get(f\"{BASE_URL}\/sports\", params={\"apiKey\": API_KEY})\nprint(r.status_code)  # 200\n<\/code><\/pre>\n<h2>Step 1: find the NFL Week 1 board<\/h2>\n<p>American Football is <code>sportId<\/code> 14, and it carries NCAA, CFL and the European leagues alongside the NFL. The NFL itself is <code>tournamentId<\/code> 31. Pass it to <code>\/fixtures<\/code> to cut the payload by about twenty times.<\/p>\n<pre class=\"wp-block-code\"><code>import requests, time\n\nAPI_KEY = \"YOUR_API_KEY\"\nBASE_URL = \"https:\/\/api.oddspapi.io\/v4\"\n\ndef get(path, **params):\n    \"\"\"One retry on the documented 429 body, which carries retryMs.\"\"\"\n    for _ in range(4):\n        params[\"apiKey\"] = API_KEY\n        r = requests.get(f\"{BASE_URL}\/{path}\", params=params)\n        if r.status_code == 429:\n            time.sleep(r.json()[\"error\"].get(\"retryMs\", 1500) \/ 1000 + 1.2)\n            continue\n        return r.status_code, r.json()\n    return r.status_code, {}\n\n# NOTE: `to` is a midnight-UTC instant. Set it to the day AFTER your last day.\nstatus, fixtures = get(\"fixtures\", sportId=14, tournamentId=31,\n                       **{\"from\": \"2026-09-09\", \"to\": \"2026-09-16\"})\n\nfor f in sorted(fixtures, key=lambda x: x[\"startTime\"]):\n    print(f[\"fixtureId\"], f[\"startTime\"][:16],\n          f[\"participant2Name\"], \"@\", f[\"participant1Name\"])\n<\/code><\/pre>\n<p>That returns the full 16-fixture Week 1 slate. <code>participant1<\/code> is the home team. Two schedule traps are worth knowing before you build anything on this: an <strong>empty window returns HTTP 404, not an empty array<\/strong>, so a season-long loop over the off-season will kill itself on <code>raise_for_status()<\/code>; and prime-time games shift to the next calendar day in UTC, so never group an NFL slate by its UTC date. The <a href=\"https:\/\/oddspapi.io\/blog\/nfl-schedule-api\/\">NFL schedule API guide<\/a> covers the full-season pull.<\/p>\n<h2>Step 2: pull the board and pick out the exchanges<\/h2>\n<p>Call <code>\/odds<\/code> with no <code>bookmakers<\/code> filter. The opener returns <strong>169 bookmakers, 46,120 prices and 1,679 distinct market IDs<\/strong> in a single response, which is what 350+ bookmaker coverage looks like on one American football game.<\/p>\n<p>Two filters matter before you count anything:<\/p>\n<ol>\n<li><strong>Filter internal test feeds.<\/strong> <code>pinnacle+30<\/code> and <code>pinnacle+5<\/code> quote the identical number to <code>pinnacle<\/code>. Drop any slug matching <code>pinnacle+<\/code> or <code>demo<\/code> or you will count the sharp three times.<\/li>\n<li><strong>Filter on the price-level <code>active<\/code> flag.<\/strong> Only <strong>39.0%<\/strong> of the opener&#8217;s 46,120 prices are active. Books post a line early and flag it suspended, and the wider the board the worse the ratio gets. Note that <code>active<\/code> lives on the price object at <code>players[\"0\"]<\/code>, not on the outcome.<\/li>\n<\/ol>\n<pre class=\"wp-block-code\"><code>OPENER = \"id1400003171515752\"   # Seahawks v Patriots, 10 Sep 2026\nMONEYLINE = \"141\"               # NFL Winner (incl. overtime)\n\nstatus, odds = get(\"odds\", fixtureId=OPENER)\nbooks = odds[\"bookmakerOdds\"]\n\ndef moneyline(book):\n    \"\"\"Return {outcomeId: price_object} for active, two-sided quotes only.\"\"\"\n    market = book.get(\"markets\", {}).get(MONEYLINE)\n    if not market:\n        return None\n    legs = {}\n    for outcome_id, outcome in market[\"outcomes\"].items():\n        price = outcome[\"players\"].get(\"0\")          # game lines key on \"0\"\n        if price and price.get(\"active\") and price.get(\"price\"):\n            legs[outcome_id] = price\n    return legs if len(legs) == 2 else None\n\nclean = {slug: legs for slug, book in books.items()\n         if not slug.startswith(\"pinnacle+\") and slug != \"demo\"\n         and (legs := moneyline(book))}\n\nprint(len(books), \"books ->\", len(clean), \"with a complete active moneyline\")\n# 169 books -> 150 with a complete active moneyline\n<\/code><\/pre>\n<p>Then dedupe. Several distinct slugs ship byte-identical prices while the catalogue reports <code>cloneOf: null<\/code>, so a raw book count always overstates. On this fixture <strong>150 quotes collapse to 57 independent prices, a 62.0% collapse<\/strong>. Dedupe on the price tuple, per fixture, never off a static clone list.<\/p>\n<pre class=\"wp-block-code\"><code>tuples = {(legs[\"141\"][\"price\"], legs[\"142\"][\"price\"]) for legs in clean.values()}\nprint(len(clean), \"quotes ->\", len(tuples), \"independent\")\n# 150 quotes -> 57 independent\n<\/code><\/pre>\n<h2>Step 3: read the ladder, not the price<\/h2>\n<p>Now score each venue on depth. The rule that makes this useful: take the <strong>thinnest side<\/strong>, because a two-sided position is capped by whichever leg runs out of money first.<\/p>\n<pre class=\"wp-block-code\"><code>def depth(price_obj):\n    \"\"\"Top-of-book stake and full back-ladder stake for one outcome.\"\"\"\n    meta = price_obj.get(\"exchangeMeta\") or {}\n    ladder = meta.get(\"back\") or []\n    if ladder:\n        top = ladder[0].get(\"limit\") or 0.0\n        total = sum((level.get(\"limit\") or 0.0) for level in ladder)\n        return top, total, len(ladder)\n    # Sportsbook, or an exchange with no ladder: fall back to `limit`.\n    lim = price_obj.get(\"limit\")\n    return (lim, lim, 0) if lim is not None else (None, None, 0)\n\nfor slug in (\"kalshi\", \"polymarket\", \"polymarket.us\", \"novig.us\", \"betfair-ex\", \"pinnacle\"):\n    legs = clean.get(slug)\n    if not legs:\n        continue\n    margin = (sum(1 \/ leg[\"price\"] for leg in legs.values()) - 1) * 100\n    sides = [depth(leg) for leg in legs.values()]\n    thin_top = min(s[0] for s in sides) if all(s[0] is not None for s in sides) else None\n    thin_all = min(s[1] for s in sides) if all(s[1] is not None for s in sides) else None\n    print(f\"{slug:&lt;15} margin {margin:5.2f}%  top ${thin_top or 0:>10,.2f}  ladder ${thin_all or 0:>10,.2f}\")\n<\/code><\/pre>\n<p>On the opener that prints the inversion in full:<\/p>\n<figure class=\"wp-block-table\">\n<table>\n<thead>\n<tr>\n<th>Venue<\/th>\n<th>Patriots<\/th>\n<th>Seahawks<\/th>\n<th>Margin<\/th>\n<th>Back ladder, thinnest side<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>polymarket.us<\/code><\/td>\n<td>1.600<\/td>\n<td>2.632<\/td>\n<td>0.49%<\/td>\n<td>1.6 @ <strong>$0<\/strong><\/td>\n<\/tr>\n<tr>\n<td><code>novig.us<\/code><\/td>\n<td>1.575<\/td>\n<td>2.667<\/td>\n<td>0.99%<\/td>\n<td>2.667 @ $315, 2.632 @ $190, 2.5 @ $687<\/td>\n<\/tr>\n<tr>\n<td><code>kalshi<\/code><\/td>\n<td>1.587<\/td>\n<td>2.632<\/td>\n<td>1.01%<\/td>\n<td>2.632 @ $103, 2.564 @ $9,940, 2.5 @ $5,298<\/td>\n<\/tr>\n<tr>\n<td><code>polymarket<\/code><\/td>\n<td>1.587<\/td>\n<td>2.632<\/td>\n<td>1.01%<\/td>\n<td>1.587 @ <strong>$3<\/strong>, 1.538 @ $1,560, 1.515 @ $1,790<\/td>\n<\/tr>\n<tr>\n<td><code>betfair-ex<\/code><\/td>\n<td>1.520<\/td>\n<td>2.700<\/td>\n<td>2.83%<\/td>\n<td>2.70 @ <strong>$2.33<\/strong><\/td>\n<\/tr>\n<tr>\n<td><code>pinnacle<\/code><\/td>\n<td>1.552<\/td>\n<td>2.590<\/td>\n<td>3.04%<\/td>\n<td>$1,500 flat (no ladder)<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>Two things fall out of this table that a price-only feed hides.<\/p>\n<p><strong>The best price on the underdog is Betfair Exchange at 2.70, and it holds $2.33.<\/strong> If you run a <a href=\"https:\/\/oddspapi.io\/blog\/line-shopping-python-best-odds\/\">line-shopping scan<\/a> that sorts on price alone, that is the number it hands you, and it is worth about one coffee.<\/p>\n<p><strong>Kalshi&#8217;s headline rung is its worst rung.<\/strong> The top of its Seahawks ladder is $103 at 2.632, and the level underneath holds <strong>$9,940 at 2.564<\/strong>. Sweep two rungs and you get a slightly worse average price with a hundred times the size. Depth is not a single number, it is a curve, and the ladder is where the curve lives.<\/p>\n<h3>The screen worth copying<\/h3>\n<p>A single condition removes every unfillable quote in the table above without removing anything useful:<\/p>\n<pre class=\"wp-block-code\"><code>def usable(legs, max_margin=0.04, min_stake=500.0):\n    \"\"\"A prediction-market quote is only a benchmark if you can trade it.\"\"\"\n    margin = sum(1 \/ leg[\"price\"] for leg in legs.values()) - 1\n    if margin &gt; max_margin:\n        return False\n    thin = min((depth(leg)[1] or 0.0) for leg in legs.values())\n    return thin &gt;= min_stake\n<\/code><\/pre>\n<p>Run across all 16 Week 1 fixtures, that screen passes <code>kalshi<\/code> <strong>16 times out of 16<\/strong>, <code>polymarket<\/code> 14 times and <code>novig.us<\/code> 11 times. It rejects <code>polymarket.us<\/code>, <code>sx.bet<\/code> and <code>betfair-ex<\/code> on every fixture, and it rejects <code>duel<\/code> on every fixture too, for a different reason: Duel publishes no depth field at all, so there is nothing to screen. Tune <code>min_stake<\/code> to your own size. The point is that the check exists at all: run it before you treat any exchange quote as consensus.<\/p>\n<h2>Step 4: the Super Bowl benchmark, for free<\/h2>\n<p>Fifteen days out, an NFL regular-season game is a thin market everywhere. To see what a loaded one looks like, run the same measurement over a game that has already been played. Historical odds are free on OddsPapi, and retention is deep: Super Bowl LX, played 8 February 2026, still returns its full price history six months later.<\/p>\n<p>Two rules for exchange history:<\/p>\n<ul>\n<li><strong><code>polymarket<\/code> and <code>betfair-ex<\/code> reject a multi-book call.<\/strong> Both demand exactly one bookmaker and exactly one <code>outcomeId<\/code>, or you get HTTP 400 <code>INVALID_PARAMETER<\/code>. Put either slug in a three-book batch and the whole batch fails.<\/li>\n<li><strong><code>exchangeMeta<\/code> is <code>null<\/code> on every historical snapshot.<\/strong> The ladder is a live-only structure. History gives you <code>limit<\/code>, which is top-of-book stake capacity. That is one number instead of three, and it is enough to chart the ramp.<\/li>\n<\/ul>\n<pre class=\"wp-block-code\"><code>SUPER_BOWL = \"id1400003167426020\"   # Patriots v Seahawks, 8 Feb 2026\n\ndef exchange_history(fixture_id, slug, outcome_id):\n    status, data = get(\"historical-odds\", fixtureId=fixture_id,\n                       bookmakers=slug, outcomeId=outcome_id)\n    if status != 200:\n        return []\n    market = data[\"bookmakers\"][slug][\"markets\"][\"141\"]\n    # players[\"0\"] is a LIST here, not a dict. Historical shape != live shape.\n    return market[\"outcomes\"][str(outcome_id)][\"players\"][\"0\"]\n\nsnapshots = exchange_history(SUPER_BOWL, \"polymarket\", 142)\nprint(len(snapshots), \"snapshots\")          # 67865\nprint(snapshots[0][\"createdAt\"], snapshots[0][\"price\"], snapshots[0][\"limit\"])\n<\/code><\/pre>\n<p>Note the shape change. On <code>\/odds<\/code>, <code>players[\"0\"]<\/code> is a dict holding one current price. On <code>\/historical-odds<\/code> the top-level key is <code>bookmakers<\/code> rather than <code>bookmakerOdds<\/code>, and <code>players[\"0\"]<\/code> is a <em>list<\/em> of snapshots. Code written against one endpoint will not read the other.<\/p>\n<p>Snapshots also keep recording after kick-off, so filter on <code>createdAt &lt; startTime<\/code> for a true pre-game series. The tail is not noise, it is settlement: Polymarket&#8217;s losing side ends at a price of 500 and the winner collapses toward 1.0, which is how you recover the result without a scores feed.<\/p>\n<h2>What a loaded NFL market looks like<\/h2>\n<p>Super Bowl LX, Polymarket, both sides, pre-kickoff snapshots only. Median top-of-book stake capacity per day:<\/p>\n<figure class=\"wp-block-table\">\n<table>\n<thead>\n<tr>\n<th>Day<\/th>\n<th>Days to kick-off<\/th>\n<th>Patriots, median<\/th>\n<th>Seahawks, median<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>1 Feb<\/td>\n<td>8.0<\/td>\n<td>$86,251<\/td>\n<td>$1,482,381<\/td>\n<\/tr>\n<tr>\n<td>3 Feb<\/td>\n<td>6.0<\/td>\n<td>$30,172<\/td>\n<td>$1,689,255<\/td>\n<\/tr>\n<tr>\n<td>5 Feb<\/td>\n<td>4.0<\/td>\n<td>$100,523<\/td>\n<td>$1,816,374<\/td>\n<\/tr>\n<tr>\n<td>7 Feb<\/td>\n<td>2.0<\/td>\n<td>$808,185<\/td>\n<td>$1,931,302<\/td>\n<\/tr>\n<tr>\n<td>8 Feb<\/td>\n<td>1.0<\/td>\n<td>$673,741<\/td>\n<td>$1,504,591<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>Across the whole pre-game window Polymarket&#8217;s Seahawks side held a <strong>median $1,749,227<\/strong> at the top of the book and peaked at <strong>$2,648,958<\/strong>. The Patriots side ran a median $629,882 with a $1,413,653 peak. That is a market where a five-figure bet is a rounding error.<\/p>\n<p>Now put the two events side by side on the thinnest side, which is the only fair comparison:<\/p>\n<figure class=\"wp-block-table\">\n<table>\n<thead>\n<tr>\n<th>Venue<\/th>\n<th>Super Bowl LX, thinnest side<\/th>\n<th>Week 1 opener, thinnest side<\/th>\n<th>Ratio<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>polymarket<\/code><\/td>\n<td>$629,882 median<\/td>\n<td>$3.15 top rung<\/td>\n<td>~200,000x<\/td>\n<\/tr>\n<tr>\n<td><code>betfair-ex<\/code><\/td>\n<td>$15,983 median<\/td>\n<td>$2.33<\/td>\n<td>~6,900x<\/td>\n<\/tr>\n<tr>\n<td><code>kalshi<\/code><\/td>\n<td>no recorded history<\/td>\n<td>$751 top, $3,901 ladder (median)<\/td>\n<td>\u2014<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>Be careful with that comparison and I will be explicit about why: the Super Bowl figures are measured from 8 days out to kick-off, and the Week 1 figures are measured 14 days out. Liquidity is a function of time-to-event, so some of that gap closes on its own. The honest way to size the effect is to measure the ramp itself.<\/p>\n<h2>The ramp is about 7x, not 7,000x<\/h2>\n<p>Betfair Exchange is the better ramp subject here because its history starts earlier, 12.8 days before the Super Bowl. Median top-of-book stake capacity on the Patriots, by day:<\/p>\n<figure class=\"wp-block-table\">\n<table>\n<thead>\n<tr>\n<th>Day<\/th>\n<th>Days to kick-off<\/th>\n<th>Median<\/th>\n<th>Peak<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>27 Jan<\/td>\n<td>12.8<\/td>\n<td>$4,426<\/td>\n<td>$9,070<\/td>\n<\/tr>\n<tr>\n<td>30 Jan<\/td>\n<td>10.0<\/td>\n<td>$15,200<\/td>\n<td>$26,250<\/td>\n<\/tr>\n<tr>\n<td>2 Feb<\/td>\n<td>7.0<\/td>\n<td>$13,331<\/td>\n<td>$15,765<\/td>\n<\/tr>\n<tr>\n<td>5 Feb<\/td>\n<td>4.0<\/td>\n<td>$27,923<\/td>\n<td>$50,011<\/td>\n<\/tr>\n<tr>\n<td>8 Feb<\/td>\n<td>1.0<\/td>\n<td><strong>$31,304<\/strong><\/td>\n<td><strong>$126,435<\/strong><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>From 12.8 days out to game day the median grew <strong>7.1x<\/strong>, and the peak grew 13.9x. Apply a generous 10x ramp to Betfair&#8217;s current Week 1 number and it reaches about $23. The Super Bowl figure at the same 12.8-day horizon was $4,426, roughly <strong>1,900 times<\/strong> larger. The gap is not a timing artefact. A regular-season NFL game and a Super Bowl are different products on the same venue.<\/p>\n<p>The useful consequence for anyone building on this: <strong>you cannot calibrate a depth threshold once and reuse it.<\/strong> A <code>min_stake<\/code> of $500 is trivially permissive at a Super Bowl and rejects most of the board in Week 1. Set it per event class, and re-measure.<\/p>\n<h2>Seven venues now, two at the Super Bowl<\/h2>\n<p>One more thing changed between February and September, and it is the reason this post is worth writing now. Running the same history call for each venue against Super Bowl LX:<\/p>\n<figure class=\"wp-block-table\">\n<table>\n<thead>\n<tr>\n<th>Venue<\/th>\n<th>Super Bowl LX history<\/th>\n<th>Week 1 2026, live<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>polymarket<\/code><\/td>\n<td>121k snapshots<\/td>\n<td>16 of 16 fixtures<\/td>\n<\/tr>\n<tr>\n<td><code>betfair-ex<\/code><\/td>\n<td>40k snapshots<\/td>\n<td>16 of 16<\/td>\n<\/tr>\n<tr>\n<td><code>kalshi<\/code><\/td>\n<td>HTTP 404, none<\/td>\n<td>16 of 16<\/td>\n<\/tr>\n<tr>\n<td><code>polymarket.us<\/code><\/td>\n<td>HTTP 404, none<\/td>\n<td>16 of 16<\/td>\n<\/tr>\n<tr>\n<td><code>novig.us<\/code><\/td>\n<td>HTTP 404, none<\/td>\n<td>16 of 16<\/td>\n<\/tr>\n<tr>\n<td><code>sx.bet<\/code><\/td>\n<td>HTTP 404, none<\/td>\n<td>16 of 16<\/td>\n<\/tr>\n<tr>\n<td><code>duel<\/code><\/td>\n<td>not checked<\/td>\n<td>16 of 16<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>The peer-to-peer side of an NFL board went from two venues to seven in seven months. Five of them have no NFL history at all before this season, which means <strong>any backtest that treats &#8220;the exchange price&#8221; as one continuous series will silently change definition partway through<\/strong>. Pin the venue list to the era you are testing.<\/p>\n<h2>Gotchas worth writing down<\/h2>\n<ul>\n<li><strong>Kalshi&#8217;s historical payload is enormous.<\/strong> One NFL fixture, filtered to <code>kalshi<\/code> alone, returned <strong>259.59 MB<\/strong>. Polymarket&#8217;s Super Bowl history is 5\u20137 MB per outcome and Betfair&#8217;s is about 2 MB. Never loop an exchange across a slate; spot-check single fixtures.<\/li>\n<li><strong>Rate limits are per endpoint and return a real 429<\/strong> with a <code>retryMs<\/code> field. Use <code>time.sleep(1.0)<\/code> between <code>\/odds<\/code> calls and about 4.5 seconds between <code>\/historical-odds<\/code> calls. Do not parallelise: at any worker count, almost every request comes back 429.<\/li>\n<li><strong>A 429 body is valid JSON.<\/strong> Code that only checks for a <code>bookmakerOdds<\/code> key will read a rate-limit response as &#8220;no coverage&#8221;. Check the status code first.<\/li>\n<li><strong><code>limit<\/code> is <code>null<\/code> on nearly every sportsbook.<\/strong> On the opener only Pinnacle and the exchanges publish it. Null-check before any arithmetic.<\/li>\n<li><strong>Pinnacle&#8217;s <code>limit<\/code> is a capped max win, not a capped stake.<\/strong> The identity <code>limit = max(base, base \/ (price - 1))<\/code> recovers a per-market base figure, and that base is the book&#8217;s own confidence signal.<\/li>\n<li><strong>On exchanges the ladder identity is exact:<\/strong> per level, <code>limit = size \u00d7 cents<\/code>. If it does not hold, you are parsing a different exchange shape.<\/li>\n<li><strong>No NFL player props exist on this board yet.<\/strong> Checked 26 August across Week 1 and a preseason game one day from kick-off: zero player-keyed prices on any fixture. Prop menus fill in closer to kick-off, so probe rather than assume.<\/li>\n<\/ul>\n<h2>Old way vs OddsPapi<\/h2>\n<figure class=\"wp-block-table\">\n<table>\n<thead>\n<tr>\n<th><\/th>\n<th>Direct venue APIs<\/th>\n<th>OddsPapi<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Venues for one NFL game<\/td>\n<td>Seven separate integrations, seven auth schemes<\/td>\n<td>One call, 169 bookmakers<\/td>\n<\/tr>\n<tr>\n<td>Order-book depth<\/td>\n<td>Different shape per venue<\/td>\n<td><code>exchangeMeta.back<\/code> \/ <code>.lay<\/code>, one shape<\/td>\n<\/tr>\n<tr>\n<td>Odds format<\/td>\n<td>Share prices, American, fractional \u2014 convert yourself<\/td>\n<td>Decimal, American and fractional pre-converted<\/td>\n<\/tr>\n<tr>\n<td>Sportsbook comparison<\/td>\n<td>Not available<\/td>\n<td>Pinnacle and 160+ books in the same payload<\/td>\n<\/tr>\n<tr>\n<td>Historical depth<\/td>\n<td>Paid, or nonexistent<\/td>\n<td>Free tier, retained months after the game<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<h2>Where to go next<\/h2>\n<ul>\n<li><a href=\"https:\/\/oddspapi.io\/blog\/kalshi-polymarket-nfl-odds\/\">Kalshi &amp; Polymarket NFL odds<\/a> \u2014 the coverage and margin side of the same two venues, including how far into the season each one quotes.<\/li>\n<li><a href=\"https:\/\/oddspapi.io\/blog\/betting-limits-api-stake-sizing\/\">Betting limits API<\/a> \u2014 how much you can actually bet at the best price, across sportsbooks rather than exchanges.<\/li>\n<li><a href=\"https:\/\/oddspapi.io\/blog\/real-time-odds-feed-market-making\/\">Real-time odds feed for market makers<\/a> \u2014 exchange depth and spread capture as a pricing input.<\/li>\n<li><a href=\"https:\/\/oddspapi.io\/blog\/polymarket-api-gamma-clob-json-format\/\">Polymarket API deep dive<\/a> \u2014 Gamma vs CLOB, and the token IDs that drop straight into the order book.<\/li>\n<li><a href=\"https:\/\/oddspapi.io\/blog\/kalshi-vs-polymarket-api\/\">Kalshi API vs Polymarket API<\/a> \u2014 the developer-level head-to-head on auth and endpoints.<\/li>\n<li><a href=\"https:\/\/oddspapi.io\/blog\/betfair-api-alternative-exchange-odds\/\">Betfair exchange odds without the red tape<\/a> \u2014 exchange access without an application process.<\/li>\n<li><a href=\"https:\/\/oddspapi.io\/blog\/sx-bet-api-crypto-sports-exchange\/\">SX Bet API<\/a> \u2014 the crypto exchange that is on every Week 1 fixture and quoting none of them.<\/li>\n<li><a href=\"https:\/\/oddspapi.io\/blog\/how-many-bookmakers-backtest\/\">How many bookmakers does your backtest need?<\/a> \u2014 the same &#8220;is this sample enough&#8221; question, applied to the closing line.<\/li>\n<li><a href=\"https:\/\/oddspapi.io\/blog\/free-nfl-odds-api-guide\/\">NFL odds API guide<\/a> \u2014 lines, spreads and totals from scratch.<\/li>\n<li><a href=\"https:\/\/oddspapi.io\/blog\/line-shopping-python-best-odds\/\">Line shopping in Python<\/a> \u2014 best price across the full board, and why you screen it before you trust it.<\/li>\n<\/ul>\n<h2>Stop reading prices. Start reading ladders.<\/h2>\n<p>A prediction-market price with nothing behind it is a quote, not a market. The distinction costs nothing to check: the ladder is in the same payload as the price, on the free tier, on all 350+ bookmakers including Pinnacle, SBOBET, Kalshi, Polymarket and Betfair Exchange. Historical depth is free too, which is the only reason the Super Bowl comparison in this post was possible at all.<\/p>\n<p><strong><a href=\"https:\/\/oddspapi.io\/\">Get your free API key<\/a><\/strong> and run the depth screen on the Week 1 board yourself. It is about forty lines.<\/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\": \"Which prediction market has the deepest NFL liquidity?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Measured across all 16 NFL Week 1 2026 fixtures, Kalshi carries the deepest back ladder on the thinnest side, a median of $3,901 and up to $15,342 on the deepest fixture. Polymarket is second at $2,394 median. Polymarket.us posts the tightest price on the board at 0.50% margin with $0.00 of depth behind it.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"How do I read order book depth from an odds API?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Exchange-type bookmakers ship an exchangeMeta object on the price object. It contains back and lay ladders, each a list of price levels, best first. Each level has a price, a size (payout available) and a limit (stake required). Sportsbooks ship exchangeMeta as null and only Pinnacle publishes a limit.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"How much liquidity did the Super Bowl have on Polymarket?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"On Super Bowl LX, played 8 February 2026, Polymarket's favourite side held a median $1,749,227 of top-of-book stake capacity before kick-off, peaking at $2,648,958. The underdog side ran a median $629,882. Betfair Exchange on the same game ran a median $15,983 to $43,605.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"Can I get historical prediction market data for free?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Yes. OddsPapi's \/historical-odds endpoint is available on the free tier and retention is deep enough that Super Bowl LX still returns its full price history six months after the game. Polymarket and Betfair Exchange require exactly one bookmaker and one outcomeId per call.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"Does OddsPapi have NFL player props?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Player prop markets fill in closer to kick-off. Checked on 26 August 2026, there were zero player-keyed prices on any NFL Week 1 fixture or on a preseason game one day from kick-off. Probe the \/odds payload for player-keyed entries rather than assuming a prop menu exists.\"\n      }\n    }\n  ]\n}\n<\/script><\/p>\n<p><!--\nFocus Keyphrase: prediction market liquidity\nSEO Title: NFL Prediction Market Liquidity: Depth Ladders From 7 Venues\nMeta Description: Kalshi, Polymarket and Betfair quote NFL Week 1. We measured the depth behind every price in Python, so you size the stake off the ladder, not the headline.\nSlug: nfl-prediction-market-liquidity\n--><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Kalshi, Polymarket and Betfair quote NFL Week 1. We measured the depth behind every price in Python, so you size the stake off the ladder, not the headline.<\/p>\n","protected":false},"author":2,"featured_media":3714,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7],"tags":[8,52,9,34,11],"class_list":["post-3713","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-how-to-guides","tag-free-api","tag-nfl","tag-odds-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>NFL Prediction Market Liquidity: Depth Ladders From 7 Venues | 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\/nfl-prediction-market-liquidity\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"NFL Prediction Market Liquidity: Depth Ladders From 7 Venues | OddsPapi Blog\" \/>\n<meta property=\"og:description\" content=\"Kalshi, Polymarket and Betfair quote NFL Week 1. We measured the depth behind every price in Python, so you size the stake off the ladder, not the headline.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/oddspapi.io\/blog\/nfl-prediction-market-liquidity\/\" \/>\n<meta property=\"og:site_name\" content=\"OddsPapi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-09-04T10:00:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-09-07T14:01:47+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/08\/nfl-prediction-market-liquidity-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\/nfl-prediction-market-liquidity\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/nfl-prediction-market-liquidity\/\"},\"author\":{\"name\":\"Odds API Writer\",\"@id\":\"https:\/\/oddspapi.io\/blog\/#\/schema\/person\/b6f21e649c4f556f0a95c23a0f1efa13\"},\"headline\":\"NFL Prediction Market Liquidity: Depth Ladders From 7 Venues\",\"datePublished\":\"2026-09-04T10:00:00+00:00\",\"dateModified\":\"2026-09-07T14:01:47+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/nfl-prediction-market-liquidity\/\"},\"wordCount\":2158,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/nfl-prediction-market-liquidity\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/08\/nfl-prediction-market-liquidity-scaled.webp\",\"keywords\":[\"Free API\",\"NFL\",\"Odds API\",\"Prediction Markets\",\"Python\"],\"articleSection\":[\"How To Guides\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/oddspapi.io\/blog\/nfl-prediction-market-liquidity\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/oddspapi.io\/blog\/nfl-prediction-market-liquidity\/\",\"url\":\"https:\/\/oddspapi.io\/blog\/nfl-prediction-market-liquidity\/\",\"name\":\"NFL Prediction Market Liquidity: Depth Ladders From 7 Venues | OddsPapi Blog\",\"isPartOf\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/nfl-prediction-market-liquidity\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/nfl-prediction-market-liquidity\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/08\/nfl-prediction-market-liquidity-scaled.webp\",\"datePublished\":\"2026-09-04T10:00:00+00:00\",\"dateModified\":\"2026-09-07T14:01:47+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/nfl-prediction-market-liquidity\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/oddspapi.io\/blog\/nfl-prediction-market-liquidity\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/oddspapi.io\/blog\/nfl-prediction-market-liquidity\/#primaryimage\",\"url\":\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/08\/nfl-prediction-market-liquidity-scaled.webp\",\"contentUrl\":\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/08\/nfl-prediction-market-liquidity-scaled.webp\",\"width\":2560,\"height\":1429,\"caption\":\"Prediction Market Liquidity - OddsPapi API Blog\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/oddspapi.io\/blog\/nfl-prediction-market-liquidity\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/oddspapi.io\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"NFL Prediction Market Liquidity: Depth Ladders From 7 Venues\"}]},{\"@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":"NFL Prediction Market Liquidity: Depth Ladders From 7 Venues | 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\/nfl-prediction-market-liquidity\/","og_locale":"en_US","og_type":"article","og_title":"NFL Prediction Market Liquidity: Depth Ladders From 7 Venues | OddsPapi Blog","og_description":"Kalshi, Polymarket and Betfair quote NFL Week 1. We measured the depth behind every price in Python, so you size the stake off the ladder, not the headline.","og_url":"https:\/\/oddspapi.io\/blog\/nfl-prediction-market-liquidity\/","og_site_name":"OddsPapi Blog","article_published_time":"2026-09-04T10:00:00+00:00","article_modified_time":"2026-09-07T14:01:47+00:00","og_image":[{"width":2560,"height":1429,"url":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/08\/nfl-prediction-market-liquidity-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\/nfl-prediction-market-liquidity\/#article","isPartOf":{"@id":"https:\/\/oddspapi.io\/blog\/nfl-prediction-market-liquidity\/"},"author":{"name":"Odds API Writer","@id":"https:\/\/oddspapi.io\/blog\/#\/schema\/person\/b6f21e649c4f556f0a95c23a0f1efa13"},"headline":"NFL Prediction Market Liquidity: Depth Ladders From 7 Venues","datePublished":"2026-09-04T10:00:00+00:00","dateModified":"2026-09-07T14:01:47+00:00","mainEntityOfPage":{"@id":"https:\/\/oddspapi.io\/blog\/nfl-prediction-market-liquidity\/"},"wordCount":2158,"commentCount":0,"publisher":{"@id":"https:\/\/oddspapi.io\/blog\/#organization"},"image":{"@id":"https:\/\/oddspapi.io\/blog\/nfl-prediction-market-liquidity\/#primaryimage"},"thumbnailUrl":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/08\/nfl-prediction-market-liquidity-scaled.webp","keywords":["Free API","NFL","Odds API","Prediction Markets","Python"],"articleSection":["How To Guides"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/oddspapi.io\/blog\/nfl-prediction-market-liquidity\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/oddspapi.io\/blog\/nfl-prediction-market-liquidity\/","url":"https:\/\/oddspapi.io\/blog\/nfl-prediction-market-liquidity\/","name":"NFL Prediction Market Liquidity: Depth Ladders From 7 Venues | OddsPapi Blog","isPartOf":{"@id":"https:\/\/oddspapi.io\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/oddspapi.io\/blog\/nfl-prediction-market-liquidity\/#primaryimage"},"image":{"@id":"https:\/\/oddspapi.io\/blog\/nfl-prediction-market-liquidity\/#primaryimage"},"thumbnailUrl":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/08\/nfl-prediction-market-liquidity-scaled.webp","datePublished":"2026-09-04T10:00:00+00:00","dateModified":"2026-09-07T14:01:47+00:00","breadcrumb":{"@id":"https:\/\/oddspapi.io\/blog\/nfl-prediction-market-liquidity\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/oddspapi.io\/blog\/nfl-prediction-market-liquidity\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/oddspapi.io\/blog\/nfl-prediction-market-liquidity\/#primaryimage","url":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/08\/nfl-prediction-market-liquidity-scaled.webp","contentUrl":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/08\/nfl-prediction-market-liquidity-scaled.webp","width":2560,"height":1429,"caption":"Prediction Market Liquidity - OddsPapi API Blog"},{"@type":"BreadcrumbList","@id":"https:\/\/oddspapi.io\/blog\/nfl-prediction-market-liquidity\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/oddspapi.io\/blog\/"},{"@type":"ListItem","position":2,"name":"NFL Prediction Market Liquidity: Depth Ladders From 7 Venues"}]},{"@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\/3713","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=3713"}],"version-history":[{"count":3,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/posts\/3713\/revisions"}],"predecessor-version":[{"id":3892,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/posts\/3713\/revisions\/3892"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/media\/3714"}],"wp:attachment":[{"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/media?parent=3713"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/categories?post=3713"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/tags?post=3713"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}