Player stats and box scores for fantasy platforms

Fantasy leagues, contest platforms and player-stats products.

Score fantasy points from live box scores while games are on, finalize them when the event.final webhook arrives, and fill player pages from rosters, depth charts, game logs and injury reports. All with one key across leagues.

Updated 2026-11-04. Data is aggregated from public sources and is typically 20-30 seconds behind live play (about 1 second after our source). There is no SLA.

What the data covers

Box scores with player stats: NFL, college football, NBA and MLB. Soccer box scores have team totals only, and NHL box scores are not available. Injuries: NFL, NBA, MLB and NHL. Rosters and athlete search: the major leagues. Depth charts: GET /teams/{teamId}/depthchart. Player game logs: GET /athletes/{athleteId}/gamelog. The support matrix lists every league.

Live scoring from box scores

Poll GET /events/live once for the league, then fetch each live game's box score. For basketball, points, rebounds and assists are numbers; other stats keep their own keys as strings (for example "fieldGoalsMade-fieldGoalsAttempted": "11-22"). Football stats are grouped under categories. Before kickoff the box score returns 404 BOXSCORE_NOT_AVAILABLE.

Node.js: fantasy points for every live NBA game

const H = { Authorization: `Bearer ${process.env.RSA_API_KEY}` };
const BASE = 'https://www.realtimesportsapi.com/api/v1/sports/basketball/leagues/nba';
const num = (v) => Number(v) || 0;
const fantasyPoints = (p) => num(p.points) + 1.2 * num(p.rebounds) + 1.5 * num(p.assists)
  + 3 * num(p.steals) + 3 * num(p.blocks);

const { data: live } = await (await fetch(`${BASE}/events/live`, { headers: H })).json();
for (const game of live) {
  const r = await fetch(`${BASE}/events/${game.id}/boxscore`, { headers: H });
  if (!r.ok) continue; // not started yet
  const { data: box } = await r.json();
  for (const p of [...box.homePlayers, ...box.awayPlayers]) {
    if (!p.didNotPlay) upsertScore(game.id, p.name, fantasyPoints(p)); // your store
  }
}

Finalize on the final whistle

Register a webhook for event.final (and optionally event.play_corrected, sent when the source revises a play such as an overturned catch). When the final arrives, fetch the box score one last time and lock the scores. One webhook covers every game in the leagues you choose.

Register the finals webhook

curl -X POST "https://www.realtimesportsapi.com/api/v1/webhooks" \
  -H "Authorization: Bearer $RSA_API_KEY" -H "Content-Type: application/json" \
  -d '{"url":"https://api.yourleague.com/finals","events":["event.final","event.play_corrected"],"leagues":["nfl","nba"]}'

Lineup decisions

GET /injuries returns designations by team with a normalized availability value (OUT, DOUBTFUL, QUESTIONABLE and so on); pass team for a complete team report. Pair it with depth charts and the next week's schedule (/seasons/{season}/schedule?week=N for NFL and college football) for start/sit tools.

Endpoints used

  • GET /sports/{sport}/leagues/{league}/events/live
  • GET /sports/{sport}/leagues/{league}/events/{eventId}/boxscore
  • GET /sports/{sport}/leagues/{league}/injuries
  • GET /sports/{sport}/leagues/{league}/teams/{teamId}/depthchart
  • GET /sports/{sport}/leagues/{league}/athletes/{athleteId}/gamelog
  • POST /webhooks

Full reference: docs · OpenAPI · what each endpoint returns, by league

Plans

PlanPriceCallsRateWebSocketWebhooks
Free$0125/mo (1,000 first 30 days)1/s500 msgs/moNo
Starter$29/mo ($290/yr)10,000/mo5/sShares monthly poolShares monthly pool
Growth$49/mo ($490/yr)25,000/mo10/sShares monthly poolShares monthly pool
Pro$99/mo ($990/yr)50,000/mo20/s100,000 msgs/mo25,000/mo
Business$179/mo ($1,790/yr)150,000/mo40/s300,000 msgs/mo75,000/mo
Scale$299/mo ($2,990/yr)500,000/mo100/s500,000 msgs/mo100,000/mo

Every successful REST call counts as one call. Over the limit you get HTTP 429 with a Retry-After header. No SLA. Full pricing.

FAQ

Are NHL and soccer player stats included?
Not in box scores: NHL box scores are not available and soccer box scores return team totals only. Soccer play-by-play (goals, cards, substitutions) is available.
Can I run paid contests on this data?
The data is typically 20-30 seconds behind live, which is fine for scoring after the fact. It is not meant for in-play wagering. Read the terms for your use case.
How many calls does live scoring use?
One live-games call per refresh plus one box score per live game. An NBA night with 10 games refreshed every 2 minutes for 3 hours is about 1,000 calls.
Is there historical data?
Season schedules and box scores of completed games in the current data window are available; there is no bulk historical archive download.

Complete builds to start from

Other use cases