{"id":3189,"date":"2026-08-17T10:00:00","date_gmt":"2026-08-17T10:00:00","guid":{"rendered":"https:\/\/oddspapi.io\/blog\/?p=3189"},"modified":"2026-08-29T15:03:04","modified_gmt":"2026-08-29T15:03:04","slug":"hard-rock-bet-api-odds-access","status":"publish","type":"post","link":"https:\/\/oddspapi.io\/blog\/hard-rock-bet-api-odds-access\/","title":{"rendered":"Hard Rock Bet API: Where Hard Rock Beats Pinnacle"},"content":{"rendered":"<p>Hard Rock Bet does not publish an API. There is no developer portal, no key request form, and no partner tier you can sign up for from a laptop. Search &#8220;Hard Rock Bet API&#8221; and you land on the sportsbook&#8217;s marketing site, an affiliate page, or a Reddit thread from someone who gave up.<\/p>\n<p>You can still get their prices. This guide pulls live Hard Rock Bet odds in Python through the OddsPapi aggregator, parses the moneyline, run line and pitcher strikeout ladder, and measures how Hard Rock&#8217;s margin compares against Pinnacle, DraftKings and the rest of the board. Every number below came off the live feed on 6 August 2026 and every code block was run before it was pasted here.<\/p>\n<h2>Why scraping Hard Rock is a dead end<\/h2>\n<p>The obvious approach is to point a scraper at the Hard Rock web client and read the odds out of whatever JSON the front end fetches. Three things break that plan.<\/p>\n<p>The client is geofenced. Hard Rock Bet operates in a handful of US states, so a request from the wrong IP gets a compliance wall instead of a price. The endpoints are also unversioned and undocumented, so a front-end release renames a field and your parser dies at 3am. And you end up with one book. A single price tells you nothing about whether it is any good, which is the entire reason you wanted it.<\/p>\n<figure class=\"wp-block-table\">\n<table>\n<thead>\n<tr>\n<th>Job<\/th>\n<th>Scraping Hard Rock directly<\/th>\n<th>OddsPapi<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Access<\/td>\n<td>Geofenced client, no docs<\/td>\n<td><code>?apiKey=<\/code> on a free key<\/td>\n<\/tr>\n<tr>\n<td>Books returned<\/td>\n<td>1<\/td>\n<td>348 in the catalogue, 14 to 18 on a live MLB game<\/td>\n<\/tr>\n<tr>\n<td>Schema<\/td>\n<td>Changes without notice<\/td>\n<td>Stable versioned JSON<\/td>\n<\/tr>\n<tr>\n<td>Sharp benchmark<\/td>\n<td>None<\/td>\n<td>Pinnacle and SBOBet in the same payload<\/td>\n<\/tr>\n<tr>\n<td>Price history<\/td>\n<td>Build your own store<\/td>\n<td><code>\/historical-odds<\/code>, free tier<\/td>\n<\/tr>\n<tr>\n<td>Maintenance<\/td>\n<td>Yours forever<\/td>\n<td>Ours<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<h2>Confirm the slug exists<\/h2>\n<p>Hard Rock Bet lives under the slug <code>hardrockbet<\/code>. Check it before you write anything else, because a slug typo produces an empty response rather than an error.<\/p>\n<pre class=\"wp-block-code\"><code>import requests, time\n\nAPI_KEY = \"YOUR_API_KEY\"\nBASE_URL = \"https:\/\/api.oddspapi.io\/v4\"\n\ndef op_get(path, **params):\n    \"\"\"Every OddsPapi call. apiKey is a query parameter, never a header.\"\"\"\n    params[\"apiKey\"] = API_KEY\n    for _ in range(5):\n        r = requests.get(f\"{BASE_URL}{path}\", params=params, timeout=60)\n        if r.status_code == 200:\n            return r.json()\n        wait = r.json().get(\"error\", {}).get(\"retryMs\", 1500) \/ 1000\n        time.sleep(wait + 0.5)\n    r.raise_for_status()\n\nbooks = op_get(\"\/bookmakers\")\nprint(len(books), \"bookmakers\")\nprint([b for b in books if b[\"slug\"] == \"hardrockbet\"])<\/code><\/pre>\n<pre class=\"wp-block-code\"><code>348 bookmakers\n[{'bookmakerName': 'Hard Rock Bet', 'slug': 'hardrockbet', 'liveOdds': True, 'cloneOf': None}]<\/code><\/pre>\n<p><code>liveOdds: True<\/code> means the feed is active. <code>cloneOf: None<\/code> means Hard Rock is priced independently rather than mirrored off another operator, which matters later when you dedupe the board.<\/p>\n<h3>Where Hard Rock actually shows up<\/h3>\n<p>We sampled fixtures across six sports on 6 August 2026 and recorded whether <code>hardrockbet<\/code> appeared in the payload.<\/p>\n<figure class=\"wp-block-table\">\n<table>\n<thead>\n<tr>\n<th>Sport<\/th>\n<th>Hard Rock present<\/th>\n<th>Notes<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Baseball (MLB)<\/td>\n<td>8 of 8 fixtures with a real board<\/td>\n<td>18 to 27 markets per game<\/td>\n<\/tr>\n<tr>\n<td>American Football<\/td>\n<td>5 of 5<\/td>\n<td>CFL and NFL Preseason, 15 to 16 books per game<\/td>\n<\/tr>\n<tr>\n<td>Soccer<\/td>\n<td>On the deep boards only<\/td>\n<td>EFL Cup 17 books, Primera Division 13 books; absent from lower-tier fixtures carrying 1 to 2 books<\/td>\n<\/tr>\n<tr>\n<td>Basketball<\/td>\n<td>Partial<\/td>\n<td>Present on VBA and Liga de Ascenso, absent from the international friendlies sampled<\/td>\n<\/tr>\n<tr>\n<td>Ice Hockey<\/td>\n<td>Thin<\/td>\n<td>Summer schedule only<\/td>\n<\/tr>\n<tr>\n<td>Tennis<\/td>\n<td>0 of 4<\/td>\n<td>No Hard Rock quotes on the ATP or WTA fixtures sampled<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>Treat Hard Rock as a US major-league book. If your model runs on tennis, look elsewhere.<\/p>\n<h2>Pull a live Hard Rock price<\/h2>\n<p>Two calls. Find a fixture, then ask for its odds. The response nests four levels deep, so index it deliberately.<\/p>\n<pre class=\"wp-block-code\"><code>fixtures = op_get(\"\/fixtures\", sportId=13, **{\"from\": \"2026-08-06\", \"to\": \"2026-08-08\"})\nlive = [f for f in fixtures if f.get(\"hasOdds\")]\nprint(len(live), \"MLB fixtures with odds\")\n\nFIXTURE = \"id1300010963303181\"   # Baltimore Orioles v Los Angeles Angels\nMONEYLINE = \"131\"                # Winner (incl. extra innings)\n\npayload = op_get(\"\/odds\", fixtureId=FIXTURE)\nhr = payload[\"bookmakerOdds\"][\"hardrockbet\"][\"markets\"][MONEYLINE][\"outcomes\"]\n\nhome = hr[\"131\"][\"players\"][\"0\"]\naway = hr[\"132\"][\"players\"][\"0\"]\nprint(\"Orioles\", home[\"price\"], home[\"priceAmerican\"], \"active\", home[\"active\"])\nprint(\"Angels \", away[\"price\"], away[\"priceAmerican\"], \"active\", away[\"active\"])<\/code><\/pre>\n<pre class=\"wp-block-code\"><code>59 MLB fixtures with odds\nOrioles 1.541 -185 active True\nAngels  2.75 175 active True<\/code><\/pre>\n<p>The feed pre-converts every price into decimal, American and fractional, so <code>priceAmerican<\/code> and <code>priceFractional<\/code> come back as strings alongside the decimal <code>price<\/code>. Skip the converter you were about to write. If you want the conversion math anyway, the <a href=\"https:\/\/oddspapi.io\/blog\/polymarket-odds-converter-python\/\">odds converter guide<\/a> covers all four formats including prediction-market shares.<\/p>\n<h2>Hard Rock&#8217;s margin, measured<\/h2>\n<p>A single price is not information. Run the same parse across every book on the fixture and compute the margin, which is how much the two-sided market overpays 100%.<\/p>\n<pre class=\"wp-block-code\"><code>def margin(prices):\n    return (sum(1 \/ p for p in prices) - 1) * 100\n\nrows = []\nfor slug, book in payload[\"bookmakerOdds\"].items():\n    market = book[\"markets\"].get(MONEYLINE)\n    if not market:\n        continue\n    outcomes = market[\"outcomes\"]\n    try:\n        h = outcomes[\"131\"][\"players\"][\"0\"]\n        a = outcomes[\"132\"][\"players\"][\"0\"]\n    except KeyError:\n        continue\n    if h[\"active\"] is False or a[\"active\"] is False:\n        continue\n    rows.append((margin([h[\"price\"], a[\"price\"]]), slug, h[\"price\"], a[\"price\"]))\n\nfor vig, slug, h, a in sorted(rows):\n    print(f\"{slug:20s} {h:6.3f} \/ {a:6.3f}   margin {vig:5.2f}%\")<\/code><\/pre>\n<pre class=\"wp-block-code\"><code>kalshi                1.538 \/  2.778   margin  1.02%\npolymarket            1.538 \/  2.778   margin  1.02%\nhardrockbet           1.541 \/  2.750   margin  1.26%\ndraftkings            1.575 \/  2.620   margin  1.66%\nfanduel               1.540 \/  2.700   margin  1.97%\npinnacle              1.534 \/  2.710   margin  2.09%\ncaesars               1.526 \/  2.700   margin  2.57%\nwilliamhill           1.526 \/  2.700   margin  2.57%\ncircasports           1.521 \/  2.710   margin  2.65%\nfourwinds             1.520 \/  2.600   margin  4.25%\npointsbet.com.au      1.500 \/  2.650   margin  4.40%\nbetmgm                1.570 \/  2.450   margin  4.51%\nborgata               1.550 \/  2.500   margin  4.52%\nbet365                1.480 \/  2.700   margin  4.60%<\/code><\/pre>\n<p>Hard Rock came third on that game, behind two prediction markets and ahead of every sportsbook on the board including Pinnacle. One fixture proves nothing, so we ran the same measurement across seven MLB games that afternoon.<\/p>\n<figure class=\"wp-block-table\">\n<table>\n<thead>\n<tr>\n<th>Book<\/th>\n<th>Median moneyline margin (market 131, 7 fixtures)<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>kalshi<\/td>\n<td>1.00%<\/td>\n<\/tr>\n<tr>\n<td>polymarket<\/td>\n<td>1.00%<\/td>\n<\/tr>\n<tr>\n<td>draftkings<\/td>\n<td>1.67%<\/td>\n<\/tr>\n<tr>\n<td><strong>hardrockbet<\/strong><\/td>\n<td><strong>1.98%<\/strong><\/td>\n<\/tr>\n<tr>\n<td>fanduel<\/td>\n<td>2.00%<\/td>\n<\/tr>\n<tr>\n<td>pinnacle<\/td>\n<td>2.02%<\/td>\n<\/tr>\n<tr>\n<td>caesars \/ williamhill<\/td>\n<td>2.26%<\/td>\n<\/tr>\n<tr>\n<td>circasports<\/td>\n<td>2.73%<\/td>\n<\/tr>\n<tr>\n<td>bet365<\/td>\n<td>4.65%<\/td>\n<\/tr>\n<tr>\n<td>betmgm<\/td>\n<td>4.70%<\/td>\n<\/tr>\n<tr>\n<td>sbobet<\/td>\n<td>6.79%<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>Then the main run line, the other market a US baseball bettor actually plays.<\/p>\n<figure class=\"wp-block-table\">\n<table>\n<thead>\n<tr>\n<th>Book<\/th>\n<th>Median margin, run line -1.5 (market 1368)<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>kalshi<\/td>\n<td>1.01%<\/td>\n<\/tr>\n<tr>\n<td>polymarket<\/td>\n<td>1.01%<\/td>\n<\/tr>\n<tr>\n<td><strong>hardrockbet<\/strong><\/td>\n<td><strong>2.26%<\/strong><\/td>\n<\/tr>\n<tr>\n<td>pinnacle<\/td>\n<td>2.70%<\/td>\n<\/tr>\n<tr>\n<td>circasports<\/td>\n<td>3.36%<\/td>\n<\/tr>\n<tr>\n<td>caesars \/ williamhill<\/td>\n<td>4.29%<\/td>\n<\/tr>\n<tr>\n<td>draftkings<\/td>\n<td>4.67%<\/td>\n<\/tr>\n<tr>\n<td>fanduel<\/td>\n<td>5.91%<\/td>\n<\/tr>\n<tr>\n<td>bet365<\/td>\n<td>6.89%<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>On the main run line Hard Rock was the tightest sportsbook in the field, and it beat DraftKings by more than two full points of margin.<\/p>\n<h3>The catch<\/h3>\n<p>Widen the sample to every two-sided line Hard Rock quoted on those seven games and the picture inverts. Their median margin on the moneyline and main run line together was 2.08% across 14 lines. On the alternate handicap ladder and the totals, across 58 lines, it was 7.45%.<\/p>\n<p>That is a 3.6x spread inside one book on one afternoon. Hard Rock prices the two markets most people actually bet at something close to a sharp number, then pads the derivatives. On the totals specifically their median margin was 7.45%, which put them next to Caesars at the bottom of the board while Pinnacle sat at 3.51%.<\/p>\n<p>The practical rule: shop Hard Rock for the moneyline and the main run line, and price your totals somewhere else. The <a href=\"https:\/\/oddspapi.io\/blog\/line-shopping-python-best-odds\/\">line shopping guide<\/a> generalises this into a scanner that checks every book on every outcome, and the <a href=\"https:\/\/oddspapi.io\/blog\/vig-calculator-python-sportsbook-margin\/\">vig calculator<\/a> walks through the margin math in more depth.<\/p>\n<h2>The trap that will break your parser<\/h2>\n<p>Hard Rock ships one-sided quotes. On the Orioles game they posted the Under on the 8.5 total with no Over, and the Over on 6.5 with no Under. Across the seven-fixture sample, 16 of their 88 lines carried a single active side.<\/p>\n<figure class=\"wp-block-table\">\n<table>\n<thead>\n<tr>\n<th>Book<\/th>\n<th>One-sided lines<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>hardrockbet<\/strong><\/td>\n<td><strong>16 of 88 (18.2%)<\/strong><\/td>\n<\/tr>\n<tr>\n<td>ballybet \/ betrivers \/ betparx<\/td>\n<td>12 of 100 (12.0%)<\/td>\n<\/tr>\n<tr>\n<td>bet365<\/td>\n<td>5 of 82 (6.1%)<\/td>\n<\/tr>\n<tr>\n<td>fanduel<\/td>\n<td>3 of 260 (1.2%)<\/td>\n<\/tr>\n<tr>\n<td>pinnacle, draftkings, caesars, kalshi<\/td>\n<td>0<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>You cannot compute a margin or de-vig a single side, and a naive best-price scan will happily hand you a Hard Rock Under with nothing to pair it against. Count the active outcomes before you do arithmetic.<\/p>\n<pre class=\"wp-block-code\"><code>def two_sided(market):\n    \"\"\"Return the two active prices, or None if the book only quoted one side.\"\"\"\n    quotes = []\n    for outcome in market[\"outcomes\"].values():\n        q = outcome[\"players\"].get(\"0\")\n        if q and q[\"active\"] is not False and q[\"price\"]:\n            quotes.append(q[\"price\"])\n    return quotes if len(quotes) == 2 else None<\/code><\/pre>\n<p>Note the <code>is not False<\/code> rather than a truthy check. The live feed sometimes ships <code>active: null<\/code> next to a perfectly good price on a pre-game fixture, and a truthy filter silently drops those.<\/p>\n<h2>Dedupe before you count opinions<\/h2>\n<p>Fourteen slugs on that fixture resolved to twelve distinct prices.<\/p>\n<pre class=\"wp-block-code\"><code>seen = {}\nfor _, slug, h, a in rows:\n    seen.setdefault((h, a), []).append(slug)\n\nprint(f\"{len(rows)} slugs -> {len(seen)} distinct prices\")\nfor price, slugs in seen.items():\n    if len(slugs) > 1:\n        print(\"  identical:\", slugs, price)<\/code><\/pre>\n<pre class=\"wp-block-code\"><code>14 slugs -> 12 distinct prices\n  identical: ['kalshi', 'polymarket'] (1.538, 2.778)\n  identical: ['caesars', 'williamhill'] (1.526, 2.7)<\/code><\/pre>\n<p>Caesars and William Hill run the same book in the US, and the catalogue flags that pair with <code>cloneOf<\/code>. Hard Rock is a different case worth knowing about: on two of the seven fixtures it landed on a moneyline byte-identical to Caesars and William Hill, and on the other five it moved independently. That is convergence rather than mirroring, but if you average a consensus without deduping the tuple first you will triple-weight one opinion on the games where they happen to agree. The <a href=\"https:\/\/oddspapi.io\/blog\/consensus-odds-fair-odds-calculator-python\/\">consensus odds guide<\/a> covers the weighting properly.<\/p>\n<h2>The strikeout ladder<\/h2>\n<p>Hard Rock quoted 24 markets on the Orioles fixture against DraftKings&#8217; 166, which reads like thin coverage until you look at what those 24 are. Eleven of them are a pitcher strikeout Over\/Under ladder running 0.5 through 10.5, priced for both starters.<\/p>\n<p>Player-prop markets key the <code>players<\/code> dict by player ID rather than the <code>\"0\"<\/code> used on game lines. Hardcode <code>players[\"0\"]<\/code> and every prop market looks empty.<\/p>\n<pre class=\"wp-block-code\"><code>catalog = op_get(\"\/markets\", sportId=13)\nnames = {m[\"marketId\"]: (m[\"marketName\"], m[\"handicap\"]) for m in catalog}\n\nhr_markets = payload[\"bookmakerOdds\"][\"hardrockbet\"][\"markets\"]\nfor mid, market in sorted(hr_markets.items(), key=lambda kv: int(kv[0])):\n    name, line = names.get(int(mid), (\"?\", \"?\"))\n    if \"Strikeouts\" not in name:\n        continue\n    for oid, outcome in market[\"outcomes\"].items():\n        for pid, quote in outcome[\"players\"].items():\n            if pid == \"0\":          # game-line placeholder, skip it\n                continue\n            print(f\"{quote['playerName']:18s} O\/U {line:<5} outcome {oid}  {quote['price']}\")<\/code><\/pre>\n<pre class=\"wp-block-code\"><code>Johnson, Ryan      O\/U 4.5   outcome 131621  2.0\nYoung, Brandon     O\/U 4.5   outcome 131621  1.556\nJohnson, Ryan      O\/U 4.5   outcome 131622  1.769\nYoung, Brandon     O\/U 4.5   outcome 131622  2.25\nJohnson, Ryan      O\/U 5.5   outcome 131623  3.1\nYoung, Brandon     O\/U 5.5   outcome 131623  2.2<\/code><\/pre>\n<p>Each rung of the ladder carries its own market ID, so resolve them by name from <code>\/markets<\/code> rather than pasting integers into your code. For the full batter and pitcher prop catalogue, the <a href=\"https:\/\/oddspapi.io\/blog\/mlb-player-props-api\/\">MLB player props guide<\/a> maps every market Hard Rock and the other US books price.<\/p>\n<h2>Free price history<\/h2>\n<p>Competitors charge for historical odds. <code>\/historical-odds<\/code> returns the full snapshot trail on the free tier, and Hard Rock is in it.<\/p>\n<p>Two things change shape versus the live endpoint. The top-level key is <code>bookmakers<\/code> rather than <code>bookmakerOdds<\/code>, and <code>players[\"0\"]<\/code> is a list of snapshots rather than a single dict. The call also accepts a maximum of three bookmakers.<\/p>\n<pre class=\"wp-block-code\"><code>history = op_get(\"\/historical-odds\", fixtureId=FIXTURE,\n                 bookmakers=\"hardrockbet,pinnacle\")\n\nfor slug, book in history[\"bookmakers\"].items():\n    snaps = book[\"markets\"][\"131\"][\"outcomes\"][\"131\"][\"players\"][\"0\"]\n    moves = [s for i, s in enumerate(snaps)\n             if i == 0 or s[\"price\"] != snaps[i - 1][\"price\"]]\n    print(f\"{slug}: {len(snaps)} snapshots, {len(moves)} price changes\")\n    for s in moves[:4]:\n        print(\"   \", s[\"createdAt\"][:19], s[\"price\"], \"limit\", s[\"limit\"])<\/code><\/pre>\n<pre class=\"wp-block-code\"><code>hardrockbet: 22 snapshots, 11 price changes\n    2026-08-05T21:25:45 1.645 limit None\n    2026-08-05T22:48:40 1.625 limit None\n    2026-08-06T03:34:20 1.645 limit None\n    2026-08-06T04:02:33 1.625 limit None\npinnacle: 26 snapshots, 19 price changes\n    2026-08-06T00:09:50 1.632 limit 2966\n    2026-08-06T03:34:02 1.636 limit 2948\n    2026-08-06T04:01:37 1.625 limit 3000\n    2026-08-06T04:10:03 1.617 limit 3038<\/code><\/pre>\n<p>Over the fifteen hours before first pitch Pinnacle walked the Orioles from 1.632 down to 1.523 and settled at 1.534. Hard Rock started at 1.645 and finished at 1.541. Both books landed within a tick of each other after eleven and nineteen repricings respectively, which tells you Hard Rock is trading the game rather than parking a line and walking away.<\/p>\n<p><code>limit<\/code> is null on every Hard Rock snapshot. Only Pinnacle and the exchanges publish stake limits, because US retail limits are set per account rather than per market. Null-check before you do arithmetic on it. The <a href=\"https:\/\/oddspapi.io\/blog\/betting-limits-api-stake-sizing\/\">betting limits guide<\/a> explains what Pinnacle's number actually represents.<\/p>\n<h2>De-vig Hard Rock against Pinnacle<\/h2>\n<p>Strip the margin from both books and compare what they actually think.<\/p>\n<pre class=\"wp-block-code\"><code>def devig_two_way(a, b):\n    total = 1 \/ a + 1 \/ b\n    return (1 \/ a) \/ total, (1 \/ b) \/ total\n\nfor slug in (\"hardrockbet\", \"pinnacle\"):\n    m = payload[\"bookmakerOdds\"][slug][\"markets\"][\"131\"][\"outcomes\"]\n    h = m[\"131\"][\"players\"][\"0\"][\"price\"]\n    a = m[\"132\"][\"players\"][\"0\"][\"price\"]\n    ph, pa = devig_two_way(h, a)\n    print(f\"{slug:12s} {h}\/{a} -> fair {1\/ph:.3f} \/ {1\/pa:.3f}  ({ph*100:.1f}% \/ {pa*100:.1f}%)\")<\/code><\/pre>\n<pre class=\"wp-block-code\"><code>hardrockbet  1.541\/2.75 -> fair 1.560 \/ 2.785  (64.1% \/ 35.9%)\npinnacle     1.534\/2.71 -> fair 1.566 \/ 2.767  (63.9% \/ 36.1%)<\/code><\/pre>\n<p>Hard Rock made the Orioles 64.1% to win. Pinnacle made them 63.9%. Two tenths of a point apart. The difference between the books on this game is margin, not opinion.<\/p>\n<p>Proportional de-vigging is the crude method and it overstates the favourite on lopsided markets. The <a href=\"https:\/\/oddspapi.io\/blog\/no-vig-odds-api\/\">no-vig guide<\/a> compares proportional, power and Shin against each other on live prices.<\/p>\n<h2>What you get on the free tier<\/h2>\n<p>The key in these examples is a free one. It covers 348 bookmakers, 69 sports, live odds, and the full historical snapshot trail. Rate limits apply per endpoint and return a real HTTP 429 with a <code>retryMs<\/code> value in the body, which the <code>op_get<\/code> helper above already honours. Sleep about a second between calls to the same endpoint and do not parallelise <code>\/odds<\/code> across fixtures, because concurrency at any worker count gets almost everything rate limited.<\/p>\n<h2>FAQ<\/h2>\n<h3>Does Hard Rock Bet have a public API?<\/h3>\n<p>No. Hard Rock Bet publishes no developer documentation, no API keys and no partner endpoint you can self-serve. Aggregating their prices through a third party is the only route that does not involve scraping a geofenced client.<\/p>\n<h3>Is scraping Hard Rock Bet legal?<\/h3>\n<p>Their terms prohibit automated access, and the client is geofenced to licensed states. This guide reads Hard Rock prices from an aggregator's licensed feed instead.<\/p>\n<h3>Which sports does Hard Rock Bet cover on OddsPapi?<\/h3>\n<p>MLB and American Football consistently, top-tier soccer competitions, and some basketball. Tennis returned no Hard Rock quotes across the fixtures sampled on 6 August 2026. Check the payload rather than assuming coverage.<\/p>\n<h3>Is Hard Rock Bet a sharp book?<\/h3>\n<p>On the moneyline and main run line their margins sat within a fifth of a point of Pinnacle across seven MLB fixtures. On the alternate ladder and totals their median margin was 7.45%, more than three times wider. They price the headline markets tightly and pad the rest.<\/p>\n<h3>Why does Hard Rock only show one side of some totals?<\/h3>\n<p>They post a single active outcome on roughly 18% of their lines. Check that a market has two active outcomes before computing a margin or calling it a best price.<\/p>\n<h3>Can I get historical Hard Rock odds?<\/h3>\n<p>Yes, on the free tier. Call <code>\/historical-odds<\/code> with <code>bookmakers=hardrockbet<\/code>. The response nests under <code>bookmakers<\/code> and each outcome holds a list of snapshots rather than a single price.<\/p>\n<h2>Get your key<\/h2>\n<p>Stop scraping a geofenced client for one book's opinion. <a href=\"https:\/\/oddspapi.io\/\">Grab a free OddsPapi key<\/a> and read Hard Rock alongside 347 other books in the same JSON response, with Pinnacle sitting right there as your benchmark.<\/p>\n<p>Start with the <a href=\"https:\/\/oddspapi.io\/blog\/free-odds-api-350-bookmakers\/\">free odds API overview<\/a> if this is your first call, or the <a href=\"https:\/\/oddspapi.io\/blog\/mlb-odds-api-run-lines-totals\/\">MLB odds API guide<\/a> for the full baseball market map.<\/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\": \"Does Hard Rock Bet have a public API?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"No. Hard Rock Bet publishes no developer documentation, no API keys and no partner endpoint you can self-serve. Aggregating their prices through a third party is the only route that does not involve scraping a geofenced client.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"Is scraping Hard Rock Bet legal?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Their terms prohibit automated access, and the client is geofenced to licensed states. Reading Hard Rock prices from an aggregator's licensed feed avoids the issue.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"Which sports does Hard Rock Bet cover on OddsPapi?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"MLB and American Football consistently, top-tier soccer competitions, and some basketball. Tennis returned no Hard Rock quotes across the fixtures sampled on 6 August 2026.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"Is Hard Rock Bet a sharp book?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"On the moneyline and main run line their margins sat within a fifth of a point of Pinnacle across seven MLB fixtures. On the alternate ladder and totals their median margin was 7.45%, more than three times wider.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"Why does Hard Rock only show one side of some totals?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"They post a single active outcome on roughly 18% of their lines. Check that a market has two active outcomes before computing a margin or calling it a best price.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"Can I get historical Hard Rock odds?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Yes, on the free tier. Call \/historical-odds with bookmakers=hardrockbet. The response nests under bookmakers and each outcome holds a list of snapshots rather than a single price.\"\n      }\n    }\n  ]\n}\n<\/script><\/p>\n<p><!--\nFocus Keyphrase: hard rock bet api\nSEO Title: Hard Rock Bet API: Access Hard Rock Odds in Python (No Official API)\nMeta Description: Hard Rock Bet has no public API. Pull their live odds in Python via OddsPapi, with a margin study showing where Hard Rock beats Pinnacle and where it doesn't.\nSlug: hard-rock-bet-api-odds-access\n--><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Hard Rock Bet beats Pinnacle on the moneyline and charges 7.45% across its alt ladder. The full margin study, with Python code to pull the prices.<\/p>\n","protected":false},"author":2,"featured_media":3190,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7],"tags":[8,82,9,11,10],"class_list":["post-3189","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-how-to-guides","tag-free-api","tag-hard-rock-bet","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>Hard Rock Bet API: Where Hard Rock Beats Pinnacle | 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\/hard-rock-bet-api-odds-access\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Hard Rock Bet API: Where Hard Rock Beats Pinnacle | OddsPapi Blog\" \/>\n<meta property=\"og:description\" content=\"Hard Rock Bet beats Pinnacle on the moneyline and charges 7.45% across its alt ladder. The full margin study, with Python code to pull the prices.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/oddspapi.io\/blog\/hard-rock-bet-api-odds-access\/\" \/>\n<meta property=\"og:site_name\" content=\"OddsPapi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-08-17T10:00:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-08-29T15:03:04+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/08\/hard-rock-bet-api-odds-access-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=\"10 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/oddspapi.io\/blog\/hard-rock-bet-api-odds-access\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/hard-rock-bet-api-odds-access\/\"},\"author\":{\"name\":\"Odds API Writer\",\"@id\":\"https:\/\/oddspapi.io\/blog\/#\/schema\/person\/b6f21e649c4f556f0a95c23a0f1efa13\"},\"headline\":\"Hard Rock Bet API: Where Hard Rock Beats Pinnacle\",\"datePublished\":\"2026-08-17T10:00:00+00:00\",\"dateModified\":\"2026-08-29T15:03:04+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/hard-rock-bet-api-odds-access\/\"},\"wordCount\":1796,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/hard-rock-bet-api-odds-access\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/08\/hard-rock-bet-api-odds-access-scaled.webp\",\"keywords\":[\"Free API\",\"Hard Rock Bet\",\"Odds API\",\"Python\",\"Sports Betting API\"],\"articleSection\":[\"How To Guides\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/oddspapi.io\/blog\/hard-rock-bet-api-odds-access\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/oddspapi.io\/blog\/hard-rock-bet-api-odds-access\/\",\"url\":\"https:\/\/oddspapi.io\/blog\/hard-rock-bet-api-odds-access\/\",\"name\":\"Hard Rock Bet API: Where Hard Rock Beats Pinnacle | OddsPapi Blog\",\"isPartOf\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/hard-rock-bet-api-odds-access\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/hard-rock-bet-api-odds-access\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/08\/hard-rock-bet-api-odds-access-scaled.webp\",\"datePublished\":\"2026-08-17T10:00:00+00:00\",\"dateModified\":\"2026-08-29T15:03:04+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/hard-rock-bet-api-odds-access\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/oddspapi.io\/blog\/hard-rock-bet-api-odds-access\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/oddspapi.io\/blog\/hard-rock-bet-api-odds-access\/#primaryimage\",\"url\":\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/08\/hard-rock-bet-api-odds-access-scaled.webp\",\"contentUrl\":\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/08\/hard-rock-bet-api-odds-access-scaled.webp\",\"width\":2560,\"height\":1429,\"caption\":\"Hard Rock Bet API - OddsPapi API Blog\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/oddspapi.io\/blog\/hard-rock-bet-api-odds-access\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/oddspapi.io\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Hard Rock Bet API: Where Hard Rock Beats Pinnacle\"}]},{\"@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":"Hard Rock Bet API: Where Hard Rock Beats Pinnacle | 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\/hard-rock-bet-api-odds-access\/","og_locale":"en_US","og_type":"article","og_title":"Hard Rock Bet API: Where Hard Rock Beats Pinnacle | OddsPapi Blog","og_description":"Hard Rock Bet beats Pinnacle on the moneyline and charges 7.45% across its alt ladder. The full margin study, with Python code to pull the prices.","og_url":"https:\/\/oddspapi.io\/blog\/hard-rock-bet-api-odds-access\/","og_site_name":"OddsPapi Blog","article_published_time":"2026-08-17T10:00:00+00:00","article_modified_time":"2026-08-29T15:03:04+00:00","og_image":[{"width":2560,"height":1429,"url":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/08\/hard-rock-bet-api-odds-access-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":"10 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/oddspapi.io\/blog\/hard-rock-bet-api-odds-access\/#article","isPartOf":{"@id":"https:\/\/oddspapi.io\/blog\/hard-rock-bet-api-odds-access\/"},"author":{"name":"Odds API Writer","@id":"https:\/\/oddspapi.io\/blog\/#\/schema\/person\/b6f21e649c4f556f0a95c23a0f1efa13"},"headline":"Hard Rock Bet API: Where Hard Rock Beats Pinnacle","datePublished":"2026-08-17T10:00:00+00:00","dateModified":"2026-08-29T15:03:04+00:00","mainEntityOfPage":{"@id":"https:\/\/oddspapi.io\/blog\/hard-rock-bet-api-odds-access\/"},"wordCount":1796,"commentCount":0,"publisher":{"@id":"https:\/\/oddspapi.io\/blog\/#organization"},"image":{"@id":"https:\/\/oddspapi.io\/blog\/hard-rock-bet-api-odds-access\/#primaryimage"},"thumbnailUrl":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/08\/hard-rock-bet-api-odds-access-scaled.webp","keywords":["Free API","Hard Rock Bet","Odds API","Python","Sports Betting API"],"articleSection":["How To Guides"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/oddspapi.io\/blog\/hard-rock-bet-api-odds-access\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/oddspapi.io\/blog\/hard-rock-bet-api-odds-access\/","url":"https:\/\/oddspapi.io\/blog\/hard-rock-bet-api-odds-access\/","name":"Hard Rock Bet API: Where Hard Rock Beats Pinnacle | OddsPapi Blog","isPartOf":{"@id":"https:\/\/oddspapi.io\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/oddspapi.io\/blog\/hard-rock-bet-api-odds-access\/#primaryimage"},"image":{"@id":"https:\/\/oddspapi.io\/blog\/hard-rock-bet-api-odds-access\/#primaryimage"},"thumbnailUrl":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/08\/hard-rock-bet-api-odds-access-scaled.webp","datePublished":"2026-08-17T10:00:00+00:00","dateModified":"2026-08-29T15:03:04+00:00","breadcrumb":{"@id":"https:\/\/oddspapi.io\/blog\/hard-rock-bet-api-odds-access\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/oddspapi.io\/blog\/hard-rock-bet-api-odds-access\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/oddspapi.io\/blog\/hard-rock-bet-api-odds-access\/#primaryimage","url":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/08\/hard-rock-bet-api-odds-access-scaled.webp","contentUrl":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/08\/hard-rock-bet-api-odds-access-scaled.webp","width":2560,"height":1429,"caption":"Hard Rock Bet API - OddsPapi API Blog"},{"@type":"BreadcrumbList","@id":"https:\/\/oddspapi.io\/blog\/hard-rock-bet-api-odds-access\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/oddspapi.io\/blog\/"},{"@type":"ListItem","position":2,"name":"Hard Rock Bet API: Where Hard Rock Beats Pinnacle"}]},{"@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\/3189","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=3189"}],"version-history":[{"count":3,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/posts\/3189\/revisions"}],"predecessor-version":[{"id":3857,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/posts\/3189\/revisions\/3857"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/media\/3190"}],"wp:attachment":[{"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/media?parent=3189"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/categories?post=3189"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/tags?post=3189"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}