Getting Started
Coverage MatrixChange LogLog InContact Us
Getting Started

AI Toolkit

The AI Toolkit gives AI agents and the teams building them structured access to Sportradar sports data. It is a small set of tools you can reach two ways: as a remote MCP server or as plain REST (HTTP GET) endpoints. Both expose the same tools, return JSON, and use the same API key.

The Toolkit is a new way to reach data you already license. It is not a new data product, and it does not replace the sport-specific REST APIs or Push Feeds.



Why Use the Toolkit

Language-model agents working from memory guess at names, confuse teams with similar names, and invent fixtures. The Toolkit addresses this in three ways:

  • Grounded entity resolution. Search returns Sportradar IDs and structured JSON, so the agent works from current data instead of guessing.
  • Fewer round trips. The player and team tools accept a name directly. Your agent does not need a separate search call before it fetches data.
  • One interface across sports. The same six tools and routes serve every sport, so you do not integrate a separate API for each one. Which tools cover which leagues varies (see Sports and League Coverage), and statistics fields differ by sport.

Each tool also carries usage guidance: when to call it, when not to, and what to watch for. See Agent Guidance.



Who It Is For

  • AI platforms and LLM providers building sports capabilities into their agents.
  • Sportradar customers building agentic products, such as chatbots and research tools, on data they already license.

Looking for deeper analysis rather than the building blocks? That is a different product, AI Researcher. The Toolkit provides primitives (lookup, game data, statistics); AI Researcher layers deep, rich analysis on top.



Access and Authentication

🗝️

Authentication

Every request carries your API key in the x-api-key header, over REST and over MCP alike.


  • Licensing. The Toolkit serves the data you are already licensed for. The player, team, game summary, and standings tools return data only for the leagues and sports your account is entitled to; a request for anything else returns an access error (see Errors). Entity lookup and schedule search are open for discovery. They can return teams, games, and game IDs for leagues you are not licensed for, but the data tools reject those IDs.
  • NBA history. NBA data is also limited by the history tier on your NBA package: the most recent 3 seasons (Core), 25 seasons (Expanded), or every season (Complete). Outside your window, the game summary, player, and team tools return an access error for a pinned season or game and leave out older seasons. Standings and schedule leave out older NBA rows, and a schedule search whose NBA games all fall before your window returns an access error.
  • Getting access. The Toolkit is enabled per account. Contact your Sportradar account representative to have it added to your key. A trial of the Toolkit needs a trial or license for each sport API you want to reach through it, because the Toolkit serves only the data your account holds.


Choose How to Connect

RESTMCP
Best forApps and agents that call HTTP APIs directly, and teams that care about latency and cachingMCP-compatible clients and agent frameworks that discover tools automatically
Base URLhttps://api.sportradar.com/toolkit/production/v2/{locale}/https://api.sportradar.com/toolkit/production/mcp
MethodGETPOST (MCP streamable HTTP)
DefinitionOpenAPI 3 specification, available on requesttools/list, with a JSON Schema per tool
Authenticationx-api-key headerx-api-key header
ResponseJSON bodyJSON in content[0].text; two tools also return structuredContent
CachingStandard HTTP caching on GET responsesNot HTTP-cacheable
Agent guidanceIn the OpenAPI specificationDelivered with each tool

{locale} is a language code. en is the only supported value.



Quickstart: REST

This request finds a player by name and returns the profile and season statistics in a single call. The response is 200 OK with a JSON body. The response below is trimmed for length: seasons shows one entry (2025 REG), and total and average show six statistics each, out of 63 and 34.

curl -G "https://api.sportradar.com/toolkit/production/v2/en/player" \
  -H "x-api-key: YOUR_API_KEY" \
  --data-urlencode "name=LeBron James" \
  --data-urlencode "sport=basketball" \
  --data-urlencode "scope=season"
{
  "player": {
    "id": "0afbe608-940a-4d5d-a1f7-468718c67d91",
    "name": "LeBron James",
    "sport": "basketball",
    "league": "NBA",
    "team": {
      "id": "583ec87d-fb46-11e1-82cb-f4ce4684ea4c",
      "name": "76ers"
    }
  },
  "profile": {
    "feedPlayerId": "0afbe608-940a-4d5d-a1f7-468718c67d91",
    "fullName": "LeBron James",
    "firstName": "LeBron",
    "lastName": "James",
    "abbrName": "L.James",
    "status": "ACT",
    "position": "F",
    "primaryPosition": "SF",
    "jerseyNumber": "23",
    "height": 81,
    "weight": 250,
    "birthdate": "1984-12-30",
    "birthPlace": "Akron, OH, USA",
    "highSchool": "St. Vincent-St. Mary (OH)",
    "experience": "23",
    "rookieYear": 2003,
    "salary": 52627153,
    "srId": "sr:player:608028",
    "updated": "2026-10-01T23:20:33+00:00",
    "team": {
      "id": "583ec87d-fb46-11e1-82cb-f4ce4684ea4c",
      "name": "76ers",
      "market": "Philadelphia",
      "alias": "PHI"
    },
    "draft": {
      "year": 2003,
      "round": "1",
      "pick": "1",
      "teamId": "583ec773-fb46-11e1-82cb-f4ce4684ea4c"
    },
    "references": [
      {
        "source_id": "2544",
        "scope": "NBA",
        "id_type": "external"
      },
      {
        "source_id": "58415463-fb46-11e1-82cb-f4ce4684ea4c",
        "scope": "basketball",
        "id_type": "sport_profile"
      }
    ],
    "reference": "2544",
    "league": {
      "id": "4353138d-4c22-4396-95d8-5f587d2df25c",
      "name": "NBA",
      "alias": "NBA"
    }
  },
  "seasons": [
    {
      "id": "a7c6c8ee-c5ba-4a1a-abf5-723e1539f81b",
      "year": 2025,
      "type": "REG",
      "teams": [
        {
          "id": "583ecae2-fb46-11e1-82cb-f4ce4684ea4c",
          "name": "Lakers",
          "market": "Los Angeles",
          "total": {
            "games_played": 60,
            "games_started": 60,
            "minutes": 1989,
            "field_goals_made": 473,
            "field_goals_att": 919,
            "field_goals_pct": 0.515
          },
          "average": {
            "minutes": 33.2,
            "points": 20.9,
            "off_rebounds": 0.72,
            "def_rebounds": 5.35,
            "rebounds": 6.07,
            "assists": 7.2
          }
        }
      ]
    }
  ]
}

The player block is the resolved identity and its IDs. profile is the bio, including the references that map the player to other ID spaces. With scope=season, seasons holds one entry per season and season type (REG, PST, PRE), each with totals and per-game averages for the player's team in that season.

Next, ask for a team's schedule, then pull a game summary using the game id from the result (sample responses are under search-schedule and get-game-summary). Team names can be ambiguous (several teams share a name such as "Warriors" across leagues), so use a full name and pin the league:

