{"id":4129,"date":"2026-09-23T10:00:00","date_gmt":"2026-09-23T10:00:00","guid":{"rendered":"https:\/\/oddspapi.io\/blog\/?p=4129"},"modified":"2026-09-14T13:27:39","modified_gmt":"2026-09-14T13:27:39","slug":"nhl-regulation-overtime-markets","status":"publish","type":"post","link":"https:\/\/oddspapi.io\/blog\/nhl-regulation-overtime-markets\/","title":{"rendered":"NHL Odds API: Grade 118 Twin Markets on the 60-Minute Clock"},"content":{"rendered":"<p>You asked the NHL odds API for the &minus;1.5 puck line, got 139 bookmakers back, and the book you wanted was missing. It is on the board, under a different market ID.<\/p>\n<p>Ice hockey prices the same bet twice. Once for the 60 minutes of regulation, once for the final score after overtime and the shootout. The two versions carry different market IDs, and the bookmakers split across them. On the 29 September opener between the Carolina Hurricanes and the Florida Panthers, measured 14 September 2026 at 13:24 UTC, 139 books posted the regulation &minus;1.5 and 118 posted the overtime &minus;1.5. Only 76 posted both. Read one ID and you see two thirds of the board.<\/p>\n<p>This post maps the 118 twin markets in the ice-hockey catalogue, shows which flag tells them apart, and proves with settlement data that the two sides of a pair grade to opposite results.<\/p>\n<h2>Why One Market ID Per Bet Fails on Hockey<\/h2>\n<p>In soccer, the 1X2 is market 101 and that is the end of it. In hockey, the catalogue holds 745 market definitions for sport ID 15, and 118 of them exist as a matched pair. Handicap and <code>Handicap (incl. overtime and penalties)<\/code>. Total and <code>Total (incl. overtime and penalties)<\/code>. Both sides of every pair carry the same <code>handicap<\/code> value, so grouping on the line number merges two different bets into one.<\/p>\n<p>The <code>period<\/code> field on <code>\/v4\/markets<\/code> separates them:<\/p>\n<figure class=\"wp-block-table\">\n<table>\n<thead>\n<tr>\n<th><code>period<\/code><\/th>\n<th>Settles on<\/th>\n<th>Definitions<\/th>\n<th>Example<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>fulltime<\/code><\/td>\n<td>the score after 60 minutes<\/td>\n<td>127<\/td>\n<td>153 <code>Regular Time Result<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>result<\/code><\/td>\n<td>the final score, overtime and shootout included<\/td>\n<td>137<\/td>\n<td>151 <code>Winner (incl. overtime and penalties)<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>fulltime+overtime<\/code><\/td>\n<td>overtime, no shootout<\/td>\n<td>97<\/td>\n<td>152381 <code>Player Goals (incl. overtime)<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>p1<\/code> \/ <code>p2<\/code> \/ <code>p3<\/code><\/td>\n<td>one period<\/td>\n<td>383<\/td>\n<td>151278 <code>First Period Result<\/code><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>All 97 definitions under <code>fulltime+overtime<\/code> are player props. The game markets use <code>fulltime<\/code> and <code>result<\/code>.<\/p>\n<p>The pair at the top of the board shows what this costs you. Market 151 is the two-way moneyline most people mean by &#8220;NHL moneyline&#8221;, and it settles on the final score. Market 153 is <code>Regular Time Result<\/code>, a three-way with a live draw leg, and it settles at the end of the third period. On the opener, 198 bookmakers posted 151 and 196 posted 153.<\/p>\n<figure class=\"wp-block-table\">\n<table>\n<thead>\n<tr>\n<th><\/th>\n<th>The usual approach<\/th>\n<th>OddsPapi<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Puck line<\/td>\n<td>one endpoint, one line, one book<\/td>\n<td>two market IDs, 181 books on the opener<\/td>\n<\/tr>\n<tr>\n<td>Regulation vs overtime<\/td>\n<td>read the book&#8217;s rules page<\/td>\n<td><code>period<\/code> field on every market definition<\/td>\n<\/tr>\n<tr>\n<td>Grading<\/td>\n<td>rebuild it from a score feed<\/td>\n<td><code>\/v4\/settlements<\/code> returns WIN, LOSE or PUSH per outcome<\/td>\n<\/tr>\n<tr>\n<td>History<\/td>\n<td>paid add-on<\/td>\n<td>free on every plan, both sides of the pair<\/td>\n<\/tr>\n<tr>\n<td>Catalogue<\/td>\n<td>~40 books<\/td>\n<td>350+ feeds, 359 slugs verified 14 September 2026<\/td>\n<\/tr>\n<tr>\n<td>Market shapes<\/td>\n<td>moneyline, spread, total<\/td>\n<td>native handicap and total ladders, both clocks, player props<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<h2>Step 1: Find the Tournament and the Board<\/h2>\n<p>Auth is a query parameter. No headers, no OAuth dance.<\/p>\n<pre class=\"wp-block-code\"><code>import os, time, requests\n\nAPI_KEY = os.environ[\"ODDSPAPI_API_KEY\"]\nBASE_URL = \"https:\/\/api.oddspapi.io\/v4\"\n\n\ndef get(path, **params):\n    \"\"\"GET with a back-off. The odds endpoints allow 10 requests a second.\"\"\"\n    for attempt in range(5):\n        r = requests.get(f\"{BASE_URL}\/{path}\", params={\"apiKey\": API_KEY, **params})\n        if r.status_code == 200:\n            return r.json()\n        time.sleep(1.5 * (attempt + 1))\n    r.raise_for_status()\n\n\nsports = get(\"sports\")\nhockey = next(s for s in sports if s[\"sportName\"] == \"Ice Hockey\")\nprint(\"sportId\", hockey[\"sportId\"])\n\ntournaments = get(\"tournaments\", sportId=hockey[\"sportId\"])\nnhl = next(t for t in tournaments\n           if t[\"tournamentSlug\"] == \"nhl\" and t[\"categorySlug\"] == \"usa\")\nprint(\"tournamentId\", nhl[\"tournamentId\"])\n\nfixtures = get(\"fixtures\", sportId=hockey[\"sportId\"],\n               tournamentId=nhl[\"tournamentId\"],\n               **{\"from\": \"2026-09-14\", \"to\": \"2026-10-20\"})\npriced = [f for f in fixtures if f[\"hasOdds\"]]\nprint(f\"{len(priced)} of {len(fixtures)} fixtures carry a board\")\nprint(\"board runs\", priced[0][\"startTime\"][:10], \"to\", priced[-1][\"startTime\"][:10])<\/code><\/pre>\n<pre class=\"wp-block-code\"><code>sportId 15\ntournamentId 234\n82 of 139 fixtures carry a board\nboard runs 2026-09-29 to 2026-10-11<\/code><\/pre>\n<p>Ice hockey is sport ID 15 and the NHL is tournament ID 234. Filter on <code>categorySlug<\/code> as well as the slug: the catalogue holds two tournaments named <code>extraliga<\/code>, one Czech and one Slovak.<\/p>\n<p>82 of 139 fixtures carried a board on 14 September. The priced window opens on the 29 September season opener and ends 11 October, 27 days out, and the books extend it as the season runs. Check <code>hasOdds<\/code> before you queue a fixture for pricing, and remember that the flag says a board exists, not how deep it goes.<\/p>\n<h2>Step 2: Build the Twin Map<\/h2>\n<p><code>\/v4\/markets<\/code> ignores the <code>sportId<\/code> parameter and returns all 33,115 definitions, so filter client-side.<\/p>\n<pre class=\"wp-block-code\"><code>from collections import defaultdict\n\nSUFFIX = \" (incl. overtime and penalties)\"\n\ncatalogue = [m for m in get(\"markets\") if m[\"sportId\"] == 15]\nprint(f\"{len(catalogue)} ice-hockey market definitions\")\n\npairs = defaultdict(dict)\nfor m in catalogue:\n    name = m[\"marketName\"]\n    base = name[:-len(SUFFIX)] if name.endswith(SUFFIX) else name\n    clock = \"overtime\" if name.endswith(SUFFIX) else \"regulation\"\n    pairs[(base, m[\"handicap\"])][clock] = m[\"marketId\"]\n\ntwins = {k: v for k, v in pairs.items() if len(v) == 2}\nprint(f\"{len(twins)} markets ship as a regulation \/ overtime pair\")\n\nfor key in [(\"Handicap\", -1.5), (\"Total\", 6.5), (\"Team 1 Total\", 2.5)]:\n    print(f\"  {key[0]} {key[1]:>5}  \"\n          f\"regulation={twins[key]['regulation']:&lt;6} overtime={twins[key]['overtime']}\")<\/code><\/pre>\n<pre class=\"wp-block-code\"><code>745 ice-hockey market definitions\n118 markets ship as a regulation \/ overtime pair\n  Handicap  -1.5  regulation=1580   overtime=15228\n  Total   6.5  regulation=1530   overtime=15178\n  Team 1 Total   2.5  regulation=15274  overtime=15342<\/code><\/pre>\n<p>Eighteen base markets ship in pairs: Handicap, Total, European Handicap, Team 1 Total, Team 2 Total, Exact Goals, Correct Score, Odd Even, Both Teams To Score, First Goal, Last Goal, Winning Margin, the two Win To Nil markets, the two To Score markets and the two Team Exact Goals markets. Cache the map once per season and key your reader on <code>period<\/code> rather than on the market name, which spells the suffix out in full every time.<\/p>\n<h2>Step 3: Read Both Sides of the Puck Line<\/h2>\n<p>Count what one ID costs you on the opener between Carolina and Florida.<\/p>\n<pre class=\"wp-block-code\"><code>FIXTURE = \"id1500023472886402\"          # Carolina Hurricanes v Florida Panthers\nPUCK_LINE = {\"regulation\": \"1580\", \"overtime\": \"15228\"}   # both are -1.5\n\nboard = get(\"odds\", fixtureId=FIXTURE)[\"bookmakerOdds\"]\nprint(f\"{len(board)} bookmakers on the board\")\n\nposted = {\"regulation\": set(), \"overtime\": set()}\nfor slug, book in board.items():\n    if book.get(\"suspended\"):\n        continue\n    for clock, market_id in PUCK_LINE.items():\n        if market_id in book[\"markets\"]:\n            posted[clock].add(slug)\n\nunion = posted[\"regulation\"] | posted[\"overtime\"]\nprint(f\"regulation -1.5 (market 1580): {len(posted['regulation'])} books\")\nprint(f\"overtime   -1.5 (market 15228): {len(posted['overtime'])} books\")\nprint(f\"read both and you cover {len(union)} books, \"\n      f\"{len(posted['regulation'] &amp; posted['overtime'])} post both\")\n\nfor slug in [\"draftkings\", \"fanduel\", \"betmgm\", \"caesars\", \"bovada.lv\", \"stake\"]:\n    print(f\"  {slug:&lt;12} {[c for c in PUCK_LINE if slug in posted[c]]}\")<\/code><\/pre>\n<pre class=\"wp-block-code\"><code>220 bookmakers on the board\nregulation -1.5 (market 1580): 139 books\novertime   -1.5 (market 15228): 118 books\nread both and you cover 181 books, 76 post both\n  draftkings   ['regulation']\n  fanduel      ['regulation']\n  betmgm       ['regulation']\n  caesars      ['overtime']\n  bovada.lv    ['overtime']\n  stake        ['overtime']<\/code><\/pre>\n<p>DraftKings, FanDuel and BetMGM land on the regulation ID. Caesars, Bovada and Stake land on the overtime ID. bet365 and BetRivers post both. The 6.5 total splits the other way: 99 books on the regulation version, 119 on the overtime version, 185 across the two, and 33 posting both.<\/p>\n<p>The prices do not tell you which is which. Among the books that post both sides of the &minus;1.5, most copy one price into both IDs, so a price-level dedupe leaves the pair intact and your reader still has to branch on <code>period<\/code>. Pair this with the <a href=\"https:\/\/oddspapi.io\/blog\/line-shopping-python-best-odds\/\">line shopping walkthrough<\/a> and take the union before you rank anything.<\/p>\n<h2>Step 4: Rank the Board With the Liveness Flags On<\/h2>\n<p>A board opened a fortnight early carries a lot of parked prices. Three flags gate a quote, and the third one moves the leaderboard: <code>suspended<\/code> on the bookmaker, <code>active<\/code> on the price, and <code>marketActive<\/code> on the market row.<\/p>\n<pre class=\"wp-block-code\"><code>import statistics\nfrom collections import Counter\n\n\ndef quotes(board, market_id, legs, guarded=True):\n    \"\"\"One price tuple per bookmaker, with every liveness flag applied.\"\"\"\n    out = {}\n    for slug, book in board.items():\n        if guarded and (book.get(\"suspended\") or book.get(\"bookmakerIsActive\") is False):\n            continue\n        market = book[\"markets\"].get(market_id)\n        if not market:\n            continue\n        if guarded and market.get(\"marketActive\") is False:\n            continue\n        prices = []\n        for outcome in market[\"outcomes\"].values():\n            price = outcome[\"players\"].get(\"0\")\n            if not price or not price[\"price\"] or (guarded and not price[\"active\"]):\n                prices = []\n                break\n            prices.append(price[\"price\"])\n        if len(prices) == legs:\n            out[slug] = tuple(sorted(prices))\n    return out\n\n\ndef margin(prices):\n    return (sum(1 \/ p for p in prices) - 1) * 100\n\n\nfor market_id, legs, label in [(\"151\", 2, \"151 Winner, incl. overtime\"),\n                               (\"153\", 3, \"153 Regular Time Result\")]:\n    loose = quotes(board, market_id, legs, guarded=False)\n    tight = quotes(board, market_id, legs, guarded=True)\n    tuples = Counter(tight.values())\n    print(f\"\\n{label}\")\n    print(f\"  {len(loose)} unguarded quotes, {len(tight)} guarded\")\n    print(f\"  dedupe: {len(tight)} -&gt; {len(tuples)} distinct prices \"\n          f\"({(1 - len(tuples) \/ len(tight)) * 100:.1f}% collapse)\")\n    print(f\"  median margin {statistics.median(map(margin, loose.values())):.2f}% unguarded, \"\n          f\"{statistics.median(map(margin, tight.values())):.2f}% guarded\")\n    top = sorted(tight.items(), key=lambda kv: margin(kv[1]))[:3]\n    print(\"  tightest:\", [(s, f\"{margin(p):.2f}%\") for s, p in top])<\/code><\/pre>\n<pre class=\"wp-block-code\"><code>151 Winner, incl. overtime\n  198 unguarded quotes, 123 guarded\n  dedupe: 123 -> 29 distinct prices (76.4% collapse)\n  median margin 5.56% unguarded, 6.75% guarded\n  tightest: [('duel', '2.89%'), ('betmgm', '4.12%'), ('borgata', '4.12%')]\n\n153 Regular Time Result\n  180 unguarded quotes, 86 guarded\n  dedupe: 86 -> 20 distinct prices (76.7% collapse)\n  median margin 7.52% unguarded, 6.33% guarded\n  tightest: [('duel', '4.50%'), ('atg.se', '4.96%'), ('ballybet', '4.96%')]<\/code><\/pre>\n<p>Three things to take from that run. The guard drops market 151 from 198 quotes to 123, matching what the <a href=\"https:\/\/oddspapi.io\/blog\/nba-opening-night-odds-api\/\">NBA opening-night board<\/a> did on a board opened six weeks out. Without the guard, 1xBet tops market 151 at 3.11% on a price sitting inside a market row flagged <code>marketActive: false<\/code>; with it, Duel leads at 2.89%. And 123 quotes collapse to 29 distinct price tuples, with 28 slugs sharing 1.81 \/ 2.02, so dedupe on the tuple before you call anything a consensus. The <a href=\"https:\/\/oddspapi.io\/blog\/consensus-odds-fair-odds-calculator-python\/\">consensus calculator<\/a> does that step for you.<\/p>\n<p>The guard also moves the two markets relative to each other. Unguarded, the three-way reads 1.96 points wider than the two-way, which is what you expect from an extra leg. Guarded, the order reverses and 153 lands at 6.33% against 6.75% on 151, because the guard removes a different slice of books from each market. Rank the two separately. The <a href=\"https:\/\/oddspapi.io\/blog\/vig-calculator-python-sportsbook-margin\/\">vig calculator<\/a> covers the leg-count guard that keeps an incomplete three-way off the top of your table.<\/p>\n<p>Pinnacle and Kalshi post no price on this fixture. Pass <code>bookmakers=pinnacle<\/code> and the call returns HTTP 200 with the slug absent from <code>bookmakerOdds<\/code>, which is the feed telling you the book has not opened the fixture. A slug that does not exist returns HTTP 400 with <code>INVALID_PARAMETER<\/code> instead, so the two cases never look alike.<\/p>\n<h2>Step 5: Prove the Two Clocks With Settlement Data<\/h2>\n<p>Take the Philadelphia Flyers against the Boston Bruins on 5 April 2026. The fixture finished 1-1 after 60 minutes and 2-1 to Philadelphia in overtime. <code>\/v4\/scores<\/code> returns both scores under separate period keys, and <code>\/v4\/settlements<\/code> grades every outcome.<\/p>\n<pre class=\"wp-block-code\"><code>FIXTURE = \"id1500023462079036\"   # Philadelphia Flyers v Boston Bruins, 5 Apr 2026\n\nperiods = get(\"scores\", fixtureId=FIXTURE)[\"scores\"][\"periods\"]\nreg, final = periods[\"fulltime\"], periods[\"result\"]\nprint(f\"after 60 minutes {reg['participant1Score']}-{reg['participant2Score']}\"\n      f\" | final {final['participant1Score']}-{final['participant2Score']}\")\n\ngrid = get(\"settlements\", fixtureId=FIXTURE)[\"markets\"]\n\nLABELS = {\n    \"151\":   (\"Winner (incl. overtime and penalties)\", {\"151\": \"home\", \"152\": \"away\"}),\n    \"153\":   (\"Regular Time Result\", {\"153\": \"home\", \"154\": \"draw\", \"155\": \"away\"}),\n    \"1584\":  (\"Handicap -0.5, regulation\", {\"1584\": \"home -0.5\", \"1585\": \"away +0.5\"}),\n    \"15232\": (\"Handicap -0.5, incl. overtime\", {\"15232\": \"home -0.5\", \"15233\": \"away +0.5\"}),\n    \"1514\":  (\"Total 2.5, regulation\", {\"1514\": \"over\", \"1515\": \"under\"}),\n    \"15162\": (\"Total 2.5, incl. overtime\", {\"15162\": \"over\", \"15163\": \"under\"}),\n}\nfor market_id, (name, legs) in LABELS.items():\n    outcomes = grid[market_id][\"outcomes\"]\n    graded = {legs[o]: outcomes[o][\"players\"][\"0\"][\"result\"] for o in legs if o in outcomes}\n    print(f\"  {market_id:&lt;6} {name:&lt;34} {graded}\")<\/code><\/pre>\n<pre class=\"wp-block-code\"><code>after 60 minutes 1-1 | final 2-1\n  151    Winner (incl. overtime and penalties) {'home': 'WIN', 'away': 'LOSE'}\n  153    Regular Time Result                {'home': 'LOSE', 'draw': 'WIN', 'away': 'LOSE'}\n  1584   Handicap -0.5, regulation          {'home -0.5': 'LOSE', 'away +0.5': 'WIN'}\n  15232  Handicap -0.5, incl. overtime      {'home -0.5': 'WIN', 'away +0.5': 'LOSE'}\n  1514   Total 2.5, regulation              {'over': 'LOSE', 'under': 'WIN'}\n  15162  Total 2.5, incl. overtime          {'over': 'WIN', 'under': 'LOSE'}\n<\/code><\/pre>\n<p>Back Philadelphia on market 151 and you win. Back Philadelphia on market 153 and you lose to a draw leg, because the fixture was level when the third period ended. The same inversion runs through the &minus;0.5 handicap and the 2.5 total, on one fixture, for one participant.<\/p>\n<p>Run the comparison across the whole twin map and the pattern holds. On nine fixtures that went past regulation between 5 and 12 April 2026, 105 twin pairs graded on both IDs and exactly 11 pairs flipped on every one. On six fixtures decided in regulation, all 105 pairs agreed and nothing flipped.<\/p>\n<figure class=\"wp-block-table\">\n<table>\n<thead>\n<tr>\n<th>Fixture<\/th>\n<th>After 60<\/th>\n<th>Final<\/th>\n<th>Pairs graded<\/th>\n<th>Pairs flipped<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>SEA v CHI<\/td>\n<td>2-4<\/td>\n<td>2-4<\/td>\n<td>105<\/td>\n<td>0<\/td>\n<\/tr>\n<tr>\n<td>SJ v NSH<\/td>\n<td>3-6<\/td>\n<td>3-6<\/td>\n<td>105<\/td>\n<td>0<\/td>\n<\/tr>\n<tr>\n<td>EDM v VGK<\/td>\n<td>1-5<\/td>\n<td>1-5<\/td>\n<td>105<\/td>\n<td>0<\/td>\n<\/tr>\n<tr>\n<td>PHI v BOS<\/td>\n<td>1-1<\/td>\n<td>2-1<\/td>\n<td>105<\/td>\n<td>11<\/td>\n<\/tr>\n<tr>\n<td>LA v NSH<\/td>\n<td>2-2<\/td>\n<td>3-2<\/td>\n<td>105<\/td>\n<td>11<\/td>\n<\/tr>\n<tr>\n<td>DET v CBJ<\/td>\n<td>3-3<\/td>\n<td>3-4<\/td>\n<td>105<\/td>\n<td>11<\/td>\n<\/tr>\n<tr>\n<td>COL v VGK<\/td>\n<td>2-2<\/td>\n<td>2-3<\/td>\n<td>105<\/td>\n<td>11<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>Across 166 played NHL fixtures between 20 March and 12 April 2026, 32 went past regulation. At 19.3%, a grader that reads the wrong ID agrees with the book four times in five, then pays the wrong side on the fifth. That is the worst failure rate to debug, because the first 80% of your test set passes.<\/p>\n<h2>The Twin Split Reaches Into History Too<\/h2>\n<p>Historical odds are free on every plan, and the split survives into the archive. On that Philadelphia fixture, <code>\/v4\/historical-odds<\/code> returns 93 market IDs for Pinnacle, and Pinnacle holds both puck lines: 179 snapshots on the regulation &minus;1.5 and 322 on the overtime &minus;1.5. DraftKings holds 14 market IDs, of which 13 sit under <code>fulltime<\/code> and one under <code>result<\/code>. Caesars holds 52, split 5 regulation and 19 overtime plus the period markets. If you backtest a hockey model against one bookmaker&#8217;s archive, the ID it favours decides which clock your model learned.<\/p>\n<p>Pinnacle&#8217;s market 151 on that fixture opened at 1.724 \/ 2.22, nineteen hours before the puck dropped, and its last active snapshot read 1.806 \/ 2.06. The margin widened from 3.05% to 3.91% over that run while the home-leg limit climbed from 3,453 to 5,583. Its regulation &minus;1.5 carried no snapshot until 19:48:06, the minute play started, while the overtime &minus;1.5 had been running since the night before. The <a href=\"https:\/\/oddspapi.io\/blog\/backtest-betting-model-free-historical-odds\/\">backtesting guide<\/a> walks through pulling a full archive, and <a href=\"https:\/\/oddspapi.io\/blog\/how-many-bookmakers-backtest\/\">the 176-book study<\/a> covers how many feeds a backtest needs before the numbers settle.<\/p>\n<h2>Where This Fits Next to the Other Market-ID Traps<\/h2>\n<p>Three sports in this corpus ship one bet under several market IDs, and the fix differs each time.<\/p>\n<figure class=\"wp-block-table\">\n<table>\n<thead>\n<tr>\n<th>Sport<\/th>\n<th>Shape<\/th>\n<th>What to do<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><a href=\"https:\/\/oddspapi.io\/blog\/boxing-odds-api\/\">Boxing<\/a><\/td>\n<td>three IDs, one bet<\/td>\n<td>merge them<\/td>\n<\/tr>\n<tr>\n<td><a href=\"https:\/\/oddspapi.io\/blog\/afl-odds-api\/\">Aussie Rules<\/a><\/td>\n<td>two IDs, one result<\/td>\n<td>read both, then merge<\/td>\n<\/tr>\n<tr>\n<td><a href=\"https:\/\/oddspapi.io\/blog\/cs2-odds-api\/\">CS2<\/a><\/td>\n<td>15 IDs, one ladder<\/td>\n<td>split on the <code>handicap<\/code> field<\/td>\n<\/tr>\n<tr>\n<td><a href=\"https:\/\/oddspapi.io\/blog\/euroleague-basketball-odds-api\/\">EuroLeague<\/a><\/td>\n<td>two IDs, two bets<\/td>\n<td>keep them apart<\/td>\n<\/tr>\n<tr>\n<td>NHL<\/td>\n<td>118 pairs, two clocks<\/td>\n<td>branch on <code>period<\/code>, never merge<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>Hockey is the strictest of the five. Merging a pair here changes what the bet settles on, so treat the twin map as a branch, not a lookup.<\/p>\n<h2>Going Live<\/h2>\n<p>Polling a 220-book board every few seconds burns your request budget for nothing. The <a href=\"https:\/\/oddspapi.io\/blog\/websocket-odds-api-real-time-betting-data\/\">WebSocket feed<\/a> pushes each price change as it lands, and the same market IDs come down the socket, so the twin map you cached in step 2 still resolves in-play. For the broader NHL menu, including player props and the period markets, start with the <a href=\"https:\/\/oddspapi.io\/blog\/nhl-odds-api-puck-lines-player-props\/\">NHL odds API guide<\/a>.<\/p>\n<p>Every number above came off the live API on 14 September 2026. Re-measure before you trust any of it: the board grows week by week through October, and the bookmaker split moves with it.<\/p>\n<h2>Get Your Key<\/h2>\n<p>Stop reading bookmaker rules pages to work out which clock a line settles on. The <code>period<\/code> field says it, on all 745 ice-hockey market definitions, across a catalogue of 350+ bookmaker feeds that carries native handicap and total ladders rather than a flattened spread. Historical odds come with the free tier, and the WebSocket feed carries the same market IDs. <a href=\"https:\/\/oddspapi.io\/en\/sign-up\">Grab a free API key<\/a> and run the twin map against tonight&#8217;s board.<\/p>\n<h2>FAQ<\/h2>\n<h3>What is the difference between market 151 and market 153 in the NHL odds API?<\/h3>\n<p>Market 151 is <code>Winner (incl. overtime and penalties)<\/code>, a two-way moneyline that settles on the final score. Market 153 is <code>Regular Time Result<\/code>, a three-way with a draw leg that settles on the score after 60 minutes. On the 29 September opener, 198 bookmakers posted 151 and 196 posted 153.<\/p>\n<h3>How do I tell a regulation market from an overtime market?<\/h3>\n<p>Read the <code>period<\/code> field on the market definition from <code>\/v4\/markets<\/code>. <code>fulltime<\/code> means the bet settles on the 60-minute score, <code>result<\/code> means it settles on the final score including overtime and the shootout, and <code>fulltime+overtime<\/code> covers the player props that include overtime but not the shootout.<\/p>\n<h3>How many NHL bookmakers does OddsPapi carry?<\/h3>\n<p>The catalogue held 359 bookmaker slugs on 14 September 2026, 284 of them flagged for live odds. The Carolina against Florida opener carried 220 of them, with 181 posting a &minus;1.5 puck line once you read both market IDs.<\/p>\n<h3>Does the OddsPapi API grade hockey bets?<\/h3>\n<p><code>\/v4\/settlements<\/code> grades every outcome on a finished fixture, and it grades both sides of every twin pair. The April 2026 Philadelphia fixture returned a 634-market grid with 471 WIN, 477 LOSE, 47 PUSH and 445 UNDECIDED. <code>\/v4\/scores<\/code> returns the regulation score under <code>fulltime<\/code> and the final score under <code>result<\/code>, so you can check the grade yourself.<\/p>\n<h3>How often does an NHL fixture go past regulation?<\/h3>\n<p>32 of 166 played NHL fixtures between 20 March and 12 April 2026 finished after overtime or a shootout, which is 19.3%. On each of those fixtures, 11 of the 105 twin pairs that graded on both market IDs returned opposite results.<\/p>\n<h3>Is historical NHL odds data free?<\/h3>\n<p>Yes. <code>\/v4\/historical-odds<\/code> is on the free tier, and it keeps both sides of each twin pair. On a played April 2026 fixture, Pinnacle returned 93 market IDs with 179 snapshots on the regulation puck line and 322 on the overtime version.<\/p>\n<p><script type=\"application\/ld+json\">\n{\n  \"@context\": \"https:\/\/schema.org\",\n  \"@type\": \"FAQPage\",\n  \"mainEntity\": [\n    {\n      \"@type\": \"Question\",\n      \"name\": \"What is the difference between market 151 and market 153 in the NHL odds API?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Market 151 is Winner (incl. overtime and penalties), a two-way moneyline that settles on the final score. Market 153 is Regular Time Result, a three-way with a draw leg that settles on the score after 60 minutes. On the 29 September opener, 198 bookmakers posted 151 and 196 posted 153.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"How do I tell a regulation market from an overtime market?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Read the period field on the market definition from \/v4\/markets. fulltime means the bet settles on the 60-minute score, result means it settles on the final score including overtime and the shootout, and fulltime+overtime covers the player props that include overtime but not the shootout.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"How many NHL bookmakers does OddsPapi carry?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"The catalogue held 359 bookmaker slugs on 14 September 2026, 284 of them flagged for live odds. The Carolina against Florida opener carried 220 of them, with 181 posting a -1.5 puck line once you read both market IDs.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"Does the OddsPapi API grade hockey bets?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"\/v4\/settlements grades every outcome on a finished fixture, and it grades both sides of every twin pair. The April 2026 Philadelphia fixture returned a 634-market grid with 471 WIN, 477 LOSE, 47 PUSH and 445 UNDECIDED. \/v4\/scores returns the regulation score under fulltime and the final score under result, so you can check the grade yourself.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"How often does an NHL fixture go past regulation?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"32 of 166 played NHL fixtures between 20 March and 12 April 2026 finished after overtime or a shootout, which is 19.3%. On each of those fixtures, 11 of the 105 twin pairs that graded on both market IDs returned opposite results.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"Is historical NHL odds data free?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Yes. \/v4\/historical-odds is on the free tier, and it keeps both sides of each twin pair. On a played April 2026 fixture, Pinnacle returned 93 market IDs with 179 snapshots on the regulation puck line and 322 on the overtime version.\"\n      }\n    }\n  ]\n}\n<\/script><\/p>\n<p><!--\nFocus Keyphrase: NHL odds API\nSEO Title: NHL Odds API: Grade 118 Twin Markets on the 60-Minute Clock\nMeta Description: Every hockey handicap and total ships twice, once for regulation and once including overtime. On 9 overtime games, 11 pairs graded opposite ways.\nSlug: nhl-regulation-overtime-markets\n--><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Every hockey handicap and total ships twice, once for regulation and once including overtime. On 9 overtime games, 11 pairs graded opposite ways.<\/p>\n","protected":false},"author":2,"featured_media":4130,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7],"tags":[100,58,9,11,10],"class_list":["post-4129","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-how-to-guides","tag-ice-hockey","tag-nhl","tag-odds-api","tag-python","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>NHL Odds API: Grade 118 Twin Markets on the 60-Minute Clock | 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\/nhl-regulation-overtime-markets\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"NHL Odds API: Grade 118 Twin Markets on the 60-Minute Clock | OddsPapi Blog\" \/>\n<meta property=\"og:description\" content=\"Every hockey handicap and total ships twice, once for regulation and once including overtime. On 9 overtime games, 11 pairs graded opposite ways.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/oddspapi.io\/blog\/nhl-regulation-overtime-markets\/\" \/>\n<meta property=\"og:site_name\" content=\"OddsPapi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-09-23T10:00:00+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/09\/nhl-regulation-overtime-markets.webp\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"675\" \/>\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\/nhl-regulation-overtime-markets\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/nhl-regulation-overtime-markets\/\"},\"author\":{\"name\":\"Odds API Writer\",\"@id\":\"https:\/\/oddspapi.io\/blog\/#\/schema\/person\/b6f21e649c4f556f0a95c23a0f1efa13\"},\"headline\":\"NHL Odds API: Grade 118 Twin Markets on the 60-Minute Clock\",\"datePublished\":\"2026-09-23T10:00:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/nhl-regulation-overtime-markets\/\"},\"wordCount\":1883,\"commentCount\":1,\"publisher\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/nhl-regulation-overtime-markets\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/09\/nhl-regulation-overtime-markets.webp\",\"keywords\":[\"Ice Hockey\",\"NHL\",\"Odds API\",\"Python\",\"Sports Betting API\"],\"articleSection\":[\"How To Guides\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/oddspapi.io\/blog\/nhl-regulation-overtime-markets\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/oddspapi.io\/blog\/nhl-regulation-overtime-markets\/\",\"url\":\"https:\/\/oddspapi.io\/blog\/nhl-regulation-overtime-markets\/\",\"name\":\"NHL Odds API: Grade 118 Twin Markets on the 60-Minute Clock | OddsPapi Blog\",\"isPartOf\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/nhl-regulation-overtime-markets\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/nhl-regulation-overtime-markets\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/09\/nhl-regulation-overtime-markets.webp\",\"datePublished\":\"2026-09-23T10:00:00+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/nhl-regulation-overtime-markets\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/oddspapi.io\/blog\/nhl-regulation-overtime-markets\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/oddspapi.io\/blog\/nhl-regulation-overtime-markets\/#primaryimage\",\"url\":\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/09\/nhl-regulation-overtime-markets.webp\",\"contentUrl\":\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/09\/nhl-regulation-overtime-markets.webp\",\"width\":1200,\"height\":675,\"caption\":\"NHL odds API regulation and overtime market IDs\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/oddspapi.io\/blog\/nhl-regulation-overtime-markets\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/oddspapi.io\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"NHL Odds API: Grade 118 Twin Markets on the 60-Minute Clock\"}]},{\"@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":"NHL Odds API: Grade 118 Twin Markets on the 60-Minute Clock | 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\/nhl-regulation-overtime-markets\/","og_locale":"en_US","og_type":"article","og_title":"NHL Odds API: Grade 118 Twin Markets on the 60-Minute Clock | OddsPapi Blog","og_description":"Every hockey handicap and total ships twice, once for regulation and once including overtime. On 9 overtime games, 11 pairs graded opposite ways.","og_url":"https:\/\/oddspapi.io\/blog\/nhl-regulation-overtime-markets\/","og_site_name":"OddsPapi Blog","article_published_time":"2026-09-23T10:00:00+00:00","og_image":[{"width":1200,"height":675,"url":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/09\/nhl-regulation-overtime-markets.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\/nhl-regulation-overtime-markets\/#article","isPartOf":{"@id":"https:\/\/oddspapi.io\/blog\/nhl-regulation-overtime-markets\/"},"author":{"name":"Odds API Writer","@id":"https:\/\/oddspapi.io\/blog\/#\/schema\/person\/b6f21e649c4f556f0a95c23a0f1efa13"},"headline":"NHL Odds API: Grade 118 Twin Markets on the 60-Minute Clock","datePublished":"2026-09-23T10:00:00+00:00","mainEntityOfPage":{"@id":"https:\/\/oddspapi.io\/blog\/nhl-regulation-overtime-markets\/"},"wordCount":1883,"commentCount":1,"publisher":{"@id":"https:\/\/oddspapi.io\/blog\/#organization"},"image":{"@id":"https:\/\/oddspapi.io\/blog\/nhl-regulation-overtime-markets\/#primaryimage"},"thumbnailUrl":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/09\/nhl-regulation-overtime-markets.webp","keywords":["Ice Hockey","NHL","Odds API","Python","Sports Betting API"],"articleSection":["How To Guides"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/oddspapi.io\/blog\/nhl-regulation-overtime-markets\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/oddspapi.io\/blog\/nhl-regulation-overtime-markets\/","url":"https:\/\/oddspapi.io\/blog\/nhl-regulation-overtime-markets\/","name":"NHL Odds API: Grade 118 Twin Markets on the 60-Minute Clock | OddsPapi Blog","isPartOf":{"@id":"https:\/\/oddspapi.io\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/oddspapi.io\/blog\/nhl-regulation-overtime-markets\/#primaryimage"},"image":{"@id":"https:\/\/oddspapi.io\/blog\/nhl-regulation-overtime-markets\/#primaryimage"},"thumbnailUrl":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/09\/nhl-regulation-overtime-markets.webp","datePublished":"2026-09-23T10:00:00+00:00","breadcrumb":{"@id":"https:\/\/oddspapi.io\/blog\/nhl-regulation-overtime-markets\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/oddspapi.io\/blog\/nhl-regulation-overtime-markets\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/oddspapi.io\/blog\/nhl-regulation-overtime-markets\/#primaryimage","url":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/09\/nhl-regulation-overtime-markets.webp","contentUrl":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/09\/nhl-regulation-overtime-markets.webp","width":1200,"height":675,"caption":"NHL odds API regulation and overtime market IDs"},{"@type":"BreadcrumbList","@id":"https:\/\/oddspapi.io\/blog\/nhl-regulation-overtime-markets\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/oddspapi.io\/blog\/"},{"@type":"ListItem","position":2,"name":"NHL Odds API: Grade 118 Twin Markets on the 60-Minute Clock"}]},{"@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\/4129","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=4129"}],"version-history":[{"count":1,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/posts\/4129\/revisions"}],"predecessor-version":[{"id":4131,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/posts\/4129\/revisions\/4131"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/media\/4130"}],"wp:attachment":[{"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/media?parent=4129"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/categories?post=4129"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/tags?post=4129"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}