Skip to main content

Get Player Prop Odds in Real Time

Player props are one of the fastest-growing betting markets. From LeBron James’ points to Patrick Mahomes’ passing yards, player props create unique betting experiences that appeal to both fantasy players and casual fans. Odds-API.io provides comprehensive player props coverage with real-time updates from 250+ bookmakers, including US leaders like DraftKings and FanDuel.

Why Player Props Matter

Market Growth

Props account for a rising percentage of total betting handle, especially in the US

User Engagement

Casual fans often prefer player-focused bets over team outcomes

Fantasy Crossover

Many fantasy platforms are blending with prop betting year-round

App Differentiation

Offering props helps apps stand out and capture larger audiences

Available Props Coverage

  • NBA: Points, rebounds, assists, three-pointers, double-doubles, and more
  • NFL: Passing yards, rushing yards, touchdowns, receptions, completions, and more
  • MLB: Strikeouts, home runs, total bases, hits, RBIs, and more
  • NHL: Goals, shots on goal, saves, assists, points, and more
  • NCAAF: Same as NFL props
  • And more: Soccer, tennis, esports player props

Fetching Player Props

Player props are available through the same /v3/odds endpoint:
curl "https://api.odds-api.io/v3/odds?apiKey=YOUR_API_KEY&eventId=123456&bookmakers=DraftKings,FanDuel"

Example Response

{
  "id": 123456,
  "sport": {
    "name": "Basketball",
    "slug": "basketball"
  },
  "league": {
    "name": "NBA",
    "slug": "nba"
  },
  "home": "Los Angeles Lakers",
  "away": "Boston Celtics",
  "date": "2025-10-15T19:00:00Z",
  "status": "pending",
  "bookmakers": {
    "DraftKings": [
      {
        "name": "Player Props - Points",
        "odds": [
          {
            "label": "LeBron James",
            "hdp": 27.5,
            "over": "1.90",
            "under": "1.90"
          },
          {
            "label": "Anthony Davis",
            "hdp": 24.5,
            "over": "1.95",
            "under": "1.85"
          }
        ]
      },
      {
        "name": "Player Props - Rebounds",
        "odds": [
          {
            "label": "Anthony Davis",
            "hdp": 11.5,
            "over": "1.88",
            "under": "1.92"
          }
        ]
      }
    ],
    "FanDuel": [
      {
        "name": "Player Props - Points",
        "odds": [
          {
            "label": "LeBron James",
            "hdp": 28.5,
            "over": "1.85",
            "under": "1.95"
          }
        ]
      }
    ]
  }
}

Building a Props Comparison Tool

Compare player prop odds across multiple bookmakers:
function comparePlayerProps(oddsData, playerName, statType) {
  const results = [];

  Object.entries(oddsData.bookmakers).forEach(([bookmaker, markets]) => {
    markets.forEach(market => {
      // Check if this is the right prop type
      if (!market.name.includes(statType)) return;

      // Find the player
      const playerProp = market.odds.find(
        prop => prop.label === playerName
      );

      if (playerProp) {
        results.push({
          bookmaker,
          line: playerProp.hdp,
          over: parseFloat(playerProp.over),
          under: parseFloat(playerProp.under)
        });
      }
    });
  });

  // Find best over and under odds
  const bestOver = results.reduce((best, curr) =>
    curr.over > best.over ? curr : best
  );

  const bestUnder = results.reduce((best, curr) =>
    curr.under > best.under ? curr : best
  );

  return {
    player: playerName,
    stat: statType,
    allBooks: results,
    bestOver: {
      bookmaker: bestOver.bookmaker,
      line: bestOver.line,
      odds: bestOver.over
    },
    bestUnder: {
      bookmaker: bestUnder.bookmaker,
      line: bestUnder.line,
      odds: bestUnder.under
    }
  };
}

// Usage
const comparison = comparePlayerProps(
  oddsData,
  'LeBron James',
  'Points'
);

console.log(`\nBest odds for LeBron James Points:\n`);
console.log(`Over ${comparison.bestOver.line}: ${comparison.bestOver.odds} at ${comparison.bestOver.bookmaker}`);
console.log(`Under ${comparison.bestUnder.line}: ${comparison.bestUnder.odds} at ${comparison.bestUnder.bookmaker}`);
Output:
Best odds for LeBron James Points:

Over 27.5: 1.90 at DraftKings
Under 28.5: 1.95 at FanDuel

NFL Player Props Example

Fetch quarterback passing yards props:
async function getNFLPlayerProps(eventId) {
  const apiKey = process.env.ODDS_API_KEY;
  const bookmakers = 'DraftKings,FanDuel,BetMGM,Caesars';

  const response = await fetch(
    `https://api.odds-api.io/v3/odds?apiKey=${apiKey}&eventId=${eventId}&bookmakers=${bookmakers}`
  );

  const data = await response.json();

  // Extract passing yards props
  const passingYards = [];

  Object.entries(data.bookmakers).forEach(([bookmaker, markets]) => {
    markets.forEach(market => {
      if (market.name.includes('Passing Yards')) {
        market.odds.forEach(prop => {
          passingYards.push({
            bookmaker,
            player: prop.label,
            line: prop.hdp,
            overOdds: prop.over,
            underOdds: prop.under
          });
        });
      }
    });
  });

  return passingYards;
}

