Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.fieldfunded.com/llms.txt

Use this file to discover all available pages before exploring further.

Build a Player Props Tracker with Live Odds

Player props are the fastest-growing betting market. This guide builds a tracker that fetches player-level markets (points, rebounds, assists, goals, cards, shots) from the FieldFunded API and displays them with live odds updates.

What Are Player Props?

Player props are bets on individual player performance rather than match outcomes. Examples:
SportExample PropsMarket name
Basketball (NBA)LeBron James Over 25.5 PointsPlayer Points O/U
SoccerHaaland Anytime GoalscorerAnytime Goalscorer
American FootballMahomes Over 2.5 Passing TDsPlayer Passing TDs O/U
TennisDjokovic Over 9.5 AcesPlayer Aces O/U
Ice HockeyMcDavid Over 0.5 GoalsPlayer Goals O/U

What You’ll Use

SDK MethodEndpointPurpose
getEventOdds()GET /v1/events/{id}/oddsGet all markets including player props
getEvents()GET /v1/eventsList events with prop markets
search()GET /v1/events/searchFind specific player matchups
checkBet()POST /v1/bets/checkSettle player prop bets

Step 1: Find Player Prop Markets

Player props are returned alongside standard markets in the odds response. Filter by market name patterns:
import { FieldFundedSDK } from '@fieldfunded/sdk';

const ff = new FieldFundedSDK({
  apiKey: process.env.FIELDFUNDED_API_KEY!,
  baseUrl: 'https://api.fieldfunded.com/v1',
});

const odds = await ff.getEventOdds(eventId);

// Filter for player prop markets
const playerProps = odds.markets?.filter((m: any) => {
  const name = m.name.toLowerCase();
  return (
    name.includes('player') ||
    name.includes('goalscorer') ||
    name.includes('assists') ||
    name.includes('rebounds') ||
    name.includes('points') ||
    name.includes('cards') ||
    name.includes('shots')
  );
}) || [];

console.log(`${playerProps.length} player prop markets found`);
for (const prop of playerProps) {
  console.log(`\n${prop.name}:`);
  for (const sel of prop.selections.slice(0, 5)) {
    console.log(`  ${sel.name}: ${sel.odds}`);
  }
}

Step 2: Build a Player Dashboard

Group props by player name for a clean display:
interface PlayerLine {
  player: string;
  market: string;
  line: string;
  odds: number;
  market_id: string;
  selection_id: string;
}

function extractPlayerLines(markets: any[]): PlayerLine[] {
  const lines: PlayerLine[] = [];

  for (const market of markets) {
    for (const sel of market.selections) {
      lines.push({
        player: sel.name.split(' - ')[0] || sel.name,
        market: market.name,
        line: sel.name,
        odds: sel.odds,
        market_id: market.id,
        selection_id: sel.id,
      });
    }
  }

  return lines;
}

const lines = extractPlayerLines(playerProps);

// Group by player
const byPlayer = new Map<string, PlayerLine[]>();
for (const line of lines) {
  const existing = byPlayer.get(line.player) || [];
  existing.push(line);
  byPlayer.set(line.player, existing);
}

for (const [player, props] of byPlayer) {
  console.log(`\n${player}:`);
  for (const prop of props) {
    console.log(`  ${prop.market}${prop.line}: ${prop.odds}`);
  }
}

Step 3: Track Odds Movements

Poll at intervals to detect line movements — useful for finding value:
const previousOdds = new Map<string, number>();

async function checkMovements(eventId: string) {
  const odds = await ff.getEventOdds(eventId);
  const props = odds.markets?.filter((m: any) =>
    m.name.toLowerCase().includes('player')
  ) || [];

  for (const market of props) {
    for (const sel of market.selections) {
      const key = `${market.id}_${sel.id}`;
      const prev = previousOdds.get(key);

      if (prev && prev !== sel.odds) {
        const direction = sel.odds > prev ? 'DRIFTED' : 'SHORTENED';
        console.log(
          `${direction}: ${sel.name} in ${market.name}: ${prev}${sel.odds}`
        );
      }

      previousOdds.set(key, sel.odds);
    }
  }
}

Step 4: Settle Player Prop Bets

Player props settle automatically through the same settlement API as standard markets. Complex props (goalscorer, assists) may take 10-30 minutes after the match ends:
const result = await ff.checkBet({
  event_id: eventId,
  market: 'Anytime Goalscorer',
  selection: 'Erling Haaland',
  stake: 25,
  odds: 1.65,
  market_id: propMarketId,
  selection_id: propSelectionId,
});

console.log(`Result: ${result.status}`);
console.log(`Payout: $${result.payout}`);

Rate Limit Math

ScenarioRequests/dayMonthlyPlan
Check props for 5 events daily5150Free
Poll 3 events every 5 min for 4 hours1444,320Free
Track 20 events with 2-min polling2,40072,000Starter ($29)
Production prop tracker with alerts5,000150,000Starter ($29)
Player props are fetched as part of the standard odds response — no extra endpoints or charges.

Get Your Free API Key

Start building in 5 minutes — player props included on all plans

See Pricing

All plans compared side by side