{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "version": {
      "type": "string",
      "pattern": "^\\d+\\.\\d+$"
    },
    "type": {
      "type": "string",
      "enum": [
        "structured_workout",
        "recorded_activity",
        "course",
        "sleep_record",
        "weight_measurement",
        "hrv_summary",
        "daily_wellness",
        "body_composition",
        "stress_episode"
      ]
    },
    "metadata": {
      "type": "object",
      "properties": {
        "created": {
          "type": "string",
          "format": "date-time",
          "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
        },
        "manufacturer": {
          "type": "string"
        },
        "product": {
          "type": "string"
        },
        "serialNumber": {
          "type": "string"
        },
        "sport": {
          "type": "string"
        },
        "subSport": {
          "type": "string"
        }
      },
      "required": [
        "created"
      ],
      "additionalProperties": false
    },
    "sessions": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "startTime": {
            "type": "string",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
          },
          "totalElapsedTime": {
            "type": "number",
            "minimum": 0
          },
          "totalTimerTime": {
            "type": "number",
            "minimum": 0
          },
          "totalDistance": {
            "type": "number",
            "minimum": 0
          },
          "sport": {
            "type": "string"
          },
          "subSport": {
            "type": "string"
          },
          "avgHeartRate": {
            "type": "integer",
            "minimum": 0,
            "maximum": 300
          },
          "maxHeartRate": {
            "type": "integer",
            "minimum": 0,
            "maximum": 300
          },
          "avgCadence": {
            "type": "number",
            "minimum": 0
          },
          "maxCadence": {
            "type": "number",
            "minimum": 0
          },
          "avgPower": {
            "type": "number",
            "minimum": 0
          },
          "maxPower": {
            "type": "number",
            "minimum": 0
          },
          "normalizedPower": {
            "type": "number",
            "minimum": 0
          },
          "trainingStressScore": {
            "type": "number",
            "minimum": 0
          },
          "intensityFactor": {
            "type": "number",
            "minimum": 0
          },
          "totalCalories": {
            "type": "integer",
            "minimum": 0,
            "maximum": 9007199254740991
          },
          "totalAscent": {
            "type": "number",
            "minimum": 0
          },
          "totalDescent": {
            "type": "number",
            "minimum": 0
          },
          "avgSpeed": {
            "type": "number",
            "minimum": 0
          },
          "maxSpeed": {
            "type": "number",
            "minimum": 0
          }
        },
        "required": [
          "startTime",
          "totalElapsedTime",
          "sport"
        ],
        "additionalProperties": false
      }
    },
    "laps": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "startTime": {
            "type": "string",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
          },
          "totalElapsedTime": {
            "type": "number",
            "minimum": 0
          },
          "totalTimerTime": {
            "type": "number",
            "minimum": 0
          },
          "totalDistance": {
            "type": "number",
            "minimum": 0
          },
          "avgHeartRate": {
            "type": "integer",
            "minimum": 0,
            "maximum": 300
          },
          "maxHeartRate": {
            "type": "integer",
            "minimum": 0,
            "maximum": 300
          },
          "avgCadence": {
            "type": "number",
            "minimum": 0
          },
          "maxCadence": {
            "type": "number",
            "minimum": 0
          },
          "avgPower": {
            "type": "number",
            "minimum": 0
          },
          "maxPower": {
            "type": "number",
            "minimum": 0
          },
          "normalizedPower": {
            "type": "number",
            "minimum": 0
          },
          "avgSpeed": {
            "type": "number",
            "minimum": 0
          },
          "maxSpeed": {
            "type": "number",
            "minimum": 0
          },
          "totalAscent": {
            "type": "number",
            "minimum": 0
          },
          "totalDescent": {
            "type": "number",
            "minimum": 0
          },
          "totalCalories": {
            "type": "integer",
            "minimum": 0,
            "maximum": 9007199254740991
          },
          "trigger": {
            "type": "string",
            "enum": [
              "manual",
              "time",
              "distance",
              "position",
              "session_end",
              "fitness_equipment"
            ]
          },
          "sport": {
            "type": "string",
            "enum": [
              "generic",
              "running",
              "cycling",
              "transition",
              "fitness_equipment",
              "swimming",
              "basketball",
              "soccer",
              "tennis",
              "american_football",
              "training",
              "walking",
              "cross_country_skiing",
              "alpine_skiing",
              "snowboarding",
              "rowing",
              "mountaineering",
              "hiking",
              "multisport",
              "paddling",
              "flying",
              "e_biking",
              "motorcycling",
              "boating",
              "driving",
              "golf",
              "hang_gliding",
              "horseback_riding",
              "hunting",
              "fishing",
              "inline_skating",
              "rock_climbing",
              "sailing",
              "ice_skating",
              "sky_diving",
              "snowshoeing",
              "snowmobiling",
              "stand_up_paddleboarding",
              "surfing",
              "wakeboarding",
              "water_skiing",
              "kayaking",
              "rafting",
              "windsurfing",
              "kitesurfing",
              "tactical",
              "jumpmaster",
              "boxing",
              "floor_climbing",
              "baseball",
              "diving",
              "shooting",
              "winter_sport",
              "grinding",
              "hiit",
              "video_gaming",
              "racket",
              "wheelchair_push_walk",
              "wheelchair_push_run",
              "meditation",
              "para_sport",
              "disc_golf",
              "team_sport",
              "cricket",
              "rugby",
              "hockey",
              "lacrosse",
              "volleyball",
              "water_tubing",
              "wakesurfing",
              "water_sport",
              "archery",
              "mixed_martial_arts",
              "motor_sports",
              "snorkeling",
              "dance",
              "jump_rope",
              "pool_apnea",
              "mobility",
              "geocaching",
              "canoeing"
            ]
          },
          "subSport": {
            "type": "string",
            "enum": [
              "generic",
              "treadmill",
              "street",
              "trail",
              "track",
              "spin",
              "indoor_cycling",
              "road",
              "mountain",
              "downhill",
              "recumbent",
              "cyclocross",
              "hand_cycling",
              "track_cycling",
              "indoor_rowing",
              "elliptical",
              "stair_climbing",
              "lap_swimming",
              "open_water",
              "flexibility_training",
              "strength_training",
              "warm_up",
              "match",
              "exercise",
              "challenge",
              "indoor_skiing",
              "cardio_training",
              "indoor_walking",
              "e_bike_fitness",
              "bmx",
              "casual_walking",
              "speed_walking",
              "bike_to_run_transition",
              "run_to_bike_transition",
              "swim_to_bike_transition",
              "atv",
              "motocross",
              "backcountry",
              "resort",
              "rc_drone",
              "wingsuit",
              "whitewater",
              "skate_skiing",
              "yoga",
              "pilates",
              "indoor_running",
              "gravel_cycling",
              "e_bike_mountain",
              "commuting",
              "mixed_surface",
              "navigate",
              "track_me",
              "map",
              "single_gas_diving",
              "multi_gas_diving",
              "gauge_diving",
              "apnea_diving",
              "apnea_hunting",
              "virtual_activity",
              "obstacle",
              "all"
            ]
          },
          "workoutStepIndex": {
            "type": "integer",
            "minimum": 0,
            "maximum": 9007199254740991
          },
          "numLengths": {
            "type": "integer",
            "minimum": 0,
            "maximum": 9007199254740991
          },
          "swimStroke": {
            "type": "string",
            "enum": [
              "freestyle",
              "backstroke",
              "breaststroke",
              "butterfly",
              "drill",
              "mixed",
              "im"
            ]
          }
        },
        "required": [
          "startTime",
          "totalElapsedTime"
        ],
        "additionalProperties": false
      }
    },
    "records": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "timestamp": {
            "type": "string",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
          },
          "position": {
            "type": "object",
            "properties": {
              "lat": {
                "type": "number",
                "minimum": -90,
                "maximum": 90
              },
              "lon": {
                "type": "number",
                "minimum": -180,
                "maximum": 180
              }
            },
            "required": [
              "lat",
              "lon"
            ],
            "additionalProperties": false
          },
          "altitude": {
            "type": "number"
          },
          "heartRate": {
            "type": "integer",
            "minimum": 0,
            "maximum": 300
          },
          "cadence": {
            "type": "number",
            "minimum": 0
          },
          "power": {
            "type": "number",
            "minimum": 0
          },
          "speed": {
            "type": "number",
            "minimum": 0
          },
          "distance": {
            "type": "number",
            "minimum": 0
          },
          "temperature": {
            "type": "number"
          },
          "verticalOscillation": {
            "type": "number",
            "minimum": 0
          },
          "stanceTime": {
            "type": "number",
            "minimum": 0
          },
          "stepLength": {
            "type": "number",
            "minimum": 0
          }
        },
        "required": [
          "timestamp"
        ],
        "additionalProperties": false
      }
    },
    "events": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "timestamp": {
            "type": "string",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
          },
          "eventType": {
            "type": "string",
            "enum": [
              "event_start",
              "event_stop",
              "event_pause",
              "event_resume",
              "event_lap",
              "event_marker",
              "event_timer",
              "event_workout_step_change",
              "event_session_start",
              "event_activity_start"
            ]
          },
          "eventGroup": {
            "type": "integer",
            "minimum": -9007199254740991,
            "maximum": 9007199254740991
          },
          "data": {
            "type": "integer",
            "minimum": -9007199254740991,
            "maximum": 9007199254740991
          },
          "message": {
            "type": "string",
            "maxLength": 256
          }
        },
        "required": [
          "timestamp",
          "eventType"
        ],
        "additionalProperties": false
      }
    },
    "extensions": {
      "type": "object",
      "properties": {
        "structured_workout": {
          "$ref": "workout.json"
        },
        "fit": {
          "type": "object",
          "additionalProperties": true
        }
      },
      "additionalProperties": true
    }
  },
  "required": [
    "version",
    "type",
    "metadata"
  ],
  "additionalProperties": false,
  "$id": "https://kaiord.dev/schema/krd.json",
  "title": "KRD Schema",
  "description": "Kaiord Representation Definition (KRD) for workout and activity data"
}