August 2026
4 days ago
What's New
This release adds Provider and WorkingHour webhook events, includes booking details in appointment_created webhooks, reworks how v3.1 patient phone numbers are written and returned, and removes last_sync_time from several v3.1 responses.
Added
- [v3.1] New
provider_createdandprovider_updatedwebhook events, subscribable under theProviderresource type. - [v3.1] New
working_hour_createdandworking_hour_updatedwebhook events, subscribable under theWorkingHourresource type. - [v3.1]
appointment_createdwebhook payloads (for subscriptions pinned tov3.1.0) now includebooking_details— context about how the appointment was booked online (booked_via_nexhealth_generated_link,campaign_type,campaign_id,campaign_medium,booked_via_one_click),nullwhen it wasn't booked through NexHealth online booking — and always include apatientobject (withguarantor_idonly, not a nested guarantor). - [v3.1] Patient responses now include
cell_phone_numberand a new read-onlypreferred_phone_numberfield — the best-known number, in priority order: the integrated system's untyped primary number, then cell, home, and work numbers.cell_phone_numberfalls back to that same untyped primary number when the integrated system doesn't report a distinct typed cell number. The previous untypedphone_numberfield is no longer present on patient responses (provider responses are unaffected). - [v3.1]
ssnis now included in patient responses (previously write-only) — but only on single-patient responses (create, update, and fetch-by-id); it does not appear in patient list responses or in patient objects embedded in other resources (e.g. an appointment'spatient). - [v3.1]
GET /locations/:idresponses now include anehrfield describing the EHR the location syncs with.
Changed
- [v3.1]
POST /patientsandPATCH /patientsnow accept phone number and other demographic fields at the root of thepatientobject instead of nested under abioobject; address fields move into a new nestedaddressobject (line_1,line_2,city,region,postal_code) instead of separatebiokeys. - [v3.1]
POST /patientsrequires at least one non-blank phone number (cell_phone_number,home_phone_number, orwork_phone_number); on bothPOSTandPATCH, phone number fields can no longer be set to a blank value. - [v3.1]
POST /patientsonly enqueues insertion into the EHR when the connected EHR supports creating patients directly (currently Denticon, Dentrix, Eaglesoft, and Open Dental); for other EHRs, the responsedescriptionnow explains the patient will be added when an appointment is booked for them. - [v3.1]
PATCH /patients/:idno longer returns422("Patient has not been synced to the EHR") for a patient at a location with no connected EHR — such a patient can never receive aforeign_id, so this update was previously never possible at all. It also no longer returns422when the patient's EHR insert is merely still in progress; the update is now accepted and applied once the insert completes. - [v3.1]
GET /payment_plans/:idwithinclude=patientorinclude=guarantornow nests the patient/guarantor object in v3.1's patient shape (nobiowrapper; includescell_phone_number/preferred_phone_number) instead of the v2 shape it previously received; thelocation_idsandpreferred_localefields previously available on that nested object are no longer present. - [v3.1]
GET /available_slotsnow respects an explicitly-providedslot_intervaleven when the location hasbook_on_minutesconfigured — previously,book_on_minutesalways forced a fixed 5-minute step between candidate slots regardless of anyslot_intervalpassed.slot_intervalmust now be a positive integer. - [v3.0, v3.1]
POST /paymentsno longer always rejects a payment for a patient that hasn't finished syncing to the EHR with400 Bad Request; if a patient-insert sync is already in flight, the request now returns202 Accepted(empty body), and the payment syncs to the EHR once the patient insert completes. - [v2, v3.0]
GET /locationsandGET /locations/:idnow exclude locations that are still in onboarding; requesting one directly by id returns404 Not Found. - [v3.1]
GET /locations(list) also excludes onboarding locations;GET /locations/:iddoes not — an onboarding location can still be fetched directly by id. - NexHealth no longer supports server operating systems prior to Windows 10. To maintain compatibility with the NexHealth Synchronizer, servers running legacy operating systems must be upgraded to Windows 10 or higher.
Fixed
- [v3.1]
GET /appointment_categoriesandGET /appointment_categories/:idnow actually return theoperatoriesfield wheninclude=operatoriesis passed — previously the parameter was accepted and used internally, but the field was never exposed in the response. - [v3.1] The
operatory_idsfilter on theavailable_slotsendpoint no longer silently falls back to returning slots for every operatory when the filter matches none; it now correctly returns no slots. - [v2]
POST /webhook_endpointsandPATCH /webhook_endpoints/:idnow return the correctdescriptionmessage ("New endpoint created successfully" / "Endpoint updated successfully") in the response — a parameter-name typo previously caused a generic fallback message to be returned instead.
Removed
- [v3.1]
last_sync_timehas been removed from appointment, EHR appointment descriptor, provider, patient, location, and operatory responses. - [v3.1]
POST /patientsandPATCH /patientsno longer acceptstreet_address,custom_contact_number,drivers_license,fax,height,insurance_name,marital_status,preferred_name,race,salutation,weight, or the untypedphone_numberfield — all previously available under the nestedbioobject.phone_numberis superseded by the typedcell_phone_number/home_phone_number/work_phone_numberfields described above.