{"id":2520,"date":"2026-03-19T10:00:00","date_gmt":"2026-03-19T10:00:00","guid":{"rendered":"https:\/\/oddspapi.io\/blog\/?p=2520"},"modified":"2026-03-20T17:58:38","modified_gmt":"2026-03-20T17:58:38","slug":"nba-odds-api-player-props-spreads","status":"publish","type":"post","link":"https:\/\/oddspapi.io\/blog\/nba-odds-api-player-props-spreads\/","title":{"rendered":"NBA Odds API: Player Props, Spreads &#038; Moneylines"},"content":{"rendered":"<h2>Why You Need an NBA Odds API<\/h2>\n<p>The NBA betting market moves fast. Lines shift within seconds of injury reports. Player props are the fastest-growing market in US sports betting. If you&#8217;re building models, scanners, or dashboards \u2014 you need more than DraftKings and FanDuel. You need the sharp line from Pinnacle, you need 117 bookmakers, and you need 1,154 markets per game.<\/p>\n<p>Most APIs give you moneylines from 20 soft books. OddsPapi gives you moneylines, spreads, totals, player props, halves, and quarters from 117+ bookmakers \u2014 including the sharps that set the market. Pinnacle, Singbet, SBOBet. The books that move first.<\/p>\n<p>One API call. 117 bookmakers. 1,154 markets. Every NBA game. Let&#8217;s build.<\/p>\n<h2>NBA 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><strong>117+<\/strong><\/td>\n<\/tr>\n<tr>\n<td>Moneylines<\/td>\n<td>Yes<\/td>\n<td>Yes<\/td>\n<td><strong>Yes (111 books)<\/strong><\/td>\n<\/tr>\n<tr>\n<td>Spreads<\/td>\n<td>Basic<\/td>\n<td>Yes<\/td>\n<td><strong>Every line (76-93 books)<\/strong><\/td>\n<\/tr>\n<tr>\n<td>Game Totals<\/td>\n<td>Basic<\/td>\n<td>Yes<\/td>\n<td><strong>Every line (82-95 books)<\/strong><\/td>\n<\/tr>\n<tr>\n<td>Player Props<\/td>\n<td>No<\/td>\n<td>Limited<\/td>\n<td><strong>Yes (full depth)<\/strong><\/td>\n<\/tr>\n<tr>\n<td>Half\/Quarter lines<\/td>\n<td>No<\/td>\n<td>Limited<\/td>\n<td><strong>Yes (1H, 1Q, team totals)<\/strong><\/td>\n<\/tr>\n<tr>\n<td>Sharp books (Pinnacle)<\/td>\n<td>No<\/td>\n<td>No<\/td>\n<td><strong>Yes<\/strong><\/td>\n<\/tr>\n<tr>\n<td>DraftKings\/FanDuel<\/td>\n<td>Yes<\/td>\n<td>Yes<\/td>\n<td><strong>Yes<\/strong><\/td>\n<\/tr>\n<tr>\n<td>Free tier<\/td>\n<td>500 req\/mo<\/td>\n<td>Limited<\/td>\n<td><strong>250 req\/mo<\/strong><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>OddsPapi also includes <strong>free historical odds data<\/strong> on the free tier \u2014 backtest your NBA models without paying a cent. Competitors charge extra for this. And when you need real-time updates, <strong>WebSocket streaming<\/strong> pushes line changes to your app the instant they happen. No polling. No stale data.<\/p>\n<h2>1,154 Markets Per Game: What&#8217;s Covered<\/h2>\n<p>Every NBA fixture on OddsPapi comes loaded with markets. Here&#8217;s what you&#8217;re working with:<\/p>\n<figure class=\"wp-block-table\">\n<table>\n<thead>\n<tr>\n<th>Market Type<\/th>\n<th>Market ID(s)<\/th>\n<th>Books<\/th>\n<th>Notes<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Moneyline<\/td>\n<td>111<\/td>\n<td>111+<\/td>\n<td>Stable ID. Home\/Away.<\/td>\n<\/tr>\n<tr>\n<td>Game Spread<\/td>\n<td>113xx-114xx<\/td>\n<td>76-93<\/td>\n<td>Each line gets unique ID. Parse <code>bookmakerOutcomeId<\/code> for line value.<\/td>\n<\/tr>\n<tr>\n<td>Game Total (O\/U)<\/td>\n<td>112xx<\/td>\n<td>82-95<\/td>\n<td>Each line gets unique ID. Parse <code>bookmakerOutcomeId<\/code> for line.<\/td>\n<\/tr>\n<tr>\n<td>1st Half Moneyline<\/td>\n<td>11344<\/td>\n<td>~60<\/td>\n<td>Home\/Away for first half.<\/td>\n<\/tr>\n<tr>\n<td>1st Quarter Moneyline<\/td>\n<td>11350<\/td>\n<td>~50<\/td>\n<td>Home\/Away for first quarter.<\/td>\n<\/tr>\n<tr>\n<td>1st Half Spread<\/td>\n<td>118xxx<\/td>\n<td>~40<\/td>\n<td>Dynamic per line.<\/td>\n<\/tr>\n<tr>\n<td>Team Totals<\/td>\n<td>111xxx<\/td>\n<td>~30<\/td>\n<td>Home and away team totals separate.<\/td>\n<\/tr>\n<tr>\n<td>Player Props<\/td>\n<td>111xxx<\/td>\n<td>10-30<\/td>\n<td>Each player\/prop combo is a unique market.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<h3>How Spread &amp; Total Market IDs Work<\/h3>\n<p>Unlike soccer&#8217;s fixed market IDs (e.g., 101 for Full Time Result), NBA spreads and totals are dynamic \u2014 each line gets its own market ID per fixture. The <code>bookmakerOutcomeId<\/code> field tells you the actual line: <code>-7.5\/home<\/code> means home team -7.5, <code>228.5\/over<\/code> means game total over 228.5.<\/p>\n<p>This makes it easy to compare the same spread across 90+ bookmakers programmatically. No guessing which market is which \u2014 the <code>bookmakerOutcomeId<\/code> is your decoder ring.<\/p>\n<h2>Python Tutorial: NBA 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 = 11  # Basketball<\/code><\/pre>\n<p>Authentication is simple: pass your API key as a query parameter. No headers, no OAuth, no tokens. <a href=\"https:\/\/oddspapi.io\" target=\"_blank\" rel=\"noopener\">Get a free API key here<\/a>.<\/p>\n<h3>Step 2: Get Tonight&#8217;s NBA Games<\/h3>\n<pre class=\"wp-block-code\"><code>def get_nba_fixtures():\n    \"\"\"Get today's NBA 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    nba = [f for f in fixtures if \"NBA\" in f.get(\"tournamentName\", \"\") and f.get(\"hasOdds\")]\n    print(f\"{len(nba)} NBA games tonight\")\n    return nba\n\ngames = get_nba_fixtures()\nfor g in games:\n    print(f\"  {g['participant1Name']} vs {g['participant2Name']}\")<\/code><\/pre>\n<p>The fixtures endpoint returns a flat list. Filter by <code>tournamentName<\/code> to isolate NBA games. The <code>hasOdds<\/code> flag tells you which fixtures have pricing data available. OddsPapi covers 462 basketball tournaments globally \u2014 NBA, NCAA, EuroLeague, WNBA, CBA, and more.<\/p>\n<h3>Step 3: Fetch Odds from 117+ 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<p>One call to <code>\/odds<\/code> returns every bookmaker, every market, every outcome. The response is a flat dict with <code>bookmakerOdds<\/code> at the top level \u2014 no pagination, no nested wrappers.<\/p>\n<h3>Step 4: Compare Moneylines<\/h3>\n<pre class=\"wp-block-code\"><code>def compare_moneylines(odds_data):\n    \"\"\"Compare moneyline (market 111) across all bookmakers.\"\"\"\n    results = []\n\n    for slug, bookie in odds_data.get(\"bookmakerOdds\", {}).items():\n        market = bookie.get(\"markets\", {}).get(\"111\")\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 = player.get(\"bookmakerOutcomeId\", \"\")\n                price = player.get(\"price\")\n                if \"home\" in str(boid).lower() or outcome_id == list(market[\"outcomes\"].keys())[0]:\n                    row[\"home\"] = price\n                else:\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<p>Market 111 is the moneyline \u2014 the only stable, universal market ID for NBA. Every bookmaker prices it. This function finds the best home and away odds across 111+ books in one pass.<\/p>\n<h3>Step 5: Parse Spreads &amp; Totals<\/h3>\n<pre class=\"wp-block-code\"><code>def find_spreads(odds_data, target_line=None):\n    \"\"\"Find spread markets and compare across bookmakers.\n\n    NBA spreads use dynamic market IDs. The bookmakerOutcomeId\n    contains the line (e.g., '-7.5\/home').\n    \"\"\"\n    spreads = {}  # {line: [{bookmaker, home_price, away_price}]}\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                    # Spread boids look like \"-7.5\/home\" or \"-7.5\/away\"\n                    if \"\/\" in boid and (\"home\" in boid or \"away\" 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                        # Filter to spread-like lines (not totals which are 200+)\n                        if abs(line) > 50:\n                            continue\n\n                        if line not in spreads:\n                            spreads[line] = {}\n                        if slug not in spreads[line]:\n                            spreads[line][slug] = {}\n                        spreads[line][slug][side] = price\n\n    # Show available lines\n    print(f\"Available spread lines: {sorted(spreads.keys())}\")\n\n    # Compare a specific line\n    if target_line and target_line in spreads:\n        line_data = spreads[target_line]\n        print(f\"\\nSpread {target_line} from {len(line_data)} bookmakers:\")\n        print(f\"{'Bookmaker':<20} {'Home':>8} {'Away':>8}\")\n        print(\"-\" * 38)\n        for slug, prices in sorted(line_data.items(), key=lambda x: x[1].get('home', 0), reverse=True)[:10]:\n            print(f\"{slug:<20} {prices.get('home', 'N\/A'):>8} {prices.get('away', 'N\/A'):>8}\")\n\n    return spreads\n\nspreads = find_spreads(odds)<\/code><\/pre>\n<p>The key insight: NBA spreads don&#8217;t have a single market ID. Each line (-7.5, -3.5, +1.5, etc.) gets its own unique market ID per fixture. The <code>bookmakerOutcomeId<\/code> field is your decoder \u2014 it contains both the line and the side in a format like <code>-7.5\/home<\/code>.<\/p>\n<h2>Accessing NBA Player Props<\/h2>\n<p>Player props are where the edge lives in NBA betting. Soft bookmakers are slow to adjust lines after injury news or lineup changes. With 117 bookmakers in one API call, you can spot stale lines in seconds.<\/p>\n<p>Player props use high market IDs (111xxx range). Each player\/prop combination \u2014 LeBron points over 25.5, Curry assists over 6.5 \u2014 gets its own market ID. The <code>playerName<\/code> field identifies the player.<\/p>\n<pre class=\"wp-block-code\"><code>def find_player_props(odds_data):\n    \"\"\"Find player prop markets. Props have playerName set.\"\"\"\n    props = []\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                    name = player.get(\"playerName\")\n                    if name:  # Player props have playerName set\n                        props.append({\n                            \"market_id\": mid,\n                            \"player\": name,\n                            \"price\": player.get(\"price\"),\n                            \"bookmaker\": slug,\n                            \"line\": player.get(\"bookmakerOutcomeId\", \"\")\n                        })\n\n    # Group by player\n    from collections import defaultdict\n    by_player = defaultdict(list)\n    for p in props:\n        by_player[p[\"player\"]].append(p)\n\n    print(f\"Player props found: {len(props)} across {len(by_player)} players\")\n    for player, entries in sorted(by_player.items()):\n        books = len(set(e[\"bookmaker\"] for e in entries))\n        markets = len(set(e[\"market_id\"] for e in entries))\n        print(f\"  {player}: {markets} prop markets from {books} bookmakers\")\n\nfind_player_props(odds)<\/code><\/pre>\n<p>This is the data that sharp bettors use to find value. When DraftKings has Jokic over 25.5 points at -110 and Pinnacle has it at -105, someone is wrong. OddsPapi lets you see both in one response.<\/p>\n<h2>DraftKings vs Pinnacle: Where the Lines Diverge<\/h2>\n<p>DraftKings and FanDuel set the lines that 90% of the US market sees. Pinnacle sets the line that sharps respect. When these two diverge, there&#8217;s opportunity.<\/p>\n<pre class=\"wp-block-code\"><code>def compare_books(odds_data, book1=\"pinnacle\", book2=\"draftkings\"):\n    \"\"\"Compare two bookmakers across all shared markets.\"\"\"\n    b1 = odds_data.get(\"bookmakerOdds\", {}).get(book1, {}).get(\"markets\", {})\n    b2 = odds_data.get(\"bookmakerOdds\", {}).get(book2, {}).get(\"markets\", {})\n\n    shared = set(b1.keys()) & set(b2.keys())\n    print(f\"{book1} markets: {len(b1)}, {book2} markets: {len(b2)}, shared: {len(shared)}\")\n\n    # Compare moneyline\n    if \"111\" in shared:\n        print(f\"\\nMoneyline (market 111):\")\n        for slug, markets in [(book1, b1), (book2, b2)]:\n            m = markets[\"111\"]\n            for oid, outcome in m.get(\"outcomes\", {}).items():\n                for pid, player in outcome.get(\"players\", {}).items():\n                    boid = player.get(\"bookmakerOutcomeId\", oid)\n                    print(f\"  {slug}: {boid} = {player.get('price')}\")\n\ncompare_books(odds)<\/code><\/pre>\n<p>Pinnacle&#8217;s margin on NBA moneylines is typically 2-3%. DraftKings runs 4-5%. That difference is where value bettors and arbitrageurs operate. With OddsPapi, you can compare both \u2014 plus 115 other books \u2014 in a single API call.<\/p>\n<h2>FAQ: NBA Odds API<\/h2>\n<h3>What sport ID is basketball\/NBA?<\/h3>\n<p>Sport ID 11 covers all basketball. The NBA specifically is tournament ID 132. Use <code>sportId=11<\/code> in the fixtures endpoint, then filter by <code>tournamentName<\/code> to isolate NBA games.<\/p>\n<h3>How many bookmakers cover NBA games?<\/h3>\n<p>117+ bookmakers per game, including sharp books like Pinnacle, SBOBet, and Singbet, US books like DraftKings and FanDuel, the Betfair Exchange, and crypto books like 1xBet.<\/p>\n<h3>Do you have NBA player props?<\/h3>\n<p>Yes. Each player\/prop combination has its own market ID in the 111xxx range. The <code>playerName<\/code> field identifies the player, and the <code>bookmakerOutcomeId<\/code> contains the line and direction.<\/p>\n<h3>How do NBA spread market IDs work?<\/h3>\n<p>Each spread line gets a unique market ID per fixture. A game might have 50+ spread markets (one for each line like -7.5, -3.5, +1.5, etc.). Parse the <code>bookmakerOutcomeId<\/code> field to get the actual line \u2014 it&#8217;ll look like <code>-7.5\/home<\/code> or <code>+7.5\/away<\/code>.<\/p>\n<h3>Is the API free for NBA data?<\/h3>\n<p>The free tier gives you 250 requests per month. That&#8217;s enough to check lines for every NBA game, every night. Historical odds data is also included free \u2014 backtest your models without upgrading.<\/p>\n<h3>Do you cover college basketball (NCAA)?<\/h3>\n<p>Yes. OddsPapi covers 462 basketball tournaments globally, including NCAA, EuroLeague, WNBA, CBA (China), NBB (Brazil), and more. Same market depth, same bookmaker coverage.<\/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 basketball\/NBA?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Sport ID 11 covers all basketball. The NBA specifically is tournament ID 132. Use sportId=11 in the fixtures endpoint, then filter by tournamentName to isolate NBA games.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"How many bookmakers cover NBA games?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"117+ bookmakers per game, including sharp books like Pinnacle, SBOBet, and Singbet, US books like DraftKings and FanDuel, the Betfair Exchange, and crypto books like 1xBet.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"Do you have NBA player props?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Yes. Each player\/prop combination has its own market ID in the 111xxx range. The playerName field identifies the player, and the bookmakerOutcomeId contains the line and direction.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"How do NBA spread market IDs work?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Each spread line gets a unique market ID per fixture. Parse the bookmakerOutcomeId field to get the actual line, formatted as -7.5\/home or +7.5\/away.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"Is the API free for NBA data?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"The free tier gives you 250 requests per month. That is enough to check lines for every NBA game, every night. Historical odds data is also included free.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"Do you cover college basketball (NCAA)?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Yes. OddsPapi covers 462 basketball tournaments globally, including NCAA, EuroLeague, WNBA, CBA (China), NBB (Brazil), and more. Same market depth, same bookmaker coverage.\"\n      }\n    }\n  ]\n}\n<\/script><\/p>\n<h2>Start Building with NBA Data<\/h2>\n<p>DraftKings and FanDuel set lines that 90% of bettors see. Pinnacle sets the line that sharps respect. With OddsPapi, you get both \u2014 plus 115 more bookmakers \u2014 in one API call.<\/p>\n<p>117 bookmakers. 1,154 markets. Player props, spreads, totals, halves, quarters. Every NBA game, every night. Free tier included.<\/p>\n<p><strong><a href=\"https:\/\/oddspapi.io\" target=\"_blank\" rel=\"noopener\">Get Your Free API Key<\/a><\/strong><\/p>\n<p><!--\nFocus Keyphrase: nba odds api\nSEO Title: NBA Odds API: Player Props, Spreads & Moneylines from 117+ Bookmakers\nMeta Description: Access NBA odds from DraftKings, Pinnacle & 117+ bookmakers. Moneylines, spreads, totals & player props. Python tutorial with free API tier.\nSlug: nba-odds-api-player-props-spreads\n--><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Access NBA odds from DraftKings, Pinnacle &#038; 350+ bookmakers. Moneylines, spreads, totals &#038; player props. Python tutorial with free API tier.<\/p>\n","protected":false},"author":2,"featured_media":2522,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7],"tags":[8,16,9,11,10],"class_list":["post-2520","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-how-to-guides","tag-free-api","tag-nba","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>NBA Odds API: Player Props, Spreads &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\/nba-odds-api-player-props-spreads\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"NBA Odds API: Player Props, Spreads &amp; Moneylines | Odds API Development Blog\" \/>\n<meta property=\"og:description\" content=\"Access NBA odds from DraftKings, Pinnacle &amp; 350+ bookmakers. Moneylines, spreads, totals &amp; player props. Python tutorial with free API tier.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/oddspapi.io\/blog\/nba-odds-api-player-props-spreads\/\" \/>\n<meta property=\"og:site_name\" content=\"Odds API Development Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-03-19T10:00:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-03-20T17:58:38+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/03\/nba-odds-api-player-props-spreads-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=\"9 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/oddspapi.io\/blog\/nba-odds-api-player-props-spreads\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/nba-odds-api-player-props-spreads\/\"},\"author\":{\"name\":\"Odds API Writer\",\"@id\":\"https:\/\/oddspapi.io\/blog\/#\/schema\/person\/b6f21e649c4f556f0a95c23a0f1efa13\"},\"headline\":\"NBA Odds API: Player Props, Spreads &#038; Moneylines\",\"datePublished\":\"2026-03-19T10:00:00+00:00\",\"dateModified\":\"2026-03-20T17:58:38+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/nba-odds-api-player-props-spreads\/\"},\"wordCount\":1027,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/nba-odds-api-player-props-spreads\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/03\/nba-odds-api-player-props-spreads-scaled.webp\",\"keywords\":[\"Free API\",\"NBA\",\"Odds API\",\"Python\",\"Sports Betting API\"],\"articleSection\":[\"How To Guides\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/oddspapi.io\/blog\/nba-odds-api-player-props-spreads\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/oddspapi.io\/blog\/nba-odds-api-player-props-spreads\/\",\"url\":\"https:\/\/oddspapi.io\/blog\/nba-odds-api-player-props-spreads\/\",\"name\":\"NBA Odds API: Player Props, Spreads & Moneylines | Odds API Development Blog\",\"isPartOf\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/nba-odds-api-player-props-spreads\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/nba-odds-api-player-props-spreads\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/03\/nba-odds-api-player-props-spreads-scaled.webp\",\"datePublished\":\"2026-03-19T10:00:00+00:00\",\"dateModified\":\"2026-03-20T17:58:38+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/oddspapi.io\/blog\/nba-odds-api-player-props-spreads\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/oddspapi.io\/blog\/nba-odds-api-player-props-spreads\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/oddspapi.io\/blog\/nba-odds-api-player-props-spreads\/#primaryimage\",\"url\":\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/03\/nba-odds-api-player-props-spreads-scaled.webp\",\"contentUrl\":\"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/03\/nba-odds-api-player-props-spreads-scaled.webp\",\"width\":2560,\"height\":1429,\"caption\":\"NBA Odds API - OddsPapi API Blog\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/oddspapi.io\/blog\/nba-odds-api-player-props-spreads\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/oddspapi.io\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"NBA Odds API: Player Props, Spreads &#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":"NBA Odds API: Player Props, Spreads & 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\/nba-odds-api-player-props-spreads\/","og_locale":"en_US","og_type":"article","og_title":"NBA Odds API: Player Props, Spreads & Moneylines | Odds API Development Blog","og_description":"Access NBA odds from DraftKings, Pinnacle & 350+ bookmakers. Moneylines, spreads, totals & player props. Python tutorial with free API tier.","og_url":"https:\/\/oddspapi.io\/blog\/nba-odds-api-player-props-spreads\/","og_site_name":"Odds API Development Blog","article_published_time":"2026-03-19T10:00:00+00:00","article_modified_time":"2026-03-20T17:58:38+00:00","og_image":[{"width":2560,"height":1429,"url":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/03\/nba-odds-api-player-props-spreads-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":"9 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/oddspapi.io\/blog\/nba-odds-api-player-props-spreads\/#article","isPartOf":{"@id":"https:\/\/oddspapi.io\/blog\/nba-odds-api-player-props-spreads\/"},"author":{"name":"Odds API Writer","@id":"https:\/\/oddspapi.io\/blog\/#\/schema\/person\/b6f21e649c4f556f0a95c23a0f1efa13"},"headline":"NBA Odds API: Player Props, Spreads &#038; Moneylines","datePublished":"2026-03-19T10:00:00+00:00","dateModified":"2026-03-20T17:58:38+00:00","mainEntityOfPage":{"@id":"https:\/\/oddspapi.io\/blog\/nba-odds-api-player-props-spreads\/"},"wordCount":1027,"commentCount":0,"publisher":{"@id":"https:\/\/oddspapi.io\/blog\/#organization"},"image":{"@id":"https:\/\/oddspapi.io\/blog\/nba-odds-api-player-props-spreads\/#primaryimage"},"thumbnailUrl":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/03\/nba-odds-api-player-props-spreads-scaled.webp","keywords":["Free API","NBA","Odds API","Python","Sports Betting API"],"articleSection":["How To Guides"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/oddspapi.io\/blog\/nba-odds-api-player-props-spreads\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/oddspapi.io\/blog\/nba-odds-api-player-props-spreads\/","url":"https:\/\/oddspapi.io\/blog\/nba-odds-api-player-props-spreads\/","name":"NBA Odds API: Player Props, Spreads & Moneylines | Odds API Development Blog","isPartOf":{"@id":"https:\/\/oddspapi.io\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/oddspapi.io\/blog\/nba-odds-api-player-props-spreads\/#primaryimage"},"image":{"@id":"https:\/\/oddspapi.io\/blog\/nba-odds-api-player-props-spreads\/#primaryimage"},"thumbnailUrl":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/03\/nba-odds-api-player-props-spreads-scaled.webp","datePublished":"2026-03-19T10:00:00+00:00","dateModified":"2026-03-20T17:58:38+00:00","breadcrumb":{"@id":"https:\/\/oddspapi.io\/blog\/nba-odds-api-player-props-spreads\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/oddspapi.io\/blog\/nba-odds-api-player-props-spreads\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/oddspapi.io\/blog\/nba-odds-api-player-props-spreads\/#primaryimage","url":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/03\/nba-odds-api-player-props-spreads-scaled.webp","contentUrl":"https:\/\/oddspapi.io\/blog\/wp-content\/uploads\/2026\/03\/nba-odds-api-player-props-spreads-scaled.webp","width":2560,"height":1429,"caption":"NBA Odds API - OddsPapi API Blog"},{"@type":"BreadcrumbList","@id":"https:\/\/oddspapi.io\/blog\/nba-odds-api-player-props-spreads\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/oddspapi.io\/blog\/"},{"@type":"ListItem","position":2,"name":"NBA Odds API: Player Props, Spreads &#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\/2520","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=2520"}],"version-history":[{"count":2,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/posts\/2520\/revisions"}],"predecessor-version":[{"id":2534,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/posts\/2520\/revisions\/2534"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/media\/2522"}],"wp:attachment":[{"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/media?parent=2520"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/categories?post=2520"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/oddspapi.io\/blog\/wp-json\/wp\/v2\/tags?post=2520"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}