Event Types & Sample Events¶
The events Spry can deliver to a webhook subscription, with sample payloads in the current 2026-06-11 minimized format. A single subscription can listen to any combination of these events.
event_type |
Fired when |
|---|---|
patient.created |
A patient is registered |
patient.updated |
A patient's profile is updated |
appointment.created |
An appointment is booked |
appointment.updated |
An appointment is modified (status change, reschedule, check-in) |
appointment.cancelled |
An appointment is cancelled |
case.created |
A patient case (plan of care) is opened |
case.updated |
A patient case is modified (insurance, referring physician, status, …) |
Each payload follows the common envelope. The minimized format carries only identifiers and a non-PHI status under data — look up the full record from the Spry API by id.
Patient Events¶
patient.created and patient.updated carry the patient identifier and status.
data Fields¶
| Field | Type | Description |
|---|---|---|
organisation_id |
integer | Owning organisation |
patient_id |
integer | Spry patient identifier — look the patient up via the Spry API |
status |
string | ACTIVE, INACTIVE, or ARCHIVED |
Sample — patient.updated¶
{
"event_id": "evt_3d1fa7e8-1234-4567-89ab-cdef01234567",
"event_type": "patient.updated",
"api_version": "2026-06-11",
"timestamp": 1776249887,
"data": {
"organisation_id": 74,
"patient_id": 45741,
"status": "ACTIVE"
}
}
Appointment Events¶
appointment.created, appointment.updated, and appointment.cancelled carry the appointment and related identifiers plus the appointment status.
data Fields¶
| Field | Type | Description |
|---|---|---|
organisation_id |
integer | Owning organisation |
appointment_id |
integer | Spry appointment identifier — look the appointment up via the Spry API |
patient_id |
integer | Patient the appointment belongs to |
spry_case_id |
string | Linked plan-of-care case (SPRY_CASE_<id>) |
clinic_id |
integer | Clinic the appointment belongs to |
status |
string | See Appointment Status Values |
Sample — appointment.updated¶
{
"event_id": "evt_8f3a2b9c-1234-4567-89ab-cdef01234567",
"event_type": "appointment.updated",
"api_version": "2026-06-11",
"timestamp": 1776246130,
"data": {
"organisation_id": 74,
"appointment_id": 113191,
"patient_id": 45675,
"spry_case_id": "SPRY_CASE_69d778fa05e30511a1a2b282",
"clinic_id": 44,
"status": "PATIENT_CHECKIN"
}
}
Appointment Status Values¶
| Value | Description |
|---|---|
CONFIRMED |
Booked and confirmed |
PATIENT_CHECKIN |
Patient has checked in |
IN_PROGRESS |
Session in progress |
COMPLETED |
Session completed |
CANCELLED |
Cancelled |
NO_SHOW |
Patient did not arrive |
Case Events¶
A case is a patient's plan-of-care container — it ties a patient to a specialization, referring physician, insurance cards, ICD/CPT codes, and treatment status. case.created and case.updated carry the case identifier and treatment status.
data Fields¶
| Field | Type | Description |
|---|---|---|
organisation_id |
integer | Owning organisation |
spry_case_id |
string | Canonical Spry case identifier (SPRY_CASE_<id>) — look the case up via the Spry API |
patient_id |
integer | Patient the case belongs to |
treatment_status |
string | e.g. ACTIVE |
Sample — case.updated¶
{
"event_id": "evt_2c9f1a7b-aaaa-bbbb-cccc-1234567890ab",
"event_type": "case.updated",
"api_version": "2026-06-11",
"timestamp": 1781153619,
"data": {
"organisation_id": 74,
"spry_case_id": "SPRY_CASE_6a2a3ee88546243488bdd2e1",
"patient_id": 48998,
"treatment_status": "ACTIVE"
}
}
Test Webhook¶
A test webhook uses the same envelope but adds "test": true to the payload so you can ignore test deliveries in production code paths.