A Python 3 wrapper for the MLB StatsAPI at statsapi.mlb.com
Project description
mlbapi
mlbapi is a Python 3 client for the MLB StatsAPI — the data source that powers MLB.com's live game data, box scores, standings, and more.
All responses are returned as validated Pydantic models, so you get attribute access, type safety, and IDE autocompletion with no JSON parsing required.
Installation
pip install mlbapi
Requires Python 3.10+ and pydantic >= 2.0.
Quick Start
Everything goes through a Client instance.
from mlbapi import Client
client = Client()
Schedule
from mlbapi import Client
client = Client()
# Single date
schedule = client.schedule(date='2024-06-01', team_id=117)
# Date range
schedule = client.schedule(
start_date='2024-04-01',
end_date='2024-10-01',
team_id=117,
)
for date in schedule.dates:
for game in date.games:
print(game.game_pk, game.status.detailed_state)
Box Score
from mlbapi import Client
client = Client()
schedule = client.schedule(date='2024-06-01', team_id=117)
game_pk = schedule.dates[0].games[0].game_pk
box = client.boxscore(game_pk)
# Team batting stats
print(box.teams.away.team.name)
print(box.teams.away.team_stats.batting.model_dump())
# Game info (weather, attendance, etc.)
for item in box.info:
print(item.label, item.value)
Linescore
from mlbapi import Client
client = Client()
schedule = client.schedule(date='2024-06-01', team_id=117)
game_pk = schedule.dates[0].games[0].game_pk
line = client.linescore(game_pk)
print(
f'{line.inning_half} of the {line.current_inning_ordinal} — '
f'{line.offense.batter.full_name} facing {line.defense.pitcher.full_name}. '
f'Count: {line.balls}-{line.strikes}, {line.outs} out(s).'
)
Standings
from mlbapi import Client
client = Client()
standings = client.standings(league_id=[103, 104]) # AL + NL
for record in standings.records:
for tr in record.team_records:
print(f'{tr.team.name:30s} {tr.wins}-{tr.losses} {tr.winning_percentage}')
Team Leaders
from mlbapi import Client
client = Client()
leaders = client.team_leaders(147, season='2024', leader_categories='homeRuns')
for category in leaders.team_leaders:
print(f'{category.leader_category} ({category.season})')
for entry in category.leaders:
print(f' {entry.rank}. {entry.person.full_name} {entry.value}')
Team Affiliates
from mlbapi import Client
client = Client()
# Affiliates for one team
affiliates = client.team_affiliates(147, season='2024')
for team in affiliates.teams:
print(team.name)
# Affiliates for multiple teams at once
affiliates = client.teams_affiliates(team_ids=[147, 111], season='2024')
for team in affiliates.teams:
print(team.name)
Team Alumni
from mlbapi import Client
client = Client()
alumni = client.team_alumni(147, season='2000', group='alumni')
for person in alumni.people:
print(person.full_name)
Team Stats
from mlbapi import Client
client = Client()
# Stats for a single team
stats = client.team_stats(147, stats='season', group='hitting', season='2024')
for group in stats.stats:
for split in group.splits:
print(split.stat)
# Aggregated stats across all teams
all_stats = client.teams_stats(stats='season', group='hitting', season='2024')
Configuration
Timeout
client = Client(timeout=30)
Custom Session (retries, proxy, headers)
import requests
from requests.adapters import HTTPAdapter, Retry
retry = Retry(total=3, backoff_factor=1, status_forcelist=[500, 502, 503, 504])
session = requests.Session()
session.mount('https://', HTTPAdapter(max_retries=retry))
client = Client(session=session)
Context Manager
Use the context manager when you want the client to manage its own session lifecycle:
from mlbapi import Client
with Client() as client:
schedule = client.schedule(date='2024-06-01')
box = client.boxscore(schedule.dates[0].games[0].game_pk)
The session is opened on __enter__ and closed on __exit__.
Error Handling
All exceptions inherit from mlbapi.MLBAPIException.
from mlbapi import Client, ParameterException, ObjectNotFoundException, RequestException
client = Client()
try:
box = client.boxscore(716463)
except ParameterException as e:
print(f'Bad parameter: {e}')
except ObjectNotFoundException as e:
print(f'Not found: {e}')
except RequestException as e:
print(f'Network error: {e}')
| Exception | Raised when |
|---|---|
ParameterException |
An invalid kwarg is passed to an endpoint method |
ObjectNotFoundException |
The API returned an error message (bad ID, etc.) |
RequestException |
An HTTP/network error occurred |
ImplementationException |
An unsupported endpoint was requested |
Hydrations
Many endpoints accept a hydrate parameter that embeds additional data inline,
saving extra requests. See the hydrations guide for
supported values and examples across schedule, people, teams, venues, and stats.
Available Methods
| Method | Description |
|---|---|
client.schedule(**kwargs) |
Game schedule by date/team/sport |
client.boxscore(game_pk) |
Full box score for a game |
client.linescore(game_pk) |
Live linescore (count, bases, pitcher/batter) |
client.play_by_play(game_pk) |
Play-by-play data |
client.live_diff(game_pk) |
Live feed diff/patch (v1.1) |
client.color_feed(game_pk) |
Full color feed (v1.1) |
client.color_diff(game_pk) |
Color feed diff/patch (v1.1) |
client.color_timestamps(game_pk) |
Color feed timestamps (v1.1) |
client.standings(**kwargs) |
League standings |
client.teams(**kwargs) |
Team information |
client.roster(team_id, roster_type) |
Team roster ('active', '40Man', 'fullRoster', …) |
client.coaches(team_id) |
Coaching staff for a team |
client.team_affiliates(team_id) |
Minor-league affiliates for a team |
client.team_alumni(team_id, season, group) |
Alumni (former players) for a team |
client.team_history(team_id) |
Historical franchise records for a team |
client.team_leaders(team_id) |
Statistical leaders for a team |
client.team_stats(team_id) |
Stats for a single team |
client.teams_affiliates(team_ids) |
Affiliates for multiple teams |
client.teams_history(team_ids) |
Historical records for multiple teams |
client.teams_stats(**kwargs) |
Aggregated stats across all teams |
client.divisions(**kwargs) |
Division information |
client.leagues(**kwargs) |
League information |
client.league_allstar_ballot(league_id) |
All-star ballot for a league |
client.league_allstar_writeins(league_id) |
All-star write-in ballot for a league |
client.conferences(**kwargs) |
Conference information |
client.seasons(**kwargs) |
Season information |
client.all_seasons(**kwargs) |
All seasons |
client.venues(**kwargs) |
Venue information |
client.draft(year) |
Draft picks for a year |
client.draft_prospects(**kwargs) |
Draft prospects |
client.draft_latest(year) |
Latest draft picks |
client.stats(**kwargs) |
Player/team stats |
client.stats_leaders(**kwargs) |
Stats leaders |
client.stats_streaks(**kwargs) |
Stats streaks |
client.homerunderby(game_pk) |
Home Run Derby data |
client.game_pace(**kwargs) |
Pace-of-game statistics by season/team/league |
client.attendance(**kwargs) |
Attendance data |
client.awards(**kwargs) |
Awards |
client.award_recipients(award_id) |
Recipients for an award |
client.jobs(**kwargs) |
Job listings |
client.umpires(**kwargs) |
Umpire roster |
client.transactions(**kwargs) |
Transaction data |
client.meta(meta_type) |
Lookup table values |
client.get_team_id(name) |
Team ID by name (case-insensitive) |
client.get_league_id(name) |
League ID by name or abbreviation |
client.get_division_id(name) |
Division ID by name |
client.get_venue_id(name) |
Venue ID by name |
client.last_game(team_id) |
game_pk of team's most recent completed game |
client.next_game(team_id) |
game_pk of team's next scheduled game |
Team IDs
| Team | ID | Team | ID |
|---|---|---|---|
| Yankees | 147 | Dodgers | 119 |
| Red Sox | 111 | Giants | 137 |
| Astros | 117 | Cubs | 112 |
| Braves | 144 | Cardinals | 138 |
| Mets | 121 | Padres | 135 |
Full list: client.teams()
Migrating from mlbgame
Coming from panzarino/mlbgame? See the migration guide for a function-by-function mapping.
Contributing
Contributions are welcome. Please read CONTRIBUTING.md before submitting a pull request. Bug reports and feature requests can be filed as GitHub Issues.
Support the Project
If mlbapi saves you time, consider supporting its development:
- ⭐ Star this repo — it helps others discover the project
- 💛 Sponsor on GitHub
- ☕ Donate via PayPal
License
This project is licensed under the terms found in LICENSE.
Disclaimer
This library is not affiliated with or endorsed by Major League Baseball or MLB Advanced Media. Use of the MLB StatsAPI is subject to MLB's terms of service.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file mlbapi-1.1.1.tar.gz.
File metadata
- Download URL: mlbapi-1.1.1.tar.gz
- Upload date:
- Size: 63.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8a4b3da08d013b363edd4f071884aceb3f6521a94ebea2937cbd57839c5c66d5
|
|
| MD5 |
853dd4795dc516f60bee5eabd50003bc
|
|
| BLAKE2b-256 |
76c4a6de8c2e397819a957d9a6e487af308b1195de3504418b787f2709b4a57f
|
Provenance
The following attestation bundles were made for mlbapi-1.1.1.tar.gz:
Publisher:
publish-to-pypi.yml on trevor-viljoen/mlbapi
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
mlbapi-1.1.1.tar.gz -
Subject digest:
8a4b3da08d013b363edd4f071884aceb3f6521a94ebea2937cbd57839c5c66d5 - Sigstore transparency entry: 1429523819
- Sigstore integration time:
-
Permalink:
trevor-viljoen/mlbapi@af6edf01d01d6ebbea776da0d4b87fcecb55b88a -
Branch / Tag:
refs/tags/v1.1.1 - Owner: https://github.com/trevor-viljoen
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-to-pypi.yml@af6edf01d01d6ebbea776da0d4b87fcecb55b88a -
Trigger Event:
release
-
Statement type:
File details
Details for the file mlbapi-1.1.1-py3-none-any.whl.
File metadata
- Download URL: mlbapi-1.1.1-py3-none-any.whl
- Upload date:
- Size: 55.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7272355a43a09acfbbd38655e0421baf1bb73d5f5852e8e7b79458c29d185ea0
|
|
| MD5 |
cef8b5896a06d40acfdf9a4157fd5740
|
|
| BLAKE2b-256 |
498a7b7ea49e59b6773a8c1d076366c14893594376d48d0d35254e062ccd5d3b
|
Provenance
The following attestation bundles were made for mlbapi-1.1.1-py3-none-any.whl:
Publisher:
publish-to-pypi.yml on trevor-viljoen/mlbapi
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
mlbapi-1.1.1-py3-none-any.whl -
Subject digest:
7272355a43a09acfbbd38655e0421baf1bb73d5f5852e8e7b79458c29d185ea0 - Sigstore transparency entry: 1429523839
- Sigstore integration time:
-
Permalink:
trevor-viljoen/mlbapi@af6edf01d01d6ebbea776da0d4b87fcecb55b88a -
Branch / Tag:
refs/tags/v1.1.1 - Owner: https://github.com/trevor-viljoen
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-to-pypi.yml@af6edf01d01d6ebbea776da0d4b87fcecb55b88a -
Trigger Event:
release
-
Statement type: