{
"code": "server_unresponsive",
"message": "EHR integration is not available for this note",
"trace_id": "550e8400-e29b-41d4-a716-446655440000"
}
Appointments
Book an appointment
Accepts a booking. The EHR write is asynchronous (changed deliberately — see below): a 202 with syncStatus: "pending" means the slot is RESERVED against everyone else booking through Max AI and the appointment is durably recorded, but it is NOT on the practice’s calendar yet and externalId is null. Completion is reported by webhook: appointment.confirmed (written; externalId now known), appointment.rejected (the slot went away — the event carries suggestedSlots, so offer those rather than restarting the flow), or appointment.write_failed (could not be written after retries). Polling GET /appointments/{id} works too. Do not tell a patient they are booked on this response alone. This previously returned 201 after a synchronous write, which made a slow tenant a slow booking form and a vendor outage a booking outage. Booking now succeeds while the EHR is unreachable. Send an Idempotency-Key header — it is honoured for 24 hours per app+organization, and a completed request replays its result with idempotentReplay: true. If acceptance could not be confirmed, the same key remains protected for that period and returns 409 ehr_write_uncertain with requiresReconciliation: true; verify the booking before creating another. The guarantee FAILS CLOSED: if the idempotency store is unreachable the request is refused with 503 idempotency_unavailable and nothing is sent to the EHR, rather than proceeding with the guarantee silently withdrawn. That response is safe to retry without checking for a duplicate first. To accept at-least-once delivery instead, omit the header. Returns 409 slot_unavailable when capacity went away, 409 hold_expired when the supplied hold lapsed, and 503 no_booking_identity when the organization has no system connector for unattended writes.
Client-generated UUID. Strongly recommended: on a live calendar a duplicate appointment is worse than a slow response. Sending it is also a request for exactly-once — if that cannot be honoured the write is refused (503 idempotency_unavailable) rather than downgraded.
The App Bridge token of the logged-in user (maxcare.appToken()), verified for this app and organization. With it the change is made through that user's own EHR login when they have a usable one; without it, through the organization's system login (meta.resolvedBy says which). A token that does not verify is 401 authorizer_unverified. Sent as a header so it stays out of URLs.
Availability template ID (avt_…) from the chosen slot's templateIds. On ModMed this pins the appointment to that calendar preference so it consumes the right window's capacity.
Why the patient is being seen, written to the EHR's own reason-for-visit field (never to notes). ModMed only: check reasonForVisit on GET /schedule/capabilities; other EHRs refuse it with capability_unsupported.
Maximum string length: 2000
Example:
"Changing mole on left forearm, referred for evaluation"
NPI of the referring provider, attached to the appointment as its referral. ModMed only (see referringProviderNpi on GET /schedule/capabilities). On ModMed the NPI is added to the practice's referral directory from the NPI registry when missing; an NPI that cannot be resolved does not fail the booking, it is booked without one.
{"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/appointments/book-an-appointment","slug":"/api-reference/v3/appointments/book-an-appointment","pageMetadata":{"title":"Book an appointment","description":"Accepts a booking. **The EHR write is asynchronous** (changed deliberately — see below): a `202` with `syncStatus: \"pending\"` means the slot is RESERVED against everyone else booking through Max AI and the appointment is durably recorded, but it is NOT on the practice's calendar yet and `externalId` is null. Completion is reported by webhook: `appointment.confirmed` (written; `externalId` now known), `appointment.rejected` (the slot went away — the event carries `suggestedSlots`, so offer those rather than restarting the flow), or `appointment.write_failed` (could not be written after retries). Polling `GET /appointments/{id}` works too. **Do not tell a patient they are booked on this response alone.** This previously returned `201` after a synchronous write, which made a slow tenant a slow booking form and a vendor outage a booking outage. Booking now succeeds while the EHR is unreachable. Send an `Idempotency-Key` header — it is honoured for 24 hours per app+organization, and a completed request replays its result with `idempotentReplay: true`. If acceptance could not be confirmed, the same key remains protected for that period and returns 409 `ehr_write_uncertain` with `requiresReconciliation: true`; verify the booking before creating another. The guarantee FAILS CLOSED: if the idempotency store is unreachable the request is refused with 503 `idempotency_unavailable` and nothing is sent to the EHR, rather than proceeding with the guarantee silently withdrawn. That response is safe to retry without checking for a duplicate first. To accept at-least-once delivery instead, omit the header. Returns 409 `slot_unavailable` when capacity went away, 409 `hold_expired` when the supplied hold lapsed, and 503 `no_booking_identity` when the organization has no system connector for unattended writes.","deprecated":null,"version":null,"openapi":"/openapi-v3.json post /appointments","href":"/api-reference/v3/appointments/book-an-appointment","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: [\"Accepts a booking. \", _jsx(_components.strong, {\n children: \"The EHR write is asynchronous\"\n }), \" (changed deliberately — see below): a \", _jsx(_components.code, {\n children: \"202\"\n }), \" with \", _jsx(_components.code, {\n children: \"syncStatus: \\\"pending\\\"\"\n }), \" means the slot is RESERVED against everyone else booking through Max AI and the appointment is durably recorded, but it is NOT on the practice’s calendar yet and \", _jsx(_components.code, {\n children: \"externalId\"\n }), \" is null. Completion is reported by webhook: \", _jsx(_components.code, {\n children: \"appointment.confirmed\"\n }), \" (written; \", _jsx(_components.code, {\n children: \"externalId\"\n }), \" now known), \", _jsx(_components.code, {\n children: \"appointment.rejected\"\n }), \" (the slot went away — the event carries \", _jsx(_components.code, {\n children: \"suggestedSlots\"\n }), \", so offer those rather than restarting the flow), or \", _jsx(_components.code, {\n children: \"appointment.write_failed\"\n }), \" (could not be written after retries). Polling \", _jsx(_components.code, {\n children: \"GET /appointments/{id}\"\n }), \" works too. \", _jsx(_components.strong, {\n children: \"Do not tell a patient they are booked on this response alone.\"\n }), \" This previously returned \", _jsx(_components.code, {\n children: \"201\"\n }), \" after a synchronous write, which made a slow tenant a slow booking form and a vendor outage a booking outage. Booking now succeeds while the EHR is unreachable. Send an \", _jsx(_components.code, {\n children: \"Idempotency-Key\"\n }), \" header — it is honoured for 24 hours per app+organization, and a completed request replays its result with \", _jsx(_components.code, {\n children: \"idempotentReplay: true\"\n }), \". If acceptance could not be confirmed, the same key remains protected for that period and returns 409 \", _jsx(_components.code, {\n children: \"ehr_write_uncertain\"\n }), \" with \", _jsx(_components.code, {\n children: \"requiresReconciliation: true\"\n }), \"; verify the booking before creating another. The guarantee FAILS CLOSED: if the idempotency store is unreachable the request is refused with 503 \", _jsx(_components.code, {\n children: \"idempotency_unavailable\"\n }), \" and nothing is sent to the EHR, rather than proceeding with the guarantee silently withdrawn. That response is safe to retry without checking for a duplicate first. To accept at-least-once delivery instead, omit the header. Returns 409 \", _jsx(_components.code, {\n children: \"slot_unavailable\"\n }), \" when capacity went away, 409 \", _jsx(_components.code, {\n children: \"hold_expired\"\n }), \" when the supplied hold lapsed, and 503 \", _jsx(_components.code, {\n children: \"no_booking_identity\"\n }), \" when the organization has no system connector for unattended writes.\"]\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":"Book an appointment","description":"Accepts a booking. **The EHR write is asynchronous** (changed deliberately — see below): a `202` with `syncStatus: \"pending\"` means the slot is RESERVED against everyone else booking through Max AI and the appointment is durably recorded, but it is NOT on the practice's calendar yet and `externalId` is null. Completion is reported by webhook: `appointment.confirmed` (written; `externalId` now known), `appointment.rejected` (the slot went away — the event carries `suggestedSlots`, so offer those rather than restarting the flow), or `appointment.write_failed` (could not be written after retries). Polling `GET /appointments/{id}` works too. **Do not tell a patient they are booked on this response alone.** This previously returned `201` after a synchronous write, which made a slow tenant a slow booking form and a vendor outage a booking outage. Booking now succeeds while the EHR is unreachable. Send an `Idempotency-Key` header — it is honoured for 24 hours per app+organization, and a completed request replays its result with `idempotentReplay: true`. If acceptance could not be confirmed, the same key remains protected for that period and returns 409 `ehr_write_uncertain` with `requiresReconciliation: true`; verify the booking before creating another. The guarantee FAILS CLOSED: if the idempotency store is unreachable the request is refused with 503 `idempotency_unavailable` and nothing is sent to the EHR, rather than proceeding with the guarantee silently withdrawn. That response is safe to retry without checking for a duplicate first. To accept at-least-once delivery instead, omit the header. Returns 409 `slot_unavailable` when capacity went away, 409 `hold_expired` when the supplied hold lapsed, and 503 `no_booking_identity` when the organization has no system connector for unattended writes.","deprecated":null,"version":null,"openapi":"/openapi-v3.json post /appointments","href":"/api-reference/v3/appointments/book-an-appointment","autogeneratedByOpenApi":true}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"description":"Accepts a booking. **The EHR write is asynchronous** (changed deliberately — see below): a `202` with `syncStatus: \"pending\"` means the slot is RESERVED against everyone else booking through Max AI and the appointment is durably recorded, but it is NOT on the practice's calendar yet and `externalId` is null. Completion is reported by webhook: `appointment.confirmed` (written; `externalId` now known), `appointment.rejected` (the slot went away — the event carries `suggestedSlots`, so offer those rather than restarting the flow), or `appointment.write_failed` (could not be written after retries). Polling `GET /appointments/{id}` works too. **Do not tell a patient they are booked on this response alone.** This previously returned `201` after a synchronous write, which made a slow tenant a slow booking form and a vendor outage a booking outage. Booking now succeeds while the EHR is unreachable. Send an `Idempotency-Key` header — it is honoured for 24 hours per app+organization, and a completed request replays its result with `idempotentReplay: true`. If acceptance could not be confirmed, the same key remains protected for that period and returns 409 `ehr_write_uncertain` with `requiresReconciliation: true`; verify the booking before creating another. The guarantee FAILS CLOSED: if the idempotency store is unreachable the request is refused with 503 `idempotency_unavailable` and nothing is sent to the EHR, rather than proceeding with the guarantee silently withdrawn. That response is safe to retry without checking for a duplicate first. To accept at-least-once delivery instead, omit the header. Returns 409 `slot_unavailable` when capacity went away, 409 `hold_expired` when the supplied hold lapsed, and 503 `no_booking_identity` when the organization has no system connector for unattended writes.","operationId":"AppointmentsPublicController_createAppointment","parameters":["86e0da11-5f10-47ee-9b61-64b058410f85","afaecbf3-388b-40f2-abfd-f044eb6ed77c","eed7ed1e-b00e-4e9e-9360-89bc0fc886b1"],"requestBody":"fd12716b-4dd8-4d17-9b9c-4ebc5044e30a","responses":{"200":"0c751d27-4117-4ed8-87cb-4aa76a170bdc","202":"5ea5aa00-533e-4ac0-8e40-0dc4834efdc9","400":"686acddd-ac0a-48c8-b462-e08a3e9408ba","401":"868c458e-d18b-481d-84ea-9dad724b0148","403":"9d1c0c38-4fd4-458e-9138-cbd06ef66373","404":"f0c58095-8899-4c9f-9f67-ef7b161a2f88","409":"5064d9c0-8c5b-4ef2-836b-85311ff0df16","429":"b3a99755-2428-4a65-b65f-68ecb0bd4f1a","502":"1bb8eef1-4d08-4a5e-baff-aa84aa42a97a","503":"7768925a-8c01-49ae-b03e-2306a9bfe30b"},"security":["0480cf17-15a7-4445-97f5-3977501c22d6"],"summary":"Book an appointment","tags":["Appointments"],"method":"post","type":"path","servers":["4d607f5b-84b4-4e24-bd9d-f26fc33ce252"],"path":"/appointments","baseUrlOptions":["https://api.maxcare.ai/v3"],"title":"Book an appointment","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{"86e0da11-5f10-47ee-9b61-64b058410f85":{"name":"idempotency-key","required":false,"in":"header","description":"Client-generated UUID. Strongly recommended: on a live calendar a duplicate appointment is worse than a slow response. Sending it is also a request for exactly-once — if that cannot be honoured the write is refused (503 `idempotency_unavailable`) rather than downgraded.","schema":{"type":"string","isRequired":false,"description":"Client-generated UUID. Strongly recommended: on a live calendar a duplicate appointment is worse than a slow response. Sending it is also a request for exactly-once — if that cannot be honoured the write is refused (503 `idempotency_unavailable`) rather than downgraded.","uniqueKey":"","typeLabel":"string"}},"afaecbf3-388b-40f2-abfd-f044eb6ed77c":{"name":"x-session-token","required":false,"in":"header","description":"The App Bridge token of the logged-in user (`maxcare.appToken()`), verified for this app and organization. With it the change is made through that user's own EHR login when they have a usable one; without it, through the organization's system login (`meta.resolvedBy` says which). A token that does not verify is `401 authorizer_unverified`. Sent as a header so it stays out of URLs.","schema":{"type":"string","isRequired":false,"description":"The App Bridge token of the logged-in user (`maxcare.appToken()`), verified for this app and organization. With it the change is made through that user's own EHR login when they have a usable one; without it, through the organization's system login (`meta.resolvedBy` says which). A token that does not verify is `401 authorizer_unverified`. Sent as a header so it stays out of URLs.","uniqueKey":"","typeLabel":"string"}},"eed7ed1e-b00e-4e9e-9360-89bc0fc886b1":{"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":{"patientId":{"type":"string","description":"Patient ID (pat_…)","isRequired":true,"uniqueKey":"patientId","typeLabel":"string"},"providerId":{"type":"string","description":"Provider ID (prv_…)","isRequired":true,"uniqueKey":"providerId","typeLabel":"string"},"facilityId":{"type":"string","description":"Facility ID (fac_…)","isRequired":true,"uniqueKey":"facilityId","typeLabel":"string"},"appointmentTypeId":{"type":"string","description":"Appointment type ID (atp_…)","isRequired":true,"uniqueKey":"appointmentTypeId","typeLabel":"string"},"startsAt":{"type":"string","description":"Start instant, ISO-8601 with an explicit offset","example":"2026-08-03T08:00:00-04:00","isRequired":true,"uniqueKey":"startsAt","typeLabel":"string"},"durationMinutes":{"type":"number","description":"Appointment length in minutes","example":15,"isRequired":true,"uniqueKey":"durationMinutes","typeLabel":"number"},"newPatient":{"type":"boolean","description":"Whether this is a new-patient visit. Both EHRs distinguish it, and it changes the EHR-side workflow.","example":true,"isRequired":true,"uniqueKey":"newPatient","typeLabel":"boolean"},"visitReasonId":{"type":"string","description":"Visit reason ID (vrs_…). Only meaningful on EHRs where /visit-reasons reports `supported: true`.","uniqueKey":"visitReasonId","typeLabel":"string"},"holdId":{"type":"string","description":"Hold ID (hld_…) taken from POST /schedule/holds","uniqueKey":"holdId","typeLabel":"string"},"templateId":{"type":"string","description":"Availability template ID (avt_…) from the chosen slot's `templateIds`. On ModMed this pins the appointment to that calendar preference so it consumes the right window's capacity.","uniqueKey":"templateId","typeLabel":"string"},"notes":{"type":"string","description":"Patient-supplied comment","example":"Patient comment text","uniqueKey":"notes","typeLabel":"string"},"reasonForVisit":{"type":"string","description":"Why the patient is being seen, written to the EHR's own reason-for-visit field (never to notes). ModMed only: check `reasonForVisit` on `GET /schedule/capabilities`; other EHRs refuse it with `capability_unsupported`.","example":"Changing mole on left forearm, referred for evaluation","maxLength":2000,"uniqueKey":"reasonForVisit","typeLabel":"string"},"referringProviderNpi":{"type":"string","description":"NPI of the referring provider, attached to the appointment as its referral. ModMed only (see `referringProviderNpi` on `GET /schedule/capabilities`). On ModMed the NPI is added to the practice's referral directory from the NPI registry when missing; an NPI that cannot be resolved does not fail the booking, it is booked without one.","example":"1255374757","pattern":"^\\d{10}$","uniqueKey":"referringProviderNpi","typeLabel":"string"},"source":{"type":"object","description":"Booking attribution, echoed back on read. Use this instead of prefixing appointment notes — notes are a clinical field and get read aloud at check-in.","required":["system"],"properties":{"system":{"type":"string","description":"The booking system creating the appointment","example":"dcc-online-booking","isRequired":true,"uniqueKey":"source.system","typeLabel":"string"},"bookingReference":{"type":"string","description":"Your own booking reference, echoed back on read","example":"BK-2026-000123","uniqueKey":"source.bookingReference","typeLabel":"string"},"campaignId":{"type":"string","description":"Marketing campaign identifier","example":"google-gbp-flint","uniqueKey":"source.campaignId","typeLabel":"string"},"url":{"type":"string","description":"Landing URL the booking came from","example":"https://book.dccderm.com/l/flint?utm_source=gbp","uniqueKey":"source.url","typeLabel":"string"}},"uniqueKey":"source","typeLabel":"object"}},"required":["patientId","providerId","facilityId","appointmentTypeId","startsAt","durationMinutes","newPatient"],"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"patientId":"\u003cstring>","providerId":"\u003cstring>","facilityId":"\u003cstring>","appointmentTypeId":"\u003cstring>","startsAt":"2026-08-03T08:00:00-04:00","durationMinutes":15,"newPatient":true,"visitReasonId":"\u003cstring>","holdId":"\u003cstring>","templateId":"\u003cstring>","notes":"Patient comment text","reasonForVisit":"Changing mole on left forearm, referred for evaluation","referringProviderNpi":"1255374757"}}},"exampleType":"generated"}},"exampleType":"generated"},"responses":{"0c751d27-4117-4ed8-87cb-4aa76a170bdc":{"description":"Success","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":{"appointment":{"type":"object","properties":{"id":{"type":"string","example":"apt_e5f6a7b8c9d04e1f2a3b4c5d6e7f8a9b","isRequired":true,"uniqueKey":"data.appointment.id","typeLabel":"string"},"externalId":{"oneOf":[{"type":"string","description":"The EHR's own appointment identifier. **Always `null` on this endpoint's response**, because the EHR write is asynchronous and the vendor has not issued an id yet. It arrives on the `appointment.confirmed` webhook, and on any `GET /appointments` once the write has landed.","example":null,"isRequired":true,"uniqueKey":"data.appointment.externalId.oneOf.0","typeLabel":"string"},{"type":"null","description":"The EHR's own appointment identifier. **Always `null` on this endpoint's response**, because the EHR write is asynchronous and the vendor has not issued an id yet. It arrives on the `appointment.confirmed` webhook, and on any `GET /appointments` once the write has landed.","example":null,"isRequired":true,"uniqueKey":"data.appointment.externalId.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.appointment.externalId","typeLabel":"string | null"},"patientId":{"type":"string","example":"pat_c56103bcd39c46d39f3138dd2b5e05f6","isRequired":true,"uniqueKey":"data.appointment.patientId","typeLabel":"string"},"providerId":{"type":"string","example":"prv_35103413aaaa4bbbccccddddeeeeffff","isRequired":true,"uniqueKey":"data.appointment.providerId","typeLabel":"string"},"facilityId":{"type":"string","example":"fac_2706aaaa4bbbccccddddeeeeffff1111","isRequired":true,"uniqueKey":"data.appointment.facilityId","typeLabel":"string"},"appointmentTypeId":{"type":"string","example":"atp_1c0f8a2b4d5e4f6a8b9c0d1e2f3a4b5c","isRequired":true,"uniqueKey":"data.appointment.appointmentTypeId","typeLabel":"string"},"visitReasonId":{"oneOf":[{"type":"string","isRequired":true,"uniqueKey":"data.appointment.visitReasonId.oneOf.0","typeLabel":"string"},{"type":"null","isRequired":true,"uniqueKey":"data.appointment.visitReasonId.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.appointment.visitReasonId","typeLabel":"string | null"},"startsAt":{"type":"string","example":"2026-08-03T08:00:00-04:00","isRequired":true,"uniqueKey":"data.appointment.startsAt","typeLabel":"string"},"durationMinutes":{"type":"number","example":15,"isRequired":true,"uniqueKey":"data.appointment.durationMinutes","typeLabel":"number"},"status":{"type":"string","example":"scheduled","isRequired":true,"uniqueKey":"data.appointment.status","typeLabel":"string"},"syncStatus":{"type":"string","description":"Always `pending` on a `202` from THIS endpoint. The EHR write is ASYNCHRONOUS: the slot is reserved and the appointment is durably recorded, but it is not on the practice's calendar yet. You SHOULD build a state machine over this — subscribe to `appointment.confirmed` (it landed, `externalId` is now known), `appointment.rejected` (the slot went to someone else), and `appointment.write_failed` (it could not be written after retries). Polling `GET /appointments/{id}` works too. Do not tell a patient they are booked on this response alone. `appointment.rejected` carries `suggestedSlots` — up to five nearby bookable starts for the same provider, facility and appointment type, computed the same way `GET /schedule/slots` computes them. Offer them directly rather than sending the patient back to the start: a lost slot is rare, and it is recoverable in one tap if your UI is ready for it. An empty `suggestedSlots` means nothing is free within a week, which is worth saying plainly instead of showing a spinner.","example":"pending","enum":["pending","syncing","synced","failed"],"isRequired":true,"uniqueKey":"data.appointment.syncStatus","typeLabel":"enum\u003cstring>"},"newPatient":{"type":"boolean","example":true,"isRequired":true,"uniqueKey":"data.appointment.newPatient","typeLabel":"boolean"},"notes":{"oneOf":[{"type":"string","isRequired":true,"uniqueKey":"data.appointment.notes.oneOf.0","typeLabel":"string"},{"type":"null","isRequired":true,"uniqueKey":"data.appointment.notes.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.appointment.notes","typeLabel":"string | null"},"reasonForVisit":{"oneOf":[{"type":"string","description":"The reason for visit as requested.","isRequired":true,"uniqueKey":"data.appointment.reasonForVisit.oneOf.0","typeLabel":"string"},{"type":"null","description":"The reason for visit as requested.","isRequired":true,"uniqueKey":"data.appointment.reasonForVisit.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.appointment.reasonForVisit","typeLabel":"string | null"},"referringProviderNpi":{"oneOf":[{"type":"string","description":"The referring provider's NPI as requested. Whether ModMed could attach it is known only once the write lands; an unresolvable NPI is booked without one.","isRequired":true,"uniqueKey":"data.appointment.referringProviderNpi.oneOf.0","typeLabel":"string"},{"type":"null","description":"The referring provider's NPI as requested. Whether ModMed could attach it is known only once the write lands; an unresolvable NPI is booked without one.","isRequired":true,"uniqueKey":"data.appointment.referringProviderNpi.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.appointment.referringProviderNpi","typeLabel":"string | null"},"source":{"oneOf":[{"type":"object","required":["system","bookingReference","campaignId","url"],"properties":{"system":{"type":"string","example":"dcc-online-booking","isRequired":true,"uniqueKey":"data.appointment.source.oneOf.0.system","typeLabel":"string"},"bookingReference":{"oneOf":[{"type":"string","example":"BK-2026-000123","isRequired":true,"uniqueKey":"data.appointment.source.oneOf.0.bookingReference.oneOf.0","typeLabel":"string"},{"type":"null","example":"BK-2026-000123","isRequired":true,"uniqueKey":"data.appointment.source.oneOf.0.bookingReference.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.appointment.source.oneOf.0.bookingReference","typeLabel":"string | null"},"campaignId":{"oneOf":[{"type":"string","example":"google-gbp-flint","isRequired":true,"uniqueKey":"data.appointment.source.oneOf.0.campaignId.oneOf.0","typeLabel":"string"},{"type":"null","example":"google-gbp-flint","isRequired":true,"uniqueKey":"data.appointment.source.oneOf.0.campaignId.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.appointment.source.oneOf.0.campaignId","typeLabel":"string | null"},"url":{"oneOf":[{"type":"string","example":"https://book.dccderm.com/l/flint?utm_source=gbp","isRequired":true,"uniqueKey":"data.appointment.source.oneOf.0.url.oneOf.0","typeLabel":"string"},{"type":"null","example":"https://book.dccderm.com/l/flint?utm_source=gbp","isRequired":true,"uniqueKey":"data.appointment.source.oneOf.0.url.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.appointment.source.oneOf.0.url","typeLabel":"string | null"}},"isRequired":true,"uniqueKey":"data.appointment.source.oneOf.0","typeLabel":"object"},{"type":"null","isRequired":true,"uniqueKey":"data.appointment.source.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.appointment.source","typeLabel":"object | null"},"createdAt":{"type":"string","example":"2026-07-26T13:00:00.000Z","isRequired":true,"uniqueKey":"data.appointment.createdAt","typeLabel":"string"},"writtenBy":{"type":"object","properties":{"resolvedBy":{"type":"string","enum":["personal_connector","facility_system_connector","org_system_connector"],"description":"Which EHR login Max AI wrote this appointment's last change through. `personal_connector` is the acting user's own login (from `X-Session-Token`); the others are the organization's system login. While the write is queued this is the login it is intended for; once it lands, the login that actually wrote it — a personal login that is unusable at write time falls back to the system login.","example":"personal_connector","isRequired":true,"uniqueKey":"data.appointment.writtenBy.resolvedBy","typeLabel":"enum\u003cstring>"}},"required":["resolvedBy"],"isRequired":true,"uniqueKey":"data.appointment.writtenBy","typeLabel":"object"}},"required":["id","externalId","patientId","providerId","facilityId","appointmentTypeId","visitReasonId","startsAt","durationMinutes","status","syncStatus","newPatient","notes","reasonForVisit","referringProviderNpi","source","createdAt","writtenBy"],"isRequired":true,"uniqueKey":"data.appointment","typeLabel":"object"},"idempotentReplay":{"type":"boolean","description":"Present and `true` when this response replays an earlier request with the same Idempotency-Key","example":true,"uniqueKey":"data.idempotentReplay","typeLabel":"boolean"},"meta":{"type":"object","description":"The EHR login the booking is queued to be written through. Absent only on an idempotent replay of a booking accepted before this field existed.","required":["actingAs","resolvedBy"],"properties":{"actingAs":{"type":"string","enum":["user","system"],"description":"`user` when the acting user's own EHR login performs the change, `system` for the organization's.","example":"user","isRequired":true,"uniqueKey":"data.meta.actingAs","typeLabel":"enum\u003cstring>"},"resolvedBy":{"type":"string","enum":["personal_connector","facility_system_connector","org_system_connector"],"example":"personal_connector","isRequired":true,"uniqueKey":"data.meta.resolvedBy","typeLabel":"enum\u003cstring>"}},"uniqueKey":"data.meta","typeLabel":"object"}},"required":["appointment"],"isRequired":true,"uniqueKey":"data","typeLabel":"object"}},"required":["code","data"],"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"code":"success","data":{"appointment":{"id":"apt_e5f6a7b8c9d04e1f2a3b4c5d6e7f8a9b","externalId":null,"patientId":"pat_c56103bcd39c46d39f3138dd2b5e05f6","providerId":"prv_35103413aaaa4bbbccccddddeeeeffff","facilityId":"fac_2706aaaa4bbbccccddddeeeeffff1111","appointmentTypeId":"atp_1c0f8a2b4d5e4f6a8b9c0d1e2f3a4b5c","visitReasonId":"\u003cstring>","startsAt":"2026-08-03T08:00:00-04:00","durationMinutes":15,"status":"scheduled","syncStatus":"pending","newPatient":true,"notes":"\u003cstring>","reasonForVisit":"\u003cstring>","referringProviderNpi":"\u003cstring>","source":{"system":"dcc-online-booking","bookingReference":"BK-2026-000123","campaignId":"google-gbp-flint","url":"https://book.dccderm.com/l/flint?utm_source=gbp"},"createdAt":"2026-07-26T13:00:00.000Z","writtenBy":{"resolvedBy":"personal_connector"}},"idempotentReplay":true,"meta":{"actingAs":"user","resolvedBy":"personal_connector"}}}}},"exampleType":"generated"}},"exampleType":"generated"},"5ea5aa00-533e-4ac0-8e40-0dc4834efdc9":{"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":{"appointment":{"type":"object","properties":{"id":{"type":"string","example":"apt_e5f6a7b8c9d04e1f2a3b4c5d6e7f8a9b","isRequired":true,"uniqueKey":"data.appointment.id","typeLabel":"string"},"externalId":{"oneOf":[{"type":"string","description":"The EHR's own appointment identifier. **Always `null` on this endpoint's response**, because the EHR write is asynchronous and the vendor has not issued an id yet. It arrives on the `appointment.confirmed` webhook, and on any `GET /appointments` once the write has landed.","example":null,"isRequired":true,"uniqueKey":"data.appointment.externalId.oneOf.0","typeLabel":"string"},{"type":"null","description":"The EHR's own appointment identifier. **Always `null` on this endpoint's response**, because the EHR write is asynchronous and the vendor has not issued an id yet. It arrives on the `appointment.confirmed` webhook, and on any `GET /appointments` once the write has landed.","example":null,"isRequired":true,"uniqueKey":"data.appointment.externalId.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.appointment.externalId","typeLabel":"string | null"},"patientId":{"type":"string","example":"pat_c56103bcd39c46d39f3138dd2b5e05f6","isRequired":true,"uniqueKey":"data.appointment.patientId","typeLabel":"string"},"providerId":{"type":"string","example":"prv_35103413aaaa4bbbccccddddeeeeffff","isRequired":true,"uniqueKey":"data.appointment.providerId","typeLabel":"string"},"facilityId":{"type":"string","example":"fac_2706aaaa4bbbccccddddeeeeffff1111","isRequired":true,"uniqueKey":"data.appointment.facilityId","typeLabel":"string"},"appointmentTypeId":{"type":"string","example":"atp_1c0f8a2b4d5e4f6a8b9c0d1e2f3a4b5c","isRequired":true,"uniqueKey":"data.appointment.appointmentTypeId","typeLabel":"string"},"visitReasonId":{"oneOf":[{"type":"string","isRequired":true,"uniqueKey":"data.appointment.visitReasonId.oneOf.0","typeLabel":"string"},{"type":"null","isRequired":true,"uniqueKey":"data.appointment.visitReasonId.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.appointment.visitReasonId","typeLabel":"string | null"},"startsAt":{"type":"string","example":"2026-08-03T08:00:00-04:00","isRequired":true,"uniqueKey":"data.appointment.startsAt","typeLabel":"string"},"durationMinutes":{"type":"number","example":15,"isRequired":true,"uniqueKey":"data.appointment.durationMinutes","typeLabel":"number"},"status":{"type":"string","example":"scheduled","isRequired":true,"uniqueKey":"data.appointment.status","typeLabel":"string"},"syncStatus":{"type":"string","description":"Always `pending` on a `202` from THIS endpoint. The EHR write is ASYNCHRONOUS: the slot is reserved and the appointment is durably recorded, but it is not on the practice's calendar yet. You SHOULD build a state machine over this — subscribe to `appointment.confirmed` (it landed, `externalId` is now known), `appointment.rejected` (the slot went to someone else), and `appointment.write_failed` (it could not be written after retries). Polling `GET /appointments/{id}` works too. Do not tell a patient they are booked on this response alone. `appointment.rejected` carries `suggestedSlots` — up to five nearby bookable starts for the same provider, facility and appointment type, computed the same way `GET /schedule/slots` computes them. Offer them directly rather than sending the patient back to the start: a lost slot is rare, and it is recoverable in one tap if your UI is ready for it. An empty `suggestedSlots` means nothing is free within a week, which is worth saying plainly instead of showing a spinner.","example":"pending","enum":["pending","syncing","synced","failed"],"isRequired":true,"uniqueKey":"data.appointment.syncStatus","typeLabel":"enum\u003cstring>"},"newPatient":{"type":"boolean","example":true,"isRequired":true,"uniqueKey":"data.appointment.newPatient","typeLabel":"boolean"},"notes":{"oneOf":[{"type":"string","isRequired":true,"uniqueKey":"data.appointment.notes.oneOf.0","typeLabel":"string"},{"type":"null","isRequired":true,"uniqueKey":"data.appointment.notes.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.appointment.notes","typeLabel":"string | null"},"reasonForVisit":{"oneOf":[{"type":"string","description":"The reason for visit as requested.","isRequired":true,"uniqueKey":"data.appointment.reasonForVisit.oneOf.0","typeLabel":"string"},{"type":"null","description":"The reason for visit as requested.","isRequired":true,"uniqueKey":"data.appointment.reasonForVisit.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.appointment.reasonForVisit","typeLabel":"string | null"},"referringProviderNpi":{"oneOf":[{"type":"string","description":"The referring provider's NPI as requested. Whether ModMed could attach it is known only once the write lands; an unresolvable NPI is booked without one.","isRequired":true,"uniqueKey":"data.appointment.referringProviderNpi.oneOf.0","typeLabel":"string"},{"type":"null","description":"The referring provider's NPI as requested. Whether ModMed could attach it is known only once the write lands; an unresolvable NPI is booked without one.","isRequired":true,"uniqueKey":"data.appointment.referringProviderNpi.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.appointment.referringProviderNpi","typeLabel":"string | null"},"source":{"oneOf":[{"type":"object","required":["system","bookingReference","campaignId","url"],"properties":{"system":{"type":"string","example":"dcc-online-booking","isRequired":true,"uniqueKey":"data.appointment.source.oneOf.0.system","typeLabel":"string"},"bookingReference":{"oneOf":[{"type":"string","example":"BK-2026-000123","isRequired":true,"uniqueKey":"data.appointment.source.oneOf.0.bookingReference.oneOf.0","typeLabel":"string"},{"type":"null","example":"BK-2026-000123","isRequired":true,"uniqueKey":"data.appointment.source.oneOf.0.bookingReference.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.appointment.source.oneOf.0.bookingReference","typeLabel":"string | null"},"campaignId":{"oneOf":[{"type":"string","example":"google-gbp-flint","isRequired":true,"uniqueKey":"data.appointment.source.oneOf.0.campaignId.oneOf.0","typeLabel":"string"},{"type":"null","example":"google-gbp-flint","isRequired":true,"uniqueKey":"data.appointment.source.oneOf.0.campaignId.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.appointment.source.oneOf.0.campaignId","typeLabel":"string | null"},"url":{"oneOf":[{"type":"string","example":"https://book.dccderm.com/l/flint?utm_source=gbp","isRequired":true,"uniqueKey":"data.appointment.source.oneOf.0.url.oneOf.0","typeLabel":"string"},{"type":"null","example":"https://book.dccderm.com/l/flint?utm_source=gbp","isRequired":true,"uniqueKey":"data.appointment.source.oneOf.0.url.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.appointment.source.oneOf.0.url","typeLabel":"string | null"}},"isRequired":true,"uniqueKey":"data.appointment.source.oneOf.0","typeLabel":"object"},{"type":"null","isRequired":true,"uniqueKey":"data.appointment.source.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.appointment.source","typeLabel":"object | null"},"createdAt":{"type":"string","example":"2026-07-26T13:00:00.000Z","isRequired":true,"uniqueKey":"data.appointment.createdAt","typeLabel":"string"},"writtenBy":{"type":"object","properties":{"resolvedBy":{"type":"string","enum":["personal_connector","facility_system_connector","org_system_connector"],"description":"Which EHR login Max AI wrote this appointment's last change through. `personal_connector` is the acting user's own login (from `X-Session-Token`); the others are the organization's system login. While the write is queued this is the login it is intended for; once it lands, the login that actually wrote it — a personal login that is unusable at write time falls back to the system login.","example":"personal_connector","isRequired":true,"uniqueKey":"data.appointment.writtenBy.resolvedBy","typeLabel":"enum\u003cstring>"}},"required":["resolvedBy"],"isRequired":true,"uniqueKey":"data.appointment.writtenBy","typeLabel":"object"}},"required":["id","externalId","patientId","providerId","facilityId","appointmentTypeId","visitReasonId","startsAt","durationMinutes","status","syncStatus","newPatient","notes","reasonForVisit","referringProviderNpi","source","createdAt","writtenBy"],"isRequired":true,"uniqueKey":"data.appointment","typeLabel":"object"},"idempotentReplay":{"type":"boolean","description":"Present and `true` when this response replays an earlier request with the same Idempotency-Key","example":true,"uniqueKey":"data.idempotentReplay","typeLabel":"boolean"},"meta":{"type":"object","description":"The EHR login the booking is queued to be written through. Absent only on an idempotent replay of a booking accepted before this field existed.","required":["actingAs","resolvedBy"],"properties":{"actingAs":{"type":"string","enum":["user","system"],"description":"`user` when the acting user's own EHR login performs the change, `system` for the organization's.","example":"user","isRequired":true,"uniqueKey":"data.meta.actingAs","typeLabel":"enum\u003cstring>"},"resolvedBy":{"type":"string","enum":["personal_connector","facility_system_connector","org_system_connector"],"example":"personal_connector","isRequired":true,"uniqueKey":"data.meta.resolvedBy","typeLabel":"enum\u003cstring>"}},"uniqueKey":"data.meta","typeLabel":"object"}},"required":["appointment"],"isRequired":true,"uniqueKey":"data","typeLabel":"object"}},"required":["code","data"],"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"code":"success","data":{"appointment":{"id":"apt_e5f6a7b8c9d04e1f2a3b4c5d6e7f8a9b","externalId":null,"patientId":"pat_c56103bcd39c46d39f3138dd2b5e05f6","providerId":"prv_35103413aaaa4bbbccccddddeeeeffff","facilityId":"fac_2706aaaa4bbbccccddddeeeeffff1111","appointmentTypeId":"atp_1c0f8a2b4d5e4f6a8b9c0d1e2f3a4b5c","visitReasonId":"\u003cstring>","startsAt":"2026-08-03T08:00:00-04:00","durationMinutes":15,"status":"scheduled","syncStatus":"pending","newPatient":true,"notes":"\u003cstring>","reasonForVisit":"\u003cstring>","referringProviderNpi":"\u003cstring>","source":{"system":"dcc-online-booking","bookingReference":"BK-2026-000123","campaignId":"google-gbp-flint","url":"https://book.dccderm.com/l/flint?utm_source=gbp"},"createdAt":"2026-07-26T13:00:00.000Z","writtenBy":{"resolvedBy":"personal_connector"}},"idempotentReplay":true,"meta":{"actingAs":"user","resolvedBy":"personal_connector"}}}}},"exampleType":"generated"}},"exampleType":"generated"},"686acddd-ac0a-48c8-b462-e08a3e9408ba":{"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"},"868c458e-d18b-481d-84ea-9dad724b0148":{"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"},"9d1c0c38-4fd4-458e-9138-cbd06ef66373":{"description":"Insufficient scope","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Error code","example":"forbidden","isRequired":true,"uniqueKey":"code","typeLabel":"string"},"message":{"type":"string","description":"Human-readable error message","example":"Insufficient scope","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":"forbidden","message":"Insufficient scope","trace_id":"550e8400-e29b-41d4-a716-446655440000"}}},"exampleType":"generated"}},"exampleType":"generated"},"f0c58095-8899-4c9f-9f67-ef7b161a2f88":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Error code","example":"not_found","isRequired":true,"uniqueKey":"code","typeLabel":"string"},"message":{"type":"string","description":"Human-readable error message","example":"Resource not found","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":"not_found","message":"Resource not found","trace_id":"550e8400-e29b-41d4-a716-446655440000"}}},"exampleType":"generated"}},"exampleType":"generated"},"5064d9c0-8c5b-4ef2-836b-85311ff0df16":{"description":"Resource conflict (e.g. editing a signed note)","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Error code","example":"conflict","isRequired":true,"uniqueKey":"code","typeLabel":"string"},"message":{"type":"string","description":"Human-readable error message","example":"Cannot edit a signed note","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":"conflict","message":"Cannot edit a signed note","trace_id":"550e8400-e29b-41d4-a716-446655440000"}}},"exampleType":"generated"}},"exampleType":"generated"},"b3a99755-2428-4a65-b65f-68ecb0bd4f1a":{"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"},"1bb8eef1-4d08-4a5e-baff-aa84aa42a97a":{"description":"EHR sync failed","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Error code","example":"unexpected_integration_error","isRequired":true,"uniqueKey":"code","typeLabel":"string"},"message":{"type":"string","description":"Human-readable error message","example":"EHR sync failed","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":"unexpected_integration_error","message":"EHR sync failed","trace_id":"550e8400-e29b-41d4-a716-446655440000"}}},"exampleType":"generated"}},"exampleType":"generated"},"7768925a-8c01-49ae-b03e-2306a9bfe30b":{"description":"EHR integration unavailable","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Error code","example":"server_unresponsive","isRequired":true,"uniqueKey":"code","typeLabel":"string"},"message":{"type":"string","description":"Human-readable error message","example":"EHR integration is not available for this note","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":"server_unresponsive","message":"EHR integration is not available for this note","trace_id":"550e8400-e29b-41d4-a716-446655440000"}}},"exampleType":"generated"}},"exampleType":"generated"}},"security":{"0480cf17-15a7-4445-97f5-3977501c22d6":{"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":"Book an appointment - Max AI Developer Docs","navMaps":{"firstHrefInVersion":{"v4":{"href":"/api-reference/v4/appointments/book-an-appointment","matchLevel":1},"v3":{"href":"/api-reference/v3/appointments/book-an-appointment","matchLevel":0},"v2":{"href":"/api-reference/v2/appointments/book-an-appointment","matchLevel":1},"v1":{"href":"/api-reference/v1/appointments/book-an-appointment","matchLevel":1}},"firstHrefInLanguage":{}},"lastModified":"2026-11-06T15:43:51.330Z","originalFileLocation":"api-reference/v3/appointments/book-an-appointment.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=\"Accepts a booking. The EHR write is asynchronous (changed deliberately — see below): a 202 with syncStatus: \u0026quot;pending\u0026quot; means the slot is RESERVED against everyone else booking through Max AI and the appointment is durably recorded, but it is NOT on the practice\u0026#x27;s calendar yet and externalId is null. Completion is reported by webhook: appointment.confirmed (written; externalId now known), appointment.rejected (the slot went away — the event carries suggestedSlots, so offer those rather than restarting the flow), or appointment.write_failed (could not be written after retries). Polling GET /appointments/{id} works too. Do not tell a patient they are booked on this response alone. This previously returned 201 after a synchronous write, which made a slow tenant a slow booking form and a vendor outage a booking outage. Booking now succeeds while the EHR is unreachable. Send an Idempotency-Key header — it is honoured for 24 hours per app+organization, and a completed request replays its result with idempotentReplay: true. If acceptance could not be confirmed, the same key remains protected for that period and returns 409 ehr_write_uncertain with requiresReconciliation: true; verify the booking before creating another. The guarantee FAILS CLOSED: if the idempotency store is unreachable the request is refused with 503 idempotency_unavailable and nothing is sent to the EHR, rather than proceeding with the guarantee silently withdrawn. That response is safe to retry without checking for a duplicate first. To accept at-least-once delivery instead, omit the header. Returns 409 slot_unavailable when capacity went away, 409 hold_expired when the supplied hold lapsed, and 503 no_booking_identity when the organization has no system connector for unattended writes.\">\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=\"Book an appointment - Max AI Developer Docs\">\u003cmeta data-mint-head property=\"og:description\" content=\"Accepts a booking. The EHR write is asynchronous (changed deliberately — see below): a 202 with syncStatus: \u0026quot;pending\u0026quot; means the slot is RESERVED against everyone else booking through Max AI and the appointment is durably recorded, but it is NOT on the practice\u0026#x27;s calendar yet and externalId is null. Completion is reported by webhook: appointment.confirmed (written; externalId now known), appointment.rejected (the slot went away — the event carries suggestedSlots, so offer those rather than restarting the flow), or appointment.write_failed (could not be written after retries). Polling GET /appointments/{id} works too. Do not tell a patient they are booked on this response alone. This previously returned 201 after a synchronous write, which made a slow tenant a slow booking form and a vendor outage a booking outage. Booking now succeeds while the EHR is unreachable. Send an Idempotency-Key header — it is honoured for 24 hours per app+organization, and a completed request replays its result with idempotentReplay: true. If acceptance could not be confirmed, the same key remains protected for that period and returns 409 ehr_write_uncertain with requiresReconciliation: true; verify the booking before creating another. The guarantee FAILS CLOSED: if the idempotency store is unreachable the request is refused with 503 idempotency_unavailable and nothing is sent to the EHR, rather than proceeding with the guarantee silently withdrawn. That response is safe to retry without checking for a duplicate first. To accept at-least-once delivery instead, omit the header. Returns 409 slot_unavailable when capacity went away, 409 hold_expired when the supplied hold lapsed, and 503 no_booking_identity when the organization has no system connector for unattended writes.\">\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/appointments/book-an-appointment\">\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=Appointments\u0026amp;title=Book+an+appointment\u0026amp;description=Accepts+a+booking.+**The+EHR+write+is+asynchronous**+%28changed+deliberately+%E2%80%94+see+below%29%3A+a+%60202%60+with+%60syncStatus%3A+%22pending%22%60+means+the+slot+is+RESERVED+against\u0026amp;theme=02e0b3646d3b285707db65d5\u0026amp;signature=f584c9b314a577df876768fd15a4d246c36f2c34ac9d682bee6f00116335f3b7\">\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=\"Book an appointment - Max AI Developer Docs\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Accepts a booking. The EHR write is asynchronous (changed deliberately — see below): a 202 with syncStatus: \u0026quot;pending\u0026quot; means the slot is RESERVED against everyone else booking through Max AI and the appointment is durably recorded, but it is NOT on the practice\u0026#x27;s calendar yet and externalId is null. Completion is reported by webhook: appointment.confirmed (written; externalId now known), appointment.rejected (the slot went away — the event carries suggestedSlots, so offer those rather than restarting the flow), or appointment.write_failed (could not be written after retries). Polling GET /appointments/{id} works too. Do not tell a patient they are booked on this response alone. This previously returned 201 after a synchronous write, which made a slow tenant a slow booking form and a vendor outage a booking outage. Booking now succeeds while the EHR is unreachable. Send an Idempotency-Key header — it is honoured for 24 hours per app+organization, and a completed request replays its result with idempotentReplay: true. If acceptance could not be confirmed, the same key remains protected for that period and returns 409 ehr_write_uncertain with requiresReconciliation: true; verify the booking before creating another. The guarantee FAILS CLOSED: if the idempotency store is unreachable the request is refused with 503 idempotency_unavailable and nothing is sent to the EHR, rather than proceeding with the guarantee silently withdrawn. That response is safe to retry without checking for a duplicate first. To accept at-least-once delivery instead, omit the header. Returns 409 slot_unavailable when capacity went away, 409 hold_expired when the supplied hold lapsed, and 503 no_booking_identity when the organization has no system connector for unattended writes.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://maxaiinc-02a56fd1.mintlify.site/_mintlify/api/og/v2?division=Appointments\u0026amp;title=Book+an+appointment\u0026amp;description=Accepts+a+booking.+**The+EHR+write+is+asynchronous**+%28changed+deliberately+%E2%80%94+see+below%29%3A+a+%60202%60+with+%60syncStatus%3A+%22pending%22%60+means+the+slot+is+RESERVED+against\u0026amp;theme=02e0b3646d3b285707db65d5\u0026amp;signature=f584c9b314a577df876768fd15a4d246c36f2c34ac9d682bee6f00116335f3b7\">\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/appointments/book-an-appointment\">\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/appointments/book-an-appointment.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/appointments/book-an-appointment#webpage\",\"url\":\"https://docs.maxcare.ai/api-reference/v3/appointments/book-an-appointment\",\"name\":\"Book an appointment\",\"description\":\"Accepts a booking. The EHR write is asynchronous (changed deliberately — see below): a 202 with syncStatus: \\\"pending\\\" means the slot is RESERVED against everyone else booking through Max AI and the appointment is durably recorded, but it is NOT on the practice's calendar yet and externalId is null. Completion is reported by webhook: appointment.confirmed (written; externalId now known), appointment.rejected (the slot went away — the event carries suggestedSlots, so offer those rather than restarting the flow), or appointment.write_failed (could not be written after retries). Polling GET /appointments/{id} works too. Do not tell a patient they are booked on this response alone. This previously returned 201 after a synchronous write, which made a slow tenant a slow booking form and a vendor outage a booking outage. Booking now succeeds while the EHR is unreachable. Send an Idempotency-Key header — it is honoured for 24 hours per app+organization, and a completed request replays its result with idempotentReplay: true. If acceptance could not be confirmed, the same key remains protected for that period and returns 409 ehr_write_uncertain with requiresReconciliation: true; verify the booking before creating another. The guarantee FAILS CLOSED: if the idempotency store is unreachable the request is refused with 503 idempotency_unavailable and nothing is sent to the EHR, rather than proceeding with the guarantee silently withdrawn. That response is safe to retry without checking for a duplicate first. To accept at-least-once delivery instead, omit the header. Returns 409 slot_unavailable when capacity went away, 409 hold_expired when the supplied hold lapsed, and 503 no_booking_identity when the organization has no system connector for unattended writes.\",\"dateModified\":\"2026-11-06T15:43:51.330Z\",\"isPartOf\":{\"@id\":\"https://docs.maxcare.ai#website\"},\"breadcrumb\":{\"@id\":\"https://docs.maxcare.ai/api-reference/v3/appointments/book-an-appointment#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.maxcare.ai/api-reference/v3/appointments/book-an-appointment#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\":\"Appointments\",\"item\":\"https://docs.maxcare.ai/api-reference/v3/appointments/list-appointments\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Book an appointment\",\"item\":\"https://docs.maxcare.ai/api-reference/v3/appointments/book-an-appointment\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.maxcare.ai/api-reference/v3/appointments/book-an-appointment#apireference\",\"headline\":\"Book an appointment\",\"name\":\"Book an appointment\",\"description\":\"Accepts a booking. The EHR write is asynchronous (changed deliberately — see below): a 202 with syncStatus: \\\"pending\\\" means the slot is RESERVED against everyone else booking through Max AI and the appointment is durably recorded, but it is NOT on the practice's calendar yet and externalId is null. Completion is reported by webhook: appointment.confirmed (written; externalId now known), appointment.rejected (the slot went away — the event carries suggestedSlots, so offer those rather than restarting the flow), or appointment.write_failed (could not be written after retries). Polling GET /appointments/{id} works too. Do not tell a patient they are booked on this response alone. This previously returned 201 after a synchronous write, which made a slow tenant a slow booking form and a vendor outage a booking outage. Booking now succeeds while the EHR is unreachable. Send an Idempotency-Key header — it is honoured for 24 hours per app+organization, and a completed request replays its result with idempotentReplay: true. If acceptance could not be confirmed, the same key remains protected for that period and returns 409 ehr_write_uncertain with requiresReconciliation: true; verify the booking before creating another. The guarantee FAILS CLOSED: if the idempotency store is unreachable the request is refused with 503 idempotency_unavailable and nothing is sent to the EHR, rather than proceeding with the guarantee silently withdrawn. That response is safe to retry without checking for a duplicate first. To accept at-least-once delivery instead, omit the header. Returns 409 slot_unavailable when capacity went away, 409 hold_expired when the supplied hold lapsed, and 503 no_booking_identity when the organization has no system connector for unattended writes.\",\"url\":\"https://docs.maxcare.ai/api-reference/v3/appointments/book-an-appointment\",\"mainEntityOfPage\":{\"@id\":\"https://docs.maxcare.ai/api-reference/v3/appointments/book-an-appointment#webpage\"},\"dateModified\":\"2026-11-06T15:43:51.330Z\",\"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/appointments/book-an-appointment"}]},{"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","description":"Returns a paginated list of appointments. Requires read:appointments scope.","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","description":"The EHR's cancellation-reason catalogue, for POST /appointments/{id}/cancel. `supported: false` means this EHR has none and `reasonId` is ignored.","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","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","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/appointments/book-an-appointment"}]},{"version":"v1","pages":[{"title":"v1","href":"/api-reference/v1/appointments/book-an-appointment"}]}]}]},"basePath":"","title":"Book an appointment - 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"]}