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.

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

FieldTypeNotes
teamobject
seasoninteger
countinteger
groupsobject[]
athletesRosterAthlete[]

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

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
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

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.