Health & fitness
Trainerize
Clients, programs, check-ins and messages for your Trainerize business.
14 endpoints
Bring Garmin Connect activity records into your agent or private training journal. Use MCP or REST from automation tools and scripts, retaining the original units.
11 tools Read and write
Garmin Connect has an official API but no MCP server (checked 27 Oct 2026). Since 21 Oct 2026 anyone can make a free Personal API key for their own activity and health data, pull only. Workouts and courses go in through business tiers you apply for. Cotlet runs 11 Garmin Connect tools hosted, over MCP for agents and REST for scripts.
| What you need | Personal API key | Open-source server | Cotlet |
|---|---|---|---|
| Read activities and files | Yes, with your own code | Yes | Yes |
| Read sleep, HRV and Body Battery | Health data, metrics not listed | Yes | Yes |
| Training status and readiness | Not listed | Some servers | Yes |
| Build and schedule workouts | No, business tiers | Some servers | Yes, schedule after your OK |
| No password or key to renew | Key expires | Password or key | Sign in once |
Checked 27 Oct 2026. Sources: Garmin Connect Developer Program overview · Garmin Rumors: Personal, Starter and Enterprise · Tredict: Garmin Personal API and AI · Garmin Personal API Python client
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 Garmin password, and nothing lands on your training calendar until you approve it. 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 Garmin Connect for agents. Sign up, sign in to Garmin Connect 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.
The same address serves every app you enable, Garmin Connect with the rest. If you enable Garmin Connect 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 \
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": {
"url": "https://cotlet.dev/mcp/v1",
"headers": { "Authorization": "Bearer ${env:COTLET_API_KEY}" }
}
}
} # ~/.codex/config.toml
[mcp_servers.cotlet]
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: garmin_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: garmin_write Create a Cotlet API key with access to Garmin Connect and its read operations. Store it as COTLET_API_KEY in your environment or automation platform's credential store.
Sign in to Garmin Connect in its Cotlet Cloud Browser and enable the app for agents. Use your own Garmin Connect login at connect.garmin.com.
curl "https://cotlet.dev/api/v1/garmin/activities?limit=2" \
-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": "garmin",
"tool": "list_activities",
"result": {
"activities": [
{
"activity_id": "9000000101",
"name": "Long Run",
"type": "running",
"date": "2026-10-24",
"distance_km": 21.1,
"duration_min": 118,
"avg_heart_rate": 152
}
],
"next_cursor": null
}
} Read result.activities and pass result.next_cursor unchanged as cursor until null. Keep date, activity-type and limit filters fixed.
Activity lists default to 25 records, with a maximum of 100. distance_km uses kilometers and duration_min uses minutes; retain those units in reports.
Device-dependent metrics can be absent. Workout lists accept at most 100 records without a cursor, so do not treat them as an unlimited export.
| Tool | Connect through | Example workflow |
|---|---|---|
| n8n | HTTP Request | Combine activities and activity details into a private distance and duration report with original units. |
| Make | HTTP > Make a request | Read selected activity IDs and download their files into your chosen personal archive. |
| Python or Node.js | REST API | Read dated sleep, HRV and Body Battery records into a private metric journal without interpreting absent values. |
Send Authorization: Bearer <your Cotlet API key> in request headers. You configure the schedule, destination and record comparisons.
Cotlet reads Garmin Connect; 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.
Newest first, filtered by type and date. GPX and TCX are not offered for every activity type, and Garmin exports multisport activities only as FIT.
Lists the activities on your Activities page, newest first. Filter by activity type and by date range, then pass an activity_id to get_activity or download_activity. Pages hold up to 100 activities; pass next_cursor back as cursor for the next page.
MCP callgarmin_read → list_activities
REST endpointGET https://cotlet.dev/api/v1/garmin/activities
| Name | Type | Description |
|---|---|---|
| type string | string | Activity type as Garmin Connect names it, e.g. running or cycling. |
| from date | date | First day to include. |
| to date | date | Last day to include. Default: today. |
| limit integer | integer | 1 to 100. Default: 25. |
| cursor string | string | Next page cursor from the previous call. |
{
"activities": [
{
"activity_id": "9000000101",
"name": "Long Run",
"type": "running",
"date": "2026-10-24",
"distance_km": 21.1,
"duration_min": 118,
"avg_heart_rate": 152
},
{
"activity_id": "9000000087",
"name": "Tempo Run",
"type": "running",
"date": "2026-10-22",
"distance_km": 12,
"duration_min": 58,
"avg_heart_rate": 161
}
],
"next_cursor": null
} Returns one activity as Garmin Connect shows it: totals, lap splits and time in each heart rate zone. Nothing is changed. Fields the device did not record, such as power on a run without a sensor, are left out.
MCP callgarmin_read → get_activity
REST endpointGET https://cotlet.dev/api/v1/garmin/activities/{activity_id}
| Name | Type | Description |
|---|---|---|
| activity_id string required | string | Activity ID from list_activities. |
{
"activity_id": "activity_8c41d2"
} {
"activity_id": "9000000101",
"name": "Long Run",
"type": "running",
"date": "2026-10-24",
"distance_km": 21.1,
"duration_min": 118,
"avg_heart_rate": 152,
"max_heart_rate": 171,
"splits": [
{
"km": 1,
"pace_min_per_km": "5:35"
},
{
"km": 2,
"pace_min_per_km": "5:32"
}
]
} Exports one activity from the web app and returns a download link to the file. original is the FIT file the device recorded. GPX and TCX are not offered for every activity type, and Garmin exports multisport activities only as FIT. Nothing is changed.
MCP callgarmin_read → download_activity
REST endpointGET https://cotlet.dev/api/v1/garmin/activities/{activity_id}/download
| Name | Type | Description |
|---|---|---|
| activity_id string required | string | Activity ID from list_activities. |
| format string | string | original, gpx or tcx. Default: original. |
{
"activity_id": "activity_8c41d2"
} {
"activity_id": "9000000101",
"format": "original",
"file_name": "9000000101.zip",
"download_url": "https://files.cotlet.dev/example/9000000101.zip"
} Read only. HRV status needs about three weeks of sleep data, and training readiness comes back empty on devices that do not calculate it.
Returns the night that ends on the given date: sleep score, total sleep time and the time in each stage, as Garmin Connect shows it. Empty when the watch was not worn that night. Nothing is changed.
MCP callgarmin_read → get_sleep
REST endpointGET https://cotlet.dev/api/v1/garmin/sleep
| Name | Type | Description |
|---|---|---|
| date date | date | Day to read. Default: today. |
{
"date": "2026-10-26",
"sleep_score": 82,
"total_sleep_min": 452,
"stages_min": {
"deep": 74,
"light": 241,
"rem": 98,
"awake": 39
}
} Returns the overnight HRV average for the date and the status Garmin shows: Balanced, Unbalanced, Low, Poor or No Status. Garmin needs about three weeks of consistent sleep data before it gives a status, so a new device returns No Status. Nothing is changed.
MCP callgarmin_read → get_hrv_status
REST endpointGET https://cotlet.dev/api/v1/garmin/hrv-status
| Name | Type | Description |
|---|---|---|
| date date | date | Day to read. Default: today. |
{
"date": "2026-10-26",
"overnight_avg_ms": 58,
"seven_day_avg_ms": 56,
"status": "Balanced"
} Returns the Body Battery levels Garmin Connect charts for the day, on its scale of 5 to 100: the level at waking, the highest and the lowest. Sleep charges it and activity and stress drain it. Nothing is changed.
MCP callgarmin_read → get_body_battery
REST endpointGET https://cotlet.dev/api/v1/garmin/body-battery
| Name | Type | Description |
|---|---|---|
| date date | date | Day to read. Default: today. |
{
"date": "2026-10-26",
"at_wake": 78,
"highest": 82,
"lowest": 24,
"charged": 61,
"drained": 58
} Returns the training status label, the training readiness score and VO2 max for the date. Garmin calculates readiness from sleep score, recovery time, HRV status, acute load and sleep and stress history. Only devices that support these metrics fill them; the rest come back empty.
MCP callgarmin_read → get_training_status
REST endpointGET https://cotlet.dev/api/v1/garmin/training-status
| Name | Type | Description |
|---|---|---|
| date date | date | Day to read. Default: today. |
{
"date": "2026-10-26",
"training_status": "Productive",
"training_readiness": 71,
"vo2_max": 52
} A new workout sits in your library until you schedule it. Scheduling changes what your calendar, and later your watch, shows.
Lists the workouts under Training & Planning > Workouts, newest first. Pass a workout_id to schedule_workout. Nothing is changed.
MCP callgarmin_read → list_workouts
REST endpointGET https://cotlet.dev/api/v1/garmin/workouts
| Name | Type | Description |
|---|---|---|
| sport string | string | Filter by sport, e.g. running or cycling. |
| limit integer | integer | 1 to 100. Default: 50. |
{
"workouts": [
{
"workout_id": "wk_3301",
"name": "Tempo 3 x 10 min",
"sport": "running",
"steps": 9
},
{
"workout_id": "wk_3290",
"name": "Easy 40 min",
"sport": "running",
"steps": 1
}
]
} Returns what your Garmin Connect training calendar holds between two dates: scheduled workouts, training plan sessions and finished activities, earliest first. Without dates it covers the next 7 days. Nothing is changed.
MCP callgarmin_read → get_training_calendar
REST endpointGET https://cotlet.dev/api/v1/garmin/training-calendar
| Name | Type | Description |
|---|---|---|
| from date | date | Start of the range. Default: today. |
| to date | date | End of the range. Default: 7 days after from. |
{
"days": [
{
"date": "2026-10-29",
"scheduled": [
{
"workout_id": "wk_3301",
"name": "Tempo 3 x 10 min"
}
],
"activities": []
},
{
"date": "2026-10-31",
"scheduled": [],
"activities": []
}
]
} Builds a workout under Training & Planning > Workouts > Create a Workout and returns its workout_id. Each step has a type such as warm up, run, recover or cool down, a duration or distance and an optional target. The workout stays in your library until schedule_workout puts it on a date. It reaches no one and you can delete it in Garmin Connect, so it runs without asking.
MCP callgarmin_write → create_workout
REST endpointPOST https://cotlet.dev/api/v1/garmin/workouts
| Name | Type | Description |
|---|---|---|
| name string required | string | Workout name, e.g. "Tempo 3 x 10 min". |
| sport string required | string | Sport as Garmin Connect names it, e.g. running or cycling. |
| steps object required | object | List of { type, duration_min or distance_km, target }. type: warm up, run, recover, cool down or repeat. |
{
"name": "Tempo 3 x 10 min",
"sport": "sport",
"steps": "steps"
} {
"workout_id": "wk_3301",
"name": "Tempo 3 x 10 min",
"sport": "running",
"steps": 9
} Adds the workout to your Garmin Connect training calendar on the date you give and returns the calendar entry. Garmin's manuals say scheduled workouts in Connect can be sent to your device and overwrite the training calendar already on it, so this changes what your watch shows after its next sync. By default you confirm each call; you can switch that off for this tool.
MCP callgarmin_write → schedule_workout
REST endpointPOST https://cotlet.dev/api/v1/garmin/workouts/{workout_id}/schedule
| Name | Type | Description |
|---|---|---|
| workout_id string required | string | Workout ID from list_workouts or create_workout. |
| date date required | date | Day to schedule it on. |
{
"workout_id": "wk_3301",
"date": "2026-10-29"
} {
"workout_id": "wk_3301",
"date": "2026-10-29",
"status": "scheduled",
"name": "Tempo 3 x 10 min"
} Your signed-in Garmin Connect profile, encrypted with AES-256-GCM, in Finland. Not the password.
The 11 Garmin Connect tools. Never the cookie or your password.
Your account: activities, sleep and health stats, workouts, calendar.
Password, two-factor, subscription, devices, sharing and deleting.
A sign-in code or challenge goes to you. You type it in, we never do.
Disable for agents, reset the browser, or sign out of Garmin Connect.
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.
"Licensees may not use the API to design a client or application that uses any robot, spider, site search, or other retrieval application or device to scrape, retrieve, or index services provided by Garmin or its licensors."
That clause binds developers who sign the API agreement, and Cotlet does not use the API. We could not open Garmin's consumer terms of use, so we quote nothing from them (checked 27 Oct 2026). Garmin could still read an agent in your account as automation. In 2026 Garmin put Cloudflare TLS fingerprinting in front of its Connect API, which blocks scripts that are not a real browser. We found no public case of a Garmin account closed for using a third-party tool, only temporary rate limits.
Garmin limits repeated sign-ins from one account. Sign in once and let the Cloud Browser keep the session instead of logging in on every run.
Garmin changed its sign-in this year and broke several open-source servers. When Garmin Connect moves a button or renames a field, the fix happens on our side and your prompts keep working. status.cotlet.dev watches the site, console and API every 3 minutes.
| Action | Undo |
|---|---|
| Create a workout | Delete it in Garmin Connect, it reaches no one |
| Schedule a workout | Remove it from the calendar in Garmin Connect |
| Workout already on the watch | Garmin sends the calendar to the device and overwrites the one there, so check it before you OK |
| Download a file | Nothing changes in your account |
1 of 11 tools asks first: schedule_workout, the one that changes your training calendar. Reads, downloads and new library workouts reach nothing, so they run at once. Switch the wait off per tool for a scheduled run.
Garmin's manuals say scheduled workouts sent to a device overwrite the training calendar already on it. Look at get_training_calendar before you approve a new week.
{
"name": "schedule_workout",
"arguments": {
"workout_id": "wk_3301",
"date": "2026-10-29"
}
} curl -X POST https://cotlet.dev/api/v1/garmin/workouts/wk_3301/schedule \
-H "Authorization: Bearer $COTLET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"date":"2026-10-29"}' {
"workout_id": "wk_3301",
"date": "2026-10-29",
"status": "scheduled",
"name": "Tempo 3 x 10 min"
} Scripts and cron jobs reach the same tools over REST at /api/v1/garmin, with the same key and price. A device that does not record a metric returns it empty, and a failed call costs nothing. The tools table lists the REST path of each tool.
About $21 a monthfor a daily readiness check plus weekly review, planning and exports, 3,680 credits. Garmin Connect stays free, or Connect+ at Garmin's own price.
| Job | Calls | Credits |
|---|---|---|
| Morning readiness check | 5 × 30 | 1,500 |
| Review the week's runs, weekly | 5 × 4 | 200 |
| Build and schedule a training week | 7 × 4 | 280 |
| Export files for a coach, weekly | 5 × 4 | 200 |
| Cloud Browser, 30 days | 1,500 | |
| Total | 3,680 |
The month is our example: a morning check every day and a weekly review, plan and export. We found no public figure for how an athlete uses an agent on Garmin Connect. Garmin Connect+ costs $6.99 a month or $69.99 a year in the US (checked 27 Oct 2026) and is billed by Garmin. 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 |
|---|---|---|
| Taxuspt/garmin_mcp | MCP server with activities, health, workouts, calendar and device tools, in tool profiles from 20 to all. Python, MIT. | 1,416 stars, last commit 24 Oct 2026. Signs in with your Garmin email and password through an unofficial library; Garmin's login changes have broken that route before. |
| Nicolasvegam/garmin-connect-mcp | 61 tools over seven categories, Node.js. | 185 stars, last commit 28 Jul 2026. Takes your email and password in the environment. |
| etweisberg/garmin-connect-mcp | Routes calls through a headless Playwright browser to get past Garmin's TLS fingerprinting, with workouts and devices. | 45 stars, last commit 12 Jul 2026. You log in by hand in a Playwright browser and keep it running; AGPL-3.0. |
| Mason-Levyy/garmin-personal-mcp | 26 read-only tools on the official Personal API, no password. Python, MIT. | 39 stars, last commit 25 Oct 2026. Reads only, and you renew the key every 30 days to a year. |
| Tredict | Training platform on Garmin's official business API, with an MCP server and a ChatGPT plugin. Sends workouts to the watch. | You move your training log into Tredict. It works from its own data, not your Garmin account. |
A GitHub server is free and quick to start if you are comfortable with a terminal and a stored password or key. It runs on your computer and stops when Garmin changes its login. The Personal API route is clean but read-only. Cotlet keeps your Garmin account as the source of truth, hosts the server, adds the workout tools and repairs it when Garmin changes.
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 Garmin Connect 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 Garmin Connect under Integrations in the console and sign in to Garmin Connect in its Cloud Browser. The trial starts with your first app, no card asked.
For reading your own activity and health data, you can (checked 27 Oct 2026). The key is read-only, pull only and expires after 30 days to a year, and you need your own code or an open-source server to use it. Cotlet is for what the key does not do: building and scheduling workouts, and training status, in a hosted server.
Scheduling puts the workout on your Garmin Connect training calendar. Garmin's manuals say workouts sent from Connect to the device overwrite the training calendar already on it, so check the calendar before you confirm.
No for the tools here. Cotlet works in your account on the plan you have. Features Garmin sells with Connect+, such as nutrition tracking, need that subscription in Garmin first (checked 27 Oct 2026).
Only for approved businesses. Starter and Enterprise push data to an app's server, while the Personal tier is pull only (checked 27 Oct 2026). Run your agent on a schedule instead, for example a daily get_sleep and get_training_status pass.
Cotlet reads what Garmin Connect shows for your account. A device that does not record a metric, such as HRV status or training readiness, returns it empty.
No. We keep the signed-in session, never the password, and no tool returns the cookie.
Only the way in. Both have the same 11 tools, inputs and answers, one API key and one price. Agents use MCP; scripts, cron jobs and HTTP steps use REST.
No. Cotlet is independent and not affiliated with Garmin Ltd.
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