---
title: "List Stored Sync Runs"
method: GET
path: "/api/v1/users/{user_id}/sync/history"
tags: ["External: Sync Status"]
---

# List Stored Sync Runs

`GET /api/v1/users/{user_id}/sync/history`

Stored sync runs for a user, newest first.

Unlike /sync/runs this reads from the database rather than the Redis event buffer,
so it is not limited to the last 24 hours. Only historical runs are stored by default.
Use /sync/history/{run_key} for the per-data-type breakdown.

`since` filters on when a run executed. `covered_from` / `covered_to` filter on the span
of data it was meant to cover, which is what answers "what ran that was supposed to cover
March" — a backfill started yesterday covering March matches. A run matches when its own
window overlaps the range or when any of its data types covered a span that does; runs
with no recorded window on either level are excluded, since overlap is undecidable.

## Path parameters

- `user_id` string, uuid, required

## Query parameters

- `limit` integer
- `scope` 'historical' | 'live' — Whether the run backfills history or delivers current data.
- `since` string, date-time, nullable — Only runs started at or after this time.
- `provider` string, nullable — Filter by provider name.
- `covered_from` string, date-time, nullable — Only runs whose covered data window ends after this time.
- `covered_to` string, date-time, nullable — Only runs whose covered data window starts before this time.

## Headers

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

## Response `200`

Successful Response

- SyncRunRecord[]
  - `run_key` string, required
  - `user_id` string, uuid, required
  - `provider` string, required
  - `source` 'pull' | 'webhook' | 'sdk' | 'backfill' | 'xml_import' | 'linked_account', required — How the sync was initiated / what transport delivers data.
  - `scope` 'historical' | 'live', required — Whether the run backfills history or delivers current data.
  - `status` 'in_progress' | 'success' | 'partial' | 'failed' | 'cancelled' | 'skipped' | 'unfinished' | 'stale', required — Overall outcome state for the run.
  - `trace_id` string, nullable
  - `window_start` string, date-time, nullable
  - `window_end` string, date-time, nullable
  - `started_at` string, date-time, required
  - `ended_at` string, date-time, nullable
  - `items_inserted` integer
  - `items_updated` integer
  - `error` string, nullable

## Other responses

- `422` — Validation Error

## Changes

- **2026-09-08** `4e61b8720ebb` — 1 info
  - endpoint added

[Change history](https://skmtc.dev/openwearables/apis/open-wearables-api/changes/api/v1/users/:user_id/sync/history/get.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.dev/openwearables/apis/open-wearables-api/revisions/6962739bc168?raw)
