Scanning with BLE Scanner
The easiest way to discover services is using a BLE scanner app on your Android phone.Open BLE Scanner
Launch the BLE Scanner app on your Android device.
Scan for Devices
Start scanning and look for your Whoop device. It should appear with a recognizable name.
Discovered Services
Heart Rate Service
The Whoop exposes the standard BLE Heart Rate Service, which means you can read heart rate data without any reverse engineering:- Service UUID:
00002a37-0000-1000-8000-00805f9b34fb - Properties: Readable, Notifiable
This is a standard Bluetooth SIG service, so any BLE heart rate monitor app can read from it.
Custom Service
Most communication happens through a custom service with UUID pattern6108xxxx-8d6d-82b8-614a-1c8cb0f8dcc6.
This service contains five characteristics:
| UUID | Name | Writable | Readable | Notifiable | Handle |
|---|---|---|---|---|---|
0x61080002 | CMD_TO_STRAP | ✓ | - | - | 0x0010 |
0x61080003 | CMD_FROM_STRAP | - | - | ✓ | 0x0012 |
0x61080004 | EVENTS_FROM_STRAP | - | - | ✓ | 0x0015 |
0x61080005 | DATA_FROM_STRAP | - | - | ✓ | 0x0018 |
0x61080007 | MEMFAULT | - | - | ✓ | 0x001b |
Characteristic names were obtained by decompiling the Whoop Android APK.
Characteristic Roles
CMD_TO_STRAP (0x61080002)
This is the only writable characteristic and is used to send commands to the device:- Setting alarms
- Starting/stopping activities
- Enabling heart rate broadcast
- Triggering data sync
- Device management (reboot, erase)
CMD_FROM_STRAP (0x61080003)
Receives command responses and acknowledgments from the device. This characteristic notifies when:- Commands are processed
- Device sends status updates
- Certain operations complete
DATA_FROM_STRAP (0x61080005)
The main data stream for:- Real-time heart rate and respiratory rate during activities
- Historical data during sync operations
- Health monitoring data
When you start an activity or open “Health Monitor” in the app, notifications on this characteristic arrive every second.
EVENTS_FROM_STRAP (0x61080004)
Receives event notifications from the device. The exact purpose of these packets is still being researched, but they contain:- Unix timestamps
- Event codes
- Various status flags
MEMFAULT (0x61080007)
Likely used for crash reporting and diagnostics via the Memfault service.Scanning with Python
You can also discover devices programmatically using Python:Replace
hci0 with your Bluetooth adapter name. Use hciconfig to list available adapters.Discovering Characteristics
Once connected, you can enumerate characteristics:Capturing Communication
Now that you know the services and characteristics, you can capture actual communication between the app and device.Method 1: ADB Bugreport
Extract HCI logs from your Android phone:Method 2: Live Wireshark Capture
For real-time packet analysis:Filtering for Commands
To see only commands sent to the device, use this Wireshark filter:CMD_TO_STRAP characteristic (handle 0x0010).
Handles are in hexadecimal. Convert the handle from your BLE scanner (e.g.,
0x0010) to use in filters.Example: Opening the App
When you open the Whoop app, you’ll see in Wireshark:-
Write to CMD_TO_STRAP (handle
0x0010): -
Notification on CMD_FROM_STRAP (handle
0x0012): Response confirming command received -
Multiple notifications on DATA_FROM_STRAP (handle
0x0018): Device sends current status and recent data
All commands follow a specific packet structure with headers, command codes, and CRC checksums.