Appointments

List Appointments

Changed on

List Appointments. Returns one-on-one, group, and class bookings. The booking_type field distinguishes them, and group/class rows expose capacity, participant_count, and (via _include=participants) their participants. For class bookings patient_id is null.

Filtering: Filter records by field values using the format: field[operator]=value

Available fields:

  • public_id: string
  • start_at: ISO 8601 datetime (e.g. 2025-01-01T12:00:00Z)
  • end_at: ISO 8601 datetime
  • patient_id: UUID String
  • staff_member_id: UUID String
  • location_id: UUID String
  • treatment_id: UUID String
  • created_at: ISO 8601 datetime
  • updated_at: ISO 8601 datetime

Available operators:

  • eq: Equals
  • gt: Greater than
  • gte: Greater than or equal
  • lt: Less than
  • lte: Less than or equal

Date-time filters (ex. start_at, end_at, created_at, updated_at) must:

  • Use ISO 8601 date-time format
  • Be precise to the second (e.g. 2025-01-01T12:00:00Z)

Examples:

/appointments?public_id[eq]=abc123
/appointments?created_at[gte]=2025-01-01T00:00:00Z&created_at[lt]=2025-01-02T00:00:00Z
get/api/2026-01-01/appointments

Request

  • Base URL
    https://jdpdocsdemo.jane.qa
  • URL
    https://jdpdocsdemo.jane.qa/api/2026-01-01/appointments
  • Auth
    OAuth 2
    Authorization code: https://login.id.janeapp.com/realms/jane_partner_sandbox/protocol/openid-connect/auth?response_type=code&resource=https://jdpdocsdemo.jane.qa&prompt=consent
    Token URL: https://login.id.janeapp.com/realms/jane_partner_sandbox/protocol/openid-connect/token scopes: appointments:read

Query parameters

page[cursor]string
Example:eyJwYWdlIjoyLCJzaXplIjo1fQ==

The Base64 encoded cursor to start the list from. Contains page and size information for pagination.

page[limit]integer

The number of records to return

sortstring

Comma-separated list of fields to sort by. Prefix a field with '-' for descending order.

Examples:

  • sort=name,-created_at sorts by name ascending, then created_at descending.
  • sort=-updated_at sorts by updated_at descending.

Available fields:

  • start_at
  • end_at
  • booked_at
  • created_at
  • updated_at
eqstring

equals. Multiple equal values are comma-separated: ?field[eq]=value1,value2 (maximum 100 values)

nestring

not equals

costring

contains. Performs partial match (case-insensitive for string fields). Example: ?field[co]=search_term

gtstring

greater than

gtestring

greater than or equal to

ltstring

less than

ltestring

less than or equal to

swstring

starts with. Performs case-insensitive partial match for words in a string that begin with search term. Example: ?field[sw]=search_term

Filter by public_id. Example: public_id[eq]=123

eqstring date-time

equals. Multiple equal values are comma-separated: ?field[eq]=value1,value2

nestring date-time

not equals

gtstring date-time

greater than

gtestring date-time

greater than or equal to

ltstring date-time

less than

ltestring date-time

less than or equal to

Filter by start_at timestamp (ISO 8601). Example: start_at[gte]=2025-01-01T00:00:00Z

eqstring date-time

equals. Multiple equal values are comma-separated: ?field[eq]=value1,value2

nestring date-time

not equals

gtstring date-time

greater than

gtestring date-time

greater than or equal to

ltstring date-time

less than

ltestring date-time

less than or equal to

Filter by end_at timestamp (ISO 8601). Example: end_at[lte]=2025-01-02T00:00:00Z

eqstring

equals. Multiple equal values are comma-separated: ?field[eq]=value1,value2 (maximum 100 values)

Filter by patient_id. Example: patient_id[eq]=123

eqstring

equals. Multiple equal values are comma-separated: ?field[eq]=value1,value2 (maximum 100 values)

Filter by staff_member_id. Example: staff_member_id[eq]=123

eqstring

equals. Multiple equal values are comma-separated: ?field[eq]=value1,value2 (maximum 100 values)

Filter by location_id. Example: location_id[eq]=123

eqstring

equals. Multiple equal values are comma-separated: ?field[eq]=value1,value2 (maximum 100 values)

Filter by treatment_id. Example: treatment_id[eq]=123

eqstring date-time

equals. Multiple equal values are comma-separated: ?field[eq]=value1,value2

nestring date-time

not equals

gtstring date-time

greater than

gtestring date-time

greater than or equal to

ltstring date-time

less than

ltestring date-time

less than or equal to

Filter by created_at timestamp (ISO 8601). Example: created_at[gte]=2025-01-01T00:00:00Z

eqstring date-time

equals. Multiple equal values are comma-separated: ?field[eq]=value1,value2

nestring date-time

not equals

gtstring date-time

greater than

gtestring date-time

greater than or equal to

ltstring date-time

less than

ltestring date-time

less than or equal to

Filter by updated_at timestamp (ISO 8601). Example: updated_at[lt]=2025-01-02T00:00:00Z

_includestring
Example:patient,treatment,participants,room

Comma-separated list of related resources to sideload alongside each appointment.

Note: this parameter is currently consumed only by Jane's internal Companion app and is not yet part of the stable public contract. The shape and supported values may change without a CalVer version bump while we iterate.

When provided, the response includes a top-level included array of deduplicated resources in a JSON:API-inspired { type, id, attributes } shape. Deduplication is per page, so a page of 50 appointments referencing 3 patients yields 3 patient entries.

Supported values:

  • patient -- exposes first_name, last_name, preferred_name. Requires the patients:read scope.
  • treatment -- exposes name. Requires the treatments:read scope.
  • participants -- for group/class bookings, populates each appointment's inline participants array (patient_id, state, arrived_at, no_show_at, cancelled_at). Requires the appointments:read scope (no extra scope beyond the appointment itself). Unlike patient/treatment, participants render inline on each appointment rather than in the top-level included array, because they have no standalone identity.
  • room -- exposes name. Requires the rooms:read scope.

If the token lacks the required scope for a requested resource, the API returns 403 with a message naming the missing scope. (The parent payload already exposes the related resource's ID, so there is no existence-leak concern.) Unknown values return 400 with the list of allowed values.

Example: _include=patient,treatment,participants,room

Response

The appointments

limitinteger

The number of appointments to return

hasNextPageboolean

Whether there is a next page of appointments

cursorstring nullable

The Base64 encoded cursor for the next page. null if this is the last page.

Example response

{
  "links": {
    "after": "/api/2026-01-01/appointments?page[cursor]=eyJwYWdlIjozLCJzaXplIjo1fQ==&page[limit]=5"
  },
  "cursor": "eyJwYWdlIjozLCJzaXplIjo1fQ=="
}

Changes