Team roster API
A team's current roster grouped by position plus a flat list with jersey, position, age, height, weight and status. Pass season for a historical roster. 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.
- Depth charts exist in the spec for leagues that publish them; they were not part of this verification.
Paths and parameters
GET/api/v1/sports/{sport}/leagues/{league}/teams/{teamId}/roster
Get team roster. Current roster grouped by position plus a flat list. Pass `season` for a historical season roster (flat list).
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.teamId(path, required): Team id, as returned by the teams endpoints.season(query): Historical season year.
GET/api/v1/sports/{sport}/leagues/{league}/teams/{teamId}/depthchart
Get depth chart
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.teamId(path, required): Team id, as returned by the teams endpoints.season(query): Season year (defaults to current).
Live example
Request
curl -H "Authorization: Bearer $RSA_API_KEY" \
"https://www.realtimesportsapi.com/api/v1/sports/football/leagues/nfl/teams/12/roster"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. Trimmed to 2 of 76 athletes.
Response
{
"success": true,
"data": {
"team": {
"id": "12",
"displayName": "Kansas City Chiefs",
"abbreviation": "KC"
},
"season": 2026,
"count": 76,
"groups": [
{
"position": "offense",
"athletes": [
{
"id": "4912218",
"displayName": "Cyrus Allen",
"firstName": "Cyrus",
"lastName": "Allen",
"jersey": "13",
"position": "WR",
"age": 23,
"height": "5' 11\"",
"weight": "180 lbs",
"experience": 0,
"status": "Active",
"headshot": "https://realtimesportsapi.com/api/images/proxy?id=GgcVSgNPTUMITUgaFFQVVVQXBVwOHV5LWQBZBkZcDkJDXR0HVl8FDg0QBl8aS1wDXVYWUgpSAAVVCUtIDFI"
},
{
"id": "4566190",
"displayName": "Kahlil Benson",
"firstName": "Kahlil",
"lastName": "Benson",
"jersey": "70",
"position": "OT",
"age": 24,
"height": "6' 6\"",
"weight": "319 lbs",
"experience": 0,
"status": "Active",
"headshot": "https://realtimesportsapi.com/api/images/proxy?id=GgcVSgNPTUMITUgaFFQVVVQXBVwOHV5LWQBZBkZcDkJDXR0HVl8FDg0QBl8aS1wDXVYWUgZVBAZdAUtIDFI"
}
]
}
],
"athletes": [
{
"id": "4912218",
"displayName": "Cyrus Allen",
"firstName": "Cyrus",
"lastName": "Allen",
"jersey": "13",
"position": "WR",
"age": 23,
"height": "5' 11\"",
"weight": "180 lbs",
"experience": 0,
"status": "Active",
"headshot": "https://realtimesportsapi.com/api/images/proxy?id=GgcVSgNPTUMITUgaFFQVVVQXBVwOHV5LWQBZBkZcDkJDXR0HVl8FDg0QBl8aS1wDXVYWUgpSAAVVCUtIDFI"
},
{
"id": "4566190",
"displayName": "Kahlil Benson",
"firstName": "Kahlil",
"lastName": "Benson",
"jersey": "70",
"position": "OT",
"age": 24,
"height": "6' 6\"",
"weight": "319 lbs",
"experience": 0,
"status": "Active",
"headshot": "https://realtimesportsapi.com/api/images/proxy?id=GgcVSgNPTUMITUgaFFQVVVQXBVwOHV5LWQBZBkZcDkJDXR0HVl8FDg0QBl8aS1wDXVYWUgZVBAZdAUtIDFI"
}
]
},
"meta": {
"rateLimit": {
"limit": 125,
"remaining": 124,
"reset": 1793491200000
}
}
}Fields
| Field | Type | Notes |
|---|---|---|
| team | object | |
| season | integer | |
| count | integer | |
| groups | object[] | |
| athletes | RosterAthlete[] |
League support
Checked against live data on 2026-10-04: 29 available, 0 limited, 0 seasonal or not verified, 0 not available.
Code samples
curl
curl -H "Authorization: Bearer $RSA_API_KEY" \
"https://www.realtimesportsapi.com/api/v1/sports/football/leagues/nfl/teams/12/roster"JavaScript (fetch)
const res = await fetch("https://www.realtimesportsapi.com/api/v1/sports/football/leagues/nfl/teams/12/roster", {
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/teams/12/roster",
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_team_roster with sport "football" and league "nfl" and pick a team from list_teams and list its roster by position 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 rosters endpoint return?
- A team's current roster grouped by position plus a flat list with jersey, position, age, height, weight and status. Pass season for a historical roster.
- Which leagues support rosters?
- All 29 monitored leagues returned data when we checked on 2026-10-04.
- 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.