Level 1 - One provider, one operatory, fixed weekly schedule

📌

Go back to the main guide here: https://docs.nexhealth.com/docs/scheduling-configuration-guide#/

Throughout this guide, we will use the example office called Happy Smiles Dental to demonstrate working hour configurations.

Happy Smiles Dental - Configuration 1

Dr. Smith works Mondays through Thursdays, 9:00 AM to 5:00 PM, in Operatory 1. Same hours every week. No lunch break in the schedule. No exceptions.

This straightforward configuration is the simplest one most practices start with. Every other level adds a layer of complexity on top.

Configure

One POST. The provider's full week goes in the days array.

curl -X POST 'https://nexhealth.info/working_hours?subdomain=YOUR_SUBDOMAIN&location_id=YOUR_LOCATION_ID' \
  -H 'Nex-Api-Version: v20240412' \
  -H 'Authorization: Bearer YOUR_BEARER_TOKEN' \
  -H 'Content-Type: application/json' \
  -d '{
    "working_hour": {
      "active": true,
      "provider_id": YOUR_PROVIDER_ID,
      "operatory_id": YOUR_OPERATORY_ID,
      "begin_time": "09:00",
      "end_time": "17:00",
      "days": ["Monday", "Tuesday", "Wednesday", "Thursday"]
    }
  }'

The response echoes the record back with source: "manual" and label: null. That null label is the marker and it means "this is the base provider working hours" You'll see why that distinction matters in later levels.

Response (trimmed):

{
  "data": [
    {
      "source": "manual",
      "label": null
    }
  ]
}

Retrieve slots

Ask for Dr. Smith's bookable time on a Monday:

curl -X GET 'https://nexhealth.info/available_slots?subdomain=YOUR_SUBDOMAIN&start_date=2026-05-07&days=1&lids[]=YOUR_LOCATION_ID&pids[]=YOUR_PROVIDER_ID&slot_length=60&slot_interval=45&overlapping_operatory_slots=false&appointments_per_timeslot=1' \
  -H 'Nex-Api-Version: v20240412' \
  -H 'accept: application/vnd.Nexhealth+json;version=2' \
  -H 'Authorization: Bearer YOUR_BEARER_TOKEN'

The response returns a continuous run of bookable windows from 9:00 AM to 5:00 PM.


Response (trimmed):

{
  "data": [
    "lid": 21241,
      "pid": 158936024,
      "slots": [
        {
          "time": "2026-05-07T09:00:00.000-07:00",
          "end_time": "2026-05-07T17:00:00.000-07:00",
          "operatory_id": 1,
          "working_hour_label_id": null
        },
  ]
}

Slot length is determined by the appointment type or the specified slot_interval. The slots themselves are simply the working hour window cut into bookable chunks.

Gotchas

The POST succeeded but slots are still empty.

Configured working hours is a pre-requisite to utilizing the /available_slots endpoint.
Below is an example 200 response for an /available_slots call without configured availability:

{
    "code": true,
    "description": "Next available slot not found. Please confirm that the provider has active availabilities.",
    "error": null,
    "data": [
        {
            "lid": 21241,
            "pid": 158936024,
            "slots": [],
            "next_available_date": null
        }
    ],
    "count": 1
}