---
title: "Sync User Data"
method: POST
path: "/api/v1/providers/{provider}/users/{user_id}/sync"
tags: ["External: Data Sync"]
---

# Sync User Data

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

Synchronize data from fitness provider API for a specific user.

**Data Types:**
- `workouts`: Workouts/exercises/activities
- `247`: 24/7 data including sleep, recovery, and activity samples
- `all`: All available data types

**Provider-specific:**
- **Suunto**: Supports workouts and 247 data with pagination
- **Polar**: Supports workouts (exercises) only
- **Garmin**: Data arrives via webhooks (backfill for 30-day history)
- **Whoop**: Supports workouts and 247 data (sleep/recovery)

**Execution Mode:**
- `async=true` (default): Dispatches sync to background Celery worker. Returns immediately with task ID.
- `async=false`: Executes synchronously (may timeout for large data sets).

Requires valid API key and active connection for the user.

## Path parameters

- `provider` 'apple' | 'samsung' | 'garmin' | 'google' | 'polar' | 'suunto' | 'whoop' | 'strava' | 'oura' | 'fitbit' | 'ultrahuman' | 'sensorbio' | 'unknown' | 'internal', required — Supported data providers.
- `user_id` string, uuid, required

## Query parameters

- `data_type` 'workouts' | '247' | 'all' — Types of data to sync from provider.
- `since` integer — Unix timestamp to synchronize data since (0 = all, Suunto only)
- `limit` integer — Maximum number of items (Suunto: max 100)
- `offset` integer — Offset for pagination (Suunto only)
- `filter_by_modification_time` boolean — Filter by modification time instead of creation time (Suunto only)
- `samples` boolean — Synchronize sample data (Polar only)
- `zones` boolean — Synchronize zones data (Polar only)
- `route` boolean — Synchronize route data (Polar only)
- `summary_start_time` string, nullable — Activity start time as Unix timestamp or ISO 8601 date (Garmin only)
- `summary_end_time` string, nullable — Activity end time as Unix timestamp or ISO 8601 date (Garmin only)
- `async` boolean — Run sync asynchronously via Celery (default: true). Set false for sync.

## Headers

- `X-Open-Wearables-API-Key` string, nullable

## Response `200`

Successful Response

- object

## Other responses

- `422` — Validation Error

## Changes

- **2026-07-26** `e8a9270a1ee1` — 1 info
  - added the new enum value `sensorbio` to the `path` request parameter `provider`

[Change history](https://skmtc.dev/openwearables/apis/open-wearables-api/changes/api/v1/providers/:provider/users/:user_id/sync/post.md)

---

[API](https://skmtc.dev/openwearables/apis/open-wearables-api.md) · [All operations](https://skmtc.dev/openwearables/apis/open-wearables-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/openwearables/open-wearables-api/revisions/c1934e149569/schema)
