Working Hours

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_hours endpoint.

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

DescriptionTypeEditable 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: The GET /available-slots endpoint 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 valueMeaning
nullStandard provider working hour
labelTemplated time block synced from Open Dental

Custom Recurrence

For manually configured working hours, you can define your own recurrence pattern using the following fields:

FieldDescription
refWhen the recurrence starts
unitThe time unit (daily, weekly, or monthly)
numHow 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 the operatory_id when map_by_operatory = true will 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 the GET /available-slots endpoint 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
}