curl -G "https://api.sportradar.com/toolkit/production/v2/en/schedule" \
  -H "x-api-key: YOUR_API_KEY" \
  --data-urlencode "team=Los Angeles Lakers" \
  --data-urlencode "league=NBA" \
  --data-urlencode "timezone=America/Los_Angeles" \
  --data-urlencode "limit=5"
curl -G "https://api.sportradar.com/toolkit/production/v2/en/game" \
  -H "x-api-key: YOUR_API_KEY" \
  --data-urlencode "gameId=GAME_ID_FROM_SCHEDULE" \
  --data-urlencode "timezone=America/Los_Angeles"

The other three routes work the same way. Resolve names to IDs with /entities (search-entities), pull a team profile and season records with /team (get-team), and read a league table with /standings (get-standings). Each tool section below lists the full parameters and a sample response.

curl -G "https://api.sportradar.com/toolkit/production/v2/en/entities" \
  -H "x-api-key: YOUR_API_KEY" \
  --data-urlencode "players=LeBron James" \
  --data-urlencode "teams=Los Angeles Lakers" \
  --data-urlencode "sport=basketball" \
  --data-urlencode "limit=2"
curl -G "https://api.sportradar.com/toolkit/production/v2/en/team" \
  -H "x-api-key: YOUR_API_KEY" \
  --data-urlencode "name=Los Angeles Lakers" \
  --data-urlencode "league=nba" \
  --data-urlencode "scope=season" \
  --data-urlencode "limit=1"
curl -G "https://api.sportradar.com/toolkit/production/v2/en/standings" \
  -H "x-api-key: YOUR_API_KEY" \
  --data-urlencode "leagueName=NBA" \
  --data-urlencode "seasonYear=2025" \
  --data-urlencode "seasonType=REG" \
  --data-urlencode "limit=5"


Quickstart: MCP

Add the server to any MCP-compatible client. Clients that use a JSON configuration file typically take this form; field names vary by client, so check your client's documentation.

{
  "mcpServers": {
    "sportradar-ai-toolkit": {
      "type": "streamableHttp",
      "url": "https://api.sportradar.com/toolkit/production/mcp",
      "headers": { "x-api-key": "YOUR_API_KEY" }
    }
  }
}

Once connected, the client lists the available tools and their descriptions on its own. To confirm the connection outside a client, list the tools directly. The server answers tools/list without an initialize handshake and does not issue a session ID. The response below is shortened to one of the six tools and to the first three of its 8 input properties:

curl -X POST "https://api.sportradar.com/toolkit/production/mcp" \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
{
  "result": {
    "tools": [
      {
        "name": "get-standings",
        "description": "League tables (STANDINGS): one row per team per group (a conference or division, or a group or stage in other sports) with rank, played, win, loss, draw, points and the raw feed row in stats. Available for soccer, basketball, football, baseball and hockey. Tables for cricket, aussie-rules-football, handball, rugby, global-basketball and global-baseball are not available yet, and a request for one returns an access-denied error. Other sports are not covered. rank is the position inside that row's group. Rows are sorted newest season first, then by group id and rank. Pin at least one of leagueName, leagueId, seasonId, groupId or teamId; seasonYear and seasonType only narrow the pin. With no seasonId or seasonYear, only the newest season year with games played comes back. Your api key needs access to the league (baseball, basketball, football, hockey) or to soccer. A league's table comes back whole or not at all. If the key lacks access the request returns an access-denied error: do not retry it. Tables are refreshed by the Toolkit rather than read live from the data feed. ingestedAt is when a row was last updated.",
        "inputSchema": {
          "$schema": "http://json-schema.org/draft-07/schema#",
          "type": "object",
          "properties": {
            "leagueName": {
              "description": "League name, matched whole and case-insensitively, e.g. \"MLB\", \"NBA\", \"NCAAM\", \"Premier League\" (US leagues go by their short name). A name several leagues share returns each entitled league's table, up to 5. Use instead of leagueId, not with it.",
              "type": "string"
            },
            "leagueId": {
              "description": "League id, e.g. \"sr:competition:17\" or an NBA league UUID. Take it from the league.id on a search-schedule row, or pass leagueName instead.",
              "type": "string"
            },
            "seasonId": {
              "description": "Season id. Pins one season table set.",
              "type": "string"
            }
          }
        },
        "execution": {
          "taskSupport": "forbidden"
        }
      }
    ]
  },
  "jsonrpc": "2.0",
  "id": 1
}

A tools/call returns the same JSON a REST call would, serialized as a string in content[0].text:

curl -X POST "https://api.sportradar.com/toolkit/production/mcp" \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":10,"method":"tools/call","params":{"name":"get-game-summary","arguments":{"gameId":"578b0dcb-6f7b-4b56-a7e7-fcab633ea591","timezone":"America/New_York"}}}'
{
  "result": {
    "content": [
      {
        "type": "text",
        "text": "{\"game\":{\"id\":\"578b0dcb-6f7b-4b56-a7e7-fcab633ea591\",\"sport\":\"baseball\",\"league\":\"MLB\",\"status\":\"scheduled\",\"scheduled\":\"2026-10-07T18:00:00-04:00\",\"localDate\":\"2026-10-07\",\"venue\":{\"city\":\"Atlanta\",\"name\":\"Truist Park\",\"state\":\"GA\"},\"season\":{\"year\":2026,\"type\":\"PST\"}},\"teams\":[{\"side\":\"home\",\"id\":\"12079497-e414-450a-8bf2-29f91de646bf\",\"name\":\"Atlanta Braves\",\"alias\":\"ATL\",\"score\":0,\"hits\":0,\"errors\":0},{\"side\":\"away\",\"id\":\"ef64da7f-cfaf-4300-87b0-9313386b977c\",\"name\":\"Los Angeles Dodgers\",\"alias\":\"LAD\",\"score\":0,\"hits\":0,\"errors\":0}]}"
      }
    ]
  },
  "jsonrpc": "2.0",
  "id": 10
}

search-entities and get-game-summary also publish an outputSchema in tools/list and return the parsed object a second time as structuredContent. A client that supports it can skip the string parse. The other four tools return text only. The closed game from get-game-summary, shown without content and with structuredContent cut to its game and result blocks:

{
  "result": {
    "structuredContent": {
      "game": {
        "id": "b0303e9e-8af6-4686-a242-1db37260e82a",
        "sport": "baseball",
        "league": "MLB",
        "leagueKey": "mlb",
        "status": "closed",
        "scheduled": "2026-08-20T13:10:00-05:00",
        "localDate": "2026-08-20",
        "venue": {
          "country": "USA",
          "city": "Chicago",
          "name": "Rate Field",
          "state": "IL"
        },
        "season": {
          "year": 2026,
          "type": "REG"
        },
        "attendance": 17052,
        "duration": "2:22",
        "finalInning": {
          "inning": 9,
          "half": "B"
        }
      },
      "result": {
        "winner": {
          "side": "away",
          "id": "12079497-e414-450a-8bf2-29f91de646bf",
          "name": "Atlanta Braves"
        },
        "score": "ATL 2 @ CWS 0"
      }
    }
  },
  "jsonrpc": "2.0",
  "id": 6
}

