Sports Injury Report Scraper & Change Monitor - NFL NBA MLB NHL avatar

Sports Injury Report Scraper & Change Monitor - NFL NBA MLB NHL

Pricing

from $1.46 / 1,000 injury report returneds

Go to Apify Store
Sports Injury Report Scraper & Change Monitor - NFL NBA MLB NHL

Sports Injury Report Scraper & Change Monitor - NFL NBA MLB NHL

Turn monitoring on and every later run returns only the injury reports that are new or have changed, so you are never charged for the same report twice. Every ESPN injury report as JSON: player, team, position, status and analyst comments. NFL, NBA, MLB, NHL, WNBA and college football.

Pricing

from $1.46 / 1,000 injury report returneds

Rating

0.0

(0)

Developer

NeverEmpty

NeverEmpty

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

18 hours ago

Last modified

Share

Sports Injury Report Scraper & Change Monitor — NFL, NBA, MLB, NHL

Turn monitoring on and every later run returns only the reports that are new or have changed, so you are never charged for the same report twice.

Every injury ESPN publishes, as one flat row: the player and their ESPN id, the team, the position, the status as ESPN prints it and as ESPN's own code, the timestamp, and ESPN's short and long analyst commentary.

Unofficial. This Actor is not affiliated with or endorsed by ESPN. It reads ESPN's public injuries feed — no key, no login, no HTML parsing.

What it does

  • 🏥 Six leagues, one row shape. NFL, NBA, MLB, NHL, WNBA and college football. On 2026-09-06 that was 1,261 reports (NFL 800, MLB 283, NBA 75, NHL 61, WNBA 39, NCAAF 3) — 1,219 of them in the four leagues read by default.
  • 🔁 Change monitoring, not just new rows. An injury keeps the same ESPN id while its status moves from Out to Day-To-Day. Monitoring compares the status, timestamp and comment, so a changed report comes back as new — which is the whole point of watching an injury list.
  • 🗣 Analyst commentary included. 772 of the 800 NFL reports carried a short and long comment on 2026-09-06.
  • 🆔 The player's ESPN id, which ESPN does not put in the record. It only exists inside the player-card link; this Actor reads it out so you can join with any other ESPN dataset. 1,261 of 1,261 rows have it.
  • No HTML, no proxy, no key. A public JSON feed, read directly.

🔴 What this Actor refuses to guess

ESPN answers HTTP 200 with an empty feed for leagues it has no injury data for — every soccer league and college basketball. A scraper that just asks and reports what comes back will tell you "no injuries" for the Premier League, which is false: there is simply no feed.

So this Actor only asks for the six leagues it has verified, and refuses the rest with an explanation instead of returning an empty result as fact. A league with a real but empty feed, a feed that could not be read, and filters that matched nothing each come back as their own row with the reason written out, and none of them are charged.

What you get in every row

FieldWhat it is
injuryIdESPN's id for the report (stays the same while the report is updated)
reportKeyChanges whenever the status, timestamp or comment changes — this is what monitoring compares
league, leagueName, sportnfl / NFL / football
seasonYear, seasonTypee.g. 2026, Preseason
teamId, teamName, teamAbbreviation, teamSlug22, Arizona Cardinals, ARI, arizona-cardinals
athleteId, athleteName, athleteShortName2578570, Jacoby Brissett, J. Brissett
position, positionAbbreviationQuarterback, QB
athleteUrl, headshotUrlESPN player card and headshot (794 of 800 NFL rows have a headshot)
injuryStatusAs ESPN prints it: Active, Out, Questionable, Day-To-Day, Injured Reserve, Suspension, Bereavement, 7-Day IL, 10-Day-IL, 15-Day-IL, 60-Day-IL
injuryStatusCodeESPN's own code, e.g. INJURY_STATUS_DAYTODAY (11 distinct codes)
injuryStatusAbbreviation, injuryStatusDescriptionA, active
reportedAt, reportedAtRawThe timestamp as an ISO instant, and exactly as ESPN wrote it
shortComment, longCommentESPN's analyst commentary

