Back to blog

How to sync wearable data from multiple devices

Open Wearables Team · · 3 min read

Key Takeaways

  • Syncing from multiple devices requires handling fundamentally different sync models: Garmin is webhook-only, Polar and Suunto use REST polling, Whoop uses OAuth with a 30-day default, Apple Health requires a mobile SDK.
  • Open Wearables abstracts provider-specific logic through a unified API with a single set of read endpoints.
  • Canonical units enforced at ingestion: heart rate in bpm, distance in meters, temperature in Celsius, timestamps in UTC.
  • Deduplication is automatic: records with the same external_id are not duplicated.
  • Garmin is webhook-only. Do not use the generic /sync endpoint for Garmin. Historical backfill covers 30 days.
  • Suunto and Polar both support REST polling with time range and data type filters.
  • Apple Health requires the Open Wearables mobile SDK. Cloud sync is not available.
  • The unified data model has five components: Events, Time Series, Descriptors, ID Mapping, Series Type Definitions.

Most users who track health data seriously do not use just one device. The Garmin API, for example, handles daily activity and workouts. A Whoop strap captures recovery and sleep. An Apple Watch sits on the wrist for spot checks.

The data exists. The problem is getting it into one place without losing context, duplicating records, or writing glue code for every provider combination.

Step 1: Create a user

            POST /api/v1/users
X-Open-Wearables-API-Key: your_api_key
          

Step 2: Connect each device

            GET /api/v1/oauth/{provider}/authorize?user_id={id}&redirect_uri={url}
X-Open-Wearables-API-Key: your_api_key
          

Replace {provider} with garmin, polar, suunto, whoop, etc.

Step 3: Sync data per provider

Garmin API: webhook-only delivery

The Garmin API does not support REST polling. Data is delivered via webhooks. For historical data:

            POST /api/v1/providers/garmin/users/{user_id}/sync/historical
          

Covers up to 30 days. Do not use the generic /sync endpoint for Garmin.

Polar: REST polling with options

            POST /api/v1/providers/polar/users/{user_id}/sync?samples=true&zones=true&route=true
          

Suunto: REST polling with filters

            POST /api/v1/providers/suunto/users/{user_id}/sync?data_type=all
          

Key parameters: since (Unix timestamp), limit (max 100), offset, filter_by_modification_time (default true), data_type (workouts/247/all).

Whoop: OAuth, last 30 days default

            POST /api/v1/providers/{provider}/users/{user_id}/sync
          

Optional: summary_start_time, summary_end_time.

Apple Health: mobile SDK required

Cloud sync is not available. Use the Open Wearables mobile SDK on iOS.

Step 4: Read unified data

            GET /api/v1/users/{user_id}/timeseries
GET /api/v1/users/{user_id}/events/workouts
GET /api/v1/users/{user_id}/events/sleep
          

All providers return data through the same endpoints in the same normalized format.

The unified data model

Five components: Events (workouts, sleep sessions), Time Series (high-frequency floats with type and device source), Descriptors (session metadata), ID Mapping (provider IDs to internal IDs), Series Type Definitions (schema per metric type including units). Stack: SQLAlchemy, Pydantic, Alembic.

Provider coverage notes

24/7 continuous monitoring: Garmin, Suunto, Ultrahuman, Oura (coming soon). Whoop and Strava have significant limitations. Strava has no sleep data.

See Related Articles

FAQ

Do I need separate sync logic for each device?

No. Open Wearables handles provider-specific sync behavior internally. You trigger sync per provider using the appropriate endpoint, then read data through unified endpoints.

What happens if the same data syncs twice?

Records are deduplicated by external_id. Syncing the same data multiple times will not create duplicates.

Can I sync historical data for all providers?

It depends on the provider. Garmin has a dedicated historical sync endpoint covering up to 30 days. Suunto accepts since=0 for all available data. Whoop defaults to the last 30 days.

My users have Apple Watches. Can I sync Apple Health data via the API?

Apple Health requires the Open Wearables mobile SDK on iOS. Cloud-only sync is not available.

How do I handle a user who adds a second device?

Each provider connection is independent under the same user_id. Run OAuth for each provider and data from all of them will be available under that single user in the unified model.

Never miss an update

Stay updated with the latest in open wearables, developer tools, and health data integration.

Join our Community. No spam ever.