Over MCP, scope is an array (["season"], ["game"], or both) where REST takes a comma-separated string.



Tools

Each tool is available over both interfaces.

CapabilityRESTMCP tool
Find entity IDs by name, in batchesGET /entitiessearch-entities
Find games and get game IDsGET /schedulesearch-schedule
Player bio and statisticsGET /playerget-player
Team bio, statistics, and live gameGET /teamget-team
Game summary and per-period scoringGET /gameget-game-summary
League tablesGET /standingsget-standings

Which Tool Should I Call?

Statistics, bio, or live score for a team   ->  get-team (read currentGame for live)
Statistics or bio for a player              ->  get-player
When games happen, or need a game ID        ->  search-schedule
Recap or per-period detail by game          ->  get-game-summary (needs a game ID)
League table                                ->  get-standings
Only IDs, or resolving many names           ->  search-entities

Call get-player and get-team directly with a name. They resolve the name themselves and return full data in one request, so you skip the search step. Use search-entities only when you need IDs on their own or want to resolve several names at once.


search-entities

Resolves names to Sportradar IDs. Returns identity fields only (ID, names, sport, leagues, teams, references). For a player's or team's data, call get-player or get-team.

REST: GET /entities

ParameterDescription
playersOne or more player names, comma-separated or repeated.
teamsOne or more team names, comma-separated or repeated.
sportOptional. Limits every name in the request to one sport.
limitOptional. Maximum results per name (max 50, default 10).

Results are grouped by entity type. Each name is searched independently, so one request can resolve several players and teams:

GET /entities?players=Stephen%20Curry,LeBron%20James&teams=Warriors,Lakers&sport=basketball

