π¦ ClawHub
WHOOP Tracker
by @ijaack
Access WHOOP fitness tracker data via API, including recovery scores, sleep metrics, workout stats, daily strain, and body measurements. Use when the user asks about their WHOOP data, fitness metrics, recovery status, sleep quality, workout performance, or wants to track health trends.
TERMINAL
clawhub install whoop-trackerπ About This Skill
name: whoop description: Access WHOOP fitness tracker data via API, including recovery scores, sleep metrics, workout stats, daily strain, and body measurements. Use when the user asks about their WHOOP data, fitness metrics, recovery status, sleep quality, workout performance, or wants to track health trends.
WHOOP API
Retrieve and analyze fitness data from WHOOP wearables via the official REST API.
Usage Snippet
# Install (if using Clawdhub)
clawdhub install whoop-trackerFrom 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
requests library: pip3 install requests bash scripts/install.sh)Quick Start
1. Register Application
client_id and client_secrethttp://localhost:8080/callback)2. Save Credentials
mkdir -p ~/.whoop
cat > ~/.whoop/credentials.json <3. Authorize (see references/oauth.md for full guide)
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 --todayLast night's sleep
python3 scripts/get_sleep.py --lastRecent workouts
python3 scripts/get_workouts.py --days 7User profile
python3 scripts/get_profile.py
Core Data Types
Recovery
Sleep
Cycle (Daily Strain)
Workout
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 HRRecovery:
GET /v1/recovery β All recovery data (paginated)GET /v1/cycle/{cycleId}/recovery β Recovery for specific cycleSleep:
GET /v1/sleep β All sleep records (paginated)GET /v1/sleep/{sleepId} β Specific sleep by IDGET /v1/cycle/{cycleId}/sleep β Sleep for specific cycleCycle:
GET /v1/cycle β All physiological cycles (paginated)GET /v1/cycle/{cycleId} β Specific cycle by IDWorkout:
GET /v1/workout β All workouts (paginated)GET /v1/workout/{workoutId} β Specific workout by IDAll 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 dataScripts
scripts/whoop_client.py
Core API client. Features:
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 theRetry-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
π‘ Examples
1. Register Application
client_id and client_secrethttp://localhost:8080/callback)2. Save Credentials
mkdir -p ~/.whoop
cat > ~/.whoop/credentials.json <3. Authorize (see references/oauth.md for full guide)
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 --todayLast night's sleep
python3 scripts/get_sleep.py --lastRecent workouts
python3 scripts/get_workouts.py --days 7User profile
python3 scripts/get_profile.py
βοΈ Configuration
requests library: pip3 install requests bash scripts/install.sh)π Tips & Best Practices
"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 theRetry-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.