Live Sports Scores API - NBA, NFL, MLB, NHL, NCAAF, EPL, MLS avatar

Live Sports Scores API - NBA, NFL, MLB, NHL, NCAAF, EPL, MLS

Pricing

$3.00 / 1,000 game row returneds

Go to Apify Store
Live Sports Scores API - NBA, NFL, MLB, NHL, NCAAF, EPL, MLS

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

NeverEmpty

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

8 hours ago

Last modified

Share

Eight leagues. One identical row shape. No HTML scraping, no proxies.

This Actor reads official and public league APIsstatsapi.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 valueLeagueSportSource
mlbMLB (Major League Baseball)BaseballMLB Stats API (official)
nhlNHL (National Hockey League)Ice hockeyNHL Web API (official)
nflNFL (National Football League)American footballESPN public scoreboard
nbaNBA (National Basketball Association)BasketballESPN public scoreboard
ncaafNCAA FootballCollege footballESPN public scoreboard
eplPremier LeagueSoccer / footballESPN public scoreboard
laligaLa LigaSoccer / footballESPN public scoreboard
mlsMLS (Major League Soccer)Soccer / footballESPN public scoreboard

What you get

Scores, schedules, fixtures and results — live, finished and upcoming games — as one row per game:

FieldTypeExampleNotes
leaguestringMLB, Premier LeagueWhich league the row came from
datestring2026-08-23Calendar date, YYYY-MM-DD
gameIdstring / integer824799The league's own game identifier
statestringpre / in / postNormalized across all 8 leagues
statusstringFinal, Scheduled, OFFThe league's own raw wording
startTimeUtcstring2026-08-23T17:35:00ZKick-off / first pitch, UTC
homeTeam / awayTeamstringBaltimore Orioles / Tampa Bay RaysTeam names as the league publishes them
homeScore / awayScoreinteger / null1 / 3null before the game starts — never a fake 0
venuestringOriole Park at Camden YardsStadium / arena
inninginteger / null9MLB only
periodinteger / null3NHL / NFL / NBA / soccer
sourcestringMLB 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"]
}
FieldDefaultMeaning
leagues7 leagues (all but ncaaf)Which leagues to pull
datesemptySpecific YYYY-MM-DD dates. Overrides daysBack
daysBack7How many days back from today, when no dates are given
maxRetries3Retries 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:

rowTypeokWhat it meansCharged?
gametrueA real fixture. All the score columns are filledYes
no-gamestrueThe official API answered normally and had nothing scheduled. Baseball in JanuaryNo
unavailablefalseWe could not reach the source after every retry. reason carries the errorNo

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

  1. Click Try for free and hit Start — the defaults already produce a full dataset.
  2. Narrow it down: pick your leagues, or pass exact dates.
  3. Export the dataset as JSON, CSV, Excel, or pull it from the Apify API.
  4. 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.

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.