{"id":3180,"date":"2026-08-12T10:00:00","date_gmt":"2026-08-12T10:00:00","guid":{"rendered":"https:\/\/oddspapi.io\/blog\/?p=3180"},"modified":"2026-08-03T13:53:22","modified_gmt":"2026-08-03T13:53:22","slug":"premier-league-odds-api","status":"publish","type":"post","link":"https:\/\/oddspapi.io\/blog\/premier-league-odds-api\/","title":{"rendered":"Premier League Odds API: Live EPL Prices, Handicaps &#038; Corners"},"content":{"rendered":"<p>The Premier League sells broadcast rights, not odds. There is no official EPL price feed, and the twenty clubs do not run one either. If you want the number Arsenal are trading at on opening weekend, you get it from bookmakers, and every bookmaker either blocks you at the edge or hides prices behind a rendered betslip that changes shape every few months.<\/p>\n<p>This guide skips the scraping. One HTTP call returns the full Premier League board from 15 bookmakers, including two sharps, and this post walks the whole thing: finding the right competition, reading the 1X2, de-vigging Pinnacle, pulling the Asian handicap ladder and the corner markets, and using free historical odds to work out when an EPL price is worth trusting.<\/p>\n<p>Every number below came off the live API on 3 August 2026, three weeks before the 2026\/27 season kicks off.<\/p>\n<h2>What the Premier League board looks like right now<\/h2>\n<p>The feed carries 20 upcoming Premier League fixtures. Five of them have prices. Bookmakers open one round at a time, so the opener and the first full weekend are live while the rest of August sits unpriced.<\/p>\n<figure class=\"wp-block-table\">\n<table>\n<thead>\n<tr>\n<th>Fixture<\/th>\n<th>Kick-off (UTC)<\/th>\n<th>Books<\/th>\n<th>Markets<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Arsenal FC v Coventry City<\/td>\n<td>21 Aug 19:00<\/td>\n<td>15<\/td>\n<td>225<\/td>\n<\/tr>\n<tr>\n<td>Brighton &amp; Hove Albion v Aston Villa<\/td>\n<td>23 Aug 13:00<\/td>\n<td>14<\/td>\n<td>204<\/td>\n<\/tr>\n<tr>\n<td>Manchester City v AFC Bournemouth<\/td>\n<td>23 Aug 13:00<\/td>\n<td>14<\/td>\n<td>219<\/td>\n<\/tr>\n<tr>\n<td>Newcastle United v Liverpool FC<\/td>\n<td>23 Aug 15:30<\/td>\n<td>14<\/td>\n<td>208<\/td>\n<\/tr>\n<tr>\n<td>Fulham FC v Chelsea FC<\/td>\n<td>24 Aug 19:00<\/td>\n<td>14<\/td>\n<td>204<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>Both sharp books are in: Pinnacle and SBOBet. So are Bet365, DraftKings, FanDuel, BetMGM, Caesars, William Hill, BetRivers, PointsBet, Hard Rock Bet and the BetParx family. That is a smaller field than a live MLB game gets, because the prediction markets have not opened EPL yet, and it is still enough to shop every outcome across eleven independent opinions.<\/p>\n<h2>Scraping versus one API call<\/h2>\n<figure class=\"wp-block-table\">\n<table>\n<thead>\n<tr>\n<th>Job<\/th>\n<th>Scraping bookmakers<\/th>\n<th>OddsPapi<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Get 15 books on one fixture<\/td>\n<td>15 scrapers, 15 layouts, 15 breakages<\/td>\n<td>One <code>GET \/v4\/odds<\/code><\/td>\n<\/tr>\n<tr>\n<td>Asian handicap ladder<\/td>\n<td>Rendered client-side, often gated by region<\/td>\n<td>13 handicap lines in the same payload<\/td>\n<\/tr>\n<tr>\n<td>Corners and team totals<\/td>\n<td>Separate tab, separate DOM<\/td>\n<td>Same nested JSON, own market IDs<\/td>\n<\/tr>\n<tr>\n<td>Historical prices<\/td>\n<td>You store it yourself from day one<\/td>\n<td><code>\/v4\/historical-odds<\/code>, free tier<\/td>\n<\/tr>\n<tr>\n<td>Blocking<\/td>\n<td>Cloudflare, geo-fencing, betslip tokens<\/td>\n<td>API key on a query string<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<h2>Step 1: find the right Premier League<\/h2>\n<p>Authentication is a query parameter. It is not a header, and every wrapper that assumes otherwise fails on the first call.<\/p>\n<pre class=\"wp-block-code\"><code>import requests\n\nAPI_KEY = \"YOUR_API_KEY\"\nBASE_URL = \"https:\/\/api.oddspapi.io\/v4\"\nSOCCER = 10\n\ndef find_epl():\n    r = requests.get(f\"{BASE_URL}\/tournaments\",\n                     params={\"apiKey\": API_KEY, \"sportId\": SOCCER})\n    r.raise_for_status()\n    named = [t for t in r.json() if t[\"tournamentName\"] == \"Premier League\"]\n    england = [t for t in named if t[\"categoryName\"] == \"England\"]\n    print(f\"{len(named)} tournaments called 'Premier League', {len(england)} in England\")\n    return england[0]\n\nepl = find_epl()\nprint(epl[\"tournamentId\"], epl[\"tournamentSlug\"], epl[\"futureFixtures\"])\n<\/code><\/pre>\n<pre class=\"wp-block-code\"><code>35 tournaments called 'Premier League', 1 in England\n17 premier-league 20\n<\/code><\/pre>\n<p>Thirty-five competitions in the catalogue answer to &#8220;Premier League&#8221;. Russia, Ukraine, Israel, Malta, Kazakhstan, Hong Kong and Egypt all use the name. Match on <code>categoryName<\/code> as well as the name, or hardcode <code>tournamentId<\/code> 17 once you have it.<\/p>\n<h2>Step 2: pull the fixtures that carry prices<\/h2>\n<p><code>\/fixtures<\/code> takes a date range up to ten days wide. Filter on the tournament ID, then filter again on <code>hasOdds<\/code>, because an unpriced fixture returns metadata only when you ask <code>\/odds<\/code> for it.<\/p>\n<pre class=\"wp-block-code\"><code>def epl_fixtures(start, end, tournament_id):\n    r = requests.get(f\"{BASE_URL}\/fixtures\", params={\n        \"apiKey\": API_KEY, \"sportId\": SOCCER, \"from\": start, \"to\": end})\n    r.raise_for_status()\n    return [f for f in r.json() if f[\"tournamentId\"] == tournament_id]\n\nfixtures = epl_fixtures(\"2026-08-23\", \"2026-09-01\", epl[\"tournamentId\"])\npriced = [f for f in fixtures if f[\"hasOdds\"]]\nprint(f\"{len(fixtures)} fixtures, {len(priced)} priced\")\nfor f in priced:\n    print(f[\"fixtureId\"], f[\"startTime\"][:16],\n          f[\"participant1Name\"], \"v\", f[\"participant2Name\"])\n<\/code><\/pre>\n<pre class=\"wp-block-code\"><code>14 fixtures, 4 priced\nid1000001772221166 2026-08-23T13:00 Brighton &amp; Hove Albion v Aston Villa\nid1000001772221168 2026-08-23T13:00 Manchester City v AFC Bournemouth\nid1000001772221170 2026-08-23T15:30 Newcastle United v Liverpool FC\nid1000001772221172 2026-08-24T19:00 Fulham FC v Chelsea FC\n<\/code><\/pre>\n<p>Team names live on <code>participant1Name<\/code> and <code>participant2Name<\/code>. The nested <code>participants<\/code> list comes back empty on soccer fixtures, so read the flat fields.<\/p>\n<h2>Step 3: read the 1X2 board<\/h2>\n<p>The odds payload nests five levels deep: bookmaker, market, outcome, player, price. Full Time Result is market 101 on soccer, with outcomes 101 home, 102 draw, 103 away.<\/p>\n<pre class=\"wp-block-code\"><code>FIXTURE = \"id1000001772221154\"          # Arsenal FC v Coventry City\nFULL_TIME_RESULT = 101\nHOME, DRAW, AWAY = 101, 102, 103\n\ndef board(fixture_id, market_id, outcome_ids):\n    r = requests.get(f\"{BASE_URL}\/odds\",\n                     params={\"apiKey\": API_KEY, \"fixtureId\": fixture_id})\n    r.raise_for_status()\n    books = r.json().get(\"bookmakerOdds\", {})\n    out = {}\n    for slug, book in books.items():\n        market = book[\"markets\"].get(str(market_id))\n        if not market:\n            continue\n        row = {}\n        for oid in outcome_ids:\n            outcome = market[\"outcomes\"].get(str(oid))\n            quote = outcome[\"players\"][\"0\"] if outcome else None\n            if quote and quote.get(\"active\") is not False and quote.get(\"price\"):\n                row[oid] = quote[\"price\"]\n        if len(row) == len(outcome_ids):\n            out[slug] = row\n    return out\n\nprices = board(FIXTURE, FULL_TIME_RESULT, [HOME, DRAW, AWAY])\nfor slug, row in sorted(prices.items(), key=lambda kv: kv[1][HOME]):\n    print(f\"{slug:18s} {row[HOME]:>6} {row[DRAW]:>6} {row[AWAY]:>6}\")\n<\/code><\/pre>\n<p>Two details in that filter do real work. Prices on a pre-game fixture sometimes ship <code>active: null<\/code> rather than <code>true<\/code>, so test <code>is not False<\/code> instead of truthiness or you silently drop good quotes. And <code>players[\"0\"]<\/code> holds the single current price on a game line; player-prop markets key that dict by player ID instead, which is a different parse.<\/p>\n<figure class=\"wp-block-table\">\n<table>\n<thead>\n<tr>\n<th>Bookmaker<\/th>\n<th>Arsenal<\/th>\n<th>Draw<\/th>\n<th>Coventry<\/th>\n<th>Margin<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>BetRivers \/ Ballybet \/ FourWinds<\/td>\n<td>1.16<\/td>\n<td>7.50<\/td>\n<td>19.00<\/td>\n<td>4.80%<\/td>\n<\/tr>\n<tr>\n<td>Pinnacle<\/td>\n<td>1.155<\/td>\n<td>8.02<\/td>\n<td>16.05<\/td>\n<td>5.28%<\/td>\n<\/tr>\n<tr>\n<td>Hard Rock Bet<\/td>\n<td>1.154<\/td>\n<td>7.50<\/td>\n<td>18.50<\/td>\n<td>5.39%<\/td>\n<\/tr>\n<tr>\n<td>PointsBet<\/td>\n<td>1.16<\/td>\n<td>7.00<\/td>\n<td>18.00<\/td>\n<td>6.05%<\/td>\n<\/tr>\n<tr>\n<td>Caesars \/ William Hill<\/td>\n<td>1.154<\/td>\n<td>7.00<\/td>\n<td>19.00<\/td>\n<td>6.20%<\/td>\n<\/tr>\n<tr>\n<td>BetParx<\/td>\n<td>1.14<\/td>\n<td>7.50<\/td>\n<td>18.00<\/td>\n<td>6.61%<\/td>\n<\/tr>\n<tr>\n<td>DraftKings<\/td>\n<td>1.154<\/td>\n<td>7.50<\/td>\n<td>15.00<\/td>\n<td>6.66%<\/td>\n<\/tr>\n<tr>\n<td>BetMGM \/ Borgata<\/td>\n<td>1.17<\/td>\n<td>7.00<\/td>\n<td>14.00<\/td>\n<td>6.90%<\/td>\n<\/tr>\n<tr>\n<td>Bet365<\/td>\n<td>1.166<\/td>\n<td>7.00<\/td>\n<td>13.00<\/td>\n<td>7.74%<\/td>\n<\/tr>\n<tr>\n<td>FanDuel<\/td>\n<td>1.13<\/td>\n<td>7.50<\/td>\n<td>14.00<\/td>\n<td>8.97%<\/td>\n<\/tr>\n<tr>\n<td>SBOBet<\/td>\n<td>1.17<\/td>\n<td>6.20<\/td>\n<td>11.50<\/td>\n<td>10.29%<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>Coventry range from 11.50 to 19.00 across the board. That is a 65% swing in payout on the same outcome, and it is the entire argument for reading more than one book.<\/p>\n<h2>Step 4: dedupe before you average<\/h2>\n<p>Fifteen slugs quoted this fixture. Eleven of them hold an independent opinion. The rest are the same trading operation shipped under different brands, and the catalogue does not always tell you: <code>\/v4\/bookmakers<\/code> reports <code>cloneOf: null<\/code> for BetMGM and Borgata even though they quoted byte-identical prices on all three outcomes.<\/p>\n<pre class=\"wp-block-code\"><code>def dedupe(prices):\n    groups = {}\n    for slug, row in prices.items():\n        key = tuple(sorted(row.items()))\n        groups.setdefault(key, []).append(slug)\n    return {slugs[0]: dict(key) for key, slugs in groups.items()}, groups\n\nindependent, groups = dedupe(prices)\nprint(f\"{len(prices)} slugs collapse to {len(independent)} independent quotes\")\nfor key, slugs in groups.items():\n    if len(slugs) > 1:\n        print(\"identical:\", \", \".join(slugs))\n<\/code><\/pre>\n<pre class=\"wp-block-code\"><code>15 slugs collapse to 11 independent quotes\nidentical: betmgm, borgata\nidentical: caesars, williamhill\nidentical: ballybet, betrivers, fourwinds\n<\/code><\/pre>\n<p>Skip this step and a naive consensus triple-weights the Ballybet trading desk. Caesars and William Hill are the one pair the catalogue does flag, since Caesars bought the US arm of William Hill in 2021 and runs both off the same book.<\/p>\n<h2>Step 5: de-vig the sharp, then shop the price<\/h2>\n<p>Pinnacle takes 5.28% on this market. Strip it out and you get the implied probability the sharpest book on the fixture actually believes, which is the number every other price should be measured against.<\/p>\n<pre class=\"wp-block-code\"><code>def devig(row):\n    overround = sum(1 \/ p for p in row.values())\n    return {oid: (1 \/ p) \/ overround for oid, p in row.items()}, overround - 1\n\ndef best_price(independent, outcome_id):\n    slug = max(independent, key=lambda s: independent[s][outcome_id])\n    return slug, independent[slug][outcome_id]\n\nfair, margin = devig(prices[\"pinnacle\"])\nprint(f\"Pinnacle margin {margin * 100:.2f}%\")\nfor oid, label in [(HOME, \"Arsenal\"), (DRAW, \"Draw\"), (AWAY, \"Coventry\")]:\n    slug, price = best_price(independent, oid)\n    print(f\"{label:9s} best {price:>6} @ {slug:12s} | \"\n          f\"fair {1 \/ fair[oid]:.3f} ({fair[oid] * 100:.1f}%)\")\n<\/code><\/pre>\n<pre class=\"wp-block-code\"><code>Pinnacle margin 5.28%\nArsenal   best   1.17 @ betmgm       | fair 1.216 (82.2%)\nDraw      best   8.02 @ pinnacle     | fair 8.443 (11.8%)\nCoventry  best  19.00 @ caesars      | fair 16.897 (5.9%)\n<\/code><\/pre>\n<p>Coventry at 19.00 sits 12.4% above the sharp fair price. Before you call that value, read the next section: Pinnacle&#8217;s stake limit on this fixture is tiny, which means its own number is a soft anchor this far from kick-off. Treat 19.00 as the best available price and nothing more.<\/p>\n<h2>Ask the Asian book for the Asian handicap<\/h2>\n<p>SBOBet posts the widest 1X2 on the board at 10.29%, roughly double Pinnacle. Look at the Asian handicap on the same fixtures and the ranking flips.<\/p>\n<figure class=\"wp-block-table\">\n<table>\n<thead>\n<tr>\n<th>Fixture<\/th>\n<th>Pinnacle 1X2<\/th>\n<th>SBOBet 1X2<\/th>\n<th>Pinnacle best AH<\/th>\n<th>SBOBet best AH<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Arsenal v Coventry<\/td>\n<td>5.28%<\/td>\n<td>10.29%<\/td>\n<td>4.04% (-2)<\/td>\n<td>2.59% (-2)<\/td>\n<\/tr>\n<tr>\n<td>Newcastle v Liverpool<\/td>\n<td>5.09%<\/td>\n<td>10.14%<\/td>\n<td>3.78% (+0.25)<\/td>\n<td>2.78% (+0.5)<\/td>\n<\/tr>\n<tr>\n<td>Man City v Bournemouth<\/td>\n<td>5.74%<\/td>\n<td>10.52%<\/td>\n<td>3.85% (-1.25)<\/td>\n<td>2.57% (-1.25)<\/td>\n<\/tr>\n<tr>\n<td>Brighton v Aston Villa<\/td>\n<td>4.98%<\/td>\n<td>10.30%<\/td>\n<td>3.78% (-0.25)<\/td>\n<td>3.02% (-0.25)<\/td>\n<\/tr>\n<tr>\n<td>Fulham v Chelsea<\/td>\n<td>5.15%<\/td>\n<td>10.19%<\/td>\n<td>3.85% (+0.25)<\/td>\n<td>2.61% (+0.25)<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>Five fixtures out of five, SBOBet charges about a point less than Pinnacle on the handicap while charging twice as much on the three-way. The Asian book prices the Asian market and treats the 1X2 as an afterthought. If you are building a fair-value model off European football, benchmark the handicap against SBOBet and the 1X2 against Pinnacle rather than picking one sharp for everything.<\/p>\n<p>The ladders differ too. Pinnacle walked nine handicap lines on the Arsenal fixture, from -1 down to -3. DraftKings posted eight, FanDuel two, Bet365 none at all. SBOBet quotes only the two or three lines nearest the true number, which is why its prices there are so tight.<\/p>\n<pre class=\"wp-block-code\"><code>r = requests.get(f\"{BASE_URL}\/markets\", params={\"apiKey\": API_KEY, \"sportId\": SOCCER})\nnames = {m[\"marketId\"]: (m[\"marketName\"], m[\"handicap\"]) for m in r.json()}\n\nbooks = requests.get(f\"{BASE_URL}\/odds\",\n                     params={\"apiKey\": API_KEY, \"fixtureId\": FIXTURE}).json()[\"bookmakerOdds\"]\n\nladder = sorted((names[mid][1], mid) for mid in map(int, books[\"pinnacle\"][\"markets\"])\n                if names.get(mid, (\"\",))[0] == \"Asian Handicap\")\nprint(\"Pinnacle ladder:\", [h for h, _ in ladder])\n<\/code><\/pre>\n<pre class=\"wp-block-code\"><code>Pinnacle ladder: [-3, -2.75, -2.5, -2.25, -2, -1.75, -1.5, -1.25, -1]\n<\/code><\/pre>\n<p>Soccer carries 32,814 market IDs because every handicap and every total line gets its own ID. Resolve them by name from <code>\/v4\/markets?sportId=10<\/code> rather than pasting a table into your code, and your parser survives the next line the book adds.<\/p>\n<h2>Corners, totals, and the mainLine trap<\/h2>\n<p>One Premier League fixture carried 225 distinct markets. The big families:<\/p>\n<figure class=\"wp-block-table\">\n<table>\n<thead>\n<tr>\n<th>Market family<\/th>\n<th>Lines on this fixture<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Over Under Full Time (goals)<\/td>\n<td>20<\/td>\n<\/tr>\n<tr>\n<td>Asian Handicap<\/td>\n<td>13<\/td>\n<\/tr>\n<tr>\n<td>Over Under First Half<\/td>\n<td>10<\/td>\n<\/tr>\n<tr>\n<td>Corners Over Under Full Time<\/td>\n<td>10<\/td>\n<\/tr>\n<tr>\n<td>Corners Over Under Team 1<\/td>\n<td>10<\/td>\n<\/tr>\n<tr>\n<td>Asian Handicap First Half<\/td>\n<td>9<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>Corners are real on English football: 61 corner markets on this one game, covering full-time totals, per-team counts, odd\/even, half splits and a corners 1X2. The honest caveat is depth. Seven slugs price them, and after deduping, the main total of 9.5 corners comes down to two independent quotes (the BetParx family at 1.42 \/ 2.60 and Hard Rock at 1.417 \/ 2.60). Neither sharp prices corners on this fixture. Cards do not appear at all.<\/p>\n<p>The goals total exposes a parsing trap. Books disagree about which line is the headline: seven quote 2.5 as their main total, six quote 3.5, Pinnacle sits on 3.0 and SBOBet on 2.75. Each outcome carries a <code>mainLine<\/code> boolean, and it is not consistent between books. FanDuel flagged nine different totals as <code>mainLine: true<\/code> on this fixture, from 0.5 through 8.5.<\/p>\n<p>So do not trust the flag on its own. Pick the line the most books quote, or the one priced nearest even money, and you get a comparable market across the field.<\/p>\n<h2>When does an EPL price become real?<\/h2>\n<p>This is where free historical odds earn their place. Pull the price history for the opener and you can watch the market being born.<\/p>\n<pre class=\"wp-block-code\"><code>def pinnacle_history(fixture_id, market_id, outcome_id):\n    r = requests.get(f\"{BASE_URL}\/historical-odds\", params={\n        \"apiKey\": API_KEY, \"fixtureId\": fixture_id, \"bookmakers\": \"pinnacle\"})\n    r.raise_for_status()\n    return (r.json()[\"bookmakers\"][\"pinnacle\"][\"markets\"][str(market_id)]\n            [\"outcomes\"][str(outcome_id)][\"players\"][\"0\"])\n\ndef max_win_base(price, limit):\n    \"\"\"Pinnacle publishes a max win. Recover the per-market base stake.\"\"\"\n    return limit if price >= 2 else limit * (price - 1)\n\nsnaps = pinnacle_history(FIXTURE, FULL_TIME_RESULT, HOME)\nseen = None\nfor s in snaps:\n    base = round(max_win_base(s[\"price\"], s[\"limit\"]))\n    if base != seen:\n        print(f\"{s['createdAt'][:16]}  price {s['price']}  base {base}\")\n        seen = base\n<\/code><\/pre>\n<pre class=\"wp-block-code\"><code>2026-06-19T10:09  price 1.135  base 250\n2026-07-30T06:32  price 1.152  base 500\n<\/code><\/pre>\n<p>Pinnacle posted Arsenal v Coventry on 19 June, 63 days before kick-off. Across 39 snapshots and six weeks the price crawled from 1.135 to 1.155, a move of under two percent. Then on 30 July the stake limit doubled.<\/p>\n<p>The price barely moved. The size the book will accept doubled. Pinnacle publishes a capped max win rather than a capped stake, so a base of 250 means it wanted no more than \u00a3250 of exposure per bet on the opening line, and a base of 500 means it now wants twice that. Newcastle v Liverpool and Fulham v Chelsea show the identical pattern: posted 19 June at a 250 base, sitting at 500 by the end of July.<\/p>\n<p>Compare that with a mid-season market. On the same afternoon, Pinnacle&#8217;s bases on three MLB games were 1,875, 3,750 and 3,750. A regular-season baseball game gets between four and fifteen times the exposure of the Premier League opener, because the baseball market has been shaped by real money and the EPL market has not.<\/p>\n<p>Two things follow for anyone modelling English football. Early-summer EPL prices are an opinion, not a consensus, so de-vigged fair values from them carry a wide error bar. And the limit ramp is a usable signal in its own right: when the base steps up, the book has decided the number is worth defending. Everything you need to chart it sits in the free tier, snapshot by snapshot, including the <code>limit<\/code> field.<\/p>\n<h2>Scanning the whole Premier League round<\/h2>\n<p>Put the pieces together and a round-wide scan is about twenty lines. Sleep a full second between calls to <code>\/odds<\/code>: the free tier rate-limits per endpoint and a 429 body is valid JSON, so code that only checks for <code>bookmakerOdds<\/code> reads a rate-limit as &#8220;no coverage&#8221;.<\/p>\n<pre class=\"wp-block-code\"><code>import time\n\ndef scan_round(start, end):\n    for f in epl_fixtures(start, end, 17):\n        if not f[\"hasOdds\"]:\n            continue\n        prices = board(f[\"fixtureId\"], FULL_TIME_RESULT, [HOME, DRAW, AWAY])\n        if \"pinnacle\" not in prices:\n            continue\n        independent, _ = dedupe(prices)\n        fair, margin = devig(prices[\"pinnacle\"])\n        print(f\"\\n{f['participant1Name']} v {f['participant2Name']} \"\n              f\"({len(independent)} independent books, Pinnacle {margin * 100:.2f}%)\")\n        for oid, label in [(HOME, \"home\"), (DRAW, \"draw\"), (AWAY, \"away\")]:\n            slug, price = best_price(independent, oid)\n            edge = (price * fair[oid] - 1) * 100\n            print(f\"  {label:5s} {price:>6} @ {slug:12s} \"\n                  f\"fair {1 \/ fair[oid]:>7.3f}  {edge:+.2f}%\")\n        time.sleep(1.0)\n\nscan_round(\"2026-08-23\", \"2026-09-01\")\n<\/code><\/pre>\n<pre class=\"wp-block-code\"><code>Manchester City v AFC Bournemouth (11 independent books, Pinnacle 5.74%)\n  home   1.455 @ caesars      fair   1.537  -5.37%\n  draw     5.1 @ fanduel      fair   5.298  -3.73%\n  away     6.5 @ ballybet     fair   6.218  +4.54%\n\nNewcastle United v Liverpool FC (10 independent books, Pinnacle 5.09%)\n  home    3.26 @ pinnacle     fair   3.426  -4.85%\n  draw     4.0 @ fanduel      fair   4.025  -0.62%\n  away    2.15 @ betmgm       fair   2.175  -1.17%\n<\/code><\/pre>\n<p>The <code>edge<\/code> column measures the best available price against one book&#8217;s de-vigged opinion, and most of it is negative. Across the four priced fixtures in that round, exactly one outcome cleared Pinnacle&#8217;s fair price. On a market with a 500 base that is a curiosity. In October, when the same market runs limits ten times higher and every book has been shaped by real money, the same scan is worth acting on.<\/p>\n<h2>What it costs<\/h2>\n<p>Nothing to start. The free tier covers 383 bookmakers across 69 sports, the full historical archive, and no card at signup. The same <code>fixtureId<\/code> pattern works for the <a href=\"https:\/\/oddspapi.io\/blog\/champions-league-odds-api\/\">Champions League<\/a>, the EFL, and every other competition in the catalogue.<\/p>\n<p>Stop maintaining fifteen scrapers. <a href=\"https:\/\/oddspapi.io\/blog\/free-odds-api-350-bookmakers\/\">Get your free API key<\/a> and pull the Premier League board in one call.<\/p>\n<h2>Where to go next<\/h2>\n<ul>\n<li><a href=\"https:\/\/oddspapi.io\/blog\/football-odds-api-soccer-data\/\">Football Odds API<\/a> for the wider soccer feed across 1,757 competitions.<\/li>\n<li><a href=\"https:\/\/oddspapi.io\/blog\/asian-handicap-api-cross-book-odds\/\">Asian Handicap API<\/a> to line-shop the handicap ladder across books.<\/li>\n<li><a href=\"https:\/\/oddspapi.io\/blog\/line-shopping-python-best-odds\/\">Line shopping in Python<\/a> for the reusable best-price helper.<\/li>\n<li><a href=\"https:\/\/oddspapi.io\/blog\/no-vig-odds-api\/\">No-vig odds<\/a> for the three ways to strip margin, and when each one is right.<\/li>\n<li><a href=\"https:\/\/oddspapi.io\/blog\/betting-limits-api-stake-sizing\/\">Betting limits API<\/a> for the full breakdown of Pinnacle&#8217;s max-win field and exchange depth.<\/li>\n<\/ul>\n<h2>FAQ<\/h2>\n<h3>Is there an official Premier League odds API?<\/h3>\n<p>No. The Premier League licenses broadcast and statistical rights, and no club or the league itself publishes betting prices. Odds come from bookmakers, and an aggregator like OddsPapi returns them from 383 books through one endpoint.<\/p>\n<h3>Which bookmakers price the Premier League on OddsPapi?<\/h3>\n<p>On the 2026\/27 opener, 15 books quoted the 1X2: Pinnacle and SBOBet as the sharps, plus Bet365, DraftKings, FanDuel, BetMGM, Caesars, William Hill, BetRivers, PointsBet, Hard Rock Bet, Borgata, BetParx, Ballybet and FourWinds. Four of those slugs duplicate another book&#8217;s prices, leaving 11 independent quotes.<\/p>\n<h3>Can I get Premier League Asian handicap odds?<\/h3>\n<p>Yes. Pinnacle walked nine handicap lines on the opener and DraftKings eight, each with its own market ID. Resolve them by name from <code>\/v4\/markets?sportId=10<\/code> and read the <code>handicap<\/code> field rather than hardcoding IDs, since a new line means a new ID.<\/p>\n<h3>Does the API cover Premier League corner markets?<\/h3>\n<p>Yes, with a depth caveat. The opener carried 61 corner markets including full-time totals, per-team counts, odd\/even and a corners 1X2. Seven bookmaker slugs price them, and those collapse to two or three independent quotes per line. No sharp book priced corners on that fixture.<\/p>\n<h3>How far back does free Premier League historical data go?<\/h3>\n<p><code>\/v4\/historical-odds<\/code> returns the full snapshot history for a fixture from the moment a book first posted it. Pinnacle&#8217;s price history on the 2026\/27 opener starts on 19 June, 63 days before kick-off, and each snapshot carries the price, the timestamp and the stake limit. It is on the free tier, capped at three bookmakers per call.<\/p>\n<p><script type=\"application\/ld+json\">\n{\n  \"@context\": \"https:\/\/schema.org\",\n  \"@type\": \"FAQPage\",\n  \"mainEntity\": [\n    {\"@type\":\"Question\",\"name\":\"Is there an official Premier League odds API?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"No. The Premier League licenses broadcast and statistical rights, and no club or the league itself publishes betting prices. Odds come from bookmakers, and an aggregator like OddsPapi returns them from 383 books through one endpoint.\"}},\n    {\"@type\":\"Question\",\"name\":\"Which bookmakers price the Premier League on OddsPapi?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"On the 2026\/27 opener, 15 books quoted the 1X2: Pinnacle and SBOBet as the sharps, plus Bet365, DraftKings, FanDuel, BetMGM, Caesars, William Hill, BetRivers, PointsBet, Hard Rock Bet, Borgata, BetParx, Ballybet and FourWinds. Four of those slugs duplicate another book's prices, leaving 11 independent quotes.\"}},\n    {\"@type\":\"Question\",\"name\":\"Can I get Premier League Asian handicap odds?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Yes. Pinnacle walked nine handicap lines on the opener and DraftKings eight, each with its own market ID. Resolve them by name from \/v4\/markets?sportId=10 and read the handicap field rather than hardcoding IDs, since a new line means a new ID.\"}},\n    {\"@type\":\"Question\",\"name\":\"Does the API cover Premier League corner markets?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Yes, with a depth caveat. The opener carried 61 corner markets including full-time totals, per-team counts, odd\/even and a corners 1X2. Seven bookmaker slugs price them, and those collapse to two or three independent quotes per line. No sharp book priced corners on that fixture.\"}},\n    {\"@type\":\"Question\",\"name\":\"How far back does free Premier League historical data go?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"\/v4\/historical-odds returns the full snapshot history for a fixture from the moment a book first posted it. Pinnacle's price history on the 2026\/27 opener starts on 19 June, 63 days before kick-off, and each snapshot carries the price, the timestamp and the stake limit. It is on the free tier, capped at three bookmakers per call.\"}}\n  ]\n}\n<\/script><\/p>\n<p><!--\nFocus Keyphrase: premier league odds api\nSEO Title: Premier League Odds API: Live EPL Prices, Handicaps & Corners\nMeta Description: Pull live Premier League odds from 15 bookmakers including Pinnacle and SBOBet. Python guide to EPL 1X2, Asian handicaps, corners and free historical data.\nSlug: premier-league-odds-api\n--><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Pull live Premier League odds from 15 bookmakers including Pinnacle and SBOBet. Python guide to EPL 1X2, Asian handicaps, corners and free historical data.<\/p>\n","protected":false},"author":2,"featured_media":3181,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7],"tags":[8,9,11,15,10],"class_list":["post-3180","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-how-to-guides","tag-free-api","tag-odds-api","tag-python","tag-soccer","tag-sports-betting-api"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.4 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Premier League Odds API: Live EPL Prices, Handicaps &amp; Corners | 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\/premier-league-odds-api\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Premier League Odds API: Live EPL Prices, Handicaps &amp; Corners | OddsPapi Blog\" \/>\n<meta property=\"og:description\" content=\"Pull live Premier League odds from 15 bookmakers including Pinnacle and SBOBet. Python guide to EPL 1X2, Asian handicaps, corners and free historical data.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/oddspapi.io\/blog\/premier-league-odds-api\/\" \/>\n<meta property=\"og:site_name\" content=\"OddsPapi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-08-12T10:00:00+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/08\/premier-league-odds-api-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\/premier-league-odds-api\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/premier-league-odds-api\/\"},\"author\":{\"name\":\"Odds API Writer\",\"@id\":\"https:\/\/oddspapi.io\/blog\/#\/schema\/person\/b6f21e649c4f556f0a95c23a0f1efa13\"},\"headline\":\"Premier League Odds API: Live EPL Prices, Handicaps &#038; Corners\",\"datePublished\":\"2026-08-12T10:00:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/premier-league-odds-api\/\"},\"wordCount\":1966,\"commentCount\":1,\"publisher\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/premier-league-odds-api\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/08\/premier-league-odds-api-scaled.webp\",\"keywords\":[\"Free API\",\"Odds API\",\"Python\",\"Soccer\",\"Sports Betting API\"],\"articleSection\":[\"How To Guides\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/oddspapi.io\/blog\/premier-league-odds-api\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/oddspapi.io\/blog\/premier-league-odds-api\/\",\"url\":\"https:\/\/oddspapi.io\/blog\/premier-league-odds-api\/\",\"name\":\"Premier League Odds API: Live EPL Prices, Handicaps & Corners | OddsPapi Blog\",\"isPartOf\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/premier-league-odds-api\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/premier-league-odds-api\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/08\/premier-league-odds-api-scaled.webp\",\"datePublished\":\"2026-08-12T10:00:00+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/premier-league-odds-api\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/oddspapi.io\/blog\/premier-league-odds-api\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/oddspapi.io\/blog\/premier-league-odds-api\/#primaryimage\",\"url\":\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/08\/premier-league-odds-api-scaled.webp\",\"contentUrl\":\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/08\/premier-league-odds-api-scaled.webp\",\"width\":2560,\"height\":1429,\"caption\":\"Premier League Odds API - OddsPapi API Blog\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/oddspapi.io\/blog\/premier-league-odds-api\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/oddspapi.io\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Premier League Odds API: Live EPL Prices, Handicaps &#038; Corners\"}]},{\"@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":"Premier League Odds API: Live EPL Prices, Handicaps & Corners | 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\/premier-league-odds-api\/","og_locale":"en_US","og_type":"article","og_title":"Premier League Odds API: Live EPL Prices, Handicaps & Corners | OddsPapi Blog","og_description":"Pull live Premier League odds from 15 bookmakers including Pinnacle and SBOBet. Python guide to EPL 1X2, Asian handicaps, corners and free historical data.","og_url":"https:\/\/oddspapi.io\/blog\/premier-league-odds-api\/","og_site_name":"OddsPapi Blog","article_published_time":"2026-08-12T10:00:00+00:00","og_image":[{"width":2560,"height":1429,"url":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/08\/premier-league-odds-api-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\/premier-league-odds-api\/#article","isPartOf":{"@id":"https:\/\/oddspapi.io\/blog\/premier-league-odds-api\/"},"author":{"name":"Odds API Writer","@id":"https:\/\/oddspapi.io\/blog\/#\/schema\/person\/b6f21e649c4f556f0a95c23a0f1efa13"},"headline":"Premier League Odds API: Live EPL Prices, Handicaps &#038; Corners","datePublished":"2026-08-12T10:00:00+00:00","mainEntityOfPage":{"@id":"https:\/\/oddspapi.io\/blog\/premier-league-odds-api\/"},"wordCount":1966,"commentCount":1,"publisher":{"@id":"https:\/\/oddspapi.io\/blog\/#organization"},"image":{"@id":"https:\/\/oddspapi.io\/blog\/premier-league-odds-api\/#primaryimage"},"thumbnailUrl":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/08\/premier-league-odds-api-scaled.webp","keywords":["Free API","Odds API","Python","Soccer","Sports Betting API"],"articleSection":["How To Guides"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/oddspapi.io\/blog\/premier-league-odds-api\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/oddspapi.io\/blog\/premier-league-odds-api\/","url":"https:\/\/oddspapi.io\/blog\/premier-league-odds-api\/","name":"Premier League Odds API: Live EPL Prices, Handicaps & Corners | OddsPapi Blog","isPartOf":{"@id":"https:\/\/oddspapi.io\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/oddspapi.io\/blog\/premier-league-odds-api\/#primaryimage"},"image":{"@id":"https:\/\/oddspapi.io\/blog\/premier-league-odds-api\/#primaryimage"},"thumbnailUrl":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/08\/premier-league-odds-api-scaled.webp","datePublished":"2026-08-12T10:00:00+00:00","breadcrumb":{"@id":"https:\/\/oddspapi.io\/blog\/premier-league-odds-api\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/oddspapi.io\/blog\/premier-league-odds-api\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/oddspapi.io\/blog\/premier-league-odds-api\/#primaryimage","url":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/08\/premier-league-odds-api-scaled.webp","contentUrl":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/08\/premier-league-odds-api-scaled.webp","width":2560,"height":1429,"caption":"Premier League Odds API - OddsPapi API Blog"},{"@type":"BreadcrumbList","@id":"https:\/\/oddspapi.io\/blog\/premier-league-odds-api\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/oddspapi.io\/blog\/"},{"@type":"ListItem","position":2,"name":"Premier League Odds API: Live EPL Prices, Handicaps &#038; Corners"}]},{"@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\/3180","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=3180"}],"version-history":[{"count":1,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/posts\/3180\/revisions"}],"predecessor-version":[{"id":3182,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/posts\/3180\/revisions\/3182"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/media\/3181"}],"wp:attachment":[{"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/media?parent=3180"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/categories?post=3180"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/tags?post=3180"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}