Skip to main content
GET
List appointments

Authorizations

Authorization
string
header
required

Marketplace API key

Headers

X-Organization-Id
string
required

Target clinic organization ID

Query Parameters

dateFrom
string

Filter appointments from this date (ISO 8601)

Example:

"2025-01-01"

dateTo
string

Filter appointments up to this date (ISO 8601)

Example:

"2025-12-31"

statuses
enum<string>[]

Comma-separated list of normalized statuses to filter by. See GET /appointments/statuses for the vocabulary; cancelled,no_show is the reactivation filter. A value outside the vocabulary is rejected with 400 — it is NOT silently ignored, and this applies on every version including v1/v2. Send the normalized status, never the EHR's own integrationStatus.

Available options:
scheduled,
confirmed,
arrived,
in_progress,
completed,
cancelled,
no_show,
rescheduled,
other,
unknown
Example:

"cancelled,no_show"

appointmentTypeIds
string[]

Comma-separated list of appointment type ids from GET /appointment-types — the id field, NOT externalId. The EHR-native id is only unique within one EHR instance, so filtering on it would silently match another instance's appointments on a multi-instance organization; the catalogue id is unique. An id that does not resolve is dropped, and a filter where NONE resolve returns no appointments rather than falling back to unfiltered. At most 100 ids per request. (Stated here rather than as maxItems: Nest emits that only for body schemas, not query parameters — verified against the generated documents.)

cancelReasonIds
string[]

Comma-separated list of cancellation reason ids from GET /cancel-reasons — the id field, NOT externalId. Only matches appointments whose reason has been captured, which is currently none — see the cancelReason field's note. At most 100 ids per request.

facilityId
string

Filter by facility ID

patientId
string

Filter by patient ID

updatedSince
string

Only return appointments whose record was created or re-synced at/after this timestamp (ISO 8601). Compared against lastSyncedAt: this resource has no separate modification stamp, and the sync advances that field only when one of the appointment's OWN columns actually changes. So this feed tracks the appointment row and nothing else — it does NOT track the joined patient*, provider* and facilityName fields it returns. Renaming a patient changes patientLastName in the response without moving lastSyncedAt; mirror those from /patients, /providers and /facilities instead. When set, results are ordered by lastSyncedAt ascending with id as tiebreaker, overriding sortBy. Must carry an explicit UTC offset (...Z or ...+02:00) — a zone-less instant would be resolved against the database session timezone on some resources and the API process timezone on others, so the same string would mean two different moments. Pair with cursorId to walk safely — see that parameter; page/offset paging of this feed can drop rows. The bound is inclusive without cursorId, so boundary rows re-deliver — dedupe on id. A change feed cannot report a deletion; a consumer that prunes still needs a full walk.

Example:

"2026-08-01T00:00:00.000Z"

updatedUntil
string

Only return appointments whose record was last re-synced at/before this timestamp (ISO 8601). Pin this to the instant the walk started to freeze the window. Must carry an explicit UTC offset.

Example:

"2026-08-31T23:59:59.999Z"

cursorId
string

Id of the last row you already consumed, for a keyset walk. Pass it together with updatedSince set to that same row's lastSyncedAt, always requesting page 1; the next page is everything ordered after (lastSyncedAt, id). Use this rather than page/offset for any walk that must not drop rows. Paging a delta feed with page/offset is unsafe because the sort column is exactly what the sync workers rewrite: a row on an earlier page that changes mid-walk moves to the tail, every later row shifts one position toward the front, and the offset for the next page steps over whichever row moved into that slot. That row is never returned and its stamp is below the cursor the walk finishes on, so it is missed permanently while the walk still looks successful. On a cursor page pagination.totalCount counts the window starting at your cursor, so it shrinks as you walk — stop on a short page rather than on the count.

Example:

"apt_e5f6a7b8c9d04e1f2a3b4c5d6e7f8a9b"

sortBy
enum<string>

Sort field. Ignored when updatedSince/updatedUntil is set — see updatedSince.

Available options:
scheduledStartDate,
lastSyncedAt,
status
sortOrder
enum<string>

Sort direction

Available options:
asc,
desc

Response

Success

code
string
required

Response code

Example:

"success"

data
object
required