List Appointments¶
Searches appointments.
Endpoint¶
Query Parameters¶
| Parameter | Type | Required | Description |
|---|---|---|---|
page |
integer | Yes | 1-based page number. Defaults to 1. |
page_size |
integer | Yes | Results per page. Defaults to 25. |
clinic_id |
string | No | The clinic this record belongs to. |
provider_id |
string | No | The treating provider. |
patient_id |
string | No | The patient. Correlate on this — it's a stable id, and there's no external-reference field. |
spry_case_id |
string | No | The case's business key. |
status |
string | No | |
from |
string (date) | No | YYYY-MM-DD. |
to |
string (date) | No | YYYY-MM-DD. |
expand |
string | No | e.g. patient,provider,clinic,coverage |
Request¶
curl --location '{base_url}/v2/appointments?page=1&page_size=25' \
--header 'Authorization: Bearer JWT_TOKEN'
Response¶
Success Response¶
Code: 200 OK
{
"items": [
{
"id": "418907",
"patient_id": "63120",
"provider_id": "2094",
"clinic_id": "5831",
"spry_case_id": "SPRY-63120-2",
"appointment_type_id": "318",
"start_time": "2026-09-14T16:00:00Z",
"end_time": "2026-09-14T17:00:00Z",
"status": "CONFIRMED",
"payment_mode": "INSURANCE_PAY",
"telehealth_url": null,
"notes": null,
"source": "EXTERNAL_API",
"recurrence": {
"frequency": "WEEKLY",
"interval": 1,
"days_of_week": [
"MONDAY",
"TUESDAY"
],
"end_date": "2026-12-31",
"series_id": null
},
"cancellation": null,
"checked_in_at": null,
"checked_out_at": null,
"patient": {
"patient_id": "63120",
"first_name": "Morgan",
"middle_name": null,
"last_name": "Delgado",
"suffix": null,
"date_of_birth": "1991-07-23",
"gender": "MALE",
"email": "m.delgado@example.com",
"mobile": "+1-555-0155",
"address": {
"line1": "482 Willow Creek Rd",
"line2": null,
"city": "Fairview",
"state": "OR",
"postal_code": "97024",
"country": "US"
},
"preferred_language": "en",
"status": "CREATED",
"organisation_id": "7412",
"clinic_ids": [
"5831"
],
"provider_ids": [
"2094"
],
"secondary_contact": null,
"photo_url": null,
"height": null,
"weight": null,
"created_at": "2026-08-27T14:30:00Z",
"updated_at": "2026-08-27T14:30:00Z"
},
"provider": {
"id": "418907",
"onboarding_provider_id": "d27a6b10-9f34-4e82-b5c1-7a03e8946fd2",
"user_id": "2094",
"first_name": "Morgan",
"middle_name": null,
"last_name": "Delgado",
"email": "m.delgado@example.com",
"mobile": "+1-555-0155",
"npi": "1740398215",
"license": "PT-30914",
"speciality": "PHYSICAL_THERAPY",
"sub_specialities": [],
"qualifications": [
"DPT"
],
"photo_url": null,
"signature_url": null,
"status": "CONFIRMED",
"online_booking_enabled": true,
"clinics": [
{
"clinic_id": "5831",
"onboarding_clinic_id": "b41f7c92-5e08-4a13-8d6f-2c9147ab3e5d",
"status": "CONFIRMED",
"online_booking_enabled": true,
"hours": [
{
"days_of_week": [
"MONDAY",
"TUESDAY"
],
"start_time": "08:00",
"end_time": "17:00"
}
]
}
],
"home_health": {
"enabled": true,
"state_code": "OR",
"address": {
"line1": "482 Willow Creek Rd",
"line2": null,
"city": "Fairview",
"state": "OR",
"postal_code": "97024",
"country": "US"
},
"location": {
"lat": 45.5231,
"lng": -122.6765
},
"transport_mode": "CAR",
"max_drive_seconds": 2700,
"max_visits_per_week": 12,
"max_allowed_visits_per_slot": 2,
"target_hours_weekly": 30,
"online_booking": true,
"pet_comfort": true,
"stair_comfort": true,
"accepting_new_patients": true,
"schedules": [
{
"effective_start_date": "2026-09-01",
"effective_end_date": null,
"entries": [
{
"days_of_week": [
"MONDAY",
"TUESDAY"
],
"start_time": "08:00",
"end_time": "17:00",
"address": {
"line1": "482 Willow Creek Rd",
"line2": null,
"city": "Fairview",
"state": "OR",
"postal_code": "97024",
"country": "US"
},
"location": {
"lat": 45.5231,
"lng": -122.6765
}
}
]
}
],
"scheduling_overrides": {
"2026-09-17": {
"ranges": []
},
"2026-09-20": {
"ranges": [
{
"start_time": "10:00",
"end_time": "12:00"
}
]
}
}
},
"created_at": "2026-08-27T14:30:00Z",
"updated_at": "2026-08-27T14:30:00Z"
},
"clinic": {
"id": "418907",
"onboarding_clinic_id": "b41f7c92-5e08-4a13-8d6f-2c9147ab3e5d",
"organisation_id": "7412",
"name": "Example Therapy \u2014 Riverside",
"email": "m.delgado@example.com",
"phone": "+1-555-0143",
"fax": null,
"address": {
"line1": "482 Willow Creek Rd",
"line2": null,
"city": "Fairview",
"state": "OR",
"postal_code": "97024",
"country": "US"
},
"timezone": "America/Los_Angeles",
"npi": "1740398215",
"logo_url": "https://assets.example.com/logo.png",
"about": null,
"specialities": [
"PT",
"OT"
],
"hours": [
{
"days_of_week": [
"MONDAY",
"TUESDAY"
],
"start_time": "08:00",
"end_time": "17:00"
}
],
"online_booking_enabled": true,
"max_visits_per_slot": 3,
"status": "ONBOARDING",
"created_at": "2026-08-27T14:30:00Z",
"updated_at": "2026-08-27T14:30:00Z"
},
"coverage": {
"primary": {
"id": "418907",
"patient_id": "63120",
"rank": "PRIMARY",
"payer": {
"id": "418907",
"name": "Example Therapy \u2014 Riverside"
},
"member_id": "K631204418",
"group_number": "GRP-4471",
"group_name": null,
"plan": {
"name": "Example Therapy \u2014 Riverside",
"type": null
},
"coverage_type": "COMMERCIAL",
"subscriber": {
"relationship": "SELF",
"first_name": "Morgan",
"last_name": "Delgado",
"date_of_birth": "1991-07-23"
},
"effective_from": "2026-01-01",
"effective_to": null,
"status": "CONFIRMED",
"created_at": "2026-08-27T14:30:00Z",
"updated_at": "2026-08-27T14:30:00Z"
},
"secondary": {
"id": "418907",
"patient_id": "63120",
"rank": "PRIMARY",
"payer": {
"id": "418907",
"name": "Example Therapy \u2014 Riverside"
},
"member_id": "K631204418",
"group_number": "GRP-4471",
"group_name": null,
"plan": {
"name": "Example Therapy \u2014 Riverside",
"type": null
},
"coverage_type": "COMMERCIAL",
"subscriber": {
"relationship": "SELF",
"first_name": "Morgan",
"last_name": "Delgado",
"date_of_birth": "1991-07-23"
},
"effective_from": "2026-01-01",
"effective_to": null,
"status": "CONFIRMED",
"created_at": "2026-08-27T14:30:00Z",
"updated_at": "2026-08-27T14:30:00Z"
}
},
"created_at": "2026-08-27T14:30:00Z",
"updated_at": "2026-08-27T14:30:00Z"
}
],
"page": 1,
"page_size": 25,
"total": 1,
"total_pages": 1
}
Response Fields¶
| Field | Type | Description |
|---|---|---|
items |
array of object | The page of results. See Items. |
page |
integer | 1-based page number. |
page_size |
integer | Results per page. |
total |
integer | Total results matching the query. |
total_pages |
integer | Total pages available. |
Items¶
| Field | Type | Description |
|---|---|---|
id |
string | The appointment id. |
patient_id |
string or null | The patient. Correlate on this — it's a stable id, and there's no external-reference field. |
provider_id |
string or null | The treating provider. |
clinic_id |
string or null | The clinic this record belongs to. |
spry_case_id |
string or null | The case's business key. |
appointment_type_id |
string or null | The appointment type, from List Appointment Types. A single id, not a list. |
start_time |
string (date-time) | When the visit starts, as an ISO-8601 UTC instant. |
end_time |
string (date-time) or null | When the visit ends, as an ISO-8601 UTC instant. Computed from the appointment type's duration when omitted on create. |
status |
string or null | One of CONFIRMED, CANCELLED, SOAP_COMPLETED, PI_FILLED, PATIENT_CHECKIN, PATIENT_CHECKOUT, IN_PROCESS. |
payment_mode |
string or null | How the visit is paid for. Required on create; omitting it fails the booking with an unhelpful error. One of CASH, CARD, UPI, WALLET, SELF_PAY, INSURANCE_PAY, BILLING. |
telehealth_url |
string or null | Video visit link, when the appointment is virtual. |
notes |
string or null | |
source |
string or null | Where the record originated. |
recurrence |
object or null | Recurrence rule. null for a one-off. See Recurrence. |
cancellation |
object or null | Cancellation details. null unless the appointment was cancelled. See Cancellation. |
checked_in_at |
string (date-time) or null | Set by Check In. |
checked_out_at |
string (date-time) or null | Set by Check Out. |
patient |
object or null | See Patient. |
provider |
object or null | See Provider. |
clinic |
object or null | See Clinic. |
coverage |
object | See Coverage. |
created_at |
string (date-time) or null | |
updated_at |
string (date-time) or null |
Recurrence¶
| Field | Type | Description |
|---|---|---|
frequency |
string | How often the pattern repeats. |
interval |
integer | Repeat every N periods of frequency. |
days_of_week |
array of string | |
end_date |
string (date) | YYYY-MM-DD. |
series_id |
string or null | Groups the appointments generated from one recurring booking. |
Cancellation¶
| Field | Type | Description |
|---|---|---|
reason_key |
string or null | Cancellation reason key. |
comment |
string or null | |
cancelled_at |
string (date-time) or null | |
fee |
number or null | Cancellation fee applied, when any. |
Patient¶
| Field | Type | Description |
|---|---|---|
patient_id |
string | The patient. Correlate on this — it's a stable id, and there's no external-reference field. |
first_name |
string | |
middle_name |
string or null | |
last_name |
string | |
suffix |
string or null | |
date_of_birth |
string (date) or null | YYYY-MM-DD. |
gender |
string or null | Administrative gender, matching FHIR Patient.gender — used for demographics and claims, not a clinical assertion. One of MALE, FEMALE, OTHER, UNKNOWN. |
email |
string or null | |
mobile |
string or null | |
address |
object or null | See Address. |
preferred_language |
string or null | ISO 639-1 language code. |
status |
string | One of CREATED, ACTIVE, INACTIVE, DISCHARGED. |
organisation_id |
string or null | The organisation this record belongs to. Derived from the access token on writes and never trusted from the body. |
clinic_ids |
array of string | Clinics this record is associated with. |
provider_ids |
array of string | Providers associated with this record. |
secondary_contact |
string or null | |
photo_url |
string or null | A fetchable URL. It may be a time-limited signed URL, so fetch it rather than storing it. |
height |
string or null | |
weight |
string or null | |
created_at |
string (date-time) or null | |
updated_at |
string (date-time) or null |
Address¶
| Field | Type | Description |
|---|---|---|
line1 |
string or null | |
line2 |
string or null | |
city |
string or null | |
state |
string or null | |
postal_code |
string or null | |
country |
string or null |
Provider¶
| Field | Type | Description |
|---|---|---|
id |
string or null | The appointment id. |
onboarding_provider_id |
string or null | The provider's onboarding-record UUID. |
user_id |
string or null | The provider's user id. Same value as the provider id; both are returned rather than leaving that implicit. |
first_name |
string or null | |
middle_name |
string or null | |
last_name |
string or null | |
email |
string or null | |
mobile |
string or null | |
npi |
string or null | |
license |
string or null | |
speciality |
string or null | The record's primary speciality. |
sub_specialities |
array of string | |
qualifications |
array of string | |
photo_url |
string or null | A fetchable URL. It may be a time-limited signed URL, so fetch it rather than storing it. |
signature_url |
string or null | A fetchable URL. Treat it as time-limited and fetch it rather than storing it. In environments where signing is unavailable the raw stored value is returned, which isn't fetchable. |
status |
string or null | |
online_booking_enabled |
boolean or null | Whether this record is bookable through online booking. |
clinics |
array of object | See Clinics. |
home_health |
object or null | Home-visit settings for this provider. null when the provider has no home-visit configuration. See Home Health. |
created_at |
string (date-time) or null | |
updated_at |
string (date-time) or null |
Clinics¶
| Field | Type | Description |
|---|---|---|
clinic_id |
string or null | The clinic this record belongs to. |
onboarding_clinic_id |
string or null | The clinic's onboarding-record UUID. Always present for clinics created through onboarding, and the only way to address one before it's published. |
status |
string or null | |
online_booking_enabled |
boolean or null | Whether this record is bookable through online booking. |
hours |
array of object | Working hours, as one entry per distinct daily pattern. See Hours. |
Hours¶
| Field | Type | Description |
|---|---|---|
days_of_week |
array of string | Any of MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY. |
start_time |
string | When the visit starts, as an ISO-8601 UTC instant. 24-hour HH:MM. |
end_time |
string | When the visit ends, as an ISO-8601 UTC instant. Computed from the appointment type's duration when omitted on create. 24-hour HH:MM. |
Home Health¶
| Field | Type | Description |
|---|---|---|
enabled |
boolean | |
state_code |
string or null | Two-letter state the provider is licensed to visit in. |
address |
object or null | See Address. |
location |
object or null | Geographic point the visit window is anchored to. See Location. |
transport_mode |
string or null | How the provider travels between visits. One of CAR, BIKE, WALK, TRANSIT. |
max_drive_seconds |
integer or null | Longest drive the provider will accept between consecutive visits, in seconds. |
max_visits_per_week |
integer or null | Cap on home visits per week. |
max_allowed_visits_per_slot |
integer or null | Cap on home visits per schedule slot. |
target_hours_weekly |
integer or null | Target hours of home visits per week. Defaults to 30. |
online_booking |
boolean or null | Whether this record is bookable through online booking. |
pet_comfort |
boolean | Whether the provider will visit homes with pets. |
stair_comfort |
boolean | Whether the provider will visit homes requiring stairs. |
accepting_new_patients |
boolean or null | Whether this provider is accepting new home-health patients. Defaults to true. |
schedules |
array of object | Independent home-visit availability periods, each with its own weekly entries[]. Periods must not overlap, and at most one may be open-ended. See Schedules. |
scheduling_overrides |
object | Per-date exceptions to the weekly schedule, keyed YYYY-MM-DD. A key's presence is what marks a day off from no override — empty ranges (absent entirely on read) means no visits that day, and a populated ranges[], each a {start_time, end_time} window with an optional address/location to anchor it away from the provider's home base, replaces the weekly pattern for that date. Every date must fall inside one of schedules[]'s periods, and past dates are rejected. On write, an explicit null clears a key and restores the weekly pattern; an omitted key is left alone. |
Location¶
| Field | Type | Description |
|---|---|---|
lat |
number | Latitude, decimal degrees. |
lng |
number | Longitude, decimal degrees. |
Schedules¶
| Field | Type | Description |
|---|---|---|
effective_start_date |
string (date) | When this period takes effect. YYYY-MM-DD. |
effective_end_date |
string (date) or null | When this period stops applying. null for open-ended — periods must not overlap, and at most one may be open-ended. YYYY-MM-DD. |
entries |
array of object | See Entries. |
Entries¶
| Field | Type | Description |
|---|---|---|
days_of_week |
array of string | Any of MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY. |
start_time |
string | When the visit starts, as an ISO-8601 UTC instant. 24-hour HH:MM. |
end_time |
string | When the visit ends, as an ISO-8601 UTC instant. Computed from the appointment type's duration when omitted on create. 24-hour HH:MM. |
address |
object | See Address. |
location |
object | Geographic point the visit window is anchored to. See Location. |
Clinic¶
| Field | Type | Description |
|---|---|---|
id |
string or null | The appointment id. |
onboarding_clinic_id |
string or null | The clinic's onboarding-record UUID. Always present for clinics created through onboarding, and the only way to address one before it's published. |
organisation_id |
string or null | The organisation this record belongs to. Derived from the access token on writes and never trusted from the body. |
name |
string | |
email |
string or null | |
phone |
string or null | |
fax |
string or null | |
address |
object or null | See Address. |
timezone |
string or null | IANA timezone name. |
npi |
string or null | |
logo_url |
string or null | |
about |
string or null | |
specialities |
array of string | |
hours |
array of object | Working hours, as one entry per distinct daily pattern. See Hours. |
online_booking_enabled |
boolean | Whether this record is bookable through online booking. |
max_visits_per_slot |
integer or null | |
status |
string | One of ONBOARDING, ACTIVE, INACTIVE. |
created_at |
string (date-time) or null | |
updated_at |
string (date-time) or null |
Coverage¶
| Field | Type | Description |
|---|---|---|
primary |
object or null | See Primary. |
secondary |
object or null | See Secondary. |
Primary¶
| Field | Type | Description |
|---|---|---|
id |
string | The appointment id. |
patient_id |
string | The patient. Correlate on this — it's a stable id, and there's no external-reference field. |
rank |
string or null | The patient's general coordination-of-benefits order. Separate from a case's coverage pointers, which say which plans bill that episode — they legitimately differ. null when the card is unallocated. One of PRIMARY, SECONDARY, TERTIARY. |
payer |
object | The insurance payer, as a registry reference. See Payer. |
member_id |
string or null | The member's id on the plan. |
group_number |
string or null | |
group_name |
string or null | |
plan |
object | The plan on this coverage. See Plan. |
coverage_type |
string or null | How this plan is billed. One of COMMERCIAL, MEDICARE, MEDICAID, WORKERS_COMP, MVC, SELF_PAY. |
subscriber |
object or null | The plan's subscriber, when it is not the patient. See Subscriber. |
effective_from |
string (date) or null | YYYY-MM-DD. |
effective_to |
string (date) or null | YYYY-MM-DD. |
status |
string | |
created_at |
string (date-time) or null | |
updated_at |
string (date-time) or null |
Payer¶
| Field | Type | Description |
|---|---|---|
id |
string or null | The appointment id. |
name |
string or null |
Plan¶
| Field | Type | Description |
|---|---|---|
name |
string or null | |
type |
string or null |
Subscriber¶
| Field | Type | Description |
|---|---|---|
relationship |
string | The subscriber's relationship to the patient. One of SELF, SPOUSE, CHILD, OTHER. |
first_name |
string or null | |
last_name |
string or null | |
date_of_birth |
string (date) or null | YYYY-MM-DD. |
Secondary¶
| Field | Type | Description |
|---|---|---|
id |
string | The appointment id. |
patient_id |
string | The patient. Correlate on this — it's a stable id, and there's no external-reference field. |
rank |
string or null | The patient's general coordination-of-benefits order. Separate from a case's coverage pointers, which say which plans bill that episode — they legitimately differ. null when the card is unallocated. One of PRIMARY, SECONDARY, TERTIARY. |
payer |
object | The insurance payer, as a registry reference. See Payer. |
member_id |
string or null | The member's id on the plan. |
group_number |
string or null | |
group_name |
string or null | |
plan |
object | The plan on this coverage. See Plan. |
coverage_type |
string or null | How this plan is billed. One of COMMERCIAL, MEDICARE, MEDICAID, WORKERS_COMP, MVC, SELF_PAY. |
subscriber |
object or null | The plan's subscriber, when it is not the patient. See Subscriber. |
effective_from |
string (date) or null | YYYY-MM-DD. |
effective_to |
string (date) or null | YYYY-MM-DD. |
status |
string | |
created_at |
string (date-time) or null | |
updated_at |
string (date-time) or null |
Error Response¶
Code: 400 Bad Request
{
"code": "bad_request",
"message": "Validation failed",
"errors": [
{
"field": "patient_id",
"message": "must be a string"
}
]
}
Every error has the same shape — a machine-readable code, a message, and an errors[] array that's empty when there's nothing field-specific to report. The HTTP status is authoritative.
| Status | code |
Meaning |
|---|---|---|
400 Bad Request |
bad_request |
The request body or parameters failed validation. errors[] names the offending fields. |
401 Unauthorized |
unauthorized |
The access token is missing, malformed or expired. |
403 Forbidden |
forbidden |
The request references a resource outside the token's organisation or clinic scope. |
404 Not Found |
not_found |
No such resource, or it's outside your scope. |
429 Too Many Requests |
rate_limited |
Rate limit exceeded. Back off and retry. |
500 Internal Server Error |
internal_error |
Unexpected server error. |
502 Bad Gateway |
upstream_error |
Upstream service failed or timed out. |
Notes¶
fromandtoboundstart_time.- Pass
?expand=patient,provider,clinic,coverageto hydrate the referenced records instead of making a follow-up call per id.