ESPN Injury Report Scraper & Change Monitor - NFL NBA MLB NHL
Pricing
from $1.46 / 1,000 injury report returneds
ESPN Injury Report Scraper & Change Monitor - NFL NBA MLB NHL
For fantasy tools, betting models and news desks: every current ESPN injury report across six leagues in one row shape - 1,261 reports on 2026-09-06 (NFL 800, MLB 283, NBA 75, NHL 61, WNBA 39), each with the player ESPN id. Monitoring returns only what changed, so you never pay twice. No API key.
Pricing
from $1.46 / 1,000 injury report returneds
Rating
0.0
(0)
Developer
NeverEmpty
Maintained by CommunityActor stats
0
Bookmarked
4
Total users
2
Monthly active users
7 days ago
Last modified
Categories
Share
Sports Injury Report Scraper & Change Monitor — NFL, NBA, MLB, NHL
For fantasy leagues, betting models, sports media and injury analytics: 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.
Five leagues, one row shape, and a real count. NFL, NBA, MLB, NHL and WNBA. On 2026-09-06 that was 1,258 reports (NFL 800, MLB 283, NBA 75, NHL 61, WNBA 39) — 1,219 of them in the four leagues read by default. 772 of the 800 NFL reports carried both a short and a long analyst comment, and 1,261 of 1,261 rows carry the player's ESPN id, which ESPN does not put in the record at all: it only exists inside the player-card link, and this Actor reads it out so you can join with any other ESPN dataset.
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 tells you "no injuries" for a league that has never had a feed. That comes back here as its own row with the reason.
And the timestamps are checkable. ESPN omits the seconds (2026-09-04T21:36Z), so reportedAt is the parsed instant and reportedAtRaw is ESPN's own string — you can always verify the conversion instead of trusting it.
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. No API key, no login, and no proxy by default — ESPN's public feed answered 200 from a plain Apify datacentre address on 2026-09-06. Export as JSON, CSV or Excel.
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
- 🏥 Five leagues, one row shape. NFL, NBA, MLB, NHL and WNBA. On 2026-09-06 that was 1,258 reports (NFL 800, MLB 283, NBA 75, NHL 61, WNBA 39) — 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
OuttoDay-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,258 of 1,258 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 five 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
| Field | What it is |
|---|---|
injuryId | ESPN's id for the report (stays the same while the report is updated) |
reportKey | Changes whenever the status, timestamp or comment changes — this is what monitoring compares |
league, leagueName, sport | nfl / NFL / football |
seasonYear, seasonType | e.g. 2026, Preseason |
teamId, teamName, teamAbbreviation, teamSlug | 22, Arizona Cardinals, ARI, arizona-cardinals |
athleteId, athleteName, athleteShortName | 2578570, Jacoby Brissett, J. Brissett |
position, positionAbbreviation | Quarterback, QB |
athleteUrl, headshotUrl | ESPN player card and headshot (794 of 800 NFL rows have a headshot) |
injuryStatus | As 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 |
injuryStatusCode | ESPN's own code, e.g. INJURY_STATUS_DAYTODAY (11 distinct codes) |
injuryStatusAbbreviation, injuryStatusDescription | A, active |
reportedAt, reportedAtRaw | The timestamp as an ISO instant, and exactly as ESPN wrote it |
shortComment, longComment | ESPN's analyst commentary |
Two things about the data worth knowing
- ESPN prints some statuses in both cases —
Suspensionandsuspension,Bereavementandbereavement. 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).reportedAtis the parsed instant;reportedAtRawis 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.
| Field | Type | Default | What it does |
|---|---|---|---|
leagues | array | ["nfl", "nba", "mlb", "nhl"] | Which leagues to read. Only these five have an ESPN injury feed with current data (checked 2026-09-06: NFL 800 reports, MLB 283, NBA 75, NHL 61, WNBA 39). College football (ncaaf) is refused with a free explanation row: ESPN's college football feed only holds 3 reports dated 2020-2022 (checked 2026-09-14). ESPN… |
maxInjuries | integer | 200 | How 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. |
monitoringMode | boolean | false | Off = 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… |
resetMonitoringState | boolean | false | Clear the remembered reports before this run, so everything counts as new again. |
statuses | array | [] | 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,… |
teams | array | [] | Keep a report only if the team name, abbreviation or slug contains one of these (case-insensitive, partial). Example: Cardinals, ARI, arizona-cardinals. |
players | array | [] | Keep a report only if the player's name contains one of these (case-insensitive, partial). Example: Brissett. |
positions | array | [] | Keep a report only if the position or its abbreviation contains one of these (case-insensitive, partial). Example: Quarterback, QB, Pitcher. |
requireComment | boolean | false | Drop reports that carry no short or long comment. On 2026-09-06, 772 of the 800 NFL reports had one. |
changedSince | string | (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. |
keywords | array | [] | 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. |
keywordMatch | string | any | Any = at least one keyword. All = every keyword. |
excludeKeywords | array | [] | Drop a report if any of these appear in the same fields. |
useProxy | boolean | false | Off 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.