Live Sports Scores API - NBA, NFL, MLB, NHL, NCAAF, EPL, MLS
Pricing
$3.00 / 1,000 game row returneds
Live Sports Scores API - NBA, NFL, MLB, NHL, NCAAF, EPL, MLS
Live and historical scores for MLB, NHL, NFL, NBA, NCAAF, Premier League, La Liga and MLS in one identical row shape. Reads official and public league APIs - no HTML scraping, no proxies, and nothing that breaks when a site is redesigned.
Pricing
$3.00 / 1,000 game row returneds
Rating
0.0
(0)
Developer
NeverEmpty
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
8 hours ago
Last modified
Categories
Share
Eight leagues. One identical row shape. No HTML scraping, no proxies.
This Actor reads official and public league APIs — statsapi.mlb.com for MLB, api-web.nhle.com for NHL, and ESPN's public scoreboard endpoints for the rest — and normalizes every league into the same flat columns, so you can concatenate MLB baseball rows and Premier League football rows without writing a mapping layer.
No HTML parsing. No headless browser. No proxy bill. Nothing that breaks the next time a website is redesigned.
Leagues covered
| Input value | League | Sport | Source |
|---|---|---|---|
mlb | MLB (Major League Baseball) | Baseball | MLB Stats API (official) |
nhl | NHL (National Hockey League) | Ice hockey | NHL Web API (official) |
nfl | NFL (National Football League) | American football | ESPN public scoreboard |
nba | NBA (National Basketball Association) | Basketball | ESPN public scoreboard |
ncaaf | NCAA Football | College football | ESPN public scoreboard |
epl | Premier League | Soccer / football | ESPN public scoreboard |
laliga | La Liga | Soccer / football | ESPN public scoreboard |
mls | MLS (Major League Soccer) | Soccer / football | ESPN public scoreboard |
What you get
Scores, schedules, fixtures and results — live, finished and upcoming games — as one row per game:
| Field | Type | Example | Notes |
|---|---|---|---|
league | string | MLB, Premier League | Which league the row came from |
date | string | 2026-08-23 | Calendar date, YYYY-MM-DD |
gameId | string / integer | 824799 | The league's own game identifier |
state | string | pre / in / post | Normalized across all 8 leagues |
status | string | Final, Scheduled, OFF | The league's own raw wording |
startTimeUtc | string | 2026-08-23T17:35:00Z | Kick-off / first pitch, UTC |
homeTeam / awayTeam | string | Baltimore Orioles / Tampa Bay Rays | Team names as the league publishes them |
homeScore / awayScore | integer / null | 1 / 3 | null before the game starts — never a fake 0 |
venue | string | Oriole Park at Camden Yards | Stadium / arena |
inning | integer / null | 9 | MLB only |
period | integer / null | 3 | NHL / NFL / NBA / soccer |
source | string | MLB Stats API (official) | Which API produced the row |
One real row, exactly as the Actor writes it
{"league": "MLB","date": "2026-08-23","gameId": 824799,"state": "post","status": "Final","startTimeUtc": "2026-08-23T17:35:00Z","homeTeam": "Baltimore Orioles","awayTeam": "Tampa Bay Rays","homeScore": 1,"awayScore": 3,"venue": "Oriole Park at Camden Yards","inning": 9,"source": "MLB Stats API (official)"}
Two things most sports scrapers get wrong
1. A game that has not started is not a 0–0 draw.
ESPN's scoreboard returns "score": "0" for fixtures that have not kicked off yet. Copy that straight into a dataset and every upcoming match looks like a goalless draw. This Actor returns null for both scores until the game is actually under way, in every league.
2. Every league words its status differently.
MLB says Final, NHL says OFF, ESPN says Full Time. You still get each league's raw wording in status, but you also get state, folded into exactly three values — pre, in, post — so WHERE state = 'post' works across all eight leagues without a lookup table.
Input
Everything is optional. Run it with no input at all and you get the last 7 days across 7 leagues.
{"leagues": ["mlb", "nhl", "nfl", "nba", "epl", "laliga", "mls"],"daysBack": 7}
Or ask for specific dates:
{"leagues": ["epl", "laliga"],"dates": ["2026-08-23", "2026-08-22"]}
| Field | Default | Meaning |
|---|---|---|
leagues | 7 leagues (all but ncaaf) | Which leagues to pull |
dates | empty | Specific YYYY-MM-DD dates. Overrides daysBack |
daysBack | 7 | How many days back from today, when no dates are given |
maxRetries | 3 | Retries per league/day if an API returns an error or something that is not JSON |
The wide default is deliberate. The eight leagues have different seasons, so a narrow default would return an empty dataset in the middle of the year. Seven leagues across seven days always has games in it.
Pricing
A league with no games still gets a row
Most scoreboard Actors return nothing for a league that is out of season. You get a table, you count the leagues in it, one is missing — and you cannot tell whether the league is in its offseason or whether the Actor quietly failed for it.
This one always answers. Every league × date you ask for produces at least one row, and rowType says which kind:
rowType | ok | What it means | Charged? |
|---|---|---|---|
game | true | A real fixture. All the score columns are filled | Yes |
no-games | true | The official API answered normally and had nothing scheduled. Baseball in January | No |
unavailable | false | We could not reach the source after every retry. reason carries the error | No |
The score columns on a no-games or unavailable row are null, never 0. A 0-0 would be indistinguishable from a real goalless draw.
Verified on 2026-08-27: asking for MLB, NHL and the Premier League on 2026-01-15 returns 12 rows — 10 NHL fixtures, plus one no-games row each for MLB and the Premier League, both of which are out of season on that date.
You are charged per game actually returned — not per run, not per hour, not per request. A day with no games in it costs nothing.
How to use it
- Click Try for free and hit Start — the defaults already produce a full dataset.
- Narrow it down: pick your leagues, or pass exact dates.
- Export the dataset as JSON, CSV, Excel, or pull it from the Apify API.
- To keep it fresh, schedule it — daily, hourly, or every few minutes during a game.
Works from the Apify API, the JavaScript and Python clients, MCP, and any HTTP client.
Typical uses
- A scoreboard or live-score widget on a site or app
- Loading historical results into a database for analysis or modelling
- Fantasy-league and betting-model inputs
- Alerts and bots that fire when a game ends
- Any pipeline that needs baseball, hockey, football, basketball and soccer results in one schema
FAQ
Does this need a proxy? No. It reads public APIs directly. No proxy configuration, no proxy cost.
Will it break when a sports website changes its design? Site redesigns do not touch these endpoints, because nothing here parses HTML.
What happens out of season? You get zero rows for that league and a clean run — not an error. That is why the default spans several leagues at once.
Can I get one league only?
Yes — pass a single value, e.g. {"leagues": ["nhl"]}.
Is live, in-progress data included?
Yes. Games under way come back with state: "in" and the current score, plus inning (MLB) or period.
How far back can I go?
Pass any past date in dates. The leagues' own archives go back years.
Other tools by NeverEmpty
Every NeverEmpty Actor follows the same rule: it never returns an empty result to mean two different things, and it only charges for rows that actually carry an answer.
- us-weather-forecast-api - US forecasts from the official National Weather Service API
- earthquakes-usgs - earthquakes from the official USGS feed
Support
Found a wrong row, a missing league, or a field you need? Open an issue on the Actor's Issues tab. Reports about incorrect data are fixed first.