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
2xxand the NexHealth record changes, but nothing reaches the system. The practice does not see it. 400means the API rejects the call. Nothing changes.- To learn which system a practice runs, call
GET /sync_status; each sync returns anemrobject with adisplay_name. On v3.1.0 (beta),GET /locations/{id}returns it asehr.
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 send | Sent to the system on | On the other systems | How you know it landed |
|---|---|---|---|
POST /appointments | Every system, once the location has insert_appt_client: true | Held in NexHealth, never sent | appointment_insertion: complete, or failed, timed_out or incomplete. On complete the appointment's foreign_id is set. |
PATCH /appointments with cancelled: true | athenahealth, Cloud9, Curve Hero, Denticon, Dentrix, Dentrix Ascend, Dentrix Enterprise, Dolphin, Eaglesoft, eClinicalWorks, ModMed, NextGen Office, Open Dental | NexHealth only | appointment_updated |
PATCH /appointments with confirmed: true | Every system | appointment_updated | |
PATCH /appointments with checkin_at | Denticon, Dentrix, Dentrix Enterprise, Eaglesoft, ModMed, NextGen Office, Open Dental | NexHealth only | appointment_updated |
PATCH /appointments with start_time and end_time, operatory_id or note | Denticon, Dentrix, Dentrix Enterprise, Eaglesoft, Open Dental | 400 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 /appointmentsworks once the appointment has reached the system (foreign_idset). Before that, onlycancelled: trueis accepted, so you can free the slot when an insertion fails. Anything else returns400Cannot 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 send | Sent to the system on | On the other systems | How you know it landed |
|---|---|---|---|
POST /patients | Nothing 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_id | athenahealth, 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 /patients | Nothing 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 send | Sent to the system on | On the other systems | How you know it landed |
|---|---|---|---|
POST /payments | Dentrix, Dentrix Enterprise, Eaglesoft, Open Dental, where the practice has ledger sync | The API returns 202 on every system. On these the payment never reaches the ledger. | payment_insertion: complete, or failed, timed_out or incomplete |
POST /adjustments | The same four | The same | adjustment_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_coveragesandDELETE /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_insertionandinsurance_coverage_deletedtell you when it landed.POST /communication_logsis Open Dental only, turned on per organization. Other systems return422.
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.
Updated about 1 hour ago