Health & fitness
Trainerize
Clients, programs, check-ins and messages for your Trainerize business.
14 endpoints
Read your WHOOP daily strain, recovery and sleep records through MCP or REST. Connect an AI agent or create a private reporting workflow with HTTP requests.
8 tools Read only
WHOOP has an official developer API (v2, OAuth 2.0, read-only) but no official MCP server (checked 27 Oct 2026). Cotlet runs 8 WHOOP tools hosted, over MCP for agents and REST for scripts, in your own login.
| What you need | WHOOP API | GitHub MCP server | Cotlet |
|---|---|---|---|
| Recovery, sleep, strain, workouts | Yes, in your own code | Yes | Yes |
| Works from Claude or ChatGPT | No MCP server | Desktop apps; web needs hosting | Yes, hosted |
| No developer app or OAuth setup | App and OAuth needed | Your own app | Yes |
| Membership plan | No endpoint | No | Yes |
| Allowed by WHOOP's terms | Yes, official | Yes, on the official API | Uses the web app |
Checked 27 Oct 2026. Sources: WHOOP API docs · WHOOP Developer Platform: Getting Started · WHOOP Developer Platform: App Approval · WHOOP API rate limiting
Use your own account in its Cotlet Cloud Browser.
Connect your agent or create a Cotlet API key.
Ask your agent or send an HTTP request.
We never keep your WHOOP password, and every WHOOP tool only reads. Who can see your session
Use MCP with your AI agent, or HTTP requests in n8n, Make, Zapier and scripts. Follow the MCP setup below or jump to the REST guide.
Enable WHOOP for agents. Sign up, log in to WHOOP in its Cloud Browser, then press Enable for agents.
Paste the Cotlet address. Add https://cotlet.dev/mcp/v1 as an MCP server or connector in your agent.
Approve the connection. Chat apps ask you to sign in to Cotlet. Editors, n8n and scripts use an API key from the console.
One shared address, https://cotlet.dev/mcp/v1, also carries WHOOP next to your other apps. If you enable WHOOP after connecting, refresh the connector so the new tools show up.
Settings > Connectors > Add custom connector
URL: https://cotlet.dev/mcp/v1/connect
Claude Code:
claude mcp add --transport http cotlet-whoop \
https://cotlet.dev/mcp/v1 \
--header "Authorization: Bearer $COTLET_API_KEY" Settings > Apps & Connectors > Create
MCP server URL: https://cotlet.dev/mcp/v1/connect
Authentication: OAuth // ~/.cursor/mcp.json
{
"mcpServers": {
"cotlet-whoop": {
"url": "https://cotlet.dev/mcp/v1",
"headers": { "Authorization": "Bearer ${env:COTLET_API_KEY}" }
}
}
} # ~/.codex/config.toml
[mcp_servers.cotlet-whoop]
url = "https://cotlet.dev/mcp/v1"
bearer_token_env_var = "COTLET_API_KEY" MCP Client Tool (inside an AI Agent)
Transport: HTTP Streamable
URL: https://cotlet.dev/mcp/v1
Auth: Bearer, <your key>
Tool: whoop_read Make: MCP Client > Call a tool
Zapier: MCP Client by Zapier > Run Tool
Server URL: https://cotlet.dev/mcp/v1
Token: <your key>
Tool: whoop_read Create a Cotlet API key with access to WHOOP and its read operations. Store it as COTLET_API_KEY in your environment or automation platform's credential store.
Sign in to WHOOP in its Cotlet Cloud Browser and enable the app for agents. Use the WHOOP membership account that owns your band.
curl "https://cotlet.dev/api/v1/whoop/day-summary?date=2026-10-26" \
-H "Authorization: Bearer $COTLET_API_KEY" A successful REST call puts the tool output in result. This illustrative response excerpt omits call IDs, messages and credit details.
{
"status": "success",
"app": "whoop",
"tool": "get_day_summary",
"result": {
"date": "2026-10-26",
"strain": 12.4,
"recovery_percent": 68,
"sleep_performance_percent": 91,
"hours_of_sleep": 7.4,
"sleep_needed_hours": 8.1
}
} This request reads a named day; replace the date with the day you want. Read percentages as percentages and the sleep-duration fields as hours.
Daily summary has no pagination; the web view exposes six months of records. Today's strain remains partial until the day ends.
Recovery, sleep, workout and cycle lists use cursors, with 10 records by default and at most 25. Keep date filters fixed while paging; sleep-stage durations use minutes and HRV uses milliseconds.
| Tool | Connect through | Example workflow |
|---|---|---|
| n8n | HTTP Request | Read daily strain, recovery and sleep values into your private journal without changing recorded data. |
| Make | HTTP > Make a request | Combine sleep lists and sleep details into a factual duration and stage report that retains minutes and hours. |
| Python or Node.js | REST API | Read workout details into a personal strain and duration journal without generating training or medical advice. |
Send Authorization: Bearer <your Cotlet API key> in request headers. You configure the schedule, destination and record comparisons.
Cotlet reads WHOOP; your workflow steps write to your chosen destination. These HTTP workflows do not require a native Cotlet connector or a prebuilt template.
Python and Node.js can use the same HTTP requests without an AI agent. Keep access keys in credentials, outside shared workflow exports.
The API and MCP reference lists operations and inputs. The REST API guide explains authentication, errors and approvals.
Recovery score, HRV, resting heart rate and day strain. The current day is still open, so its strain grows until the day ends.
Returns the figures at the top of the web app's profile overview for one day: Strain, Recovery, Sleep Performance, and hours of sleep against sleep needed. Without a date it returns today. Strain is partial until the day ends. Nothing is changed. The web app shows 6 months of data, so earlier dates return nothing.
MCP callwhoop_read → get_day_summary
REST endpointGET https://cotlet.dev/api/v1/whoop/day-summary
| Name | Type | Description |
|---|---|---|
| date date | date | Day to read. Default: today. |
{
"date": "2026-10-26",
"strain": 12.4,
"recovery_percent": 68,
"sleep_performance_percent": 91,
"hours_of_sleep": 7.4,
"sleep_needed_hours": 8.1
} Lists recoveries in a date range, newest first, with the recovery score, heart rate variability and resting heart rate. Pages hold up to 25 days; pass next_cursor back as cursor for the next page. Nothing is changed. The web app shows 6 months of data, so earlier dates return nothing.
MCP callwhoop_read → list_recoveries
REST endpointGET https://cotlet.dev/api/v1/whoop/recoveries
| Name | Type | Description |
|---|---|---|
| from date | date | Start of the range. Default: 7 days before to. |
| to date | date | End of the range. Default: today. |
| limit integer | integer | 1 to 25. Default: 10. |
| cursor string | string | Next page cursor from the previous call. |
{
"from": "2026-10-24",
"to": "2026-10-26"
} {
"recoveries": [
{
"date": "2026-10-26",
"recovery_percent": 68,
"hrv_ms": 74,
"resting_heart_rate": 52
},
{
"date": "2026-10-25",
"recovery_percent": 81,
"hrv_ms": 88,
"resting_heart_rate": 50
},
{
"date": "2026-10-24",
"recovery_percent": 43,
"hrv_ms": 61,
"resting_heart_rate": 57
}
],
"next_cursor": null
} Lists cycles, WHOOP's name for a day that runs from one sleep to the next, newest first, with day strain and average heart rate. The current cycle is still open and its strain grows until the day ends. Nothing is changed. The web app shows 6 months of data, so earlier dates return nothing.
MCP callwhoop_read → list_cycles
REST endpointGET https://cotlet.dev/api/v1/whoop/cycles
| Name | Type | Description |
|---|---|---|
| from date | date | Start of the range. Default: 7 days before to. |
| to date | date | End of the range. Default: today. |
| limit integer | integer | 1 to 25. Default: 10. |
| cursor string | string | Next page cursor from the previous call. |
{
"cycles": [
{
"date": "2026-10-26",
"day_strain": 12.4,
"average_heart_rate": 71,
"open": true
},
{
"date": "2026-10-25",
"day_strain": 14.1,
"average_heart_rate": 76,
"open": false
},
{
"date": "2026-10-24",
"day_strain": 9.8,
"average_heart_rate": 68,
"open": false
}
],
"next_cursor": null
} Sleep Performance and minutes in each stage. get_sleep takes the sleep_id from list_sleeps.
Lists sleeps in a date range, newest first, each with its sleep_id, start and end, Sleep Performance and the minutes in each stage. Pass sleep_id to get_sleep for one night. Nothing is changed. The web app shows 6 months of data, so earlier dates return nothing.
MCP callwhoop_read → list_sleeps
REST endpointGET https://cotlet.dev/api/v1/whoop/sleeps
| Name | Type | Description |
|---|---|---|
| from date | date | Start of the range. Default: 7 days before to. |
| to date | date | End of the range. Default: today. |
| limit integer | integer | 1 to 25. Default: 10. |
| cursor string | string | Next page cursor from the previous call. |
{
"sleeps": [
{
"sleep_id": "a1b2c3d4-0001",
"start": "2026-10-25T23:12:00-07:00",
"end": "2026-10-26T06:41:00-07:00",
"performance_percent": 91,
"stage_minutes": {
"awake": 38,
"light": 214,
"slow_wave": 96,
"rem": 101
}
},
{
"sleep_id": "a1b2c3d4-0002",
"start": "2026-10-24T23:55:00-07:00",
"end": "2026-10-25T07:20:00-07:00",
"performance_percent": 84,
"stage_minutes": {
"awake": 45,
"light": 226,
"slow_wave": 82,
"rem": 92
}
}
],
"next_cursor": null
} Returns one sleep: start and end, Sleep Performance, hours of sleep against sleep needed and the minutes in each stage. Use sleep_id from list_sleeps. Nothing is changed. The web app shows 6 months of data, so earlier dates return nothing.
MCP callwhoop_read → get_sleep
REST endpointGET https://cotlet.dev/api/v1/whoop/sleeps/{sleep_id}
| Name | Type | Description |
|---|---|---|
| sleep_id string required | string | Sleep ID from list_sleeps. |
{
"sleep_id": "sleep_8c41d2"
} {
"sleep_id": "a1b2c3d4-0001",
"start": "2026-10-25T23:12:00-07:00",
"end": "2026-10-26T06:41:00-07:00",
"performance_percent": 91,
"hours_of_sleep": 7.4,
"sleep_needed_hours": 8.1,
"stage_minutes": {
"awake": 38,
"light": 214,
"slow_wave": 96,
"rem": 101
}
} Sport, duration, strain and average heart rate. list_workouts can keep one sport.
Lists workouts in a date range, newest first, with sport, start time, duration, activity strain and average heart rate. Set sport to keep one sport. Pass workout_id to get_workout for one. Nothing is changed. The web app shows 6 months of data, so earlier dates return nothing.
MCP callwhoop_read → list_workouts
REST endpointGET https://cotlet.dev/api/v1/whoop/workouts
| Name | Type | Description |
|---|---|---|
| from date | date | Start of the range. Default: 7 days before to. |
| to date | date | End of the range. Default: today. |
| sport string | string | Sport name as WHOOP shows it, e.g. Running. |
| limit integer | integer | 1 to 25. Default: 10. |
| cursor string | string | Next page cursor from the previous call. |
{
"workouts": [
{
"workout_id": "w5e6f7a8-0001",
"sport": "Running",
"start": "2026-10-26T17:30:00-07:00",
"duration_minutes": 48,
"strain": 11.2,
"average_heart_rate": 152
},
{
"workout_id": "w5e6f7a8-0002",
"sport": "Strength Trainer",
"start": "2026-10-24T07:10:00-07:00",
"duration_minutes": 55,
"strain": 9.6,
"average_heart_rate": 121
}
],
"next_cursor": null
} Returns one workout: sport, start time, duration, activity strain and average heart rate. Use workout_id from list_workouts. Nothing is changed. The web app shows 6 months of data, so earlier dates return nothing.
MCP callwhoop_read → get_workout
REST endpointGET https://cotlet.dev/api/v1/whoop/workouts/{workout_id}
| Name | Type | Description |
|---|---|---|
| workout_id string required | string | Workout ID from list_workouts. |
{
"workout_id": "workout_8c41d2"
} {
"workout_id": "w5e6f7a8-0001",
"sport": "Running",
"start": "2026-10-26T17:30:00-07:00",
"duration_minutes": 48,
"strain": 11.2,
"average_heart_rate": 152
} Your plan and renewal date. Changing or cancelling it is not a tool.
Returns the plan and renewal date the Membership page shows. It never returns card numbers or billing addresses. Nothing is changed. Changing or cancelling a plan is not a tool.
MCP callwhoop_read → get_membership
REST endpointGET https://cotlet.dev/api/v1/whoop/membership
No parameters.
{
"plan": "Peak",
"status": "active",
"renewal_date": "2027-03-14"
} Your logged-in WHOOP profile, encrypted with AES-256-GCM, in Finland. Not the password.
The 8 WHOOP tools. Never the cookie.
Your own account: recovery, sleep, strain, workouts and membership.
Plan changes, cancelling, payment details, password and deleting data.
A new device can ask for a code. You type it in, we never do.
Disable for agents, reset the browser, or sign out of WHOOP.
Our site scores A+ on Qualys SSL Labs, securityheaders.com and Mozilla Observatory (live results). There is no SOC 2 report or third-party pentest yet.
"use of web scraping, web harvesting, or web data extraction methods from WHOOP Services even if the Account owner gives permission"
The terms also end your permission to use the Services on a violation. Cotlet reads your WHOOP web app, as you would, but WHOOP could read it as automation. The official API is the route its terms allow, and its own terms bar scraping and building permanent copies of WHOOP data. We found no public case of a WHOOP account closed for an AI agent or an MCP server (checked 27 Oct 2026). A competing tool that signs in with your password through WHOOP's private app API carries its own warning about suspension.
If a ban on automation would cost you more than the convenience, use the official API with your own developer app instead.
When WHOOP moves a screen or renames a field, the fix happens on our side and your prompts keep working. The official API changes too: v2 launched on 1 Jul 2025 and v1 webhooks were removed. status.cotlet.dev watches the site, console and API every 3 minutes.
| Case | What happens |
|---|---|
| The agent asks for data before 6 months ago | The call returns an empty list; the agent says the window is 6 months |
| You ask to change your plan | There is no tool for it; do it in WHOOP |
| The agent reads the wrong day | Nothing changed, so ask again with the date |
All 8 tools read, so none waits for your OK and nothing can edit, delete or send. Scheduled runs need no approval.
WHOOP data is health data. Share the agent's answers only with people you trust.
{
"name": "list_recoveries",
"arguments": {
"from": "2026-10-24",
"to": "2026-10-26"
}
} curl "https://cotlet.dev/api/v1/whoop/recoveries?from=2026-10-24&to=2026-10-26" \
-H "Authorization: Bearer $COTLET_API_KEY" {
"recoveries": [
{
"date": "2026-10-26",
"recovery_percent": 68,
"hrv_ms": 74,
"resting_heart_rate": 52
},
{
"date": "2026-10-25",
"recovery_percent": 81,
"hrv_ms": 88,
"resting_heart_rate": 50
},
{
"date": "2026-10-24",
"recovery_percent": 43,
"hrv_ms": 61,
"resting_heart_rate": 57
}
],
"next_cursor": null
} Scripts and cron jobs reach the same tools over REST at /api/v1/whoop, with the same key and price. A failed call costs nothing. The tools table lists the REST path of each tool.
About $13 a monthfor a daily morning briefing and a weekly review, 2,270 credits. Your WHOOP membership is billed by WHOOP as before.
| Job | Calls | Credits |
|---|---|---|
| Morning recovery briefing, daily | 2 × 30 | 600 |
| Weekly sleep and strain review | 4 × 4 | 160 |
| Membership check | 1 × 1 | 10 |
| Cloud Browser, 30 days | 1,500 | |
| Total | 2,270 |
The month is our example: a two-call briefing every morning and a four-call review on four Sundays. No public figure for how often a member asks exists. Dollars at the $29 pack rate.
| Credits | Price, one time | Calls at 10 credits | Per 1,000 credits |
|---|---|---|---|
| 5,000 | $29 | 500 | $5.80 |
| 15,000 | $79 | 1,500 | $5.27 |
| 32,000 | $149 | 3,200 | $4.66 |
| 60,000 | $249 | 6,000 | $4.15 |
Only successful calls use credits; failed calls and timeouts cost nothing. At a balance of 0 calls pause, never a surprise charge. Authenticate with the Authorization: Bearer header.
| Option | What it does | Where it stops |
|---|---|---|
| shashankswe2020-ux/whoop-mcp | 16 read-only tools on the official API, 175 stars, last push 25 Oct 2026. | Runs on your computer with your own developer app. Claude web, phone and ChatGPT need you to host it. |
| yuridivonis/whoop-mcp-server | Remote MCP for a Claude.ai custom connector on API v2, 16 stars, last push 21 Oct 2026. | You host it and register the WHOOP app. |
| briangaoo/whoop-mcp | 55 tools with writes, 136 stars, through WHOOP's private iOS API. | Needs your WHOOP password. Its own notice says it goes against WHOOP's terms. |
| Older servers (nissand, RomanEvstigneev, JedPattersonn) | Claude Desktop servers with 13 to 27 stars. | No push since Jul to Oct 2025. |
| Hosted WHOOP connectors | Several services run the official API for you, free or from about $39 a year, per their own pages. | WHOOP serves 10 members on an unapproved app, so a shared app has a member cap. |
| Zapier and n8n | Neither lists a WHOOP app (checked 27 Oct 2026). | You build the API calls with a generic OAuth step. |
If you are happy to register a developer app and run a server, a GitHub server on the official API is free and within WHOOP's terms. Cotlet is for people who want the same reading in Claude or ChatGPT with no app to register and no server to fix. It works in your web login, so it also carries the terms risk above.
Take Group sp. z o.o. runs Cotlet. It is a software company registered in Poland, EU (VAT PL6342984273), working since 2019, founded by Bart Krawczyk (Co-founder, CTO) and Jake Slugocki (Co-founder, SEO, sales and marketing). Write to contact@cotlet.dev with questions about the WHOOP tools.
Yes. Call Cotlet's REST API from a script or an HTTP step in n8n, Make or Zapier with your Cotlet key. MCP is the alternative for AI agents; you do not need to connect an agent to use REST.
Create a free account at https://cotlet.dev, open WHOOP under Integrations in the console and log in to WHOOP in its Cloud Browser. The trial starts with your first app, no card asked.
An app starts on the Sandbox tier, which lets up to 10 WHOOP members connect. More members need a request in the Developer Dashboard, and WHOOP reviews each one by hand (checked 27 Oct 2026). Cotlet does not use the API, so no app or approval is involved.
The WHOOP web app shows 6 months of data (WHOOP Basics, checked 27 Oct 2026), and the tools read what the web app shows. Steps are not in the web app, so no tool returns them. The official API added a step count to cycles on 23 Sep 2026.
Yes, through the official API: recovery, sleep and workout updated and deleted events (checked 27 Oct 2026). A Cotlet agent does not receive them. Run it on a schedule instead, for example a morning list_recoveries call.
The figures come from what the WHOOP web app shows, not from the API. Strain, Recovery and Sleep Performance are the same scores WHOOP computes. The API has fields the web app lacks, for example steps, which the web app does not show.
No. All tools read. The official API is read-only as well, apart from revoking an app's access.
Only the door is different. Both expose the same 8 tools, inputs and answers, with one API key and one price. Agents use MCP; scripts and HTTP steps use REST.
No. Cotlet is independent and not affiliated with WHOOP, Inc.
Free 7-day trial with 2,000 credits, no card needed.
May we use Google Analytics to see which pages help people? It sets cookies only if you accept. No ads, and we never sell data. Cookie policy