{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://artifacts.apis.io/sportstatsapi/json-schema/sportstatsapi-dto-hockey-box-score-response-schema.json",
  "title": "dto.HockeyBoxScoreResponse",
  "x-generated": "2026-11-08",
  "x-method": "derived",
  "x-generator": "derive-json-schema.py",
  "x-source": "openapi/sportstatsapi-openapi.json#/components/schemas/dto.HockeyBoxScoreResponse",
  "properties": {
    "complete": {
      "description": "Complete: false for a final whose skaters' goals do not add up to its\nscore (a shoot-out winner's lines may leave out the deciding goal or,\nin some leagues, credit it to the scorer: both complete); goal totals\nsummed from the skaters' lines (power-play, short-handed) are then\nnull unless the source's team line sends them, goals stay the score,\nthe other totals are the sums of the lines there are. True otherwise.",
      "type": "boolean"
    },
    "goalies": {
      "description": "home first, in the source's order",
      "items": {
        "$ref": "#/$defs/dto.HockeyBoxGoalie"
      },
      "type": "array"
    },
    "match_id": {
      "type": "integer"
    },
    "penalties": {
      "description": "Penalties: the penalty summary in game order (the box score's own, as\n/plays builds its summary plays from); null when the source sends none\n(the official DEL boxes), empty when the summary lists none.",
      "items": {
        "$ref": "#/$defs/dto.HockeyBoxPenalty"
      },
      "type": "array"
    },
    "periods": {
      "description": "period scores in game order (as on /matches/{id})",
      "items": {
        "$ref": "#/$defs/dto.Period"
      },
      "type": "array"
    },
    "schema": {
      "description": "the format and its version",
      "type": "string"
    },
    "skaters": {
      "description": "home first, in the source's order",
      "items": {
        "$ref": "#/$defs/dto.HockeyBoxSkater"
      },
      "type": "array"
    },
    "source_name": {
      "description": "SourceName: where the data came from (provider or the official league source); licence and attribution in meta.sources.",
      "type": "string"
    },
    "sport": {
      "type": "string"
    },
    "status": {
      "description": "Status: the source's status word; StatusCode: the same in one vocabulary for every sport (awaiting_result as the match answers it).",
      "type": "string"
    },
    "status_code": {
      "enum": [
        "scheduled",
        "live",
        "halftime",
        "intermission",
        "final",
        "final_overtime",
        "final_penalties",
        "postponed",
        "delayed",
        "suspended",
        "abandoned",
        "cancelled",
        "unknown",
        "awaiting_result"
      ],
      "type": "string"
    },
    "teams": {
      "description": "home first",
      "items": {
        "$ref": "#/$defs/dto.HockeyBoxTeam"
      },
      "type": "array"
    },
    "updated_at": {
      "type": "string"
    }
  },
  "type": "object",
  "$defs": {
    "dto.BoxPlayerRef": {
      "properties": {
        "id": {
          "description": "ID: our player id (code for keys created from 2026-10-14); left out\nwhen the player is not linked to one of ours.",
          "type": "integer"
        },
        "name": {
          "type": "string"
        }
      },
      "type": "object"
    },
    "dto.HockeyBoxGoalie": {
      "properties": {
        "decision": {
          "description": "the goaltender credited with the result; null for the others and when not sent",
          "enum": [
            "win",
            "loss",
            "overtime_loss"
          ],
          "type": "string"
        },
        "id": {
          "description": "ID: our player id (code: our public player code; keys created from\n2026-10-14 get the code only). Left out when the line is not linked to\none of our players: the line then has a name only.",
          "type": "integer"
        },
        "name": {
          "type": "string"
        },
        "number": {
          "description": "shirt number; null when the source sends none",
          "type": "string"
        },
        "position": {
          "description": "as the source abbreviates it; null when not sent",
          "type": "string"
        },
        "side": {
          "enum": [
            "home",
            "away"
          ],
          "type": "string"
        },
        "stats": {
          "$ref": "#/$defs/dto.HockeyGoalieStats"
        }
      },
      "type": "object"
    },
    "dto.HockeyBoxPenalty": {
      "properties": {
        "clock": {
          "type": "string"
        },
        "elapsed_seconds": {
          "description": "seconds played in the period; null when the source gives the minute only",
          "type": "integer"
        },
        "infraction": {
          "description": "as the source names it; null when it gives the minutes only",
          "type": "string"
        },
        "minute": {
          "description": "leagues whose summary gives the minute only; null otherwise",
          "type": "integer"
        },
        "minutes": {
          "description": "penalty minutes; null when the source gives the infraction only",
          "type": "integer"
        },
        "period": {
          "description": "as on /plays",
          "type": "integer"
        },
        "period_label": {
          "description": "P1-P3, OT1..., SO",
          "type": "string"
        },
        "players": {
          "description": "Players: the penalized player, then the player fouled where named;\nempty when not found in the box score.",
          "items": {
            "$ref": "#/$defs/dto.BoxPlayerRef"
          },
          "type": "array"
        },
        "team": {
          "description": "the penalized side",
          "enum": [
            "home",
            "away"
          ],
          "type": "string"
        },
        "text": {
          "type": "string"
        }
      },
      "type": "object"
    },
    "dto.HockeyBoxSkater": {
      "properties": {
        "id": {
          "description": "ID: our player id (code: our public player code; keys created from\n2026-10-14 get the code only). Left out when the line is not linked to\none of our players: the line then has a name only.",
          "type": "integer"
        },
        "name": {
          "type": "string"
        },
        "number": {
          "description": "shirt number; null when the source sends none",
          "type": "string"
        },
        "position": {
          "description": "as the source abbreviates it; null when not sent",
          "type": "string"
        },
        "side": {
          "enum": [
            "home",
            "away"
          ],
          "type": "string"
        },
        "stats": {
          "$ref": "#/$defs/dto.HockeySkaterStats"
        }
      },
      "type": "object"
    },
    "dto.HockeyBoxTeam": {
      "properties": {
        "id": {
          "description": "ID: our team id (code: our public team code; keys created from 2026-10-14 get the code only).",
          "type": "integer"
        },
        "name": {
          "type": "string"
        },
        "score": {
          "description": "final or current score; null when not known",
          "type": "integer"
        },
        "side": {
          "enum": [
            "home",
            "away"
          ],
          "type": "string"
        },
        "totals": {
          "allOf": [
            {
              "$ref": "#/$defs/dto.HockeyTeamStats"
            }
          ],
          "description": "the source's team line where it sends one, else the sum of the players' lines"
        }
      },
      "type": "object"
    },
    "dto.HockeyGoalieStats": {
      "properties": {
        "goals_against": {
          "type": "integer"
        },
        "penalty_minutes": {
          "type": "integer"
        },
        "saves": {
          "type": "integer"
        },
        "saves_pct": {
          "description": "saves / shots_against x 100, one decimal; null without shots",
          "type": "number"
        },
        "shots_against": {
          "description": "shots on goal faced (saves + goals_against where the source's is not a number)",
          "type": "integer"
        },
        "time_on_ice": {
          "description": "seconds in goal",
          "type": "integer"
        }
      },
      "type": "object"
    },
    "dto.HockeySkaterStats": {
      "properties": {
        "assists": {
          "type": "integer"
        },
        "blocked_shots": {
          "description": "opponents' shots blocked",
          "type": "integer"
        },
        "even_strength_time_on_ice": {
          "description": "seconds on ice at even strength (few sources)",
          "type": "integer"
        },
        "faceoffs_lost": {
          "description": "faceoffs lost",
          "type": "integer"
        },
        "faceoffs_pct": {
          "description": "faceoffs_won / (won + lost) x 100, one decimal; null without faceoffs",
          "type": "number"
        },
        "faceoffs_won": {
          "description": "faceoffs won",
          "type": "integer"
        },
        "giveaways": {
          "description": "pucks lost to the opponent (few sources)",
          "type": "integer"
        },
        "goals": {
          "type": "integer"
        },
        "hits": {
          "description": "body checks given",
          "type": "integer"
        },
        "missed_shots": {
          "description": "shots wide or over (few sources)",
          "type": "integer"
        },
        "penalties": {
          "description": "penalties taken (few sources)",
          "type": "integer"
        },
        "penalty_minutes": {
          "description": "penalty minutes",
          "type": "integer"
        },
        "plus_minus": {
          "description": "even-strength and short-handed goals for minus against while on ice",
          "type": "integer"
        },
        "points": {
          "description": "goals + assists (computed when the source sends none)",
          "type": "integer"
        },
        "power_play_assists": {
          "description": "assists on the power play (few sources)",
          "type": "integer"
        },
        "power_play_goals": {
          "description": "goals on the power play",
          "type": "integer"
        },
        "power_play_time_on_ice": {
          "description": "seconds on ice on the power play (few sources)",
          "type": "integer"
        },
        "shifts": {
          "description": "shifts on ice",
          "type": "integer"
        },
        "short_handed_assists": {
          "description": "assists short-handed (few sources)",
          "type": "integer"
        },
        "short_handed_goals": {
          "description": "goals short-handed",
          "type": "integer"
        },
        "short_handed_time_on_ice": {
          "description": "seconds on ice short-handed (few sources)",
          "type": "integer"
        },
        "shots_on_goal": {
          "description": "shots on goal",
          "type": "integer"
        },
        "takeaways": {
          "description": "pucks won from the opponent (few sources)",
          "type": "integer"
        },
        "time_on_ice": {
          "description": "seconds on ice (20:26 is 1226)",
          "type": "integer"
        }
      },
      "type": "object"
    },
    "dto.HockeyTeamStats": {
      "properties": {
        "blocked_shots": {
          "type": "integer"
        },
        "empty_net_goals": {
          "description": "few sources",
          "type": "integer"
        },
        "faceoffs_lost": {
          "description": "the opponent's faceoffs won where it is known",
          "type": "integer"
        },
        "faceoffs_pct": {
          "type": "number"
        },
        "faceoffs_won": {
          "type": "integer"
        },
        "giveaways": {
          "type": "integer"
        },
        "goals": {
          "description": "the match score",
          "type": "integer"
        },
        "hits": {
          "type": "integer"
        },
        "penalties": {
          "type": "integer"
        },
        "penalty_minutes": {
          "type": "integer"
        },
        "power_play_goals": {
          "type": "integer"
        },
        "power_play_opportunities": {
          "description": "power plays had (few sources)",
          "type": "integer"
        },
        "saves": {
          "type": "integer"
        },
        "short_handed_goals": {
          "type": "integer"
        },
        "shots_on_goal": {
          "type": "integer"
        },
        "takeaways": {
          "type": "integer"
        }
      },
      "type": "object"
    },
    "dto.Period": {
      "properties": {
        "away": {
          "type": "integer"
        },
        "cumulative": {
          "description": "Cumulative: soccer FT and ET only: the score after 90 or 120 minutes\n(all goals so far), not the goals scored in that period.",
          "type": "boolean"
        },
        "home": {
          "description": "Home, Away: null when that side is not stored.",
          "type": "integer"
        },
        "label": {
          "type": "string"
        },
        "period": {
          "description": "Period: OT (basketball, hockey, american football) is every overtime\ntogether, so the periods add up to the final after 2OT+.",
          "type": "string"
        }
      },
      "type": "object"
    }
  }
}