{"id":4779,"date":"2026-10-14T10:00:00","date_gmt":"2026-10-14T10:00:00","guid":{"rendered":"https:\/\/oddspapi.io\/blog\/?p=4779"},"modified":"2026-10-05T13:28:42","modified_gmt":"2026-10-05T13:28:42","slug":"prizepicks-api-odds-access","status":"publish","type":"post","link":"https:\/\/oddspapi.io\/blog\/prizepicks-api-odds-access\/","title":{"rendered":"PrizePicks API: 394 NFL Projection Lines Moved Before Kickoff"},"content":{"rendered":"<p>Does PrizePicks have an API? PrizePicks publishes no developer API. Its <a href=\"https:\/\/www.prizepicks.com\/resources\/prizepicks-payouts\">payout page<\/a> describes lineups and multipliers and documents no endpoint you can call (checked 5 October 2026).<\/p>\n<p>OddsPapi carries PrizePicks projections under one slug, <code>prizepicks<\/code>, in the same JSON as 350+ sportsbooks and exchanges. That puts each PrizePicks line next to the sportsbook prices for the same player and the same stat, and it keeps every snapshot after the fixture is played. We pulled that history for all 15 played NFL Week 5 fixtures: <strong>394 of 654 projections closed on a different line than they opened<\/strong>, and every pass-yards line moved. This guide shows you how to pull the lines, price them against the board and track them to kickoff.<\/p>\n<h2>Why every PrizePicks leg is priced at 1.73<\/h2>\n<p>PrizePicks is pick&#8217;em. You pick More or Less on a player&#8217;s projected stat, and the payout depends on how many picks you combine, not on the pick itself. So OddsPapi ships one flat price on every leg: <strong>1.73 on all 550,596 historical snapshots we read across the 15 Week 5 fixtures<\/strong>, and on every live leg we pulled. 1.73 is the square root of 3, and PrizePicks pays a 2-pick Power Play at 3x. The price stays still. The line moves.<\/p>\n<p>That changes how you read the feed. On a sportsbook you compare prices at one line. On PrizePicks you compare the line with the line the sportsbooks price at about 50\/50, and you ask what the sportsbooks think your side is worth at PrizePicks&#8217; number. Every Power Play leg must hit, so the break-even per leg is the multiplier&#8217;s root:<\/p>\n<figure class=\"wp-block-table\">\n<table>\n<thead>\n<tr>\n<th>Power Play size<\/th>\n<th>Payout (PrizePicks)<\/th>\n<th>Break-even per leg<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>2 picks<\/td>\n<td>3x<\/td>\n<td>57.7%<\/td>\n<\/tr>\n<tr>\n<td>3 picks<\/td>\n<td>6x<\/td>\n<td>55.0%<\/td>\n<\/tr>\n<tr>\n<td>4 picks<\/td>\n<td>10x<\/td>\n<td>56.2%<\/td>\n<\/tr>\n<tr>\n<td>5 picks<\/td>\n<td>20x<\/td>\n<td>54.9%<\/td>\n<\/tr>\n<tr>\n<td>6 picks<\/td>\n<td>37.5x<\/td>\n<td>54.7%<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>PrizePicks says that Demon, Goblin and other discounted projections change these rates, so check the payout page before you size a lineup. One more thing to know about the slug: the <code>prizepicks<\/code> row carries only <code>markets<\/code>. It has no <code>suspended<\/code>, <code>bookmakerIsActive<\/code> or <code>fixturePath<\/code> keys, because those states belong to standard odds. Read every book-level flag with <code>.get()<\/code>, or one PrizePicks row raises a <code>KeyError<\/code> in the middle of a board scan.<\/p>\n<figure class=\"wp-block-table\">\n<table>\n<thead>\n<tr>\n<th><\/th>\n<th>Scraping the PrizePicks app<\/th>\n<th>OddsPapi <code>prizepicks<\/code><\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Documentation<\/td>\n<td>None published<\/td>\n<td>Documented REST endpoints and one <code>apiKey<\/code> parameter<\/td>\n<\/tr>\n<tr>\n<td>Sportsbook prices for the same prop<\/td>\n<td>A second integration per book, plus your own player matching<\/td>\n<td>Same payload, same market ID, same player ID (291 books on Saints v Falcons)<\/td>\n<\/tr>\n<tr>\n<td>Line history<\/td>\n<td>Only what your own recorder saved<\/td>\n<td><code>\/v4\/historical-odds<\/code> on the free tier, from about six days before kickoff<\/td>\n<\/tr>\n<tr>\n<td>Deep link to the pick<\/td>\n<td>Build it yourself<\/td>\n<td><code>betslip<\/code> URL on linked legs (56 of 66 live legs on Saints v Falcons)<\/td>\n<\/tr>\n<tr>\n<td>Other sports and venues<\/td>\n<td>PrizePicks only<\/td>\n<td>350+ bookmakers, exchanges and prediction markets<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<h2>Where PrizePicks lines show up<\/h2>\n<p>On 5 October 2026 at 13:22 UTC we sampled up to four upcoming fixtures in four tournaments with <code>bookmakers=prizepicks<\/code>. All 13 carried PrizePicks projections:<\/p>\n<figure class=\"wp-block-table\">\n<table>\n<thead>\n<tr>\n<th>Tournament<\/th>\n<th>Fixtures with lines<\/th>\n<th>Projections per fixture<\/th>\n<th>Stats<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>NFL<\/td>\n<td>1 of 1<\/td>\n<td>33<\/td>\n<td>Pass, rush and receiving yards, receptions, attempts, longest rush and completion, sacks, kicking points<\/td>\n<\/tr>\n<tr>\n<td>MLB (postseason)<\/td>\n<td>4 of 4<\/td>\n<td>14 to 22<\/td>\n<td>Strikeouts, outs, hits allowed, earned runs, walks, hits, bases, singles, hits + runs + RBIs<\/td>\n<\/tr>\n<tr>\n<td>NHL<\/td>\n<td>4 of 4<\/td>\n<td>7 to 17<\/td>\n<td>Shots on goal, points, assists, blocks<\/td>\n<\/tr>\n<tr>\n<td>NBA Preseason<\/td>\n<td>4 of 4<\/td>\n<td>4 to 18<\/td>\n<td>Points, points + rebounds + assists<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>The NFL window held one fixture, Monday night&#8217;s Saints v Falcons. PrizePicks also listed player shots and goalkeeper saves on two UEFA Nations League fixtures that afternoon. In college football, Troy v Southern Miss carried five yardage projections.<\/p>\n<h2>Step 1: pull the PrizePicks projections for a fixture<\/h2>\n<p>Authentication is the <code>apiKey<\/code> query parameter. The helper waits out a 429 for as long as the error body says. One call to <code>\/v4\/markets<\/code> turns each market ID into a stat name and a line: on PrizePicks, as on every prop market, the line is the market&#8217;s <code>handicap<\/code>, and the player sits under the player&#8217;s ID, not under <code>\"0\"<\/code>. Save this file as <code>s1_projections.py<\/code>; the later steps import from it.<\/p>\n<pre class=\"wp-block-code\"><code>import os, time, requests\n\nAPI_KEY = os.environ[&quot;ODDSPAPI_API_KEY&quot;]\nBASE = &quot;https:\/\/api.oddspapi.io\/v4&quot;\n\ndef get(path, **params):\n    params[&quot;apiKey&quot;] = API_KEY\n    for _ in range(5):\n        r = requests.get(f&quot;{BASE}\/{path}&quot;, params=params, timeout=120)\n        if r.status_code == 429:  # the body says how long to wait\n            time.sleep(r.json()[&quot;error&quot;].get(&quot;retryMs&quot;, 1500) \/ 1000 + 0.2)\n            continue\n        r.raise_for_status()\n        return r.json()\n    raise RuntimeError(f&quot;{path} kept returning 429&quot;)\n\n# One catalogue call: market ID -&gt; name, line and outcome names\nMARKETS = {m[&quot;marketId&quot;]: m for m in get(&quot;markets&quot;)}\nOUTCOME = {o[&quot;outcomeId&quot;]: o[&quot;outcomeName&quot;] for m in MARKETS.values() for o in m[&quot;outcomes&quot;]}\n\ndef prizepicks_board(fixture_id):\n    data = get(&quot;odds&quot;, fixtureId=fixture_id, bookmakers=&quot;prizepicks&quot;)\n    book = data.get(&quot;bookmakerOdds&quot;, {}).get(&quot;prizepicks&quot;)\n    rows = []\n    if not book:\n        return rows\n    for market_id, market in book[&quot;markets&quot;].items():\n        meta = MARKETS[int(market_id)]\n        for outcome_id, outcome in market[&quot;outcomes&quot;].items():\n            for player_id, p in outcome[&quot;players&quot;].items():  # keyed by player ID, not &quot;0&quot;\n                rows.append({\n                    &quot;player_id&quot;: player_id,\n                    &quot;player&quot;: p[&quot;playerName&quot;],\n                    &quot;stat&quot;: meta[&quot;marketName&quot;],\n                    &quot;line&quot;: meta[&quot;handicap&quot;],\n                    &quot;side&quot;: OUTCOME[int(outcome_id)],\n                    &quot;price&quot;: p[&quot;price&quot;],\n                    &quot;active&quot;: p[&quot;active&quot;],\n                    &quot;betslip&quot;: p[&quot;betslip&quot;],\n                    &quot;changed&quot;: p[&quot;changedAt&quot;],\n                })\n    return rows\n\nif __name__ == &quot;__main__&quot;:\n    FIXTURE = os.environ.get(&quot;FIXTURE&quot;, &quot;id1400003171515870&quot;)  # Saints v Falcons, MNF Week 5\n    rows = prizepicks_board(FIXTURE)\n    live = [r for r in rows if r[&quot;active&quot;]]\n    print(f&quot;{len(rows)} legs, {len(live)} active, prices: {sorted({r[&#x27;price&#x27;] for r in rows})}&quot;)\n    print(f&quot;{sum(1 for r in live if r[&#x27;betslip&#x27;])} active legs carry a PrizePicks betslip link&quot;)\n    for r in sorted((r for r in live if r[&quot;side&quot;] == &quot;Over&quot; and r[&quot;betslip&quot;]),\n                    key=lambda r: -r[&quot;line&quot;])[:6]:\n        stat = r[&quot;stat&quot;].replace(&quot;Over Under Player &quot;, &quot;&quot;).replace(&quot; (incl. overtime)&quot;, &quot;&quot;)\n        print(f&quot;{r[&#x27;player&#x27;]:&lt;20} {stat:&lt;16} {r[&#x27;line&#x27;]:&gt;6}  {r[&#x27;betslip&#x27;]}&quot;)<\/code><\/pre>\n<pre class=\"wp-block-code\"><code>248 legs, 66 active, prices: [1.73]\n56 active legs carry a PrizePicks betslip link\nPenix, Michael       Pass Yards        224.5  https:\/\/app.prizepicks.com\/?projections=15266981-o-224.5\nRobinson, Bijan      Rush Yards         87.5  https:\/\/app.prizepicks.com\/?projections=15266980-o-87.5\nOlave, Chris         Receiving Yards    85.5  https:\/\/app.prizepicks.com\/?projections=15310642-o-85.5\nLondon, Drake        Receiving Yards    78.5  https:\/\/app.prizepicks.com\/?projections=15266983-o-78.5\nVele, Devaughn       Receiving Yards    44.5  https:\/\/app.prizepicks.com\/?projections=15310643-o-44.5\nRobinson, Bijan      Receiving Yards    39.5  https:\/\/app.prizepicks.com\/?projections=15266982-o-39.5<\/code><\/pre>\n<p>Read the <code>active<\/code> flag before anything else. The Saints v Falcons board held 248 PrizePicks legs and 66 of them were live: the rest are lines PrizePicks has already replaced. The <code>betslip<\/code> field opens the pick in the PrizePicks app, and the projection ID in it matches the one the app uses. Key on <code>player_id<\/code> rather than the name, because names arrive as &#8220;Last, First&#8221; for most players and &#8220;First Last&#8221; for some.<\/p>\n<p>This call is cheap. Filtered to <code>prizepicks<\/code>, the Monday-night board came back at 52 KB. The full board for the same fixture was 76.1 MB.<\/p>\n<h2>Step 2: find fixtures with PrizePicks lines<\/h2>\n<p>Probe the slug alone. A 200 with <code>prizepicks<\/code> missing means PrizePicks has not posted that fixture yet. Filter <code>\/v4\/fixtures<\/code> by <code>tournamentId<\/code> so you do not sample the KHL when you want the NHL.<\/p>\n<pre class=\"wp-block-code\"><code>import datetime as dt, time\nfrom s1_projections import get, prizepicks_board\n\n# (sportId, tournamentId): NFL, MLB, NHL, NBA Preseason\nTOURNAMENTS = {(14, 31): &quot;NFL&quot;, (13, 109): &quot;MLB&quot;, (15, 234): &quot;NHL&quot;, (11, 2382): &quot;NBA Preseason&quot;}\ntoday = dt.date.today()\nwindow = {&quot;from&quot;: today.isoformat(), &quot;to&quot;: (today + dt.timedelta(days=3)).isoformat()}\n\nfor (sport_id, tournament_id), name in TOURNAMENTS.items():\n    try:\n        fixtures = get(&quot;fixtures&quot;, sportId=sport_id, tournamentId=tournament_id, **window)\n        fixtures = [f for f in fixtures if f.get(&quot;hasOdds&quot;)]\n    except Exception:  # a 404 here means an empty window, not a failure\n        fixtures = []\n    time.sleep(1.0)\n    found = []\n    for f in fixtures[:4]:  # sample four fixtures a sport\n        live = [r for r in prizepicks_board(f[&quot;fixtureId&quot;]) if r[&quot;active&quot;]]\n        time.sleep(1.0)\n        if live:\n            found.append((f[&quot;participant1Name&quot;], f[&quot;participant2Name&quot;],\n                          len({(r[&quot;player_id&quot;], r[&quot;stat&quot;]) for r in live})))\n    print(f&quot;{name}: {len(found)} of {min(4, len(fixtures))} sampled fixtures carry PrizePicks lines&quot;)\n    for home, away, n in found:\n        print(f&quot;    {home} v {away}: {n} projections&quot;)<\/code><\/pre>\n<pre class=\"wp-block-code\"><code>NFL: 1 of 1 sampled fixtures carry PrizePicks lines\n    New Orleans Saints v Atlanta Falcons: 33 projections\nMLB: 4 of 4 sampled fixtures carry PrizePicks lines\n    Cleveland Guardians v Chicago White Sox: 20 projections\n    Tampa Bay Rays v New York Yankees: 14 projections\n    Atlanta Braves v Los Angeles Dodgers: 22 projections\n    San Diego Padres v Milwaukee Brewers: 19 projections\nNHL: 4 of 4 sampled fixtures carry PrizePicks lines\n    Tampa Bay Lightning v Philadelphia Flyers: 7 projections\n    Boston Bruins v Ottawa Senators: 17 projections\n    Pittsburgh Penguins v Winnipeg Jets: 12 projections\n    Dallas Stars v San Jose Sharks: 11 projections\nNBA Preseason: 4 of 4 sampled fixtures carry PrizePicks lines\n    Atlanta Hawks v Memphis Grizzlies: 4 projections\n    Detroit Pistons v Phoenix Suns: 8 projections\n    Philadelphia 76ers v New York Knicks: 18 projections\n    Milwaukee Bucks v Minnesota Timberwolves: 6 projections<\/code><\/pre>\n<h2>Step 3: price each PrizePicks line against the sportsbooks<\/h2>\n<p>Every prop market ID in the catalogue is one stat at one line. So when DraftKings, Caesars or bet365 quote the same market ID for the same player ID, they quote the exact bet PrizePicks offers. The screener below pulls the full board once, collects every two-way sportsbook quote at PrizePicks&#8217; line, drops duplicate price pairs (many slugs copy one feed), and removes the margin from each pair. The median of those no-vig numbers is the board&#8217;s probability for your side. Set <code>FIXTURE<\/code> to a fixture ID from Step 2.<\/p>\n<pre class=\"wp-block-code\"><code>import os, statistics\nfrom s1_projections import get, MARKETS, OUTCOME\n\n# PrizePicks Power Play payouts (prizepicks.com payout page): picks -&gt; multiplier.\n# Every leg must hit, so the per-leg break-even is (1 \/ multiplier) ** (1 \/ picks).\nPOWER_PLAY = {2: 3, 3: 6, 4: 10, 5: 20, 6: 37.5}\nBREAK_EVEN = {n: (1 \/ m) ** (1 \/ n) for n, m in POWER_PLAY.items()}\n\ndef screen(fixture_id, min_prices=3):\n    books = get(&quot;odds&quot;, fixtureId=fixture_id)[&quot;bookmakerOdds&quot;]  # full board, no filter\n    pp = books.get(&quot;prizepicks&quot;)\n    if not pp:  # PrizePicks has not posted this fixture\n        return []\n    results = []\n    for market_id, market in pp[&quot;markets&quot;].items():\n        outcome_ids = [str(o[&quot;outcomeId&quot;]) for o in MARKETS[int(market_id)][&quot;outcomes&quot;]]\n        for outcome_id, outcome in market[&quot;outcomes&quot;].items():\n            other = next(o for o in outcome_ids if o != outcome_id)\n            for player_id, leg in outcome[&quot;players&quot;].items():\n                if not leg[&quot;active&quot;]:\n                    continue\n                pairs = set()  # dedupe on the price tuple: many slugs copy one feed\n                for slug, book in books.items():\n                    if slug == &quot;prizepicks&quot; or book.get(&quot;suspended&quot;) or book.get(&quot;bookmakerIsActive&quot;) is False:\n                        continue\n                    m = book[&quot;markets&quot;].get(market_id)\n                    try:\n                        side = m[&quot;outcomes&quot;][outcome_id][&quot;players&quot;][player_id]\n                        opp = m[&quot;outcomes&quot;][other][&quot;players&quot;][player_id]\n                    except (TypeError, KeyError):\n                        continue\n                    if side[&quot;active&quot;] and opp[&quot;active&quot;]:\n                        pairs.add((side[&quot;price&quot;], opp[&quot;price&quot;]))\n                if len(pairs) &lt; min_prices:\n                    continue\n                fair = statistics.median((1 \/ a) \/ (1 \/ a + 1 \/ b) for a, b in pairs)\n                results.append((fair, leg[&quot;playerName&quot;], MARKETS[int(market_id)][&quot;marketName&quot;],\n                                MARKETS[int(market_id)][&quot;handicap&quot;], OUTCOME[int(outcome_id)], len(pairs)))\n    return sorted(results, reverse=True)\n\nif __name__ == &quot;__main__&quot;:\n    print(&quot;Power Play break-even per leg:&quot;, {n: f&quot;{p:.1%}&quot; for n, p in BREAK_EVEN.items()})\n    rows = screen(os.environ.get(&quot;FIXTURE&quot;, &quot;id1400003171515870&quot;))\n    print(f&quot;{len(rows)} PrizePicks legs priced by 3+ distinct sportsbook prices&quot;)\n    for fair, player, stat, line, side, n in rows[:6]:\n        stat = stat.replace(&quot;Over Under Player &quot;, &quot;&quot;).replace(&quot; (incl. overtime)&quot;, &quot;&quot;)\n        flag = &quot;clears 5-pick&quot; if fair &gt; BREAK_EVEN[5] else &quot;&quot;\n        print(f&quot;{fair:6.1%}  {player:&lt;18} {stat:&lt;18} {side:&lt;5} {line:&gt;6}  {n:&gt;2} prices  {flag}&quot;)<\/code><\/pre>\n<pre class=\"wp-block-code\"><code>Power Play break-even per leg: {2: &#x27;57.7%&#x27;, 3: &#x27;55.0%&#x27;, 4: &#x27;56.2%&#x27;, 5: &#x27;54.9%&#x27;, 6: &#x27;54.7%&#x27;}\n60 PrizePicks legs priced by 3+ distinct sportsbook prices\n 54.2%  Young, Chase       Sacks              Over     0.5   3 prices  \n 52.5%  Kamara, Alvin      Rush Attempts      Under   11.5  17 prices  \n 52.3%  Penix, Michael     Interceptions      Under    0.5  22 prices  \n 52.1%  Penix, Michael     Longest Rush Yards Under    5.5   6 prices  \n 51.6%  London, Drake      Receiving Yards    Over    78.5   6 prices  \n 51.4%  Shough, Tyler      Pass Completions   Over    23.5  21 prices<\/code><\/pre>\n<p>On Monday&#8217;s fixture, 60 live PrizePicks legs had three or more distinct sportsbook prices at the same line. The board rated the best of them at 54.2%, under the 54.9% you need on a 5-pick Power Play. PrizePicks lines sit where the sportsbook lines sit: at 13:10 UTC the PrizePicks line equalled the most common sportsbook main line on 55 of 55 MLB projections and 24 of 24 NHL projections. NFL yardage was looser, with 24 of 38 on the consensus line. Kendre Miller&#8217;s rush yards sat at 22.5 on PrizePicks, where the most common sportsbook main line was 26.5. Bijan Robinson&#8217;s sat at 87.5 against a most common 81.5. Even there the books that quoted PrizePicks&#8217; exact number priced it close to even, which tells you the books disagree with each other on that player too.<\/p>\n<p>The screener earns its keep when a line moves on one side and not the other. Run it on a timer, sort by probability, and alert when a leg clears the break-even for the lineup size you play. If you would rather get alerts than run your own script, <a href=\"https:\/\/jedibets.com\">JediBets<\/a> is a player-props screener that sends them to Discord. For the no-vig maths behind the median, see our <a href=\"https:\/\/oddspapi.io\/blog\/no-vig-odds-api\/\">three de-vig methods<\/a>, and for a weighted fair price across the whole board, see <a href=\"https:\/\/oddspapi.io\/blog\/consensus-odds-fair-odds-calculator-python\/\">consensus odds<\/a>.<\/p>\n<h2>Step 4: track PrizePicks line moves to kickoff<\/h2>\n<p>Because the price never changes, a line move on PrizePicks shows up as one market ID going inactive and another market ID going live for the same player. <code>\/v4\/historical-odds<\/code> keeps both. The function below takes the first line that went live and the line that was live at kickoff for each projection, then counts how often they differ across a week of played NFL fixtures. Played fixtures return no player names, so join names from a live Step 1 pull on <code>player_id<\/code> if you want to print them.<\/p>\n<pre class=\"wp-block-code\"><code>import time, collections, datetime as dt\nfrom s1_projections import get, MARKETS, OUTCOME\n\ndef ts(s):\n    return dt.datetime.fromisoformat(s.replace(&quot;Z&quot;, &quot;+00:00&quot;))\n\ndef open_and_close(fixture_id, kickoff):\n    &quot;&quot;&quot;PrizePicks prices every leg the same, so the line IS the price.\n    Return {(player_id, stat): (opening line, line live at kickoff)}.&quot;&quot;&quot;\n    hist = get(&quot;historical-odds&quot;, fixtureId=fixture_id, bookmakers=&quot;prizepicks&quot;)\n    lines = collections.defaultdict(dict)  # (player, stat) -&gt; line -&gt; (first active, last state)\n    for market_id, market in hist[&quot;bookmakers&quot;][&quot;prizepicks&quot;][&quot;markets&quot;].items():\n        meta = MARKETS[int(market_id)]\n        for outcome_id, outcome in market[&quot;outcomes&quot;].items():\n            if OUTCOME[int(outcome_id)] != &quot;Over&quot;:\n                continue\n            for player_id, snaps in outcome[&quot;players&quot;].items():\n                pre = sorted((ts(s[&quot;createdAt&quot;]), s[&quot;active&quot;]) for s in snaps if ts(s[&quot;createdAt&quot;]) &lt; kickoff)\n                first = [t for t, active in pre if active]\n                if first:\n                    lines[(player_id, meta[&quot;marketName&quot;])][meta[&quot;handicap&quot;]] = (first[0], pre[-1][1])\n    out = {}\n    for key, by_line in lines.items():\n        live = [line for line, (_, last) in by_line.items() if last]\n        if len(live) == 1:  # one live line at kickoff\n            opening = min((first, line) for line, (first, _) in by_line.items())[1]\n            out[key] = (opening, live[0])\n    return out\n\nif __name__ == &quot;__main__&quot;:\n    week = get(&quot;fixtures&quot;, sportId=14, tournamentId=31, **{&quot;from&quot;: &quot;2026-10-01&quot;, &quot;to&quot;: &quot;2026-10-06&quot;})\n    played = [f for f in week if f.get(&quot;statusName&quot;) == &quot;Finished&quot;]\n    moved, total = collections.Counter(), collections.Counter()\n    for f in played:\n        for (player, stat), (opening, closing) in open_and_close(f[&quot;fixtureId&quot;], ts(f[&quot;startTime&quot;])).items():\n            stat = stat.replace(&quot;Over Under Player &quot;, &quot;&quot;).replace(&quot; (incl. overtime)&quot;, &quot;&quot;)\n            total[stat] += 1\n            moved[stat] += opening != closing\n        time.sleep(4.6)  # \/historical-odds needs a longer cooldown\n    print(f&quot;{len(played)} played fixtures, {sum(total.values())} projections, &quot;\n          f&quot;{sum(moved.values())} closed on a different line than they opened&quot;)\n    for stat, n in total.most_common(8):\n        print(f&quot;  {stat:&lt;24} {moved[stat]:&gt;3} of {n:&lt;3} moved ({moved[stat] \/ n:.0%})&quot;)<\/code><\/pre>\n<pre class=\"wp-block-code\"><code>15 played fixtures, 654 projections, 394 closed on a different line than they opened\n  Receiving Yards          161 of 201 moved (80%)\n  Longest Rush Yards        59 of 84  moved (70%)\n  Rush Yards                63 of 69  moved (91%)\n  Receptions                 7 of 58  moved (12%)\n  Rush Attempts             16 of 42  moved (38%)\n  Tackles + Assists          3 of 34  moved (9%)\n  Longest Pass Completion   26 of 30  moved (87%)\n  Pass Yards                29 of 29  moved (100%)<\/code><\/pre>\n<p>Six in ten Week 5 projections closed somewhere other than where they opened. The median move was 2 units (yards, on most of them), the 90th percentile 7, and the largest a pass-yards line that went from 232.5 to 258.5 in Bengals v Jaguars. Yardage lines did most of the moving. Count stats held: receptions moved on 12% of projections and tackles + assists on 9%, where one unit is a large share of a 3.5 line.<\/p>\n<p>The history starts early. PrizePicks&#8217; first snapshot on these fixtures landed a median 6.0 days before kickoff, between 3.8 and 7.9 days. That gives you a week of line movement per fixture to test against, and a way to ask the useful question: when PrizePicks moved, had the sportsbooks moved first? Pull the same fixtures for <code>draftkings<\/code> or <code>pinnacle<\/code> (three slugs a call, and wait 4.6 seconds between calls) and line up the timestamps. Our <a href=\"https:\/\/oddspapi.io\/blog\/backtest-betting-model-free-historical-odds\/\">backtesting guide<\/a> covers the loop.<\/p>\n<p>For the prop markets themselves, our <a href=\"https:\/\/oddspapi.io\/blog\/nfl-player-props-api\/\">NFL player props guide<\/a> maps the yardage ladders the sportsbooks post, and the <a href=\"https:\/\/oddspapi.io\/blog\/mlb-player-props-api\/\">MLB player props guide<\/a> covers strikeouts, hits and home runs. For a one-page view of the slug, see the <a href=\"https:\/\/oddspapi.io\/sportsbooks\/prizepicks\">PrizePicks page<\/a>.<\/p>\n<h2>PrizePicks API FAQ<\/h2>\n<h3>Does PrizePicks have an API?<\/h3>\n<p>PrizePicks publishes no developer API for outside use. OddsPapi carries PrizePicks projections under the prizepicks slug, with the line, the player ID and a betslip link, next to 350+ sportsbooks and exchanges.<\/p>\n<h3>Why is every PrizePicks price 1.73?<\/h3>\n<p>PrizePicks pays on lineup size, not on the individual pick, so the feed ships one flat price. 1.73 is the square root of the 3x payout on a 2-pick Power Play. The line is the number that moves.<\/p>\n<h3>How do I get PrizePicks lines in Python?<\/h3>\n<p>Call \/v4\/odds with a fixtureId and bookmakers=prizepicks, passing your key as the apiKey query parameter. Each market ID maps to a stat and a line in \/v4\/markets, and each leg sits under the player&#8217;s ID.<\/p>\n<h3>Can I get historical PrizePicks lines?<\/h3>\n<p>Yes. \/v4\/historical-odds returns every PrizePicks snapshot on a played fixture. On 15 NFL Week 5 fixtures, 394 of 654 projections closed on a different line than they opened.<\/p>\n<h3>Which sports does the prizepicks slug cover?<\/h3>\n<p>On 5 October 2026 it carried projections on NFL, MLB, NHL and NBA Preseason fixtures, plus college football and UEFA Nations League player props.<\/p>\n<h2>Put PrizePicks lines next to the board<\/h2>\n<p>Every call in this guide runs on the free key: 350+ bookmakers in one schema, free historical odds for the line-move check, and a <a href=\"https:\/\/oddspapi.io\/blog\/websocket-odds-api-real-time-betting-data\/\">WebSocket feed<\/a> when polling is too slow. <a href=\"https:\/\/oddspapi.io\/en\/sign-up\">Get a free API key<\/a> and run Step 3 on this week&#8217;s NFL slate.<\/p>\n<p><script type=\"application\/ld+json\">\n{\n  \"@context\": \"https:\/\/schema.org\",\n  \"@type\": \"FAQPage\",\n  \"mainEntity\": [\n    {\"@type\": \"Question\", \"name\": \"Does PrizePicks have an API?\", \"acceptedAnswer\": {\"@type\": \"Answer\", \"text\": \"PrizePicks publishes no developer API for outside use. OddsPapi carries PrizePicks projections under the prizepicks slug, with the line, the player ID and a betslip link, next to 350+ sportsbooks and exchanges.\"}},\n    {\"@type\": \"Question\", \"name\": \"Why is every PrizePicks price 1.73?\", \"acceptedAnswer\": {\"@type\": \"Answer\", \"text\": \"PrizePicks pays on lineup size, not on the individual pick, so the feed ships one flat price. 1.73 is the square root of the 3x payout on a 2-pick Power Play. The line is the number that moves.\"}},\n    {\"@type\": \"Question\", \"name\": \"How do I get PrizePicks lines in Python?\", \"acceptedAnswer\": {\"@type\": \"Answer\", \"text\": \"Call \/v4\/odds with a fixtureId and bookmakers=prizepicks, passing your key as the apiKey query parameter. Each market ID maps to a stat and a line in \/v4\/markets, and each leg sits under the player's ID.\"}},\n    {\"@type\": \"Question\", \"name\": \"Can I get historical PrizePicks lines?\", \"acceptedAnswer\": {\"@type\": \"Answer\", \"text\": \"Yes. \/v4\/historical-odds returns every PrizePicks snapshot on a played fixture. On 15 NFL Week 5 fixtures, 394 of 654 projections closed on a different line than they opened.\"}},\n    {\"@type\": \"Question\", \"name\": \"Which sports does the prizepicks slug cover?\", \"acceptedAnswer\": {\"@type\": \"Answer\", \"text\": \"On 5 October 2026 it carried projections on NFL, MLB, NHL and NBA Preseason fixtures, plus college football and UEFA Nations League player props.\"}}\n  ]\n}\n<\/script><\/p>\n<p><!--\nFocus Keyphrase: prizepicks api\nSEO Title: PrizePicks API: 394 NFL Projection Lines Moved Before Kickoff\nMeta Description: PrizePicks API data ships every leg at 1.73, so the line is the price. Pass yards moved on 29 of 29 NFL Week 5 projections between posting and kickoff.\nSlug: prizepicks-api-odds-access\n--><\/p>\n","protected":false},"excerpt":{"rendered":"<p>PrizePicks API data ships every leg at 1.73, so the line is the price. Pass yards moved on 29 of 29 NFL Week 5 projections between posting and kickoff.<\/p>\n","protected":false},"author":2,"featured_media":4781,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7],"tags":[4,52,9,51,106,11,10],"class_list":["post-4779","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-how-to-guides","tag-historical-odds","tag-nfl","tag-odds-api","tag-player-props","tag-prizepicks","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>PrizePicks API: 394 NFL Projection Lines Moved Before Kickoff | 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\/prizepicks-api-odds-access\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"PrizePicks API: 394 NFL Projection Lines Moved Before Kickoff | OddsPapi Blog\" \/>\n<meta property=\"og:description\" content=\"PrizePicks API data ships every leg at 1.73, so the line is the price. Pass yards moved on 29 of 29 NFL Week 5 projections between posting and kickoff.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/oddspapi.io\/blog\/prizepicks-api-odds-access\/\" \/>\n<meta property=\"og:site_name\" content=\"OddsPapi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-10-14T10:00:00+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/10\/prizepicks-api-odds-access.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=\"16 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/oddspapi.io\/blog\/prizepicks-api-odds-access\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/prizepicks-api-odds-access\/\"},\"author\":{\"name\":\"Odds API Writer\",\"@id\":\"https:\/\/oddspapi.io\/blog\/#\/schema\/person\/b6f21e649c4f556f0a95c23a0f1efa13\"},\"headline\":\"PrizePicks API: 394 NFL Projection Lines Moved Before Kickoff\",\"datePublished\":\"2026-10-14T10:00:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/prizepicks-api-odds-access\/\"},\"wordCount\":1578,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/prizepicks-api-odds-access\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/10\/prizepicks-api-odds-access.webp\",\"keywords\":[\"historical odds\",\"NFL\",\"Odds API\",\"Player Props\",\"PrizePicks\",\"Python\",\"Sports Betting API\"],\"articleSection\":[\"How To Guides\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/oddspapi.io\/blog\/prizepicks-api-odds-access\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/oddspapi.io\/blog\/prizepicks-api-odds-access\/\",\"url\":\"https:\/\/oddspapi.io\/blog\/prizepicks-api-odds-access\/\",\"name\":\"PrizePicks API: 394 NFL Projection Lines Moved Before Kickoff | OddsPapi Blog\",\"isPartOf\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/prizepicks-api-odds-access\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/prizepicks-api-odds-access\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/10\/prizepicks-api-odds-access.webp\",\"datePublished\":\"2026-10-14T10:00:00+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/prizepicks-api-odds-access\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/oddspapi.io\/blog\/prizepicks-api-odds-access\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/oddspapi.io\/blog\/prizepicks-api-odds-access\/#primaryimage\",\"url\":\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/10\/prizepicks-api-odds-access.webp\",\"contentUrl\":\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/10\/prizepicks-api-odds-access.webp\",\"width\":1200,\"height\":675,\"caption\":\"PrizePicks API header image\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/oddspapi.io\/blog\/prizepicks-api-odds-access\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/oddspapi.io\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"PrizePicks API: 394 NFL Projection Lines Moved Before Kickoff\"}]},{\"@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":"PrizePicks API: 394 NFL Projection Lines Moved Before Kickoff | 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\/prizepicks-api-odds-access\/","og_locale":"en_US","og_type":"article","og_title":"PrizePicks API: 394 NFL Projection Lines Moved Before Kickoff | OddsPapi Blog","og_description":"PrizePicks API data ships every leg at 1.73, so the line is the price. Pass yards moved on 29 of 29 NFL Week 5 projections between posting and kickoff.","og_url":"https:\/\/oddspapi.io\/blog\/prizepicks-api-odds-access\/","og_site_name":"OddsPapi Blog","article_published_time":"2026-10-14T10:00:00+00:00","og_image":[{"width":1200,"height":675,"url":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/10\/prizepicks-api-odds-access.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":"16 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/oddspapi.io\/blog\/prizepicks-api-odds-access\/#article","isPartOf":{"@id":"https:\/\/oddspapi.io\/blog\/prizepicks-api-odds-access\/"},"author":{"name":"Odds API Writer","@id":"https:\/\/oddspapi.io\/blog\/#\/schema\/person\/b6f21e649c4f556f0a95c23a0f1efa13"},"headline":"PrizePicks API: 394 NFL Projection Lines Moved Before Kickoff","datePublished":"2026-10-14T10:00:00+00:00","mainEntityOfPage":{"@id":"https:\/\/oddspapi.io\/blog\/prizepicks-api-odds-access\/"},"wordCount":1578,"commentCount":0,"publisher":{"@id":"https:\/\/oddspapi.io\/blog\/#organization"},"image":{"@id":"https:\/\/oddspapi.io\/blog\/prizepicks-api-odds-access\/#primaryimage"},"thumbnailUrl":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/10\/prizepicks-api-odds-access.webp","keywords":["historical odds","NFL","Odds API","Player Props","PrizePicks","Python","Sports Betting API"],"articleSection":["How To Guides"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/oddspapi.io\/blog\/prizepicks-api-odds-access\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/oddspapi.io\/blog\/prizepicks-api-odds-access\/","url":"https:\/\/oddspapi.io\/blog\/prizepicks-api-odds-access\/","name":"PrizePicks API: 394 NFL Projection Lines Moved Before Kickoff | OddsPapi Blog","isPartOf":{"@id":"https:\/\/oddspapi.io\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/oddspapi.io\/blog\/prizepicks-api-odds-access\/#primaryimage"},"image":{"@id":"https:\/\/oddspapi.io\/blog\/prizepicks-api-odds-access\/#primaryimage"},"thumbnailUrl":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/10\/prizepicks-api-odds-access.webp","datePublished":"2026-10-14T10:00:00+00:00","breadcrumb":{"@id":"https:\/\/oddspapi.io\/blog\/prizepicks-api-odds-access\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/oddspapi.io\/blog\/prizepicks-api-odds-access\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/oddspapi.io\/blog\/prizepicks-api-odds-access\/#primaryimage","url":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/10\/prizepicks-api-odds-access.webp","contentUrl":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/10\/prizepicks-api-odds-access.webp","width":1200,"height":675,"caption":"PrizePicks API header image"},{"@type":"BreadcrumbList","@id":"https:\/\/oddspapi.io\/blog\/prizepicks-api-odds-access\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/oddspapi.io\/blog\/"},{"@type":"ListItem","position":2,"name":"PrizePicks API: 394 NFL Projection Lines Moved Before Kickoff"}]},{"@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\/4779","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=4779"}],"version-history":[{"count":2,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/posts\/4779\/revisions"}],"predecessor-version":[{"id":4782,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/posts\/4779\/revisions\/4782"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/media\/4781"}],"wp:attachment":[{"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/media?parent=4779"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/categories?post=4779"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/tags?post=4779"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}