Two things about the data worth knowing

  • ESPN prints some statuses in both casesSuspension and suspension, Bereavement and bereavement. The value is passed through unchanged rather than "tidied", so what you get is what ESPN shows. Filtering on status ignores case, and also matches ESPN's code, so "suspension" catches both.
  • ESPN omits the seconds in its timestamps (2026-09-04T21:36Z). reportedAt is the parsed instant; reportedAtRaw is ESPN's own string, so you can always check the conversion rather than trust it.

What you can do with it

🔔 Watch a team without paying twice. Monitoring mode plus teams: ["Cardinals"] on a schedule: each run returns only what actually changed.

📊 Feed a fantasy or betting model. Status plus analyst commentary plus the player's ESPN id, ready to join with scores and rosters.

📰 Drive a news bot. changedSince and requireComment give you just the reports with fresh commentary.

🩺 Track one player's history. players: ["Brissett"] across scheduled runs builds a timeline of status changes.

Configure the run

A first run with the defaults reads the four major leagues:

{
"leagues": ["nfl", "nba", "mlb", "nhl"],
"maxInjuries": 200
}

Watch one team on a schedule, paying only for changes:

{
"leagues": ["nfl"],
"teams": ["Cardinals"],
"monitoringMode": true,
"maxInjuries": 100
}

Only players who are actually sidelined, with commentary:

{
"leagues": ["nba", "nhl"],
"statuses": ["out", "day-to-day"],
"requireComment": true
}

Input reference

Every field is optional; the defaults read the four major leagues.

FieldTypeDefaultWhat it does
leaguesarray["nfl", "nba", "mlb", "nhl"]Which leagues to read. Only these six have an ESPN injury feed with real data (checked 2026-09-06: NFL 800 reports, MLB 283, NBA 75, NHL 61, WNBA 39, college football 3). ESPN…
maxInjuriesinteger200How many injury reports to return. You are charged for the rows you actually receive. All four default leagues together carried 1,219 reports on 2026-09-06.
monitoringModebooleanfalseOff = return every report for the leagues you picked. On = remember what was already returned and, on later runs, return only reports that are new or have changed. An injury…
resetMonitoringStatebooleanfalseClear the remembered reports before this run, so everything counts as new again.
statusesarray[]Keep a report only if its status matches one of these (case-insensitive; matched against both the readable status and ESPN's code). Seen on 2026-09-06: Active, Out,…
teamsarray[]Keep a report only if the team name, abbreviation or slug contains one of these (case-insensitive, partial). Example: Cardinals, ARI, arizona-cardinals.
playersarray[]Keep a report only if the player's name contains one of these (case-insensitive, partial). Example: Brissett.
positionsarray[]Keep a report only if the position or its abbreviation contains one of these (case-insensitive, partial). Example: Quarterback, QB, Pitcher.
requireCommentbooleanfalseDrop reports that carry no short or long comment. On 2026-09-06, 772 of the 800 NFL reports had one.
changedSincestring(empty)Keep only reports ESPN timestamped on or after this date. Reports with an unreadable timestamp are kept, because unknown is not the same as old.
keywordsarray[]Keep a report only if one (Any) or all (All) of these appear in the player, team, position, status or the analyst comments. Example: ankle, hamstring.
keywordMatchstringanyAny = at least one keyword. All = every keyword.
excludeKeywordsarray[]Drop a report if any of these appear in the same fields.
useProxybooleanfalseOff by default: ESPN's public feed answered 200 from a plain Apify datacentre address when this Actor was built (2026-09-06). If it starts answering 403, 429 or 503, the Actor…

Pricing

Pay per result: you are charged for the injury rows you actually receive. Rows that only explain why there is nothing (no-results, no-such-league, unreadable, no-filter-match, no-new-injuries) are never charged. Reading a league's feed is free — only returned reports cost anything.

Every number in this README is checked

The fixtures in test/fixtures/ are the real feeds this Actor was built from (2026-09-06). The test suite re-counts every figure quoted above — 800, 283, 75, 61, 39, 3, 1261, 1219, 772, 794, 11, 32 — so if ESPN changes its feed, the tests fail rather than the data going quietly wrong.