{"id":3157,"date":"2026-08-03T10:00:00","date_gmt":"2026-08-03T10:00:00","guid":{"rendered":"https:\/\/oddspapi.io\/blog\/?p=3157"},"modified":"2026-07-18T17:38:52","modified_gmt":"2026-07-18T17:38:52","slug":"npb-odds-api","status":"publish","type":"post","link":"https:\/\/oddspapi.io\/blog\/npb-odds-api\/","title":{"rendered":"NPB Odds API: Live Japanese Baseball Odds in Python (Free Tier)"},"content":{"rendered":"<p>Nippon Professional Baseball is the strongest baseball league outside the United States, it runs from late March to October, and it fills the dead hours before the MLB slate starts. Most odds APIs either skip it or bury it under a generic baseball endpoint with two bookmakers attached. If you already scrape MLB prices, NPB is the obvious next league, and your existing code almost works on it.<\/p>\n<p>This guide pulls live NPB odds in Python: moneylines, run lines, totals and first-inning markets from 8 bookmakers including Pinnacle. It also covers the one thing that trips people up when they point MLB code at Japan, which is that the scoring environment is completely different and your thresholds will be wrong.<\/p>\n<h2>NPB uses the same endpoints as MLB<\/h2>\n<p>Good news first. NPB sits under the same sport as MLB, <code>sportId 13<\/code>, and uses the same market IDs. Winner is market <code>131<\/code>, the run line is the <code>Handicap (incl. extra innings)<\/code> family, and totals are <code>Over Under (incl. extra innings)<\/code>. Anything you built for the <a href=\"https:\/\/oddspapi.io\/blog\/mlb-odds-api-run-lines-totals\/\">MLB odds API<\/a> ports across by changing one filter.<\/p>\n<pre class=\"wp-block-code\"><code>import requests\n\nAPI_KEY = \"YOUR_API_KEY\"\nBASE_URL = \"https:\/\/api.oddspapi.io\/v4\"\n\ndef api_get(path, **params):\n    params[\"apiKey\"] = API_KEY          # query param, not a header\n    r = requests.get(f\"{BASE_URL}{path}\", params=params, timeout=30)\n    r.raise_for_status()\n    return r.json()\n\nfixtures = api_get(\"\/fixtures\", sportId=13,\n                   **{\"from\": \"2026-07-18\", \"to\": \"2026-07-27\"})\n\nnpb = [f for f in fixtures\n       if f.get(\"tournamentName\") == \"NPB\" and f.get(\"hasOdds\")]\n\nprint(len(npb), \"NPB fixtures with odds\")\nfor f in npb[:5]:\n    print(f[\"fixtureId\"], f[\"participant1Name\"], \"v\", f[\"participant2Name\"])\n<\/code><\/pre>\n<p>That returned 36 NPB fixtures with odds across a ten day window. Team names come back in English (Orix Buffaloes, Yomiuri Giants, Hokkaido Nippon-Ham Fighters), so you do not need to handle Japanese text to match fixtures.<\/p>\n<h2>Pull the moneyline<\/h2>\n<p>The worked example is Orix Buffaloes against Hokkaido Nippon-Ham Fighters, fixture <code>id1300103666777590<\/code>. Market <code>131<\/code> is <code>Winner (incl. extra innings)<\/code>, with outcome <code>131<\/code> for the first participant and <code>132<\/code> for the second.<\/p>\n<pre class=\"wp-block-code\"><code>FID = \"id1300103666777590\"\nbooks = api_get(\"\/odds\", fixtureId=FID)[\"bookmakerOdds\"]\n\ndef price(slug, market_id, outcome_id):\n    node = (books.get(slug, {}).get(\"markets\", {})\n                 .get(market_id, {}).get(\"outcomes\", {}).get(outcome_id, {}))\n    player = node.get(\"players\", {}).get(\"0\")\n    if not player or node.get(\"active\") is False:\n        return None\n    return player.get(\"price\")\n\nfor slug in sorted(books):\n    home, away = price(slug, \"131\", \"131\"), price(slug, \"131\", \"132\")\n    if home:\n        print(f\"{slug:20} {home:>7} {away:>7}\")\n<\/code><\/pre>\n<figure class=\"wp-block-table\">\n<table>\n<thead>\n<tr>\n<th>Bookmaker<\/th>\n<th>Orix<\/th>\n<th>Nippon-Ham<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>pinnacle<\/td>\n<td>2.10<\/td>\n<td>1.806<\/td>\n<\/tr>\n<tr>\n<td>polymarket<\/td>\n<td>2.128<\/td>\n<td>1.852<\/td>\n<\/tr>\n<tr>\n<td>pointsbet.com.au<\/td>\n<td>2.06<\/td>\n<td>1.769<\/td>\n<\/tr>\n<tr>\n<td>draftkings<\/td>\n<td>2.05<\/td>\n<td>1.76<\/td>\n<\/tr>\n<tr>\n<td>caesars \/ williamhill<\/td>\n<td>2.05<\/td>\n<td>1.741<\/td>\n<\/tr>\n<tr>\n<td>kalshi<\/td>\n<td>1.852<\/td>\n<td>1.613<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>Eight bookmakers were on the fixture and 121 markets were on the board across them. Filter on <code>active is False<\/code> rather than a truthy <code>active<\/code> check, because the feed sometimes ships <code>active: null<\/code> alongside a valid price.<\/p>\n<h2>Two things to notice before you trust the board<\/h2>\n<p>First, <code>caesars<\/code> and <code>williamhill<\/code> quote 2.05 and 1.741 to the decimal, because they run the same pricing. Eight slugs collapse to six independent quotes here. Deduplicate before averaging or that one opinion gets double weight in your <a href=\"https:\/\/oddspapi.io\/blog\/consensus-odds-fair-odds-calculator-python\/\">consensus number<\/a>.<\/p>\n<pre class=\"wp-block-code\"><code>from collections import defaultdict\n\ngroups = defaultdict(list)\nfor slug in books:\n    quote = (price(slug, \"131\", \"131\"), price(slug, \"131\", \"132\"))\n    if None not in quote:\n        groups[quote].append(slug)\n\nprint(len(books), \"slugs ->\", len(groups), \"distinct quotes\")\nfor quote, slugs in groups.items():\n    if len(slugs) &gt; 1:\n        print(\"  duplicate:\", quote, slugs)\n\n# 8 slugs -> 6 distinct quotes\n#   duplicate: (2.05, 1.741) ['caesars', 'williamhill']\n<\/code><\/pre>\n<p>Second, look at Kalshi. Its two prices imply 54.0% and 62.0%, which sums to 116%. That is not a competitive quote, it is a thin market on a league the exchange has little volume in. The two exchanges split hard here: Polymarket was the tightest book on the fixture at 100.99%, Kalshi the widest by a distance. Screen by implied total before you let any book into a consensus calculation.<\/p>\n<pre class=\"wp-block-code\"><code>def book_percent(slug):\n    h, a = price(slug, \"131\", \"131\"), price(slug, \"131\", \"132\")\n    return (1\/h + 1\/a) if h and a else None\n\nfor slug in sorted(books):\n    bp = book_percent(slug)\n    if bp:\n        print(f\"{slug:20} {bp*100:6.2f}%\")\n\n# polymarket            100.99%\n# pinnacle              102.99%\n# draftkings            105.60%\n# pointsbet.com.au      105.07%\n# caesars               106.22%\n# williamhill           106.22%\n# kalshi                115.99%\n<\/code><\/pre>\n<h2>De-vig the sharp price<\/h2>\n<p>Pinnacle carried a 2.99% margin on this game, which is tight for a non-US league.<\/p>\n<pre class=\"wp-block-code\"><code>quote = {o: price(\"pinnacle\", \"131\", o) for o in (\"131\", \"132\")}\nimplied = {k: 1 \/ v for k, v in quote.items()}\ntotal = sum(implied.values())\n\nprint(f\"overround {(total - 1) * 100:.2f}%\")\nfor k, label in [(\"131\", \"Orix\"), (\"132\", \"Nippon-Ham\")]:\n    print(f\"{label:12} fair prob {implied[k]\/total:.4f}  fair odds {total\/implied[k]:.4f}\")\n\n# overround 2.99%\n# Orix         fair prob 0.4624  fair odds 2.1628\n# Nippon-Ham   fair prob 0.5376  fair odds 1.8600\n<\/code><\/pre>\n<p>Best available prices were 2.128 on Orix and 1.852 on Nippon-Ham, both at Polymarket, which beat Pinnacle on each side of the same game. Both still sit inside Pinnacle&#8217;s fair numbers of 2.1628 and 1.8600, so that is a line shopping result rather than a value claim. The three de-vig methods are compared in the <a href=\"https:\/\/oddspapi.io\/blog\/no-vig-odds-api\/\">no-vig odds guide<\/a>.<\/p>\n<h2>NPB scores about two runs lower than MLB<\/h2>\n<p>This is the part that breaks ported MLB code. Japanese baseball plays in a lower scoring environment, and any total threshold tuned on MLB will be wrong. Rather than assert it, here are the main totals pulled from the same feed on the same days.<\/p>\n<figure class=\"wp-block-table\">\n<table>\n<thead>\n<tr>\n<th>NPB fixture<\/th>\n<th>Main total<\/th>\n<th>MLB fixture<\/th>\n<th>Main total<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Orix Buffaloes<\/td>\n<td>7.0<\/td>\n<td>Cleveland Guardians<\/td>\n<td>7.5<\/td>\n<\/tr>\n<tr>\n<td>Yomiuri Giants<\/td>\n<td>6.5<\/td>\n<td>Chicago Cubs<\/td>\n<td>8.5<\/td>\n<\/tr>\n<tr>\n<td>Chiba Lotte Marines<\/td>\n<td>7.5<\/td>\n<td>Toronto Blue Jays<\/td>\n<td>9.5<\/td>\n<\/tr>\n<tr>\n<td>Yokohama DeNA BayStars<\/td>\n<td>7.5<\/td>\n<td>Colorado Rockies<\/td>\n<td>12.5<\/td>\n<\/tr>\n<tr>\n<td>Hiroshima Toyo Carp<\/td>\n<td>6.0<\/td>\n<td>Philadelphia Phillies<\/td>\n<td>8.5<\/td>\n<\/tr>\n<tr>\n<td>Tohoku Rakuten Golden Eagles<\/td>\n<td>6.5<\/td>\n<td>Houston Astros<\/td>\n<td>9.0<\/td>\n<\/tr>\n<tr>\n<td><strong>Median<\/strong><\/td>\n<td><strong>6.75<\/strong><\/td>\n<td><strong>Median<\/strong><\/td>\n<td><strong>8.75<\/strong><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>Two full runs of difference on the median. If your model flags anything under 7.5 as a low-total game, every NPB fixture triggers it. The Rockies at 12.5 show the other end of the range, which is Coors Field doing what Coors Field does.<\/p>\n<p>Totals resolve through the <code>Over Under (incl. extra innings)<\/code> family. Each line is a separate market ID, so look them up instead of hardcoding.<\/p>\n<pre class=\"wp-block-code\"><code>catalog = api_get(\"\/markets\", sportId=13)\ntotals = {m[\"marketId\"]: m.get(\"handicap\") for m in catalog\n          if m.get(\"marketName\") == \"Over Under (incl. extra innings)\"\n          and m.get(\"period\") == \"result\"}\n\nfor mid, market in books[\"pinnacle\"][\"markets\"].items():\n    if int(mid) in totals:\n        for oid, outcome in market[\"outcomes\"].items():\n            node = outcome.get(\"players\", {}).get(\"0\")\n            if node and outcome.get(\"mainLine\"):\n                print(\"main total\", totals[int(mid)], oid, node[\"price\"])\n\n# main total 7 ...\n<\/code><\/pre>\n<p>Read the <code>mainLine<\/code> flag rather than guessing which rung of the ladder is the headline number. On this fixture Pinnacle&#8217;s 6.5 line priced at 1.813 over and 2.05 under, and the run line at 1.5 came in at 1.595 and 2.44.<\/p>\n<h2>Settlement: NPB games can end in a tie<\/h2>\n<p>NPB regular season games are capped at 12 innings, so a game level at that point is recorded as a tie. MLB has no such rule, which means a two-way moneyline behaves differently across the two leagues.<\/p>\n<p>The feed labels the market <code>Winner (incl. extra innings)<\/code> and ships it with two outcomes, no draw selection. How a tie settles is a bookmaker rules question rather than something the odds payload answers, and it varies by book. Check the settlement terms at whichever book you are pricing against before you grade positions automatically, and do not assume a stake is returned. This is the single most common way an MLB-shaped grading script produces wrong results on Japanese baseball.<\/p>\n<h2>Free historical prices<\/h2>\n<pre class=\"wp-block-code\"><code>hist = api_get(\"\/historical-odds\", fixtureId=FID,\n               bookmakers=\"pinnacle,bet365,draftkings\")   # max 3 per call\n\nsnaps = (hist[\"bookmakers\"][\"pinnacle\"][\"markets\"][\"131\"]\n             [\"outcomes\"][\"131\"][\"players\"][\"0\"])          # a LIST of snapshots\n\nprint(len(snaps), snaps[0][\"price\"], \"->\", snaps[-1][\"price\"])\n# 5 2.07 -> 2.1\n<\/code><\/pre>\n<p>Pinnacle recorded 5 price points on this fixture, drifting 2.07 to 2.10. NPB books post later and move less than MLB books, so the history is shorter. The historical response nests under <code>bookmakers<\/code> rather than <code>bookmakerOdds<\/code>, and <code>players[\"0\"]<\/code> is a list instead of one price. Capture it into your own store and the sparse history stops being a problem, which the <a href=\"https:\/\/oddspapi.io\/blog\/odds-database-python-sqlite\/\">odds database guide<\/a> covers.<\/p>\n<h2>What NPB coverage actually looks like<\/h2>\n<p>Being straight about the depth: NPB gets 8 bookmakers on a fixture where a marquee MLB game gets 17, and the run line and totals sit on 4 books rather than 10. Pinnacle, Polymarket and the US retail books carry it. First-inning markets are there but on two books.<\/p>\n<p>What you do get is a sharp reference price on every fixture, a full handicap and total ladder from Pinnacle, and 121 markets on a league most feeds ignore. For a league playing daily while MLB sleeps, that is enough to build on. Widen to the best price across the board with <a href=\"https:\/\/oddspapi.io\/blog\/line-shopping-python-best-odds\/\">line shopping in Python<\/a>.<\/p>\n<h2>Frequently asked questions<\/h2>\n<h3>Is there an NPB odds API?<\/h3>\n<p>Yes. NPB fixtures sit under baseball, sportId 13, with tournamentName NPB. A ten day window returned 36 NPB fixtures with odds, priced by up to 8 bookmakers including Pinnacle, with 121 markets on a single game.<\/p>\n<h3>Does NPB use the same market IDs as MLB?<\/h3>\n<p>Yes. Both sit under sportId 13, so Winner is market 131, run lines are the Handicap (incl. extra innings) family and totals are Over Under (incl. extra innings). MLB code ports over by changing the tournament filter.<\/p>\n<h3>Why are NPB totals lower than MLB totals?<\/h3>\n<p>Japanese baseball plays in a lower scoring environment. Across six fixtures from each league on the same days, the median main total was 6.75 for NPB and 8.75 for MLB. Any threshold tuned on MLB totals needs retuning before it runs on NPB.<\/p>\n<h3>How do NPB ties affect settlement?<\/h3>\n<p>NPB regular season games are capped at 12 innings and can end in a tie. The feed ships Winner (incl. extra innings) with two outcomes and no draw selection, so how a tie settles depends on the bookmaker&#8217;s rules rather than the odds payload. Check settlement terms before grading positions automatically.<\/p>\n<h3>Can I get free historical NPB odds?<\/h3>\n<p>Yes, on the free tier, capped at three bookmakers per call. Pinnacle recorded 5 price points on the sample fixture. NPB books post later and move less than MLB books, so histories are shorter than you would see on a US game.<\/p>\n<h2>Start pulling NPB prices<\/h2>\n<p>One free key covers 381 bookmakers across 69 sports, with sharp books and prediction markets in the same response and free price history. NPB is one filter away from code you have already written. <a href=\"https:\/\/oddspapi.io\/blog\/free-odds-api-350-bookmakers\/\">Get your free API key<\/a> and point it at tonight&#8217;s Japanese slate.<\/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\": \"Is there an NPB odds API?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Yes. NPB fixtures sit under baseball, sportId 13, with tournamentName NPB. A ten day window returned 36 NPB fixtures with odds, priced by up to 8 bookmakers including Pinnacle, with 121 markets on a single game.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"Does NPB use the same market IDs as MLB?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Yes. Both sit under sportId 13, so Winner is market 131, run lines are the Handicap (incl. extra innings) family and totals are Over Under (incl. extra innings). MLB code ports over by changing the tournament filter.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"Why are NPB totals lower than MLB totals?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Japanese baseball plays in a lower scoring environment. Across six fixtures from each league on the same days, the median main total was 6.75 for NPB and 8.75 for MLB. Any threshold tuned on MLB totals needs retuning before it runs on NPB.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"How do NPB ties affect bet settlement?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"NPB regular season games are capped at 12 innings and can end in a tie. The feed ships Winner (incl. extra innings) with two outcomes and no draw selection, so how a tie settles depends on the bookmaker's rules rather than the odds payload. Check settlement terms before grading positions automatically.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"Can I get free historical NPB odds?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Yes, on the free tier, capped at three bookmakers per call. Pinnacle recorded 5 price points on the sample fixture. NPB books post later and move less than MLB books, so histories are shorter than on a US game.\"\n      }\n    }\n  ]\n}\n<\/script><\/p>\n<p><!--\nFocus Keyphrase: NPB odds API\nSEO Title: NPB Odds API: Live Japanese Baseball Odds in Python\nMeta Description: Need an NPB odds API? Pull live Japanese baseball odds in Python from 8 books including Pinnacle, with run lines, totals and free historical data.\nSlug: npb-odds-api\n--><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Need an NPB odds API? Pull live Japanese baseball odds in Python from 8 books including Pinnacle, with run lines, totals and free historical data.<\/p>\n","protected":false},"author":2,"featured_media":3158,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7],"tags":[80,8,9,11,10],"class_list":["post-3157","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-how-to-guides","tag-baseball","tag-free-api","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>NPB Odds API: Live Japanese Baseball Odds in Python (Free Tier) | 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\/npb-odds-api\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"NPB Odds API: Live Japanese Baseball Odds in Python (Free Tier) | OddsPapi Blog\" \/>\n<meta property=\"og:description\" content=\"Need an NPB odds API? Pull live Japanese baseball odds in Python from 8 books including Pinnacle, with run lines, totals and free historical data.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/oddspapi.io\/blog\/npb-odds-api\/\" \/>\n<meta property=\"og:site_name\" content=\"OddsPapi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-08-03T10:00:00+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/07\/npb-odds-api-scaled.webp\" \/>\n\t<meta property=\"og:image:width\" content=\"2560\" \/>\n\t<meta property=\"og:image:height\" content=\"1429\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/webp\" \/>\n<meta name=\"author\" content=\"Odds API Writer\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/oddspapi.io\/logo-v2.webp\" \/>\n<meta name=\"twitter:creator\" content=\"@oddspapiapi\" \/>\n<meta name=\"twitter:site\" content=\"@oddspapiapi\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Odds API Writer\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/oddspapi.io\/blog\/npb-odds-api\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/npb-odds-api\/\"},\"author\":{\"name\":\"Odds API Writer\",\"@id\":\"https:\/\/oddspapi.io\/blog\/#\/schema\/person\/b6f21e649c4f556f0a95c23a0f1efa13\"},\"headline\":\"NPB Odds API: Live Japanese Baseball Odds in Python (Free Tier)\",\"datePublished\":\"2026-08-03T10:00:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/npb-odds-api\/\"},\"wordCount\":1232,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/npb-odds-api\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/07\/npb-odds-api-scaled.webp\",\"keywords\":[\"Baseball\",\"Free API\",\"Odds API\",\"Python\",\"Sports Betting API\"],\"articleSection\":[\"How To Guides\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/oddspapi.io\/blog\/npb-odds-api\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/oddspapi.io\/blog\/npb-odds-api\/\",\"url\":\"https:\/\/oddspapi.io\/blog\/npb-odds-api\/\",\"name\":\"NPB Odds API: Live Japanese Baseball Odds in Python (Free Tier) | OddsPapi Blog\",\"isPartOf\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/npb-odds-api\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/npb-odds-api\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/07\/npb-odds-api-scaled.webp\",\"datePublished\":\"2026-08-03T10:00:00+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/npb-odds-api\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/oddspapi.io\/blog\/npb-odds-api\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/oddspapi.io\/blog\/npb-odds-api\/#primaryimage\",\"url\":\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/07\/npb-odds-api-scaled.webp\",\"contentUrl\":\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/07\/npb-odds-api-scaled.webp\",\"width\":2560,\"height\":1429,\"caption\":\"NPB Odds API - OddsPapi API Blog\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/oddspapi.io\/blog\/npb-odds-api\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/oddspapi.io\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"NPB Odds API: Live Japanese Baseball Odds in Python (Free Tier)\"}]},{\"@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":"NPB Odds API: Live Japanese Baseball Odds in Python (Free Tier) | 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\/npb-odds-api\/","og_locale":"en_US","og_type":"article","og_title":"NPB Odds API: Live Japanese Baseball Odds in Python (Free Tier) | OddsPapi Blog","og_description":"Need an NPB odds API? Pull live Japanese baseball odds in Python from 8 books including Pinnacle, with run lines, totals and free historical data.","og_url":"https:\/\/oddspapi.io\/blog\/npb-odds-api\/","og_site_name":"OddsPapi Blog","article_published_time":"2026-08-03T10:00:00+00:00","og_image":[{"width":2560,"height":1429,"url":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/07\/npb-odds-api-scaled.webp","type":"image\/webp"}],"author":"Odds API Writer","twitter_card":"summary_large_image","twitter_image":"https:\/\/oddspapi.io\/logo-v2.webp","twitter_creator":"@oddspapiapi","twitter_site":"@oddspapiapi","twitter_misc":{"Written by":"Odds API Writer","Est. reading time":"8 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/oddspapi.io\/blog\/npb-odds-api\/#article","isPartOf":{"@id":"https:\/\/oddspapi.io\/blog\/npb-odds-api\/"},"author":{"name":"Odds API Writer","@id":"https:\/\/oddspapi.io\/blog\/#\/schema\/person\/b6f21e649c4f556f0a95c23a0f1efa13"},"headline":"NPB Odds API: Live Japanese Baseball Odds in Python (Free Tier)","datePublished":"2026-08-03T10:00:00+00:00","mainEntityOfPage":{"@id":"https:\/\/oddspapi.io\/blog\/npb-odds-api\/"},"wordCount":1232,"commentCount":0,"publisher":{"@id":"https:\/\/oddspapi.io\/blog\/#organization"},"image":{"@id":"https:\/\/oddspapi.io\/blog\/npb-odds-api\/#primaryimage"},"thumbnailUrl":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/07\/npb-odds-api-scaled.webp","keywords":["Baseball","Free API","Odds API","Python","Sports Betting API"],"articleSection":["How To Guides"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/oddspapi.io\/blog\/npb-odds-api\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/oddspapi.io\/blog\/npb-odds-api\/","url":"https:\/\/oddspapi.io\/blog\/npb-odds-api\/","name":"NPB Odds API: Live Japanese Baseball Odds in Python (Free Tier) | OddsPapi Blog","isPartOf":{"@id":"https:\/\/oddspapi.io\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/oddspapi.io\/blog\/npb-odds-api\/#primaryimage"},"image":{"@id":"https:\/\/oddspapi.io\/blog\/npb-odds-api\/#primaryimage"},"thumbnailUrl":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/07\/npb-odds-api-scaled.webp","datePublished":"2026-08-03T10:00:00+00:00","breadcrumb":{"@id":"https:\/\/oddspapi.io\/blog\/npb-odds-api\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/oddspapi.io\/blog\/npb-odds-api\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/oddspapi.io\/blog\/npb-odds-api\/#primaryimage","url":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/07\/npb-odds-api-scaled.webp","contentUrl":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/07\/npb-odds-api-scaled.webp","width":2560,"height":1429,"caption":"NPB Odds API - OddsPapi API Blog"},{"@type":"BreadcrumbList","@id":"https:\/\/oddspapi.io\/blog\/npb-odds-api\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/oddspapi.io\/blog\/"},{"@type":"ListItem","position":2,"name":"NPB Odds API: Live Japanese Baseball Odds in Python (Free Tier)"}]},{"@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\/3157","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=3157"}],"version-history":[{"count":1,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/posts\/3157\/revisions"}],"predecessor-version":[{"id":3159,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/posts\/3157\/revisions\/3159"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/media\/3158"}],"wp:attachment":[{"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/media?parent=3157"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/categories?post=3157"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/tags?post=3157"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}