Install
openclaw skills install openclaw-whoopConnect to the WHOOP Developer Platform via official OAuth (authorization code flow), store and refresh tokens, and fetch WHOOP v2 data (recovery, sleep, cyc...
openclaw skills install openclaw-whoopUse this skill to connect WHOOP → fetch metrics → produce a message.
Scope: WHOOP is the data source only. Keep delivery channel-agnostic: generate text/markdown and either reply in the current chat or send via OpenClaw’s message tool.
WHOOP_CLIENT_IDWHOOP_CLIENT_SECRETWHOOP_REDIRECT_URIPhone/remote mode (recommended): run, then copy/paste the redirect URL or code back into chat.
python3 scripts/whoop_oauth_login.py
Desktop fast path (optional): if you are authorizing in a browser on the same machine that runs OpenClaw, set WHOOP_REDIRECT_URI to a loopback URL (e.g. http://127.0.0.1:58539/callback) and run:
python3 scripts/whoop_oauth_login.py --loopback
python3 scripts/whoop_fetch.py --date today --out /tmp/whoop_raw_today.json
python3 scripts/whoop_normalize.py /tmp/whoop_raw_today.json --out /tmp/whoop_today.json
python3 scripts/whoop_render.py /tmp/whoop_today.json --format markdown --channel generic
Provide these via environment variables (preferred) or direct CLI args to scripts:
WHOOP_CLIENT_IDWHOOP_CLIENT_SECRETWHOOP_REDIRECT_URI (must exactly match the value in the WHOOP developer dashboard)Optional:
WHOOP_TOKEN_PATH (default: ~/.config/openclaw/whoop/token.json)WHOOP_TZ (default: Asia/Shanghai)python3 scripts/whoop_oauth_login.py
Then open the printed URL on any device, approve access, and paste the redirect URL (or code) back into the prompt.
python3 scripts/whoop_oauth_login.py --loopback
Use this only if your browser authorization happens on the same machine that runs OpenClaw, and WHOOP_REDIRECT_URI is a loopback URL like http://127.0.0.1:<port>/callback.
WHOOP_TOKEN_PATH.If you need to revoke later, use delete /v2/user/access (see references/whoop_api.md).
Fetch raw WHOOP API objects:
python3 scripts/whoop_fetch.py --date today --out /tmp/whoop_raw_today.json
python3 scripts/whoop_fetch.py --date yesterday --out /tmp/whoop_raw_yday.json
Tip: `whoop_fetch.py` uses WHOOP’s `start`/`end` query params + `nextToken` pagination. Use `--tz` to control which local day is fetched (default from `WHOOP_TZ`).
Normalize into a stable schema:
python3 scripts/whoop_normalize.py /tmp/whoop_raw_today.json --out /tmp/whoop_today.json
Render a message for humans:
python3 scripts/whoop_render.py /tmp/whoop_today.json --format markdown --channel generic
Channel formatting presets:
- `--channel discord` (uses **bold**)
- `--channel slack` / `--channel whatsapp` (uses *bold*, avoids fancy markup)
- `--channel telegram` (plain text)
Then either:
message(action=send, ...).If the user wants scheduled push messages, create an OpenClaw cron job that runs an isolated agent turn which:
scripts/whoop_fetch.py + scripts/whoop_normalize.py + scripts/whoop_render.pyKeep the cron job channel-agnostic: the destination should be a parameter in the cron payload text.
references/whoop_api.md.references/output_schemas.md.references/troubleshooting.md.