Working hours define when providers can be booked through NexHealth. Before you can use GET /available_slots to show live provider availability, each provider must have working hours.
Working hours are the time windows when online booking is allowed. They are either:
- Synced: NexHealth reads them from the provider's health record system, for supported systems.
- Manual: you create them through the NexHealth
/working_hoursendpoint.
Why working hours matter
When you request available slots, NexHealth looks only inside a provider's working hours. If no working hours exist, GET /available_slots returns no availability, even if the provider has open time in the health record system.
Working hours set the boundaries for online bookingThe available slots endpoint fills those boundaries with the open times from the provider's schedule.
Synced and manual working hours
| Description | Type | Editable in NexHealth? | source value |
|---|---|---|---|
| NexHealth reads them from the provider's health record system, if supported. | Synced | ❌ No. Update it in the health record system. | "synced" |
You create them through the /working_hours API. | Manual | ✅ Yes. Create and update it through NexHealth. | "manual" |
Check a working hour's source attribute to see how it is managed.
With synced working hours, NexHealth reads and refreshes schedules from these supported health record systems:
athenahealth, Denticon, Dentrix Enterprise, Eaglesoft, eClinicalWorks, ModMed, Open Dental and OrthoTrac.
Turn on syncingTo turn on syncing from the health record system for your account, contact [email protected].
Relationship to available slots
GET /available_slots builds open times by subtracting booked appointments and unavailable times on the calendar from working hours, synced or manual.
For example, if a provider works 9:00 AM to 5:00 PM on Mondays, NexHealth checks the health record system for existing appointments and returns the remaining free slots inside that window.
Tip
GET /available_slotsonly returns times inside working hours.
Working hour labels (Open Dental only)
For Open Dental, NexHealth supports labeled templates synced from the health record system. They appear in the label attribute of a synced working hour.
label value | Meaning |
|---|---|
null | Standard provider working hour |
label | Templated time block synced from Open Dental |
Custom recurrence
For manual working hours, you can define your own recurrence pattern with these fields:
| Field | Description |
|---|---|
ref | When the recurrence starts |
unit | The time unit (day, week or month) |
num | How many units between each recurrence |
This lets you set schedules such as:
“Every 2 weeks on Monday and Wednesday.”
Time zones
All times are in the location's local time zone. The tz_offset field shows the UTC offset. For example, "-0400" means 4 hours behind UTC.
Operatory field
If a location has map_by_operatory = true, you must send the operatory_id field when you create or update a working hour. This maps booking availability to the right rooms or chairs in the practice.
NoteLeaving out
operatory_idwhenmap_by_operatory = truereturns an error.
Key takeaways
- You need at least one working hour before you use
GET /available_slots. - NexHealth syncs working hours from a health record system, or you create them through NexHealth.
- You can only edit manual working hours in NexHealth.
- NexHealth calculates availability inside the time windows set by working hours.
TipCheck that your working hours are set up correctly before you call
GET /available_slots. This avoids empty results.
Example response
{
"code": true,
"description": null,
"error": null,
"data": [
{
"id": 72941563,
"provider_id": 518347926,
"location_id": 445892,
"operatory_id": 287456,
"begin_time": "09:00",
"end_time": "11:00",
"days": ["Monday"],
"specific_date": "2025-09-29",
"custom_recurrence": null,
"tz_offset": "-0400",
"active": true,
"source": "synced",
"label": {
"id": 52187,
"location_id": null,
"name": "2 Hours"
}
},
{
"id": 73091254,
"provider_id": 518347930,
"location_id": 445892,
"operatory_id": null,
"begin_time": "09:00",
"end_time": "17:00",
"days": ["Monday"],
"specific_date": "2025-09-29",
"custom_recurrence": null,
"tz_offset": "-0400",
"active": true,
"source": "synced",
"label": null
}
],
"count": 1382
}