---
updatedAt: 2026-10-01T07:36:00.000Z
agentTools:
  projectIndex: https://docs.nexhealth.com/llms.txt
---

# Working Hours

<p style="display: none">**API Version:** This document applies to **v3.0.0**, also referred to as **v20240412**, of the API.</p>

<br />The **Working Hours API** defines when providers can be booked through NexHealth.<br />Before you can use the [`GET /available-slots`](#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.<br />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.**<br />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:

**athenahealth**, **Dentrix Enterprise**, **eClinicalWorks**, **Open Dental**, **OrthoTrac**, **ModMed**, **NextGen Office**, and **Eaglesoft**.

> 📘 To enable EHR syncing for your account, contact <developers@nexhealth.com>.

## 🔄 Relationship to Available Slots

The [`GET /available-slots`](#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.<br />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 |

<br />

## 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**.<br />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.<br />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

```json
{
  "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
}
```

<br />