Fetch WHOOP health data including recovery scores, sleep metrics, workouts, cycles, and profile. Use when user asks about WHOOP data, recovery, HRV, sleep analysis, or fitness metrics.
Access WHOOP health metrics: recovery scores, HRV, sleep analysis, workout strain, and physiological cycles.
Add tokens to ~/.openclaw/openclaw.json:
{
"skills": {
"entries": {
"whoop": {
"enabled": true,
"env": {
"WHOOP_ACCESS_TOKEN": "your-access-token",
"WHOOP_REFRESH_TOKEN": "your-refresh-token",
"WHOOP_CLIENT_ID": "your-client-id",
"WHOOP_CLIENT_SECRET": "your-client-secret"
}
}
}
}
}
| Variable | Required For | Description |
|---|---|---|
WHOOP_ACCESS_TOKEN | All API calls | Expires hourly |
WHOOP_REFRESH_TOKEN | Auto-refresh | Long-lived, get from dashboard |
WHOOP_CLIENT_ID |
| Auto-refresh |
| From WHOOP developer app |
WHOOP_CLIENT_SECRET | Auto-refresh | From WHOOP developer app |
Get tokens from the WHOOP dashboard. See {baseDir}/references/setup-guide.md.
{baseDir}/scripts/whoop-api.sh profile
Returns: User ID, email, first/last name.
{baseDir}/scripts/whoop-api.sh body
Returns: Height (m), weight (kg), max heart rate.
{baseDir}/scripts/whoop-api.sh recovery [--start YYYY-MM-DD] [--end YYYY-MM-DD] [--limit N]
Returns: Recovery score (0-100%), HRV (ms), resting heart rate, SpO2.
Example - Last 7 days:
{baseDir}/scripts/whoop-api.sh recovery --start $(date -v-7d +%Y-%m-%d)
{baseDir}/scripts/whoop-api.sh sleep [--start YYYY-MM-DD] [--end YYYY-MM-DD] [--limit N]
Returns: Sleep stages, duration, efficiency, performance percentage.
{baseDir}/scripts/whoop-api.sh workouts [--start YYYY-MM-DD] [--end YYYY-MM-DD] [--limit N]
Returns: Workout strain, sport type, heart rate zones, calories.
{baseDir}/scripts/whoop-api.sh cycles [--start YYYY-MM-DD] [--end YYYY-MM-DD] [--limit N]
Returns: Daily strain, average heart rate, calories burned.
Recovery Score (0-100%):
HRV (Heart Rate Variability):
Sleep Performance:
Strain Score (0-21):
Access tokens expire hourly. Set up a cron job to auto-refresh.
openclaw cron list | grep -i whoop
If output shows "WHOOP token refresh", cron is already set up - skip to Troubleshooting.
Ensure all env vars from Setup section are configured.
Ask user for confirmation before creating the cron job.
Create the cron job (runs every 55 minutes to avoid expiry edge cases):
openclaw cron add --name "WHOOP token refresh" \
--cron "*/55 * * * *" \
--session isolated \
--message "Run {baseDir}/scripts/whoop-refresh.sh and update BOTH WHOOP_ACCESS_TOKEN and WHOOP_REFRESH_TOKEN in ~/.openclaw/openclaw.json with the new tokens from the output. Both tokens rotate on each refresh." \
--model anthropic/claude-haiku-4-5
openclaw cron list | grep -i whoop
"WHOOP_ACCESS_TOKEN not set":
Set your token in ~/.openclaw/openclaw.json - see Setup above.
401 Unauthorized: Token expired. Run the refresh script or get a new token from the dashboard.
No data returned:
{baseDir}/references/api-endpoints.md - Full API documentation{baseDir}/references/data-structures.md - Response schemas{baseDir}/references/setup-guide.md - How to get an access token