Skip to main content

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

OffsetSizeFieldDescription
0x005 bytesHeaderAlways aa0800a823
0x051 bytePacket CountIncrements with each packet
0x061 byteCategory0x03 for activity/recording control
0x071 byteState0x00 = Stop, 0x01 = Start
0x084 bytesChecksumCRC-32 with custom parameters

Starting an Activity

Using gatttool

# 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.

Activity Data Format

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

OffsetSizeFieldDescription
0x005 bytesHeaderaa1800ff2802
0x054 bytesUnix TimeLittle-endian timestamp
0x092 bytesUnknownPurpose unclear
0x0B1 byteHeart RateBPM value
0x0C1 byteRR CountNumber of RR intervals
0x0D8 bytesRR DataRR interval values
0x153 bytesUnknownPurpose unclear
0x184 bytesChecksumCRC-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:
CommandCategoryValueDescription
Start Activity0x030x01Begin activity recording
Stop Activity0x030x00End activity recording
Sleep Start0x030x00Special 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.

Build docs developers (and LLMs) love