WHOOP API
Retrieve and analyze fitness data from WHOOP wearables via the official REST API.
Usage Snippet
# Install (if using Clawdhub)
clawdhub install whoop-tracker
# From the skill root:
python3 scripts/get_recovery.py --today
python3 scripts/get_sleep.py --last
python3 scripts/get_workouts.py --days 7
python3 scripts/get_profile.py
Prerequisites
- Python 3.7+
requestslibrary:pip3 install requests
(or runbash scripts/install.sh)
Quick Start
1. Register Application
- Go to https://developer.whoop.com
- Create a new app and note your
client_idandclient_secret - Set redirect URI (e.g.,
http://localhost:8080/callback)
2. Save Credentials
mkdir -p ~/.whoop
cat > ~/.whoop/credentials.json <<EOF
{
"client_id": "YOUR_CLIENT_ID",
"client_secret": "YOUR_CLIENT_SECRET"
}
EOF
chmod 600 ~/.whoop/credentials.json
3. Authorize (see references/oauth.md for full guide)
- Open the authorization URL in browser
- User grants permissions → redirected with code
- Exchange code for tokens via
WhoopClient.authenticate(code, redirect_uri)
4. Fetch Data
All scripts are run from the skill root directory:
# Today's recovery
python3 scripts/get_recovery.py --today
# Last night's sleep
python3 scripts/get_sleep.py --last
# Recent workouts
python3 scripts/get_workouts.py --days 7
# User profile
python3 scripts/get_profile.py
Core Data Types
Recovery
- Recovery Score (0-100): Readiness for strain
- HRV (RMSSD): Heart rate variability in milliseconds
- Resting Heart Rate: Morning baseline HR
- SPO2: Blood oxygen percentage
- Skin Temperature: Deviation from baseline in °C
Sleep
- Performance %: How well you slept vs. your sleep need
- Duration: Total time in bed and per stage (REM, SWS, light, awake)
- Efficiency %: Time asleep / time in bed
- Consistency %: How consistent your sleep schedule is
- Respiratory Rate: Breaths per minute
- Sleep Needed/Debt: Baseline need and accumulated debt
Cycle (Daily Strain)
- Strain Score: Cardiovascular load (0-21 scale)
- Kilojoules: Energy expenditure
- Average/Max Heart Rate: Daily HR metrics
Workout
- Strain: Activity-specific strain score
- Sport: Activity type (running, cycling, etc.)
- Heart Rate Zones: Time spent in each of 6 zones
- Distance/Altitude: GPS metrics (if available)
API Endpoints
Base URL: https://api.prod.whoop.com
See references/api-reference.md for full endpoint documentation with response schemas.
User Profile:
GET /v1/user/profile/basic— Name, emailGET /v1/user/body_measurement— Height, weight, max HR
Recovery:
GET /v1/recovery— All recovery data (paginated)GET /v1/cycle/{cycleId}/recovery— Recovery for specific cycle
Sleep:
GET /v1/sleep— All sleep records (paginated)GET /v1/sleep/{sleepId}— Specific sleep by IDGET /v1/cycle/{cycleId}/sleep— Sleep for specific cycle
Cycle:
GET /v1/cycle— All physiological cycles (paginated)GET /v1/cycle/{cycleId}— Specific cycle by ID
Workout:
GET /v1/workout— All workouts (paginated)GET /v1/workout/{workoutId}— Specific workout by ID
All collection endpoints support start, end (ISO 8601), limit (max 25), and nextToken (pagination cursor).
Required OAuth Scopes
read:profile— User name and emailread:body_measurement— Height, weight, max HRread:recovery— Recovery scores and HRVread:sleep— Sleep metrics and stagesread:cycles— Daily strain dataread:workout— Activity and workout data
Scripts
scripts/whoop_client.py
Core API client. Features:
- OAuth token storage and auto-refresh
- Token expiry tracking (proactive refresh)
- Rate limit handling (429 with retry)
- Automatic pagination iterators (
iter_recovery,iter_sleep,iter_cycles,iter_workouts)
scripts/get_recovery.py
python3 scripts/get_recovery.py --today # Today's recovery
python3 scripts/get_recovery.py --days 7 # Past week
python3 scripts/get_recovery.py --start 2026-01-20 # From date
python3 scripts/get_recovery.py --json # Raw JSON output
scripts/get_sleep.py
python3 scripts/get_sleep.py --last # Last night
python3 scripts/get_sleep.py --days 7 # Past week
python3 scripts/get_sleep.py --json # Raw JSON output
scripts/get_workouts.py
python3 scripts/get_workouts.py --days 7 # Past week
python3 scripts/get_workouts.py --sport running # Filter by sport
python3 scripts/get_workouts.py --json # Raw JSON output
scripts/get_profile.py
python3 scripts/get_profile.py # Profile + body measurements
python3 scripts/get_profile.py --json # Raw JSON output
scripts/install.sh
bash scripts/install.sh # Install pip dependencies + setup guide
Troubleshooting
"ModuleNotFoundError: No module named 'requests'"
Install dependencies: pip3 install requests or bash scripts/install.sh
"Credentials not found at ~/.whoop/credentials.json"
Create the file with your OAuth client_id and client_secret (see Quick Start step 2).
"Not authenticated"
Complete the OAuth authorization flow (see references/oauth.md).
"401 Unauthorized" after token refresh fails
Your refresh token has expired. Re-authorize from the authorization URL.
"429 Too Many Requests"
Rate limit hit. The client automatically retries after the Retry-After period.
Empty results
Check your date range — use --days 7 or wider range. Ensure your OAuth scopes include the data type you're requesting.
References
- references/oauth.md — OAuth setup, token management, authorization flow
- references/api-reference.md — Complete API endpoint documentation with response schemas