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_idare not duplicated. - Garmin is webhook-only. Do not use the generic
/syncendpoint 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
- How to integrate Apple Health data into your app
- Garmin Connect API: developer guide
- Building a health app with Whoop API data
- Wearable API integration: comparing SaaS, custom build, and open source
- How to integrate Strava without building OAuth from scratch
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.