{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://artifacts.apis.io/sportstatsapi/json-schema/sportstatsapi-dto-horse-racing-race-response-schema.json",
  "title": "dto.HorseRacingRaceResponse",
  "x-generated": "2026-11-10",
  "x-method": "derived",
  "x-generator": "derive-json-schema.py",
  "x-source": "openapi/sportstatsapi-horse-racing-api-openapi.yml#/components/schemas/dto.HorseRacingRaceResponse",
  "properties": {
    "distance": {
      "type": "string"
    },
    "each_way": {
      "allOf": [
        {
          "$ref": "#/$defs/dto.HorseRacingEachWay"
        }
      ],
      "description": "EachWay is the most common each-way terms across bookmakers; individual\nbookmakers may offer different terms (see each quote's each_way)."
    },
    "id": {
      "type": "integer"
    },
    "meeting": {
      "$ref": "#/$defs/dto.HorseRacingMeetingInfo"
    },
    "purse": {
      "type": "string"
    },
    "race_class": {
      "type": "string"
    },
    "race_date": {
      "description": "RaceDate and StartTime are UTC.",
      "type": "string"
    },
    "race_name": {
      "type": "string"
    },
    "race_type": {
      "allOf": [
        {
          "$ref": "#/$defs/database.HorseRacingRaceType"
        }
      ],
      "description": "RaceType is what the race name says: flat or jumps, the conditions\n(handicap, maiden, claiming...), hurdle or chase, a pattern grade\nwhere named. Omitted when the name says nothing."
    },
    "results_final": {
      "description": "ResultsFinal is true once every declared runner is accounted for as a\nfinisher, a non-finisher or a non-runner.",
      "type": "boolean"
    },
    "runners": {
      "items": {
        "$ref": "#/$defs/dto.HorseRacingRunnerResponse"
      },
      "type": "array"
    },
    "runners_count": {
      "type": "integer"
    },
    "sport": {
      "type": "string"
    },
    "start_time": {
      "type": "string"
    },
    "start_utc": {
      "description": "StartUTC is the scheduled off-time in ISO 8601 UTC.",
      "type": "string"
    },
    "status": {
      "description": "Status: NS (not started), live (off within the last 30 minutes, no\nresults yet), result_pending (off more than 30 minutes ago, no results\nyet), FT (results published), unlisted (gone from the source's day\ncard after its off without a result: possibly called off, not\nconfirmed; it can still become FT).",
      "enum": [
        "NS",
        "live",
        "result_pending",
        "FT",
        "unlisted"
      ],
      "type": "string"
    },
    "surface": {
      "type": "string"
    },
    "updated_at": {
      "description": "UpdatedAt is when the race or any of its runners last changed (UTC, RFC 3339).",
      "type": "string"
    },
    "wagers": {
      "type": "object"
    }
  },
  "type": "object",
  "$defs": {
    "database.HorseRacingPedigree": {
      "properties": {
        "dam": {
          "type": "string"
        },
        "sire": {
          "type": "string"
        }
      },
      "type": "object"
    },
    "database.HorseRacingRaceType": {
      "properties": {
        "class": {
          "description": "Class: the class number in the name (South Africa: \"Class 4\").",
          "type": "integer"
        },
        "code": {
          "description": "Code: flat or jumps (\"\" when the name does not say; USA races are flat).",
          "enum": [
            "flat",
            "jumps"
          ],
          "type": "string"
        },
        "grade": {
          "description": "Grade: \"Group 1\"..\"Group 3\", \"Grade 1\"..\"Grade 3\" or \"Listed\", when\nthe name says it.",
          "type": "string"
        },
        "kind": {
          "description": "Kind: the race's conditions.",
          "enum": [
            "handicap",
            "maiden",
            "novice",
            "claiming",
            "maiden_claiming",
            "selling",
            "allowance",
            "optional_claiming",
            "starter",
            "maiden_special_weight",
            "stakes",
            "conditions",
            "classified",
            "rated",
            "trial",
            "flat_race"
          ],
          "type": "string"
        },
        "label": {
          "description": "Label: a short neutral description (\"Novices' handicap chase\").",
          "type": "string"
        },
        "novice": {
          "type": "boolean"
        },
        "obstacle": {
          "description": "Obstacle: hurdle, chase, nh_flat (bumper) or cross_country (jumps only).",
          "enum": [
            "hurdle",
            "chase",
            "nh_flat",
            "cross_country"
          ],
          "type": "string"
        },
        "rating_band": {
          "description": "RatingBand: a merit-rated handicap's top rating (\"MR 78\", \"Fm 78\").",
          "type": "integer"
        }
      },
      "type": "object"
    },
    "dto.HorseRacingEachWay": {
      "properties": {
        "fraction": {
          "type": "string"
        },
        "places": {
          "type": "integer"
        }
      },
      "type": "object"
    },
    "dto.HorseRacingJockeyInfo": {
      "properties": {
        "id": {
          "type": "integer"
        },
        "name": {
          "type": "string"
        }
      },
      "type": "object"
    },
    "dto.HorseRacingMeetingInfo": {
      "properties": {
        "date": {
          "description": "Date is the local card date (YYYY-MM-DD). It can precede the UTC\nrace_date when a card runs past midnight UTC.",
          "type": "string"
        },
        "going": {
          "type": "string"
        },
        "id": {
          "description": "ID is the data provider's racecourse id. It is reused every day the course\nraces, so a meeting is identified by (id, date).",
          "type": "integer"
        },
        "name": {
          "type": "string"
        },
        "region": {
          "type": "string"
        }
      },
      "type": "object"
    },
    "dto.HorseRacingMorningLine": {
      "properties": {
        "decimal": {
          "type": "number"
        },
        "fractional": {
          "type": "string"
        }
      },
      "type": "object"
    },
    "dto.HorseRacingPayouts": {
      "properties": {
        "place": {
          "type": "string"
        },
        "show": {
          "type": "string"
        },
        "win": {
          "type": "string"
        }
      },
      "type": "object"
    },
    "dto.HorseRacingQuote": {
      "properties": {
        "bookmaker_id": {
          "description": "BookmakerID is our stable registry id (see GET /horse-racing/bookmakers).",
          "type": "integer"
        },
        "decimal": {
          "description": "Decimal odds; null unless price_type is \"fixed\".",
          "type": "number"
        },
        "each_way": {
          "$ref": "#/$defs/dto.HorseRacingEachWay"
        },
        "fractional": {
          "description": "Fractional odds as displayed by UK bookmakers; null when unknown.",
          "type": "string"
        },
        "name": {
          "type": "string"
        },
        "price_type": {
          "description": "PriceType is \"fixed\" (a price), \"sp\" (starting price only) or \"none\"\n(not priced yet).",
          "enum": [
            "fixed",
            "sp",
            "none"
          ],
          "type": "string"
        },
        "slug": {
          "type": "string"
        }
      },
      "type": "object"
    },
    "dto.HorseRacingRecord": {
      "properties": {
        "name": {
          "description": "Name is the jockey or trainer the record is with (connections only).",
          "type": "string"
        },
        "places": {
          "type": "integer"
        },
        "runs": {
          "type": "integer"
        },
        "wins": {
          "type": "integer"
        }
      },
      "type": "object"
    },
    "dto.HorseRacingRunnerOdds": {
      "properties": {
        "best": {
          "allOf": [
            {
              "$ref": "#/$defs/dto.HorseRacingQuote"
            }
          ],
          "description": "Best is the highest fixed decimal price among Bookmakers; null when none is fixed."
        },
        "bookmakers": {
          "items": {
            "$ref": "#/$defs/dto.HorseRacingQuote"
          },
          "type": "array"
        },
        "updated_at": {
          "description": "UpdatedAt is when our sync first saw these prices (UTC, RFC 3339).\nThe data provider publishes no price timestamp.",
          "type": "string"
        }
      },
      "type": "object"
    },
    "dto.HorseRacingRunnerRecords": {
      "properties": {
        "badges": {
          "description": "Badges: C won at this course, D won at this distance, CD won at this\ncourse and distance (the race-card letters).",
          "items": {
            "type": "string"
          },
          "type": "array"
        },
        "course": {
          "$ref": "#/$defs/dto.HorseRacingRecord"
        },
        "course_distance": {
          "$ref": "#/$defs/dto.HorseRacingRecord"
        },
        "distance": {
          "$ref": "#/$defs/dto.HorseRacingRecord"
        },
        "going": {
          "allOf": [
            {
              "$ref": "#/$defs/dto.HorseRacingRecord"
            }
          ],
          "description": "Going is the record on similar going."
        },
        "jockey": {
          "allOf": [
            {
              "$ref": "#/$defs/dto.HorseRacingRecord"
            }
          ],
          "description": "Jockey and Trainer are the horse's record with them."
        },
        "surface": {
          "$ref": "#/$defs/dto.HorseRacingRecord"
        },
        "trainer": {
          "$ref": "#/$defs/dto.HorseRacingRecord"
        }
      },
      "type": "object"
    },
    "dto.HorseRacingRunnerResponse": {
      "properties": {
        "age": {
          "type": "string"
        },
        "distance": {
          "type": "string"
        },
        "gender": {
          "type": "string"
        },
        "horse_name": {
          "type": "string"
        },
        "id": {
          "description": "ID is the data provider's horse id.",
          "type": "integer"
        },
        "jockey": {
          "$ref": "#/$defs/dto.HorseRacingJockeyInfo"
        },
        "morning_line": {
          "$ref": "#/$defs/dto.HorseRacingMorningLine"
        },
        "number": {
          "description": "Number is the saddle-cloth number; outcome codes never appear here.",
          "type": "string"
        },
        "odds": {
          "$ref": "#/$defs/dto.HorseRacingRunnerOdds"
        },
        "pedigree": {
          "allOf": [
            {
              "$ref": "#/$defs/database.HorseRacingPedigree"
            }
          ],
          "description": "Pedigree is the horse's sire and dam where the source names them\n(Hong Kong: every runner of the race card, the winner of a result)."
        },
        "race_id": {
          "type": "integer"
        },
        "rating": {
          "type": "string"
        },
        "recent_form": {
          "type": "object"
        },
        "records": {
          "allOf": [
            {
              "$ref": "#/$defs/dto.HorseRacingRunnerRecords"
            }
          ],
          "description": "Records are the horse's course, distance, going and jockey/trainer\nrecords read from recent_form (UK and Irish cards), with C/D/CD badges."
        },
        "result": {
          "$ref": "#/$defs/dto.HorseRacingRunnerResult"
        },
        "stall": {
          "type": "string"
        },
        "status": {
          "description": "Status is \"runner\", \"non_runner\" (withdrawn) or \"did_not_finish\".",
          "enum": [
            "runner",
            "non_runner",
            "did_not_finish"
          ],
          "type": "string"
        },
        "trainer": {
          "$ref": "#/$defs/dto.HorseRacingTrainerInfo"
        },
        "updated_at": {
          "description": "UpdatedAt is when anything about this runner last changed (UTC, RFC 3339).",
          "type": "string"
        },
        "weight": {
          "type": "string"
        },
        "weight_lbs": {
          "type": "string"
        }
      },
      "type": "object"
    },
    "dto.HorseRacingRunnerResult": {
      "properties": {
        "dead_heat": {
          "description": "DeadHeat is true when the runner shares its position with another.",
          "type": "boolean"
        },
        "distance": {
          "type": "string"
        },
        "finish_code": {
          "description": "FinishCode is set when the runner did not finish: PU (pulled up),\nF (fell), U/UR (unseated), B/BD (brought down), RR/RO (refused/ran out),\nS (slipped), and other upstream codes.",
          "type": "string"
        },
        "payouts": {
          "allOf": [
            {
              "$ref": "#/$defs/dto.HorseRacingPayouts"
            }
          ],
          "description": "Payouts are the USA pari-mutuel payouts per $2 stake, only for the\npools the runner paid in (win: 1st, place: 1st-2nd, show: 1st-3rd)."
        },
        "position": {
          "description": "Position is null when the runner did not finish.",
          "type": "integer"
        },
        "sp": {
          "type": "string"
        },
        "sp_decimal": {
          "type": "number"
        },
        "time": {
          "type": "string"
        }
      },
      "type": "object"
    },
    "dto.HorseRacingTrainerInfo": {
      "properties": {
        "id": {
          "type": "integer"
        },
        "name": {
          "type": "string"
        }
      },
      "type": "object"
    }
  }
}