Garmin Integration
vitalera is the only Garmin Health partner focused exclusively on health and sports-grade data. We combine the official Garmin Health API and the Garmin Connect Mobile SDK to deliver raw, complete, and real-time data — without the gaps of generic aggregators.
Why Garmin with vitalera
Teams that rely on Health Connect or generic wearable aggregators to pull Garmin data usually run into the same limitations:
- Distance and GPS metrics get rounded or downsampled, so the activity you see in your platform doesn't match what the athlete actually recorded on their watch.
- Workouts arrive incomplete — missing laps, gaps in the heart rate trace, or interval structure stripped out.
- Advanced metrics are simply not exposed: cadence, heart rate zones, SpO2, running power, training load, stress, body battery, and other native Garmin data sources stay out of reach.
- No live streaming during an activity — you only get the session once it's finished and synced.
- Sync latency of several minutes to hours, which makes real-time clinical alerts or in-race monitoring impossible.
vitalera connects directly to the Garmin Health API (server-to-server) and the Garmin Connect Mobile SDK (on-device), giving you the same data fidelity Garmin uses internally.
API vs SDK vs Health Connect
Recommended: Garmin Health API via vitalera — the fastest and most scalable way to connect Garmin devices for 99% of use cases (sports platforms, RPM, coaching, research). The SDK is only needed for sub-second live streaming.
| Capability | Health Connect | Garmin Health API (via vitalera) | Garmin SDK (via vitalera) |
|---|---|---|---|
| Recommended for | — | Default choice | Broadcast / live TV only |
| Workout completeness | Partial, gaps common | Full session + laps | Full session + laps |
| Distance accuracy | Rounded / approximated | Raw, 2-decimal precision | Raw, 2-decimal precision |
| Heart rate zones | No | Yes | Yes |
| Cadence & running power | No | Yes | Yes |
| SpO2 | No | Daily + on-demand | Continuous stream |
| Sleep stages | Limited | Full (light / deep / REM) | Full |
| Historical backfill | Days | Up to 90 days | Live only |
| User pairing UX | Manual per device | One-time OAuth | Requires app install |
| Integration time | Weeks | ~15 minutes | 1–2 weeks |
| Scales to large user bases | No | Yes, production-tested | Event-based |
| Server-to-server (no app needed) | No | Yes | No (requires mobile SDK) |
| Real-time streaming (sub-second) | No | No | Yes |
When to pick what
- Garmin Health API (via vitalera) — 99% of cases. Sports platforms, RPM, coaching apps, research, insurance, corporate wellness. Server-to-server, no mobile SDK required, full historical data, one-time OAuth, scales to large user bases.
- Garmin SDK (via vitalera) — Only when you need sub-second live streaming for broadcast overlays or emergency alerting during a live event. Requires a mobile app.
- Health Connect — Not recommended for any clinical or sports-grade use case.
How user linking works
The Garmin Health API now uses OAuth 2.0 with PKCE (the legacy OAuth 1.0a flow has been retired). vitalera handles PKCE code verifier/challenge generation internally so partners never touch cryptographic primitives.
- The user taps Connect Garmin in your app.
- vitalera handles the OAuth 2.0 + PKCE flow and stores the link against your
user_id. - From that moment, push-based webhooks deliver 12+ summary types (daily, sleep, activity, epoch, stress, body composition, pulse ox, respiration, HRV, BP, skin temperature, user metrics) and data is available via the API.
No per-device pairing. No manual sync. No "please open the Garmin Connect app first."
Unified connected-accounts endpoints
Garmin is wired into the same generic endpoints that every other provider uses:
# Start OAuth (PKCE handled server-side)
curl -X POST https://api.vitalera.io/api/connected-accounts/garmin/oauth/initiate/ \
-H "Authorization: Bearer <user_token>"
# Disconnect
curl -X POST https://api.vitalera.io/api/connected-accounts/garmin/oauth/disconnect/ \
-H "Authorization: Bearer <user_token>"
# Status
curl https://api.vitalera.io/api/connected-accounts/garmin/status/ \
-H "Authorization: Bearer <user_token>"
Example: a running workout response
{
"user_id": "athlete_8421",
"source": "garmin",
"activity_id": "gar_2026_04_10_0731",
"type": "running",
"start_time": "2026-04-10T07:31:04Z",
"duration_seconds": 3284,
"distance_meters": 10043.22,
"calories_kcal": 612,
"avg_heart_rate_bpm": 154,
"max_heart_rate_bpm": 181,
"hr_zones": {
"z1": 124,
"z2": 612,
"z3": 1890,
"z4": 540,
"z5": 118
},
"avg_cadence_spm": 172,
"avg_pace_sec_per_km": 327,
"elevation_gain_m": 84,
"laps": [
{ "lap": 1, "distance_m": 1000, "duration_s": 318, "avg_hr": 148 },
{ "lap": 2, "distance_m": 1000, "duration_s": 322, "avg_hr": 152 }
],
"device": { "model": "Garmin Forerunner 965", "firmware": "22.19" }
}
distance_metersis 10 043.22 — raw from the watch, not a rounded or downsampled value.
Real-time streaming for live events
vitalera powers the live telemetry behind sports event platforms, streaming runner heart rate and SpO2 from Garmin watches to broadcast feeds in under one second.
vitalera.stream.subscribe({
user_id: 'athlete_8421',
metrics: ['heart_rate', 'spo2', 'cadence', 'pace'],
onData: (sample) => {
// sample = { ts, hr: 162, spo2: 96, cadence: 174, pace: 315 }
broadcastOverlay.update(sample);
},
});
Production-tested at scale in single-event deployments with large fields of concurrent athletes.
Sleep and daily wellness
In addition to workouts, the same integration provides:
- Sleep sessions with stages (light, deep, REM, awake)
- Resting heart rate and HRV (RMSSD)
- Daily summaries — steps, calories, stress score, Body Battery
- Pulse Ox overnight averages
All normalized to FHIR R5 Observation resources — see FHIR Resources.
Use cases
| Segment | Example |
|---|---|
| Sports event platforms | Sync athletes, runners, triathletes, or cyclists at scale. Live leaderboards, post-race analytics, broadcast overlays. |
| Connected training & coaching | Raw workout data feeds personalized training plans without losing fidelity. |
| Clinical cardiology & rehab | The same pipeline, already certified for RPM (CE Mark MDR, GDPR, ISO 27001). |
| Corporate wellness | Aggregate Garmin health metrics for employee wellness programs with consent-based data sharing. |
| Insurance & risk | Continuous heart rate, sleep, and activity data for underwriting models and incentive programs. |
| Research & clinical trials | Longitudinal wearable data collection with FHIR-standard export for research cohorts. |
Get started in 15 minutes
- Request sandbox credentials at info@vitalera.io.
- Receive your API key and test users already linked to Garmin sandbox accounts.
- Call
GET /v2/activities?user_id=demo_runner_01and inspect the JSON above with real data. - Subscribe to the
activity.createdwebhook. - Go live.
No NDA required to explore the sandbox. NDA only kicks in when you access production Garmin data (Garmin Health Partner requirement).
Compliance & data ownership
| Certifications | CE Mark MDR, ISO 27001, ISO 13485 |
| Privacy | GDPR compliant, HIPAA ready, ENS Alto |
| Data residency | EU by default (AWS eu-west-1). US region available. |
| Data ownership | You own your users' data. vitalera is the processor, never the controller. |
Next steps
- Supported Devices — Full device compatibility list
- Webhooks — Event subscriptions and payload format
- FHIR Resources — Observation data model
- Contact sales for a live demo