Documentation Index
Fetch the complete documentation index at: https://mintlify.com/bWanShiTong/reverse-engineering-whoop-post/llms.txt
Use this file to discover all available pages before exploring further.
Overview
The Health Monitor feature provides real-time streaming of heart rate, RR intervals, and other physiological data from the Whoop 4.0. This is the same data stream shown in the “Health Monitor” section of the Whoop app.Health Monitor Commands
Health Monitor is toggled using commands toCMD_TO_STRAP:
Packet Structure
| Offset | Size | Field | Description |
|---|---|---|---|
| 0x00 | 5 bytes | Header | Always aa0800a823 |
| 0x05 | 1 byte | Packet Count | Increments with each packet |
| 0x06 | 1 byte | Category | 0x03 for health monitor |
| 0x07 | 1 byte | State | 0x00 = Off, 0x01 = On |
| 0x08 | 4 bytes | Checksum | CRC-32 with custom parameters |
Enabling Health Monitor
Using gatttool
Using Python
Listen for health monitor data onDATA_FROM_STRAP:
Health Monitor Data Format
When Health Monitor is active, the device sends 24-byte packets onDATA_FROM_STRAP every second:
Packet Structure
| Offset | Size | Field | Description |
|---|---|---|---|
| 0x00 | 5 bytes | Header | Always aa1800ff2802 |
| 0x05 | 4 bytes | Unix Time | Little-endian timestamp |
| 0x09 | 2 bytes | Unknown | Purpose unclear |
| 0x0B | 1 byte | Heart Rate | BPM value |
| 0x0C | 1 byte | RR Count | Number of RR intervals |
| 0x0D | 8 bytes | RR Data | RR interval values |
| 0x15 | 3 bytes | Unknown | Purpose unclear |
| 0x18 | 4 bytes | Checksum | CRC-32 |
Example: Parsing Heart Rate
From the first packet:- Heart Rate (byte 0x0B):
0x42= 66 BPM - RR Count (byte 0x0C):
0x01= 1 RR interval - RR Data (bytes 0x0D-0x14):
67060000000000000101
Heart Rate Progression
Looking at the sequence:| Time | HR Byte | Heart Rate (BPM) |
|---|---|---|
| ad896566 | 42 | 66 |
| ae896566 | 43 | 67 |
| af896566 | 42 | 66 |
| b0896566 | 42 | 66 |
| b1896566 | 42 | 66 |
| b2896566 | 42 | 66 |
| b3896566 | 43 | 67 |
| b4896566 | 43 | 67 |
| b5896566 | 43 | 67 |
| b6896566 | 43 | 67 |
| b7896566 | 43 | 67 |
| b8896566 | 43 | 67 |
| b9896566 | 43 | 67 |
| ba896566 | 44 | 68 |
| bb896566 | 44 | 68 |
| bc896566 | 44 | 68 |
| bd896566 | 44 | 68 |
Data vs. Activity Tracking
Health Monitor data uses the exact same packet format as Activity Tracking data. Both features stream to
DATA_FROM_STRAP with identical structure.- Activity Tracking: Category
0x03, various start/stop commands - Health Monitor: Category
0x03or0x74, on/off toggle
Characteristics Used
CMD_TO_STRAP (Control)
- UUID:
61080002-8d6d-82b8-614a-1c8cb0f8dcc6 - Handle:
0x0010 - Properties: Write only
- Purpose: Send on/off commands
DATA_FROM_STRAP (Health Data)
- UUID:
61080005-8d6d-82b8-614a-1c8cb0f8dcc6 - Handle:
0x0018 - Properties: Notify
- Purpose: Receive real-time health metrics
- Update Rate: ~1 second
Stopping Health Monitor
Send the off command to stop the data stream:DATA_FROM_STRAP will stop immediately.
RR Interval Data
The 8 bytes of RR data (bytes 0x0D-0x14) contain RR interval information:- RR Count indicates how many RR intervals are included
- When count is
0x00, RR data bytes are all zeros - When count is
0x01or higher, RR values are encoded in the data
Example RR Data
- Count
0x01has data in first bytes:6706 - Count
0x00has all zeros in RR section - Count
0x02has two values:b802andb902
Use Cases
- Real-time HR monitoring: Display live heart rate in custom apps
- HRV analysis: Extract RR intervals for heart rate variability calculations
- Biofeedback: Use live data for meditation, breathing exercises, or training
- Research: Collect raw physiological data for studies
- Third-party integrations: Stream Whoop data to other platforms