Box score API
Team totals, period-by-period scores and player stat lines for one game. Football players carry per-category stats (passing, rushing, receiving, defense, kicking, returns). 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.
- Soccer returns team totals and period scores but no player rows. NHL box scores are not available.
Paths and parameters
GET/api/v1/sports/{sport}/leagues/{league}/events/{eventId}/boxscore
Get box score. Team totals and player stats. Supported for basketball, soccer, baseball and football. Football players carry per-category stats (passing, rushing, receiving, defensive, kicking, returns) under `categories`.
sport(path, required): Sport slug: football, basketball, baseball, hockey, soccer.league(path, required): League slug, e.g. nfl, college-football, nba, mens-college-basketball, mlb, nhl, eng.1, usa.1.eventId(path, required): Event (game) id, as returned by the events endpoints.
Live example
Request
curl -H "Authorization: Bearer $RSA_API_KEY" \
"https://www.realtimesportsapi.com/api/v1/sports/football/leagues/nfl/events/401872965/boxscore"Response captured from live data at 2026-10-05 02:13 UTC (refreshed every few minutes). Long arrays are trimmed; meta.rateLimit values are illustrative for a Free key. Player lists trimmed to 2 of 34 (home) and 31 (away).
Response
{
"success": true,
"data": {
"homeTeam": {
"id": "28",
"name": "Washington Commanders",
"abbreviation": "WSH",
"score": 13
},
"awayTeam": {
"id": "11",
"name": "Indianapolis Colts",
"abbreviation": "IND",
"score": 30
},
"homePlayers": [
{
"id": "4432722",
"name": "Athan Kaliakmanis",
"jersey": "16",
"categories": {
"passing": {
"completions/passingAttempts": "15/33",
"passingYards": "186",
"yardsPerPassAttempt": "5.6",
"passingTouchdowns": "1",
"interceptions": "1",
"sacks-sackYardsLost": "1-9",
"adjQBR": "16.9",
"QBRating": "60.9"
},
"rushing": {
"rushingAttempts": "3",
"rushingYards": "16",
"yardsPerRushAttempt": "5.3",
"rushingTouchdowns": "0",
"longRushing": "9"
}
}
},
{
"id": "2576980",
"name": "Marcus Mariota",
"jersey": "8",
"categories": {
"passing": {
"completions/passingAttempts": "3/4",
"passingYards": "46",
"yardsPerPassAttempt": "11.5",
"passingTouchdowns": "0",
"interceptions": "0",
"sacks-sackYardsLost": "1-6",
"adjQBR": "85.5",
"QBRating": "112.5"
},
"rushing": {
"rushingAttempts": "1",
"rushingYards": "35",
"yardsPerRushAttempt": "35.0",
"rushingTouchdowns": "0",
"longRushing": "35"
}
}
}
],
"awayPlayers": [
{
"id": "3917792",
"name": "Daniel Jones",
"jersey": "17",
"categories": {
"passing": {
"completions/passingAttempts": "19/34",
"passingYards": "143",
"yardsPerPassAttempt": "4.2",
"passingTouchdowns": "0",
"interceptions": "1",
"sacks-sackYardsLost": "2-14",
"adjQBR": "16.2",
"QBRating": "53.9"
},
"rushing": {
"rushingAttempts": "4",
"rushingYards": "2",
"yardsPerRushAttempt": "0.5",
"rushingTouchdowns": "1",
"longRushing": "4"
},
"fumbles": {
"fumbles": "1",
"fumblesLost": "1",
"fumblesRecovered": "0"
}
}
},
{
"id": "4242335",
"name": "Jonathan Taylor",
"jersey": "28",
"categories": {
"rushing": {
"rushingAttempts": "20",
"rushingYards": "95",
"yardsPerRushAttempt": "4.8",
"rushingTouchdowns": "2",
"longRushing": "12"
},
"receiving": {
"receptions": "1",
"receivingYards": "2",
"yardsPerReception": "2.0",
"receivingTouchdowns": "0",
"longReception": "2",
"receivingTargets": "4"
}
}
}
],
"periodScores": {
"home": [
6,
0,
7,
"... 1 more"
],
"away": [
0,
10,
10,
"... 1 more"
]
}
},
"meta": {
"rateLimit": {
"limit": 125,
"remaining": 124,
"reset": 1793491200000
}
}
}Fields
| Field | Type | Notes |
|---|---|---|
| homeTeam | object | |
| awayTeam | object | |
| homePlayers | object[] | |
| awayPlayers | object[] | |
| periodScores | object |
League support
Checked against live data on 2026-10-04: 4 available, 23 limited, 1 seasonal or not verified, 1 not available.
Team totals and period scores only; player stats are not returned.
Team totals and period scores only; player stats are not returned.
Team totals and period scores only; player stats are not returned.
Team totals and period scores only; player stats are not returned.
Team totals and period scores only; player stats are not returned.
Team totals and period scores only; player stats are not returned.
Team totals and period scores only; player stats are not returned.
Team totals and period scores only; player stats are not returned.
Team totals and period scores only; player stats are not returned.
Team totals and period scores only; player stats are not returned.
Team totals and period scores only; player stats are not returned.
Team totals and period scores only; player stats are not returned.
Team totals and period scores only; player stats are not returned.
Team totals and period scores only; player stats are not returned.
Team totals and period scores only; player stats are not returned.
Team totals and period scores only; player stats are not returned.
Team totals and period scores only; player stats are not returned.
Team totals and period scores only; player stats are not returned.
Team totals and period scores only; player stats are not returned.
Team totals and period scores only; player stats are not returned.
Team totals and period scores only; player stats are not returned.
Team totals and period scores only; player stats are not returned.
Team totals and period scores only; player stats are not returned.
Code samples
curl
curl -H "Authorization: Bearer $RSA_API_KEY" \
"https://www.realtimesportsapi.com/api/v1/sports/football/leagues/nfl/events/401872965/boxscore"JavaScript (fetch)
const res = await fetch("https://www.realtimesportsapi.com/api/v1/sports/football/leagues/nfl/events/401872965/boxscore", {
headers: { Authorization: `Bearer ${process.env.RSA_API_KEY}` }
});
const { success, data, meta } = await res.json();
console.log(data, meta.rateLimit);Python (requests)
import os, requests
res = requests.get(
"https://www.realtimesportsapi.com/api/v1/sports/football/leagues/nfl/events/401872965/boxscore",
headers={"Authorization": f"Bearer {os.environ['RSA_API_KEY']}"},
timeout=10,
)
body = res.json()
print(body["data"])MCP prompt (Claude, Cursor, ChatGPT)
Using the Realtime Sports MCP server (https://www.realtimesportsapi.com/api/mcp), call get_box_score with sport "football" and league "nfl" and pick a finished game from get_events and list the top performers for NFL.Connect the hosted MCP server first: setup guide. Each tool call counts as one API call.
Rate limits and pricing
| Plan | Price | Calls | Rate | WebSocket | Webhooks |
|---|---|---|---|---|---|
| Free | $0 | 125/mo (1,000 first 30 days) | 1/s | 500 msgs/mo | No |
| Starter | $29/mo ($290/yr) | 10,000/mo | 5/s | Shares monthly pool | Shares monthly pool |
| Growth | $49/mo ($490/yr) | 25,000/mo | 10/s | Shares monthly pool | Shares monthly pool |
| Pro | $99/mo ($990/yr) | 50,000/mo | 20/s | 100,000 msgs/mo | 25,000/mo |
| Scale | $299/mo ($2,990/yr) | 500,000/mo | 100/s | 500,000 msgs/mo | 100,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
- What does the box score endpoint return?
- Team totals, period-by-period scores and player stat lines for one game. Football players carry per-category stats (passing, rushing, receiving, defense, kicking, returns).
- Which leagues support box score?
- Verified on 2026-10-04: NFL, College Football, NBA, MLB. Limited: MLS, U.S. Open Cup, Premier League, Champions League, Europa League, FA Cup, LaLiga, Serie A, Liga MX, FIFA World Cup, Women's Super League, Women's Champions League, Conference League, English League Cup, Bundesliga, Ligue 1, NWSL, EFL Championship, World Cup Qualifying (UEFA), World Cup Qualifying (CONMEBOL), World Cup Qualifying (AFC), World Cup Qualifying (CAF), World Cup Qualifying (CONCACAF). Seasonal or not verified: Men's College Basketball. Not available: 1 other league.
- Is it free to try?
- Yes. The Free plan is $0 with 125 calls per month (1,000 in the first 30 days) at 1 request per second, no card required. Every successful call counts as one call.
- How fresh is the data?
- 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.
- Can I get updates pushed instead of polling?
- Webhooks are included on every paid plan (Starter, Growth, Pro, Scale). WebSocket is included on paid plans, and the Free plan gets a 500-message monthly preview.