# Injury / Availability Monitor for Agents

> Canonical URL: https://lumify.ai/docs/injuries.md
> HTML twin: https://lumify.ai/docs/injuries

How the injury monitor works — late-breaking NFL/MLB player availability per event, REST + MCP get_injuries, severity, and injury webhooks. Beta.

<!-- Auto-generated from api/templates/public/docs_injuries.html by scripts/html_docs_to_md.py — edit the HTML template, then re-run. -->

# Monitor player availability for an upcoming event

How the injury monitor works — late-breaking player **availability for an upcoming event**, not a league-wide injury dump and not an in-game feed. Endpoint and MCP tool stay on the [API reference](/docs/reference#event-injuries). This page is the how-to agents and builders cite.

Lumify’s injury monitor watches for **late-breaking status changes** tied to a specific event ID. Agents call GET /v1/events/{id}/injuries (MCP get_injuries) or subscribe to webhook event_types: ["injury"] for material/critical transitions. Outputs are structured availability for builders wiring sports and predictive apps — not a human dashboard and not wagering advice.

**Beta today:** NFL and MLB, with more sports rolling out. Other sports may return available: false until monitoring is live for that slate. **No in-game feed.**

## What this is (and is not)

| This page / surface | Not this |
| --- | --- |
| Event-scoped late-breaking availability | A full-league static IL / IR dump refreshed on a fixed timer |
| Status + severity + previous_status on one event ID | A substitute for official league reports as legal truth |
| Webhook push on material/critical changes | Push on every info-level reconfirm |
| Same event graph as odds, props, intelligence | A separate injury-only product with different player IDs |
| Agent / MCP / REST | A consumer scoreboard UI |

Lumify’s wedge is **per-event monitoring** with severity, odds-move triggers, and agent webhooks — Beta NFL and MLB.

<!-- #scope -->

## How the monitor runs

1. Resolve an upcoming event (list_events / query_events / get_event).

2. The monitor starts watching inside a sport-specific pre-kickoff window (below).

3. Each check may write or refresh structured rows on GET /v1/events/{id}/injuries.

4. available: false means no first report yet — **not charged**.

5. Material/critical transitions can also fire a signed webhook (event_types includes injury).

### Cadence (Beta)

| Sport | Watch window | Extra triggers | Pre-kick confirmation |
| --- | --- | --- | --- |
| NFL | Starts ~4.5 days before kickoff (sparse Wed/Thu practice-report checks), then regular hours-to-start cadence | Main-market line move ≥ 20 American-odds points or ≥ 1.0 point (moneyline / spread / total) | ~T-90 min |
| MLB | 48-hour window before first pitch | Same odds-move rule | ~T-2.5 h |

Webhook payload trigger is one of cadence / odds_move / checkpoint / early_report when a delivery fires. early_report is the NFL Wednesday/Thursday practice-report snap (T-96h / T-72h).

<!-- #how -->

## REST — first call

Instant trial key (no signup): [/docs/ai](/docs/ai). Persistent key: [/register](/register).

```bash
# 1) Find an upcoming NFL or MLB event
curl "https://lumify.ai/v1/events?sport=nfl&status=scheduled&limit=5" \
  -H "Authorization: Bearer YOUR_API_KEY"

# 2) Pull injury / availability for that event
curl "https://lumify.ai/v1/events/{id}/injuries" \
  -H "Authorization: Bearer YOUR_API_KEY"

# Optional: drop long-term IR / IL roster designations
curl "https://lumify.ai/v1/events/{id}/injuries?exclude_status=ir" \
  -H "Authorization: Bearer YOUR_API_KEY"
```

Always 200 when the event exists. Read available before trusting injuries[]. 404 only if the event ID does not exist. available: false → X-Credits-Used: 0.

Inspector: [API reference — event injuries](/docs/reference#event-injuries).

<!-- #rest -->

## MCP — get_injuries

Hosted MCP: https://lumify.ai/mcp (Bearer). Tool: **get_injuries**. Credits match REST (0 when available: false). Setup: [/docs/ai](/docs/ai) · landing: [/sports-mcp-server](/sports-mcp-server).

```json
{
  "mcpServers": {
    "lumify": {
      "url": "https://lumify.ai/mcp",
      "headers": { "Authorization": "Bearer lmfy-YOUR_KEY" }
    }
  }
}
```

Agent prompt pattern (illustrative): “For event {id}, call get_injuries. If available is false, wait or poll later. Summarize players with status out/doubtful/questionable and any previous_status changes. Do not invent rows.”

<!-- #mcp -->

## Field catalog

Inspector fields and the full sample live on [GET /v1/events/{id}/injuries](/docs/reference#event-injuries). The tables below are the how-to subset.

### Envelope

| Field | Type | Meaning |
| --- | --- | --- |
| event_id | integer | Lumify event ID you requested |
| available | boolean | false until the monitor has written at least one structured report; free when false |
| last_checked_at | string \| null | Most recent monitor search for this event (any outcome) |
| confirmed_at | string \| null | Guaranteed pre-kickoff confirmation time; null until that checkpoint runs |
| next_check_at | string \| null | Next scheduled cadence check; null if watching stopped |
| injuries | array | Per-player rows; empty when available is false |

### injuries[] row

| Field | Type | Meaning |
| --- | --- | --- |
| player | string | Extracted name (always present, even if unmatched) |
| player_id | integer \| null | Lumify player ID when bound to a roster/participant |
| team / team_id | string \| integer \| null | Resolved team; null if unmatched. When player_id is bound and the player's current roster team is one of this event's two participants, that roster team is served. |
| status | string | out \| doubtful \| questionable \| probable \| day_to_day \| ir \| suspended \| available |
| previous_status | string \| null | Prior status on this event; null on first sighting |
| body_part | string \| null | Body part when reported; often null on IR/IL designation rows |
| note | string \| null | Short extracted note |
| source_url | string \| null | Upstream report URL when captured |
| severity | string | info \| material \| critical (see below) |
| last_changed_at | string \| null | When this row’s status last changed |

### Severity (read this before wiring alerts)

| Severity | When | Webhook? |
| --- | --- | --- |
| info | Unchanged reconfirm, or first sighting of a routine questionable / probable / day_to_day / available with nothing to compare | Never fires injury webhook |
| material | Real status change, including first-seen out / doubtful / ir / suspended | Yes |
| critical | out / doubtful — first seen, or worsened from available / probable — with ≤ 6 hours to start | Yes |

### exclude_status

Comma-separated, case-insensitive statuses to drop from injuries[] (e.g. exclude_status=ir). Useful to hide injured-reserve / long-term IL **roster designations** (not late-breaking news). Those rows also most often have body_part: null. Unknown values → 400. Filtering every row out does **not** flip available to false if the monitor has data; credits unchanged by filter alone.

<!-- #fields -->

## Webhook recipe — push on material/critical only

```bash
curl -X POST https://lumify.ai/v1/webhooks \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://example.com/hooks/lumify",
    "event_types": ["injury"],
    "sport": "nfl"
  }'
```

Or scope to one event with "event_id": 19190 instead of sport.

**Behavior (Beta):** one signed POST per player-status transition at **material** or **critical** severity. Info reconfirms never fire. Deduped via notified_at so the same transition is not re-sent. Delivery data carries player, team, status, previous_status, severity, hours_to_start, and trigger (cadence / odds_move / checkpoint / early_report). **0.5 credits** per delivery.

Verify signatures with the signing_secret returned once on create — see [webhooks in the API reference](/docs/reference#webhooks). Polling get_injuries remains valid when you do not want push.

<!-- #webhooks -->

## Agent loop (copy-paste intent)

1. list_events / query_events → pick event_id (NFL or MLB, upcoming).

2. get_injuries → if available is false, backoff until next_check_at or poll on a coarse cadence.

3. Prefer rows where severity is material or critical, or where previous_status is non-null.

4. Optionally register webhook event_types: ["injury"] for the sport or event.

5. Join player_id to props / intelligence on the **same** event ID when you need line context — do not scrape a second ID space.

6. Never present status tags as betting advice.

<!-- #agent-loop -->

## Example response

```json
{
  "event_id": 19190,
  "available": true,
  "last_checked_at": "2026-09-03T21:07:00Z",
  "confirmed_at": null,
  "next_check_at": "2026-09-03T21:22:00Z",
  "injuries": [
    {
      "player": "Patrick Mahomes",
      "player_id": 44012,
      "team": "Kansas City Chiefs",
      "team_id": 18,
      "status": "questionable",
      "previous_status": null,
      "body_part": "ankle",
      "note": "Listed as questionable on the Friday injury report.",
      "source_url": "https://www.nfl.com/injuries",
      "severity": "info",
      "last_changed_at": "2026-09-03T21:07:00Z"
    }
  ]
}
```

Illustrative shape — first sighting of a routine questionable is info (no webhook). A later change to out / doubtful would be material (or critical inside 6 hours of kickoff). Always verify against a live event ID.

<!-- #example -->

## FAQ

 **Does Lumify have an injury API?**

Yes. Beta event-scoped injury / availability: GET /v1/events/{id}/injuries and MCP get_injuries, plus optional webhook event_types: ["injury"]. Not a league-wide dump API.

 **Which sports are covered?**

NFL and MLB in Beta, with more sports rolling out. Check available per event rather than assuming every sport is live.

 **Is available: false an error?**

No. The event exists but the monitor has not written a first report yet. Response is free (X-Credits-Used: 0 / MCP _meta.credits_used: 0).

 **Will I get a webhook for every questionable listing?**

No. Info-level reconfirms and routine first sightings of questionable/probable/day_to_day/available do not fire. Webhooks fire on **material** and **critical** transitions only (0.5 credits each).

 **Is this a league-wide injury feed?**

No. Lumify monitors **late-breaking availability for one event**, with severity, odds-move triggers, and agent webhooks on the same event graph as odds/props/intelligence. Beta NFL/MLB; no in-game feed.

 **Can I hide IR / long-term IL rows?**

Yes — exclude_status=ir (comma-separated, case-insensitive). Unknown statuses return 400.

<!-- #faq -->

## Limits (frank)

- **Beta** — NFL + MLB windows above; more sports rolling out.

- **No in-game** injury feed after kickoff/first pitch.

- Not a guaranteed-complete official report; rows are structured extractions with source_url when captured.

- Unmatched names keep the player string with null player_id.

<!-- #limits -->

## Related

- [API reference — event injuries](/docs/reference#event-injuries)

- [Guides — MCP tools](/docs/guides#mcp)

- [Sports MCP Server](/sports-mcp-server)

- [AI-assisted setup / instant key](/docs/ai)

- [Player props catalog](/docs/player-props)

- [Understanding odds](/docs/understanding-odds)

- [Sports coverage](/docs/sports-coverage)

<!-- #related -->
