Connect WHOOP wearable to OpenClaw — fetch and store recovery, sleep, HRV, strain, and workout data locally. Use when: user asks about recovery, sleep quality, HRV, heart rate, strain, workout stats, or any WHOOP data. NOT for: Apple Health, Oura, Garmin, or other non-WHOOP devices.
Connect your WHOOP band to OpenClaw so your agent can fetch your recovery, sleep, HRV, strain, and workout data.
Setup (once)
WHOOP does not have a public API. To access your own data, you need to register a personal developer app (free, takes 5 minutes). This gives you OAuth credentials so the skill can read your data on your behalf. All data stays local in ~/.whoop/whoop.db — nothing is uploaded anywhere.
{baseDir}/references/setup-guide.mdWHOOP_CLIENT_ID, WHOOP_CLIENT_SECRETWhen env vars are missing, explain to the user: "WHOOP requires a free developer account to access your data via API. It takes about 5 minutes — I can walk you through it step by step." Then follow {baseDir}/references/setup-guide.md.
If config missing: python3 {baseDir}/scripts/setup.py --init, then ask user's language and (or ).
If token missing: .
If deps missing: .
python3 {baseDir}/scripts/setup.py --set language=zhenpython3 {baseDir}/scripts/whoop_client.py authbash {baseDir}/scripts/install.shCommon commands
python3 {baseDir}/scripts/whoop_client.py recovery --days 1python3 {baseDir}/scripts/whoop_client.py sleep --days 1python3 {baseDir}/scripts/whoop_client.py workout --days 7python3 {baseDir}/scripts/whoop_client.py cycle --days 7python3 {baseDir}/scripts/whoop_client.py trends --days 7python3 {baseDir}/scripts/db.py trends --metric <name> --days Npython3 {baseDir}/scripts/whoop_client.py profilepython3 {baseDir}/scripts/whoop_client.py bodypython3 {baseDir}/scripts/daily_sync.py --days 2python3 {baseDir}/scripts/auto_sync.pypython3 {baseDir}/scripts/auto_sync.py --oncepython3 {baseDir}/scripts/auto_sync.py --interval 10Use --json for raw data when combining multiple queries. Use --days N to match user's time range ("this week" = 7, "this month" = 30).
Available metrics: recovery_score, hrv, resting_hr, spo2, skin_temp, strain, sleep_duration, sleep_efficiency, sleep_performance, respiratory_rate
Settings
python3 {baseDir}/scripts/setup.py --set <key>=<value>python3 {baseDir}/scripts/setup.py --showpython3 {baseDir}/scripts/setup.pyKeys: language (en/zh), detail_level (compact/detailed), units (metric/imperial), push_recovery, push_sleep, push_workout, webhook_enabled (bool), webhook_port (int), sync_interval (int, minutes — polling interval when webhook is off, default 5), sync_interval_webhook (int, minutes — fallback interval when webhook is on, default 20), daily_api_limit (int, default 10000)
Users may change settings in natural language (e.g. "switch to Chinese", "use detailed mode"). Map to --set accordingly.
Auto-sync
The skill supports automatic data syncing with adaptive intervals:
sync_interval minutes (default 5) as the primary data sourcesync_interval_webhook minutes (default 20) as fallbackdaily_api_limit (default 10,000) is reachedpython3 {baseDir}/scripts/auto_sync.pypython3 {baseDir}/scripts/auto_sync.py --onceWebhook (optional)
For real-time push, set up webhooks — see {baseDir}/references/setup-guide.md § "Optional: Webhook Setup". Set webhook_enabled=true in config. The webhook server writes a heartbeat file so auto-sync can detect if webhook is healthy and reduce polling frequency automatically.
Notes
language and detail_level from config.Troubleshooting
ModuleNotFoundError: bash {baseDir}/scripts/install.shWHOOP_CLIENT_ID must be set: check env varsNo refresh token: python3 {baseDir}/scripts/whoop_client.py auth401 Unauthorized: re-authorize with auth500 Server Error: transient WHOOP-side issue, retry in a few minutes--days; data may not be scored yetReferences
{baseDir}/references/setup-guide.md — New user onboarding + webhook setup{baseDir}/references/api-reference.md — WHOOP API v2 field documentation{baseDir}/references/webhook-events.md — Webhook event types and payload format