{
"code": "VALIDATION_ERROR",
"detail": "body.email: value is not a valid email address: An email address must have an @-sign. (and 1 more)",
"errors": [
{
"loc": [
"body",
"email"
],
"msg": "value is not a valid email address: An email address must have an @-sign.",
"type": "value_error"
},
{
"loc": [
"body",
"first_name"
],
"msg": "String should have at most 100 characters",
"type": "string_too_long"
}
],
"status": 422,
"title": "Unprocessable Content"
}
{
"code": "NOT_FOUND",
"detail": "User with ID: 123e4567-e89b-12d3-a456-426614174000 not found.",
"status": 404,
"title": "Not Found"
}
{
"code": "NOT_FOUND",
"detail": "User with ID: 123e4567-e89b-12d3-a456-426614174000 not found.",
"status": 404,
"title": "Not Found"
}
Mobile SDK
Get Sdk Sync Status
Where the user’s SDK sync for one provider stands, as the server sees it.
The server is the source of truth for sync progress; the device’s own state is only a
cache. Call this after login, before starting a sync, to restore that state:
historicalSyncCompleted: true - the historical export finished; only live sync is
left, continuing from syncedUntil.
historicalSyncCompleted: false - the export has not finished. It runs newest first, so
each type in dataTypes with historicalSyncCompleted: false resumes backwards from its
exportedRange.startDate. Types not listed have no data on the server yet.
historicalSyncCompleted: null - no historical export on record: nothing synced yet, or
an SDK version that does not send syncSessionId, so the server cannot tell. The same
applies per type in dataTypes.
syncedUntil: null and empty dataTypes - nothing synced yet; start a full export.
A user who has never synced gets that empty state with 200, not 404.
{
"code": "VALIDATION_ERROR",
"detail": "body.email: value is not a valid email address: An email address must have an @-sign. (and 1 more)",
"errors": [
{
"loc": [
"body",
"email"
],
"msg": "value is not a valid email address: An email address must have an @-sign.",
"type": "value_error"
},
{
"loc": [
"body",
"first_name"
],
"msg": "String should have at most 100 characters",
"type": "string_too_long"
}
],
"status": 422,
"title": "Unprocessable Content"
}
{
"code": "NOT_FOUND",
"detail": "User with ID: 123e4567-e89b-12d3-a456-426614174000 not found.",
"status": 404,
"title": "Not Found"
}
{
"code": "NOT_FOUND",
"detail": "User with ID: 123e4567-e89b-12d3-a456-426614174000 not found.",
"status": 404,
"title": "Not Found"
}
Whether a historical export for this provider has finished every data type it covered. False when one exists but has not finished. Null when there is no historical export on record: nothing synced yet, or an SDK version that does not send syncSessionId.
Data held per type from this provider. Empty when nothing has been synced yet.
Show child attributes
Was this page helpful?
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Open Wearables","colors":{"primary":"#2353C4","light":"#527DE3","dark":"#2353C4"},"logo":{"light":"https://mintcdn.com/momentum-64cd1fcc/a3MKkR50UjvA29DQ/logo/logo.svg?fit=max\u0026auto=format\u0026n=a3MKkR50UjvA29DQ\u0026q=85\u0026s=74c150d5692ca94e4341b4a2f9ea2345","dark":"https://mintcdn.com/momentum-64cd1fcc/a3MKkR50UjvA29DQ/logo/logo.svg?fit=max\u0026auto=format\u0026n=a3MKkR50UjvA29DQ\u0026q=85\u0026s=74c150d5692ca94e4341b4a2f9ea2345"},"favicon":"https://mintcdn.com/momentum-64cd1fcc/a3MKkR50UjvA29DQ/favicon.svg?fit=max\u0026auto=format\u0026n=a3MKkR50UjvA29DQ\u0026q=85\u0026s=aaeab13fa072f3519876da7c635374df","appearance":{"default":"light","strict":true},"background":{"color":{"light":"#FFFFFF","dark":"#FFFFFF"}},"navbar":{"links":[{"href":"https://github.com/the-momentum/open-wearables","label":"GitHub"}]},"footer":{"socials":{"github":"https://github.com/the-momentum/open-wearables","discord":"https://discord.gg/qrcfFnNE6H"}},"fonts":{"heading":{"family":"Switzer","weight":500,"source":"fonts/Switzer-Medium.woff2","format":"woff2"},"body":{"family":"Switzer","weight":400,"source":"fonts/Switzer-Regular.woff2","format":"woff2"}},"contextual":{"options":["copy","view","chatgpt","claude","perplexity","mcp","cursor","vscode"],"display":"header"},"styling":{"latex":true},"navigation":{"global":{"anchors":[{"anchor":"GitHub","icon":"github","href":"https://github.com/the-momentum/open-wearables"},{"anchor":"Discord","icon":"discord","href":"https://discord.gg/qrcfFnNE6H"},{"anchor":"Discussions","icon":"comments","href":"https://github.com/the-momentum/open-wearables/discussions"}]},"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"momentum-64cd1fcc","hasAudioNarration":false,"actualSubdomain":"momentum-64cd1fcc","customDomains":["openwearables.io"],"gitSource":{"type":"github","owner":"the-momentum","repo":"open-wearables","deployBranch":"main","contentDirectory":"docs","isPrivate":true,"mountPath":"","label":""},"feedback":{"thumbs":true},"entitlements":{},"buildId":"6aedb6b8b5c73ad147ee5b66","clientVersion":"0.0.4088","searchFilterCounts":[{"language":"default","tag":"API Reference","count":72},{"language":"default","tag":"Guides","count":54},{"language":"default","tag":"Mobile SDK","count":21},{"language":"default","tag":"Webhooks","count":10},{"language":"default","tag":"Integration Guides","count":8},{"language":"default","tag":"Developer Portal","count":8},{"language":"default","tag":"Events","count":8},{"language":"default","tag":"Settings","count":7},{"language":"default","tag":"Summaries","count":7},{"language":"default","tag":"Users","count":7}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"/docs","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-metadata","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"live-agents","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"comment-mode","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[{"filePath":"coverage.css","content":".ow-cov,.ow-cov-legend{--ow-cov-border: var(--ow-neutral-200);--ow-cov-border-soft: var(--ow-neutral-100);--ow-cov-bg: var(--ow-white);--ow-cov-bg-alt: var(--ow-neutral-50);--ow-cov-text: var(--ow-black);--ow-cov-muted: var(--ow-neutral-600);--ow-cov-chip: var(--ow-neutral-100);--ow-cov-dot-off: var(--ow-neutral-400);--ow-cov-dot-on: var(--ow-blue);--ow-cov-dot-ring: color-mix(in srgb, var(--ow-blue) 22%, transparent);font-size:0.8125rem;color:var(--ow-cov-text)}.ow-cov{overflow:auto;max-height:75vh;margin:0.5rem 0;border:1px solid var(--ow-cov-border);border-radius:0.6rem;background:var(--ow-cov-bg)}.ow-cov-table{display:table!important;overflow:visible!important;border-collapse:separate!important;border-spacing:0!important;table-layout:fixed!important;width:auto!important;min-width:100%;margin:0!important}.ow-cov-table thead{display:table-header-group!important}.ow-cov-table tbody{display:table-row-group!important}.ow-cov-table tr{display:table-row!important}.ow-cov-table th,.ow-cov-table td{display:table-cell!important;border:0!important;padding:0!important;background:var(--ow-cov-bg);font-weight:normal}.ow-cov-table thead th{position:sticky;top:0;z-index:2;border-bottom:1px solid var(--ow-cov-border)!important}.ow-cov-table thead th.ow-cov-sticky{z-index:3}.ow-cov-table .ow-cov-sticky{position:sticky;left:0;z-index:1;text-align:left!important;width:14rem!important;min-width:14rem!important;max-width:14rem!important;padding:0.35rem 0.75rem!important;border-right:1px solid var(--ow-cov-border)!important}.ow-cov-table .ow-cov-corner{vertical-align:bottom!important;color:var(--ow-cov-muted);font-size:0.7rem;font-weight:500;text-transform:uppercase;letter-spacing:0.04em;white-space:nowrap}.ow-cov-provider,.ow-cov-table td.y,.ow-cov-table td.n{width:1.9rem!important;min-width:1.9rem!important;max-width:1.9rem!important;text-align:center!important}.ow-cov-table .ow-cov-provider{height:5.6rem;vertical-align:bottom!important;padding:0 0 0.4rem!important}.ow-cov-vlabel{display:inline-block;writing-mode:vertical-rl;transform:rotate(180deg);color:var(--ow-cov-muted);font-size:0.72rem;font-weight:500;line-height:1;padding:0.25rem 0;white-space:nowrap}.ow-cov-table tbody td,.ow-cov-table tbody th{border-bottom:1px solid var(--ow-cov-border-soft)!important}.ow-cov-table tbody tr:last-child td,.ow-cov-table tbody tr:last-child th{border-bottom:0!important}.ow-cov-cat td{background:var(--ow-cov-bg-alt)!important;color:var(--ow-cov-muted);font-size:0.7rem;font-weight:600;text-transform:uppercase;letter-spacing:0.05em;padding:0.3rem 0.75rem!important}.ow-cov-metric{line-height:1.25}.ow-cov-metric code{font-size:0.72rem;background:transparent;border:0;padding:0;color:var(--ow-cov-text)}.ow-cov-unit{display:inline-block;margin-left:0.4rem;padding:0.05rem 0.3rem;border-radius:0.25rem;background:var(--ow-cov-chip);color:var(--ow-cov-muted);font-size:0.62rem;line-height:1.3;vertical-align:middle}.ow-cov-table td.y,.ow-cov-table td.n{vertical-align:middle!important;height:1.9rem}.ow-cov-table tbody tr:hover td,.ow-cov-table tbody tr:hover th{background:var(--ow-cov-bg-alt)}.ow-cov-table td.y::before,.ow-cov-table td.n::before,.ow-cov-dot{content:\"\";display:inline-block;width:0.5rem;height:0.5rem;border-radius:999px;background:var(--ow-cov-dot-off);vertical-align:middle}.ow-cov-table td.y::before,.ow-cov-dot.y{background:var(--ow-cov-dot-on);box-shadow:0 0 0 3px var(--ow-cov-dot-ring)}.ow-cov-legend{display:flex;flex-wrap:wrap;align-items:center;gap:1rem;margin:0.25rem 0 1rem;color:var(--ow-cov-muted);font-size:0.75rem}.ow-cov-legend .ow-cov-dot{margin-right:0.35rem}.ow-cov-table .ow-cov-label{font-weight:600}.ow-cov-table td.p,.ow-cov-table td.soon{width:1.9rem!important;min-width:1.9rem!important;max-width:1.9rem!important;text-align:center!important;vertical-align:middle!important;height:1.9rem}.ow-cov-table td.p::before,.ow-cov-table td.soon::before{content:\"\";display:inline-block;width:0.5rem;height:0.5rem;border-radius:999px;vertical-align:middle}.ow-cov-table td.p::before,.ow-cov-dot.p{background:linear-gradient(90deg, var(--ow-cov-dot-on) 50%, var(--ow-cov-dot-off) 50%);box-shadow:0 0 0 3px var(--ow-cov-dot-ring)}.ow-cov-table td.soon::before,.ow-cov-dot.soon{box-sizing:border-box;background:transparent;border:2px solid var(--ow-cov-dot-on)}.ow-cov-legend-col{flex-direction:column;align-items:flex-start;gap:0.4rem;margin:0}.ow-cov-legend b{color:var(--ow-cov-text);font-weight:600}.ow-cov-sr{position:absolute!important;width:1px!important;height:1px!important;padding:0!important;margin:-1px!important;overflow:hidden!important;clip:rect(0, 0, 0, 0)!important;white-space:nowrap!important;border:0!important}"},{"filePath":"brand.css","content":"@font-face{font-family:\"Fragment Mono\";src:url(\"/fonts/FragmentMono-Regular.woff2\") format(\"woff2\");font-weight:400;font-style:normal;font-display:swap}:root{--ow-blue: #2353c4;--ow-white: #ffffff;--ow-neutral-50: #f7f8fa;--ow-neutral-100: #ebeef2;--ow-neutral-200: #e6e8ec;--ow-neutral-300: #dfe2e6;--ow-neutral-400: #c6c8cc;--ow-neutral-500: #747678;--ow-neutral-600: #545454;--ow-neutral-700: #414141;--ow-neutral-800: #2c2c2c;--ow-neutral-900: #1a1a1a;--ow-black: #000000}:root:root{--gray-500: 84 84 84;--gray-600: 65 65 65;--gray-700: 44 44 44;--gray-800: 26 26 26;--gray-900: 0 0 0;--gray-950: 0 0 0}.prose :is(h1,h2,h3,h4){color:var(--ow-black)}img[src*=\"api.producthunt.com/widgets\"]{filter:saturate(3.1) hue-rotate(-5deg)}code,kbd,pre,samp{font-family:\"Fragment Mono\", ui-monospace, \"SFMono-Regular\", Menlo, monospace}"}],"page":{"pagePath":"api-reference/external:-mobile-sdk/get-sdk-sync-status","slug":"/api-reference/external:-mobile-sdk/get-sdk-sync-status","pageMetadata":{"title":"Get Sdk Sync Status","description":"Where the user's SDK sync for one provider stands, as the server sees it.\n\nThe server is the source of truth for sync progress; the device's own state is only a\ncache. Call this after login, before starting a sync, to restore that state:\n\n- `historicalSyncCompleted: true` - the historical export finished; only live sync is\n left, continuing from `syncedUntil`.\n- `historicalSyncCompleted: false` - the export has not finished. It runs newest first, so\n each type in `dataTypes` with `historicalSyncCompleted: false` resumes backwards from its\n `exportedRange.startDate`. Types not listed have no data on the server yet.\n- `historicalSyncCompleted: null` - no historical export on record: nothing synced yet, or\n an SDK version that does not send `syncSessionId`, so the server cannot tell. The same\n applies per type in `dataTypes`.\n- `syncedUntil: null` and empty `dataTypes` - nothing synced yet; start a full export.\n\nA user who has never synced gets that empty state with 200, not 404.","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/sdk/users/{user_id}/sync/status","href":"/api-reference/external:-mobile-sdk/get-sdk-sync-status","autogeneratedByOpenApi":true},"description":{"compiledSource":"\"use strict\";\nconst {Fragment: _Fragment, jsx: _jsx, jsxs: _jsxs} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n code: \"code\",\n li: \"li\",\n p: \"p\",\n ul: \"ul\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsxs(_Fragment, {\n children: [_jsx(_components.p, {\n children: \"Where the user’s SDK sync for one provider stands, as the server sees it.\"\n }), \"\\n\", _jsx(_components.p, {\n children: \"The server is the source of truth for sync progress; the device’s own state is only a\\ncache. Call this after login, before starting a sync, to restore that state:\"\n }), \"\\n\", _jsxs(_components.ul, {\n children: [\"\\n\", _jsxs(_components.li, {\n children: [_jsx(_components.code, {\n children: \"historicalSyncCompleted: true\"\n }), \" - the historical export finished; only live sync is\\nleft, continuing from \", _jsx(_components.code, {\n children: \"syncedUntil\"\n }), \".\"]\n }), \"\\n\", _jsxs(_components.li, {\n children: [_jsx(_components.code, {\n children: \"historicalSyncCompleted: false\"\n }), \" - the export has not finished. It runs newest first, so\\neach type in \", _jsx(_components.code, {\n children: \"dataTypes\"\n }), \" with \", _jsx(_components.code, {\n children: \"historicalSyncCompleted: false\"\n }), \" resumes backwards from its\\n\", _jsx(_components.code, {\n children: \"exportedRange.startDate\"\n }), \". Types not listed have no data on the server yet.\"]\n }), \"\\n\", _jsxs(_components.li, {\n children: [_jsx(_components.code, {\n children: \"historicalSyncCompleted: null\"\n }), \" - no historical export on record: nothing synced yet, or\\nan SDK version that does not send \", _jsx(_components.code, {\n children: \"syncSessionId\"\n }), \", so the server cannot tell. The same\\napplies per type in \", _jsx(_components.code, {\n children: \"dataTypes\"\n }), \".\"]\n }), \"\\n\", _jsxs(_components.li, {\n children: [_jsx(_components.code, {\n children: \"syncedUntil: null\"\n }), \" and empty \", _jsx(_components.code, {\n children: \"dataTypes\"\n }), \" - nothing synced yet; start a full export.\"]\n }), \"\\n\"]\n }), \"\\n\", _jsx(_components.p, {\n children: \"A user who has never synced gets that empty state with 200, not 404.\"\n })]\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){return _jsx(_Fragment,{})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Get Sdk Sync Status","description":"Where the user's SDK sync for one provider stands, as the server sees it.\n\nThe server is the source of truth for sync progress; the device's own state is only a\ncache. Call this after login, before starting a sync, to restore that state:\n\n- `historicalSyncCompleted: true` - the historical export finished; only live sync is\n left, continuing from `syncedUntil`.\n- `historicalSyncCompleted: false` - the export has not finished. It runs newest first, so\n each type in `dataTypes` with `historicalSyncCompleted: false` resumes backwards from its\n `exportedRange.startDate`. Types not listed have no data on the server yet.\n- `historicalSyncCompleted: null` - no historical export on record: nothing synced yet, or\n an SDK version that does not send `syncSessionId`, so the server cannot tell. The same\n applies per type in `dataTypes`.\n- `syncedUntil: null` and empty `dataTypes` - nothing synced yet; start a full export.\n\nA user who has never synced gets that empty state with 200, not 404.","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/sdk/users/{user_id}/sync/status","href":"/api-reference/external:-mobile-sdk/get-sdk-sync-status","autogeneratedByOpenApi":true}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"tags":["External: Mobile SDK"],"summary":"Get Sdk Sync Status","description":"Where the user's SDK sync for one provider stands, as the server sees it.\n\nThe server is the source of truth for sync progress; the device's own state is only a\ncache. Call this after login, before starting a sync, to restore that state:\n\n- `historicalSyncCompleted: true` - the historical export finished; only live sync is\n left, continuing from `syncedUntil`.\n- `historicalSyncCompleted: false` - the export has not finished. It runs newest first, so\n each type in `dataTypes` with `historicalSyncCompleted: false` resumes backwards from its\n `exportedRange.startDate`. Types not listed have no data on the server yet.\n- `historicalSyncCompleted: null` - no historical export on record: nothing synced yet, or\n an SDK version that does not send `syncSessionId`, so the server cannot tell. The same\n applies per type in `dataTypes`.\n- `syncedUntil: null` and empty `dataTypes` - nothing synced yet; start a full export.\n\nA user who has never synced gets that empty state with 200, not 404.","operationId":"get_sdk_sync_status_api_v1_sdk_users__user_id__sync_status_get","security":["7a743c43-91dd-48bd-9b34-11e6945448af"],"parameters":["c154a95b-d39e-4635-a360-c0c222cf0bb0","9459f7fe-da8c-4829-97a1-29e4eed97057","f44ec452-36c7-4616-8bd4-72f8dcda1e3a"],"responses":{"200":"681076b9-f602-4090-8678-46a7d08489ed","422":"dfe1032f-0692-4dd6-9a5b-ef663d4b07b1","4XX":"7d7b476f-de52-4b56-8d6a-84a4ffc05379","5XX":"ee33c935-8027-451f-9516-154a7c05b199"},"method":"get","type":"path","servers":[],"path":"/api/v1/sdk/users/{user_id}/sync/status","baseUrlOptions":[],"title":"Get Sdk Sync Status","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{"c154a95b-d39e-4635-a360-c0c222cf0bb0":{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id","isRequired":true,"uniqueKey":"","typeLabel":"string\u003cuuid>"}},"9459f7fe-da8c-4829-97a1-29e4eed97057":{"name":"provider","in":"query","required":true,"schema":{"type":"string","description":"SDK provider slug, e.g. `apple`, `samsung`, `health_connect`.","title":"Provider","isRequired":true,"uniqueKey":"","typeLabel":"string"},"description":"SDK provider slug, e.g. `apple`, `samsung`, `health_connect`."},"f44ec452-36c7-4616-8bd4-72f8dcda1e3a":{"name":"X-Open-Wearables-API-Key","in":"header","required":false,"schema":{"oneOf":[{"type":"string","title":"X-Open-Wearables-Api-Key","uniqueKey":"oneOf.0","typeLabel":"string"},{"type":"null","title":"X-Open-Wearables-Api-Key","uniqueKey":"oneOf.1","typeLabel":"null"}],"isRequired":false,"uniqueKey":"","typeLabel":"string | null"}}},"responses":{"681076b9-f602-4090-8678-46a7d08489ed":{"description":"Successful Response","content":{"application/json":{"schema":{"properties":{"provider":{"type":"string","title":"Provider","description":"Canonical SDK provider slug.","examples":["apple"],"isRequired":true,"uniqueKey":"provider","typeLabel":"string"},"historicalSyncCompleted":{"oneOf":[{"type":"boolean","title":"Historicalsynccompleted","description":"Whether a historical export for this provider has finished every data type it covered. False when one exists but has not finished. Null when there is no historical export on record: nothing synced yet, or an SDK version that does not send `syncSessionId`.","isRequired":true,"uniqueKey":"historicalSyncCompleted.oneOf.0","typeLabel":"boolean"},{"type":"null","title":"Historicalsynccompleted","description":"Whether a historical export for this provider has finished every data type it covered. False when one exists but has not finished. Null when there is no historical export on record: nothing synced yet, or an SDK version that does not send `syncSessionId`.","isRequired":true,"uniqueKey":"historicalSyncCompleted.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"historicalSyncCompleted","typeLabel":"boolean | null"},"syncedUntil":{"oneOf":[{"type":"string","title":"Synceduntil","description":"Newest data held from this provider, across all types: where live sync continues from. Null when nothing has been synced yet.","format":"date-time","example":"2026-11-01T22:15:00Z","isRequired":true,"uniqueKey":"syncedUntil.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","title":"Synceduntil","description":"Newest data held from this provider, across all types: where live sync continues from. Null when nothing has been synced yet.","example":"2026-11-01T22:15:00Z","isRequired":true,"uniqueKey":"syncedUntil.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"syncedUntil","typeLabel":"string\u003cdate-time> | null"},"dataTypes":{"items":{"properties":{"type":{"type":"string","title":"Type","description":"Canonical data type: a series type slug (e.g. `heart_rate`) or an event category (`sleep`, `workout`).","examples":["heart_rate"],"isRequired":true,"uniqueKey":"dataTypes.items.[INDEX].type","typeLabel":"string"},"kind":{"type":"string","enum":["series","score","profile","event","task"],"title":"DataTypeKind","description":"`series` for time series samples, `event` for sleep and workouts.","isRequired":true,"uniqueKey":"dataTypes.items.[INDEX].kind","typeLabel":"enum\u003cstring>"},"historicalSyncCompleted":{"oneOf":[{"type":"boolean","title":"Historicalsynccompleted","description":"Whether a historical export finished this type. When false, resume it backwards from `exportedRange.startDate`. Null when no historical export reported this type, e.g. on SDK versions that do not send `syncSessionId`.","isRequired":true,"uniqueKey":"dataTypes.items.[INDEX].historicalSyncCompleted.oneOf.0","typeLabel":"boolean"},{"type":"null","title":"Historicalsynccompleted","description":"Whether a historical export finished this type. When false, resume it backwards from `exportedRange.startDate`. Null when no historical export reported this type, e.g. on SDK versions that do not send `syncSessionId`.","isRequired":true,"uniqueKey":"dataTypes.items.[INDEX].historicalSyncCompleted.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"dataTypes.items.[INDEX].historicalSyncCompleted","typeLabel":"boolean | null"},"lastSyncedAt":{"type":"string","format":"date-time","title":"Lastsyncedat","description":"When data of this type was last written on the server. For data held before this was tracked, the time of its newest sample instead.","isRequired":true,"uniqueKey":"dataTypes.items.[INDEX].lastSyncedAt","typeLabel":"string\u003cdate-time>"},"coveredRange":{"properties":{"startDate":{"type":"string","format":"date-time","title":"Startdate","description":"Earliest timestamp in the span.","isRequired":true,"uniqueKey":"dataTypes.items.[INDEX].coveredRange.startDate","typeLabel":"string\u003cdate-time>"},"endDate":{"type":"string","format":"date-time","title":"Enddate","description":"Latest timestamp in the span.","isRequired":true,"uniqueKey":"dataTypes.items.[INDEX].coveredRange.endDate","typeLabel":"string\u003cdate-time>"}},"type":"object","required":["startDate","endDate"],"title":"CoveredRange","description":"Oldest and newest data held for this type from any sync. Gaps inside it are not shown, and retention moves its start forward, so it is no resume point.","isRequired":true,"uniqueKey":"dataTypes.items.[INDEX].coveredRange","typeLabel":"CoveredRange · object"},"exportedRange":{"oneOf":[{"type":"object","title":"CoveredRange","description":"What the latest historical export has sent of this type so far. The export runs newest first, so an unfinished type resumes backwards from `exportedRange.startDate`. Null when no export recorded a span, e.g. data synced before the server tracked it.","required":["startDate","endDate"],"properties":{"startDate":{"type":"string","format":"date-time","title":"Startdate","description":"Earliest timestamp in the span.","isRequired":true,"uniqueKey":"dataTypes.items.[INDEX].exportedRange.oneOf.0.startDate","typeLabel":"string\u003cdate-time>"},"endDate":{"type":"string","format":"date-time","title":"Enddate","description":"Latest timestamp in the span.","isRequired":true,"uniqueKey":"dataTypes.items.[INDEX].exportedRange.oneOf.0.endDate","typeLabel":"string\u003cdate-time>"}},"isRequired":true,"uniqueKey":"dataTypes.items.[INDEX].exportedRange.oneOf.0","typeLabel":"CoveredRange · object"},{"type":"null","description":"What the latest historical export has sent of this type so far. The export runs newest first, so an unfinished type resumes backwards from `exportedRange.startDate`. Null when no export recorded a span, e.g. data synced before the server tracked it.","isRequired":true,"uniqueKey":"dataTypes.items.[INDEX].exportedRange.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"dataTypes.items.[INDEX].exportedRange","typeLabel":"CoveredRange · object | null"}},"type":"object","required":["type","kind","historicalSyncCompleted","lastSyncedAt","coveredRange","exportedRange"],"title":"SDKDataTypeSyncState","description":"What the server holds for one data type from this provider.","uniqueKey":"dataTypes.items.[INDEX]","typeLabel":"SDKDataTypeSyncState · object"},"type":"array","title":"Datatypes","description":"Data held per type from this provider. Empty when nothing has been synced yet.","uniqueKey":"dataTypes","typeLabel":"SDKDataTypeSyncState · object[]"}},"type":"object","required":["provider","historicalSyncCompleted","syncedUntil"],"title":"SDKSyncState","description":"Where the server says a user's SDK sync for one provider stands.\n\nThe server is the source of truth: a device that lost its local state (e.g. after a\nlogout) reads this to know where to resume from.","uniqueKey":"","typeLabel":"SDKSyncState · object"},"examples":{"Example":{"title":"Example","value":{"provider":"apple","historicalSyncCompleted":true,"syncedUntil":"2026-11-01T22:15:00Z","dataTypes":[{"type":"heart_rate","kind":"series","historicalSyncCompleted":true,"lastSyncedAt":"2023-11-07T05:31:56Z","coveredRange":{"startDate":"2023-11-07T05:31:56Z","endDate":"2023-11-07T05:31:56Z"},"exportedRange":{"startDate":"2023-11-07T05:31:56Z","endDate":"2023-11-07T05:31:56Z"}}]}}},"exampleType":"generated"}},"exampleType":"generated"},"dfe1032f-0692-4dd6-9a5b-ef663d4b07b1":{"description":"Validation Error","content":{"application/problem+json":{"schema":{"description":"A 422 for a request that failed validation, listing every failure.","examples":[{"code":"VALIDATION_ERROR","detail":"body.email: value is not a valid email address: An email address must have an @-sign. (and 1 more)","errors":[{"loc":["body","email"],"msg":"value is not a valid email address: An email address must have an @-sign.","type":"value_error"},{"loc":["body","first_name"],"msg":"String should have at most 100 characters","type":"string_too_long"}],"status":422,"title":"Unprocessable Content"}],"properties":{"title":{"description":"HTTP status phrase","title":"Title","type":"string","isRequired":true,"uniqueKey":"title","typeLabel":"string"},"status":{"description":"HTTP status code, the same as the response's","title":"Status","type":"integer","isRequired":true,"uniqueKey":"status","typeLabel":"integer"},"detail":{"description":"Human-readable explanation of this occurrence","title":"Detail","type":"string","isRequired":true,"uniqueKey":"detail","typeLabel":"string"},"code":{"description":"Machine-readable error code, stable across releases","title":"Code","type":"string","isRequired":true,"uniqueKey":"code","typeLabel":"string"},"errors":{"description":"Every validation failure in the request","items":{"properties":{"loc":{"description":"Where the invalid value is, e.g. ['body', 'email']","items":{"oneOf":[{"type":"string","uniqueKey":"errors.items.[INDEX].loc.items.[INDEX].oneOf.0","typeLabel":"string"},{"type":"integer","uniqueKey":"errors.items.[INDEX].loc.items.[INDEX].oneOf.1","typeLabel":"integer"}],"uniqueKey":"errors.items.[INDEX].loc.items.[INDEX]","typeLabel":"string | integer"},"title":"Loc","type":"array","isRequired":true,"uniqueKey":"errors.items.[INDEX].loc","typeLabel":"(string | integer)[]"},"msg":{"description":"What is wrong with it","title":"Msg","type":"string","isRequired":true,"uniqueKey":"errors.items.[INDEX].msg","typeLabel":"string"},"type":{"description":"Pydantic error type, e.g. 'missing'","title":"Type","type":"string","isRequired":true,"uniqueKey":"errors.items.[INDEX].type","typeLabel":"string"}},"required":["loc","msg","type"],"title":"ValidationErrorItem","type":"object","uniqueKey":"errors.items.[INDEX]","typeLabel":"ValidationErrorItem · object"},"title":"Errors","type":"array","isRequired":true,"uniqueKey":"errors","typeLabel":"ValidationErrorItem · object[]"}},"required":["title","status","detail","code","errors"],"title":"ValidationProblem","type":"object","uniqueKey":"","typeLabel":"ValidationProblem · object"},"examples":{"Example":{"title":"Example","value":{"code":"VALIDATION_ERROR","detail":"body.email: value is not a valid email address: An email address must have an @-sign. (and 1 more)","errors":[{"loc":["body","email"],"msg":"value is not a valid email address: An email address must have an @-sign.","type":"value_error"},{"loc":["body","first_name"],"msg":"String should have at most 100 characters","type":"string_too_long"}],"status":422,"title":"Unprocessable Content"}}},"exampleType":"generated"}},"exampleType":"generated"},"7d7b476f-de52-4b56-8d6a-84a4ffc05379":{"description":"Client error","content":{"application/problem+json":{"schema":{"description":"An error response: RFC 9457 Problem Details, served as ``application/problem+json``.\n\n``type`` is omitted, which per the RFC means ``about:blank``: ``title`` is the status\nphrase, and ``code`` tells errors with the same status apart.","examples":[{"code":"NOT_FOUND","detail":"User with ID: 123e4567-e89b-12d3-a456-426614174000 not found.","status":404,"title":"Not Found"}],"properties":{"title":{"description":"HTTP status phrase","title":"Title","type":"string","isRequired":true,"uniqueKey":"title","typeLabel":"string"},"status":{"description":"HTTP status code, the same as the response's","title":"Status","type":"integer","isRequired":true,"uniqueKey":"status","typeLabel":"integer"},"detail":{"description":"Human-readable explanation of this occurrence","title":"Detail","type":"string","isRequired":true,"uniqueKey":"detail","typeLabel":"string"},"code":{"description":"Machine-readable error code, stable across releases","title":"Code","type":"string","isRequired":true,"uniqueKey":"code","typeLabel":"string"}},"required":["title","status","detail","code"],"title":"Problem","type":"object","uniqueKey":"","typeLabel":"Problem · object"},"examples":{"Example":{"title":"Example","value":{"code":"NOT_FOUND","detail":"User with ID: 123e4567-e89b-12d3-a456-426614174000 not found.","status":404,"title":"Not Found"}}},"exampleType":"generated"}},"exampleType":"generated"},"ee33c935-8027-451f-9516-154a7c05b199":{"description":"Server error","content":{"application/problem+json":{"schema":{"description":"An error response: RFC 9457 Problem Details, served as ``application/problem+json``.\n\n``type`` is omitted, which per the RFC means ``about:blank``: ``title`` is the status\nphrase, and ``code`` tells errors with the same status apart.","examples":[{"code":"NOT_FOUND","detail":"User with ID: 123e4567-e89b-12d3-a456-426614174000 not found.","status":404,"title":"Not Found"}],"properties":{"title":{"description":"HTTP status phrase","title":"Title","type":"string","isRequired":true,"uniqueKey":"title","typeLabel":"string"},"status":{"description":"HTTP status code, the same as the response's","title":"Status","type":"integer","isRequired":true,"uniqueKey":"status","typeLabel":"integer"},"detail":{"description":"Human-readable explanation of this occurrence","title":"Detail","type":"string","isRequired":true,"uniqueKey":"detail","typeLabel":"string"},"code":{"description":"Machine-readable error code, stable across releases","title":"Code","type":"string","isRequired":true,"uniqueKey":"code","typeLabel":"string"}},"required":["title","status","detail","code"],"title":"Problem","type":"object","uniqueKey":"","typeLabel":"Problem · object"},"examples":{"Example":{"title":"Example","value":{"code":"NOT_FOUND","detail":"User with ID: 123e4567-e89b-12d3-a456-426614174000 not found.","status":404,"title":"Not Found"}}},"exampleType":"generated"}},"exampleType":"generated"}},"security":{"7a743c43-91dd-48bd-9b34-11e6945448af":{"OAuth2PasswordBearer":{"type":"oauth2","flows":{"password":{"scopes":{},"tokenUrl":"/api/v1/auth/login"}},"scopes":[],"schemeName":"OAuth2PasswordBearer"}}},"servers":{},"processedSecurityOptions":[{"schemes":[{"scheme":{"type":"oauth2","flows":{"password":{"scopes":{},"tokenUrl":"/api/v1/auth/login"}},"scopes":[],"schemeName":"OAuth2PasswordBearer"},"schema":{"title":"OAuth2 Auth","type":"string","isRequired":true,"description":"The access token received from the authorization server in the OAuth 2.0 flow.","format":"bearer","typeLabel":"string\u003cbearer>","deprecated":false},"schemeName":"OAuth2PasswordBearer","name":"Authorization"}],"title":"OAuth2PasswordBearer"}]},"originalFileLocation":"openapi.json"},"subdomain":"momentum-64cd1fcc","siteName":"Open Wearables","title":"Get Sdk Sync Status - Open Wearables","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-11-06T11:15:12.106Z","originalFileLocation":"api-reference/external:-mobile-sdk/get-sdk-sync-status.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=\"light\";if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"light\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Where the user\u0026#x27;s SDK sync for one provider stands, as the server sees it. The server is the source of truth for sync progress; the device\u0026#x27;s own state is only a cache. Call this after login, before starting a sync, to restore that state: - historicalSyncCompleted: true - the historical export finished; only live sync is left, continuing from syncedUntil. - historicalSyncCompleted: false - the export has not finished. It runs newest first, so each type in dataTypes with historicalSyncCompleted: false resumes backwards from its exportedRange.startDate. Types not listed have no data on the server yet. - historicalSyncCompleted: null - no historical export on record: nothing synced yet, or an SDK version that does not send syncSessionId, so the server cannot tell. The same applies per type in dataTypes. - syncedUntil: null and empty dataTypes - nothing synced yet; start a full export. A user who has never synced gets that empty state with 200, not 404.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Open Wearables\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/docs/mintlify-assets/_mintlify/favicons/momentum-64cd1fcc/AJA6dT81dSa53ch1/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/docs/mintlify-assets/_mintlify/favicons/momentum-64cd1fcc/AJA6dT81dSa53ch1/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/docs/mintlify-assets/_mintlify/favicons/momentum-64cd1fcc/AJA6dT81dSa53ch1/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/docs/mintlify-assets/_mintlify/favicons/momentum-64cd1fcc/AJA6dT81dSa53ch1/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/docs/mintlify-assets/_mintlify/favicons/momentum-64cd1fcc/AJA6dT81dSa53ch1/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/docs/mintlify-assets/_mintlify/favicons/momentum-64cd1fcc/AJA6dT81dSa53ch1/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/docs/mintlify-assets/_mintlify/favicons/momentum-64cd1fcc/AJA6dT81dSa53ch1/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/docs/mintlify-assets/_mintlify/favicons/momentum-64cd1fcc/AJA6dT81dSa53ch1/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/docs/mintlify-assets/_mintlify/favicons/momentum-64cd1fcc/AJA6dT81dSa53ch1/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Get Sdk Sync Status - Open Wearables\">\u003cmeta data-mint-head property=\"og:description\" content=\"Where the user\u0026#x27;s SDK sync for one provider stands, as the server sees it. The server is the source of truth for sync progress; the device\u0026#x27;s own state is only a cache. Call this after login, before starting a sync, to restore that state: - historicalSyncCompleted: true - the historical export finished; only live sync is left, continuing from syncedUntil. - historicalSyncCompleted: false - the export has not finished. It runs newest first, so each type in dataTypes with historicalSyncCompleted: false resumes backwards from its exportedRange.startDate. Types not listed have no data on the server yet. - historicalSyncCompleted: null - no historical export on record: nothing synced yet, or an SDK version that does not send syncSessionId, so the server cannot tell. The same applies per type in dataTypes. - syncedUntil: null and empty dataTypes - nothing synced yet; start a full export. A user who has never synced gets that empty state with 200, not 404.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Open Wearables\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://openwearables.io/docs/api-reference/external:-mobile-sdk/get-sdk-sync-status\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://momentum-64cd1fcc.mintlify.site/docs/_mintlify/api/og/v2?division=Mobile+SDK\u0026amp;title=Get+Sdk+Sync+Status\u0026amp;description=Where+the+user%27s+SDK+sync+for+one+provider+stands%2C+as+the+server+sees+it.%0A%0AThe+server+is+the+source+of+truth+for+sync+progress%3B+the+device%27s+own+state+is+only+a\u0026amp;theme=ac319c86ce4f8033de0d43ea\u0026amp;signature=43a9e6f217578150d597efd140fb4ce11172584d14ff886cb9567201d544a757\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Get Sdk Sync Status - Open Wearables\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Where the user\u0026#x27;s SDK sync for one provider stands, as the server sees it. The server is the source of truth for sync progress; the device\u0026#x27;s own state is only a cache. Call this after login, before starting a sync, to restore that state: - historicalSyncCompleted: true - the historical export finished; only live sync is left, continuing from syncedUntil. - historicalSyncCompleted: false - the export has not finished. It runs newest first, so each type in dataTypes with historicalSyncCompleted: false resumes backwards from its exportedRange.startDate. Types not listed have no data on the server yet. - historicalSyncCompleted: null - no historical export on record: nothing synced yet, or an SDK version that does not send syncSessionId, so the server cannot tell. The same applies per type in dataTypes. - syncedUntil: null and empty dataTypes - nothing synced yet; start a full export. A user who has never synced gets that empty state with 200, not 404.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://momentum-64cd1fcc.mintlify.site/docs/_mintlify/api/og/v2?division=Mobile+SDK\u0026amp;title=Get+Sdk+Sync+Status\u0026amp;description=Where+the+user%27s+SDK+sync+for+one+provider+stands%2C+as+the+server+sees+it.%0A%0AThe+server+is+the+source+of+truth+for+sync+progress%3B+the+device%27s+own+state+is+only+a\u0026amp;theme=ac319c86ce4f8033de0d43ea\u0026amp;signature=43a9e6f217578150d597efd140fb4ce11172584d14ff886cb9567201d544a757\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/docs/mintlify-assets/_mintlify/favicons/momentum-64cd1fcc/AJA6dT81dSa53ch1/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Open Wearables\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#2353C4\">\u003clink data-mint-head rel=\"canonical\" href=\"https://openwearables.io/docs/api-reference/external:-mobile-sdk/get-sdk-sync-status\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/docs/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/docs/api-reference/external%3A-mobile-sdk/get-sdk-sync-status.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://openwearables.io/#organization\",\"name\":\"Open Wearables\",\"url\":\"https://openwearables.io\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/momentum-64cd1fcc/a3MKkR50UjvA29DQ/logo/logo.svg?fit=max\u0026auto=format\u0026n=a3MKkR50UjvA29DQ\u0026q=85\u0026s=74c150d5692ca94e4341b4a2f9ea2345\"}},{\"@type\":\"WebSite\",\"@id\":\"https://openwearables.io/docs#website\",\"name\":\"Open Wearables\",\"url\":\"https://openwearables.io/docs\",\"publisher\":{\"@id\":\"https://openwearables.io/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://openwearables.io/docs/api-reference/external:-mobile-sdk/get-sdk-sync-status#webpage\",\"url\":\"https://openwearables.io/docs/api-reference/external:-mobile-sdk/get-sdk-sync-status\",\"name\":\"Get Sdk Sync Status\",\"description\":\"Where the user's SDK sync for one provider stands, as the server sees it. The server is the source of truth for sync progress; the device's own state is only a cache. Call this after login, before starting a sync, to restore that state: - historicalSyncCompleted: true - the historical export finished; only live sync is left, continuing from syncedUntil. - historicalSyncCompleted: false - the export has not finished. It runs newest first, so each type in dataTypes with historicalSyncCompleted: false resumes backwards from its exportedRange.startDate. Types not listed have no data on the server yet. - historicalSyncCompleted: null - no historical export on record: nothing synced yet, or an SDK version that does not send syncSessionId, so the server cannot tell. The same applies per type in dataTypes. - syncedUntil: null and empty dataTypes - nothing synced yet; start a full export. A user who has never synced gets that empty state with 200, not 404.\",\"dateModified\":\"2026-11-06T11:15:12.106Z\",\"isPartOf\":{\"@id\":\"https://openwearables.io/docs#website\"},\"breadcrumb\":{\"@id\":\"https://openwearables.io/docs/api-reference/external:-mobile-sdk/get-sdk-sync-status#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://openwearables.io/docs/api-reference/external:-mobile-sdk/get-sdk-sync-status#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Mobile SDK\",\"item\":\"https://openwearables.io/docs/api-reference/external:-mobile-sdk/sync-sdk-data\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Get Sdk Sync Status\",\"item\":\"https://openwearables.io/docs/api-reference/external:-mobile-sdk/get-sdk-sync-status\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://openwearables.io/docs/api-reference/external:-mobile-sdk/get-sdk-sync-status#apireference\",\"headline\":\"Get Sdk Sync Status\",\"name\":\"Get Sdk Sync Status\",\"description\":\"Where the user's SDK sync for one provider stands, as the server sees it. The server is the source of truth for sync progress; the device's own state is only a cache. Call this after login, before starting a sync, to restore that state: - historicalSyncCompleted: true - the historical export finished; only live sync is left, continuing from syncedUntil. - historicalSyncCompleted: false - the export has not finished. It runs newest first, so each type in dataTypes with historicalSyncCompleted: false resumes backwards from its exportedRange.startDate. Types not listed have no data on the server yet. - historicalSyncCompleted: null - no historical export on record: nothing synced yet, or an SDK version that does not send syncSessionId, so the server cannot tell. The same applies per type in dataTypes. - syncedUntil: null and empty dataTypes - nothing synced yet; start a full export. A user who has never synced gets that empty state with 200, not 404.\",\"url\":\"https://openwearables.io/docs/api-reference/external:-mobile-sdk/get-sdk-sync-status\",\"mainEntityOfPage\":{\"@id\":\"https://openwearables.io/docs/api-reference/external:-mobile-sdk/get-sdk-sync-status#webpage\"},\"dateModified\":\"2026-11-06T11:15:12.106Z\",\"publisher\":{\"@id\":\"https://openwearables.io/#organization\"},\"isPartOf\":{\"@id\":\"https://openwearables.io/docs#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Open Wearables\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Open Wearables","nav":{"global":{"anchors":[{"anchor":"GitHub","icon":"github","href":"https://github.com/the-momentum/open-wearables"},{"anchor":"Discord","icon":"discord","href":"https://discord.gg/qrcfFnNE6H"},{"anchor":"Discussions","icon":"comments","href":"https://github.com/the-momentum/open-wearables/discussions"}]},"tabs":[{"tab":"Guides","pages":[{"title":"Guides","href":""}]},{"tab":"API Reference","groups":[{"group":"Overview","pages":[{"title":"Open Wearables API Reference","sidebarTitle":"Introduction","href":"/api-reference/introduction"}]},{"group":"Integration Guides","pages":[{"title":"Wearable API Integration Guide","sidebarTitle":"Quick Integration","href":"/api-reference/guides/quick-integration"},{"title":"Outgoing Webhooks","sidebarTitle":"Outgoing Webhooks","href":"/api-reference/guides/webhooks"},{"title":"Provider Webhook Subscriptions","sidebarTitle":"Provider Webhook Subscriptions","href":"/api-reference/guides/provider-webhook-subscriptions"},{"title":"Live Sync Status (SSE)","sidebarTitle":"Live Sync Status","href":"/api-reference/guides/sync-status-stream"},{"title":"Workout Statistics","href":"/api-reference/guides/workout-statistics"},{"title":"Import Apple Health XML Export","href":"/api-reference/guides/apple-xml-import"},{"title":"Wearable Provider Setup and Sync Guide","sidebarTitle":"Provider Setup","href":"/api-reference/guides/provider-setup"},{"title":"API Error Handling","href":"/api-reference/guides/error-handling"}]},{"group":"Authentication","pages":[{"title":"Refresh Token","deprecated":null,"version":null,"openapi":"/openapi.json post /api/v1/token/refresh","href":"/api-reference/external:-token/refresh-token"},{"title":"Revoke Refresh Token","deprecated":null,"version":null,"openapi":"/openapi.json post /api/v1/token/revoke","href":"/api-reference/external:-token/revoke-refresh-token"}]},{"group":"Users","pages":[{"title":"List Users","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/users","href":"/api-reference/external:-users/list-users"},{"title":"Create User","deprecated":null,"version":null,"openapi":"/openapi.json post /api/v1/users","href":"/api-reference/external:-users/create-user"},{"title":"Get User","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/users/{user_id}","href":"/api-reference/external:-users/get-user"},{"title":"Update User","deprecated":null,"version":null,"openapi":"/openapi.json patch /api/v1/users/{user_id}","href":"/api-reference/external:-users/update-user"},{"title":"Get Personal Record","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/users/{user_id}/personal-record","href":"/api-reference/external:-users/get-personal-record"},{"title":"Put Personal Record","deprecated":null,"version":null,"openapi":"/openapi.json put /api/v1/users/{user_id}/personal-record","href":"/api-reference/external:-users/put-personal-record"},{"title":"Delete User","deprecated":null,"version":null,"openapi":"/openapi.json delete /api/v1/users/{user_id}","href":"/api-reference/external:-users/delete-user"}]},{"group":"Connections","pages":[{"title":"Get Connections Endpoint","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/users/{user_id}/connections","href":"/api-reference/external:-connections/get-connections-endpoint"},{"title":"Disconnect Provider Endpoint","deprecated":null,"version":null,"openapi":"/openapi.json delete /api/v1/users/{user_id}/connections/{provider}","href":"/api-reference/external:-connections/disconnect-provider-endpoint"},{"title":"Delete Provider Data Endpoint","deprecated":null,"version":null,"openapi":"/openapi.json delete /api/v1/users/{user_id}/connections/{provider}/data","href":"/api-reference/external:-connections/delete-provider-data-endpoint"}]},{"group":"Providers","pages":[{"title":"Get Providers","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/oauth/providers","href":"/api-reference/external:-providers/get-providers"},{"title":"Get Provider Authorization URL","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/oauth/{provider}/authorize","href":"/api-reference/external:-providers/get-provider-authorization-url"}]},{"group":"Data Sync","pages":[{"title":"Sync User Data","deprecated":null,"version":null,"openapi":"/openapi.json post /api/v1/providers/{provider}/users/{user_id}/sync","href":"/api-reference/external:-data-sync/sync-user-data"},{"title":"Get Garmin Backfill Status Endpoint","deprecated":true,"version":null,"openapi":"/openapi.json get /api/v1/providers/garmin/users/{user_id}/backfill/status","href":"/api-reference/external:-data-sync/get-garmin-backfill-status-endpoint"},{"title":"Sync Historical Data","deprecated":null,"version":null,"openapi":"/openapi.json post /api/v1/providers/{provider}/users/{user_id}/sync/historical","href":"/api-reference/external:-data-sync/sync-historical-data"}]},{"group":"Summaries","pages":[{"title":"Get Activity Summary","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/users/{user_id}/summaries/activity","href":"/api-reference/external:-summaries/get-activity-summary"},{"title":"Get Activity Totals","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/users/{user_id}/summaries/activity/totals","href":"/api-reference/external:-summaries/get-activity-totals"},{"title":"Get Sleep Summary","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/users/{user_id}/summaries/sleep","href":"/api-reference/external:-summaries/get-sleep-summary"},{"title":"Get Body Summary","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/users/{user_id}/summaries/body","href":"/api-reference/external:-summaries/get-body-summary"},{"title":"Get Recovery Summary","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/users/{user_id}/summaries/recovery","href":"/api-reference/external:-summaries/get-recovery-summary"},{"title":"Get Data Summary","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/users/{user_id}/summaries/data","href":"/api-reference/external:-summaries/get-data-summary"},{"title":"Get Data Timeline","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/users/{user_id}/summaries/data/timeline","href":"/api-reference/external:-summaries/get-data-timeline"}]},{"group":"Timeseries","pages":[{"title":"Get Timeseries","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/users/{user_id}/timeseries","href":"/api-reference/external:-timeseries/get-timeseries"}]},{"group":"Events","pages":[{"title":"List Workouts","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/users/{user_id}/events/workouts","href":"/api-reference/external:-events/list-workouts"},{"title":"Get Workout Totals","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/users/{user_id}/events/workouts/totals","href":"/api-reference/external:-events/get-workout-totals"},{"title":"Delete Workout","deprecated":null,"version":null,"openapi":"/openapi.json delete /api/v1/users/{user_id}/events/workouts/{workout_id}","href":"/api-reference/external:-events/delete-workout"},{"title":"List Sleep Sessions","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/users/{user_id}/events/sleep","href":"/api-reference/external:-events/list-sleep-sessions"},{"title":"Get Sleep Totals","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/users/{user_id}/events/sleep/totals","href":"/api-reference/external:-events/get-sleep-totals"},{"title":"Delete Sleep Session","deprecated":null,"version":null,"openapi":"/openapi.json delete /api/v1/users/{user_id}/events/sleep/{sleep_id}","href":"/api-reference/external:-events/delete-sleep-session"},{"title":"List Meals","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/users/{user_id}/events/meals","href":"/api-reference/external:-events/list-meals"},{"title":"Delete Meal","deprecated":null,"version":null,"openapi":"/openapi.json delete /api/v1/users/{user_id}/events/meals/{meal_id}","href":"/api-reference/external:-events/delete-meal"}]},{"group":"Health Scores","pages":[{"title":"List Health Scores","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/users/{user_id}/health-scores","href":"/api-reference/external:-health-scores/list-health-scores"}]},{"group":"Data Sources","pages":[{"title":"Get user data sources","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/users/{user_id}/data-sources","href":"/api-reference/external:-data-sources/get-user-data-sources"}]},{"group":"Meta","pages":[{"title":"Provider data coverage matrix","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/meta/coverage","href":"/api-reference/external:-meta/provider-data-coverage-matrix"}]},{"group":"Apple Health Import","pages":[{"title":"Import Xml Presigned Url","deprecated":null,"version":null,"openapi":"/openapi.json post /api/v1/users/{user_id}/import/apple/xml/s3","href":"/api-reference/external:-apple-health-import/import-xml-presigned-url"},{"title":"Create Multipart Upload","deprecated":null,"version":null,"openapi":"/openapi.json post /api/v1/users/{user_id}/import/apple/xml/s3/multipart/create","href":"/api-reference/external:-apple-health-import/create-multipart-upload"},{"title":"Sign Multipart Parts","deprecated":null,"version":null,"openapi":"/openapi.json post /api/v1/users/{user_id}/import/apple/xml/s3/multipart/sign","href":"/api-reference/external:-apple-health-import/sign-multipart-parts"},{"title":"Complete Multipart Upload","deprecated":null,"version":null,"openapi":"/openapi.json post /api/v1/users/{user_id}/import/apple/xml/s3/multipart/complete","href":"/api-reference/external:-apple-health-import/complete-multipart-upload"},{"title":"Abort Multipart Upload","deprecated":null,"version":null,"openapi":"/openapi.json post /api/v1/users/{user_id}/import/apple/xml/s3/multipart/abort","href":"/api-reference/external:-apple-health-import/abort-multipart-upload"},{"title":"Import Xml File","deprecated":null,"version":null,"openapi":"/openapi.json post /api/v1/users/{user_id}/import/apple/xml/direct","href":"/api-reference/external:-apple-health-import/import-xml-file"}]},{"group":"Mobile SDK","pages":[{"title":"Sync Sdk Data","description":"Import health data from SDK provider asynchronously via Celery.\n\nSupports Apple HealthKit and Samsung Health SDK formats (identical payloads):\n```json\n{\n \"provider\": \"apple\",\n \"sdkVersion\": \"1.0.0\",\n \"syncTimestamp\": \"2021-01-01T00:00:00Z\",\n \"data\": {\n \"records\": [...],\n \"sleep\": [...],\n \"workouts\": [...]\n }\n}\n```\n\nArgs:\n user_id: SDK user identifier\n body: Health data payload\n auth: SDK authentication (Bearer token or API key)\n\nReturns:\n UploadDataResponse with 202 status and task queued message\n\nRaises:\n HTTPException: 403 if token doesn't match user_id, 400 if provider unsupported.\n Payload validation runs async in the worker, not here.","deprecated":null,"version":null,"openapi":"/openapi.json post /api/v1/sdk/users/{user_id}/sync","href":"/api-reference/external:-mobile-sdk/sync-sdk-data"},{"title":"Get Sdk Sync Status","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/sdk/users/{user_id}/sync/status","href":"/api-reference/external:-mobile-sdk/get-sdk-sync-status"},{"title":"Create User Token","description":"Exchange app credentials or admin auth for user-scoped access token.\n\nSupports two authentication methods:\n1. App credentials: Provide app_id and app_secret in the request body\n2. Admin authentication: Authenticate as a developer/admin via Bearer token\n (app_id and app_secret can be omitted)\n\nBoth methods return access_token with refresh_token.\n\nReturns a JWT token scoped to SDK endpoints only.\nTokens expire after configured time (default: 60 minutes).\n\nArgs:\n user_id: OpenWearables User ID (UUID)\n payload: Optional application credentials (app_id, app_secret)\n db: Database session\n developer: Optional authenticated developer (from Bearer token)\n\nReturns:\n TokenResponse containing access_token, token_type, and refresh_token\n\nRaises:\n 401: If app credentials are invalid or admin auth is missing\n 400: If neither app credentials nor admin auth is provided","deprecated":null,"version":null,"openapi":"/openapi.json post /api/v1/users/{user_id}/token","href":"/api-reference/external:-mobile-sdk/create-user-token"},{"title":"Generate Invitation Code","deprecated":null,"version":null,"openapi":"/openapi.json post /api/v1/users/{user_id}/invitation-code","href":"/api-reference/external:-mobile-sdk/generate-invitation-code"},{"title":"Redeem Invitation Code","deprecated":null,"version":null,"openapi":"/openapi.json post /api/v1/invitation-code/redeem","href":"/api-reference/external:-mobile-sdk/redeem-invitation-code"}]},{"group":"Webhooks","pages":[{"title":"List Event Types","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/webhooks/event-types","href":"/api-reference/external:-webhooks/list-event-types"},{"title":"Create Endpoint","deprecated":null,"version":null,"openapi":"/openapi.json post /api/v1/webhooks/endpoints","href":"/api-reference/external:-webhooks/create-endpoint"},{"title":"List Endpoints","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/webhooks/endpoints","href":"/api-reference/external:-webhooks/list-endpoints"},{"title":"Get Endpoint","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/webhooks/endpoints/{endpoint_id}","href":"/api-reference/external:-webhooks/get-endpoint"},{"title":"Update Endpoint","deprecated":null,"version":null,"openapi":"/openapi.json patch /api/v1/webhooks/endpoints/{endpoint_id}","href":"/api-reference/external:-webhooks/update-endpoint"},{"title":"Delete Endpoint","deprecated":null,"version":null,"openapi":"/openapi.json delete /api/v1/webhooks/endpoints/{endpoint_id}","href":"/api-reference/external:-webhooks/delete-endpoint"},{"title":"Get Endpoint Secret","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/webhooks/endpoints/{endpoint_id}/secret","href":"/api-reference/external:-webhooks/get-endpoint-secret"},{"title":"Send Test Event","deprecated":null,"version":null,"openapi":"/openapi.json post /api/v1/webhooks/endpoints/{endpoint_id}/test","href":"/api-reference/external:-webhooks/send-test-event"},{"title":"List Messages","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/webhooks/messages","href":"/api-reference/external:-webhooks/list-messages"},{"title":"List Endpoint Attempts","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/webhooks/endpoints/{endpoint_id}/attempts","href":"/api-reference/external:-webhooks/list-endpoint-attempts"}]},{"group":"Sync Status","pages":[{"title":"Stream User Sync Status","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/users/{user_id}/sync/stream","href":"/api-reference/external:-sync-status/stream-user-sync-status"},{"title":"List Recent Sync Events","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/users/{user_id}/sync/recent","href":"/api-reference/external:-sync-status/list-recent-sync-events"},{"title":"List Sync Run Summaries","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/users/{user_id}/sync/runs","href":"/api-reference/external:-sync-status/list-sync-run-summaries"},{"title":"List All Sync Run Summaries","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/sync/runs","href":"/api-reference/external:-sync-status/list-all-sync-run-summaries"},{"title":"List Stored Sync Runs","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/users/{user_id}/sync/history","href":"/api-reference/external:-sync-status/list-stored-sync-runs"},{"title":"Get Stored Sync Run","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/sync/history/{run_key}","href":"/api-reference/external:-sync-status/get-stored-sync-run"}]}]}]},"basePath":"","title":"Get Sdk Sync Status - Open Wearables","buildId":"dpl_6dVqRXFR2Go5vF5RLvAdHuv189oT","deploymentId":"dpl_6dVqRXFR2Go5vF5RLvAdHuv189oT","dynamics":["c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["OpenApiReferenceProvider-D_7my4bd.js","utils-Cq_itTNA.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-B5KPEvGz.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-DBX-JepP.js","snippetPresets-Bsspz-Ge.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","conditional-requirements-CFM0id0Q.js","ApiExamples-jcs-2nGf.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-Dp53in7F.js","shallow-Dv9eUdUd.js","getApiPlaygroundDisplay-D8cDwNhi.js","CodeSnippet-DkwXLQor.js","CodeSnippets-DcSgKqs5.js","Page-t8ynOKTD.js","getPastedJson-I2RjoApV.js","icon-BIj57rZC.js","MethodPill-CTwLPWXC.js","DuplicateIcon-BJpFwygY.js","createIcon-C7PorfAe.js","DynamicMarkdown-BBht_uEs.js","SectionHeading-YIBwxbzj.js","axios-vUo_bRtp.js","Markdown--YCeFtOs.js","clsx-CrPa459s.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-BWxsj3I0.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-fBzVvq7k.js"]}