// Usage
const props = await getNFLPlayerProps(789012);
console.log(`Found ${props.length} passing yards props`);

props.forEach(prop => {
  console.log(`${prop.player} - ${prop.line} yards (${prop.bookmaker})`);
  console.log(`  Over: ${prop.overOdds} | Under: ${prop.underOdds}`);
});

Building a Props Alert System

Get notified when props lines move significantly:
class PropsMonitor {
  constructor(apiKey, eventId, bookmakers) {
    this.apiKey = apiKey;
    this.eventId = eventId;
    this.bookmakers = bookmakers;
    this.previousLines = new Map();
  }

  async checkForLineMovement() {
    const response = await fetch(
      `https://api.odds-api.io/v3/odds?apiKey=${this.apiKey}&eventId=${this.eventId}&bookmakers=${this.bookmakers}`
    );

    const data = await response.json();

    Object.entries(data.bookmakers).forEach(([bookmaker, markets]) => {
      markets.forEach(market => {
        if (!market.name.includes('Props')) return;

        market.odds.forEach(prop => {
          const key = `${bookmaker}-${market.name}-${prop.label}`;
          const currentLine = prop.hdp;
          const previousLine = this.previousLines.get(key);

          if (previousLine && currentLine !== previousLine) {
            const movement = currentLine - previousLine;
            this.sendAlert({
              player: prop.label,
              stat: market.name,
              bookmaker,
              previousLine,
              currentLine,
              movement,
              direction: movement > 0 ? '⬆️ UP' : '⬇️ DOWN'
            });
          }

          this.previousLines.set(key, currentLine);
        });
      });
    });
  }

  sendAlert(data) {
    console.log(`
🚨 Line Movement Alert!

${data.player} - ${data.stat}
Bookmaker: ${data.bookmaker}

${data.previousLine}${data.currentLine} (${data.direction})
Movement: ${Math.abs(data.movement).toFixed(1)} points
    `.trim());
  }

  start(intervalSeconds = 30) {
    console.log('Starting props monitor...');
    this.checkForLineMovement();
    setInterval(() => this.checkForLineMovement(), intervalSeconds * 1000);
  }
}

// Usage
const monitor = new PropsMonitor(
  process.env.ODDS_API_KEY,
  123456,
  'DraftKings,FanDuel'
);

monitor.start(30); // Check every 30 seconds

Fantasy + Props Integration

Combine fantasy projections with betting odds:
async function combineFantasyAndProps(eventId, fantasyProjections) {
  const apiKey = process.env.ODDS_API_KEY;

  const response = await fetch(
    `https://api.odds-api.io/v3/odds?apiKey=${apiKey}&eventId=${eventId}&bookmakers=DraftKings`
  );

  const data = await response.json();

  // Compare fantasy projections vs. betting lines
  const analysis = fantasyProjections.map(projection => {
    const playerProps = findPlayerProps(data, projection.player);

    return {
      player: projection.player,
      fantasyProjection: projection.points,
      bettingLine: playerProps?.hdp,
      difference: projection.points - (playerProps?.hdp || 0),
      recommendation: projection.points > (playerProps?.hdp || 0) ? 'Over' : 'Under'
    };
  });

  return analysis;
}

function findPlayerProps(oddsData, playerName) {
  for (const [bookmaker, markets] of Object.entries(oddsData.bookmakers)) {
    for (const market of markets) {
      if (market.name.includes('Points')) {
        const prop = market.odds.find(p => p.label === playerName);
        if (prop) return prop;
      }
    }
  }
  return null;
}

Sport-Specific Props Coverage

NBA Props

  • Points, rebounds, assists
  • Three-pointers made
  • Double-doubles, triple-doubles
  • Steals, blocks
  • Points + rebounds + assists

NFL Props

  • Passing yards, touchdowns, completions
  • Rushing yards, attempts, touchdowns
  • Receptions, receiving yards, receiving TDs
  • Kicking points

MLB Props

  • Pitcher strikeouts
  • Batter home runs, hits, total bases
  • RBIs, runs scored
  • Stolen bases

NHL Props

  • Goals, assists, points
  • Shots on goal
  • Saves (goalies)
  • Power play points

Best Practices

Props lines move faster than main markets. Poll every 15-30 seconds for pre-game, 5-10 seconds for live.
Not all bookmakers offer props for all players. Always check if data exists before processing.
Props lines can vary significantly between bookmakers - always show users the best available odds.
Some props only appear close to game time. Monitor regularly and update your UI when new props become available.

Use Cases for Developers

Props Comparison

Let users compare player prop odds across all major bookmakers

Fantasy Integration

Combine fantasy stats with live betting odds for player projections

Line Movement Alerts

Notify users when prop lines shift significantly

Same Game Parlays

Build tools for creating and analyzing same-game parlay combinations

Next Steps

Ready to integrate player props? Get your free API key and start building today!
I