appointment.created, appointment.updated, patient.updated) also fire from EHR sync when staff make changes directly in the EHR. See Sync Events for those.Payload Envelope
Every operation event uses this envelope:object: "event" and created) applies to operation, sync, and on-demand live-fetch events (appointment.live_fetch_completed, availability.live_fetch_completed, patient.live_fetch_completed) alike. Live-fetch events carry action: "sync" and additionally include a timestamp field, a legacy alias of created retained for backward compatibility; prefer created. See Receiving Webhooks for details.Structured Error Codes
Operation failure events (appointment.failed, patient.failed, etc.) include structured error codes so you can handle different failure scenarios programmatically:
- Machine-readable error codes — parse errors programmatically instead of string matching
- Context-aware descriptions — error messages include specific details (MRN, provider names)
- Backward compatibility — the legacy
failure_reasonfield is still included
Error Response Structure
Failure events include both the legacyfailure_reason field and a reasons array:
failure_reason(string) — concatenated description for backward compatibilityreasons(array) — structured error objects, each with a machine-readablecodeand a human-readabledescription
Handling Errors Programmatically
Appointment Events
appointment.created
appointment.created
appointment.updated
appointment.updated
appointment.failed
appointment.failed
PATIENT_NOT_FOUND— Patient not found in EHRPROVIDER_NOT_FOUND— Provider not found or invalidINVALID_VISIT_TYPE— Visit type not configured in EHRLOCATION_NOT_FOUND— Location/facility not foundTIME_SLOT_UNAVAILABLE— Requested time slot is not availablePROVIDER_UNAVAILABLE— Provider unavailable at requested timeDOUBLE_BOOKING_CONFLICT— Provider’s schedule has a conflicting visit or block at the requested time (only returned whenprevent_double_booking: "true"was set on the appointment)INVALID_COMPLAINT_TYPE— Chief complaint type not foundEHR_RATE_LIMITED— The EHR rate limited requests; retry in a few momentsEXPIRED— The request’sexpires_attime passed before the appointment could be savedTERMINAL_FAILURE— Unspecified terminal failure
appointment.update_failed
appointment.update_failed
APPOINTMENT_NOT_FOUND— Appointment not found in EHRSECTION_LOCKED— Appointment section is lockedINVALID_STATUS— Invalid status transitionUPDATE_BLOCKED— Update blocked by EHR rulesCLAIMS_ASSOCIATED— Claims exist, update not allowedUPDATE_VERIFICATION_FAILED— Update verification failedTERMINAL_FAILURE— Unspecified terminal failure
Patient Events
patient.created
patient.created
ehr_id and demographics), call GET /v1/patients filtered by the returned mrn.patient.failed
patient.failed
DUPLICATE_PATIENT— Patient already exists with same name/DOBINVALID_DATE_OF_BIRTH— Date of birth format is invalidREQUIRED_FIELD_MISSING— Required demographic field missingINSURANCE_NOT_FOUND— Insurance company not found in EHRINVALID_INSURANCE_POLICY_TYPE— Insurance policy type invalidPCP_PROVIDER_NOT_FOUND— Primary care provider not foundREFERRING_PROVIDER_NOT_FOUND— Referring provider not foundPHARMACY_NOT_FOUND— Pharmacy not found in EHRPERMISSION_DENIED— User lacks permission to create patientsEHR_RATE_LIMITED— The EHR rate limited requests; retry in a few momentsTERMINAL_FAILURE— Unspecified terminal failure
patient.updated
patient.updated
failed_fields and message are present only when some requested fields could not be applied; a fully successful update omits them.Payload Example (partial update):patient.update_failed
patient.update_failed
patient.updated event carrying failed_fields is sent instead.Payload Example:patient.insurance.added
patient.insurance.added
audit_trail is present in the success payload for some EMRs and absent for others, so the payload above may carry more or fewer fields than your integration returns.patient.insurance.updated
patient.insurance.updated
patient.insurance.failed
patient.insurance.failed
Task Events
task.created
task.created
task.failed
task.failed
PATIENT_NOT_FOUND— Patient MRN not found in EHRASSIGNEE_NOT_FOUND— Assigned user not found in EHRINVALID_TASK_DATA— Task data validation failedPERMISSION_DENIED— User lacks permission to create tasksTERMINAL_FAILURE— Unspecified terminal failure
Codes Events
codes.added
codes.added
icd reports which codes were applied versus skipped as duplicates, not matched in the EMR catalog, or rejected as invalid for the encounter date.Payload Example:codes.removed
codes.removed
not_found lists codes that were not on the encounter.Payload Example:codes.failed
codes.failed
ECW_REJECTED_CHANGE— The EMR rejected the diagnosis-code changeEHR_RATE_LIMITED— The EHR rate limited requests; retry in a few momentsUPSTREAM_TEMPORARILY_UNAVAILABLE— The EMR was temporarily unavailable; the operation is retried automatically and this only fires if retries are exhaustedUNKNOWN_ERROR— Unspecified terminal failure
Note Events
note.uploaded
note.uploaded
status field distinguishes a clean upload from a partial success, where the note body was written but one or more diagnosis (ICD) or procedure (CPT) codes could not be matched in the EHR. When codes are present, they are reported under icd_codes and cpt_codes, each split into matched and unmatched (and, for ICD, skipped).Payload Example:note.uploaded (with status: "partial_success") rather than note.failed. Check status and the unmatched arrays if you need to reconcile coding.note.failed
note.failed
UNSUPPORTED_CHARACTERS— The note text contains characters the EHR cannot acceptMAX_ATTEMPTS_EXCEEDED— Note creation failed after all retry attemptsUNKNOWN_ERROR— An unexpected error occurred
Document Events
document.uploaded
document.uploaded
document.failed
document.failed
PATIENT_NOT_FOUND— Patient not found in EHRDOCUMENT_CLASS_NOT_FOUND— Document folder/category not foundINVALID_DOCUMENT_CONTENT— Document content is invalidDOCUMENT_UPLOAD_FAILED— Upload failed for unspecified reasonUNKNOWN_ERROR— Unexpected error occurred
document.upload_failed
document.upload_failed
PATIENT_NOT_FOUND— Patient not found in EHRDOCUMENT_CLASS_NOT_FOUND— Document folder/category not foundUNKNOWN_ERROR— Unexpected error occurred during upload
Message Events
message.created
message.created
message.failed
message.failed
MESSAGE_SEND_FAILED— Message failed to sendPROVIDER_NOT_FOUND— Provider not found in EHRINVALID_MESSAGE_CONTENT— Message content validation failedMESSAGE_TOO_LONG— Message exceeds maximum lengthTERMINAL_FAILURE— Unspecified terminal failure
Telephone Encounter Events
telephone_encounter.created
telephone_encounter.created
telephone_encounter.created_partial
telephone_encounter.created_partial
telephone_encounter.failed
telephone_encounter.failed
telephone_encounter_action.created
telephone_encounter_action.created
telephone_encounter_action.failed
telephone_encounter_action.failed
Order Events
order_catalog.searched
order_catalog.searched
POST /v1/orders/catalog/fetch completes. The items array holds one page of orderable catalog entries; use their item_id values to create an order.Payload Example:order.created
order.created
order.create_failed
order.create_failed
order.updated
order.updated
PATCH /v1/orders/:id.Payload Example:order.update_failed
order.update_failed
PATCH /v1/orders/:id.Payload Example:lab_result.created
lab_result.created
POST /v1/orders/:id/results.Payload Example:lab_result.create_failed
lab_result.create_failed
POST /v1/orders/:id/results.Payload Example:Test Event
test.event
test.event
POST /v1/webhook/test).Payload Example:POST /v1/webhook) before sending a test event.