read:patient_tracking scope
on every route. Every response, errors included, is sent with Cache-Control: private, no-store.
Flow
GET /v4/patient-tracking/sourceslists the organization’s tracking sources: one per EHR connection the board can be read through. Each carriessourceId(pts_…),instanceId(ins_…),ehr,availabilityandcapabilities. This call makes no EHR request.GET /v4/patient-tracking/facilities?sourceId=andGET /v4/patient-tracking/providers?sourceId=list the native facility and provider ids to filter by.- Poll
GET /v4/patient-tracking/snapshot?sourceId=…everyrecommendedPollIntervalSeconds(10).
sourceId must be the pts_… value from /sources; a raw UUID or another resource’s id is a 400. A
source that does not exist, belongs to another organization or is no longer eligible is a 404 source_not_found.
Snapshot parameters
Empty list elements (
101,,102), unknown expansions and unknown query parameters are all 400.
Expansions
Requesting an expansion without every listed scope is a
403 include_not_permitted; it is never silently
dropped. An expansion you did not request is absent from the row, not null. Inside an expansion, a value
the EHR does not supply is null.
Snapshot response
rows: the whole day for the selected facilities, with no pagination. On EZDerm a row is an encounter in one of seven in-clinic statuses (CHECKED_IN,ARRIVED,IN_ROOM,WITH_PROVIDER,WITH_STAFF,READY_FOR_STAFF,READY_FOR_PROVIDER).trackingKeyis a stable row identity across polls.counts:returnedis the number of rows. On ModMed,seenAppointmentsalso counts the returned rows (after the provider filter) andscheduledAppointmentscounts the facility’s scheduled appointments regardless of provider. EZDerm reports both asnull.freshness.state:fresh, orstalewhen the latest EHR read failed and a recent complete snapshot (no older thanmaxUsableAgeSeconds) was served instead.completeness: per-component status (primary,officeFlow,colors) and warning codes. A snapshot is only returned when its primary read was complete.access: the expansions requested and returned.
Errors
Every
503 sets Retry-After and repeats it as data.retryAfterSeconds.