The teams endpoint is the club directory. Call it with no id and body is the list of clubs. Each row has a numeric id, an abbreviation, a league, and a division. That id is what the other team routes ask for.
👉 To access this endpoint, you must obtain an API key: https://steadyapi.com/register
Authentication
Every call uses a Bearer token from your SteadyAPI dashboard.
Documentation:
https://docs.steadyapi.com/#authenticating-requests
headers = {
'Authorization': 'Bearer YOUR_API_KEY'
}
Where this fits
The schedule and box score use gamePk. This list is how you get a club id. Pass that id as teamIds on GET /v1/mlb/teams-roster when you want one club’s players. The roster parameter is teamIds, plural, even for a single club. You do not need a date for the directory itself.
List MLB teams
Endpoint: GET /v1/mlb/teams
Documentation:
https://docs.steadyapi.com/#baseball-mlb-GETapi-v1-mlb-teams
Parameters
teamId— optional integer. Omit it to list clubs
With no teamId, body is the full list. Set teamId when you want that club’s record rather than the directory. There is no season parameter and no name search. The sample row’s season is part of the payload, not something you send.
Python
import requests
url = "https://api.steadyapi.com/v1/mlb/teams"
headers = {"Authorization": "Bearer YOUR_API_KEY"}
response = requests.get(url, headers=headers)
response.raise_for_status()
teams = response.json().get("body") or []
for team in teams:
if team.get("abbreviation") == "OAK":
print(team.get("id"), team.get("name"), team.get("season"))
break
Annotated sample
{
"id": 133,
"name": "Oakland Athletics",
"season": 2023,
"abbreviation": "OAK",
"teamName": "Athletics",
"locationName": "Oakland",
"venue": { "id": 10, "name": "Oakland Coliseum" },
"league": { "id": 103, "name": "American League" },
"division": { "id": 200, "name": "American League West" }
}
Store id. That is the team id for roster and the other team endpoints. abbreviation and teamName are the short labels. name is the full club string in this row. League and division names are nested. The venue name is venue.name. The documented sample still says Oakland Athletics for id 133 in season 2023. Use the id, not the city string, when you call the next endpoint.
Practical use
body is a list when you omit teamId. Do not treat it as a single club object. Find the row, then read id.
teamName is Athletics and name is Oakland Athletics in this sample. They are different fields. Show name if you want the full label from the payload.
Spring league and all-star fields sit on the same row. You can ignore springLeague and allStarStatus unless you are building a spring-training view. They are not required to call the roster.
👉 Get your API key and list teams: https://steadyapi.com/register