The Working Hours API defines when providers can be booked through NexHealth.
Before you can use the GET /available-slots endpoint to show real-time provider availability, you must have Working Hours configured for each provider.
Working Hours represent the time windows during which online bookings are allowed. These can either be:
- Synced from the provider’s EHR system (for supported systems), or
- Manually configured through the NexHealth
/working_hoursendpoint.
Why working hours matter
When you request available slots, NexHealth looks only within a provider’s configured working hours.
If no working hours exist, the GET /available-slots endpoint will return no availability, even if the provider has open time in their EHR.
Working Hours define the boundaries for online booking.
The Available Slots endpoint fills those boundaries with actual open times from the provider’s schedule.
EHR-synced vs. manual working hours
| Description | Type | Editable in NexHealth? | source Value |
|---|---|---|---|
| Automatically read from the provider’s EHR (if supported). | Synced | ❌ No. Update directly in the EHR. | "synced" |
Configured manually via the /working_hours API. | Manual | ✅ Yes. Create and update via NexHealth. | "manual" |
You can determine how a working hour is managed by checking its source attribute.
If you’re using synced working hours, NexHealth automatically reads and refreshes schedules from supported EHR systems:
Athena, Dentrix Enterprise, eClinicalWorks, Open Dental, Orthotrac, ModMed, NextGen Office, and Eaglesoft.
To enable EHR syncing for your account, contact [email protected].
🔄 Relationship to Available Slots
The GET /available-slots endpoint generates open times by subtracting booked appointments and calendar unavailabilities from configured working hours (whether synced or manual).
For example:
If a provider works 9:00 AM – 5:00 PM on Mondays, NexHealth checks the EHR for existing appointments and returns the remaining free slots within that 9-5 window.
Tip: TheGET /available-slotsendpoint will only return times within defined working hours.
Working Hour Labels (Open Dental Only)
For Open Dental, NexHealth supports labeled templates that are synced from the EHR.
You’ll see these represented 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 manually configured working hours, you can define your own recurrence pattern using the following fields:
| Field | Description |
|---|---|
ref | When the recurrence starts |
unit | The time unit (daily, weekly, or monthly) |
num | How many units between each recurrence |
This allows you to configure flexible schedules such as:
“Every 2 weeks on Monday and Wednesday.”
Time Zones
All times are expressed in the location’s local time zone.
You can view the UTC offset in the tz_offset field (for example, "-0400" means 4 hours behind UTC).
Operatory Field
If a location has map_by_operatory = true, the operatory_id field becomes required when creating or updating a working hour.
This ensures booking availability correctly maps to specific rooms or chairs in the practice.
Note: Omitting theoperatory_idwhenmap_by_operatory = truewill result in an error.
Key Takeaways
- You must have at least one working hour configured before using
GET /available-slots. - Working hours can be synced from an EHR or manually created via NexHealth.
- Only manual working hours can be edited directly in NexHealth.
- NexHealth calculates availability within the time windows defined by working hours.
Pro Tip: Always verify that your working hours are configured correctly before calling theGET /available-slotsendpoint to avoid 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
}