Garmin API integration

Onboarding

The adapter is implemented; the OAuth application is awaiting provider approval.

Garmin has the broadest data surface of any provider in the catalogue — if a metric exists in consumer wearables, a Garmin device probably measures it. For endurance, military, occupational-health and research use cases it is frequently non-negotiable.

It is also the hardest integration. Garmin's Health API still uses OAuth 1.0a, which means request signing rather than bearer tokens, and almost no modern HTTP client does it for you. The API is push-only for new data: Garmin posts to your registered callback and there is no polling endpoint to fall back on if you miss a delivery.

Historical data comes through an entirely separate mechanism — an asynchronous backfill request, capped per call, that delivers into the same callback later. Teams building a "connect and see your last six months" onboarding flow routinely discover this after the flow is designed.

How the Garmin integration works

Authentication
OAuth 1.0a — Garmin has not moved to OAuth 2.0 for the Health API
Sync model
Push-first. Garmin posts data to your callback; historical data comes through a separate async backfill request.
API base
https://apis.garmin.com
Integration type
Cloud OAuth

Garmin data available through WearLink

Everything below arrives in the shared normalised schema. The same field names and units apply whether the record came from Garmin or from any other provider, so your scoring, charting and storage code is written once.

  • Steps & daily activity
  • Sleep stages
  • HRV
  • Stress & body battery
  • SpO2
  • Respiration
  • VO2 max
  • Body composition
  • Workouts with full metric streams

Webhook events you can subscribe to

steps.createdsleep.createdstress.createdworkout.createdseries.heart_rate_variability.created

Connect a Garmin user

Two calls: create a connect session for your end user, then read their normalised data. You never handle Garmin OAuth credentials, token refresh or webhook registration.

# 1. Create a connect session for your end-user
curl -X POST https://wearlink.io/api/v1/connections/session \
  -H "Authorization: Bearer $WEARLINK_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"user_id": "'"$USER_ID"'", "provider": "garmin"}'

# → { "connect_url": "https://wearlink.io/widget/connect?token=..." }
# Redirect the user there; they authorise garmin and land back on your redirect_uri.

# 2. Pull normalised data whenever you want
curl -H "Authorization: Bearer $WEARLINK_API_KEY" \
  "https://wearlink.io/api/v1/users/$USER_ID/summaries?provider=garmin&days=7"

What makes the Garmin API hard to integrate directly

These are the things that turn an estimated one-week integration into a one-month one. They are worth knowing whether you use WearLink or build it yourself.

OAuth 1.0a request signing

Bearer tokens do not apply. Every request needs an HMAC signature over a canonicalised parameter string. This is the single most common reason Garmin integrations take weeks instead of days.

Push-only means missed deliveries are gone

There is no "give me everything since timestamp X" endpoint for regular data. If your callback is down, you need a backfill request to recover — and backfill is rate-limited and windowed.

Backfill is async and capped

The strategy caps historical requests at 30 days per call. Pulling a year means chunked, paced requests whose results arrive over time, not a synchronous response.

Approval is a real gate

Garmin reviews applications for the Health API and does not approve everything. Budget calendar time for it.

Garmin API — frequently asked questions

Why is the Garmin API harder than Fitbit or Oura?
Three reasons: OAuth 1.0a request signing instead of bearer tokens, push-only delivery with no polling fallback, and a separate asynchronous backfill path for historical data. Each is manageable alone; together they are what turns a one-week integration into a one-month one.
Is Garmin live on WearLink today?
Not yet. The adapter is written and the capability set is implemented, but the OAuth application is still in Garmin's approval pipeline. The /providers page tracks the current state against the runtime configuration flags.
Can I get Garmin body battery and stress?
Yes — both are implemented in the adapter and normalise into the stress category. They will be available as soon as the OAuth application is approved.

Other integrations

Start with Garmin — free for up to 3 users

No credit card. Create an account, add your provider credentials once, and your users connect through a hosted widget or our mobile SDK.