{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://artifacts.apis.io/owlsinsight-com/json-schema/owlsinsight-com-injuries-response-schema.json",
  "title": "InjuriesResponse",
  "x-generated": "2026-10-31",
  "x-method": "derived",
  "x-generator": "derive-json-schema.py",
  "x-source": "openapi/owlsinsight-com-openapi.json#/components/schemas/InjuriesResponse",
  "properties": {
    "count": {
      "format": "double",
      "type": "number"
    },
    "meta": {
      "properties": {
        "conflicts": {
          "description": "Players both sources cover but disagree about. Counted over what is SERVED.",
          "format": "double",
          "type": "number"
        },
        "listDaysConflicts": {
          "description": "Players both sources call injured but disagree about the LENGTH of.",
          "format": "double",
          "type": "number"
        },
        "reportAgeSummary": {
          "description": "Freshness of THIS response. The first four partition the players returned\nand sum to `count`; the last three describe how much of the whole response\ncould be dated and are not scoped to those buckets.",
          "properties": {
            "datedRecords": {
              "format": "double",
              "type": "number"
            },
            "freshConsensus": {
              "format": "double",
              "type": "number"
            },
            "noConsensus": {
              "format": "double",
              "type": "number"
            },
            "noVerdict": {
              "format": "double",
              "type": "number"
            },
            "playersWithNoDatedRecord": {
              "format": "double",
              "type": "number"
            },
            "staleConsensus": {
              "format": "double",
              "type": "number"
            },
            "undatedRecords": {
              "format": "double",
              "type": "number"
            }
          },
          "type": "object",
          "x-owls-required": [
            "staleConsensus",
            "freshConsensus",
            "noVerdict",
            "noConsensus",
            "playersWithNoDatedRecord",
            "datedRecords",
            "undatedRecords"
          ]
        },
        "sources": {
          "additionalProperties": {
            "$ref": "#/$defs/InjurySourceMeta"
          },
          "type": "object"
        },
        "suffixJoins": {
          "items": {
            "$ref": "#/$defs/InjurySuffixJoin"
          },
          "type": "array"
        },
        "timestamp": {
          "type": "string"
        },
        "unresolvedIdentity": {
          "items": {
            "$ref": "#/$defs/InjuryUnresolvedIdentity"
          },
          "type": "array"
        }
      },
      "type": "object",
      "x-owls-required": [
        "sources",
        "conflicts",
        "listDaysConflicts",
        "suffixJoins",
        "unresolvedIdentity",
        "reportAgeSummary",
        "timestamp"
      ]
    },
    "players": {
      "items": {
        "$ref": "#/$defs/InjuryPlayer"
      },
      "type": "array"
    },
    "sport": {
      "type": "string"
    },
    "success": {
      "type": "boolean"
    }
  },
  "type": "object",
  "x-owls-required": [
    "success",
    "sport",
    "count",
    "players",
    "meta"
  ],
  "$defs": {
    "InjuryAgreement": {
      "description": "Whether the sources corroborate one another for this player.",
      "type": "string",
      "x-extensible-enum": [
        "agrees",
        "conflict",
        "single-source"
      ]
    },
    "InjuryConsensus": {
      "description": "Derived agreement between sources. Present ONLY when the player's identity is\ncertain; absent players are listed in `meta.unresolvedIdentity`.",
      "properties": {
        "agreement": {
          "$ref": "#/$defs/InjuryAgreement"
        },
        "idVerified": {
          "description": "True only when a shared player id corroborates the name-and-team join.",
          "type": "boolean"
        },
        "injuryStatus": {
          "anyOf": [
            {
              "$ref": "#/$defs/InjuryStatus"
            },
            {
              "type": "null"
            }
          ],
          "description": "Null on a conflict: an indeterminate answer is its own verdict, never a pick."
        },
        "listDaysConflict": {
          "description": "True when both sources agree a player is on an injured list but disagree\nabout its length, for example 10 days against 60. `agreement` still reads\n\"agrees\", so check this when the length matters.",
          "type": "boolean"
        },
        "sources": {
          "items": {
            "$ref": "#/$defs/InjurySourceLabel"
          },
          "type": "array"
        },
        "stale": {
          "description": "Whether the designation is still current, judged against `staleAfterSeconds`.\n\nTrue when every dated record behind it is older than the window, false when\nat least one is inside it, and null when no verdict is possible. Null is\nnever a substitute for false.",
          "type": [
            "boolean",
            "null"
          ]
        },
        "staleAfterSeconds": {
          "description": "The window the designation was judged against, in seconds, chosen by what the\ndesignation IS rather than by sport alone: a weekly football designation\nlapses far sooner than a baseball injured-list stint, which is given its own\nlength plus grace.\n\nRead it together with `stale` to tell the two nulls apart. A number beside a\nnull `stale` means the rule exists but nothing carried a timestamp. A null\nhere means no rule applies at all.",
          "format": "double",
          "type": [
            "number",
            "null"
          ]
        },
        "suffixJoin": {
          "description": "True when the join bridged a name suffix. Disclosed rather than hidden.",
          "type": "boolean"
        }
      },
      "type": "object",
      "x-owls-required": [
        "injuryStatus",
        "agreement",
        "sources",
        "idVerified",
        "suffixJoin",
        "listDaysConflict",
        "stale",
        "staleAfterSeconds"
      ]
    },
    "InjuryPlayer": {
      "properties": {
        "consensus": {
          "$ref": "#/$defs/InjuryConsensus"
        },
        "playerKey": {
          "type": "string"
        },
        "playerName": {
          "type": "string"
        },
        "position": {
          "type": [
            "string",
            "null"
          ]
        },
        "records": {
          "description": "Every source's own view, always present, never collapsed.",
          "items": {
            "$ref": "#/$defs/InjurySourceRecord"
          },
          "type": "array"
        },
        "reportAge": {
          "$ref": "#/$defs/InjuryReportAge",
          "description": "How much of this player's evidence could be dated, and how old it is."
        },
        "teamAbbreviation": {
          "type": [
            "string",
            "null"
          ]
        },
        "teamName": {
          "type": [
            "string",
            "null"
          ]
        }
      },
      "type": "object",
      "x-owls-required": [
        "playerKey",
        "playerName",
        "teamName",
        "teamAbbreviation",
        "position",
        "reportAge",
        "records"
      ]
    },
    "InjuryReportAge": {
      "description": "How much of a player's evidence carries a timestamp, and how old it is.",
      "properties": {
        "datedRecords": {
          "format": "double",
          "type": "number"
        },
        "newestSeconds": {
          "description": "Age of the most recently dated record. Null when nothing is dated.",
          "format": "double",
          "type": [
            "number",
            "null"
          ]
        },
        "oldestSeconds": {
          "description": "Age of the least recently dated record. Null when nothing is dated.",
          "format": "double",
          "type": [
            "number",
            "null"
          ]
        },
        "undatedRecords": {
          "format": "double",
          "type": "number"
        }
      },
      "type": "object",
      "x-owls-required": [
        "newestSeconds",
        "oldestSeconds",
        "datedRecords",
        "undatedRecords"
      ]
    },
    "InjurySourceLabel": {
      "description": "Which of the sport's sources a record came from.\n\nDeliberately a ROLE, not a vendor name: \"primary\" is the source the API leads\nwith for that sport. The label stays correct if a source is swapped underneath\nit, and it is stable across sports, where the primary differs.",
      "type": "string",
      "x-extensible-enum": [
        "primary",
        "secondary",
        "tertiary"
      ]
    },
    "InjurySourceMeta": {
      "description": "Per-source freshness and provenance.",
      "properties": {
        "ageSeconds": {
          "description": "Seconds since this source was last stored, or null when unknown. Never 0 as a\nstand-in for unknown.",
          "format": "double",
          "type": [
            "number",
            "null"
          ]
        },
        "checks": {
          "description": "The validations that ran on THIS source's data. Never pooled across sources.",
          "items": {
            "type": "string"
          },
          "type": "array"
        },
        "injuredCount": {
          "format": "double",
          "type": "number"
        },
        "lastDataAgeSeconds": {
          "description": "How long since this source last produced a non-empty result.",
          "format": "double",
          "type": [
            "number",
            "null"
          ]
        },
        "lastFetchError": {
          "description": "The reason CODE of the last refused write. Free-text detail is not served.",
          "properties": {
            "at": {
              "type": "string"
            },
            "reason": {
              "type": "string"
            }
          },
          "type": "object",
          "x-owls-required": [
            "at",
            "reason"
          ]
        },
        "metaMismatch": {
          "description": "Present when the stored metadata did not describe the stored data, so its age\nand counts were not trusted and `ageSeconds` is null. Surfaced rather than\nquietly corrected, because the divergence is itself the signal.",
          "type": "boolean"
        },
        "partial": {
          "properties": {
            "unitsExpected": {
              "format": "double",
              "type": "number"
            },
            "unitsFetched": {
              "format": "double",
              "type": "number"
            }
          },
          "type": "object",
          "x-owls-required": [
            "unitsExpected",
            "unitsFetched"
          ]
        },
        "recordCount": {
          "format": "double",
          "type": "number"
        },
        "stale": {
          "type": "boolean"
        }
      },
      "type": "object",
      "x-owls-required": [
        "recordCount",
        "injuredCount",
        "checks",
        "ageSeconds",
        "stale",
        "lastDataAgeSeconds"
      ]
    },
    "InjurySourceRecord": {
      "description": "One player's status according to ONE source. Never merged with another source's view.",
      "properties": {
        "bodyPart": {
          "description": "A factual descriptor such as \"Ankle\", not editorial copy.",
          "type": [
            "string",
            "null"
          ]
        },
        "depthChartOrder": {
          "format": "double",
          "type": [
            "number",
            "null"
          ]
        },
        "injuryStatus": {
          "$ref": "#/$defs/InjuryStatus"
        },
        "listDays": {
          "description": "Injured-list length in days, where the source encodes one.",
          "format": "double",
          "type": [
            "number",
            "null"
          ]
        },
        "playerName": {
          "description": "This source's own spelling of the name, which is why it can differ per record.",
          "type": "string"
        },
        "position": {
          "type": [
            "string",
            "null"
          ]
        },
        "practiceDescription": {
          "type": [
            "string",
            "null"
          ]
        },
        "practiceParticipation": {
          "type": [
            "string",
            "null"
          ]
        },
        "reportAgeSeconds": {
          "description": "Seconds since this source published the state, derived from `reportedAt`.\n\nNull when the source publishes no timestamp, and never 0 as a stand-in for\nunknown. Distinct from `meta.sources[source].ageSeconds`, which is how long\nago the feed was fetched: a designation weeks past its weekly reissue can sit\nbehind a fetch that happened seconds ago.",
          "format": "double",
          "type": [
            "number",
            "null"
          ]
        },
        "reportedAt": {
          "description": "The SOURCE's timestamp for this state, not when it was fetched. Null when the\nsource publishes none.",
          "type": [
            "string",
            "null"
          ]
        },
        "seasonEnding": {
          "type": "boolean"
        },
        "source": {
          "$ref": "#/$defs/InjurySourceLabel"
        },
        "statusLabel": {
          "description": "The source's own display string, verbatim. Shown, never compared.",
          "type": "string"
        },
        "teamAbbreviation": {
          "type": [
            "string",
            "null"
          ]
        },
        "teamId": {
          "description": "Canonical team id, stable across sources and sports.",
          "type": [
            "string",
            "null"
          ]
        },
        "teamName": {
          "type": [
            "string",
            "null"
          ]
        }
      },
      "type": "object",
      "x-owls-required": [
        "source",
        "playerName",
        "position",
        "teamName",
        "teamAbbreviation",
        "teamId",
        "injuryStatus",
        "statusLabel",
        "listDays",
        "seasonEnding",
        "bodyPart",
        "practiceParticipation",
        "practiceDescription",
        "depthChartOrder",
        "reportedAt",
        "reportAgeSeconds"
      ]
    },
    "InjuryStatus": {
      "description": "Normalised availability. `unmapped` is a first-class value, not an error: an\nunrecognised upstream token surfaces as unknown rather than defaulting to\nhealthy, because \"healthy\" is an affirmative claim you would act on.",
      "type": "string",
      "x-extensible-enum": [
        "active",
        "day_to_day",
        "doubtful",
        "injured_list",
        "not_injury_list",
        "out",
        "questionable",
        "suspended",
        "unmapped"
      ]
    },
    "InjurySuffixJoin": {
      "properties": {
        "playerKey": {
          "type": "string"
        },
        "spellings": {
          "items": {
            "type": "string"
          },
          "type": "array"
        },
        "teamName": {
          "type": [
            "string",
            "null"
          ]
        }
      },
      "type": "object",
      "x-owls-required": [
        "playerKey",
        "teamName",
        "spellings"
      ]
    },
    "InjuryUnresolvedIdentity": {
      "description": "Why a player could not be given a consensus.",
      "properties": {
        "playerKey": {
          "type": "string"
        },
        "reason": {
          "type": "string",
          "x-extensible-enum": [
            "duplicate_source_id",
            "name_collision",
            "suffix_unverified",
            "unresolved_team"
          ]
        },
        "spellings": {
          "items": {
            "type": "string"
          },
          "type": "array"
        },
        "teamName": {
          "type": [
            "string",
            "null"
          ]
        }
      },
      "type": "object",
      "x-owls-required": [
        "playerKey",
        "teamName",
        "reason",
        "spellings"
      ]
    }
  }
}