PLAYER INJURIESLive · NBA + NHL

Player Injury API

Who missed which match, and why — across the top five European leagues and MLS, in one canonical schema. Reason, status and expected return, joined on the same player_id as the rest of the API, with the date the data runs through on every response.

1,000 req/day on the free plan (2,000 with GitHub). No credit card.

The count and the as_of date come back on every call — read them from the response rather than a number on this page.

What you can build

One endpoint, one id, the health context your app was missing.

  • Injury-aware lineups

    Flag a starter as out or day-to-day before lock, joined on the same player_id you already use.

  • Fantasy / DFS alerts

    Push a notification the moment a status changes, with the injury type and expected return date.

  • Props context

    Hang an injury badge next to /v1/players/{id}/props so a hit rate is never read without the health context.

  • League injury board

    A live board of every NBA and NHL player currently out, day-to-day, or questionable.

  • One id everywhere

    Injuries, props, stats, and matchup all key on the same canonical player_id. No cross-source mapping.

  • Freshness you can read

    Every response carries meta.as_of — the date of the most recent fixture behind it — so you never infer the age of a record from how often we poll.

What you get back

One call per player, the current state plus the player block.

FieldDescription
status"active" when healthy or not listed, an on-report designation (e.g. "out", "day-to-day") when injured, or "unknown" for unsupported sports.
injury_typeThe injury description, e.g. "Lower body". Null when active.
return_dateExpected return date (YYYY-MM-DD). Null when none reported.
commentFree-text note from the report. Null when none.
updated_atTimestamp of the snapshot the status came from. Null when no report row exists.
supportedFalse for sports outside injury coverage (NBA and NHL today); status is then "unknown".
playerThe canonical player block: id, name, sport, and team.

Endpoint shape

One call returns the player's current injury state. A healthy or not-listed player returns status "active" with null detail fields, not a 404.

GET /v1/players/:id/injury

Response shapejson
{
  "data": {
    "player": {
      "id": "6c5864fd-b6ac-46c7-8df7-4c63c98118ff",
      "name": "Jayson Tatum",
      "sport": "basketball",
      "team": { "id": "b4d31813-a907-4b4b-9973-d6fb0bc6509d", "name": "Boston Celtics", "abbreviation": "BOS" }
    },
    "sport": "basketball",
    "supported": true,
    "status": "Out",
    "injury_type": null,
    "return_date": "2026-10-01",
    "comment": "Tatum (foot) is out for the remainder of the season.",
    "updated_at": "2026-06-02T05:58:59.036Z",
    "as_of": "2026-06-02T18:00:00.000Z"
  },
  "meta": { "cached": false, "cache_age_ms": 0 }
}

// A healthy or not-listed player returns "active" with null injury_type,
// return_date, comment, and updated_at, not a 404. Unsupported sports
// return supported:false and status "unknown".

One call, three states

Healthy, on the report, or an unsupported sport. The envelope is the same every time, so the branch is trivial.

  • · Same canonical player_id as props, stats, and matchups
  • · 30-minute refresh, 5-minute response cache
  • · supported flag so "active" never implies false health
Node.jstypescript
// One player's current injury state, joined on the same id as everywhere else.
// Get a real playerId from the league-wide feed first — the ids are Big Balls
// UUIDs, so there is nothing to guess.
const list = await fetch('https://api.bigballsdata.com/v1/injuries?sport=basketball', {
  headers: { 'x-api-key': process.env.BBS_API_KEY! },
}).then((r) => r.json());
const playerId = list.data.injuries[0].player.id;

const res = await fetch(
  'https://api.bigballsdata.com/v1/players/' + playerId + '/injury',
  { headers: { 'x-api-key': process.env.BBS_API_KEY! } },
);
const { data } = await res.json();

if (!data.supported) {
  console.log(data.player.name, 'sport not covered');
} else if (data.status === 'active') {
  console.log(data.player.name, 'healthy');
} else {
  console.log(data.player.name, data.status, '-', data.injury_type, '(back', data.return_date + ')');
}

What will it cost

Free tier matches the rest of the API: 1,000 req/day on the free plan, 2,000 with GitHub connected. No credit card. Paid tiers (Solo / Trio / Edge / Pro) carry forward with everything else.

See all plans

Frequently asked

Which sports are covered?
Soccer is current: the top five European leagues and MLS, refreshed daily against the fixture list. NBA and NHL rows are loaded and served, but their upstream provider is paused, so those two carry an as_of well in the past rather than a live status — read meta.as_of before relying on them. Other sports return supported:false and status "unknown", so an "active" sentinel never implies false health.
How fresh is the data?
Read meta.as_of, not our polling interval. The ingest runs every 30 minutes, but the source publishes on team-news cycles rather than half-hourly, so the job's cadence is not a promise about how current the data is — and when a provider pauses, a frequent poll keeps returning the same old rows. meta.as_of is the date of the most recent fixture behind the response, and it is the only number that answers the question.
What does "active" mean when there is no injury?
A covered-sport player who is not on the injury report returns 200 with status "active" and null detail fields, not a 404. A 404 only happens when the player id itself does not exist.
How do I join injuries to the rest of the API?
data.player.id is the same canonical id used by /v1/players/{id}/props, the player stat endpoints, and the matchup composites. One id, no cross-source mapping.
Is it on the free tier?
Yes, on the same free tier as the rest of the API: 1,000 req/day, 2,000 with GitHub connected. No credit card.

Get an API key now

Player absences across Europe's top five leagues and MLS, with the date the data runs through on every response. Free tier, no credit card.