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. |
JSON Schema
{
"$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)."}
}
}
}
}