{"id":2523,"date":"2026-03-20T10:00:00","date_gmt":"2026-03-20T10:00:00","guid":{"rendered":"https:\/\/oddspapi.io\/blog\/?p=2523"},"modified":"2026-03-20T17:58:40","modified_gmt":"2026-03-20T17:58:40","slug":"mlb-odds-api-run-lines-totals","status":"publish","type":"post","link":"https:\/\/oddspapi.io\/blog\/mlb-odds-api-run-lines-totals\/","title":{"rendered":"MLB Odds API: Run Lines, Totals &#038; Moneylines"},"content":{"rendered":"<h2>MLB Season Is Here. Your Odds API Should Be Ready.<\/h2>\n<p>The 2026 MLB season means 2,430 regular-season games, each with moneylines, run lines, totals, and an expanding player props market. If you are building models, tracking line movement, or scanning for value \u2014 you need odds from more than 20 bookmakers. You need the sharp line. You need it in JSON.<\/p>\n<p>Most odds APIs cover a handful of soft US books \u2014 DraftKings, FanDuel, maybe a dozen others. That is fine if you are building a basic tracker. But if you are serious about MLB modeling, you need Pinnacle. You need to see where the sharp money is moving. And you need it alongside the soft books so you can compare.<\/p>\n<p>OddsPapi gives you 80+ bookmakers per MLB game \u2014 100+ expected for regular season \u2014 including Pinnacle, the sharp benchmark that soft books follow. Moneylines, run lines, totals, alt lines, and player props. All in one API call. Free tier included.<\/p>\n<h2>MLB Odds Coverage: OddsPapi vs The Competition<\/h2>\n<figure class=\"wp-block-table\">\n<table>\n<thead>\n<tr>\n<th>Feature<\/th>\n<th>The Odds API<\/th>\n<th>SportsGameOdds<\/th>\n<th>OddsPapi<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Bookmakers per game<\/td>\n<td>~15-20<\/td>\n<td>~30<\/td>\n<td>80-100+<\/td>\n<\/tr>\n<tr>\n<td>Moneyline<\/td>\n<td>Yes<\/td>\n<td>Yes<\/td>\n<td>Yes (81+ books)<\/td>\n<\/tr>\n<tr>\n<td>Run Line (-1.5)<\/td>\n<td>Yes<\/td>\n<td>Yes<\/td>\n<td>Yes (51+ books)<\/td>\n<\/tr>\n<tr>\n<td>Game Totals (O\/U)<\/td>\n<td>Basic<\/td>\n<td>Yes<\/td>\n<td>Multiple lines (42+ books)<\/td>\n<\/tr>\n<tr>\n<td>Alt Run Lines<\/td>\n<td>No<\/td>\n<td>Limited<\/td>\n<td>Yes<\/td>\n<\/tr>\n<tr>\n<td>Player Props<\/td>\n<td>No<\/td>\n<td>Limited<\/td>\n<td>Growing coverage<\/td>\n<\/tr>\n<tr>\n<td>Pinnacle<\/td>\n<td>No<\/td>\n<td>No<\/td>\n<td>Yes<\/td>\n<\/tr>\n<tr>\n<td>DraftKings\/FanDuel<\/td>\n<td>Yes<\/td>\n<td>Yes<\/td>\n<td>Yes<\/td>\n<\/tr>\n<tr>\n<td>NPB \/ KBO \/ International<\/td>\n<td>No<\/td>\n<td>No<\/td>\n<td>Yes<\/td>\n<\/tr>\n<tr>\n<td>Free tier<\/td>\n<td>500 req\/mo<\/td>\n<td>Limited<\/td>\n<td>250 req\/mo<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<h2>65 Tournaments: MLB, NPB, KBO &amp; More<\/h2>\n<p>OddsPapi covers 65 baseball tournaments worldwide \u2014 not just MLB. If you are building models for international baseball, you are covered. Most APIs do not even list these tournaments.<\/p>\n<figure class=\"wp-block-table\">\n<table>\n<thead>\n<tr>\n<th>Tournament<\/th>\n<th>ID<\/th>\n<th>Coverage<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>MLB Regular Season<\/td>\n<td>109<\/td>\n<td>Full \u2014 moneylines, run lines, totals, props<\/td>\n<\/tr>\n<tr>\n<td>MLB Spring Training<\/td>\n<td>2456<\/td>\n<td>Pre-season \u2014 moneylines, run lines, totals<\/td>\n<\/tr>\n<tr>\n<td>NPB (Japan)<\/td>\n<td>1036<\/td>\n<td>Full<\/td>\n<\/tr>\n<tr>\n<td>KBO League (Korea)<\/td>\n<td>2541<\/td>\n<td>Full<\/td>\n<\/tr>\n<tr>\n<td>CPBL (Taiwan)<\/td>\n<td>32233<\/td>\n<td>Full<\/td>\n<\/tr>\n<tr>\n<td>Mexican League (LMB)<\/td>\n<td>1030<\/td>\n<td>Full<\/td>\n<\/tr>\n<tr>\n<td>NCAA Baseball<\/td>\n<td>varies<\/td>\n<td>College<\/td>\n<\/tr>\n<tr>\n<td>World Baseball Classic<\/td>\n<td>640<\/td>\n<td>Full<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>Japanese (NPB), Korean (KBO), Taiwanese (CPBL), and Mexican (LMB) leagues all get full odds coverage with the same bookmaker depth. Build one parser, cover every league.<\/p>\n<h2>MLB Markets: Moneylines, Run Lines &amp; Totals<\/h2>\n<h3>Moneyline (Market 131)<\/h3>\n<p>The simplest bet: who wins the game. Market ID 131 is stable across all fixtures. With 81+ bookmakers pricing each game, you can find the best line in seconds. No need to check three sportsbook apps \u2014 one API call returns every price.<\/p>\n<p>Outcomes use <code>bookmakerOutcomeId<\/code> values of <code>home<\/code> and <code>away<\/code>. Clean and predictable.<\/p>\n<h3>Run Line (Market 1368)<\/h3>\n<p>The standard MLB handicap: -1.5 for the favorite, +1.5 for the underdog. Baseball&#8217;s run line is more impactful than other sports because of low-scoring games \u2014 a 1.5-run spread matters when roughly 30% of MLB games are decided by one run.<\/p>\n<p>The <code>bookmakerOutcomeId<\/code> contains the line: <code>-1.5\/home<\/code> or <code>+1.5\/away<\/code>. 51+ bookmakers price this market per game.<\/p>\n<h3>Over\/Under (Market 1338+)<\/h3>\n<p>Total runs scored. Each total line gets its own market ID. The <code>bookmakerOutcomeId<\/code> tells you the line \u2014 <code>8.5\/over<\/code>, <code>8.5\/under<\/code>. Multiple lines are available per game, so you can compare pricing across different totals (7.5, 8.0, 8.5, 9.0, etc.).<\/p>\n<h3>Alternative Lines<\/h3>\n<p>Need -2.5 instead of -1.5? Alt run lines (market IDs 1360, 1364) and alt totals (1340+) are available for bettors who want custom spreads and totals. Coverage ranges from 13-15 bookmakers on alt lines.<\/p>\n<h2>Python Tutorial: MLB Odds in 5 Steps<\/h2>\n<h3>Step 1: Setup<\/h3>\n<pre class=\"wp-block-code\"><code>import requests\nfrom datetime import datetime, timedelta\n\nAPI_KEY = \"YOUR_API_KEY\"  # Free at oddspapi.io\nBASE_URL = \"https:\/\/api.oddspapi.io\/v4\"\nSPORT_ID = 13  # Baseball (NOT 16)<\/code><\/pre>\n<p><strong>Important:<\/strong> Baseball is Sport ID 13. This is a common gotcha \u2014 Sport ID 16 is Dota 2, not baseball.<\/p>\n<h3>Step 2: Get Today&#8217;s MLB Games<\/h3>\n<pre class=\"wp-block-code\"><code>def get_mlb_fixtures():\n    \"\"\"Get today's MLB fixtures with odds.\"\"\"\n    today = datetime.now().strftime(\"%Y-%m-%d\")\n    tomorrow = (datetime.now() + timedelta(days=1)).strftime(\"%Y-%m-%d\")\n\n    response = requests.get(f\"{BASE_URL}\/fixtures\", params={\n        \"apiKey\": API_KEY,\n        \"sportId\": SPORT_ID,\n        \"from\": today,\n        \"to\": tomorrow\n    })\n\n    fixtures = response.json()\n    mlb = [f for f in fixtures if f.get(\"hasOdds\") and \"MLB\" in f.get(\"tournamentName\", \"\")]\n    print(f\"{len(mlb)} MLB games today\")\n    return mlb\n\ngames = get_mlb_fixtures()\nfor g in games:\n    print(f\"  {g['participant1Name']} vs {g['participant2Name']}\")<\/code><\/pre>\n<h3>Step 3: Fetch Odds from 80+ Bookmakers<\/h3>\n<pre class=\"wp-block-code\"><code>def get_odds(fixture_id):\n    \"\"\"Get odds from all bookmakers for a game.\"\"\"\n    response = requests.get(f\"{BASE_URL}\/odds\", params={\n        \"apiKey\": API_KEY,\n        \"fixtureId\": fixture_id\n    })\n    return response.json()\n\ngame = games[0]\nodds = get_odds(game[\"fixtureId\"])\nbookmakers = list(odds.get(\"bookmakerOdds\", {}).keys())\nprint(f\"{len(bookmakers)} bookmakers pricing {game['participant1Name']} vs {game['participant2Name']}\")<\/code><\/pre>\n<h3>Step 4: Compare Moneylines<\/h3>\n<pre class=\"wp-block-code\"><code>def compare_moneylines(odds_data):\n    \"\"\"Compare moneyline (market 131) across all bookmakers.\"\"\"\n    results = []\n\n    for slug, bookie in odds_data.get(\"bookmakerOdds\", {}).items():\n        market = bookie.get(\"markets\", {}).get(\"131\")\n        if not market:\n            continue\n\n        row = {\"bookmaker\": slug}\n        for outcome_id, outcome in market.get(\"outcomes\", {}).items():\n            for player_id, player in outcome.get(\"players\", {}).items():\n                boid = str(player.get(\"bookmakerOutcomeId\", \"\"))\n                price = player.get(\"price\")\n                if \"home\" in boid:\n                    row[\"home\"] = price\n                elif \"away\" in boid:\n                    row[\"away\"] = price\n\n        if \"home\" in row and \"away\" in row:\n            results.append(row)\n\n    results.sort(key=lambda x: x.get(\"home\", 0), reverse=True)\n\n    print(f\"\\nMoneylines from {len(results)} bookmakers:\")\n    print(f\"{'Bookmaker':<20} {'Home':>8} {'Away':>8}\")\n    print(\"-\" * 38)\n    for r in results[:10]:\n        print(f\"{r['bookmaker']:<20} {r.get('home', 'N\/A'):>8} {r.get('away', 'N\/A'):>8}\")\n\n    best_home = max(results, key=lambda x: x.get(\"home\", 0))\n    best_away = max(results, key=lambda x: x.get(\"away\", 0))\n    print(f\"\\nBest Home: {best_home['home']} @ {best_home['bookmaker']}\")\n    print(f\"Best Away: {best_away['away']} @ {best_away['bookmaker']}\")\n\ncompare_moneylines(odds)<\/code><\/pre>\n<h3>Step 5: Parse Run Lines &amp; Totals<\/h3>\n<pre class=\"wp-block-code\"><code>def compare_run_lines(odds_data):\n    \"\"\"Compare the standard run line (-1.5\/+1.5) across bookmakers.\n\n    Market 1368 = Run Line (-1.5\/+1.5)\n    bookmakerOutcomeId: '-1.5\/home' or '+1.5\/away'\n    \"\"\"\n    results = []\n\n    for slug, bookie in odds_data.get(\"bookmakerOdds\", {}).items():\n        market = bookie.get(\"markets\", {}).get(\"1368\")\n        if not market:\n            continue\n\n        row = {\"bookmaker\": slug}\n        for outcome_id, outcome in market.get(\"outcomes\", {}).items():\n            for player_id, player in outcome.get(\"players\", {}).items():\n                boid = str(player.get(\"bookmakerOutcomeId\", \"\"))\n                price = player.get(\"price\")\n                if \"-1.5\" in boid:\n                    row[\"fav_minus\"] = price\n                elif \"+1.5\" in boid:\n                    row[\"dog_plus\"] = price\n\n        if \"fav_minus\" in row:\n            results.append(row)\n\n    results.sort(key=lambda x: x.get(\"fav_minus\", 0), reverse=True)\n\n    print(f\"\\nRun Line (-1.5\/+1.5) from {len(results)} bookmakers:\")\n    print(f\"{'Bookmaker':<20} {'Fav -1.5':>10} {'Dog +1.5':>10}\")\n    print(\"-\" * 42)\n    for r in results[:10]:\n        print(f\"{r['bookmaker']:<20} {r.get('fav_minus', 'N\/A'):>10} {r.get('dog_plus', 'N\/A'):>10}\")\n\ncompare_run_lines(odds)\n\n\ndef find_totals(odds_data):\n    \"\"\"Find and compare Over\/Under total runs.\n\n    Totals use dynamic market IDs. Parse bookmakerOutcomeId\n    for the line (e.g., '8.5\/over', '8.5\/under').\n    \"\"\"\n    totals = {}\n\n    for slug, bookie in odds_data.get(\"bookmakerOdds\", {}).items():\n        for mid, market in bookie.get(\"markets\", {}).items():\n            for oid, outcome in market.get(\"outcomes\", {}).items():\n                for pid, player in outcome.get(\"players\", {}).items():\n                    boid = str(player.get(\"bookmakerOutcomeId\", \"\"))\n                    price = player.get(\"price\")\n\n                    if \"\/over\" in boid or \"\/under\" in boid:\n                        parts = boid.split(\"\/\")\n                        try:\n                            line = float(parts[0])\n                            side = parts[1]\n                        except (ValueError, IndexError):\n                            continue\n\n                        if line < 4 or line > 20:\n                            continue\n\n                        if line not in totals:\n                            totals[line] = {}\n                        if slug not in totals[line]:\n                            totals[line][slug] = {}\n                        totals[line][slug][side] = price\n\n    print(f\"\\nAvailable total lines: {sorted(totals.keys())}\")\n\n    for line in sorted(totals.keys()):\n        books = len(totals[line])\n        if books > 5:\n            print(f\"\\n  O\/U {line} from {books} bookmakers:\")\n            for slug, prices in sorted(totals[line].items(), key=lambda x: x[1].get('over', 0), reverse=True)[:5]:\n                print(f\"    {slug:<20} Over {prices.get('over', 'N\/A'):>6}  Under {prices.get('under', 'N\/A'):>6}\")\n\nfind_totals(odds)<\/code><\/pre>\n<h2>Why Line Shopping Matters More in Baseball<\/h2>\n<p>Baseball is the ultimate line-shopping sport. With moneylines instead of point spreads as the primary market, even a 5-cent difference between bookmakers compounds over a 162-game season. Getting +115 instead of +110 on an underdog does not sound like much \u2014 but over 500 bets, it is the difference between profit and breakeven.<\/p>\n<p>Sharp bettors know this. That is why they check Pinnacle first \u2014 it sets the market \u2014 then shop the soft books for better prices. With 80+ bookmakers in one API call, you are not checking 3 sportsbooks. You are checking all of them.<\/p>\n<p>OddsPapi returns odds from Pinnacle, DraftKings, 1xBet, Unibet, Betway, and 75+ more in a single request. Build a best-price scanner in 20 lines of Python.<\/p>\n<h2>Free Historical MLB Odds<\/h2>\n<p>Backtest your MLB models against historical closing lines. Track CLV (Closing Line Value) to see if your predictions beat the market. Most APIs charge extra for historical data \u2014 OddsPapi includes it on the free tier.<\/p>\n<p>Historical data lets you answer questions like: How often does the Pinnacle closing line beat DraftKings? What is the average margin difference between sharp and soft books on MLB moneylines? Does your model beat the closing line consistently?<\/p>\n<p>If the answer to that last question is yes, you have an edge. If not, you need more data, not less.<\/p>\n<h2>FAQ: MLB Odds API<\/h2>\n<h3>What sport ID is baseball\/MLB?<\/h3>\n<p>Sport ID 13. MLB is tournament ID 109. A common mistake is using Sport ID 16, which is Dota 2 \u2014 not baseball.<\/p>\n<h3>How many bookmakers cover MLB games?<\/h3>\n<p>80+ per Spring Training game, with 100+ expected for the regular season. Confirmed bookmakers include Pinnacle, DraftKings, 1xBet, Unibet, and Betway. Bet365 and FanDuel are expected to be added for regular season games.<\/p>\n<h3>What is the run line?<\/h3>\n<p>Baseball&#8217;s standard handicap: -1.5 for the favorite, +1.5 for the underdog. Market ID 1368. The favorite needs to win by 2 or more runs. It is the MLB equivalent of a point spread.<\/p>\n<h3>Do you cover NPB and KBO?<\/h3>\n<p>Yes. Japanese (NPB, tournament ID 1036), Korean (KBO, tournament ID 2541), Taiwanese (CPBL, tournament ID 32233), and Mexican (LMB, tournament ID 1030) leagues are all included with full odds coverage.<\/p>\n<h3>Is the API free for MLB data?<\/h3>\n<p>The free tier gives 250 requests per month. That is enough to track lines for every MLB game daily. Paid plans start at $29\/month for higher volume.<\/p>\n<h3>When does MLB data become available?<\/h3>\n<p>Odds appear as soon as bookmakers post lines, typically 24-48 hours before first pitch. Spring Training data is available now \u2014 start building and testing before the regular season begins.<\/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 sport ID is baseball\/MLB?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Sport ID 13. MLB is tournament ID 109. A common mistake is using Sport ID 16, which is Dota 2, not baseball.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"How many bookmakers cover MLB games?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"80+ per Spring Training game, with 100+ expected for the regular season. Confirmed bookmakers include Pinnacle, DraftKings, 1xBet, Unibet, and Betway.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"What is the run line?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Baseball's standard handicap: -1.5 for the favorite, +1.5 for the underdog. Market ID 1368. The favorite needs to win by 2 or more runs.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"Do you cover NPB and KBO?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Yes. Japanese (NPB), Korean (KBO), Taiwanese (CPBL), and Mexican (LMB) leagues are all included with full odds coverage.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"Is the API free for MLB data?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"The free tier gives 250 requests per month. That is enough to track lines for every MLB game daily. Paid plans start at $29\/month for higher volume.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"When does MLB data become available?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Odds appear as soon as bookmakers post lines, typically 24-48 hours before first pitch. Spring Training data is available now.\"\n      }\n    }\n  ]\n}\n<\/script><\/p>\n<h2>Get Ready for the 2026 MLB Season<\/h2>\n<p>2,430 games. 80+ bookmakers per game. Moneylines, run lines, totals \u2014 all in JSON. Start building your models now with Spring Training data, and be ready when Opening Day hits.<\/p>\n<p>Stop scraping. Stop paying enterprise prices for 20 bookmakers. OddsPapi gives you 300+ bookmakers across all sports, with real-time WebSocket feeds for live games and free historical data for backtesting.<\/p>\n<p><strong><a href=\"https:\/\/oddspapi.io\">Get Your Free API Key<\/a><\/strong> \u2014 no credit card, no enterprise sales call. Sign up and start pulling MLB odds in 60 seconds.<\/p>\n<p><!--\nFocus Keyphrase: mlb odds api\nSEO Title: MLB Odds API: Run Lines, Totals & Moneylines from 80+ Bookmakers\nMeta Description: Access MLB odds from Pinnacle, DraftKings & 80+ bookmakers. Moneylines, run lines, totals & props. Python tutorial with free API. 2026 season ready.\nSlug: mlb-odds-api-run-lines-totals\n--><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Access MLB odds from Pinnacle, DraftKings &#038; 350+ bookmakers. Moneylines, run lines, totals &#038; props. Python tutorial with free API. 2026 season ready.<\/p>\n","protected":false},"author":2,"featured_media":2525,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7],"tags":[8,17,9,11,10],"class_list":["post-2523","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-how-to-guides","tag-free-api","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: Run Lines, Totals &amp; Moneylines | Odds API Development 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-odds-api-run-lines-totals\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"MLB Odds API: Run Lines, Totals &amp; Moneylines | Odds API Development Blog\" \/>\n<meta property=\"og:description\" content=\"Access MLB odds from Pinnacle, DraftKings &amp; 350+ bookmakers. Moneylines, run lines, totals &amp; props. Python tutorial with free API. 2026 season ready.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/oddspapi.io\/blog\/mlb-odds-api-run-lines-totals\/\" \/>\n<meta property=\"og:site_name\" content=\"Odds API Development Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-03-20T10:00:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-03-20T17:58:40+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/03\/mlb-odds-api-run-lines-totals-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\/mlb-odds-api-run-lines-totals\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/mlb-odds-api-run-lines-totals\/\"},\"author\":{\"name\":\"Odds API Writer\",\"@id\":\"https:\/\/oddspapi.io\/blog\/#\/schema\/person\/b6f21e649c4f556f0a95c23a0f1efa13\"},\"headline\":\"MLB Odds API: Run Lines, Totals &#038; Moneylines\",\"datePublished\":\"2026-03-20T10:00:00+00:00\",\"dateModified\":\"2026-03-20T17:58:40+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/mlb-odds-api-run-lines-totals\/\"},\"wordCount\":1055,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/mlb-odds-api-run-lines-totals\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/03\/mlb-odds-api-run-lines-totals-scaled.webp\",\"keywords\":[\"Free API\",\"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-odds-api-run-lines-totals\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/oddspapi.io\/blog\/mlb-odds-api-run-lines-totals\/\",\"url\":\"https:\/\/oddspapi.io\/blog\/mlb-odds-api-run-lines-totals\/\",\"name\":\"MLB Odds API: Run Lines, Totals & Moneylines | Odds API Development Blog\",\"isPartOf\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/mlb-odds-api-run-lines-totals\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/mlb-odds-api-run-lines-totals\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/03\/mlb-odds-api-run-lines-totals-scaled.webp\",\"datePublished\":\"2026-03-20T10:00:00+00:00\",\"dateModified\":\"2026-03-20T17:58:40+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/mlb-odds-api-run-lines-totals\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/oddspapi.io\/blog\/mlb-odds-api-run-lines-totals\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/oddspapi.io\/blog\/mlb-odds-api-run-lines-totals\/#primaryimage\",\"url\":\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/03\/mlb-odds-api-run-lines-totals-scaled.webp\",\"contentUrl\":\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/03\/mlb-odds-api-run-lines-totals-scaled.webp\",\"width\":2560,\"height\":1429,\"caption\":\"MLB Odds API - OddsPapi API Blog\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/oddspapi.io\/blog\/mlb-odds-api-run-lines-totals\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/oddspapi.io\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"MLB Odds API: Run Lines, Totals &#038; Moneylines\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/oddspapi.io\/blog\/#website\",\"url\":\"https:\/\/oddspapi.io\/blog\/\",\"name\":\"OddsPapi\",\"description\":\"Sports Odds APIs 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: Run Lines, Totals & Moneylines | Odds API Development 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-odds-api-run-lines-totals\/","og_locale":"en_US","og_type":"article","og_title":"MLB Odds API: Run Lines, Totals & Moneylines | Odds API Development Blog","og_description":"Access MLB odds from Pinnacle, DraftKings & 350+ bookmakers. Moneylines, run lines, totals & props. Python tutorial with free API. 2026 season ready.","og_url":"https:\/\/oddspapi.io\/blog\/mlb-odds-api-run-lines-totals\/","og_site_name":"Odds API Development Blog","article_published_time":"2026-03-20T10:00:00+00:00","article_modified_time":"2026-03-20T17:58:40+00:00","og_image":[{"width":2560,"height":1429,"url":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/03\/mlb-odds-api-run-lines-totals-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\/mlb-odds-api-run-lines-totals\/#article","isPartOf":{"@id":"https:\/\/oddspapi.io\/blog\/mlb-odds-api-run-lines-totals\/"},"author":{"name":"Odds API Writer","@id":"https:\/\/oddspapi.io\/blog\/#\/schema\/person\/b6f21e649c4f556f0a95c23a0f1efa13"},"headline":"MLB Odds API: Run Lines, Totals &#038; Moneylines","datePublished":"2026-03-20T10:00:00+00:00","dateModified":"2026-03-20T17:58:40+00:00","mainEntityOfPage":{"@id":"https:\/\/oddspapi.io\/blog\/mlb-odds-api-run-lines-totals\/"},"wordCount":1055,"commentCount":0,"publisher":{"@id":"https:\/\/oddspapi.io\/blog\/#organization"},"image":{"@id":"https:\/\/oddspapi.io\/blog\/mlb-odds-api-run-lines-totals\/#primaryimage"},"thumbnailUrl":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/03\/mlb-odds-api-run-lines-totals-scaled.webp","keywords":["Free API","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-odds-api-run-lines-totals\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/oddspapi.io\/blog\/mlb-odds-api-run-lines-totals\/","url":"https:\/\/oddspapi.io\/blog\/mlb-odds-api-run-lines-totals\/","name":"MLB Odds API: Run Lines, Totals & Moneylines | Odds API Development Blog","isPartOf":{"@id":"https:\/\/oddspapi.io\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/oddspapi.io\/blog\/mlb-odds-api-run-lines-totals\/#primaryimage"},"image":{"@id":"https:\/\/oddspapi.io\/blog\/mlb-odds-api-run-lines-totals\/#primaryimage"},"thumbnailUrl":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/03\/mlb-odds-api-run-lines-totals-scaled.webp","datePublished":"2026-03-20T10:00:00+00:00","dateModified":"2026-03-20T17:58:40+00:00","breadcrumb":{"@id":"https:\/\/oddspapi.io\/blog\/mlb-odds-api-run-lines-totals\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/oddspapi.io\/blog\/mlb-odds-api-run-lines-totals\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/oddspapi.io\/blog\/mlb-odds-api-run-lines-totals\/#primaryimage","url":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/03\/mlb-odds-api-run-lines-totals-scaled.webp","contentUrl":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/03\/mlb-odds-api-run-lines-totals-scaled.webp","width":2560,"height":1429,"caption":"MLB Odds API - OddsPapi API Blog"},{"@type":"BreadcrumbList","@id":"https:\/\/oddspapi.io\/blog\/mlb-odds-api-run-lines-totals\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/oddspapi.io\/blog\/"},{"@type":"ListItem","position":2,"name":"MLB Odds API: Run Lines, Totals &#038; Moneylines"}]},{"@type":"WebSite","@id":"https:\/\/oddspapi.io\/blog\/#website","url":"https:\/\/oddspapi.io\/blog\/","name":"OddsPapi","description":"Sports Odds APIs 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\/2523","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=2523"}],"version-history":[{"count":2,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/posts\/2523\/revisions"}],"predecessor-version":[{"id":2535,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/posts\/2523\/revisions\/2535"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/media\/2525"}],"wp:attachment":[{"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/media?parent=2523"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/categories?post=2523"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/tags?post=2523"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}