Consult id (also the webhook consultId and the embed token subject).
Our id of the patient.
OptionalexternalYour id of the patient, when API-provisioned.
OptionalpatientThe patient's header card — see PatientSummary. Present on reads made with a physician credential; absent on key-only reads.
Current lifecycle state.
OptionalcontextClinical context you supplied at creation — the physician's handoff summary.
OptionalpatientWhere the patient is (ISO 3166-2 subdivision, no country prefix), as recorded for licensure routing. Absent when never captured.
OptionalpatientThe patient's locale as it was when this consult was minted — what the
live-queue matcher and book rank the physicians against (see
./languages). FROZEN on the row, distinct from patient.lang (the
patient's CURRENT setting): the routing truth for THIS consult. Absent
on consults minted before the language was recorded.
OptionalpractitionerThe physician who took (or is on) the call. Absent until claimed.
Our physician id.
OptionalexternalId?: stringYour id of the physician, when API-provisioned.
Optionalname?: stringDisplay name, if their profile has one.
OptionalpractitionerThe physician's last heartbeat on THIS consult (booked appointments only — the live queue tracks presence on the physician, not the row). How a waiting room knows the clinician is on their way.
OptionalenqueuedWhen the patient entered the live queue (mode: 'queue'). Cleared once
the consult leaves waiting, so it is the honest "waiting since" for a
queue display and the source of TelehealthQueueEntry.waitedSeconds.
OptionalringingWhen the current ring started — a physician was reserved and the patient's
client is being asked to confirm. Present while ringing; cleared when
the call starts or the ring times out back to waiting.
Optionalposition1-based place in the live queue. Present only while status === 'waiting'
on reads made with a physician credential (the same number the patient's
/join reports to them).
OptionalmessagedTrue when the in-call chat was used — either side sent a message while
the room was open. Set once, never cleared; end reads it to decide
whether the patient needs telling what their conversation goes back to.
When the consult was created.
OptionalsentWhen the invite went out (creation time for API-origin consults).
OptionaljoinableWhen this consult stops being joinable, for invites that carry a window.
Consults our own conversation flow opens are reachable for 10 minutes — long enough to walk to a quiet room, short enough that a link in a message history is not a standing door. Absent means no window: partner-originated consults are governed by your own authentication instead, and never expire on their own.
Render a join control only while this is in the future. join enforces
the same rule server-side (answering status: 'expired'), so a button
left on screen is a UI bug rather than a way in — but a button that
silently stops working is exactly the thing that reads as broken.
OptionalmodeWhich live modality this consult is (docs/SCHEDULED-CONSULTS.md):
queue — the on-demand waiting room, matched to the first eligible
physician who is ready; scheduled — a booked appointment at a fixed time
with a named physician. Absent means queue, which is every consult
created before scheduled booking existed.
OptionalspecialtyThe tenant specialty slug this consult was routed to, if any.
OptionalscheduledThe booked start, for mode: 'scheduled' once a slot has been taken.
OptionalscheduledThe booked end (the consultation, without the tenant's buffer).
OptionalpatientThe IANA zone the PATIENT booked from — patientTimezone on the booking
call, or the device zone of the surface they booked on. Absent when the
booking sent none (notices then use the clinic's zone). On an agenda,
show the patient's clock from it when it differs from the physician's.
OptionalstartedWhen the call went live (physician joined).
OptionalendedWhen the call ended.
OptionalrecordingShort-lived presigned URL of the composite call recording, minted fresh
on every GET once the recording exists. Never persist the URL. Omitted
in webhook payloads — re-read GET /v1/telehealth-consults/{id} after
telehealth.recording_ready.
OptionaltranscriptMachine transcript, once produced (English calls only).
OptionalratingThe rating, once submitted. Write-once.
Who opened it — see ConsultOrigin.
A live (video) telehealth consult.
The patient joins through the
<natzar-telehealth>embed (or the/joinroute of a headless integration); the physician takes the call in the Natzar portal, or in YOUR portal through the physician-side routes (/roomhands them the LiveKit grant). Once the call completes, a composite recording and (for English calls) a transcript are produced asynchronously — thetelehealth.recording_readywebhook fires when they are available.