How Max AI mirrors EHR data, what lastSyncedAt guarantees, how rate limits are scoped, and the cost of backfills
Max AI reads from a mirror of the practice’s EHR, refreshed by per-connector
sync tasks. Nothing you read is a live call into the EHR, so every read is
subject to mirror lag. This page is about building a poller that copes with that.
Use updatedSince with cursorId on /appointments — the keyset walk described
in Pagination. That is the
supported change feed, and this page does not restate it.
Do not walk a delta feed with page/offset. Rows are ordered by the very
stamp the sync workers rewrite, so a row that changes mid-walk moves to the end,
everything after it shifts one position forward, and your next offset steps over
whichever row slid into that slot. That row is never returned, and its stamp is
below the cursor your walk finishes on, so no later poll returns it either — a
cancelled appointment can be silently skipped while the walk reports success.
Sorting by lastSyncedAt and paging by offset has this bug; an overlap window
does not fix it, because the skipped row’s stamp is older than your cursor,
not newer.
What the stamp itself guarantees:
lastSyncedAt advances only when the row’s data genuinely changed. The
appointments upsert is guarded by a no-op predicate covering every column it
writes, so the timestamp is a changed-at, not a last-seen-at, and a quiet
appointment keeps its old value indefinitely. The reference catalogues
(/appointment-types, /cancel-reasons) deliberately do the opposite: their
lastSyncedAt is a last-seen-at: it advances on every sync that still
observes the row, so a stale catalogue is distinguishable from a healthy one.
A retired row stops being observed and its stamp freezes there. See
Appointment reference data.
It is stamped by the database inside the write transaction, before commit.
Keyset pagination prevents offset shifts and resolves timestamp ties; it does
not make the feed commit-ordered. A write whose transaction commits after you
read past its stamp lands behind your cursor, even when you use cursorId.
The gap is bounded by the length of one sync batch transaction (normally well
under a second, longer under lock contention), so pin each walk with an
updatedUntil a few minutes in the past and start the next walk from an
overlap before it, applying rows idempotently by id. Keep periodic
reconciliation for anything outside that bound. Webhook updatedAt uses the
same database clock.
A whole-clinic walk is a set of windows, not one pass. Fix
updatedUntil for the walk and advance updatedSince + cursorId from the
last row. A row that stays in the window cannot be skipped. A row re-synced
during the walk gets a stamp past updatedUntil and leaves the window; it is
in the next window instead. The window is done when a page comes back shorter
than pageSize. Do not prove completeness by comparing distinct rows against
totalCount: on a keyset page it counts from the current updatedSince, so
it falls as you walk, and rows that left the window are not in it.
For one patient’s complete history, use
POST /v4/patients/history instead of filtering
a clinic-wide feed: it reads every chart from one snapshot and says whether an
empty history is complete or not yet imported.
Appointments now emit appointment.created, appointment.updated,
appointment.cancelled and appointment.completed to apps holding the
read:appointments scope, so cancellations, no-shows, reschedules and new
bookings all arrive without polling for them. See the
webhooks guide for the payloads and the full event list.Still build reconciliation around polling. Delivery is at-least-once and
unordered, and an event can be lost outright — the events are a latency
improvement, not a source of truth. For a replayable, commit-ordered record of
every patient, identity, appointment and bill change, read the
change feed from your stored cursor; its changes.available
webhook is only a wake-up. Poll on a slower cadence than you would
without them and treat any disagreement as the poll being right.
1,000 requests per minute, per app, across every organization that has
installed it — a sliding window keyed on your app id alone, not on
(app, organization).This matters for multi-location clinics and for any app installed by more than
one practice: a full page-through for one large organization consumes budget that
every other organization’s sync shares. Pace accordingly — spread backfills, and
prefer a steady request rate over bursts.
GET /bills already embeds codingGroups[], each carrying diagnoses[] and
lineItems[], and on v4 it also nests the patient. A backfill does NOT need a
detail call per bill to read codes, and GET /bills/{id} returns the same
codingGroups shape the list row does.Before paging 40,000 bills twice, diff the two response schemas for the version
you are on — ExternalBillResponse vs ExternalBillDetailResponse in the
OpenAPI document — and pull the detail only for the fields that are genuinely
absent from the list row. That delta differs by version and this guide will not
track it faithfully; the spec will. At 1,000 requests/minute per app, 40,000
needless detail calls is ~40 minutes of a budget every organization on your app
shares.At the 1,000/min ceiling that is ~60k bill details per hour of continuous
polling. For a multi-year backfill:
Run it once, persist the codes your side, and switch to incremental afterwards.
Bound it by date range rather than fetching all history at once.
Keep it off the same minute-budget as your live sync if you can — a backfill
that starves the incremental poller makes your attribution stale exactly when
it matters.
Every bill carries the EHR’s own link to the appointment it was generated from and to
the visit note it was billed from — no patient-plus-date matching:
bill.appointmentId / bill.appointmentExternalId — the appointment. ?appointmentId=
filters /bills to one appointment’s bills.
bill.encounterId / bill.encounterExternalId — the note, as /v4/notes identifies it.
Several bills can share one (professional + facility). ?encounterId= accepts any
version id of the note.
appointment.billIds[] / appointment.encounterId — the same links from the
appointment side (archived and not-yet-synced bills excluded).
GET /bills/{id}?include=payments — dated money received against the bill: payments as
applied to its charges, plus payer remittances not applied yet. Refunds and reversals are
negative. See the payments field for the known EZDerm gaps.
Links fill in as bills are re-read. A newly filled link bumps the bill’supdatedAt,
so it reaches /bills?updatedSince consumers; it does NOT move the appointment’s
lastSyncedAt. Keep the join on the bills feed: mirror bill.appointmentId and join
locally, rather than re-reading appointments to discover new billIds.The first rollout fills links for historical bills in a backfill, which re-delivers
those bills once on the /bills delta feed. Dedupe on id as usual.appointment.bookingOrigin is ModMed’s own booking origin, verbatim. ModMed reports it
only on the bill, so it is null until the visit has been billed (and always null on
EZDerm) — it describes a past visit, not a fresh booking.
Appointment syncs run on a five-minute cadence per connector and cover a
window of one week back plus thirteen weeks ahead. An appointment
created in the EHR moments ago will not be in the mirror until the next pass, and
one scheduled beyond the sync window is not mirrored at all.
{"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":"guides/syncing","slug":"/guides/syncing","pageMetadata":{"title":"Syncing \u0026 incremental polling","description":"How Max AI mirrors EHR data, what `lastSyncedAt` guarantees, how rate limits are scoped, and the cost of backfills","href":"/guides/syncing"},"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 ..._provideComponents(),\n ...props.components\n };\n return _jsxs(_components.p, {\n children: [\"How Max AI mirrors EHR data, what \", _jsx(_components.code, {\n children: \"lastSyncedAt\"\n }), \" guarantees, how rate limits are scoped, and the cost of backfills\"]\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,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,em:`em`,li:`li`,p:`p`,strong:`strong`,ul:`ul`,..._provideComponents(),...props.components},{Heading,Warning}=_components;if(!Heading)_missingMdxReference(`Heading`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsxs(_components.p,{children:[`Max AI reads from a `,_jsx(_components.strong,{children:`mirror`}),` of the practice’s EHR, refreshed by per-connector\nsync tasks. Nothing you read is a live call into the EHR, so every read is\nsubject to mirror lag. This page is about building a poller that copes with that.`]}),`\n`,_jsx(Heading,{level:`2`,id:`polling-for-changes`,children:`Polling for changes`}),`\n`,_jsxs(_components.p,{children:[`Use `,_jsx(_components.code,{children:`updatedSince`}),` with `,_jsx(_components.code,{children:`cursorId`}),` on `,_jsx(_components.code,{children:`/appointments`}),` — the keyset walk described\nin `,_jsx(_components.a,{href:`/guides/pagination#delta-sync-and-cursorid`,children:`Pagination`}),`. That is the\nsupported change feed, and this page does not restate it.`]}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[_jsxs(_components.strong,{children:[`Do not walk a delta feed with `,_jsx(_components.code,{children:`page`}),`/`,_jsx(_components.code,{children:`offset`}),`.`]}),` Rows are ordered by the very\nstamp the sync workers rewrite, so a row that changes mid-walk moves to the end,\neverything after it shifts one position forward, and your next offset steps over\nwhichever row slid into that slot. That row is never returned, and its stamp is\nbelow the cursor your walk finishes on, so no later poll returns it either — a\ncancelled appointment can be silently skipped while the walk reports success.\nSorting by `,_jsx(_components.code,{children:`lastSyncedAt`}),` and paging by offset has this bug; an overlap window\ndoes not fix it, because the skipped row’s stamp is `,_jsx(_components.em,{children:`older`}),` than your cursor,\nnot newer.`]})}),`\n`,_jsx(_components.p,{children:`What the stamp itself guarantees:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsxs(_components.strong,{children:[_jsx(_components.code,{children:`lastSyncedAt`}),` advances only when the row’s data genuinely changed.`]}),` The\nappointments upsert is guarded by a no-op predicate covering every column it\nwrites, so the timestamp is a `,_jsx(_components.em,{children:`changed-at`}),`, not a `,_jsx(_components.em,{children:`last-seen-at`}),`, and a quiet\nappointment keeps its old value indefinitely. The reference catalogues\n(`,_jsx(_components.code,{children:`/appointment-types`}),`, `,_jsx(_components.code,{children:`/cancel-reasons`}),`) deliberately do the opposite: their\n`,_jsx(_components.code,{children:`lastSyncedAt`}),` is a `,_jsx(_components.em,{children:`last-seen-at`}),`: it advances on every sync that still\nobserves the row, so a stale catalogue is distinguishable from a healthy one.\nA retired row stops being observed and its stamp freezes there. See\n`,_jsx(_components.a,{href:`/guides/appointment-reference-data`,children:`Appointment reference data`}),`.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`It is stamped by the database inside the write transaction, before commit.`}),`\nKeyset pagination prevents offset shifts and resolves timestamp ties; it does\nnot make the feed commit-ordered. A write whose transaction commits after you\nread past its stamp lands behind your cursor, even when you use `,_jsx(_components.code,{children:`cursorId`}),`.\nThe gap is bounded by the length of one sync batch transaction (normally well\nunder a second, longer under lock contention), so pin each walk with an\n`,_jsx(_components.code,{children:`updatedUntil`}),` a few minutes in the past and start the next walk from an\noverlap before it, applying rows idempotently by `,_jsx(_components.code,{children:`id`}),`. Keep periodic\nreconciliation for anything outside that bound. Webhook `,_jsx(_components.code,{children:`updatedAt`}),` uses the\nsame database clock.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`A whole-clinic walk is a set of windows, not one pass.`}),` Fix\n`,_jsx(_components.code,{children:`updatedUntil`}),` for the walk and advance `,_jsx(_components.code,{children:`updatedSince`}),` + `,_jsx(_components.code,{children:`cursorId`}),` from the\nlast row. A row that stays in the window cannot be skipped. A row re-synced\nduring the walk gets a stamp past `,_jsx(_components.code,{children:`updatedUntil`}),` and leaves the window; it is\nin the next window instead. The window is done when a page comes back shorter\nthan `,_jsx(_components.code,{children:`pageSize`}),`. Do not prove completeness by comparing distinct rows against\n`,_jsx(_components.code,{children:`totalCount`}),`: on a keyset page it counts from the current `,_jsx(_components.code,{children:`updatedSince`}),`, so\nit falls as you walk, and rows that left the window are not in it.`]}),`\n`,_jsxs(_components.li,{children:[_jsxs(_components.strong,{children:[`For one patient’s complete history, use\n`,_jsx(_components.a,{href:`/guides/patient-history`,children:_jsx(_components.code,{children:`POST /v4/patients/history`})})]}),` instead of filtering\na clinic-wide feed: it reads every chart from one snapshot and says whether an\nempty history is complete or not yet imported.`]}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`webhooks`,children:`Webhooks`}),`\n`,_jsxs(_components.p,{children:[`Appointments now emit `,_jsx(_components.code,{children:`appointment.created`}),`, `,_jsx(_components.code,{children:`appointment.updated`}),`,\n`,_jsx(_components.code,{children:`appointment.cancelled`}),` and `,_jsx(_components.code,{children:`appointment.completed`}),` to apps holding the\n`,_jsx(_components.code,{children:`read:appointments`}),` scope, so cancellations, no-shows, reschedules and new\nbookings all arrive without polling for them. See the\n`,_jsx(_components.a,{href:`/guides/webhooks`,children:`webhooks guide`}),` for the payloads and the full event list.`]}),`\n`,_jsxs(_components.p,{children:[`Still build reconciliation around polling. Delivery is at-least-once and\nunordered, and an event can be lost outright — the events are a latency\nimprovement, not a source of truth. For a replayable, commit-ordered record of\nevery patient, identity, appointment and bill change, read the\n`,_jsx(_components.a,{href:`/guides/changes`,children:`change feed`}),` from your stored cursor; its `,_jsx(_components.code,{children:`changes.available`}),`\nwebhook is only a wake-up. Poll on a slower cadence than you would\nwithout them and treat any disagreement as the poll being right.`]}),`\n`,_jsx(Heading,{level:`2`,id:`rate-limits`,children:`Rate limits`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`1,000 requests per minute, per app, across every organization that has\ninstalled it`}),` — a sliding window keyed on your app id alone, not on\n`,_jsx(_components.code,{children:`(app, organization)`}),`.`]}),`\n`,_jsx(_components.p,{children:`This matters for multi-location clinics and for any app installed by more than\none practice: a full page-through for one large organization consumes budget that\nevery other organization’s sync shares. Pace accordingly — spread backfills, and\nprefer a steady request rate over bursts.`}),`\n`,_jsx(Heading,{level:`2`,id:`backfill-cost`,children:`Backfill cost`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`GET /bills`}),` already embeds `,_jsx(_components.code,{children:`codingGroups[]`}),`, each carrying `,_jsx(_components.code,{children:`diagnoses[]`}),` and\n`,_jsx(_components.code,{children:`lineItems[]`}),`, and on v4 it also nests the `,_jsx(_components.code,{children:`patient`}),`. A backfill does NOT need a\ndetail call per bill to read codes, and `,_jsx(_components.code,{children:`GET /bills/{id}`}),` returns the same\n`,_jsx(_components.code,{children:`codingGroups`}),` shape the list row does.`]}),`\n`,_jsxs(_components.p,{children:[`Before paging 40,000 bills twice, diff the two response schemas for the version\nyou are on — `,_jsx(_components.code,{children:`ExternalBillResponse`}),` vs `,_jsx(_components.code,{children:`ExternalBillDetailResponse`}),` in the\nOpenAPI document — and pull the detail only for the fields that are genuinely\nabsent from the list row. That delta differs by version and this guide will not\ntrack it faithfully; the spec will. At 1,000 requests/minute per app, 40,000\nneedless detail calls is ~40 minutes of a budget every organization on your app\nshares.`]}),`\n`,_jsx(_components.p,{children:`At the 1,000/min ceiling that is ~60k bill details per hour of continuous\npolling. For a multi-year backfill:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`Run it once, persist the codes your side, and switch to incremental afterwards.`}),`\n`,_jsx(_components.li,{children:`Bound it by date range rather than fetching all history at once.`}),`\n`,_jsx(_components.li,{children:`Keep it off the same minute-budget as your live sync if you can — a backfill\nthat starves the incremental poller makes your attribution stale exactly when\nit matters.`}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`linking-appointments-bills-and-payments`,children:`Linking appointments, bills and payments`}),`\n`,_jsx(_components.p,{children:`Every bill carries the EHR’s own link to the appointment it was generated from and to\nthe visit note it was billed from — no patient-plus-date matching:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`bill.appointmentId`}),` / `,_jsx(_components.code,{children:`bill.appointmentExternalId`}),` — the appointment. `,_jsx(_components.code,{children:`?appointmentId=`}),`\nfilters `,_jsx(_components.code,{children:`/bills`}),` to one appointment’s bills.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`bill.encounterId`}),` / `,_jsx(_components.code,{children:`bill.encounterExternalId`}),` — the note, as `,_jsx(_components.code,{children:`/v4/notes`}),` identifies it.\nSeveral bills can share one (professional + facility). `,_jsx(_components.code,{children:`?encounterId=`}),` accepts any\nversion id of the note.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`appointment.billIds[]`}),` / `,_jsx(_components.code,{children:`appointment.encounterId`}),` — the same links from the\nappointment side (archived and not-yet-synced bills excluded).`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`GET /bills/{id}?include=payments`}),` — dated money received against the bill: payments as\napplied to its charges, plus payer remittances not applied yet. Refunds and reversals are\nnegative. See the `,_jsx(_components.code,{children:`payments`}),` field for the known EZDerm gaps.`]}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`Links fill in as bills are re-read. A newly filled link bumps the `,_jsx(_components.strong,{children:`bill’s`}),` `,_jsx(_components.code,{children:`updatedAt`}),`,\nso it reaches `,_jsx(_components.code,{children:`/bills?updatedSince`}),` consumers; it does NOT move the appointment’s\n`,_jsx(_components.code,{children:`lastSyncedAt`}),`. Keep the join on the bills feed: mirror `,_jsx(_components.code,{children:`bill.appointmentId`}),` and join\nlocally, rather than re-reading appointments to discover new `,_jsx(_components.code,{children:`billIds`}),`.`]}),`\n`,_jsxs(_components.p,{children:[`The first rollout fills links for historical bills in a backfill, which re-delivers\nthose bills once on the `,_jsx(_components.code,{children:`/bills`}),` delta feed. Dedupe on `,_jsx(_components.code,{children:`id`}),` as usual.`]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`appointment.bookingOrigin`}),` is ModMed’s own booking origin, verbatim. ModMed reports it\nonly on the bill, so it is null until the visit has been billed (and always null on\nEZDerm) — it describes a past visit, not a fresh booking.`]}),`\n`,_jsx(Heading,{level:`2`,id:`mirror-lag`,children:`Mirror lag`}),`\n`,_jsx(_components.p,{children:`Appointment syncs run on a five-minute cadence per connector and cover a\nwindow of one week back plus thirteen weeks ahead. An appointment\ncreated in the EHR moments ago will not be in the mirror until the next pass, and\none scheduled beyond the sync window is not mirrored at all.`})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Syncing \u0026 incremental polling","description":"How Max AI mirrors EHR data, what `lastSyncedAt` guarantees, how rate limits are scoped, and the cost of backfills","href":"/guides/syncing"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Polling for changes","slug":"polling-for-changes","depth":2,"children":[]},{"title":"Webhooks","slug":"webhooks","depth":2,"children":[]},{"title":"Rate limits","slug":"rate-limits","depth":2,"children":[]},{"title":"Backfill cost","slug":"backfill-cost","depth":2,"children":[]},{"title":"Linking appointments, bills and payments","slug":"linking-appointments-bills-and-payments","depth":2,"children":[]},{"title":"Mirror lag","slug":"mirror-lag","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"maxaiinc-02a56fd1","siteName":"Max AI Developer Docs","title":"Syncing \u0026 incremental polling - Max AI Developer Docs","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-07T16:48:12.439Z","originalFileLocation":"guides/syncing.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=\"How Max AI mirrors EHR data, what lastSyncedAt guarantees, how rate limits are scoped, and the cost of backfills\">\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=\"Syncing \u0026amp; incremental polling - Max AI Developer Docs\">\u003cmeta data-mint-head property=\"og:description\" content=\"How Max AI mirrors EHR data, what lastSyncedAt guarantees, how rate limits are scoped, and the cost of backfills\">\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/guides/syncing\">\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=Building+Apps\u0026amp;title=Syncing+%26+incremental+polling\u0026amp;description=How+Max+AI+mirrors+EHR+data%2C+what+%60lastSyncedAt%60+guarantees%2C+how+rate+limits+are+scoped%2C+and+the+cost+of+backfills\u0026amp;theme=02e0b3646d3b285707db65d5\u0026amp;signature=fc6ad1155b0f95e2b695de6c203378283e60d92545ad69a236868c56cd73d329\">\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=\"Syncing \u0026amp; incremental polling - Max AI Developer Docs\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"How Max AI mirrors EHR data, what lastSyncedAt guarantees, how rate limits are scoped, and the cost of backfills\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://maxaiinc-02a56fd1.mintlify.site/_mintlify/api/og/v2?division=Building+Apps\u0026amp;title=Syncing+%26+incremental+polling\u0026amp;description=How+Max+AI+mirrors+EHR+data%2C+what+%60lastSyncedAt%60+guarantees%2C+how+rate+limits+are+scoped%2C+and+the+cost+of+backfills\u0026amp;theme=02e0b3646d3b285707db65d5\u0026amp;signature=fc6ad1155b0f95e2b695de6c203378283e60d92545ad69a236868c56cd73d329\">\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/guides/syncing\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/guides/syncing.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/guides/syncing#webpage\",\"url\":\"https://docs.maxcare.ai/guides/syncing\",\"name\":\"Syncing \u0026 incremental polling\",\"description\":\"How Max AI mirrors EHR data, what lastSyncedAt guarantees, how rate limits are scoped, and the cost of backfills\",\"dateModified\":\"2026-10-07T16:48:12.439Z\",\"isPartOf\":{\"@id\":\"https://docs.maxcare.ai#website\"},\"breadcrumb\":{\"@id\":\"https://docs.maxcare.ai/guides/syncing#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.maxcare.ai/guides/syncing#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Building Apps\",\"item\":\"https://docs.maxcare.ai/guides/app-development\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Syncing \u0026 incremental polling\",\"item\":\"https://docs.maxcare.ai/guides/syncing\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.maxcare.ai/guides/syncing#article\",\"headline\":\"Syncing \u0026 incremental polling\",\"name\":\"Syncing \u0026 incremental polling\",\"description\":\"How Max AI mirrors EHR data, what lastSyncedAt guarantees, how rate limits are scoped, and the cost of backfills\",\"url\":\"https://docs.maxcare.ai/guides/syncing\",\"mainEntityOfPage\":{\"@id\":\"https://docs.maxcare.ai/guides/syncing#webpage\"},\"dateModified\":\"2026-10-07T16:48:12.439Z\",\"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","groups":[{"group":"Overview","pages":[{"title":"Max AI Developer Docs","href":"/guides"},{"title":"How It Works","href":"/guides/architecture"},{"title":"Getting Started","href":"/guides/getting-started"}]},{"group":"Core Concepts","pages":[{"title":"Authentication","href":"/guides/authentication"},{"title":"OAuth Authorization","href":"/guides/oauth"},{"title":"Scopes","href":"/guides/scopes"},{"title":"Pagination","href":"/guides/pagination"},{"title":"Error Handling","href":"/guides/errors"}]},{"group":"Working with Appointments","pages":[{"title":"Appointment statuses","href":"/guides/appointment-status"},{"title":"Appointment types \u0026 cancel reasons","href":"/guides/appointment-reference-data"},{"title":"Availability \u0026 the appointment finder","href":"/guides/appointment-finder"}]},{"group":"Working with Patients","pages":[{"title":"Patient mailing addresses","href":"/guides/patient-addresses"},{"title":"Payer identities","href":"/guides/payer-identities"}]},{"group":"Prescriptions","pages":[{"title":"E-Prescribing","href":"/guides/e-prescribing"}]},{"group":"Patient Tracking","pages":[{"title":"Patient Tracking","href":"/guides/patient-tracking"}]},{"group":"Building Apps","pages":[{"title":"App Development","href":"/guides/app-development"},{"title":"CLI Reference","href":"/guides/cli"},{"title":"Rate Limits","description":"API rate limiting and throttling policies","href":"/guides/rate-limits"},{"title":"Syncing \u0026 incremental polling","href":"/guides/syncing"},{"title":"Patient history \u0026 readiness","description":"Read complete, snapshot-consistent appointment and bill histories for a group of charts, prove a linked group's history complete on its own, and tell an empty history from one that is not imported yet","href":"/guides/patient-history"},{"title":"Change feed","href":"/guides/changes"},{"title":"Webhooks","href":"/guides/webhooks"},{"title":"On-demand sync","href":"/guides/on-demand-sync"},{"title":"Live EHR reads","href":"/guides/ehr-live-reads"}]}]},{"tab":"API Reference","versions":[{"version":"v4","tag":"Latest","groups":[{"group":"API Reference","pages":[{"group":"Appointment Types","pages":[{"title":"List appointment types","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /appointment-types","href":"/api-reference/v4/appointment-types/list-appointment-types"}]},{"group":"Appointments","pages":[{"title":"List appointments","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /appointments","href":"/api-reference/v4/appointments/list-appointments"},{"title":"Book an appointment","deprecated":null,"version":null,"openapi":"/openapi-v4.json post /appointments","href":"/api-reference/v4/appointments/book-an-appointment"},{"title":"List cancellation reasons","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /appointments/cancel-reasons","href":"/api-reference/v4/appointments/list-cancellation-reasons"},{"title":"List appointment statuses","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /appointments/statuses","href":"/api-reference/v4/appointments/list-appointment-statuses"},{"title":"Get appointment by ID","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /appointments/{id}","href":"/api-reference/v4/appointments/get-appointment-by-id"},{"title":"Reschedule an appointment","deprecated":null,"version":null,"openapi":"/openapi-v4.json patch /appointments/{id}","href":"/api-reference/v4/appointments/reschedule-an-appointment"},{"title":"Cancel an appointment","deprecated":null,"version":null,"openapi":"/openapi-v4.json post /appointments/{id}/cancel","href":"/api-reference/v4/appointments/cancel-an-appointment"}]},{"group":"Bank Accounts","pages":[{"title":"List connected bank accounts","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /bank-accounts","href":"/api-reference/v4/bank-accounts/list-connected-bank-accounts"}]},{"group":"Bank Transactions","pages":[{"title":"List bank deposits","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /bank-transactions","href":"/api-reference/v4/bank-transactions/list-bank-deposits"}]},{"group":"Bills","pages":[{"title":"List bills","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /bills","href":"/api-reference/v4/bills/list-bills"},{"title":"Get bill by ID","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /bills/{id}","href":"/api-reference/v4/bills/get-bill-by-id"}]},{"group":"Cancel Reasons","pages":[{"title":"List appointment cancellation reasons","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /cancel-reasons","href":"/api-reference/v4/cancel-reasons/list-appointment-cancellation-reasons"}]},{"group":"Changes","pages":[{"title":"Replay the organization's change feed from a cursor","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /changes","href":"/api-reference/v4/changes/replay-the-organizations-change-feed-from-a-cursor"}]},{"group":"Claims","pages":[{"title":"List claims","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /claims","href":"/api-reference/v4/claims/list-claims"},{"title":"Get claim by ID","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /claims/{id}","href":"/api-reference/v4/claims/get-claim-by-id"}]},{"group":"Deposit matches","pages":[{"title":"Record that a deposit paid one of your remittances","deprecated":null,"version":null,"openapi":"/openapi-v4.json post /deposit-matches","href":"/api-reference/v4/deposit-matches/record-that-a-deposit-paid-one-of-your-remittances"},{"title":"Revoke one of your deposit matches","deprecated":null,"version":null,"openapi":"/openapi-v4.json delete /deposit-matches/{id}","href":"/api-reference/v4/deposit-matches/revoke-one-of-your-deposit-matches"}]},{"group":"Patients","pages":[{"title":"Where each document category is filed","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /documents/categories","href":"/api-reference/v4/patients/where-each-document-category-is-filed"},{"title":"List patients","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /patients","href":"/api-reference/v4/patients/list-patients"},{"title":"Create a patient","deprecated":null,"version":null,"openapi":"/openapi-v4.json post /patients","href":"/api-reference/v4/patients/create-a-patient"},{"title":"Read complete appointment and bill histories for up to 25 charts","deprecated":null,"version":null,"openapi":"/openapi-v4.json post /patients/history","href":"/api-reference/v4/patients/read-complete-appointment-and-bill-histories-for-up-to-25-charts"},{"title":"Read whole appointment histories from the EHR for up to 25 charts","deprecated":null,"version":null,"openapi":"/openapi-v4.json post /patients/history/refresh","href":"/api-reference/v4/patients/read-whole-appointment-histories-from-the-ehr-for-up-to-25-charts"},{"title":"Match a patient by demographics","deprecated":null,"version":null,"openapi":"/openapi-v4.json post /patients/match","href":"/api-reference/v4/patients/match-a-patient-by-demographics"},{"title":"Get patient by ID","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /patients/{id}","href":"/api-reference/v4/patients/get-patient-by-id"},{"title":"Update a patient","deprecated":null,"version":null,"openapi":"/openapi-v4.json patch /patients/{id}","href":"/api-reference/v4/patients/update-a-patient"},{"title":"List a patient's allergies","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /patients/{id}/allergies","href":"/api-reference/v4/patients/list-a-patients-allergies"},{"title":"List a patient's chart documents","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /patients/{id}/documents","href":"/api-reference/v4/patients/list-a-patients-chart-documents"},{"title":"File a document on a patient's chart","deprecated":null,"version":null,"openapi":"/openapi-v4.json post /patients/{id}/documents","href":"/api-reference/v4/patients/file-a-document-on-a-patients-chart"},{"title":"Refresh a patient's chart-document list","deprecated":null,"version":null,"openapi":"/openapi-v4.json post /patients/{id}/documents/refresh","href":"/api-reference/v4/patients/refresh-a-patients-chart-document-list"},{"title":"Download one chart document's bytes","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /patients/{id}/documents/{documentId}/content","href":"/api-reference/v4/patients/download-one-chart-documents-bytes"},{"title":"Pull one chart document's bytes from the EHR","deprecated":null,"version":null,"openapi":"/openapi-v4.json post /patients/{id}/documents/{documentId}/fetch","href":"/api-reference/v4/patients/pull-one-chart-documents-bytes-from-the-ehr"},{"title":"Attach insurance to an existing patient","deprecated":null,"version":null,"openapi":"/openapi-v4.json post /patients/{id}/insurance","href":"/api-reference/v4/patients/attach-insurance-to-an-existing-patient"},{"title":"Attach an insurance card image","deprecated":null,"version":null,"openapi":"/openapi-v4.json post /patients/{id}/insurance/cards","href":"/api-reference/v4/patients/attach-an-insurance-card-image"},{"title":"Attach insurance with an exact payer","deprecated":null,"version":null,"openapi":"/openapi-v4.json post /patients/{id}/insurance:exact","href":"/api-reference/v4/patients/attach-insurance-with-an-exact-payer"},{"title":"List a patient's lab / pathology results","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /patients/{id}/lab-results","href":"/api-reference/v4/patients/list-a-patients-lab-pathology-results"},{"title":"Set a patient's referring provider","deprecated":null,"version":null,"openapi":"/openapi-v4.json put /patients/{id}/referring-provider","href":"/api-reference/v4/patients/set-a-patients-referring-provider"},{"title":"Change an insurance policy's type","deprecated":null,"version":null,"openapi":"/openapi-v4.json patch /patients/{patientId}/insurance-policies/{policyId}","href":"/api-reference/v4/patients/change-an-insurance-policys-type"}]},{"group":"EHR live reads","pages":[{"title":"Which live EHR reads each of the organization's EHR instances supports","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /ehr/capabilities","href":"/api-reference/v4/ehr-live-reads/which-live-ehr-reads-each-of-the-organizations-ehr-instances-supports"},{"title":"Search the allergen catalog (at most 50 results)","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /ehr/catalog/allergens","href":"/api-reference/v4/ehr-live-reads/search-the-allergen-catalog-at-most-50-results"},{"title":"Search SNOMED conditions (at most 50 results)","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /ehr/catalog/conditions","href":"/api-reference/v4/ehr-live-reads/search-snomed-conditions-at-most-50-results"},{"title":"Search the drug catalog (at most 50 results)","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /ehr/catalog/medications","href":"/api-reference/v4/ehr-live-reads/search-the-drug-catalog-at-most-50-results"},{"title":"Search SNOMED surgical procedures (at most 50 results)","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /ehr/catalog/surgeries","href":"/api-reference/v4/ehr-live-reads/search-snomed-surgical-procedures-at-most-50-results"},{"title":"The insurance policy types an EHR instance accepts","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /ehr/insurance-policy-types","href":"/api-reference/v4/ehr-live-reads/the-insurance-policy-types-an-ehr-instance-accepts"},{"title":"Find an instance's charts by date of birth and name, active or not","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /ehr/patients/search","href":"/api-reference/v4/ehr-live-reads/find-an-instances-charts-by-date-of-birth-and-name-active-or-not"},{"title":"A patient's practice-management alerts","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /ehr/patients/{patientId}/alerts","href":"/api-reference/v4/ehr-live-reads/a-patients-practice-management-alerts"},{"title":"A patient's appointments, past and future","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /ehr/patients/{patientId}/appointments","href":"/api-reference/v4/ehr-live-reads/a-patients-appointments-past-and-future"},{"title":"A visit's unsigned consents","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /ehr/patients/{patientId}/consents","href":"/api-reference/v4/ehr-live-reads/a-visits-unsigned-consents"},{"title":"One consent's PDF","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /ehr/patients/{patientId}/consents/{consentRef}/pdf","href":"/api-reference/v4/ehr-live-reads/one-consents-pdf"},{"title":"A patient's demographics as the EHR holds them","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /ehr/patients/{patientId}/demographics","href":"/api-reference/v4/ehr-live-reads/a-patients-demographics-as-the-ehr-holds-them"},{"title":"The files in a patient's chart","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /ehr/patients/{patientId}/documents","href":"/api-reference/v4/ehr-live-reads/the-files-in-a-patients-chart"},{"title":"One chart file's bytes","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /ehr/patients/{patientId}/documents/{ref}/content","href":"/api-reference/v4/ehr-live-reads/one-chart-files-bytes"},{"title":"A patient's visits, any note status","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /ehr/patients/{patientId}/encounters","href":"/api-reference/v4/ehr-live-reads/a-patients-visits-any-note-status"},{"title":"One visit","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /ehr/patients/{patientId}/encounters/{ref}","href":"/api-reference/v4/ehr-live-reads/one-visit"},{"title":"A visit's post-signoff addenda","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /ehr/patients/{patientId}/encounters/{ref}/addenda","href":"/api-reference/v4/ehr-live-reads/a-visits-post-signoff-addenda"},{"title":"A visit's final signed PDF","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /ehr/patients/{patientId}/encounters/{ref}/final-pdf","href":"/api-reference/v4/ehr-live-reads/a-visits-final-signed-pdf"},{"title":"A visit's SOAP note","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /ehr/patients/{patientId}/encounters/{ref}/soap-note","href":"/api-reference/v4/ehr-live-reads/a-visits-soap-note"},{"title":"A visit's note status","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /ehr/patients/{patientId}/encounters/{ref}/status","href":"/api-reference/v4/ehr-live-reads/a-visits-note-status"},{"title":"A patient's active insurance policies","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /ehr/patients/{patientId}/insurances","href":"/api-reference/v4/ehr-live-reads/a-patients-active-insurance-policies"},{"title":"A policy's prior authorizations","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /ehr/patients/{patientId}/insurances/{policyRef}/prior-authorizations","href":"/api-reference/v4/ehr-live-reads/a-policys-prior-authorizations"},{"title":"Create a prior authorization on a policy","deprecated":null,"version":null,"openapi":"/openapi-v4.json post /ehr/patients/{patientId}/insurances/{policyRef}/prior-authorizations","href":"/api-reference/v4/ehr-live-reads/create-a-prior-authorization-on-a-policy"},{"title":"A patient's lab and pathology results","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /ehr/patients/{patientId}/lab-results","href":"/api-reference/v4/ehr-live-reads/a-patients-lab-and-pathology-results"},{"title":"A patient's balance and open charges","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /ehr/patients/{patientId}/ledger","href":"/api-reference/v4/ehr-live-reads/a-patients-balance-and-open-charges"},{"title":"A patient's medical history","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /ehr/patients/{patientId}/medical-history","href":"/api-reference/v4/ehr-live-reads/a-patients-medical-history"},{"title":"Charts this patient was merged with (ids only)","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /ehr/patients/{patientId}/merge-history","href":"/api-reference/v4/ehr-live-reads/charts-this-patient-was-merged-with-ids-only"},{"title":"A patient's sticky note","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /ehr/patients/{patientId}/sticky-note","href":"/api-reference/v4/ehr-live-reads/a-patients-sticky-note"},{"title":"Poll a live read that answered 202","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /ehr/reads/{readId}","href":"/api-reference/v4/ehr-live-reads/poll-a-live-read-that-answered-202"},{"title":"Language, race, ethnicity and other code lists of an EHR instance","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /ehr/reference-data","href":"/api-reference/v4/ehr-live-reads/language-race-ethnicity-and-other-code-lists-of-an-ehr-instance"}]},{"group":"Patient merges","pages":[{"title":"A merge this app requested","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /ehr/patient-merges/{id}","href":"/api-reference/v4/patient-merges/a-merge-this-app-requested"},{"title":"Merge this chart into another","deprecated":null,"version":null,"openapi":"/openapi-v4.json post /ehr/patients/{patientId}/merge","href":"/api-reference/v4/patient-merges/merge-this-chart-into-another"},{"title":"What merging this chart into another would do","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /ehr/patients/{patientId}/merge-preview","href":"/api-reference/v4/patient-merges/what-merging-this-chart-into-another-would-do"}]},{"group":"Eligibility Checks","pages":[{"title":"List eligibility checks","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /eligibility-checks","href":"/api-reference/v4/eligibility-checks/list-eligibility-checks"},{"title":"Run an eligibility check","deprecated":null,"version":null,"openapi":"/openapi-v4.json post /eligibility-checks","href":"/api-reference/v4/eligibility-checks/run-an-eligibility-check"},{"title":"Get eligibility check by ID","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /eligibility-checks/{id}","href":"/api-reference/v4/eligibility-checks/get-eligibility-check-by-id"}]},{"group":"Emails","pages":[{"title":"List sent emails","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /emails","href":"/api-reference/v4/emails/list-sent-emails"},{"title":"Send emails","deprecated":null,"version":null,"openapi":"/openapi-v4.json post /emails/send","href":"/api-reference/v4/emails/send-emails"},{"title":"Get email by ID","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /emails/{id}","href":"/api-reference/v4/emails/get-email-by-id"}]},{"group":"ERA Payments","pages":[{"title":"List ERA payments","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /era-payments","href":"/api-reference/v4/era-payments/list-era-payments"}]},{"group":"ERA Service Lines","pages":[{"title":"List ERA service lines","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /era-service-lines","href":"/api-reference/v4/era-service-lines/list-era-service-lines"},{"title":"Get ERA service line by ID","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /era-service-lines/{id}","href":"/api-reference/v4/era-service-lines/get-era-service-line-by-id"}]},{"group":"Facilities","pages":[{"title":"List facilities","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /facilities","href":"/api-reference/v4/facilities/list-facilities"},{"title":"Get facility by ID","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /facilities/{id}","href":"/api-reference/v4/facilities/get-facility-by-id"}]},{"group":"Faxes","pages":[{"title":"List faxes","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /faxes","href":"/api-reference/v4/faxes/list-faxes"},{"title":"Send a fax","deprecated":null,"version":null,"openapi":"/openapi-v4.json post /faxes/send","href":"/api-reference/v4/faxes/send-a-fax"},{"title":"List fax cover-page templates","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /faxes/templates","href":"/api-reference/v4/faxes/list-fax-cover-page-templates"},{"title":"Get fax by ID","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /faxes/{id}","href":"/api-reference/v4/faxes/get-fax-by-id"}]},{"group":"Insurance Policies","pages":[{"title":"List insurance policies","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /insurance-policies","href":"/api-reference/v4/insurance-policies/list-insurance-policies"},{"title":"Get insurance policy by ID","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /insurance-policies/{id}","href":"/api-reference/v4/insurance-policies/get-insurance-policy-by-id"},{"title":"List a policy's insurance card images","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /insurance-policies/{id}/attachments","href":"/api-reference/v4/insurance-policies/list-a-policys-insurance-card-images"}]},{"group":"Intramail","pages":[{"title":"List intramail messages","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /intramail/messages","href":"/api-reference/v4/intramail/list-intramail-messages"},{"title":"Send an intramail message (or save a draft)","deprecated":null,"version":null,"openapi":"/openapi-v4.json post /intramail/messages","href":"/api-reference/v4/intramail/send-an-intramail-message-or-save-a-draft"},{"title":"Get an intramail message","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /intramail/messages/{id}","href":"/api-reference/v4/intramail/get-an-intramail-message"},{"title":"Delete a draft","deprecated":null,"version":null,"openapi":"/openapi-v4.json delete /intramail/messages/{id}","href":"/api-reference/v4/intramail/delete-a-draft"},{"title":"Mark read or unread, flag, archive","deprecated":null,"version":null,"openapi":"/openapi-v4.json patch /intramail/messages/{id}","href":"/api-reference/v4/intramail/mark-read-or-unread-flag-archive"},{"title":"Reply, reply all or forward","deprecated":null,"version":null,"openapi":"/openapi-v4.json post /intramail/messages/{id}/reply","href":"/api-reference/v4/intramail/reply-reply-all-or-forward"},{"title":"Search intramail recipients","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /intramail/recipients","href":"/api-reference/v4/intramail/search-intramail-recipients"},{"title":"Intramail sync status","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /intramail/status","href":"/api-reference/v4/intramail/intramail-sync-status"}]},{"group":"Inventory","pages":[{"title":"List inventory changes","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /inventory/changes","href":"/api-reference/v4/inventory/list-inventory-changes"},{"title":"Get inventory change by ID","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /inventory/changes/{id}","href":"/api-reference/v4/inventory/get-inventory-change-by-id"},{"title":"List products in an inventory change","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /inventory/changes/{id}/products","href":"/api-reference/v4/inventory/list-products-in-an-inventory-change"},{"title":"List products","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /inventory/products","href":"/api-reference/v4/inventory/list-products"},{"title":"Get product by ID","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /inventory/products/{id}","href":"/api-reference/v4/inventory/get-product-by-id"},{"title":"Get stock levels","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /inventory/stock-levels","href":"/api-reference/v4/inventory/get-stock-levels"},{"title":"Get stock levels with per-lot breakdown","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /inventory/stock-levels/detail","href":"/api-reference/v4/inventory/get-stock-levels-with-per-lot-breakdown"}]},{"group":"Marketplace","pages":[{"title":"List this app's installations","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /marketplace/installations","href":"/api-reference/v4/marketplace/list-this-apps-installations"},{"title":"Get current app context","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /marketplace/me","href":"/api-reference/v4/marketplace/get-current-app-context"},{"title":"List the organization's members","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /marketplace/members","href":"/api-reference/v4/marketplace/list-the-organizations-members"},{"title":"Verify a session token and resolve its organization","deprecated":null,"version":null,"openapi":"/openapi-v4.json post /marketplace/verify-session","href":"/api-reference/v4/marketplace/verify-a-session-token-and-resolve-its-organization"}]},{"group":"Notes","pages":[{"title":"List patient notes","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /notes","href":"/api-reference/v4/notes/list-patient-notes"},{"title":"Get note by ID","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /notes/{id}","href":"/api-reference/v4/notes/get-note-by-id"},{"title":"Edit SOAP note fields","deprecated":null,"version":null,"openapi":"/openapi-v4.json patch /notes/{noteId}","href":"/api-reference/v4/notes/edit-soap-note-fields"},{"title":"Upload image to note","deprecated":null,"version":null,"openapi":"/openapi-v4.json post /notes/{noteId}/images","href":"/api-reference/v4/notes/upload-image-to-note"},{"title":"Delete image from note","deprecated":null,"version":null,"openapi":"/openapi-v4.json delete /notes/{noteId}/images/{imageId}","href":"/api-reference/v4/notes/delete-image-from-note"},{"title":"Get signed URL for a note image","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /notes/{noteId}/images/{imageId}/url","href":"/api-reference/v4/notes/get-signed-url-for-a-note-image"},{"title":"Edit impression fields","deprecated":null,"version":null,"openapi":"/openapi-v4.json patch /notes/{noteId}/impressions/{impressionId}","href":"/api-reference/v4/notes/edit-impression-fields"}]},{"group":"OAuth","pages":[{"title":"Exchange authorization code for user info","deprecated":null,"version":null,"openapi":"/openapi-v4.json post /oauth/token","href":"/api-reference/v4/oauth/exchange-authorization-code-for-user-info"}]},{"group":"Organization","pages":[{"title":"List the organization's members","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /org/members","href":"/api-reference/v4/organization/list-the-organizations-members"}]},{"group":"Patient Tracking","pages":[{"title":"List a source's facilities","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /patient-tracking/facilities","href":"/api-reference/v4/patient-tracking/list-a-sources-facilities"},{"title":"List a source's providers","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /patient-tracking/providers","href":"/api-reference/v4/patient-tracking/list-a-sources-providers"},{"title":"Read the tracking board","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /patient-tracking/snapshot","href":"/api-reference/v4/patient-tracking/read-the-tracking-board"},{"title":"List patient-tracking sources","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /patient-tracking/sources","href":"/api-reference/v4/patient-tracking/list-patient-tracking-sources"}]},{"group":"Pharmacies","pages":[{"title":"List a patient's pharmacies","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /patients/{patientId}/pharmacies","href":"/api-reference/v4/pharmacies/list-a-patients-pharmacies"},{"title":"Search the pharmacy directory","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /pharmacies/search","href":"/api-reference/v4/pharmacies/search-the-pharmacy-directory"}]},{"group":"Prescriptions","pages":[{"title":"List a patient's prescriptions","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /patients/{patientId}/prescriptions","href":"/api-reference/v4/prescriptions/list-a-patients-prescriptions"},{"title":"List prescribers","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /prescribers","href":"/api-reference/v4/prescriptions/list-prescribers"},{"title":"List stored prescriptions (change feed)","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /prescriptions","href":"/api-reference/v4/prescriptions/list-stored-prescriptions-change-feed"},{"title":"Create a draft prescription from an existing one","deprecated":null,"version":null,"openapi":"/openapi-v4.json post /prescriptions","href":"/api-reference/v4/prescriptions/create-a-draft-prescription-from-an-existing-one"},{"title":"Get a prescription","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /prescriptions/{id}","href":"/api-reference/v4/prescriptions/get-a-prescription"},{"title":"E-prescribe a pending prescription to a pharmacy","deprecated":null,"version":null,"openapi":"/openapi-v4.json post /prescriptions/{id}/send","href":"/api-reference/v4/prescriptions/e-prescribe-a-pending-prescription-to-a-pharmacy"},{"title":"Void a draft prescription","deprecated":null,"version":null,"openapi":"/openapi-v4.json post /prescriptions/{id}/void","href":"/api-reference/v4/prescriptions/void-a-draft-prescription"}]},{"group":"Payers","pages":[{"title":"Search payers","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /payers","href":"/api-reference/v4/payers/search-payers"},{"title":"Add a directory payer to the practice","deprecated":null,"version":null,"openapi":"/openapi-v4.json post /payers","href":"/api-reference/v4/payers/add-a-directory-payer-to-the-practice"},{"title":"Payer capabilities","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /payers/capabilities","href":"/api-reference/v4/payers/payer-capabilities"},{"title":"Search the EHR's national payer directory","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /payers/directory","href":"/api-reference/v4/payers/search-the-ehrs-national-payer-directory"},{"title":"Get payer by ID","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /payers/{id}","href":"/api-reference/v4/payers/get-payer-by-id"}]},{"group":"Phone Numbers","pages":[{"title":"List organization phone numbers","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /phone-numbers","href":"/api-reference/v4/phone-numbers/list-organization-phone-numbers"}]},{"group":"Prior Authorizations","pages":[{"title":"List prior authorizations","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /prior-authorizations","href":"/api-reference/v4/prior-authorizations/list-prior-authorizations"},{"title":"Get prior authorization by ID","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /prior-authorizations/{id}","href":"/api-reference/v4/prior-authorizations/get-prior-authorization-by-id"},{"title":"List source documents for a prior authorization","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /prior-authorizations/{id}/documents","href":"/api-reference/v4/prior-authorizations/list-source-documents-for-a-prior-authorization"}]},{"group":"Providers","pages":[{"title":"List providers","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /providers","href":"/api-reference/v4/providers/list-providers"},{"title":"Get provider by ID","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /providers/{id}","href":"/api-reference/v4/providers/get-provider-by-id"}]},{"group":"Schedule","pages":[{"title":"List appointment types","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /schedule/appointment-types","href":"/api-reference/v4/schedule/list-appointment-types"},{"title":"List availability templates","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /schedule/availability-templates","href":"/api-reference/v4/schedule/list-availability-templates"},{"title":"List calendar events","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /schedule/calendar-events","href":"/api-reference/v4/schedule/list-calendar-events"},{"title":"What this organization's EHR supports","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /schedule/capabilities","href":"/api-reference/v4/schedule/what-this-organizations-ehr-supports"},{"title":"Search the EHR's appointment finder","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /schedule/finder","href":"/api-reference/v4/schedule/search-the-ehrs-appointment-finder"},{"title":"Providers and facilities that take an appointment type","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /schedule/finder/provider-locations","href":"/api-reference/v4/schedule/providers-and-facilities-that-take-an-appointment-type"},{"title":"Hold a slot","deprecated":null,"version":null,"openapi":"/openapi-v4.json post /schedule/holds","href":"/api-reference/v4/schedule/hold-a-slot"},{"title":"Release a slot hold","deprecated":null,"version":null,"openapi":"/openapi-v4.json delete /schedule/holds/{holdId}","href":"/api-reference/v4/schedule/release-a-slot-hold"},{"title":"Find bookable slots","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /schedule/slots","href":"/api-reference/v4/schedule/find-bookable-slots"},{"title":"List visit reasons","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /visit-reasons","href":"/api-reference/v4/schedule/list-visit-reasons"}]},{"group":"Sync Requests","pages":[{"title":"Request a re-sync of a resource with the EHR","deprecated":null,"version":null,"openapi":"/openapi-v4.json post /sync-requests","href":"/api-reference/v4/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-v4.json post /sync-requests/batch","href":"/api-reference/v4/sync-requests/request-a-re-sync-of-several-resources-in-one-call"},{"title":"Get a sync request by ID","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /sync-requests/{id}","href":"/api-reference/v4/sync-requests/get-a-sync-request-by-id"}]},{"group":"Tasks","pages":[{"title":"List tasks","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /tasks","href":"/api-reference/v4/tasks/list-tasks"},{"title":"Create a task","deprecated":null,"version":null,"openapi":"/openapi-v4.json post /tasks","href":"/api-reference/v4/tasks/create-a-task"},{"title":"List task assignee groups","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /tasks/assignee-groups","href":"/api-reference/v4/tasks/list-task-assignee-groups"},{"title":"List task assignees","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /tasks/assignees","href":"/api-reference/v4/tasks/list-task-assignees"},{"title":"Task capabilities","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /tasks/capabilities","href":"/api-reference/v4/tasks/task-capabilities"},{"title":"Get task by ID","deprecated":null,"version":null,"openapi":"/openapi-v4.json get /tasks/{id}","href":"/api-reference/v4/tasks/get-task-by-id"},{"title":"Update task status","deprecated":null,"version":null,"openapi":"/openapi-v4.json patch /tasks/{id}","href":"/api-reference/v4/tasks/update-task-status"}]}]}]},{"version":"v3","pages":[{"title":"v3","href":"/api-reference/v3/appointment-types/list-appointment-types"}]},{"version":"v2","pages":[{"title":"v2","href":"/api-reference/v2/appointment-types/list-appointment-types"}]},{"version":"v1","pages":[{"title":"v1","href":"/api-reference/v1/appointment-types/list-appointment-types"}]}]}]},"basePath":"","title":"Syncing \u0026 incremental polling - Max AI Developer Docs","buildId":"dpl_8LJbrAiZvr1K98WQNZXCyY5AvT34","deploymentId":"dpl_8LJbrAiZvr1K98WQNZXCyY5AvT34","dynamics":[],"chunks":[]}