{"id":4227,"date":"2026-09-25T10:00:00","date_gmt":"2026-09-25T10:00:00","guid":{"rendered":"https:\/\/oddspapi.io\/blog\/?p=4227"},"modified":"2026-09-17T13:21:45","modified_gmt":"2026-09-17T13:21:45","slug":"mlb-first-five-innings-odds-api","status":"publish","type":"post","link":"https:\/\/oddspapi.io\/blog\/mlb-first-five-innings-odds-api\/","title":{"rendered":"MLB Odds API: Price the First Five Innings Across 168 Books"},"content":{"rendered":"<p>You pull an MLB fixture from the OddsPapi <code>\/odds<\/code> endpoint, filter on market <code>131<\/code>, and you have the moneyline from 256 bookmakers. That price settles on the final score, extra innings included. The five-inning price that sharp bettors actually want sits on two other market IDs, and neither one of them is <code>131<\/code>.<\/p>\n<p>On Cincinnati Reds v Los Angeles Dodgers (<code>id1300010963303281<\/code>), measured 17 September 2026 at 13:38 UTC, the first-five board carried <strong>168 bookmakers<\/strong>. Forty of them posted it only as market <code>131256<\/code>. Another forty posted it only as market <code>131258<\/code>. Query one ID and you throw away a quarter of the board, including whichever book happens to be pricing it tightest.<\/p>\n<p>This guide shows you how to build the merged first-five board in Python, rank it, and prove which clock each market settles on using the free <code>\/settlements<\/code> endpoint.<\/p>\n<h2>Why the Usual Approach Misses Half the Board<\/h2>\n<p>Most odds feeds hand you a flat list of markets with a label on each one and leave the rest to you. Three habits break on baseball.<\/p>\n<p><strong>Hardcoding a market ID.<\/strong> Baseball ships 794 market definitions in the OddsPapi catalogue. The same bet appears under more than one ID, and the second ID is never the one you found first.<\/p>\n<p><strong>Matching on the market name.<\/strong> The catalogue names are honest here: <em>Winner First To Fifth Inning<\/em> and <em>First To Fifth Inning Result<\/em> both say what they cover. A substring match on &#8220;First To Fifth Inning&#8221; catches both, and it also catches the other 148 definitions that share the phrase, most of them handicap and total rungs. It still tells you nothing about which of the two carries a tie leg.<\/p>\n<p><strong>Trusting <code>hasOdds<\/code>.<\/strong> That flag says a board exists. It says nothing about which markets the books opened. Probe <code>\/odds<\/code> before you commit.<\/p>\n<p>The field that actually separates the clocks is <code>period<\/code>. Every baseball market definition carries one, and the values are literal inning ranges.<\/p>\n<figure class=\"wp-block-table\">\n<table>\n<thead>\n<tr>\n<th>Approach<\/th>\n<th>What You Get<\/th>\n<th>Cost<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Scrape a single sportsbook<\/td>\n<td>One book&#8217;s menu, one shape, blocked within a week<\/td>\n<td>Free, then broken<\/td>\n<\/tr>\n<tr>\n<td>Generic odds API<\/td>\n<td>Full-game moneylines from ~20 books, no inning splits<\/td>\n<td>$99+\/month<\/td>\n<\/tr>\n<tr>\n<td>Enterprise feed<\/td>\n<td>Everything, after a sales call and an annual contract<\/td>\n<td>Quote on request<\/td>\n<\/tr>\n<tr>\n<td>OddsPapi free tier<\/td>\n<td>350+ bookmakers, every inning period, free historical odds, WebSocket push<\/td>\n<td>$0<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<h2>Step 1: Read the Baseball Market Map<\/h2>\n<p>Authentication is a query parameter. There is no header and no OAuth dance.<\/p>\n<pre class=\"wp-block-code\"><code>import os, requests, collections\n\nAPI_KEY = os.environ[\"ODDSPAPI_API_KEY\"]\nBASE = \"https:\/\/api.oddspapi.io\/v4\"\nBASEBALL = 13\n\nmarkets = requests.get(f\"{BASE}\/markets\", params={\"apiKey\": API_KEY}).json()\nbaseball = [m for m in markets if m[\"sportId\"] == BASEBALL]\n\nby_period = collections.Counter(m[\"period\"] for m in baseball)\nprint(f\"{len(baseball)} baseball market definitions\")\nfor period, n in by_period.most_common():\n    print(f\"  {str(period):&lt;24} {n}\")\n<\/code><\/pre>\n<p>Run it and the sport&#8217;s whole structure falls out:<\/p>\n<pre class=\"wp-block-code\"><code>794 baseball market definitions\n  result                   258\n  p1+p2+p3+p4+p5           150\n  p6+p7+p8+p9+overtime     150\n  p1                       26\n  p2                       26\n  ...\n  fulltime                 1\n  None                     1\n<\/code><\/pre>\n<p><code>\/markets<\/code> ignores the <code>sportId<\/code> parameter and returns all 33,115 definitions across every sport, so filter client-side. That is the same behaviour documented for basketball and it has not changed.<\/p>\n<p>Four of those definitions answer &#8220;who wins&#8221;. Print them:<\/p>\n<pre class=\"wp-block-code\"><code>for m in baseball:\n    if m[\"marketType\"] in (\"moneyline\", \"1x2\") and m[\"period\"] in (\n            \"result\", \"fulltime\", \"p1+p2+p3+p4+p5\"):\n        legs = \"\/\".join(o[\"outcomeName\"] for o in m[\"outcomes\"])\n        print(f\"{m['marketId']:&gt;7}  {m['marketName']:&lt;42} \"\n              f\"period={m['period']:&lt;18} legs={legs}\")\n<\/code><\/pre>\n<pre class=\"wp-block-code\"><code>    131  Winner (incl. extra innings)               period=result             legs=2\/1\n    133  Regular Time Result                        period=fulltime           legs=X\/2\/1\n 131256  Winner First To Fifth Inning               period=p1+p2+p3+p4+p5     legs=2\/1\n 131258  First To Fifth Inning Result               period=p1+p2+p3+p4+p5     legs=2\/1\/X\n<\/code><\/pre>\n<p>Look at the leg order. Market <code>131<\/code> lists the away leg first, <code>133<\/code> leads with the tie, <code>131258<\/code> puts the tie last. Match on <code>outcomeName<\/code> and never on array position. Baseball also reuses market IDs as outcome IDs, so market <code>131256<\/code> owns outcome <code>131256<\/code>. Keep the pair as a tuple rather than keying a dict on a bare integer.<\/p>\n<h2>Step 2: Merge the Two First-Five IDs Into One Board<\/h2>\n<p>The resolver reads both IDs and returns one board keyed by bookmaker slug. Four guards run on every read: the book-level <code>suspended<\/code> flag, the market-level <code>marketActive<\/code> flag, the price-level <code>active<\/code> flag, and a leg count.<\/p>\n<pre class=\"wp-block-code\"><code>F5_TWO_WAY = 131256    # Winner First To Fifth Inning\nF5_THREE_WAY = 131258  # First To Fifth Inning Result\n\nLEGS = {\n    F5_TWO_WAY:   {\"131256\": \"1\", \"131257\": \"2\"},\n    F5_THREE_WAY: {\"131258\": \"1\", \"131259\": \"X\", \"131260\": \"2\"},\n}\n\ndef read_market(book, market_id):\n    \"\"\"Return {leg_name: price} for one book, or None if a guard fails.\"\"\"\n    market = book[\"markets\"].get(str(market_id))\n    if market is None or not market.get(\"marketActive\"):\n        return None\n    if book.get(\"suspended\"):\n        return None\n    legs = {}\n    for outcome_id, outcome in market[\"outcomes\"].items():\n        price = outcome[\"players\"].get(\"0\")\n        if price is None or not price[\"active\"]:\n            return None\n        legs[LEGS[market_id][outcome_id]] = price[\"price\"]\n    if len(legs) != len(LEGS[market_id]):\n        return None\n    return legs\n\ndef f5_board(fixture_id):\n    payload = requests.get(f\"{BASE}\/odds\",\n                           params={\"apiKey\": API_KEY,\n                                   \"fixtureId\": fixture_id}).json()\n    board = {}\n    for slug, book in payload.get(\"bookmakerOdds\", {}).items():\n        two = read_market(book, F5_TWO_WAY)\n        three = read_market(book, F5_THREE_WAY)\n        if two:\n            board.setdefault(slug, {})[\"two_way\"] = two\n        if three:\n            board.setdefault(slug, {})[\"three_way\"] = three\n    return board\n\nboard = f5_board(\"id1300010963303281\")\ntwo_only = [s for s, v in board.items() if \"two_way\" in v and \"three_way\" not in v]\nthree_only = [s for s, v in board.items() if \"three_way\" in v and \"two_way\" not in v]\nboth = [s for s, v in board.items() if len(v) == 2]\nprint(f\"{len(board)} books on the first-five board\")\nprint(f\"  two-way only   {len(two_only)}\")\nprint(f\"  three-way only {len(three_only)}\")\nprint(f\"  both           {len(both)}\")\n<\/code><\/pre>\n<pre class=\"wp-block-code\"><code>168 books on the first-five board\n  two-way only   40\n  three-way only 40\n  both           88\n<\/code><\/pre>\n<p>The leg count is not a formality. On New York Mets v Philadelphia Phillies the same afternoon, <code>betano.cz<\/code>, <code>codere.es<\/code>, <code>overtime.io<\/code> and <code>pokerstars.es<\/code> all posted market <code>131258<\/code> with the tie leg missing. Two legs where three belong sum to a smaller overround, so an unguarded margin ranking floats the incomplete books to the top.<\/p>\n<h3>The Split Is Not Random<\/h3>\n<p>The two market IDs draw different bookmaker populations, and the split runs along the kind of operator rather than the region.<\/p>\n<figure class=\"wp-block-table\">\n<table>\n<thead>\n<tr>\n<th>Market ID<\/th>\n<th>Shape<\/th>\n<th>Who sits here<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>131256<\/code><\/td>\n<td>Two legs, home and away<\/td>\n<td><code>draftkings<\/code>, <code>novig.us<\/code>, <code>prophetx<\/code>, <code>sx.bet<\/code>, <code>circasports<\/code>, <code>sbobet<\/code>, <code>coral<\/code>, <code>ladbrokes<\/code>, <code>hardrockbet<\/code>, <code>betus<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>131258<\/code><\/td>\n<td>Three legs, tie priced<\/td>\n<td><code>polymarket<\/code>, <code>polymarket.us<\/code>, <code>kalshi<\/code>, <code>pokerstars<\/code>, <code>winamax.de<\/code>, <code>dafabet<\/code>, <code>midnite<\/code>, <code>duel<\/code>, <code>bcgame<\/code>, <code>cloudbet<\/code><\/td>\n<\/tr>\n<tr>\n<td>Both<\/td>\n<td>88 books<\/td>\n<td><code>fanduel<\/code>, <code>betmgm<\/code>, <code>betano<\/code> and its skins, <code>20bet<\/code>, <code>bet99<\/code><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>US retail and the P2P exchanges sit on the two-way ID. The prediction markets and the crypto casinos sit on the three-way. Both <code>pinnacle<\/code> and <code>betfair-ex<\/code> sat on that board with a full-game price and carried neither five-inning market, so the sharp anchor you would normally reach for has nothing to say about the first five. Build your fair value from the deduplicated board instead.<\/p>\n<p>Three responses tell you why a slug is missing, and they are easy to confuse. Pass <code>bookmakers=pinnacle<\/code> alone and you get HTTP 200 with the slug in the payload and no market <code>131256<\/code> inside it, which means the book opened no such market. A slug outside the catalogue returns <code>400 INVALID_PARAMETER<\/code> and the error body lists every valid slug. A slug your plan cannot read returns <code>403 RESTRICTED_ACCESS<\/code> and names it. Check the status code before you conclude anything about coverage.<\/p>\n<h2>Step 3: Rank the Merged Board<\/h2>\n<p>Once both IDs feed one board you can rank all 168 books on margin. Use the two-way quote where a book has one, the three-way otherwise.<\/p>\n<pre class=\"wp-block-code\"><code>import statistics, collections\n\ndef margin(legs):\n    return sum(1 \/ price for price in legs.values()) - 1\n\nranked = []\nfor slug, quotes in board.items():\n    legs = quotes.get(\"two_way\") or quotes[\"three_way\"]\n    shape = \"2-way\" if \"two_way\" in quotes else \"3-way\"\n    ranked.append((margin(legs), slug, shape))\nranked.sort()\n\nprint(f\"{len(ranked)} books, median margin \"\n      f\"{statistics.median(m for m, _, _ in ranked) * 100:.2f}%\")\nfor m, slug, shape in ranked[:8]:\n    print(f\"  {slug:&lt;18} {shape}  {m * 100:5.2f}%\")\n\ntuples = collections.Counter(\n    tuple(sorted((q.get(\"two_way\") or q[\"three_way\"]).items()))\n    for q in board.values())\nprint(f\"dedupe: {len(board)} quotes to {len(tuples)} distinct prices \"\n      f\"({100 * (1 - len(tuples) \/ len(board)):.1f}% collapse)\")\n<\/code><\/pre>\n<pre class=\"wp-block-code\"><code>168 books, median margin 6.95%\n  novig.us           2-way   0.50%\n  polymarket.us      3-way   1.00%\n  kalshi             3-way   2.00%\n  betus              2-way   3.62%\n  betwar             2-way   3.75%\n  circasports        2-way   3.80%\n  prophetx           2-way   4.04%\n  apuestatotal       2-way   4.19%\ndedupe: 168 quotes to 61 distinct prices (63.7% collapse)\n<\/code><\/pre>\n<p>The first and second place finishers sit on different market IDs. <code>novig.us<\/code> leads at 0.50% on the two-way; <code>polymarket.us<\/code> leads the three-way at 1.00%. Read either ID alone and the book at the top of your leaderboard is whichever one your query happened to include.<\/p>\n<p>The dedupe number matters as much as the count. Those 168 quotes collapse to 61 independent prices, so 63.7% of the board is copying somebody. The <code>cloneOf<\/code> field flags 117 of the 360 catalogue slugs and it does not predict this: distinct brands under separate licences quote byte-identical prices with <code>cloneOf<\/code> set to null. Deduplicate on the price tuple before you average anything, the same way you would for <a href=\"https:\/\/oddspapi.io\/blog\/consensus-odds-fair-odds-calculator-python\/\">a consensus line<\/a>.<\/p>\n<h3>Pick the De-Vig Method Before You Compare IDs<\/h3>\n<p>Eighty-eight books on that fixture posted both first-five markets. Strip the tie from the three-way, renormalise, and their two views should agree. Whether they do depends entirely on how you remove the margin.<\/p>\n<pre class=\"wp-block-code\"><code>def power_devig(legs):\n    \"\"\"Solve sum(raw ** n) == 1 by bisection.\"\"\"\n    raw = [1 \/ price for price in legs.values()]\n    low, high = 0.2, 4.0\n    for _ in range(80):\n        mid = (low + high) \/ 2\n        if sum(r ** mid for r in raw) &gt; 1:\n            low = mid\n        else:\n            high = mid\n    n = (low + high) \/ 2\n    return {leg: (1 \/ price) ** n for leg, price in legs.items()}\n\ngaps = []\nfor slug, quotes in board.items():\n    if len(quotes) != 2:\n        continue\n    two = power_devig(quotes[\"two_way\"])\n    three = power_devig(quotes[\"three_way\"])\n    conditional = three[\"1\"] \/ (three[\"1\"] + three[\"2\"])\n    gaps.append(abs(two[\"1\"] - conditional) * 100)\nprint(f\"{len(gaps)} books post both IDs; median self-disagreement \"\n      f\"{statistics.median(gaps):.2f} points\")\n<\/code><\/pre>\n<pre class=\"wp-block-code\"><code>88 books post both IDs; median self-disagreement 0.16 points\n<\/code><\/pre>\n<p>Sixteen hundredths of a point. The books hold the same view on both IDs, so the merged board is safe to treat as one market. The Mets fixture gives the same answer: 85 books posted both first-five markets and the median gap ran 0.20 points under proportional de-vig and 0.40 under the power method, with 44 books on the full-game pair at 0.43 and 0.53.<\/p>\n<p>Where the method does change your number is the tie leg itself. On those 44 nine-inning three-ways, proportional de-vig puts the tie at a median 10.44% while the power method puts it at 9.19%. Proportional de-vig divides every implied probability by the same overround, which hands too much of the margin to the long leg, and a tie leg is always the long leg.<\/p>\n<p>The realised rate settles the argument. Pulling <code>\/v4\/scores<\/code> for all 216 MLB fixtures played between 1 and 16 September 2026 and comparing <code>fulltime<\/code> against <code>result<\/code>, 21 of them went past nine innings. That is 9.72%. The power method&#8217;s 9.19% sits half a point away from the season&#8217;s own number; proportional de-vig&#8217;s 10.44% sits three quarters of a point the other side. Our <a href=\"https:\/\/oddspapi.io\/blog\/no-vig-odds-api\/\">no-vig guide<\/a> works through all three methods.<\/p>\n<h2>Step 4: Prove Which Clock Each Market Settles On<\/h2>\n<p>Everything above is pricing. The settlement grid is where you find out what you actually bought, and <code>\/v4\/settlements<\/code> is on the free tier.<\/p>\n<p>San Francisco Giants v St. Louis Cardinals (<code>id1300010963301511<\/code>, first pitch 8 September 2026 at 00:28 UTC) finished 3-3 after nine innings and 5-4 after extras. That single fixture separates two markets that look identical in a market list.<\/p>\n<pre class=\"wp-block-code\"><code>FULL_GAME = 131    # Winner (incl. extra innings), 2-way\nREGULATION = 133   # Regular Time Result, 3-way with a tie leg\nNAMES = {\"131\": \"home\", \"132\": \"away\",\n         \"133\": \"home\", \"134\": \"tie\", \"135\": \"away\"}\n\ndef grade(fixture_id):\n    settle = requests.get(f\"{BASE}\/settlements\",\n                          params={\"apiKey\": API_KEY,\n                                  \"fixtureId\": fixture_id}).json()\n    out = {}\n    for market_id in (FULL_GAME, REGULATION):\n        market = settle[\"markets\"].get(str(market_id))\n        out[market_id] = None if market is None else {\n            NAMES[oid]: leg[\"players\"][\"0\"][\"result\"]\n            for oid, leg in market[\"outcomes\"].items()}\n    return out\n\nperiods = requests.get(f\"{BASE}\/scores\",\n                       params={\"apiKey\": API_KEY,\n                               \"fixtureId\": \"id1300010963301511\"}\n                       ).json()[\"scores\"][\"periods\"]\nprint(\"after 9:\", periods[\"fulltime\"], \"final:\", periods[\"result\"])\nprint(grade(\"id1300010963301511\"))\n<\/code><\/pre>\n<pre class=\"wp-block-code\"><code>after 9: 3-3   final: 5-4\n{131: {'home': 'WIN', 'away': 'LOSE'},\n 133: {'home': 'LOSE', 'tie': 'WIN', 'away': 'LOSE'}}\n<\/code><\/pre>\n<p>One fixture, two markets, opposite results on the home leg. Market <code>131<\/code> paid the home side because the home side won 5-4. Market <code>133<\/code> paid the tie leg because the score after nine innings was level. A grader that merges the two IDs on the grounds that both say &#8220;who wins&#8221; pays the wrong side on 21 of the 216 MLB fixtures played in the first half of September 2026.<\/p>\n<p>The <code>\/scores<\/code> response is the cheap detector. <code>periods[\"fulltime\"]<\/code> is the score after nine, <code>periods[\"result\"]<\/code> is the final. Diff them and you know whether the fixture went to extras without parsing a single price. The settlement grid on that fixture covered 771 markets, so the same call grades the first-five pair and the inning markets in one pass.<\/p>\n<h2>Step 5: Pull the First-Five History<\/h2>\n<p><code>\/historical-odds<\/code> is free and it keeps the inning splits. It takes up to three bookmaker slugs per call, and one unreadable slug fails the whole batch, so retry a failure one slug at a time.<\/p>\n<pre class=\"wp-block-code\"><code>def price_moves(snapshots, cutoff):\n    \"\"\"Collapse consecutive identical prices. A raw snapshot count\n    measures your poller, not the book.\"\"\"\n    live = [s for s in snapshots if s[\"active\"] and s[\"createdAt\"] &lt; cutoff]\n    moves, last = 0, None\n    for snap in live:\n        if snap[\"price\"] != last:\n            moves += 1\n            last = snap[\"price\"]\n    return live, moves\n\nhistory = requests.get(f\"{BASE}\/historical-odds\",\n                       params={\"apiKey\": API_KEY,\n                               \"fixtureId\": \"id1300010963301511\",\n                               \"bookmakers\": \"draftkings,fanduel,betmgm\"}).json()\n\nCUTOFF = \"2026-09-08T00:28:12\"\nfor slug, book in history[\"bookmakers\"].items():\n    for market_id, outcome_id in ((131, 131), (131256, 131256), (131258, 131258)):\n        market = book[\"markets\"].get(str(market_id))\n        if market is None:\n            print(f\"{slug:&lt;12} market {market_id:&lt;7} absent\")\n            continue\n        snaps = market[\"outcomes\"][str(outcome_id)][\"players\"][\"0\"]\n        live, moves = price_moves(snaps, CUTOFF)\n        print(f\"{slug:&lt;12} market {market_id:&lt;7} {len(snaps):&gt;5} snapshots \"\n              f\"{len(live):&gt;4} pre-match active {moves:&gt;3} moves \"\n              f\"{live[0]['price']} to {live[-1]['price']}\")\n<\/code><\/pre>\n<figure class=\"wp-block-table\">\n<table>\n<thead>\n<tr>\n<th>Book<\/th>\n<th>Market<\/th>\n<th>Pre-match active snapshots<\/th>\n<th>Price moves<\/th>\n<th>Open to close<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>draftkings<\/code><\/td>\n<td>131 full game<\/td>\n<td>100<\/td>\n<td>43<\/td>\n<td>1.763 to 1.498<\/td>\n<\/tr>\n<tr>\n<td><code>draftkings<\/code><\/td>\n<td>131256 first five<\/td>\n<td>97<\/td>\n<td>50<\/td>\n<td>1.69 to 1.317<\/td>\n<\/tr>\n<tr>\n<td><code>fanduel<\/code><\/td>\n<td>131 full game<\/td>\n<td>257<\/td>\n<td>36<\/td>\n<td>1.74 to 1.47<\/td>\n<\/tr>\n<tr>\n<td><code>fanduel<\/code><\/td>\n<td>131256 first five<\/td>\n<td>276<\/td>\n<td>54<\/td>\n<td>1.66 to 1.29<\/td>\n<\/tr>\n<tr>\n<td><code>betmgm<\/code><\/td>\n<td>131 full game<\/td>\n<td>88<\/td>\n<td>60<\/td>\n<td>1.72 to 1.48<\/td>\n<\/tr>\n<tr>\n<td><code>betmgm<\/code><\/td>\n<td>131258 first five, three-way<\/td>\n<td>120<\/td>\n<td>81<\/td>\n<td>1.95 to 1.48<\/td>\n<\/tr>\n<tr>\n<td><code>draftkings<\/code><\/td>\n<td>131258 first five, three-way<\/td>\n<td colspan=\"3\">absent, this book never posts the three-way shape<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>On DraftKings and FanDuel the five-inning line repriced more often than the nine-inning line on the same fixture, 50 moves against 43 and 54 against 36. The starting pitcher drives the first-five number and the bullpen does not, so the market reacts to lineup news that the full-game price absorbs more slowly. That is the signal worth <a href=\"https:\/\/oddspapi.io\/blog\/backtest-betting-model-free-historical-odds\/\">backtesting<\/a>.<\/p>\n<p>One warning on the same pull: <code>draftkings<\/code> carried no history at all for market <code>131258<\/code>, because it never posts the three-way shape. A single-book first-five backtest therefore learns whichever ID that book happens to favour. Pull at least two books from opposite sides of the split. The whole three-book call returned 82 MB, so page it rather than holding it in memory, and remember that raw snapshot counts measure your poller: DraftKings logged 419,909 snapshots across 214 markets on that one fixture while FanDuel logged 342,719 across 122.<\/p>\n<h2>What the Rest of the Baseball Catalogue Holds<\/h2>\n<p>The same <code>period<\/code> field opens the rest of the sport. Across eight MLB boards measured on 17 September 2026 between 13:15 and 13:25 UTC, each fixture carried 265 to 269 bookmakers, 456 to 497 distinct market IDs, and 29.7 to 33.1 MB of unfiltered JSON.<\/p>\n<figure class=\"wp-block-table\">\n<table>\n<thead>\n<tr>\n<th>Period value<\/th>\n<th>Definitions<\/th>\n<th>What it settles on<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>result<\/code><\/td>\n<td>258<\/td>\n<td>Final score, extra innings included<\/td>\n<\/tr>\n<tr>\n<td><code>fulltime<\/code><\/td>\n<td>1<\/td>\n<td>Score after nine innings (market <code>133<\/code>)<\/td>\n<\/tr>\n<tr>\n<td><code>p1+p2+p3+p4+p5<\/code><\/td>\n<td>150<\/td>\n<td>First five innings<\/td>\n<\/tr>\n<tr>\n<td><code>p6+p7+p8+p9+overtime<\/code><\/td>\n<td>150<\/td>\n<td>Sixth inning onward<\/td>\n<\/tr>\n<tr>\n<td><code>p1<\/code> through <code>p9<\/code><\/td>\n<td>26 each<\/td>\n<td>One inning<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>Board depth by market on those eight fixtures, after the four guards:<\/p>\n<figure class=\"wp-block-table\">\n<table>\n<thead>\n<tr>\n<th>Market<\/th>\n<th>Books quoting<\/th>\n<th>Median margin<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>131<\/code> Winner, incl. extra innings<\/td>\n<td>254 to 260<\/td>\n<td>5.09% to 5.34%<\/td>\n<\/tr>\n<tr>\n<td><code>131256<\/code> Winner first five<\/td>\n<td>124 to 130<\/td>\n<td>6.25% to 6.94%<\/td>\n<\/tr>\n<tr>\n<td><code>131258<\/code> First five result<\/td>\n<td>126 to 127<\/td>\n<td>7.79% to 8.81%<\/td>\n<\/tr>\n<tr>\n<td><code>133<\/code> Regular time result<\/td>\n<td>43 to 45<\/td>\n<td>9.40% to 10.01%<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>Margin widens as the clock narrows. The full-game moneyline runs a little over 5%, the five-inning two-way about 6.5%, the nine-inning three-way close to 10%. Price a first-five bet against the full-game consensus and you are comparing a 5% market with a 7% one, which is exactly the trap <a href=\"https:\/\/oddspapi.io\/blog\/line-shopping-python-best-odds\/\">line shopping across books<\/a> is meant to close.<\/p>\n<p>The individual-inning markets carry their own guard. Market <code>13100<\/code>, the first-inning three-way, reached 174 books on the Mets fixture, and 31 of those failed the three-active-legs check. The same <code>len(legs)<\/code> guard that protects the first-five board protects this one.<\/p>\n<h2>Frequently Asked Questions<\/h2>\n<h3>What is the market ID for MLB first five innings odds?<\/h3>\n<p>Two of them. Market <code>131256<\/code> (<em>Winner First To Fifth Inning<\/em>) is the two-leg version, and market <code>131258<\/code> (<em>First To Fifth Inning Result<\/em>) adds a tie leg. Both carry <code>period<\/code> of <code>p1+p2+p3+p4+p5<\/code>. Read both and merge on the bookmaker slug, which took the board from about 125 books to 168 on the fixture measured for this guide.<\/p>\n<h3>Does an MLB moneyline from the OddsPapi API include extra innings?<\/h3>\n<p>Market <code>131<\/code> does. Its <code>period<\/code> is <code>result<\/code> and it settles on the final score. Market <code>133<\/code> settles on the score after nine innings and pays its tie leg when the game goes to extras. On fixture <code>id1300010963301511<\/code>, which finished 3-3 after nine and 5-4 after extras, <code>\/v4\/settlements<\/code> graded the home leg of <code>131<\/code> as WIN and the tie leg of <code>133<\/code> as WIN.<\/p>\n<h3>How many bookmakers price MLB on the OddsPapi API?<\/h3>\n<p>Across eight MLB fixtures measured on 17 September 2026, each board carried 265 to 269 bookmakers and 456 to 497 distinct market IDs. After deduplicating on the price tuple, the 168-book first-five board resolved to 61 independent prices, so treat the count and the independent-price count as two separate numbers.<\/p>\n<h3>Which bookmaker prices MLB first five innings tightest?<\/h3>\n<p>On Reds v Dodgers at 13:38 UTC on 17 September 2026, <code>novig.us<\/code> led the two-way at a 0.50% margin and <code>polymarket.us<\/code> led the three-way at 1.00%, with <code>kalshi<\/code> third at 2.00%. They sit on different market IDs, so a leaderboard built from one ID returns a different winner than a leaderboard built from both.<\/p>\n<h3>Is historical MLB odds data free on OddsPapi?<\/h3>\n<p>Yes. <code>\/v4\/historical-odds<\/code> is on the free tier and it keeps the inning splits, including the first-five markets. It accepts up to three bookmaker slugs per call. One three-book pull on a single fixture returned 82 MB and 419,909 snapshots for DraftKings alone, so collapse consecutive identical prices into price moves before you count anything.<\/p>\n<h3>How do I tell whether an MLB fixture went to extra innings?<\/h3>\n<p>Call <code>\/v4\/scores<\/code> and compare two keys. <code>periods[\"fulltime\"]<\/code> holds the score after nine innings and <code>periods[\"result\"]<\/code> holds the final score. When they differ, the fixture went past regulation. The response also carries <code>p1<\/code> through <code>p9<\/code> as individual innings.<\/p>\n<h2>Get the Board<\/h2>\n<p>The free tier covers 350+ bookmakers, every baseball period from a single inning to the final score, and historical odds with no add-on. If you need the board pushed rather than polled, the same coverage streams over <a href=\"https:\/\/oddspapi.io\/blog\/websocket-odds-api-real-time-betting-data\/\">WebSocket<\/a>.<\/p>\n<p>Stop guessing which market ID your book uses. <a href=\"https:\/\/oddspapi.io\/en\/sign-up\">Grab a free API key<\/a> and read both.<\/p>\n<p>Related reading: <a href=\"https:\/\/oddspapi.io\/blog\/mlb-odds-api-run-lines-totals\/\">MLB run lines, totals and moneylines<\/a>, <a href=\"https:\/\/oddspapi.io\/blog\/mlb-player-props-api\/\">MLB player props in Python<\/a>, <a href=\"https:\/\/oddspapi.io\/blog\/npb-odds-api\/\">Japanese baseball odds<\/a>, and <a href=\"https:\/\/oddspapi.io\/blog\/how-many-bookmakers-backtest\/\">how many bookmakers a backtest actually needs<\/a>.<\/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 market ID for MLB first five innings odds?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Two of them. Market 131256 (Winner First To Fifth Inning) is the two-leg version, and market 131258 (First To Fifth Inning Result) adds a tie leg. Both carry a period of p1+p2+p3+p4+p5. Read both and merge on the bookmaker slug, which took the board from about 125 books to 168 on the fixture measured for this guide.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"Does an MLB moneyline from the OddsPapi API include extra innings?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Market 131 does. Its period is result and it settles on the final score. Market 133 settles on the score after nine innings and pays its tie leg when the game goes to extras. On fixture id1300010963301511, which finished 3-3 after nine and 5-4 after extras, \/v4\/settlements graded the home leg of 131 as WIN and the tie leg of 133 as WIN.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"How many bookmakers price MLB on the OddsPapi API?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Across eight MLB fixtures measured on 17 September 2026, each board carried 265 to 269 bookmakers and 456 to 497 distinct market IDs. After deduplicating on the price tuple, the 168-book first-five board resolved to 61 independent prices, so treat the count and the independent-price count as two separate numbers.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"Which bookmaker prices MLB first five innings tightest?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"On Reds v Dodgers at 13:38 UTC on 17 September 2026, novig.us led the two-way at a 0.50% margin and polymarket.us led the three-way at 1.00%, with kalshi third at 2.00%. They sit on different market IDs, so a leaderboard built from one ID returns a different winner than a leaderboard built from both.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"Is historical MLB odds data free on OddsPapi?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Yes. \/v4\/historical-odds is on the free tier and it keeps the inning splits, including the first-five markets. It accepts up to three bookmaker slugs per call. One three-book pull on a single fixture returned 82 MB and 419,909 snapshots for DraftKings alone, so collapse consecutive identical prices into price moves before you count anything.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"How do I tell whether an MLB fixture went to extra innings?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Call \/v4\/scores and compare two keys. periods[\\\"fulltime\\\"] holds the score after nine innings and periods[\\\"result\\\"] holds the final score. When they differ, the fixture went past regulation. The response also carries p1 through p9 as individual innings.\"\n      }\n    }\n  ]\n}\n<\/script><\/p>\n<p><!--\nFocus Keyphrase: mlb first five innings odds api\nSEO Title: MLB Odds API: Price the First Five Innings Across 168 Books\nMeta Description: The first-five board ships as two market IDs, 131256 and 131258. Pull both to reach 168 books, then grade the full game on the extra innings score.\nSlug: mlb-first-five-innings-odds-api\n--><\/p>\n","protected":false},"excerpt":{"rendered":"<p>The first-five board ships as two market IDs, 131256 and 131258. Pull both to reach 168 books, then grade the full game on the extra innings score.<\/p>\n","protected":false},"author":2,"featured_media":4228,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7],"tags":[80,17,9,11,10],"class_list":["post-4227","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-how-to-guides","tag-baseball","tag-mlb","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>MLB Odds API: Price the First Five Innings Across 168 Books | 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\/mlb-first-five-innings-odds-api\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"MLB Odds API: Price the First Five Innings Across 168 Books | OddsPapi Blog\" \/>\n<meta property=\"og:description\" content=\"The first-five board ships as two market IDs, 131256 and 131258. Pull both to reach 168 books, then grade the full game on the extra innings score.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/oddspapi.io\/blog\/mlb-first-five-innings-odds-api\/\" \/>\n<meta property=\"og:site_name\" content=\"OddsPapi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-09-25T10:00:00+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/09\/mlb-first-five-innings-odds-api.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\/mlb-first-five-innings-odds-api\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/mlb-first-five-innings-odds-api\/\"},\"author\":{\"name\":\"Odds API Writer\",\"@id\":\"https:\/\/oddspapi.io\/blog\/#\/schema\/person\/b6f21e649c4f556f0a95c23a0f1efa13\"},\"headline\":\"MLB Odds API: Price the First Five Innings Across 168 Books\",\"datePublished\":\"2026-09-25T10:00:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/mlb-first-five-innings-odds-api\/\"},\"wordCount\":2130,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/mlb-first-five-innings-odds-api\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/09\/mlb-first-five-innings-odds-api.webp\",\"keywords\":[\"Baseball\",\"MLB\",\"Odds API\",\"Python\",\"Sports Betting API\"],\"articleSection\":[\"How To Guides\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/oddspapi.io\/blog\/mlb-first-five-innings-odds-api\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/oddspapi.io\/blog\/mlb-first-five-innings-odds-api\/\",\"url\":\"https:\/\/oddspapi.io\/blog\/mlb-first-five-innings-odds-api\/\",\"name\":\"MLB Odds API: Price the First Five Innings Across 168 Books | OddsPapi Blog\",\"isPartOf\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/mlb-first-five-innings-odds-api\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/mlb-first-five-innings-odds-api\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/09\/mlb-first-five-innings-odds-api.webp\",\"datePublished\":\"2026-09-25T10:00:00+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/mlb-first-five-innings-odds-api\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/oddspapi.io\/blog\/mlb-first-five-innings-odds-api\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/oddspapi.io\/blog\/mlb-first-five-innings-odds-api\/#primaryimage\",\"url\":\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/09\/mlb-first-five-innings-odds-api.webp\",\"contentUrl\":\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/09\/mlb-first-five-innings-odds-api.webp\",\"width\":1200,\"height\":675,\"caption\":\"MLB Odds API first five innings market IDs\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/oddspapi.io\/blog\/mlb-first-five-innings-odds-api\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/oddspapi.io\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"MLB Odds API: Price the First Five Innings Across 168 Books\"}]},{\"@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":"MLB Odds API: Price the First Five Innings Across 168 Books | 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\/mlb-first-five-innings-odds-api\/","og_locale":"en_US","og_type":"article","og_title":"MLB Odds API: Price the First Five Innings Across 168 Books | OddsPapi Blog","og_description":"The first-five board ships as two market IDs, 131256 and 131258. Pull both to reach 168 books, then grade the full game on the extra innings score.","og_url":"https:\/\/oddspapi.io\/blog\/mlb-first-five-innings-odds-api\/","og_site_name":"OddsPapi Blog","article_published_time":"2026-09-25T10:00:00+00:00","og_image":[{"width":1200,"height":675,"url":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/09\/mlb-first-five-innings-odds-api.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\/mlb-first-five-innings-odds-api\/#article","isPartOf":{"@id":"https:\/\/oddspapi.io\/blog\/mlb-first-five-innings-odds-api\/"},"author":{"name":"Odds API Writer","@id":"https:\/\/oddspapi.io\/blog\/#\/schema\/person\/b6f21e649c4f556f0a95c23a0f1efa13"},"headline":"MLB Odds API: Price the First Five Innings Across 168 Books","datePublished":"2026-09-25T10:00:00+00:00","mainEntityOfPage":{"@id":"https:\/\/oddspapi.io\/blog\/mlb-first-five-innings-odds-api\/"},"wordCount":2130,"commentCount":0,"publisher":{"@id":"https:\/\/oddspapi.io\/blog\/#organization"},"image":{"@id":"https:\/\/oddspapi.io\/blog\/mlb-first-five-innings-odds-api\/#primaryimage"},"thumbnailUrl":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/09\/mlb-first-five-innings-odds-api.webp","keywords":["Baseball","MLB","Odds API","Python","Sports Betting API"],"articleSection":["How To Guides"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/oddspapi.io\/blog\/mlb-first-five-innings-odds-api\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/oddspapi.io\/blog\/mlb-first-five-innings-odds-api\/","url":"https:\/\/oddspapi.io\/blog\/mlb-first-five-innings-odds-api\/","name":"MLB Odds API: Price the First Five Innings Across 168 Books | OddsPapi Blog","isPartOf":{"@id":"https:\/\/oddspapi.io\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/oddspapi.io\/blog\/mlb-first-five-innings-odds-api\/#primaryimage"},"image":{"@id":"https:\/\/oddspapi.io\/blog\/mlb-first-five-innings-odds-api\/#primaryimage"},"thumbnailUrl":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/09\/mlb-first-five-innings-odds-api.webp","datePublished":"2026-09-25T10:00:00+00:00","breadcrumb":{"@id":"https:\/\/oddspapi.io\/blog\/mlb-first-five-innings-odds-api\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/oddspapi.io\/blog\/mlb-first-five-innings-odds-api\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/oddspapi.io\/blog\/mlb-first-five-innings-odds-api\/#primaryimage","url":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/09\/mlb-first-five-innings-odds-api.webp","contentUrl":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/09\/mlb-first-five-innings-odds-api.webp","width":1200,"height":675,"caption":"MLB Odds API first five innings market IDs"},{"@type":"BreadcrumbList","@id":"https:\/\/oddspapi.io\/blog\/mlb-first-five-innings-odds-api\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/oddspapi.io\/blog\/"},{"@type":"ListItem","position":2,"name":"MLB Odds API: Price the First Five Innings Across 168 Books"}]},{"@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\/4227","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=4227"}],"version-history":[{"count":1,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/posts\/4227\/revisions"}],"predecessor-version":[{"id":4229,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/posts\/4227\/revisions\/4229"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/media\/4228"}],"wp:attachment":[{"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/media?parent=4227"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/categories?post=4227"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/tags?post=4227"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}