{
"code": "bad_request",
"message": "'id' must be a valid UUID",
"trace_id": "550e8400-e29b-41d4-a716-446655440000"
}
{
"code": "unauthorized",
"message": "Invalid or missing API key",
"trace_id": "550e8400-e29b-41d4-a716-446655440000"
}
{
"code": "rate_limit_exceeded",
"message": "Rate limit exceeded. Maximum 1000 requests per 60 seconds.",
"trace_id": "550e8400-e29b-41d4-a716-446655440000"
}
Sync Requests
Request a re-sync of several resources in one call
Queues up to 25 on-demand re-syncs in one round trip. Kinds may be mixed. Each item is processed independently and under the SAME guardrails as POST /sync-requests — its own scope check and its own 5-minute per-resource cooldown (30 per connector for appointments). Best-effort, not atomic: the 202 says the batch was processed, not that every item queued. Each result carries either request (queued, including resourceUpdatedAt) or error (the status and message the single-resource endpoint would have returned — 500 among them, scoped to the one item rather than failing the request, plus a batch-only 503 when the batch hit its time budget before that item was started: a 503 item ran nothing and holds no cooldown, so retry it in a smaller batch), never both — an item refused by its cooldown does not affect the others. Results come back in the order sent, with resourceId echoed verbatim. Poll each queued item’s GET /sync-requests/{id} as usual; the sync_request.completed webhook fires once PER ITEM, not per batch. The response is held until every item has been dispatched, so it can take several seconds. More than the maximum is a 400 naming the limit, never a silent truncation.
POST
/
sync-requests
/
batch
Request a re-sync of several resources in one call
The App Bridge session token of the logged-in user making this request (what auth:token-request returns). Used only for patient_appointments on EZDerm. With a live office (system) EZDerm connection the chart is read through it, and a verified token only names the fallback should that connection drop before the read starts; a token that does not verify never refuses such a read. With none, the chart is read through THIS user's own personal EZDerm connection, never anyone else's: without a token, or if that user has none, the request is refused with 400, and a token that does not verify for this app and organization is a 401. Applies to every item; a 400 or 401 is that item's error.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Max AI Developer Docs","colors":{"primary":"#7C3AED","light":"#A78BFA","dark":"#6D28D9"},"logo":{"light":"https://mintcdn.com/maxaiinc-02a56fd1/3kDaJXdVQ62Q_li2/logo/logo.png?fit=max\u0026auto=format\u0026n=3kDaJXdVQ62Q_li2\u0026q=85\u0026s=593e8b0c409b58f620609de6e29ebb79","dark":"https://mintcdn.com/maxaiinc-02a56fd1/3kDaJXdVQ62Q_li2/logo/logo.png?fit=max\u0026auto=format\u0026n=3kDaJXdVQ62Q_li2\u0026q=85\u0026s=593e8b0c409b58f620609de6e29ebb79"},"favicon":"https://mintcdn.com/maxaiinc-02a56fd1/3kDaJXdVQ62Q_li2/logo/logo.png?fit=max\u0026auto=format\u0026n=3kDaJXdVQ62Q_li2\u0026q=85\u0026s=593e8b0c409b58f620609de6e29ebb79","api":{},"styling":{"latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"maxaiinc-02a56fd1","hasAudioNarration":false,"actualSubdomain":"maxaiinc-02a56fd1","customDomains":["docs.maxcare.ai"],"gitSource":{"type":"github","owner":"maxcare-ai","repo":"monorepo","deployBranch":"staging","contentDirectory":"workloads/api-docs-mintlify","isPrivate":true,"mountPath":"","label":""},"entitlements":{},"buildId":"6aedf59db961f3bf48d52094","clientVersion":"0.0.4076","searchFilterCounts":[{"language":"default","tag":"API Reference","count":914},{"language":"default","tag":"Patients","count":74},{"language":"default","tag":"Schedule","count":40},{"language":"default","tag":"EHR live reads","count":30},{"language":"default","tag":"Appointments","count":28},{"language":"default","tag":"Inventory","count":28},{"language":"default","tag":"Notes","count":28},{"language":"default","tag":"Tasks","count":28},{"language":"default","tag":"Guides","count":24},{"language":"default","tag":"Payers","count":20}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","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":[],"page":{"pagePath":"api-reference/v3/sync-requests/request-a-re-sync-of-several-resources-in-one-call","slug":"/api-reference/v3/sync-requests/request-a-re-sync-of-several-resources-in-one-call","pageMetadata":{"title":"Request a re-sync of several resources in one call","description":"Queues up to 25 on-demand re-syncs in one round trip. Kinds may be mixed. Each item is processed independently and under the SAME guardrails as POST /sync-requests — its own scope check and its own 5-minute per-resource cooldown (30 per connector for appointments). **Best-effort, not atomic**: the 202 says the batch was processed, not that every item queued. Each result carries either `request` (queued, including `resourceUpdatedAt`) or `error` (the status and message the single-resource endpoint would have returned — 500 among them, scoped to the one item rather than failing the request, plus a batch-only 503 when the batch hit its time budget before that item was started: a 503 item ran nothing and holds no cooldown, so retry it in a smaller batch), never both — an item refused by its cooldown does not affect the others. Results come back in the order sent, with `resourceId` echoed verbatim. Poll each queued item's `GET /sync-requests/{id}` as usual; the sync_request.completed webhook fires once PER ITEM, not per batch. The response is held until every item has been dispatched, so it can take several seconds. More than the maximum is a 400 naming the limit, never a silent truncation.","deprecated":null,"version":null,"openapi":"/openapi-v3.json post /sync-requests/batch","href":"/api-reference/v3/sync-requests/request-a-re-sync-of-several-resources-in-one-call","autogeneratedByOpenApi":true},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx, jsxs: _jsxs} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n code: \"code\",\n p: \"p\",\n strong: \"strong\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsxs(_components.p, {\n children: [\"Queues up to 25 on-demand re-syncs in one round trip. Kinds may be mixed. Each item is processed independently and under the SAME guardrails as POST /sync-requests — its own scope check and its own 5-minute per-resource cooldown (30 per connector for appointments). \", _jsx(_components.strong, {\n children: \"Best-effort, not atomic\"\n }), \": the 202 says the batch was processed, not that every item queued. Each result carries either \", _jsx(_components.code, {\n children: \"request\"\n }), \" (queued, including \", _jsx(_components.code, {\n children: \"resourceUpdatedAt\"\n }), \") or \", _jsx(_components.code, {\n children: \"error\"\n }), \" (the status and message the single-resource endpoint would have returned — 500 among them, scoped to the one item rather than failing the request, plus a batch-only 503 when the batch hit its time budget before that item was started: a 503 item ran nothing and holds no cooldown, so retry it in a smaller batch), never both — an item refused by its cooldown does not affect the others. Results come back in the order sent, with \", _jsx(_components.code, {\n children: \"resourceId\"\n }), \" echoed verbatim. Poll each queued item’s \", _jsx(_components.code, {\n children: \"GET /sync-requests/{id}\"\n }), \" as usual; the sync_request.completed webhook fires once PER ITEM, not per batch. The response is held until every item has been dispatched, so it can take several seconds. More than the maximum is a 400 naming the limit, never a silent truncation.\"]\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":"Request a re-sync of several resources in one call","description":"Queues up to 25 on-demand re-syncs in one round trip. Kinds may be mixed. Each item is processed independently and under the SAME guardrails as POST /sync-requests — its own scope check and its own 5-minute per-resource cooldown (30 per connector for appointments). **Best-effort, not atomic**: the 202 says the batch was processed, not that every item queued. Each result carries either `request` (queued, including `resourceUpdatedAt`) or `error` (the status and message the single-resource endpoint would have returned — 500 among them, scoped to the one item rather than failing the request, plus a batch-only 503 when the batch hit its time budget before that item was started: a 503 item ran nothing and holds no cooldown, so retry it in a smaller batch), never both — an item refused by its cooldown does not affect the others. Results come back in the order sent, with `resourceId` echoed verbatim. Poll each queued item's `GET /sync-requests/{id}` as usual; the sync_request.completed webhook fires once PER ITEM, not per batch. The response is held until every item has been dispatched, so it can take several seconds. More than the maximum is a 400 naming the limit, never a silent truncation.","deprecated":null,"version":null,"openapi":"/openapi-v3.json post /sync-requests/batch","href":"/api-reference/v3/sync-requests/request-a-re-sync-of-several-resources-in-one-call","autogeneratedByOpenApi":true}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"description":"Queues up to 25 on-demand re-syncs in one round trip. Kinds may be mixed. Each item is processed independently and under the SAME guardrails as POST /sync-requests — its own scope check and its own 5-minute per-resource cooldown (30 per connector for appointments). **Best-effort, not atomic**: the 202 says the batch was processed, not that every item queued. Each result carries either `request` (queued, including `resourceUpdatedAt`) or `error` (the status and message the single-resource endpoint would have returned — 500 among them, scoped to the one item rather than failing the request, plus a batch-only 503 when the batch hit its time budget before that item was started: a 503 item ran nothing and holds no cooldown, so retry it in a smaller batch), never both — an item refused by its cooldown does not affect the others. Results come back in the order sent, with `resourceId` echoed verbatim. Poll each queued item's `GET /sync-requests/{id}` as usual; the sync_request.completed webhook fires once PER ITEM, not per batch. The response is held until every item has been dispatched, so it can take several seconds. More than the maximum is a 400 naming the limit, never a silent truncation.","operationId":"SyncRequestsPublicController_createSyncRequestBatch","parameters":["61db66e5-4fea-49bf-9933-ef59bcef30c4"],"requestBody":"350e99d5-ff22-4897-b539-5b38ce2be34e","responses":{"202":"cbe2615e-c708-4cde-8371-690302a75a20","400":"14bd3639-ccd9-4917-879d-5dbc742bc2a3","401":"c77e7072-9af7-40c7-9f05-88eea0ab2a6f","429":"7ae8c543-2386-4ac2-98c0-6f22c45aca5a"},"security":["d8d1007f-6d5c-4a66-8a21-136434b10e9b"],"summary":"Request a re-sync of several resources in one call","tags":["Sync Requests"],"method":"post","type":"path","servers":["4d607f5b-84b4-4e24-bd9d-f26fc33ce252"],"path":"/sync-requests/batch","baseUrlOptions":["https://api.maxcare.ai/v3"],"title":"Request a re-sync of several resources in one call","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{"61db66e5-4fea-49bf-9933-ef59bcef30c4":{"name":"X-Organization-Id","in":"header","required":true,"schema":{"type":"string","isRequired":true,"description":"Target clinic organization ID","uniqueKey":"","typeLabel":"string"},"description":"Target clinic organization ID"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"requests":{"description":"The resources to re-sync, each identified by its prefixed id (clm_/bil_/pat_/nte_/apt_)","maxItems":25,"minItems":1,"type":"array","items":{"type":"object","properties":{"resourceType":{"type":"string","description":"What kind of resource to re-sync with the EHR","enum":["claim","bill","patient","note","appointment","patient_appointments"],"example":"claim","isRequired":true,"uniqueKey":"requests.items.[INDEX].resourceType","typeLabel":"enum\u003cstring>"},"resourceId":{"type":"string","description":"The resource's id in its prefixed form (clm_/bil_/pat_/nte_/apt_; pat_ for patient_appointments), or a raw UUID","example":"clm_a1b2c3d456784abc9def0123456789ab","isRequired":true,"uniqueKey":"requests.items.[INDEX].resourceId","typeLabel":"string"}},"required":["resourceType","resourceId"],"uniqueKey":"requests.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"requests","typeLabel":"object[]"},"sessionToken":{"type":"string","description":"The App Bridge session token of the logged-in user making this request (what `auth:token-request` returns). Used only for `patient_appointments` on EZDerm. With a live office (system) EZDerm connection the chart is read through it, and a verified token only names the fallback should that connection drop before the read starts; a token that does not verify never refuses such a read. With none, the chart is read through THIS user's own personal EZDerm connection, never anyone else's: without a token, or if that user has none, the request is refused with 400, and a token that does not verify for this app and organization is a 401. Applies to every item; a 400 or 401 is that item's error.","example":"eyJhbGciOiJSUzI1NiIs...","uniqueKey":"sessionToken","typeLabel":"string"}},"required":["requests"],"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"requests":[{"resourceType":"claim","resourceId":"clm_a1b2c3d456784abc9def0123456789ab"}],"sessionToken":"eyJhbGciOiJSUzI1NiIs..."}}},"exampleType":"generated"}},"exampleType":"generated"},"responses":{"cbe2615e-c708-4cde-8371-690302a75a20":{"description":"Accepted — queued for background processing","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Response code","example":"success","isRequired":true,"uniqueKey":"code","typeLabel":"string"},"data":{"type":"object","properties":{"requests":{"description":"One result per item, in the order you sent them. **Partial success is the normal case**: the 202 says the batch was processed, NOT that everything queued. Every item carries either `request` or `error`, never both and never neither — check each one.","type":"array","items":{"type":"object","properties":{"resourceType":{"type":"string","description":"The item's `resourceType`, echoed back","enum":["claim","bill","patient","note","appointment","patient_appointments"],"example":"bill","isRequired":true,"uniqueKey":"data.requests.items.[INDEX].resourceType","typeLabel":"enum\u003cstring>"},"resourceId":{"type":"string","description":"The item's `resourceId`, echoed back verbatim in the prefixed form you sent it","example":"bil_a1b2c3d456784abc9def0123456789ab","isRequired":true,"uniqueKey":"data.requests.items.[INDEX].resourceId","typeLabel":"string"},"request":{"oneOf":[{"type":"object","description":"The queued sync request, identical to what POST /sync-requests returns — including `resourceUpdatedAt`. Null when this item was refused; see `error`.","required":["id","resourceType","resourceId","status","errorKind","resourceUpdatedAt","requestedAt","completedAt"],"properties":{"id":{"type":"string","description":"Sync request unique identifier","example":"srq_c1d2e3f456784abc9def0123456789ab","isRequired":true,"uniqueKey":"data.requests.items.[INDEX].request.oneOf.0.id","typeLabel":"string"},"resourceType":{"type":"string","description":"Kind of resource being re-synced","enum":["claim","bill","patient","note","appointment","patient_appointments"],"example":"claim","isRequired":true,"uniqueKey":"data.requests.items.[INDEX].request.oneOf.0.resourceType","typeLabel":"enum\u003cstring>"},"resourceId":{"type":"string","description":"The resource being re-synced","example":"clm_a1b2c3d456784abc9def0123456789ab","isRequired":true,"uniqueKey":"data.requests.items.[INDEX].request.oneOf.0.resourceId","typeLabel":"string"},"status":{"type":"string","description":"Request lifecycle status. Poll until 'completed' or 'failed'.","enum":["queued","completed","failed"],"example":"queued","isRequired":true,"uniqueKey":"data.requests.items.[INDEX].request.oneOf.0.status","typeLabel":"enum\u003cstring>"},"errorKind":{"oneOf":[{"type":"string","description":"Why a failed request failed, as a closed marker: `child_run_failed` (a sync run failed or was interrupted), `cancelled_before_start` (the sync runs were discarded while still queued — usually because an equivalent sync already held the lane — so nothing this request dispatched ran, but it still holds the cooldown — 5 minutes, or 30 per connector for an appointment), or `stale` (no terminal outcome inside the 30-minute watch window). Null unless status is 'failed'. A request that could not be started at all never reaches this field: it is refused synchronously with a 4xx or 502 and no request id, so there is nothing to poll.","example":null,"isRequired":true,"uniqueKey":"data.requests.items.[INDEX].request.oneOf.0.errorKind.oneOf.0","typeLabel":"string"},{"type":"null","description":"Why a failed request failed, as a closed marker: `child_run_failed` (a sync run failed or was interrupted), `cancelled_before_start` (the sync runs were discarded while still queued — usually because an equivalent sync already held the lane — so nothing this request dispatched ran, but it still holds the cooldown — 5 minutes, or 30 per connector for an appointment), or `stale` (no terminal outcome inside the 30-minute watch window). Null unless status is 'failed'. A request that could not be started at all never reaches this field: it is refused synchronously with a 4xx or 502 and no request id, so there is nothing to poll.","example":null,"isRequired":true,"uniqueKey":"data.requests.items.[INDEX].request.oneOf.0.errorKind.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.requests.items.[INDEX].request.oneOf.0.errorKind","typeLabel":"string | null"},"resourceUpdatedAt":{"oneOf":[{"type":"string","description":"The resource's own change stamp as it stood when this request was accepted, so you can tell whether the re-sync changed anything: re-read the resource and compare. It is the SAME field that resource's endpoint returns — `updatedAt` for claim, bill, note and patient; `lastSyncedAt` for appointment, which exposes that instead; always null for `patient_appointments`, which names no single row (re-read GET /appointments?patientId= instead). Note it moves only when the data actually CHANGED, so it is not a completion signal: use the request's own `status` (or the completion webhook) for that. **Returned only on the 202 that creates the request** — it is a property of the resource at request time, is not stored, and is always null on GET.","example":"2026-08-09T12:00:00.000Z","isRequired":true,"uniqueKey":"data.requests.items.[INDEX].request.oneOf.0.resourceUpdatedAt.oneOf.0","typeLabel":"string"},{"type":"null","description":"The resource's own change stamp as it stood when this request was accepted, so you can tell whether the re-sync changed anything: re-read the resource and compare. It is the SAME field that resource's endpoint returns — `updatedAt` for claim, bill, note and patient; `lastSyncedAt` for appointment, which exposes that instead; always null for `patient_appointments`, which names no single row (re-read GET /appointments?patientId= instead). Note it moves only when the data actually CHANGED, so it is not a completion signal: use the request's own `status` (or the completion webhook) for that. **Returned only on the 202 that creates the request** — it is a property of the resource at request time, is not stored, and is always null on GET.","example":"2026-08-09T12:00:00.000Z","isRequired":true,"uniqueKey":"data.requests.items.[INDEX].request.oneOf.0.resourceUpdatedAt.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.requests.items.[INDEX].request.oneOf.0.resourceUpdatedAt","typeLabel":"string | null"},"requestedAt":{"type":"string","description":"When the re-sync was requested","example":"2026-08-09T12:00:00.000Z","isRequired":true,"uniqueKey":"data.requests.items.[INDEX].request.oneOf.0.requestedAt","typeLabel":"string"},"completedAt":{"oneOf":[{"type":"string","description":"When the request reached a terminal state","example":null,"isRequired":true,"uniqueKey":"data.requests.items.[INDEX].request.oneOf.0.completedAt.oneOf.0","typeLabel":"string"},{"type":"null","description":"When the request reached a terminal state","example":null,"isRequired":true,"uniqueKey":"data.requests.items.[INDEX].request.oneOf.0.completedAt.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.requests.items.[INDEX].request.oneOf.0.completedAt","typeLabel":"string | null"}},"isRequired":true,"uniqueKey":"data.requests.items.[INDEX].request.oneOf.0","typeLabel":"object"},{"type":"null","isRequired":true,"uniqueKey":"data.requests.items.[INDEX].request.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.requests.items.[INDEX].request","typeLabel":"object | null"},"error":{"oneOf":[{"type":"object","description":"Why this item was refused, or null when it was queued.","required":["statusCode","message"],"example":null,"properties":{"statusCode":{"type":"number","description":"The status the same request would have received from POST /sync-requests on its own: 400 (un-syncable resource), 403 (missing scope for that kind), 404 (no such resource in this organization), 409 (cooldown or a re-sync already running), 502 (the re-sync could not be started). 500 is the same unhandled failure the single-resource endpoint would answer with — same status and the same `Internal server error` message — except that here it is scoped to the one item so the rest of the batch still runs. 503 is genuinely batch-only: the batch reached its time budget before this item was started, so nothing ran for it — it holds no cooldown and can be retried immediately in a smaller batch.","example":409,"isRequired":true,"uniqueKey":"data.requests.items.[INDEX].error.oneOf.0.statusCode","typeLabel":"number"},"message":{"type":"string","description":"Human-readable reason, the same message the single-resource endpoint would have returned.","example":"This bill was already re-synced in the last 5 minutes. Retry after the cooldown.","isRequired":true,"uniqueKey":"data.requests.items.[INDEX].error.oneOf.0.message","typeLabel":"string"}},"isRequired":true,"uniqueKey":"data.requests.items.[INDEX].error.oneOf.0","typeLabel":"object"},{"type":"null","isRequired":true,"uniqueKey":"data.requests.items.[INDEX].error.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.requests.items.[INDEX].error","typeLabel":"object | null"}},"required":["resourceType","resourceId","request","error"],"uniqueKey":"data.requests.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"data.requests","typeLabel":"object[]"}},"required":["requests"],"isRequired":true,"uniqueKey":"data","typeLabel":"object"}},"required":["code","data"],"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"code":"success","data":{"requests":[{"resourceType":"bill","resourceId":"bil_a1b2c3d456784abc9def0123456789ab","request":{"id":"srq_c1d2e3f456784abc9def0123456789ab","resourceType":"claim","resourceId":"clm_a1b2c3d456784abc9def0123456789ab","status":"queued","errorKind":null,"resourceUpdatedAt":"2026-08-09T12:00:00.000Z","requestedAt":"2026-08-09T12:00:00.000Z","completedAt":null},"error":null}]}}}},"exampleType":"generated"}},"exampleType":"generated"},"14bd3639-ccd9-4917-879d-5dbc742bc2a3":{"description":"Missing or invalid request parameter","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Error code","example":"bad_request","isRequired":true,"uniqueKey":"code","typeLabel":"string"},"message":{"type":"string","description":"Human-readable error message","example":"'id' must be a valid UUID","isRequired":true,"uniqueKey":"message","typeLabel":"string"},"trace_id":{"type":"string","description":"Trace ID for debugging","example":"550e8400-e29b-41d4-a716-446655440000","isRequired":true,"uniqueKey":"trace_id","typeLabel":"string"}},"required":["code","message","trace_id"],"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"code":"bad_request","message":"'id' must be a valid UUID","trace_id":"550e8400-e29b-41d4-a716-446655440000"}}},"exampleType":"generated"}},"exampleType":"generated"},"c77e7072-9af7-40c7-9f05-88eea0ab2a6f":{"description":"Invalid or missing API key","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Error code","example":"unauthorized","isRequired":true,"uniqueKey":"code","typeLabel":"string"},"message":{"type":"string","description":"Human-readable error message","example":"Invalid or missing API key","isRequired":true,"uniqueKey":"message","typeLabel":"string"},"trace_id":{"type":"string","description":"Trace ID for debugging","example":"550e8400-e29b-41d4-a716-446655440000","isRequired":true,"uniqueKey":"trace_id","typeLabel":"string"}},"required":["code","message","trace_id"],"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"code":"unauthorized","message":"Invalid or missing API key","trace_id":"550e8400-e29b-41d4-a716-446655440000"}}},"exampleType":"generated"}},"exampleType":"generated"},"7ae8c543-2386-4ac2-98c0-6f22c45aca5a":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Error code","example":"rate_limit_exceeded","isRequired":true,"uniqueKey":"code","typeLabel":"string"},"message":{"type":"string","description":"Human-readable error message","example":"Rate limit exceeded. Maximum 1000 requests per 60 seconds.","isRequired":true,"uniqueKey":"message","typeLabel":"string"},"trace_id":{"type":"string","description":"Trace ID for debugging","example":"550e8400-e29b-41d4-a716-446655440000","isRequired":true,"uniqueKey":"trace_id","typeLabel":"string"}},"required":["code","message","trace_id"],"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"code":"rate_limit_exceeded","message":"Rate limit exceeded. Maximum 1000 requests per 60 seconds.","trace_id":"550e8400-e29b-41d4-a716-446655440000"}}},"exampleType":"generated"}},"exampleType":"generated"}},"security":{"d8d1007f-6d5c-4a66-8a21-136434b10e9b":{"api-key":{"scheme":"bearer","bearerFormat":"JWT","type":"http","description":"Marketplace API key","scopes":[],"schemeName":"api-key"}}},"servers":{"4d607f5b-84b4-4e24-bd9d-f26fc33ce252":{"url":"https://api.maxcare.ai/v3"}},"processedSecurityOptions":[{"schemes":[{"scheme":{"scheme":"bearer","bearerFormat":"JWT","type":"http","description":"Marketplace API key","scopes":[],"schemeName":"api-key"},"schema":{"title":"Bearer Auth","type":"string","isRequired":true,"description":"Marketplace API key","format":"bearer","typeLabel":"string\u003cbearer>","deprecated":false},"schemeName":"api-key","name":"Authorization"}],"title":"api-key"}]},"originalFileLocation":"openapi-v3.json"},"subdomain":"maxaiinc-02a56fd1","siteName":"Max AI Developer Docs","title":"Request a re-sync of several resources in one call - Max AI Developer Docs","navMaps":{"firstHrefInVersion":{"v4":{"href":"/api-reference/v4/sync-requests/request-a-re-sync-of-several-resources-in-one-call","matchLevel":1},"v3":{"href":"/api-reference/v3/sync-requests/request-a-re-sync-of-several-resources-in-one-call","matchLevel":0},"v2":{"href":"/api-reference/v2/sync-requests/request-a-re-sync-of-several-resources-in-one-call","matchLevel":1},"v1":{"href":"/api-reference/v1/sync-requests/request-a-re-sync-of-several-resources-in-one-call","matchLevel":1}},"firstHrefInLanguage":{}},"lastModified":"2026-11-06T15:43:52.438Z","originalFileLocation":"api-reference/v3/sync-requests/request-a-re-sync-of-several-resources-in-one-call.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;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=\"system\"}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=\"Queues up to 25 on-demand re-syncs in one round trip. Kinds may be mixed. Each item is processed independently and under the SAME guardrails as POST /sync-requests — its own scope check and its own 5-minute per-resource cooldown (30 per connector for appointments). Best-effort, not atomic: the 202 says the batch was processed, not that every item queued. Each result carries either request (queued, including resourceUpdatedAt) or error (the status and message the single-resource endpoint would have returned — 500 among them, scoped to the one item rather than failing the request, plus a batch-only 503 when the batch hit its time budget before that item was started: a 503 item ran nothing and holds no cooldown, so retry it in a smaller batch), never both — an item refused by its cooldown does not affect the others. Results come back in the order sent, with resourceId echoed verbatim. Poll each queued item\u0026#x27;s GET /sync-requests/{id} as usual; the sync_request.completed webhook fires once PER ITEM, not per batch. The response is held until every item has been dispatched, so it can take several seconds. More than the maximum is a 400 naming the limit, never a silent truncation.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Max AI Developer Docs\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/maxaiinc-02a56fd1/qw7ccI6uMOHd5Iws/_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=\"/mintlify-assets/_mintlify/favicons/maxaiinc-02a56fd1/qw7ccI6uMOHd5Iws/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/maxaiinc-02a56fd1/qw7ccI6uMOHd5Iws/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/maxaiinc-02a56fd1/qw7ccI6uMOHd5Iws/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/maxaiinc-02a56fd1/qw7ccI6uMOHd5Iws/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/maxaiinc-02a56fd1/qw7ccI6uMOHd5Iws/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/maxaiinc-02a56fd1/qw7ccI6uMOHd5Iws/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/maxaiinc-02a56fd1/qw7ccI6uMOHd5Iws/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/maxaiinc-02a56fd1/qw7ccI6uMOHd5Iws/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Request a re-sync of several resources in one call - Max AI Developer Docs\">\u003cmeta data-mint-head property=\"og:description\" content=\"Queues up to 25 on-demand re-syncs in one round trip. Kinds may be mixed. Each item is processed independently and under the SAME guardrails as POST /sync-requests — its own scope check and its own 5-minute per-resource cooldown (30 per connector for appointments). Best-effort, not atomic: the 202 says the batch was processed, not that every item queued. Each result carries either request (queued, including resourceUpdatedAt) or error (the status and message the single-resource endpoint would have returned — 500 among them, scoped to the one item rather than failing the request, plus a batch-only 503 when the batch hit its time budget before that item was started: a 503 item ran nothing and holds no cooldown, so retry it in a smaller batch), never both — an item refused by its cooldown does not affect the others. Results come back in the order sent, with resourceId echoed verbatim. Poll each queued item\u0026#x27;s GET /sync-requests/{id} as usual; the sync_request.completed webhook fires once PER ITEM, not per batch. The response is held until every item has been dispatched, so it can take several seconds. More than the maximum is a 400 naming the limit, never a silent truncation.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Max AI Developer Docs\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.maxcare.ai/api-reference/v3/sync-requests/request-a-re-sync-of-several-resources-in-one-call\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://maxaiinc-02a56fd1.mintlify.site/_mintlify/api/og/v2?division=Sync+Requests\u0026amp;title=Request+a+re-sync+of+several+resources+in+one+call\u0026amp;description=Queues+up+to+25+on-demand+re-syncs+in+one+round+trip.+Kinds+may+be+mixed.+Each+item+is+processed+independently+and+under+the+SAME+guardrails+as+POST+%2Fsync-reque\u0026amp;theme=02e0b3646d3b285707db65d5\u0026amp;signature=4a2a8be6a591779e0930cae66427043c7e9d8bd0da2accb9dd0637f1eb3d1220\">\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=\"Request a re-sync of several resources in one call - Max AI Developer Docs\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Queues up to 25 on-demand re-syncs in one round trip. Kinds may be mixed. Each item is processed independently and under the SAME guardrails as POST /sync-requests — its own scope check and its own 5-minute per-resource cooldown (30 per connector for appointments). Best-effort, not atomic: the 202 says the batch was processed, not that every item queued. Each result carries either request (queued, including resourceUpdatedAt) or error (the status and message the single-resource endpoint would have returned — 500 among them, scoped to the one item rather than failing the request, plus a batch-only 503 when the batch hit its time budget before that item was started: a 503 item ran nothing and holds no cooldown, so retry it in a smaller batch), never both — an item refused by its cooldown does not affect the others. Results come back in the order sent, with resourceId echoed verbatim. Poll each queued item\u0026#x27;s GET /sync-requests/{id} as usual; the sync_request.completed webhook fires once PER ITEM, not per batch. The response is held until every item has been dispatched, so it can take several seconds. More than the maximum is a 400 naming the limit, never a silent truncation.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://maxaiinc-02a56fd1.mintlify.site/_mintlify/api/og/v2?division=Sync+Requests\u0026amp;title=Request+a+re-sync+of+several+resources+in+one+call\u0026amp;description=Queues+up+to+25+on-demand+re-syncs+in+one+round+trip.+Kinds+may+be+mixed.+Each+item+is+processed+independently+and+under+the+SAME+guardrails+as+POST+%2Fsync-reque\u0026amp;theme=02e0b3646d3b285707db65d5\u0026amp;signature=4a2a8be6a591779e0930cae66427043c7e9d8bd0da2accb9dd0637f1eb3d1220\">\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=\"/mintlify-assets/_mintlify/favicons/maxaiinc-02a56fd1/qw7ccI6uMOHd5Iws/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Max AI Developer Docs\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#7C3AED\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.maxcare.ai/api-reference/v3/sync-requests/request-a-re-sync-of-several-resources-in-one-call\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/v3/sync-requests/request-a-re-sync-of-several-resources-in-one-call.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.maxcare.ai/#organization\",\"name\":\"Max AI Developer Docs\",\"url\":\"https://docs.maxcare.ai\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/maxaiinc-02a56fd1/3kDaJXdVQ62Q_li2/logo/logo.png?fit=max\u0026auto=format\u0026n=3kDaJXdVQ62Q_li2\u0026q=85\u0026s=593e8b0c409b58f620609de6e29ebb79\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.maxcare.ai#website\",\"name\":\"Max AI Developer Docs\",\"url\":\"https://docs.maxcare.ai\",\"publisher\":{\"@id\":\"https://docs.maxcare.ai/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.maxcare.ai/api-reference/v3/sync-requests/request-a-re-sync-of-several-resources-in-one-call#webpage\",\"url\":\"https://docs.maxcare.ai/api-reference/v3/sync-requests/request-a-re-sync-of-several-resources-in-one-call\",\"name\":\"Request a re-sync of several resources in one call\",\"description\":\"Queues up to 25 on-demand re-syncs in one round trip. Kinds may be mixed. Each item is processed independently and under the SAME guardrails as POST /sync-requests — its own scope check and its own 5-minute per-resource cooldown (30 per connector for appointments). Best-effort, not atomic: the 202 says the batch was processed, not that every item queued. Each result carries either request (queued, including resourceUpdatedAt) or error (the status and message the single-resource endpoint would have returned — 500 among them, scoped to the one item rather than failing the request, plus a batch-only 503 when the batch hit its time budget before that item was started: a 503 item ran nothing and holds no cooldown, so retry it in a smaller batch), never both — an item refused by its cooldown does not affect the others. Results come back in the order sent, with resourceId echoed verbatim. Poll each queued item's GET /sync-requests/{id} as usual; the sync_request.completed webhook fires once PER ITEM, not per batch. The response is held until every item has been dispatched, so it can take several seconds. More than the maximum is a 400 naming the limit, never a silent truncation.\",\"dateModified\":\"2026-11-06T15:43:52.438Z\",\"isPartOf\":{\"@id\":\"https://docs.maxcare.ai#website\"},\"breadcrumb\":{\"@id\":\"https://docs.maxcare.ai/api-reference/v3/sync-requests/request-a-re-sync-of-several-resources-in-one-call#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.maxcare.ai/api-reference/v3/sync-requests/request-a-re-sync-of-several-resources-in-one-call#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"API Reference\",\"item\":\"https://docs.maxcare.ai/api-reference/v3/appointment-types/list-appointment-types\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Sync Requests\",\"item\":\"https://docs.maxcare.ai/api-reference/v3/sync-requests/request-a-re-sync-of-a-resource-with-the-ehr\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Request a re-sync of several resources in one call\",\"item\":\"https://docs.maxcare.ai/api-reference/v3/sync-requests/request-a-re-sync-of-several-resources-in-one-call\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.maxcare.ai/api-reference/v3/sync-requests/request-a-re-sync-of-several-resources-in-one-call#apireference\",\"headline\":\"Request a re-sync of several resources in one call\",\"name\":\"Request a re-sync of several resources in one call\",\"description\":\"Queues up to 25 on-demand re-syncs in one round trip. Kinds may be mixed. Each item is processed independently and under the SAME guardrails as POST /sync-requests — its own scope check and its own 5-minute per-resource cooldown (30 per connector for appointments). Best-effort, not atomic: the 202 says the batch was processed, not that every item queued. Each result carries either request (queued, including resourceUpdatedAt) or error (the status and message the single-resource endpoint would have returned — 500 among them, scoped to the one item rather than failing the request, plus a batch-only 503 when the batch hit its time budget before that item was started: a 503 item ran nothing and holds no cooldown, so retry it in a smaller batch), never both — an item refused by its cooldown does not affect the others. Results come back in the order sent, with resourceId echoed verbatim. Poll each queued item's GET /sync-requests/{id} as usual; the sync_request.completed webhook fires once PER ITEM, not per batch. The response is held until every item has been dispatched, so it can take several seconds. More than the maximum is a 400 naming the limit, never a silent truncation.\",\"url\":\"https://docs.maxcare.ai/api-reference/v3/sync-requests/request-a-re-sync-of-several-resources-in-one-call\",\"mainEntityOfPage\":{\"@id\":\"https://docs.maxcare.ai/api-reference/v3/sync-requests/request-a-re-sync-of-several-resources-in-one-call#webpage\"},\"dateModified\":\"2026-11-06T15:43:52.438Z\",\"publisher\":{\"@id\":\"https://docs.maxcare.ai/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.maxcare.ai#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Max AI Developer Docs\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Max AI Developer Docs","nav":{"global":null,"tabs":[{"tab":"Guides","pages":[{"title":"Guides","href":"/guides"}]},{"tab":"API Reference","versions":[{"version":"v4","tag":"Latest","pages":[{"title":"v4","href":"/api-reference/v4/sync-requests/request-a-re-sync-of-several-resources-in-one-call"}]},{"version":"v3","groups":[{"group":"API Reference","pages":[{"group":"Appointment Types","pages":[{"title":"List appointment types","deprecated":null,"version":null,"openapi":"/openapi-v3.json get /appointment-types","href":"/api-reference/v3/appointment-types/list-appointment-types"}]},{"group":"Appointments","pages":[{"title":"List appointments","deprecated":null,"version":null,"openapi":"/openapi-v3.json get /appointments","href":"/api-reference/v3/appointments/list-appointments"},{"title":"Book an appointment","deprecated":null,"version":null,"openapi":"/openapi-v3.json post /appointments","href":"/api-reference/v3/appointments/book-an-appointment"},{"title":"List cancellation reasons","deprecated":null,"version":null,"openapi":"/openapi-v3.json get /appointments/cancel-reasons","href":"/api-reference/v3/appointments/list-cancellation-reasons"},{"title":"List appointment statuses","deprecated":null,"version":null,"openapi":"/openapi-v3.json get /appointments/statuses","href":"/api-reference/v3/appointments/list-appointment-statuses"},{"title":"Get appointment by ID","deprecated":null,"version":null,"openapi":"/openapi-v3.json get /appointments/{id}","href":"/api-reference/v3/appointments/get-appointment-by-id"},{"title":"Reschedule an appointment","deprecated":null,"version":null,"openapi":"/openapi-v3.json patch /appointments/{id}","href":"/api-reference/v3/appointments/reschedule-an-appointment"},{"title":"Cancel an appointment","deprecated":null,"version":null,"openapi":"/openapi-v3.json post /appointments/{id}/cancel","href":"/api-reference/v3/appointments/cancel-an-appointment"}]},{"group":"Bills","pages":[{"title":"List bills","deprecated":null,"version":null,"openapi":"/openapi-v3.json get /bills","href":"/api-reference/v3/bills/list-bills"},{"title":"Get bill by ID","deprecated":null,"version":null,"openapi":"/openapi-v3.json get /bills/{id}","href":"/api-reference/v3/bills/get-bill-by-id"}]},{"group":"Cancel Reasons","pages":[{"title":"List appointment cancellation reasons","deprecated":null,"version":null,"openapi":"/openapi-v3.json get /cancel-reasons","href":"/api-reference/v3/cancel-reasons/list-appointment-cancellation-reasons"}]},{"group":"Claims","pages":[{"title":"List claims","deprecated":null,"version":null,"openapi":"/openapi-v3.json get /claims","href":"/api-reference/v3/claims/list-claims"},{"title":"Get claim by ID","deprecated":null,"version":null,"openapi":"/openapi-v3.json get /claims/{id}","href":"/api-reference/v3/claims/get-claim-by-id"}]},{"group":"Patients","pages":[{"title":"Where each document category is filed","deprecated":null,"version":null,"openapi":"/openapi-v3.json get /documents/categories","href":"/api-reference/v3/patients/where-each-document-category-is-filed"},{"title":"List patients","deprecated":null,"version":null,"openapi":"/openapi-v3.json get /patients","href":"/api-reference/v3/patients/list-patients"},{"title":"Create a patient","deprecated":null,"version":null,"openapi":"/openapi-v3.json post /patients","href":"/api-reference/v3/patients/create-a-patient"},{"title":"Match a patient by demographics","deprecated":null,"version":null,"openapi":"/openapi-v3.json post /patients/match","href":"/api-reference/v3/patients/match-a-patient-by-demographics"},{"title":"Get patient by ID","deprecated":null,"version":null,"openapi":"/openapi-v3.json get /patients/{id}","href":"/api-reference/v3/patients/get-patient-by-id"},{"title":"Update a patient","deprecated":null,"version":null,"openapi":"/openapi-v3.json patch /patients/{id}","href":"/api-reference/v3/patients/update-a-patient"},{"title":"List a patient's allergies","deprecated":null,"version":null,"openapi":"/openapi-v3.json get /patients/{id}/allergies","href":"/api-reference/v3/patients/list-a-patients-allergies"},{"title":"List a patient's chart documents","deprecated":null,"version":null,"openapi":"/openapi-v3.json get /patients/{id}/documents","href":"/api-reference/v3/patients/list-a-patients-chart-documents"},{"title":"File a document on a patient's chart","deprecated":null,"version":null,"openapi":"/openapi-v3.json post /patients/{id}/documents","href":"/api-reference/v3/patients/file-a-document-on-a-patients-chart"},{"title":"Refresh a patient's chart-document list","deprecated":null,"version":null,"openapi":"/openapi-v3.json post /patients/{id}/documents/refresh","href":"/api-reference/v3/patients/refresh-a-patients-chart-document-list"},{"title":"Download one chart document's bytes","deprecated":null,"version":null,"openapi":"/openapi-v3.json get /patients/{id}/documents/{documentId}/content","href":"/api-reference/v3/patients/download-one-chart-documents-bytes"},{"title":"Pull one chart document's bytes from the EHR","deprecated":null,"version":null,"openapi":"/openapi-v3.json post /patients/{id}/documents/{documentId}/fetch","href":"/api-reference/v3/patients/pull-one-chart-documents-bytes-from-the-ehr"},{"title":"Attach insurance to an existing patient","deprecated":null,"version":null,"openapi":"/openapi-v3.json post /patients/{id}/insurance","href":"/api-reference/v3/patients/attach-insurance-to-an-existing-patient"},{"title":"Attach an insurance card image","deprecated":null,"version":null,"openapi":"/openapi-v3.json post /patients/{id}/insurance/cards","href":"/api-reference/v3/patients/attach-an-insurance-card-image"},{"title":"Attach insurance with an exact payer","deprecated":null,"version":null,"openapi":"/openapi-v3.json post /patients/{id}/insurance:exact","href":"/api-reference/v3/patients/attach-insurance-with-an-exact-payer"},{"title":"List a patient's lab / pathology results","deprecated":null,"version":null,"openapi":"/openapi-v3.json get /patients/{id}/lab-results","href":"/api-reference/v3/patients/list-a-patients-lab-pathology-results"},{"title":"Set a patient's referring provider","deprecated":null,"version":null,"openapi":"/openapi-v3.json put /patients/{id}/referring-provider","href":"/api-reference/v3/patients/set-a-patients-referring-provider"},{"title":"Change an insurance policy's type","deprecated":null,"version":null,"openapi":"/openapi-v3.json patch /patients/{patientId}/insurance-policies/{policyId}","href":"/api-reference/v3/patients/change-an-insurance-policys-type"}]},{"group":"Eligibility Checks","pages":[{"title":"List eligibility checks","deprecated":null,"version":null,"openapi":"/openapi-v3.json get /eligibility-checks","href":"/api-reference/v3/eligibility-checks/list-eligibility-checks"},{"title":"Run an eligibility check","deprecated":null,"version":null,"openapi":"/openapi-v3.json post /eligibility-checks","href":"/api-reference/v3/eligibility-checks/run-an-eligibility-check"},{"title":"Get eligibility check by ID","deprecated":null,"version":null,"openapi":"/openapi-v3.json get /eligibility-checks/{id}","href":"/api-reference/v3/eligibility-checks/get-eligibility-check-by-id"}]},{"group":"Emails","pages":[{"title":"List sent emails","deprecated":null,"version":null,"openapi":"/openapi-v3.json get /emails","href":"/api-reference/v3/emails/list-sent-emails"},{"title":"Send emails","deprecated":null,"version":null,"openapi":"/openapi-v3.json post /emails/send","href":"/api-reference/v3/emails/send-emails"},{"title":"Get email by ID","deprecated":null,"version":null,"openapi":"/openapi-v3.json get /emails/{id}","href":"/api-reference/v3/emails/get-email-by-id"}]},{"group":"ERA Service Lines","pages":[{"title":"List ERA service lines","deprecated":null,"version":null,"openapi":"/openapi-v3.json get /era-service-lines","href":"/api-reference/v3/era-service-lines/list-era-service-lines"},{"title":"Get ERA service line by ID","deprecated":null,"version":null,"openapi":"/openapi-v3.json get /era-service-lines/{id}","href":"/api-reference/v3/era-service-lines/get-era-service-line-by-id"}]},{"group":"Facilities","pages":[{"title":"List facilities","deprecated":null,"version":null,"openapi":"/openapi-v3.json get /facilities","href":"/api-reference/v3/facilities/list-facilities"},{"title":"Get facility by ID","deprecated":null,"version":null,"openapi":"/openapi-v3.json get /facilities/{id}","href":"/api-reference/v3/facilities/get-facility-by-id"}]},{"group":"Faxes","pages":[{"title":"List faxes","deprecated":null,"version":null,"openapi":"/openapi-v3.json get /faxes","href":"/api-reference/v3/faxes/list-faxes"},{"title":"Send a fax","deprecated":null,"version":null,"openapi":"/openapi-v3.json post /faxes/send","href":"/api-reference/v3/faxes/send-a-fax"},{"title":"List fax cover-page templates","deprecated":null,"version":null,"openapi":"/openapi-v3.json get /faxes/templates","href":"/api-reference/v3/faxes/list-fax-cover-page-templates"},{"title":"Get fax by ID","deprecated":null,"version":null,"openapi":"/openapi-v3.json get /faxes/{id}","href":"/api-reference/v3/faxes/get-fax-by-id"}]},{"group":"Insurance Policies","pages":[{"title":"List insurance policies","deprecated":null,"version":null,"openapi":"/openapi-v3.json get /insurance-policies","href":"/api-reference/v3/insurance-policies/list-insurance-policies"},{"title":"Get insurance policy by ID","deprecated":null,"version":null,"openapi":"/openapi-v3.json get /insurance-policies/{id}","href":"/api-reference/v3/insurance-policies/get-insurance-policy-by-id"},{"title":"List a policy's insurance card images","deprecated":null,"version":null,"openapi":"/openapi-v3.json get /insurance-policies/{id}/attachments","href":"/api-reference/v3/insurance-policies/list-a-policys-insurance-card-images"}]},{"group":"Inventory","pages":[{"title":"List inventory changes","deprecated":null,"version":null,"openapi":"/openapi-v3.json get /inventory/changes","href":"/api-reference/v3/inventory/list-inventory-changes"},{"title":"Get inventory change by ID","deprecated":null,"version":null,"openapi":"/openapi-v3.json get /inventory/changes/{id}","href":"/api-reference/v3/inventory/get-inventory-change-by-id"},{"title":"List products in an inventory change","deprecated":null,"version":null,"openapi":"/openapi-v3.json get /inventory/changes/{id}/products","href":"/api-reference/v3/inventory/list-products-in-an-inventory-change"},{"title":"List products","deprecated":null,"version":null,"openapi":"/openapi-v3.json get /inventory/products","href":"/api-reference/v3/inventory/list-products"},{"title":"Get product by ID","deprecated":null,"version":null,"openapi":"/openapi-v3.json get /inventory/products/{id}","href":"/api-reference/v3/inventory/get-product-by-id"},{"title":"Get stock levels","deprecated":null,"version":null,"openapi":"/openapi-v3.json get /inventory/stock-levels","href":"/api-reference/v3/inventory/get-stock-levels"},{"title":"Get stock levels with per-lot breakdown","deprecated":null,"version":null,"openapi":"/openapi-v3.json get /inventory/stock-levels/detail","href":"/api-reference/v3/inventory/get-stock-levels-with-per-lot-breakdown"}]},{"group":"Marketplace","pages":[{"title":"List this app's installations","deprecated":null,"version":null,"openapi":"/openapi-v3.json get /marketplace/installations","href":"/api-reference/v3/marketplace/list-this-apps-installations"},{"title":"Get current app context","deprecated":null,"version":null,"openapi":"/openapi-v3.json get /marketplace/me","href":"/api-reference/v3/marketplace/get-current-app-context"},{"title":"List the organization's members","deprecated":null,"version":null,"openapi":"/openapi-v3.json get /marketplace/members","href":"/api-reference/v3/marketplace/list-the-organizations-members"},{"title":"Verify a session token and resolve its organization","deprecated":null,"version":null,"openapi":"/openapi-v3.json post /marketplace/verify-session","href":"/api-reference/v3/marketplace/verify-a-session-token-and-resolve-its-organization"}]},{"group":"Notes","pages":[{"title":"List patient notes","deprecated":null,"version":null,"openapi":"/openapi-v3.json get /notes","href":"/api-reference/v3/notes/list-patient-notes"},{"title":"Get note by ID","deprecated":null,"version":null,"openapi":"/openapi-v3.json get /notes/{id}","href":"/api-reference/v3/notes/get-note-by-id"},{"title":"Edit SOAP note fields","deprecated":null,"version":null,"openapi":"/openapi-v3.json patch /notes/{noteId}","href":"/api-reference/v3/notes/edit-soap-note-fields"},{"title":"Upload image to note","deprecated":null,"version":null,"openapi":"/openapi-v3.json post /notes/{noteId}/images","href":"/api-reference/v3/notes/upload-image-to-note"},{"title":"Delete image from note","deprecated":null,"version":null,"openapi":"/openapi-v3.json delete /notes/{noteId}/images/{imageId}","href":"/api-reference/v3/notes/delete-image-from-note"},{"title":"Get signed URL for a note image","deprecated":null,"version":null,"openapi":"/openapi-v3.json get /notes/{noteId}/images/{imageId}/url","href":"/api-reference/v3/notes/get-signed-url-for-a-note-image"},{"title":"Edit impression fields","deprecated":null,"version":null,"openapi":"/openapi-v3.json patch /notes/{noteId}/impressions/{impressionId}","href":"/api-reference/v3/notes/edit-impression-fields"}]},{"group":"OAuth","pages":[{"title":"Exchange authorization code for user info","deprecated":null,"version":null,"openapi":"/openapi-v3.json post /oauth/token","href":"/api-reference/v3/oauth/exchange-authorization-code-for-user-info"}]},{"group":"Organization","pages":[{"title":"List the organization's members","deprecated":null,"version":null,"openapi":"/openapi-v3.json get /org/members","href":"/api-reference/v3/organization/list-the-organizations-members"}]},{"group":"Payers","pages":[{"title":"Search payers","deprecated":null,"version":null,"openapi":"/openapi-v3.json get /payers","href":"/api-reference/v3/payers/search-payers"},{"title":"Add a directory payer to the practice","deprecated":null,"version":null,"openapi":"/openapi-v3.json post /payers","href":"/api-reference/v3/payers/add-a-directory-payer-to-the-practice"},{"title":"Payer capabilities","deprecated":null,"version":null,"openapi":"/openapi-v3.json get /payers/capabilities","href":"/api-reference/v3/payers/payer-capabilities"},{"title":"Search the EHR's national payer directory","deprecated":null,"version":null,"openapi":"/openapi-v3.json get /payers/directory","href":"/api-reference/v3/payers/search-the-ehrs-national-payer-directory"},{"title":"Get payer by ID","deprecated":null,"version":null,"openapi":"/openapi-v3.json get /payers/{id}","href":"/api-reference/v3/payers/get-payer-by-id"}]},{"group":"Phone Numbers","pages":[{"title":"List organization phone numbers","deprecated":null,"version":null,"openapi":"/openapi-v3.json get /phone-numbers","href":"/api-reference/v3/phone-numbers/list-organization-phone-numbers"}]},{"group":"Prior Authorizations","pages":[{"title":"List prior authorizations","deprecated":null,"version":null,"openapi":"/openapi-v3.json get /prior-authorizations","href":"/api-reference/v3/prior-authorizations/list-prior-authorizations"},{"title":"Get prior authorization by ID","deprecated":null,"version":null,"openapi":"/openapi-v3.json get /prior-authorizations/{id}","href":"/api-reference/v3/prior-authorizations/get-prior-authorization-by-id"},{"title":"List source documents for a prior authorization","deprecated":null,"version":null,"openapi":"/openapi-v3.json get /prior-authorizations/{id}/documents","href":"/api-reference/v3/prior-authorizations/list-source-documents-for-a-prior-authorization"}]},{"group":"Providers","pages":[{"title":"List providers","deprecated":null,"version":null,"openapi":"/openapi-v3.json get /providers","href":"/api-reference/v3/providers/list-providers"},{"title":"Get provider by ID","deprecated":null,"version":null,"openapi":"/openapi-v3.json get /providers/{id}","href":"/api-reference/v3/providers/get-provider-by-id"}]},{"group":"Schedule","pages":[{"title":"List appointment types","deprecated":null,"version":null,"openapi":"/openapi-v3.json get /schedule/appointment-types","href":"/api-reference/v3/schedule/list-appointment-types"},{"title":"List availability templates","deprecated":null,"version":null,"openapi":"/openapi-v3.json get /schedule/availability-templates","href":"/api-reference/v3/schedule/list-availability-templates"},{"title":"List calendar events","deprecated":null,"version":null,"openapi":"/openapi-v3.json get /schedule/calendar-events","href":"/api-reference/v3/schedule/list-calendar-events"},{"title":"What this organization's EHR supports","deprecated":null,"version":null,"openapi":"/openapi-v3.json get /schedule/capabilities","href":"/api-reference/v3/schedule/what-this-organizations-ehr-supports"},{"title":"Search the EHR's appointment finder","deprecated":null,"version":null,"openapi":"/openapi-v3.json get /schedule/finder","href":"/api-reference/v3/schedule/search-the-ehrs-appointment-finder"},{"title":"Providers and facilities that take an appointment type","deprecated":null,"version":null,"openapi":"/openapi-v3.json get /schedule/finder/provider-locations","href":"/api-reference/v3/schedule/providers-and-facilities-that-take-an-appointment-type"},{"title":"Hold a slot","deprecated":null,"version":null,"openapi":"/openapi-v3.json post /schedule/holds","href":"/api-reference/v3/schedule/hold-a-slot"},{"title":"Release a slot hold","deprecated":null,"version":null,"openapi":"/openapi-v3.json delete /schedule/holds/{holdId}","href":"/api-reference/v3/schedule/release-a-slot-hold"},{"title":"Find bookable slots","deprecated":null,"version":null,"openapi":"/openapi-v3.json get /schedule/slots","href":"/api-reference/v3/schedule/find-bookable-slots"},{"title":"List visit reasons","deprecated":null,"version":null,"openapi":"/openapi-v3.json get /visit-reasons","href":"/api-reference/v3/schedule/list-visit-reasons"}]},{"group":"Sync Requests","pages":[{"title":"Request a re-sync of a resource with the EHR","description":"Asks for one on-demand re-sync of a single resource (claim, bill, patient, note, appointment) with the source EHR, or of one patient's appointment list (`patient_appointments`, resourceId = the patient) from the EHR. Asynchronous: returns 202 with the queued request; poll GET /sync-requests/{id} until 'completed' or 'failed' (or subscribe to the sync_request.completed webhook), then re-read the resource. Requires the resource's read scope (e.g. read:claims for a claim). Guardrails: one re-sync per resource per 5 minutes (409; appointments: per connector per 30 minutes, because one appointment re-sync sweeps that connector's whole schedule window; patient_appointments: per patient per 5 minutes, read:appointments). There is no daily cap; the re-sync's EHR calls draw from the app share of each EHR login's rate limit.","deprecated":null,"version":null,"openapi":"/openapi-v3.json post /sync-requests","href":"/api-reference/v3/sync-requests/request-a-re-sync-of-a-resource-with-the-ehr"},{"title":"Request a re-sync of several resources in one call","deprecated":null,"version":null,"openapi":"/openapi-v3.json post /sync-requests/batch","href":"/api-reference/v3/sync-requests/request-a-re-sync-of-several-resources-in-one-call"},{"title":"Get a sync request by ID","description":"Returns a single sync request made by your app. Poll this until status is 'completed' or 'failed'. Requires the re-synced resource's read scope.","deprecated":null,"version":null,"openapi":"/openapi-v3.json get /sync-requests/{id}","href":"/api-reference/v3/sync-requests/get-a-sync-request-by-id"}]},{"group":"Tasks","pages":[{"title":"List tasks","deprecated":null,"version":null,"openapi":"/openapi-v3.json get /tasks","href":"/api-reference/v3/tasks/list-tasks"},{"title":"Create a task","deprecated":null,"version":null,"openapi":"/openapi-v3.json post /tasks","href":"/api-reference/v3/tasks/create-a-task"},{"title":"List task assignee groups","deprecated":null,"version":null,"openapi":"/openapi-v3.json get /tasks/assignee-groups","href":"/api-reference/v3/tasks/list-task-assignee-groups"},{"title":"List task assignees","deprecated":null,"version":null,"openapi":"/openapi-v3.json get /tasks/assignees","href":"/api-reference/v3/tasks/list-task-assignees"},{"title":"Task capabilities","deprecated":null,"version":null,"openapi":"/openapi-v3.json get /tasks/capabilities","href":"/api-reference/v3/tasks/task-capabilities"},{"title":"Get task by ID","deprecated":null,"version":null,"openapi":"/openapi-v3.json get /tasks/{id}","href":"/api-reference/v3/tasks/get-task-by-id"},{"title":"Update task status","deprecated":null,"version":null,"openapi":"/openapi-v3.json patch /tasks/{id}","href":"/api-reference/v3/tasks/update-task-status"}]}]}]},{"version":"v2","pages":[{"title":"v2","href":"/api-reference/v2/sync-requests/request-a-re-sync-of-several-resources-in-one-call"}]},{"version":"v1","pages":[{"title":"v1","href":"/api-reference/v1/sync-requests/request-a-re-sync-of-several-resources-in-one-call"}]}]}]},"basePath":"","title":"Request a re-sync of several resources in one call - Max AI Developer Docs","buildId":"dpl_8LJbrAiZvr1K98WQNZXCyY5AvT34","deploymentId":"dpl_8LJbrAiZvr1K98WQNZXCyY5AvT34","dynamics":["c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["OpenApiReferenceProvider-i2a3QZ8E.js","utils-ChLwp8m0.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-DRktVTDc.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-CA2pEs4T.js","snippetPresets-ClQ6XrKD.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","ApiExamples-Ct_Lv36y.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-Cn2PYw9e.js","shallow-rkyymjXQ.js","getApiPlaygroundDisplay-BB9vkXtE.js","CodeSnippet-Bm5RU7m1.js","CodeSnippets-BgU9Deuz.js","Page-BUDYNlhG.js","getPastedJson-BD-6NNum.js","icon-8Z6tud2e.js","MethodPill-Tuzr4g3V.js","DuplicateIcon-0ceWFYhN.js","createIcon-FBXow_ST.js","DynamicMarkdown-CD8713Yy.js","SectionHeading-7zgzQbH-.js","axios-vUo_bRtp.js","Markdown-D7Ofw1oz.js","clsx-eKJ4rcii.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-CwjSCXIK.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-9EK5IAXV.js"]}