A lookup for teams=Arsenal&players=Haaland&sport=soccer&limit=2 returns 2 players and 2 teams. Below, the player list is shortened to the first match and each leagues list to two entries (Haaland's carries 6):

{
  "PLAYER": [
    {
      "displayLastName": "Haaland",
      "lastName": "Haaland",
      "displayFirstName": "Erling",
      "references": [
        {
          "league": {
            "key": "soccer"
          },
          "id": "sr:player:991181",
          "source": "sportradar",
          "primary": true
        }
      ],
      "teams": [
        {
          "name": "Norway",
          "id": "sr:competitor:4475",
          "abbreviation": "NOR"
        },
        {
          "name": "Manchester City",
          "id": "sr:competitor:17",
          "abbreviation": "MCI"
        }
      ],
      "leagues": [
        {
          "name": "FIFA World Cup",
          "id": "sr:competition:16"
        },
        {
          "name": "Premier League",
          "id": "sr:competition:17"
        }
      ],
      "dateOfBirth": "2000-07-21",
      "firstName": "Erling Braut",
      "nationality": "Norway",
      "countryOfBirth": "England",
      "id": "sr:player:991181",
      "sport": "soccer"
    }
  ],
  "TEAM": [
    {
      "gender": "male",
      "references": [
        {
          "id": "sr:competitor:36554",
          "source": "sportradar",
          "primary": true
        }
      ],
      "leagues": [
        {
          "name": "EFL Trophy",
          "id": "sr:competition:334"
        },
        {
          "name": "U21 Premier League 2",
          "id": "sr:competition:1129"
        }
      ],
      "abbreviation": "ARS",
      "name": "Arsenal FC",
      "id": "sr:competitor:36554",
      "shortName": "Arsenal",
      "sport": "soccer"
    },
    {
      "gender": "male",
      "references": [
        {
          "id": "sr:competitor:42",
          "source": "sportradar",
          "primary": true
        }
      ],
      "leagues": [
        {
          "name": "Premier League",
          "id": "sr:competition:17"
        },
        {
          "name": "UEFA Champions League",
          "id": "sr:competition:7"
        }
      ],
      "abbreviation": "ARS",
      "name": "Arsenal FC",
      "id": "sr:competitor:42",
      "shortName": "Arsenal",
      "sport": "soccer"
    }
  ]
}

A name can match more than one entity. Here "Arsenal" returns both the under-21 side and the senior side, and a "Haaland" search returns more than one player. Check the leagues, teams, and dates in each result to pick the right one, then use its id in later calls. The references list carries the entity's IDs in other Sportradar ID spaces; the entry marked primary is the one the Toolkit uses.

MCP: pass a queries array (1 to 25 items). Each item takes name, entityType (PLAYER or TEAM), and an optional limit. Always set entityType when you know it; omitting it searches every type and returns lower-quality results. sport is a top-level field and applies to every query.

  • /entities supports players and teams. Other entity types, including venues, coaches, and officials, return a 400 error.
  • Very long requests can exceed URL length limits. A URL over about 8 KB returns 414. Split large batches into several calls.

search-schedule

Finds when games occur and returns game IDs for get-game-summary. Use it for "when does X play", "what games are on today", and past or upcoming fixtures.

For a simple question about one team's current game, such as the score, inning, period, or clock, use get-team and read currentGame instead.

REST: GET /schedule

ParameterDescription
sportOptional. One or more sports, comma-separated.
leagueOptional. League name or ID. Several can be comma-separated.
teamOptional. Team name or ID. Games where any listed team plays match.
startDate, endDateOptional. YYYY-MM-DD or an ISO 8601 datetime, inclusive.
tagsOptional. One or more tags a game must carry, comma-separated: international, postseason, wild-card, quarterfinal, semifinal, final, in-season-tournament, play-in, preseason, all-star.
venueCountryOptional. The country the game is played in, as the feed spells it: an ISO alpha-3 code for US leagues (GBR), a country name for soccer (England). Several can be comma-separated.
timezoneOptional. IANA time zone, such as America/New_York. Times are UTC unless you set it. Set it for a local "today".
limitOptional. Maximum games to return. Default 10.

A lookup for team=Atlanta Braves&league=MLB&timezone=America/Los_Angeles&limit=1 on a postseason game day:

{
  "results": [
    {
      "id": "578b0dcb-6f7b-4b56-a7e7-fcab633ea591",
      "game": {
        "id": "578b0dcb-6f7b-4b56-a7e7-fcab633ea591",
        "scheduled": "2026-10-07T15:00:00-07:00",
        "status": "scheduled"
      },
      "teams": [
        {
          "id": "12079497-e414-450a-8bf2-29f91de646bf",
          "name": "Braves",
          "abbreviation": "ATL",
          "market": "Atlanta",
          "score": 0,
          "side": "home"
        },
        {
          "id": "ef64da7f-cfaf-4300-87b0-9313386b977c",
          "name": "Dodgers",
          "abbreviation": "LAD",
          "market": "Los Angeles",
          "score": 0,
          "side": "away"
        }
      ],
      "venue": {
        "city": "Atlanta",
        "name": "Truist Park",
        "state": "GA"
      },
      "sport": "baseball",
      "league": {
        "name": "MLB",
        "id": "2fa448bc-fc17-4d3d-be03-e60e080fdc26"
      },
      "season": {
        "year": 2026,
        "type": "PST"
      }
    }
  ],
  "total": 194,
  "matchMode": "analyzed"
}

Use game.id as the gameId for get-game-summary. total counts every game that matched, not only the ones returned. Status values come straight from the data feed and vary by sport; treat closed, complete, and ended as final. Games without a confirmed start time return "status": "time-tbd".

Filters are optional and combine with AND. Without dates, results run from about 12 hours ago into the future. A team name resolves to one team, the best match. If the name is ambiguous, the response includes a resolution array naming the team that was matched and the other candidates, so you can pass a team ID to target a different one. Each entry also carries a message sentence that restates the match in words. For team=Arsenal&sport=soccer, with the results and the message omitted here:

{
  "total": 17,
  "matchMode": "exact",
  "resolution": [
    {
      "query": "Arsenal",
      "matchMode": "exact",
      "matched": {
        "id": "sr:competitor:36554",
        "name": "Arsenal FC",
        "sport": "soccer",
        "league": "EFL Trophy"
      },
      "otherMatches": [
        {
          "id": "sr:competitor:42",
          "name": "Arsenal FC",
          "sport": "soccer",
          "league": "Premier League"
        },
        {
          "id": "sr:competitor:26243",
          "name": "Arsenal WFC",
          "sport": "soccer",
          "league": "UEFA Champions League Women"
        },
        {
          "id": "sr:competitor:90120",
          "name": "Arsenal FC",
          "sport": "soccer",
          "league": "UEFA Youth League"
        }
      ]
    }
  ]
}

With no league or team set, soccer and basketball are limited to a curated set of high-profile leagues, Global Basketball games are hidden, and Global Baseball shows only the World Baseball Classic; name a league or team to reach the rest.

Each result carries its own tags list and the country of its venue, so league=NFL&tags=international&limit=1 finds the next NFL game played abroad. international means played outside the league's home country. postseason covers every playoff game; wild-card, quarterfinal, semifinal, and final name the round. final is the Super Bowl, the World Series, the NBA Finals, the Stanley Cup Final, or a cup final. In the NBA and NHL, quarterfinal is a conference semifinal and semifinal is a conference final, and a first-round game carries postseason only:

{
  "results": [
    {
      "id": "0123cfbf-3ee4-4884-bbf1-d0bcac43b0ea",
      "game": {
        "id": "0123cfbf-3ee4-4884-bbf1-d0bcac43b0ea",
        "scheduled": "2026-11-08T14:30:00+00:00",
        "status": "scheduled"
      },
      "teams": [
        {
          "id": "e6aa13a4-0055-48a9-bc41-be28dc106929",
          "name": "Atlanta Falcons",
          "abbreviation": "ATL",
          "side": "home"
        },
        {
          "id": "ad4ae08f-d808-42d5-a1e6-e9bc4e34d123",
          "name": "Cincinnati Bengals",
          "abbreviation": "CIN",
          "side": "away"
        }
      ],
      "venue": {
        "country": "ESP",
        "city": "Madrid",
        "name": "Santiago Bernabéu Stadium"
      },
      "sport": "football",
      "league": {
        "name": "NFL",
        "id": "3c6d318a-6164-4290-9bbc-bf9bb21cc4b8"
      },
      "season": {
        "year": 2026,
        "type": "REG"
      },
      "tags": [
        "international"
      ]
    }
  ],
  "total": 3,
  "matchMode": "exact"
}

get-player

Returns a player's bio and statistics. Pass exactly one of name or playerId.

REST: GET /player

ParameterDescription
name or playerIdThe player's name, or an ID from search-entities.
sportOptional. Narrows a name lookup, for example baseball.
leagueOptional. Selects a league for players who appear in more than one, for example nba or ncaamb.
scopeOptional. season, game, or both comma-separated (season,game). See below.
seasonOptional, with scope=season. A single season, by year (2024), split (24/25), or season ID.
gameIdOptional, with scope=game. A single game ID.
limitOptional. With no season or gameId: the number of most recent seasons (default 3) or games (default 5). Maximum 20.
timezoneOptional. IANA time zone for game times.

Choosing a scope. Set scope whenever you know what you need, because the default response is large.

  • scope=season returns season aggregates, as in the REST quickstart.
  • scope=game returns per-game stat lines.
  • No scope returns an overview: bio, current season, the last five game results (scores only), the next game, and currentGame if the player's team is playing now.

The overview for name=LeBron James&sport=basketball, with the player and profile blocks omitted (they match the quickstart), currentSeason statistics cut to three each, and two of the 5 recent games:

{
  "currentSeason": {
    "id": "a3063cee-6faf-4138-845b-31109feec2a5",
    "year": 2026,
    "type": "PRE",
    "teams": [
      {
        "id": "583ec87d-fb46-11e1-82cb-f4ce4684ea4c",
        "name": "76ers",
        "market": "Philadelphia",
        "total": {
          "games_played": 0,
          "games_started": 0,
          "minutes": 0
        },
        "average": {
          "minutes": 0,
          "points": 0,
          "off_rebounds": 0
        }
      }
    ]
  },
  "recentGames": [
    {
      "game": {
        "id": "8abd0b11-77ac-476d-a0c5-62130f0648f3",
        "status": "closed",
        "scheduled": "2026-10-05T23:00:00+00:00"
      },
      "team": {
        "id": "583ec87d-fb46-11e1-82cb-f4ce4684ea4c",
        "name": "76ers",
        "score": 120,
        "side": "home"
      },
      "opponent": {
        "id": "583ec70e-fb46-11e1-82cb-f4ce4684ea4c",
        "name": "Knicks",
        "score": 97
      }
    },
    {
      "game": {
        "id": "c7d58d46-4979-4f44-a85f-68c2001138e1",
        "status": "closed",
        "scheduled": "2026-05-12T02:30:00+00:00"
      },
      "team": {
        "id": "583ecae2-fb46-11e1-82cb-f4ce4684ea4c",
        "name": "Lakers",
        "score": 110,
        "side": "home"
      },
      "opponent": {
        "id": "583ecfff-fb46-11e1-82cb-f4ce4684ea4c",
        "name": "Thunder",
        "score": 115
      }
    }
  ],
  "nextGame": {
    "game": {
      "id": "33445db8-8c1a-4e7b-8c24-15e73287917e",
      "status": "scheduled",
      "scheduled": "2026-10-08T23:30:00+00:00",
      "venue": {
        "city": "Brooklyn",
        "name": "Barclays Center",
        "state": "NY"
      }
    },
    "team": {
      "id": "583ec87d-fb46-11e1-82cb-f4ce4684ea4c",
      "name": "Philadelphia 76ers",
      "side": "away"
    },
    "opponent": {
      "id": "583ec9d6-fb46-11e1-82cb-f4ce4684ea4c",
      "name": "Brooklyn Nets"
    }
  }
}

A per-game stat line pinned to one game, name=Michael Harris II&sport=baseball&scope=game&gameId=b0303e9e-8af6-4686-a242-1db37260e82a. statistics carries the sport's full box-score groups (here fielding, hitting); the snippet keeps the first nine of the 35 hitting.overall fields and omits profile:

{
  "player": {
    "id": "94b20984-18d1-49bf-aed9-eac78c0d1416",
    "name": "Michael Harris",
    "sport": "baseball",
    "league": "MLB",
    "team": {
      "id": "12079497-e414-450a-8bf2-29f91de646bf",
      "name": "Braves"
    }
  },
  "recentGames": [
    {
      "game": {
        "id": "b0303e9e-8af6-4686-a242-1db37260e82a",
        "status": "closed",
        "scheduled": "2026-08-20T18:10:00+00:00"
      },
      "team": {
        "id": "12079497-e414-450a-8bf2-29f91de646bf",
        "name": "Braves",
        "score": 2,
        "side": "away"
      },
      "opponent": {
        "id": "47f490cd-2f58-4ef7-9dfd-2ad6ba6c1ae8",
        "name": "White Sox",
        "score": 0
      },
      "statistics": {
        "hitting": {
          "overall": {
            "steal": {
              "stolen_bases": 0,
              "stolen_base_percentage": 0,
              "times_picked_off": 0,
              "caught_stealing": 0
            },
            "team_runners_left_on_base": 1,
            "fly_balls": 1,
            "walks_per_strikeout": 0,
            "walks_per_plate_appearance": 0,
            "runs_batted_in_with_2_outs": 0,
            "runs_batted_in": 0,
            "outs": {
              "fly_outs_into_double_play": 0,
              "line_outs": 0,
              "sacrifice_hits": 0,
              "fly_outs": 1,
              "ground_outs": 1,
              "strikeouts_swinging": 1,
              "grounded_into_double_play": 0,
              "pop_outs": 0,
              "line_outs_into_double_play": 0,
              "strikeouts_looking": 0,
              "strikeouts": 1,
              "sacrifice_flies": 0
            },
            "ground_balls": 1
          }
        }
      }
    }
  ]
}

If a name matches several players, the best match comes back in full and resolution.otherMatches lists the others. Call again with playerId to switch.


get-team

Returns a team's bio and statistics. Pass exactly one of name or teamId. It takes the same parameters and scope options as get-player, with teamId in place of playerId.

The bio includes market, venue, coaches, and the roster. The no-scope overview adds recent results, the next game, and currentGame when the team is playing right now. currentGame includes the score, clock, and period, and for baseball the inning half and outs. A single call answers "what is the score of the Lakers game" or "what inning is it", with no game ID and no schedule lookup.

REST: GET /team

The overview for name=Atlanta Braves&league=mlb a few hours before a postseason game: nextGame is that game. The roster is shortened to two of its 45 players and recentGames to one of five:

{
  "team": {
    "id": "12079497-e414-450a-8bf2-29f91de646bf",
    "name": "Atlanta Braves",
    "sport": "baseball",
    "league": "MLB"
  },
  "profile": {
    "feedTeamId": "12079497-e414-450a-8bf2-29f91de646bf",
    "name": "Braves",
    "market": "Atlanta",
    "alias": "ATL",
    "founded": 1871,
    "srId": "sr:competitor:3656",
    "owner": "Atlanta Braves Holdings, Inc.",
    "generalManager": "Alex Anthopoulos",
    "president": "Derek Schiller",
    "mascot": "Blooper",
    "nicknames": "The Bravos, The Team of the 90s, America's Team",
    "sponsor": "QUIKRETE",
    "championshipsWon": 4,
    "championshipSeasons": "1914, 1957, 1995, 2021",
    "conferenceTitles": 18,
    "divisionTitles": 24,
    "playoffAppearances": 31,
    "retiredNumbers": "3, 6, 10, 21, 25, 29, 31, 35, 41, 44, 47, 42",
    "minorleagueAffiliate": "Gwinnett Stripers, Columbus Clingstones, Rome Emperors, Augusta GreenJackets",
    "teamColors": [
      {
        "type": "secondary",
        "hex_color": "#ce1141",
        "rgb_color": {
          "red": 206,
          "green": 17,
          "blue": 65
        }
      },
      {
        "type": "primary",
        "hex_color": "#13274f",
        "rgb_color": {
          "red": 19,
          "green": 39,
          "blue": 79
        }
      }
    ],
    "venue": {
      "id": "3ca8b577-5844-42ed-81a5-bd5d5cbe350c",
      "name": "Truist Park",
      "capacity": 41149,
      "address": "755 Battery Avenue",
      "city": "Atlanta",
      "state": "GA",
      "zip": "30339",
      "country": "USA",
      "surface": "grass",
      "srId": "sr:venue:20331",
      "location": {
        "lat": "33.890672",
        "lng": "-84.467641"
      },
      "timeZone": "US/Eastern"
    },
    "league": {
      "alias": "NL",
      "name": "National League",
      "id": "fbe91704-36df-4e7c-864a-06d236425999"
    },
    "division": {
      "alias": "E",
      "name": "East",
      "id": "e354a39b-2632-4b35-9581-7c8edd758a75"
    },
    "coaches": [
      {
        "id": "1c6efee2-db93-4af0-81d6-ae750fef668c",
        "name": "Tim Hyers",
        "position": "Hitting Coach"
      },
      {
        "id": "679a4cc7-9d9c-4822-a94a-fce5db7ca36f",
        "name": "Jeremy Hefner",
        "position": "Pitching Coach"
      },
      {
        "id": "f96dda16-0c95-40fe-9c0f-e2eb8f803a9b",
        "name": "Walt Weiss",
        "position": "Manager"
      }
    ],
    "players": [
      {
        "id": "f4c7ff78-3d15-4598-bb08-fd7f1165e01c",
        "name": "Blake Burkhalter",
        "position": "P",
        "jersey": "76",
        "status": "MIN"
      },
      {
        "id": "e4bae090-1bac-4271-99d3-4fe2a249a379",
        "name": "Luke Williams",
        "position": "IF",
        "jersey": "37",
        "status": "MIN"
      }
    ]
  },
  "recentGames": [
    {
      "game": {
        "id": "836a89f8-d584-47e9-85c8-a81e651184cd",
        "status": "closed",
        "scheduled": "2026-10-06T22:00:00+00:00"
      },
      "team": {
        "id": "12079497-e414-450a-8bf2-29f91de646bf",
        "name": "Braves",
        "score": 1,
        "side": "home"
      },
      "opponent": {
        "id": "ef64da7f-cfaf-4300-87b0-9313386b977c",
        "name": "Dodgers",
        "score": 3
      }
    }
  ],
  "nextGame": {
    "game": {
      "id": "578b0dcb-6f7b-4b56-a7e7-fcab633ea591",
      "status": "scheduled",
      "scheduled": "2026-10-07T22:00:00+00:00",
      "venue": {
        "city": "Atlanta",
        "name": "Truist Park",
        "state": "GA"
      }
    },
    "team": {
      "id": "12079497-e414-450a-8bf2-29f91de646bf",
      "name": "Braves",
      "score": 0,
      "side": "home"
    },
    "opponent": {
      "id": "ef64da7f-cfaf-4300-87b0-9313386b977c",
      "name": "Dodgers",
      "score": 0
    }
  }
}

The same overview during the game. currentGame carries the score from the team's point of view, the inning (period with periodType), the half, and the outs. Shown with profile, recentGames, and nextGame omitted:

{
  "team": {
    "id": "12079497-e414-450a-8bf2-29f91de646bf",
    "name": "Atlanta Braves",
    "sport": "baseball",
    "league": "MLB"
  },
  "currentGame": {
    "game": {
      "id": "578b0dcb-6f7b-4b56-a7e7-fcab633ea591",
      "status": "inprogress",
      "scheduled": "2026-10-07T22:00:00+00:00",
      "period": 7,
      "periodType": "inning",
      "inningHalf": "top",
      "outs": 3
    },
    "team": {
      "id": "12079497-e414-450a-8bf2-29f91de646bf",
      "name": "Atlanta Braves",
      "score": 1,
      "side": "home"
    },
    "opponent": {
      "id": "ef64da7f-cfaf-4300-87b0-9313386b977c",
      "name": "Los Angeles Dodgers",
      "score": 3
    }
  }
}

Season aggregates for one season, name=Los Angeles Lakers&league=nba&scope=season&season=2025. The response carries one entry per season type (2025 PRE, 2025 PST, 2025 REG) with own_record and opponents blocks; the snippet keeps the REG entry, the first six of 74 own_record totals and four averages, and omits profile:

{
  "team": {
    "id": "583ecae2-fb46-11e1-82cb-f4ce4684ea4c",
    "name": "Los Angeles Lakers",
    "sport": "basketball",
    "league": "NBA"
  },
  "seasons": [
    {
      "id": "a7c6c8ee-c5ba-4a1a-abf5-723e1539f81b",
      "year": 2025,
      "type": "REG",
      "statistics": {
        "own_record": {
          "total": {
            "games_played": 82,
            "minutes": 19705,
            "field_goals_made": 3448,
            "field_goals_att": 6863,
            "field_goals_pct": 0.502,
            "two_points_made": 2478
          },
          "average": {
            "fast_break_pts": 14.89,
            "points_off_turnovers": 18.59,
            "second_chance_pts": 12.84,
            "minutes": 240.3
          }
        }
      }
    }
  ]
}

Without season, scope=season returns the newest three seasons that carry statistics, counting each year and season type as one season; set limit for more.


get-game-summary

Returns a game-level summary by gameId: both teams' scores, per-period scoring, and sport-specific highlights where available. In-progress games return partial scores with clock and period. Games that have not started return identity and scheduled time, plus zeroed scores where the data feed provides them.

REST: GET /game

ParameterDescription
gameIdRequired. A game ID from search-schedule.
timezoneOptional. IANA time zone. Adds a localized scheduled time and localDate.

A closed MLB game, gameId=b0303e9e-8af6-4686-a242-1db37260e82a&timezone=America/Chicago. scoring is shortened to three of the 9 innings per team and pitching.holds to one entry:

{
  "game": {
    "id": "b0303e9e-8af6-4686-a242-1db37260e82a",
    "sport": "baseball",
    "league": "MLB",
    "status": "closed",
    "scheduled": "2026-08-20T13:10:00-05:00",
    "localDate": "2026-08-20",
    "venue": {
      "city": "Chicago",
      "name": "Rate Field",
      "state": "IL"
    },
    "season": {
      "year": 2026,
      "type": "REG"
    },
    "attendance": 17052,
    "duration": "2:22",
    "finalInning": {
      "inning": 9,
      "half": "B"
    }
  },
  "teams": [
    {
      "side": "home",
      "id": "47f490cd-2f58-4ef7-9dfd-2ad6ba6c1ae8",
      "name": "Chicago White Sox",
      "alias": "CWS",
      "score": 0,
      "scoring": [
        {
          "number": 1,
          "type": "inning",
          "runs": 0,
          "hits": 0,
          "errors": 0
        },
        {
          "number": 2,
          "type": "inning",
          "runs": 0,
          "hits": 0,
          "errors": 0
        },
        {
          "number": 3,
          "type": "inning",
          "runs": 0,
          "hits": 0,
          "errors": 0
        }
      ],
      "hits": 1,
      "errors": 1,
      "startingPitcher": {
        "id": "6de93a68-31cd-4278-b933-e43cbcee5d98",
        "name": "Anthony Kay",
        "jerseyNumber": "18"
      }
    },
    {
      "side": "away",
      "id": "12079497-e414-450a-8bf2-29f91de646bf",
      "name": "Atlanta Braves",
      "alias": "ATL",
      "score": 2,
      "scoring": [
        {
          "number": 1,
          "type": "inning",
          "runs": 0,
          "hits": 0,
          "errors": 0
        },
        {
          "number": 2,
          "type": "inning",
          "runs": 0,
          "hits": 0,
          "errors": 0
        },
        {
          "number": 3,
          "type": "inning",
          "runs": 1,
          "hits": 2,
          "errors": 0
        }
      ],
      "hits": 8,
      "errors": 0,
      "startingPitcher": {
        "id": "5a6101eb-bc40-47af-824a-0f9d1dbe2e0d",
        "name": "Grant Holmes",
        "jerseyNumber": "66"
      }
    }
  ],
  "result": {
    "winner": {
      "side": "away",
      "id": "12079497-e414-450a-8bf2-29f91de646bf",
      "name": "Atlanta Braves"
    },
    "score": "ATL 2 @ CWS 0"
  },
  "pitching": {
    "win": {
      "id": "5a6101eb-bc40-47af-824a-0f9d1dbe2e0d",
      "name": "Grant Holmes",
      "position": "P",
      "jerseyNumber": "66"
    },
    "loss": {
      "id": "6de93a68-31cd-4278-b933-e43cbcee5d98",
      "name": "Anthony Kay",
      "position": "P",
      "jerseyNumber": "18"
    },
    "save": {
      "id": "0fb79498-c05b-4330-b0d0-7777c4341de2",
      "name": "Raisel Iglesias",
      "position": "P",
      "jerseyNumber": "26"
    },
    "holds": [
      {
        "id": "15b6b15b-12d2-45c0-9bc7-ddc17a5fa52b",
        "name": "Dylan Lee",
        "position": "P",
        "jerseyNumber": "52"
      }
    ]
  }
}

The same call for a game that has not started (gameId=578b0dcb-6f7b-4b56-a7e7-fcab633ea591&timezone=America/New_York), and again during that game, when game adds period, inningHalf, and outs and scoring fills in inning by inning (shortened here to two of the 7 innings played so far):

{
  "game": {
    "id": "578b0dcb-6f7b-4b56-a7e7-fcab633ea591",
    "sport": "baseball",
    "league": "MLB",
    "status": "scheduled",
    "scheduled": "2026-10-07T18:00:00-04:00",
    "localDate": "2026-10-07",
    "venue": {
      "city": "Atlanta",
      "name": "Truist Park",
      "state": "GA"
    },
    "season": {
      "year": 2026,
      "type": "PST"
    }
  },
  "teams": [
    {
      "side": "home",
      "id": "12079497-e414-450a-8bf2-29f91de646bf",
      "name": "Atlanta Braves",
      "alias": "ATL",
      "score": 0,
      "hits": 0,
      "errors": 0
    },
    {
      "side": "away",
      "id": "ef64da7f-cfaf-4300-87b0-9313386b977c",
      "name": "Los Angeles Dodgers",
      "alias": "LAD",
      "score": 0,
      "hits": 0,
      "errors": 0
    }
  ]
}
{
  "game": {
    "id": "578b0dcb-6f7b-4b56-a7e7-fcab633ea591",
    "sport": "baseball",
    "league": "MLB",
    "status": "inprogress",
    "scheduled": "2026-10-07T18:00:00-04:00",
    "localDate": "2026-10-07",
    "venue": {
      "city": "Atlanta",
      "name": "Truist Park",
      "state": "GA"
    },
    "season": {
      "year": 2026,
      "type": "PST"
    },
    "attendance": 41173,
    "period": 7,
    "inningHalf": "top",
    "outs": 3
  },
  "teams": [
    {
      "side": "home",
      "id": "12079497-e414-450a-8bf2-29f91de646bf",
      "name": "Atlanta Braves",
      "alias": "ATL",
      "score": 1,
      "scoring": [
        {
          "number": 1,
          "type": "inning",
          "runs": 1,
          "hits": 1,
          "errors": 0
        },
        {
          "number": 2,
          "type": "inning",
          "runs": 0,
          "hits": 0,
          "errors": 0
        }
      ],
      "hits": 2,
      "errors": 2,
      "startingPitcher": {
        "id": "122f24b5-913e-4abd-90ca-62b1d7519665",
        "name": "Tyler Mahle",
        "jerseyNumber": "54"
      }
    },
    {
      "side": "away",
      "id": "ef64da7f-cfaf-4300-87b0-9313386b977c",
      "name": "Los Angeles Dodgers",
      "alias": "LAD",
      "score": 3,
      "scoring": [
        {
          "number": 1,
          "type": "inning",
          "runs": 0,
          "hits": 0,
          "errors": 0
        },
        {
          "number": 2,
          "type": "inning",
          "runs": 1,
          "hits": 0,
          "errors": 2
        }
      ],
      "hits": 4,
      "errors": 0,
      "startingPitcher": {
        "id": "81125861-72f8-461c-b7c2-46fc460a7115",
        "name": "Tyler Glasnow",
        "jerseyNumber": "31"
      }
    }
  ]
}

For one player's stat line, use get-player with scope=game. For a team's full box score, use get-team with scope=game.


get-standings

Returns league tables: one row per team, placed in its group (conference, division, or group), with rank, played, wins, losses, draws, and points, plus the sport's full standings record in stats.

REST: GET /standings

ParameterDescription
leagueNameLeague name, for example NBA, MLB, Premier League. Use instead of leagueId.
leagueIdLeague ID, for example sr:competition:17.
seasonId, seasonYearOptional. Pin a season. Without them, the newest season with games played is returned.
seasonTypeOptional. US season type such as REG (default), PST, or IST. Leave unset for non-US leagues.
groupIdOptional. Returns one conference, division, or group table.
teamIdOptional. Returns that team's row or rows.
limitOptional. Maximum rows, up to 100. Default 50.

Supply at least one of leagueName, leagueId, seasonId, groupId, or teamId. A league's table is returned whole or not at all, based on your entitlement.

leagueName=NBA&seasonType=REG returns 30 rows, one per team, each in its division (group.name) under its conference (group.parentName). The first row, with stats.records shortened to two entries:

{
  "results": [
    {
      "id": "4353138d-4c22-4396-95d8-5f587d2df25c#a7c6c8ee-c5ba-4a1a-abf5-723e1539f81b#total#12bf14ba-eb16-4c6f-8275-e801b6947c1e#583ecfff-fb46-11e1-82cb-f4ce4684ea4c",
      "sport": "basketball",
      "league": {
        "name": "NBA",
        "id": "4353138d-4c22-4396-95d8-5f587d2df25c"
      },
      "season": {
        "year": 2025,
        "id": "a7c6c8ee-c5ba-4a1a-abf5-723e1539f81b",
        "type": "REG"
      },
      "type": "total",
      "group": {
        "parentName": "WESTERN CONFERENCE",
        "name": "Northwest",
        "id": "12bf14ba-eb16-4c6f-8275-e801b6947c1e",
        "parentId": "7fe7e212-de01-4f8f-a31d-b9f0a95731e3"
      },
      "team": {
        "market": "Oklahoma City",
        "name": "Thunder",
        "id": "583ecfff-fb46-11e1-82cb-f4ce4684ea4c"
      },
      "rank": 1,
      "win": 64,
      "loss": 18,
      "ingestedAt": "2026-10-07T06:15:45.895Z",
      "stats": {
        "wins": 64,
        "games_behind": {
          "division": 0,
          "conference": 0,
          "league": 0
        },
        "points_for": 119.02,
        "records": [
          {
            "wins": 8,
            "win_pct": 0.8,
            "losses": 2,
            "record_type": "atlantic"
          },
          {
            "wins": 29,
            "win_pct": 0.906,
            "losses": 3,
            "record_type": "below_500"
          }
        ],
        "point_diff": 11.15,
        "streak": {
          "kind": "loss",
          "length": 2
        },
        "losses": 18,
        "market": "Oklahoma City",
        "reference": "1610612760",
        "sr_id": "sr:team:3418",
        "win_pct": 0.78,
        "points_against": 107.88,
        "name": "Thunder",
        "rank": {
          "division": 1,
          "conference": 1,
          "clinched": "conference"
        },
        "id": "583ecfff-fb46-11e1-82cb-f4ce4684ea4c",
        "calc_rank": {
          "conf_rank": 1,
          "div_rank": 1
        }
      }
    }
  ],
  "total": 30
}

leagueId=sr:competition:17 (Premier League): no seasonType, and the row carries played, draw, points, and currentOutcome. The first row, with stats shortened to six fields:

{
  "results": [
    {
      "id": "sr:competition:17#sr:season:140756#total#sr:league:108752#sr:competitor:17",
      "sport": "soccer",
      "league": {
        "name": "Premier League",
        "id": "sr:competition:17"
      },
      "season": {
        "year": 2026,
        "id": "sr:season:140756"
      },
      "type": "total",
      "group": {
        "phase": "regular season",
        "name": "Premier League",
        "id": "sr:league:108752"
      },
      "team": {
        "name": "Manchester City",
        "id": "sr:competitor:17",
        "abbreviation": "MCI"
      },
      "rank": 1,
      "played": 5,
      "win": 5,
      "loss": 0,
      "draw": 0,
      "points": 15,
      "change": 1,
      "currentOutcome": "Champions League",
      "ingestedAt": "2026-10-07T07:00:19.665Z",
      "stats": {
        "change": 1,
        "draw": 0,
        "played": 5,
        "points": 15,
        "loss": 0,
        "goals_against": 5
      }
    }
  ],
  "total": 20
}

Pass groupId (from group.id) for one division or conference table, or teamId for one team's row.



Agent Guidance

An agent calling the REST API directly does not receive the usage tips an MCP client gets with each tool. The Toolkit provides the same guidance in two places:

  • MCP: delivered with each tool automatically.
  • REST: written into each operation's description in the OpenAPI specification and tagged with x-mcp-tool, which names the matching MCP tool. Importing the specification into your agent framework gives the agent the same instructions. The specification is available on request.

If your agent platform truncates long operation descriptions, copy the routing guidance from Which Tool Should I Call? into your system prompt.

Tips that apply across tools:

  • Prefer get-team for live scores. Use search-schedule for broader questions about when games happen.
  • Set a narrow scope on player and team calls. The default response is large.
  • Pass a timezone whenever a user means a local "today" or "tonight". Otherwise times are UTC and evening games can fall on the wrong day.
  • Handle ambiguous names. Check resolution.otherMatches and call again with an ID when the best match is not the one you wanted.
  • Use sport and league to avoid cross-sport and cross-league name collisions, especially in soccer. A bare "Lakers" search matches the G League's Coachella Valley Lakers as well as the NBA team, for example.


Sports and League Coverage

Entity lookup covers every league below. The data tools cover fewer, so check the row for your league before relying on a tool. A green check marks a tool that covers the league; a pale cell means it does not. Each column heading links to the tool's section on this page, and each league name to that API's overview page.

✓CoveredNot covered
League Entitiessearch-entities Schedulesearch-schedule Playerget-player Teamget-team Game summaryget-game-summary Standingsget-standings
Basketball
NBA ✓ ✓ ✓ ✓ ✓ ✓
WNBA ✓ ✓ ✓ ✓ ✓ ✓
G League ✓ ✓ ✓ ✓ ✓ ✓
NCAA men's ✓ ✓ ✓ ✓ ✓ ✓
NCAA women's ✓ ✓ ✓ ✓ ✓ ✓
Unrivaled ✓ ✓ ✓ ✓ ✓ ✓
Global Basketball ✓ ✓
Football
NFL ✓ ✓ ✓ ✓ ✓ ✓
UFL ✓ ✓ ✓ ✓ ✓ ✓
NCAA football ✓ ✓ ✓ ✓ ✓ ✓
Baseball
MLB ✓ ✓ ✓ ✓ ✓ ✓
Global Baseball ✓ ✓
Hockey
NHL ✓ ✓ ✓ ✓ ✓ ✓
NCAA men's hockey ✓ ✓ ✓ ✓ ✓ ✓
Soccer
Soccer: 17 featured competitions ✓ ✓ ✓ ✓ ✓ ✓
Other sports
Aussie rules ✓
Cricket ✓
Handball ✓
Rugby ✓
Table tennis ✓
Tennis ✓

Soccer. Player, team, and default schedule coverage centers on 17 featured competitions: Premier League, Championship, LaLiga, Serie A, Bundesliga, Ligue 1, Eredivisie, Brasileiro Serie A, MLS, UEFA Champions League, UEFA Europa League, UEFA Conference League, UEFA Euro, FIFA World Cup, FIFA Women's World Cup, CONMEBOL Copa America, and FIFA Club World Cup. Entity lookup and schedule search reach many more soccer competitions when you name the league or team.

Standings. Tables are available for soccer and the US leagues marked above. Tables for cricket, Aussie rules football, handball, rugby, Global Basketball, and Global Baseball are not available yet, and a request for one returns 403.

The player, team, game summary, and standings tools return data only for the leagues and sports your account is entitled to; a league outside your entitlement returns an access error from them. Entity lookup and schedule search do not check entitlement, so they can list leagues the data tools will not serve.



Caching

REST GET responses carry standard HTTP caching headers. Entity lookups (/entities) are cacheable by any CDN. Every other response is short-lived and private to your key, because its contents depend on your entitlements. Error responses are not cached (Cache-Control: no-store). MCP responses are not HTTP-cacheable.

EndpointCache-Control
/entitiespublic, max-age=300
/schedule, /player, /team, /game, /standingsprivate, max-age=15


Errors

StatusMeaning
400Invalid request: a missing required parameter, both name and playerId, an unsupported entity type, an unknown ID, an unknown league name, or a sport the tool does not cover. The body names the problem and, for an uncovered sport, lists the sports the tool does cover.
403The player, team, game, and standings tools return it for a league or sport your key is not entitled to. Any tool returns it for NBA data outside your history tier, including a schedule search for NBA games that all fall before your window. Do not retry.
414URL too long. Split large /entities batches.
429Rate limit exceeded. Slow your request rate and retry.
500Server error, or the data feed rejected the request in a way retrying will not fix. The body names the cause.
503The data feed is unavailable or could not be reached, including when it is rate limiting the Toolkit. Retry the same request later.

Error bodies are JSON with an error message and, for validation failures, a details list:

{
  "error": "Invalid request",
  "details": [
    {
      "code": "custom",
      "path": [],
      "message": "Pass exactly one of playerId or name."
    }
  ]
}
{
  "error": "No game found for id \"00000000-0000-0000-0000-000000000000\". Use search-schedule to find a valid game id."
}
{
  "error": "Team statistics are not available for sport \"global-baseball\". Supported sports: basketball, football, hockey, baseball, soccer."
}
{
  "error": "Access denied: the provided API key does not have access to the requested data."
}
{
  "error": "The Sportradar data feed is unavailable (HTTP 503). Try the same request again later."
}

A request without a valid key returns 403 with an HTML "Authentication Error" page rather than JSON, so branch on the status code before parsing a body.

Over MCP, an entitlement failure comes back as a tool error (isError: true) rather than an HTTP status:

{
  "result": {
    "content": [
      {
        "type": "text",
        "text": "Access denied: the provided API key does not have access to the requested data."
      }
    ],
    "isError": true
  },
  "jsonrpc": "2.0",
  "id": 9
}

An access error is not transient. Do not retry the same request. Ask for a different league or sport, or contact your account representative to extend your access.



Related

  • MCP Server: the Sportradar documentation server for AI code editors and assistants, which works with the API documentation and specifications. The AI Toolkit MCP server is a separate server that returns sports data.
  • AI Researcher: analysis and insights on top of the data, with its own API and MCP server.
  • The sport-specific REST APIs and Push Feeds remain the full-depth path to every feed and field; the Toolkit is the agent-friendly entry point to the same licensed data.

Did this page help you?