WHOOP · Schema

WHOOP Cycle

Schema for a WHOOP physiological cycle, the foundational time-window WHOOP uses to compute daily Strain. A Cycle typically lasts ~24 hours from sleep-onset and contains a Strain score, average and max heart rate, and total energy expenditure in kilojoules.

FitnessWearablesHealthRecoverySleepStrainHeart RateWorkoutBiometrics

Properties

Name Type Description
id integer Unique identifier for the physiological cycle.
user_id integer The WHOOP user the cycle belongs to.
created_at string Time the cycle was recorded in WHOOP.
updated_at string Last time the cycle record was updated.
start string ISO-8601 start of the cycle.
end string ISO-8601 end of the cycle. Absent for the in-progress cycle.
timezone_offset string Member-local timezone offset (e.g. -05:00).
score_state string Whether scoring has completed for the cycle.
score object Cycle score. Present only when score_state = SCORED.
View JSON Schema on GitHub

JSON Schema

whoop-cycle-schema.json Raw ↑
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://api-evangelist.com/schemas/whoop-co/whoop-cycle-schema.json",
  "title": "WHOOP Cycle",
  "description": "Schema for a WHOOP physiological cycle, the foundational time-window WHOOP uses to compute daily Strain. A Cycle typically lasts ~24 hours from sleep-onset and contains a Strain score, average and max heart rate, and total energy expenditure in kilojoules.",
  "type": "object",
  "required": ["id", "user_id", "created_at", "updated_at", "start", "timezone_offset", "score_state"],
  "properties": {
    "id": {"type": "integer", "format": "int64", "description": "Unique identifier for the physiological cycle.", "example": 93845},
    "user_id": {"type": "integer", "format": "int64", "description": "The WHOOP user the cycle belongs to.", "example": 10129},
    "created_at": {"type": "string", "format": "date-time", "description": "Time the cycle was recorded in WHOOP."},
    "updated_at": {"type": "string", "format": "date-time", "description": "Last time the cycle record was updated."},
    "start": {"type": "string", "format": "date-time", "description": "ISO-8601 start of the cycle."},
    "end": {"type": "string", "format": "date-time", "description": "ISO-8601 end of the cycle. Absent for the in-progress cycle."},
    "timezone_offset": {"type": "string", "description": "Member-local timezone offset (e.g. -05:00).", "example": "-05:00"},
    "score_state": {"type": "string", "enum": ["SCORED", "PENDING_SCORE", "UNSCORABLE"], "description": "Whether scoring has completed for the cycle."},
    "score": {
      "type": "object",
      "description": "Cycle score. Present only when score_state = SCORED.",
      "required": ["strain", "average_heart_rate", "max_heart_rate", "kilojoule"],
      "properties": {
        "strain": {"type": "number", "format": "float", "minimum": 0, "maximum": 21, "description": "Cardiovascular load 0-21."},
        "kilojoule": {"type": "number", "format": "float", "description": "Total energy expended over the cycle in kJ."},
        "average_heart_rate": {"type": "integer", "description": "Average heart rate during the cycle (bpm)."},
        "max_heart_rate": {"type": "integer", "description": "Maximum heart rate during the cycle (bpm)."}
      }
    }
  }
}