Skip to main content
Player prop markets let you get odds on individual player performance — points scored, rebounds, assists, and more. TheRundown V2 API models player props as markets with participant_type of TYPE_PLAYER.

Player Prop Market IDs

Individual Stats

MarketIDDescription
Player Points29Over/Under on points scored
Player Turnovers33Over/Under on turnovers
Player Rebounds35Over/Under on rebounds
Three Pointers Made38Over/Under on 3PT made
Player Assists39Over/Under on assists
Double Double87Yes/No on recording a double-double
Triple Double88Yes/No on recording a triple-double
Player Blocks98Over/Under on blocks

Combo Markets

Combo markets combine two or three stats into a single over/under line.
MarketIDDescription
Player PRA93Points + Rebounds + Assists combined
Player Points + Assists99Points + Assists combined
Player Points + Rebounds297Points + Rebounds combined
Player Rebounds + Assists298Rebounds + Assists combined

Live / In-Play Variants

Live player props use separate market IDs but map to their prematch equivalents.
MarketIDPrematch Equivalent
Live Player Points9029
Live Player Assists9139
Live Three Pointers9238
Live Player Rebounds98235
Live Player Blocks98398
Live Player Turnovers98433

Fetching Player Props

Request player prop markets by including the relevant market_ids in your events request.
# NBA player points, rebounds, assists, and 3PT props
curl "https://therundown.io/api/v2/sports/4/events/2026-02-12?\
key=YOUR_API_KEY&market_ids=29,35,38,39&affiliate_ids=19,23"

Understanding Participants in Player Props

In player prop markets, participants represent the player (not the team). Each participant has:
FieldDescription
participant_idUnique numeric identifier for the player
namePlayer name (e.g., “LeBron James”)
participant_typeTYPE_PLAYER for player props
Within each participant, the lines array contains the over/under values and their prices from each sportsbook.

Example Response Structure

{
  "market_id": 29,
  "name": "Player Points",
  "period_id": 0,
  "participants": [
    {
      "participant_id": 12345,
      "name": "LeBron James Over",
      "participant_type": "TYPE_OVER",
      "lines": [
        {
          "line": 25.5,
          "is_main": true,
          "prices": {
            "19": { "price": -115, "affiliate_id": 19 },
            "23": { "price": -110, "affiliate_id": 23 }
          }
        }
      ]
    },
    {
      "participant_id": 12345,
      "name": "LeBron James Under",
      "participant_type": "TYPE_UNDER",
      "lines": [
        {
          "line": 25.5,
          "is_main": true,
          "prices": {
            "19": { "price": -105, "affiliate_id": 19 },
            "23": { "price": -110, "affiliate_id": 23 }
          }
        }
      ]
    }
  ]
}

Fetching Combo Props

Combo markets combine multiple stats. The request pattern is the same — just use the combo market IDs.
# Fetch combo props: PRA, PA, PR, RA
COMBO_MARKETS = "93,99,297,298"

response = requests.get(
    f"{BASE_URL}/sports/4/events/{date.today()}",
    params={
        "key": API_KEY,
        "market_ids": COMBO_MARKETS,
        "affiliate_ids": "19",
    }
)

data = response.json()
for event in data["events"]:
    print(f"\n{event['teams'][0]['name']} @ {event['teams'][1]['name']}")
    for market in event.get("markets", []):
        print(f"\n  {market['name']}:")
        for participant in market["participants"]:
            for line in participant["lines"]:
                price_obj = line["prices"].get("19", {})
                price = price_obj.get("price", "N/A")
                print(f"    {participant['name']}: {line.get('line')} ({price})")

Fetching All Props at Once

You can request all prop market IDs in a single call. This is useful if you want to build a comprehensive player props page.
# All individual + combo props
curl "https://therundown.io/api/v2/sports/4/events/2026-02-12?\
key=YOUR_API_KEY\
&market_ids=29,33,35,38,39,87,88,93,98,99,297,298\
&affiliate_ids=19,23"

Live Player Props

Live player props are available once a game starts. Use the live market IDs to fetch in-play prop odds.
# Live player points (90), assists (91), 3PT (92)
curl "https://therundown.io/api/v2/sports/4/events/2026-02-12?\
key=YOUR_API_KEY&market_ids=90,91,92&affiliate_ids=19"
You can also subscribe to live prop updates via the V2 Markets WebSocket:
const ws = new WebSocket(
  "wss://therundown.io/api/v2/ws/markets?key=YOUR_API_KEY&sport_ids=4&market_ids=90,91,92"
);

ws.onmessage = (event) => {
  const data = JSON.parse(event.data);
  if (data.meta?.type === "heartbeat") return;

  console.log(`Live prop update: market=${data.market_id}`);
  for (const participant of data.participants || []) {
    console.log(`  ${participant.name}`);
  }
};

Building a Player Props Display

Here is a complete example that organizes props by player for display in a UI.
import requests
from collections import defaultdict
from datetime import date

API_KEY = "YOUR_API_KEY"
BASE_URL = "https://therundown.io/api/v2"

MARKET_NAMES = {
    29: "Points", 35: "Rebounds", 38: "3PT Made",
    39: "Assists", 93: "PRA", 98: "Blocks",
    99: "Pts+Ast", 297: "Pts+Reb", 298: "Reb+Ast",
}

response = requests.get(
    f"{BASE_URL}/sports/4/events/{date.today()}",
    params={
        "key": API_KEY,
        "market_ids": ",".join(str(m) for m in MARKET_NAMES),
        "affiliate_ids": "19",
        "main_line": "true",
    }
)

data = response.json()

for event in data["events"]:
    home = event["teams"][1]["name"]
    away = event["teams"][0]["name"]
    print(f"\n{'=' * 60}")
    print(f"{away} @ {home}")
    print(f"{'=' * 60}")

    # Group props by player
    players = defaultdict(list)

    for market in event.get("markets", []):
        mid = market["market_id"]
        market_label = MARKET_NAMES.get(mid, market["name"])

        for participant in market["participants"]:
            # Extract player name (remove "Over"/"Under" suffix)
            player_name = participant["name"]
            for suffix in [" Over", " Under"]:
                player_name = player_name.replace(suffix, "")

            is_over = "Over" in participant.get("name", "") or \
                participant.get("participant_type") == "TYPE_OVER"

            for line in participant["lines"]:
                price_obj = line["prices"].get("19", {})
                price = price_obj.get("price")
                if price == 0.0001:
                    price = None

                players[player_name].append({
                    "market": market_label,
                    "line": line.get("line"),
                    "side": "Over" if is_over else "Under",
                    "price": price,
                })

    # Display grouped by player
    for player, props in sorted(players.items()):
        print(f"\n  {player}:")
        for prop in props:
            price_str = f"{prop['price']:+d}" if prop["price"] else "N/A"
            print(f"    {prop['market']}: {prop['side']} {prop['line']} ({price_str})")

Next Steps