Testing writes, per system

Which health record systems take each write, what the API does on the others, and how you know a write landed.

Your Open Dental sandbox takes every write the API makes, so you can test all of them there. Live practices run 15 systems, and not every system takes every write. Before you ship, know which writes work on each practice's system.

How to read the tables

  • Sent to the system means NexHealth queues the change for the practice's sync and it lands on the next cycle, usually within minutes. See How a write reaches the health record system.
  • NexHealth only means the API returns 2xx and the NexHealth record changes, but nothing reaches the system. The practice does not see it.
  • 400 means the API rejects the call. Nothing changes.
  • To learn which system a practice runs, call GET /sync_status; each sync returns an emr object with a display_name. On v3.1.0 (beta), GET /locations/{id} returns it as ehr.

Appointments

Every PATCH /appointments write is confirmed the same way: when the command finishes, appointment_updated fires on success, or appointment_updated.failed, .timed_out or .incomplete otherwise, with previous_attributes showing the field you changed.

What you sendSent to the system onOn the other systemsHow you know it landed
POST /appointmentsEvery system, once the location has insert_appt_client: trueHeld in NexHealth, never sentappointment_insertion: complete, or failed, timed_out or incomplete. On complete the appointment's foreign_id is set.
PATCH /appointments with cancelled: trueathenahealth, Cloud9, Curve Hero, Denticon, Dentrix, Dentrix Ascend, Dentrix Enterprise, Dolphin, Eaglesoft, eClinicalWorks, ModMed, NextGen Office, Open DentalNexHealth onlyappointment_updated
PATCH /appointments with confirmed: trueEvery systemappointment_updated
PATCH /appointments with checkin_atDenticon, Dentrix, Dentrix Enterprise, Eaglesoft, ModMed, NextGen Office, Open DentalNexHealth onlyappointment_updated
PATCH /appointments with start_time and end_time, operatory_id or noteDenticon, Dentrix, Dentrix Enterprise, Eaglesoft, Open Dental400 EMR does not support appointment update for a time or note change. A change to operatory_id alone is accepted and stays in NexHealth.appointment_updated

Two more rules on live practices:

  • PATCH /appointments works once the appointment has reached the system (foreign_id set). Before that, only cancelled: true is accepted, so you can free the slot when an insertion fails. Anything else returns 400 Cannot update appointment because it is not synced with the PMS and/or a live client.
  • A cancelled appointment or a scheduling block cannot be updated.

Patients

What you sendSent to the system onOn the other systemsHow you know it landed
POST /patientsNothing is sent on v3.0.0. The patient is created in NexHealth and reaches the system when you book their first appointment.foreign_id stays null until an appointment lands.
POST /appointments for a patient with no foreign_idathenahealth, Cloud9, Denticon, Dentrix, Dentrix Ascend, Dentrix Enterprise, Eaglesoft, eClinicalWorks, ModMed, NextGen Office, Open Dental, OrthoTrac. The patient is created in the system as part of the booking.Curve Hero, Dolphin and PracticeWorks cannot take a new patient from the API. Book with a patient the system already has.appointment_insertion. The patient's foreign_id is set when it lands.
PATCH /patientsNothing is sent on v3.0.0. NexHealth only.

On v3.1.0 (beta), POST /patients sends the patient straight to Denticon, Dentrix, Eaglesoft and Open Dental and fires patient_insertion; PATCH /patients sends the change and fires patient_update.

Payments and adjustments

What you sendSent to the system onOn the other systemsHow you know it landed
POST /paymentsDentrix, Dentrix Enterprise, Eaglesoft, Open Dental, where the practice has ledger syncThe API returns 202 on every system. On these the payment never reaches the ledger.payment_insertion: complete, or failed, timed_out or incomplete
POST /adjustmentsThe same fourThe sameadjustment_insertion, same suffixes

Both calls return 202 with an empty body. The record appears on GET /payments or GET /adjustments once the sync reads it back.

Documents

POST /patients/{id}/documents reaches the system only where document insertion is turned on for it: Curve Hero, Denticon, Dentrix, Dentrix Ascend, Dentrix Enterprise, Eaglesoft and Open Dental. For athenahealth, eClinicalWorks and OrthoTrac, ask developer support. Elsewhere the document stays in NexHealth. document_insertion fires with complete, or failed, timed_out or incomplete.

v3.1.0 (beta) only

Sandbox keys can call v3.1.0; production keys need access for your organization. See Versioning.

  • POST /insurance_plans, POST /insurance_coverages and DELETE /insurance_coverages/{id} are sent to Dentrix, Eaglesoft and Open Dental. Elsewhere the API accepts the call and the change stays in NexHealth. insurance_plan_insertion, insurance_coverage_insertion and insurance_coverage_deleted tell you when it landed.
  • POST /communication_logs is Open Dental only, turned on per organization. Other systems return 422.

What this means for your sandbox

Every row that names Open Dental works on your Open Dental sandbox, so you can test each write end to end there. The demo practice has no sync behind it: bookings are accepted and never land, and PATCH /appointments returns 400 for anything but a cancel. See Sandbox and test mode.


Did this page help you?
ChangelogMCP serverErrorsdevelopers@nexhealth.com