Overview
The Whoop 4.0 can be manually triggered to start and stop activity recording. When an activity is started, the device begins streaming real-time data including heart rate, RR intervals, and other metrics via the DATA_FROM_STRAP characteristic.
Activity Commands
Activity control uses the same packet format as other device commands:
aa0800a823 8c 03 01 7d5ec627 # Start activity
aa0800a823 8d 03 00 dc040351 # Stop activity
aa0800a823 90 03 01 6904fa32 # Start (alternate)
aa0800a823 91 03 00 c85e3f44 # Stop (alternate)
aa0800a823 8f 03 00 b2d08752 # Sleep start
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 activity/recording control |
| 0x07 | 1 byte | State | 0x00 = Stop, 0x01 = Start |
| 0x08 | 4 bytes | Checksum | CRC-32 with custom parameters |
Starting an Activity
# Start activity
sudo gatttool -i hci0 -t random -b XX:XX:XX:XX:XX:XX \
--char-write -a 0x0010 -n aa0800a8238c03017d5ec627
# Stop activity
sudo gatttool -i hci0 -t random -b XX:XX:XX:XX:XX:XX \
--char-write -a 0x0010 -n aa0800a8238d0300dc040351
Using Python
Enable notifications on DATA_FROM_STRAP to receive real-time activity data:
# Listen for activity data
python3 enable_notifications.py --address XX:XX:XX:XX:XX:XX \
61080005-8d6d-82b8-614a-1c8cb0f8dcc6
Then send the start command. You’ll receive notifications every second while the activity is running.
When an activity is running, the device sends 24-byte packets on DATA_FROM_STRAP every second:
Header Unix S HR RR RR data Checksum
aa1800ff2802 ad896566 f065 42 01 67060000000000000101 3ba00d4d
aa1800ff2802 ae896566 f860 43 00 00000000000000000101 5025f793
aa1800ff2802 af896566 085c 42 00 00000000000000000101 add7df13
aa1800ff2802 b0896566 1057 42 00 00000000000000000101 24b22179
aa1800ff2802 b1896566 1852 42 00 00000000000000000101 e0a905b8
aa1800ff2802 b2896566 284d 42 00 00000000000000000101 d943226a
aa1800ff2802 b3896566 3848 43 00 00000000000000000101 28364865
aa1800ff2802 b4896566 4043 43 00 00000000000000000101 9c2e99ba
Packet Breakdown
| Offset | Size | Field | Description |
|---|
| 0x00 | 5 bytes | Header | 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 |
Real-Time Data Example
Parsing the first packet:
aa1800ff2802 ad896566 f065 42 01 67060000000000000101 3ba00d4d
- Header:
aa1800ff2802
- Unix Time:
6665896ad (little-endian) = specific timestamp
- Heart Rate:
42 = 66 BPM
- RR Count:
01 = 1 interval in this packet
- RR Data:
6706 = RR interval value
- Checksum:
3ba00d4d
Command Categories
The category byte (0x03) is used for multiple recording-related functions:
| Command | Category | Value | Description |
|---|
| Start Activity | 0x03 | 0x01 | Begin activity recording |
| Stop Activity | 0x03 | 0x00 | End activity recording |
| Sleep Start | 0x03 | 0x00 | Special sleep tracking mode |
Characteristics Used
CMD_TO_STRAP (Control)
- UUID:
61080002-8d6d-82b8-614a-1c8cb0f8dcc6
- Handle:
0x0010
- Properties: Write only
- Purpose: Send start/stop commands
DATA_FROM_STRAP (Real-time Data)
- UUID:
61080005-8d6d-82b8-614a-1c8cb0f8dcc6
- Handle:
0x0018
- Properties: Notify
- Purpose: Receive real-time activity data
- Update Rate: ~1 second during activity
Other commands that trigger similar data streams:
aa0800a823 05 03 00 e44e25be # Health Monitor off
aa0800a823 06 03 01 2bc064cb # Health Monitor on
These commands also use category 0x03 and trigger data notifications on DATA_FROM_STRAP.
Stopping Data Stream
Send the stop command to end the activity and stop notifications:
sudo gatttool -i hci0 -t random -b XX:XX:XX:XX:XX:XX \
--char-write -a 0x0010 -n aa0800a8238d0300dc040351
The DATA_FROM_STRAP notifications will cease immediately.
Use Cases
- Manual activity logging: Start tracking when automatic detection fails
- Custom workout apps: Build your own activity tracking interface
- Real-time monitoring: Stream live heart rate and RR data during workouts
- Data collection: Gather raw sensor data for analysis
Notes
The packet count field is not validated. You can reuse the same count value across multiple commands.
The exact format and interpretation of the RR interval data bytes is not fully documented. The values may require additional processing to convert to standard RR intervals in milliseconds.