Skip to content

Guides

How do I compare NBA player prop lines across sportsbooks?

Every sportsbook's points line and over and under price for each player in a game, to find where books post different lines and who pays best on each side.

Code verified October 12, 2026. One call to get_player_props, 10 credits.

The call

game_id comes from list_games or get_schedule. Other markets: rebounds, assists, threes, points + rebounds + assists, blocks and steals. Leave market out for all of them.

import requests
import pandas as pd

API_KEY = "YOUR_API_KEY"

resp = requests.post(
    "https://mcp.dunkapi.com/v1/get_player_props",
    headers={"x-api-key": API_KEY},
    json={
        "game_id": "401810439",
        "market": "player_points",
    },
    timeout=60,
)
resp.raise_for_status()
data = resp.json()["data"]

props = pd.DataFrame(data["props"])
print(props["player_name"].nunique(), "players,", props["bookmaker"].nunique(), "books")
rows = []
for player, g in props.groupby("player_name"):
    low = g[g["line"] == g["line"].min()]    # easiest line to go over
    high = g[g["line"] == g["line"].max()]   # easiest line to go under
    rows.append({
        "player": player,
        "line_low": g["line"].min(),
        "over_book": low.loc[low["over_odds"].idxmax(), "bookmaker"],
        "over_odds": low["over_odds"].max(),
        "line_high": g["line"].max(),
        "under_book": high.loc[high["under_odds"].idxmax(), "bookmaker"],
        "under_odds": high["under_odds"].max(),
    })
table = pd.DataFrame(rows)
table["gap"] = table["line_high"] - table["line_low"]
print(table.sort_values(["gap", "line_high"], ascending=False).head(10).to_string(index=False))
print("players where books disagree on the line:", int((table["gap"] > 0).sum()), "of", len(table))

Replace YOUR_API_KEY with a key from your dashboard. Python needs requests and pandas (pip install requests pandas). JavaScript runs on Node 18 or newer, or in the browser.

What comes back

The data object of the response, trimmed to the first rows. Every field is real output from the run above.

{
  "snapshot_type": "closing",
  "games": 1,
  "props": [
    {
      "game_id": "401810439",
      "game_date": "2026-01-15",
      "player_name": "Al Horford",
      "player_id": "3213",
      "market": "player_points",
      "bookmaker": "betmgm",
      "line": 6.5,
      "over_odds": 100,
      "under_odds": -135,
      "captured_at": "2026-01-16T03:05:37.000Z",
      "source": "the_odds_api"
    },
    {
      "game_id": "401810439",
      "game_date": "2026-01-15",
      "player_name": "Al Horford",
      "player_id": "3213",
      "market": "player_points",
      "bookmaker": "betonlineag",
      "line": 6.5,
      "over_odds": 104,
      "under_odds": -135,
      "captured_at": "2026-01-16T03:05:37.000Z",
      "source": "the_odds_api"
    },
    "...103 more"
  ],
  "count": 105
}

What to do next

  • get_prop_history (10 credits). One player's closing and opening line for every game in a span, with the result against it.
  • search_players (1 credit). Find the player_id to pull one player's props across games.

More guides

Start with 500 free credits every month

No card. REST or MCP.