{"id":3710,"date":"2026-09-03T10:00:00","date_gmt":"2026-09-03T10:00:00","guid":{"rendered":"https:\/\/oddspapi.io\/blog\/?p=3710"},"modified":"2026-08-26T14:11:40","modified_gmt":"2026-08-26T14:11:40","slug":"how-many-bookmakers-backtest","status":"publish","type":"post","link":"https:\/\/oddspapi.io\/blog\/how-many-bookmakers-backtest\/","title":{"rendered":"How Many Bookmakers Does Your Backtest Need? A 176-Book Study"},"content":{"rendered":"<p>The <code>\/historical-odds<\/code> endpoint takes three bookmakers per call. Ask for four and it returns HTTP 400 with <code>TOO_MANY_BOOKMAKERS<\/code>. So most backtests get built the obvious way: Pinnacle, one sharp-ish book, one retail book, and whatever those three closed at becomes &#8220;the closing line&#8221;.<\/p>\n<p>I wanted to know what that shortcut costs. So I pulled the full closing board for three Premier League fixtures played on 23 and 24 August 2026, then asked how far a 3-book consensus sits from a 176-book one. If you have not run a backtest against historical odds before, <a href=\"https:\/\/oddspapi.io\/blog\/backtest-betting-model-free-historical-odds\/\">start with the walkthrough<\/a> and come back to this once your pipeline works.<\/p>\n<p>The short answer: a random 3-book closing line misses the full-board fair probability by <strong>0.67 percentage points on average and 5.18pp at worst<\/strong>. Grade your bets against Pinnacle, Bet365 and DraftKings instead of the whole board and <strong>up to 9.7% of your closing-line verdicts flip<\/strong>. The curve flattens around 25 books, well past the 3 the endpoint hands you in one call.<\/p>\n<h2>How the study was built<\/h2>\n<p>Three fixtures, all finished: Manchester City v Bournemouth, Newcastle v Liverpool and Fulham v Chelsea. Finished fixtures return <code>hasOdds: false<\/code> from <code>\/fixtures<\/code> because live prices get dropped, but their price history stays queryable, which is the whole reason this measurement is possible on a free key.<\/p>\n<p>For each fixture I walked the entire <a href=\"https:\/\/oddspapi.io\/blog\/sportsbook-api-350-bookmakers\/\">bookmaker catalogue<\/a> three slugs at a time, took the Full Time Result market (ID <code>101<\/code>), and defined the closing price as <strong>the last snapshot before kick-off that still carried <code>active: true<\/code><\/strong>. Then I de-vigged each book proportionally and averaged the fair probabilities.<\/p>\n<figure class=\"wp-block-table\">\n<table>\n<thead>\n<tr>\n<th>Fixture<\/th>\n<th>Books with a closing 1X2<\/th>\n<th>Complete and active<\/th>\n<th>Independent price tuples<\/th>\n<th>Dedupe collapse<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Man City v Bournemouth<\/td>\n<td>180<\/td>\n<td>176<\/td>\n<td>108<\/td>\n<td>38.6%<\/td>\n<\/tr>\n<tr>\n<td>Newcastle v Liverpool<\/td>\n<td>180<\/td>\n<td>176<\/td>\n<td>112<\/td>\n<td>36.4%<\/td>\n<\/tr>\n<tr>\n<td>Fulham v Chelsea<\/td>\n<td>179<\/td>\n<td>175<\/td>\n<td>104<\/td>\n<td>40.6%<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>Median snapshot depth ran 212 to 251 per book per fixture, and Kalshi alone logged 44,507 snapshots on one outcome. Pinnacle opened all three fixtures on 19 June, roughly nine weeks out. Retention runs deeper than one season, which is why a <a href=\"https:\/\/oddspapi.io\/blog\/bet365-historical-odds-guide-the-data-apis-and-strategy\/\">Bet365 price history<\/a> from months ago is still queryable today.<\/p>\n<h2>The curve: error against book count<\/h2>\n<p>For each sample size I drew 600 random subsets per fixture, built the consensus, and measured the gap to the full-board number on the worst of the three outcomes.<\/p>\n<figure class=\"wp-block-table\">\n<table>\n<thead>\n<tr>\n<th>Books sampled<\/th>\n<th>Mean error<\/th>\n<th>95th percentile<\/th>\n<th>Within 0.5pp<\/th>\n<th>Median independent feeds<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>1<\/td>\n<td>1.07pp<\/td>\n<td>2.71pp<\/td>\n<td>22%<\/td>\n<td>1.0<\/td>\n<\/tr>\n<tr>\n<td>2<\/td>\n<td>0.79pp<\/td>\n<td>1.74pp<\/td>\n<td>34%<\/td>\n<td>2.0<\/td>\n<\/tr>\n<tr>\n<td><strong>3<\/strong><\/td>\n<td><strong>0.67pp<\/strong><\/td>\n<td><strong>1.50pp<\/strong><\/td>\n<td><strong>43%<\/strong><\/td>\n<td>3.0<\/td>\n<\/tr>\n<tr>\n<td>5<\/td>\n<td>0.52pp<\/td>\n<td>1.31pp<\/td>\n<td>58%<\/td>\n<td>5.0<\/td>\n<\/tr>\n<tr>\n<td>10<\/td>\n<td>0.37pp<\/td>\n<td>0.84pp<\/td>\n<td>77%<\/td>\n<td>10.0<\/td>\n<\/tr>\n<tr>\n<td><strong>25<\/strong><\/td>\n<td><strong>0.23pp<\/strong><\/td>\n<td><strong>0.47pp<\/strong><\/td>\n<td><strong>96%<\/strong><\/td>\n<td>22.0<\/td>\n<\/tr>\n<tr>\n<td>50<\/td>\n<td>0.15pp<\/td>\n<td>0.30pp<\/td>\n<td>100%<\/td>\n<td>39.0<\/td>\n<\/tr>\n<tr>\n<td>100<\/td>\n<td>0.08pp<\/td>\n<td>0.17pp<\/td>\n<td>100%<\/td>\n<td>69.0<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>Read the fourth column first. At three books, 43% of your fixtures land within half a percentage point of the real consensus. At 25 books, 96% do. That is where the curve stops paying you back, and it costs nine calls rather than one.<\/p>\n<p>The last column carries a second warning. Sample 50 slugs and you get 39 distinct prices, because 36% to 41% of the board is one feed wearing several brands. Sample 100 and you get 69. Your effective sample size stays smaller than your book count.<\/p>\n<h2>Which three books, if you only get three<\/h2>\n<p>Random sampling is the honest way to measure the penalty, but nobody picks books at random. So I tested the combinations you would reach for.<\/p>\n<figure class=\"wp-block-table\">\n<table>\n<thead>\n<tr>\n<th>Three-book set<\/th>\n<th>Man City<\/th>\n<th>Newcastle<\/th>\n<th>Fulham<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>pinnacle + draftkings + fanduel<\/strong><\/td>\n<td><strong>0.21pp<\/strong><\/td>\n<td><strong>0.22pp<\/strong><\/td>\n<td><strong>0.35pp<\/strong><\/td>\n<\/tr>\n<tr>\n<td>draftkings + fanduel + betmgm<\/td>\n<td>0.19pp<\/td>\n<td>0.54pp<\/td>\n<td>0.60pp<\/td>\n<\/tr>\n<tr>\n<td>pinnacle + bet365 + draftkings<\/td>\n<td>0.31pp<\/td>\n<td>0.27pp<\/td>\n<td>1.08pp<\/td>\n<\/tr>\n<tr>\n<td>bet365 + draftkings + fanduel<\/td>\n<td>0.43pp<\/td>\n<td>0.58pp<\/td>\n<td>0.92pp<\/td>\n<\/tr>\n<tr>\n<td>pinnacle + bet365 + fanduel<\/td>\n<td>0.37pp<\/td>\n<td>0.84pp<\/td>\n<td>1.29pp<\/td>\n<\/tr>\n<tr>\n<td>pinnacle + kalshi + bet365<\/td>\n<td>0.65pp<\/td>\n<td>0.78pp<\/td>\n<td>1.35pp<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>Pinnacle with the two big US retail books lands at 0.21pp to 0.35pp, which matches a random draw of 25 books. Choosing well buys most of what breadth buys.<\/p>\n<p>Swapping FanDuel for Bet365 costs you accuracy on all three fixtures, and on Fulham v Chelsea it triples the error. Bet365 closed that match at 3.90 \/ 3.70 \/ 1.86 for a 6.43% margin, 110th of 175 books, and it pulls the consensus toward the away side. A wide book does not average out against two tight ones. It drags.<\/p>\n<h2>What this does to your CLV numbers<\/h2>\n<p>Fair probability error is abstract. Bet grading is not. So I took every book&#8217;s closing price on each fixture and asked whether it beat the consensus, once against the full board and once against a 3-book proxy.<\/p>\n<figure class=\"wp-block-table\">\n<table>\n<thead>\n<tr>\n<th>Proxy closing line<\/th>\n<th>Man City<\/th>\n<th>Fulham<\/th>\n<th>Newcastle<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>pinnacle + bet365 + draftkings<\/td>\n<td><strong>51 of 528 (9.7%)<\/strong><\/td>\n<td><strong>40 of 525 (7.6%)<\/strong><\/td>\n<td>19 of 528 (3.6%)<\/td>\n<\/tr>\n<tr>\n<td>draftkings + fanduel + betmgm<\/td>\n<td>1 of 528 (0.2%)<\/td>\n<td>14 of 525 (2.7%)<\/td>\n<td>4 of 528 (0.8%)<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>One in ten verdicts flipping is enough to turn a losing strategy into a winning one on paper. If you are measuring <a href=\"https:\/\/oddspapi.io\/blog\/expected-value-betting-python-ev-clv\/\">closing line value<\/a> to decide whether a model is worth funding, the proxy you grade against matters as much as the model.<\/p>\n<h2>Line shopping is a different question with a different answer<\/h2>\n<p>Consensus needs breadth for accuracy. Best price needs breadth for money, and it converges far more slowly.<\/p>\n<figure class=\"wp-block-table\">\n<table>\n<thead>\n<tr>\n<th>Books sampled<\/th>\n<th>Man City<\/th>\n<th>Newcastle<\/th>\n<th>Fulham<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>1<\/td>\n<td>85.7%<\/td>\n<td>85.0%<\/td>\n<td>83.9%<\/td>\n<\/tr>\n<tr>\n<td>3<\/td>\n<td>89.5%<\/td>\n<td>86.8%<\/td>\n<td>87.4%<\/td>\n<\/tr>\n<tr>\n<td>10<\/td>\n<td>92.8%<\/td>\n<td>88.6%<\/td>\n<td>89.7%<\/td>\n<\/tr>\n<tr>\n<td>25<\/td>\n<td>94.2%<\/td>\n<td>89.1%<\/td>\n<td>92.0%<\/td>\n<\/tr>\n<tr>\n<td>50<\/td>\n<td>95.6%<\/td>\n<td>94.1%<\/td>\n<td>95.8%<\/td>\n<\/tr>\n<tr>\n<td>100<\/td>\n<td>99.0%<\/td>\n<td>97.6%<\/td>\n<td>97.7%<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>Each cell is the median share of the best available price you capture on your worst outcome. Three books get you to roughly 88%. Fifty books get you past 94%. On Newcastle v Liverpool the best home price came from <code>1xbet<\/code> at 4.24 against Pinnacle&#8217;s 3.81, a gap of 11.3%, and no amount of careful de-vigging recovers that if the book sits outside your pull.<\/p>\n<p>Size the pull to the job. Twenty-five books settle the fair price. <a href=\"https:\/\/oddspapi.io\/blog\/line-shopping-python-best-odds\/\">Line shopping<\/a> keeps paying you well past a hundred.<\/p>\n<h2>Four traps that cost me books<\/h2>\n<h3>1. One unavailable slug fails the whole batch<\/h3>\n<p>Batch three slugs and the call returns everything or nothing. On every fixture, 25 of my 77 batches failed because a single slug in them sat outside my plan. That cost 74 slugs per fixture until I retried them one at a time, which took each board from <strong>139 books to 180<\/strong>. Retry failed batches individually and you recover 41 books for free.<\/p>\n<h3>2. Bet365 closes with active set to false<\/h3>\n<p>On Newcastle v Liverpool, Bet365&#8217;s final pre-kickoff snapshot landed at 15:11 with <code>active: false<\/code> against a 15:30 kick-off. Its last live price was 4.10 at 15:00, the same number. Take the last snapshot and demand <code>active<\/code> in one step and you drop Bet365 plus eight regional skins from that fixture. Walking back to the last active price recovered 11 books on Newcastle and 8 on Fulham v Chelsea, including Caesars and William Hill.<\/p>\n<h3>3. Roughly 40% of the board is duplicate feeds<\/h3>\n<p>On Newcastle v Liverpool, ten slugs closed at an identical 4.00 \/ 3.95 \/ 1.90, including <code>atg.se<\/code>, <code>paf<\/code>, <code>svenskaspel<\/code> and four Unibet regionals. Nine more shared 3.60 \/ 3.70 \/ 1.88 across the Entain brands. None of them carries a <code>cloneOf<\/code> flag. Dedupe on the price tuple before you average, or one trading desk votes ten times.<\/p>\n<h3>4. A margin screen trims the tail and does not fix the sample<\/h3>\n<p>Bovada closed Fulham v Chelsea at 2.15 \/ 3.90 \/ 1.444, a 41.4% margin and 8.70pp away from consensus on its own. Dropping every book above a 15% margin removes it, along with the three Betway slugs and <code>bwin.fr<\/code>. The gain is small: mean error at three books moves from 0.66pp to 0.63pp, and the worst case does not improve.<\/p>\n<p>Screen anyway. One stale quote in a three-book sample moves your fair line by a full point. Filtering will not substitute for coverage.<\/p>\n<h2>The old way versus the OddsPapi way<\/h2>\n<figure class=\"wp-block-table\">\n<table>\n<thead>\n<tr>\n<th><\/th>\n<th>Scraping or a 3-book feed<\/th>\n<th>OddsPapi <code>\/historical-odds<\/code><\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Books on a closing line<\/td>\n<td>3 to 10<\/td>\n<td>176 usable on a Premier League fixture<\/td>\n<\/tr>\n<tr>\n<td>Cost of history<\/td>\n<td>Paid add-on at most providers<\/td>\n<td>Free tier<\/td>\n<\/tr>\n<tr>\n<td>Snapshot depth<\/td>\n<td>Whatever you captured live<\/td>\n<td>212 to 251 per book, back to 19 June<\/td>\n<\/tr>\n<tr>\n<td>Sharps and exchanges<\/td>\n<td>Rarely included<\/td>\n<td>Pinnacle, SBOBet, Betfair, SX Bet, Kalshi, Polymarket<\/td>\n<\/tr>\n<tr>\n<td>Limits on the closing price<\/td>\n<td>Not exposed<\/td>\n<td><code>limit<\/code> field on Pinnacle and exchanges<\/td>\n<\/tr>\n<tr>\n<td>Backfill for a season you did not record<\/td>\n<td>Impossible<\/td>\n<td>Query it today<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<h2>Build it: a closing-line puller that survives the 3-book cap<\/h2>\n<h3>Step 1: authenticate and find a played fixture<\/h3>\n<p>The API key is a query parameter, never a header.<\/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\n# Premier League is tournamentId 17. Pick a window that has already been played.\nr = requests.get(f\"{BASE_URL}\/fixtures\", params={\n    \"apiKey\": API_KEY, \"sportId\": 10, \"tournamentId\": 17,\n    \"from\": \"2026-08-22\", \"to\": \"2026-08-25\",\n})\nfor f in r.json():\n    print(f[\"fixtureId\"], f[\"startTime\"], f[\"statusName\"])\n<\/code><\/pre>\n<p>Finished fixtures report <code>hasOdds: false<\/code>. Ignore it. That flag describes live prices, and the history is still there.<\/p>\n<h3>Step 2: pull the closing line, three slugs at a time<\/h3>\n<p>Three defences matter here. Honour the <code>retryMs<\/code> the API hands back on a 429, retry a failed batch slug by slug, and walk backwards to the last <code>active<\/code> snapshot.<\/p>\n<pre class=\"wp-block-code\"><code>FTR_MARKET = \"101\"                      # Full Time Result\nOUTCOMES = {\"101\": \"home\", \"102\": \"draw\", \"103\": \"away\"}\n\ndef fetch(fixture_id, batch, tries=4):\n    \"\"\"One call, honouring the 429 retryMs the API hands back.\"\"\"\n    for _ in range(tries):\n        r = requests.get(f\"{BASE_URL}\/historical-odds\", params={\n            \"apiKey\": API_KEY, \"fixtureId\": fixture_id,\n            \"bookmakers\": \",\".join(batch),\n        })\n        if r.status_code == 429:\n            wait = r.json()[\"error\"].get(\"retryMs\", 3000) \/ 1000\n            time.sleep(wait + 0.5)\n            continue\n        time.sleep(4.6)                 # cooldown between successful calls\n        return r\n    return r\n\ndef parse(payload, kickoff, board):\n    for slug, book in (payload.get(\"bookmakers\") or {}).items():\n        market = (book.get(\"markets\") or {}).get(FTR_MARKET)\n        if not market:\n            continue\n        prices = {}\n        for oid, label in OUTCOMES.items():\n            outcome = (market.get(\"outcomes\") or {}).get(oid)\n            if not outcome:\n                continue\n            snaps = (outcome.get(\"players\") or {}).get(\"0\") or []\n            pre = [s for s in snaps if s[\"createdAt\"] &lt; kickoff]\n            live = [s for s in pre if s.get(\"active\")]\n            if live:                    # walk back past a suspended close\n                prices[label] = live[-1][\"price\"]\n        if len(prices) == 3:\n            board[slug] = prices\n\ndef closing_line(fixture_id, kickoff, slugs):\n    board, unavailable = {}, []\n    for i in range(0, len(slugs), 3):\n        batch = slugs[i:i + 3]\n        r = fetch(fixture_id, batch)\n        if r.status_code == 200:\n            parse(r.json(), kickoff, board)\n            continue\n        # One unavailable slug fails the whole batch. Retry each slug alone.\n        for slug in batch:\n            single = fetch(fixture_id, [slug])\n            if single.status_code == 200:\n                parse(single.json(), kickoff, board)\n            else:\n                unavailable.append(slug)\n    return board, unavailable\n<\/code><\/pre>\n<p>Retry the slug once and give up. An early version of this called itself on the failed slug and blew the stack after 973 frames, because a book outside your plan fails every time you ask.<\/p>\n<p>The <code>\/historical-odds<\/code> cooldown runs near 4.5 seconds because the payloads are large. Three books on one Premier League fixture returned 30 MB. Sleep 4.6 seconds after each success and a full board runs with almost no 429s.<\/p>\n<h3>Step 3: dedupe, screen, then average<\/h3>\n<pre class=\"wp-block-code\"><code>def fair_probabilities(board, max_margin=0.15):\n    unique = {}\n    for slug, prices in board.items():\n        tup = (prices[\"home\"], prices[\"draw\"], prices[\"away\"])\n        margin = sum(1 \/ p for p in tup) - 1\n        if margin &lt;= 0 or margin &gt; max_margin:\n            continue                      # partial market, or a stale quote\n        unique[tup] = slug                # identical feeds collapse to one vote\n\n    devigged = []\n    for tup in unique:\n        inv = [1 \/ p for p in tup]\n        total = sum(inv)\n        devigged.append([i \/ total for i in inv])\n\n    n = len(devigged)\n    return {label: sum(d[i] for d in devigged) \/ n\n            for i, label in enumerate((\"home\", \"draw\", \"away\"))}, n\n<\/code><\/pre>\n<p>The <code>margin &lt;= 0<\/code> guard is not decoration. A single book never offers you a free arbitrage, so a quote whose inverse prices sum below 1.0 is a partial market rather than an opportunity.<\/p>\n<p>Proportional de-vigging is the simplest of the three common methods and it serves a consensus well, because averaging across dozens of books washes out most of the difference between them. To find the fair price of one book on its own, the <a href=\"https:\/\/oddspapi.io\/blog\/no-vig-odds-api\/\">power and Shin methods<\/a> handle favourite-longshot bias better.<\/p>\n<h3>Step 4: run it on a real fixture<\/h3>\n<pre class=\"wp-block-code\"><code>KICKOFF = \"2026-08-24T19:00:00.000Z\"     # Fulham v Chelsea\nFIXTURE = \"id1000001772221172\"\n\nslugs = [b[\"slug\"] for b in requests.get(\n    f\"{BASE_URL}\/bookmakers\", params={\"apiKey\": API_KEY}).json()\n    if not b.get(\"cloneOf\") and not b[\"slug\"].startswith(\"pinnacle+\")]\n\nboard, unavailable = closing_line(FIXTURE, KICKOFF, slugs)\nfair, feeds = fair_probabilities(board)\nprint(f\"{len(board)} books, {feeds} independent feeds\")\nprint({k: round(100 * v, 2) for k, v in fair.items()})\n<\/code><\/pre>\n<p>Filtering out <code>cloneOf<\/code> slugs and the <code>pinnacle+<\/code> test feeds before you start saves 120 wasted calls. Clone-flagged brands never ship their own payload, and the test feeds quote an identical price to Pinnacle, so they would count the sharpest book on the board three times.<\/p>\n<p>On that fixture the full board returned 179 books, 104 independent price tuples, and a fair line of 25.89% home, 26.83% draw, 47.28% away. Pinnacle alone closed 3.86 \/ 3.59 \/ 2.029 at a 3.05% margin, which ranked it 23rd of 175 books. Twenty books priced it tighter. Eight of those are exchanges or prediction markets, led by <code>sx.bet<\/code> at 0.86% and <code>kalshi<\/code> at 1.01%, and another eight are the Unibet family quoting one shared price.<\/p>\n<p>Run the same script against Pinnacle, DraftKings, FanDuel and BetMGM alone and it returns 25.91 \/ 27.12 \/ 46.96, which sits 0.29pp from the full board. Four chosen books get close. Four random ones do not.<\/p>\n<p>Store the output rather than re-pulling it. A full board across a season moves a lot of bandwidth, and <a href=\"https:\/\/oddspapi.io\/blog\/odds-database-python-sqlite\/\">SQLite handles it well<\/a>. To hand the same board to a spreadsheet or a teammate, <a href=\"https:\/\/oddspapi.io\/blog\/historical-odds-csv-excel-backtesting\/\">export it to CSV<\/a> instead.<\/p>\n<h2>So how many bookmakers do you need?<\/h2>\n<figure class=\"wp-block-table\">\n<table>\n<thead>\n<tr>\n<th>What you are doing<\/th>\n<th>Books<\/th>\n<th>Calls<\/th>\n<th>Why<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Sanity-checking a model in development<\/td>\n<td>3, chosen deliberately<\/td>\n<td>1<\/td>\n<td>Pinnacle plus two tight retail books lands within 0.4pp<\/td>\n<\/tr>\n<tr>\n<td>Grading CLV on real money<\/td>\n<td>25<\/td>\n<td>9<\/td>\n<td>96% of fixtures within 0.5pp, and verdict flips fall to noise<\/td>\n<\/tr>\n<tr>\n<td>Publishing a fair-odds number<\/td>\n<td>50<\/td>\n<td>17<\/td>\n<td>Every sampled fixture within 0.5pp<\/td>\n<\/tr>\n<tr>\n<td>Line shopping or arbitrage<\/td>\n<td>All of them<\/td>\n<td>60+<\/td>\n<td>Best price is still climbing at 100 books<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>Three books is defensible when you pick them on purpose. Three random books gives you worse than a coin flip on landing within half a point of the market. The <a href=\"https:\/\/oddspapi.io\/blog\/consensus-odds-fair-odds-calculator-python\/\">consensus-odds method<\/a> is unchanged either way. Only the sample underneath it moves.<\/p>\n<p>The reason most backtests stop at three is that history costs money almost everywhere else. It does not here. <a href=\"https:\/\/oddspapi.io\/blog\/free-odds-api-350-bookmakers\/\">Get a free API key<\/a>, point the script at a fixture your model already has an opinion about, and find out which side of 0.67pp you have been living on.<\/p>\n<h2>Frequently asked questions<\/h2>\n<h3>How many bookmakers can I request from \/historical-odds at once?<\/h3>\n<p>Three. A fourth returns HTTP 400 with the code <code>TOO_MANY_BOOKMAKERS<\/code>. Loop the call with different combinations and merge the responses.<\/p>\n<h3>Does a bigger sample of bookmakers actually change the closing line?<\/h3>\n<p>Yes, by about 0.67 percentage points on average between 3 books and 176, and by up to 5.18pp on a bad draw. The accuracy curve flattens near 25 books.<\/p>\n<h3>Why did my closing-line script return fewer books than expected?<\/h3>\n<p>Three likely causes. A batch containing one unavailable slug returns nothing at all, so retry failed batches individually. Some books post their final snapshot with <code>active: false<\/code>, so walk back to the last active price. And 36% to 41% of a soccer board is duplicate feeds that collapse on the price tuple.<\/p>\n<h3>Can I get historical odds for free?<\/h3>\n<p>Yes. OddsPapi ships <code>\/historical-odds<\/code> on the free tier across 350+ bookmakers and 69 sports, including Pinnacle, SBOBet and the exchanges. Competitors charge for history or gate it behind an enterprise plan.<\/p>\n<h3>Which three bookmakers should I use if I can only pull three?<\/h3>\n<p>Pinnacle, DraftKings and FanDuel landed within 0.21pp to 0.35pp of the full-board consensus on all three fixtures measured. Sets containing Bet365 performed worse, reaching 1.35pp, because Bet365 closed at a 6.43% margin and skewed the average.<\/p>\n<h3>How long does a full-board historical pull take?<\/h3>\n<p>Around eight minutes per fixture. The endpoint cools down for roughly 4.5 seconds between calls and payloads reach 30 MB for three books, so about 60 calls covers a 180-book board.<\/p>\n<p><script type=\"application\/ld+json\">\n{\n  \"@context\": \"https:\/\/schema.org\",\n  \"@type\": \"FAQPage\",\n  \"mainEntity\": [\n    {\"@type\":\"Question\",\"name\":\"How many bookmakers can I request from \/historical-odds at once?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Three. A fourth returns HTTP 400 with the code TOO_MANY_BOOKMAKERS. Loop the call with different bookmaker combinations and merge the nested responses.\"}},\n    {\"@type\":\"Question\",\"name\":\"Does a bigger sample of bookmakers actually change the closing line?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Yes. Across three Premier League fixtures measured in August 2026, a random three-book consensus missed the full-board fair probability by 0.67 percentage points on average and 5.18pp at worst. The accuracy curve flattens near 25 books, where 96 percent of samples land within half a percentage point.\"}},\n    {\"@type\":\"Question\",\"name\":\"Why did my closing-line script return fewer bookmakers than expected?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"A batch containing one unavailable slug returns nothing at all, so retry failed batches one slug at a time. Some books including Bet365 post their final pre-kickoff snapshot with active set to false, so walk back to the last active price. And 36 to 41 percent of a soccer board is duplicate feeds that collapse when you dedupe on the price tuple.\"}},\n    {\"@type\":\"Question\",\"name\":\"Can I get historical odds for free?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Yes. OddsPapi ships the historical-odds endpoint on its free tier across 350+ bookmakers and 69 sports, including Pinnacle, SBOBet and the exchanges. Authentication is an apiKey query parameter.\"}},\n    {\"@type\":\"Question\",\"name\":\"Which three bookmakers should I use if I can only pull three?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Pinnacle, DraftKings and FanDuel landed within 0.21 to 0.35 percentage points of the full-board consensus on all three fixtures measured. Sets containing Bet365 performed worse, reaching 1.35pp, because Bet365 closed at a 6.43 percent margin and skewed the average toward one side.\"}},\n    {\"@type\":\"Question\",\"name\":\"How long does a full-board historical pull take?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Around eight minutes per fixture. The endpoint cools down for roughly 4.5 seconds between calls and payloads reach 30 MB for three bookmakers, so about 60 calls covers a 180-book board.\"}}\n  ]\n}\n<\/script><\/p>\n<p><!--\nFocus Keyphrase: how many bookmakers backtest\nSEO Title: How Many Bookmakers Does Your Backtest Need? A 176-Book Study\nMeta Description: A 3-book closing line misses the 176-book consensus by 0.67pp and flips 9.7% of CLV verdicts. Measure it yourself with OddsPapi's free historical odds API.\nSlug: how-many-bookmakers-backtest\n--><\/p>\n","protected":false},"excerpt":{"rendered":"<p>A 3-book closing line misses the 176-book consensus by 0.67pp and flips 9.7% of CLV verdicts. Measure it with OddsPapi&#8217;s free historical odds API.<\/p>\n","protected":false},"author":2,"featured_media":3711,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7],"tags":[30,8,4,9,11],"class_list":["post-3710","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-how-to-guides","tag-backtesting","tag-free-api","tag-historical-odds","tag-odds-api","tag-python"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.4 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>How Many Bookmakers Does Your Backtest Need? A 176-Book Study | 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\/how-many-bookmakers-backtest\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"How Many Bookmakers Does Your Backtest Need? A 176-Book Study | OddsPapi Blog\" \/>\n<meta property=\"og:description\" content=\"A 3-book closing line misses the 176-book consensus by 0.67pp and flips 9.7% of CLV verdicts. Measure it with OddsPapi&#039;s free historical odds API.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/oddspapi.io\/blog\/how-many-bookmakers-backtest\/\" \/>\n<meta property=\"og:site_name\" content=\"OddsPapi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-09-03T10:00:00+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/08\/how-many-bookmakers-backtest-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\/how-many-bookmakers-backtest\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/how-many-bookmakers-backtest\/\"},\"author\":{\"name\":\"Odds API Writer\",\"@id\":\"https:\/\/oddspapi.io\/blog\/#\/schema\/person\/b6f21e649c4f556f0a95c23a0f1efa13\"},\"headline\":\"How Many Bookmakers Does Your Backtest Need? A 176-Book Study\",\"datePublished\":\"2026-09-03T10:00:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/how-many-bookmakers-backtest\/\"},\"wordCount\":2028,\"commentCount\":2,\"publisher\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/how-many-bookmakers-backtest\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/08\/how-many-bookmakers-backtest-scaled.webp\",\"keywords\":[\"Backtesting\",\"Free API\",\"historical odds\",\"Odds API\",\"Python\"],\"articleSection\":[\"How To Guides\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/oddspapi.io\/blog\/how-many-bookmakers-backtest\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/oddspapi.io\/blog\/how-many-bookmakers-backtest\/\",\"url\":\"https:\/\/oddspapi.io\/blog\/how-many-bookmakers-backtest\/\",\"name\":\"How Many Bookmakers Does Your Backtest Need? A 176-Book Study | OddsPapi Blog\",\"isPartOf\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/how-many-bookmakers-backtest\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/how-many-bookmakers-backtest\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/08\/how-many-bookmakers-backtest-scaled.webp\",\"datePublished\":\"2026-09-03T10:00:00+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/how-many-bookmakers-backtest\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/oddspapi.io\/blog\/how-many-bookmakers-backtest\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/oddspapi.io\/blog\/how-many-bookmakers-backtest\/#primaryimage\",\"url\":\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/08\/how-many-bookmakers-backtest-scaled.webp\",\"contentUrl\":\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/08\/how-many-bookmakers-backtest-scaled.webp\",\"width\":2560,\"height\":1429,\"caption\":\"How Many Bookmakers? - OddsPapi API Blog\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/oddspapi.io\/blog\/how-many-bookmakers-backtest\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/oddspapi.io\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"How Many Bookmakers Does Your Backtest Need? A 176-Book Study\"}]},{\"@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":"How Many Bookmakers Does Your Backtest Need? A 176-Book Study | 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\/how-many-bookmakers-backtest\/","og_locale":"en_US","og_type":"article","og_title":"How Many Bookmakers Does Your Backtest Need? A 176-Book Study | OddsPapi Blog","og_description":"A 3-book closing line misses the 176-book consensus by 0.67pp and flips 9.7% of CLV verdicts. Measure it with OddsPapi's free historical odds API.","og_url":"https:\/\/oddspapi.io\/blog\/how-many-bookmakers-backtest\/","og_site_name":"OddsPapi Blog","article_published_time":"2026-09-03T10:00:00+00:00","og_image":[{"width":2560,"height":1429,"url":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/08\/how-many-bookmakers-backtest-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\/how-many-bookmakers-backtest\/#article","isPartOf":{"@id":"https:\/\/oddspapi.io\/blog\/how-many-bookmakers-backtest\/"},"author":{"name":"Odds API Writer","@id":"https:\/\/oddspapi.io\/blog\/#\/schema\/person\/b6f21e649c4f556f0a95c23a0f1efa13"},"headline":"How Many Bookmakers Does Your Backtest Need? A 176-Book Study","datePublished":"2026-09-03T10:00:00+00:00","mainEntityOfPage":{"@id":"https:\/\/oddspapi.io\/blog\/how-many-bookmakers-backtest\/"},"wordCount":2028,"commentCount":2,"publisher":{"@id":"https:\/\/oddspapi.io\/blog\/#organization"},"image":{"@id":"https:\/\/oddspapi.io\/blog\/how-many-bookmakers-backtest\/#primaryimage"},"thumbnailUrl":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/08\/how-many-bookmakers-backtest-scaled.webp","keywords":["Backtesting","Free API","historical odds","Odds API","Python"],"articleSection":["How To Guides"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/oddspapi.io\/blog\/how-many-bookmakers-backtest\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/oddspapi.io\/blog\/how-many-bookmakers-backtest\/","url":"https:\/\/oddspapi.io\/blog\/how-many-bookmakers-backtest\/","name":"How Many Bookmakers Does Your Backtest Need? A 176-Book Study | OddsPapi Blog","isPartOf":{"@id":"https:\/\/oddspapi.io\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/oddspapi.io\/blog\/how-many-bookmakers-backtest\/#primaryimage"},"image":{"@id":"https:\/\/oddspapi.io\/blog\/how-many-bookmakers-backtest\/#primaryimage"},"thumbnailUrl":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/08\/how-many-bookmakers-backtest-scaled.webp","datePublished":"2026-09-03T10:00:00+00:00","breadcrumb":{"@id":"https:\/\/oddspapi.io\/blog\/how-many-bookmakers-backtest\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/oddspapi.io\/blog\/how-many-bookmakers-backtest\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/oddspapi.io\/blog\/how-many-bookmakers-backtest\/#primaryimage","url":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/08\/how-many-bookmakers-backtest-scaled.webp","contentUrl":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/08\/how-many-bookmakers-backtest-scaled.webp","width":2560,"height":1429,"caption":"How Many Bookmakers? - OddsPapi API Blog"},{"@type":"BreadcrumbList","@id":"https:\/\/oddspapi.io\/blog\/how-many-bookmakers-backtest\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/oddspapi.io\/blog\/"},{"@type":"ListItem","position":2,"name":"How Many Bookmakers Does Your Backtest Need? A 176-Book Study"}]},{"@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\/3710","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=3710"}],"version-history":[{"count":1,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/posts\/3710\/revisions"}],"predecessor-version":[{"id":3712,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/posts\/3710\/revisions\/3712"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/media\/3711"}],"wp:attachment":[{"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/media?parent=3710"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/categories?post=3710"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/tags?post=3710"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}