API

Business Hours - Public

Public tenant-scoped business hours endpoints for the customer-facing booking UI.

Base path: /api/v1/business-hours

Used by: customer-booki-web-app, cms-booki-web-app · Role: guest / customer
organizationId: Resolved by tenant middleware from x-tenant-slug header

These are public business hours endpoints that allow the booking UI to show when a business is open and what time slots are available. All three endpoints require a tenant slug.

For owner-side business hours management (update hours, set intervals), see Organizations - Business Hours.


GET /api/v1/business-hours — Get Business Hours

Auth: Public (requires x-tenant-slug header)
Used by: customer-booki-web-app, cms-booki-web-app · Role: guest / customer
Description: Get the full business hours configuration for a tenant — which days they're open and their operating hours.

Request

Headers (required):

X-Tenant-Slug: janes-salon

Response (200 OK)

{
  "businessHours": [
    {
      "day": "monday",
      "isOpen": true,
      "openTime": "08:00",
      "closeTime": "17:00"
    },
    {
      "day": "tuesday",
      "isOpen": true,
      "openTime": "08:00",
      "closeTime": "17:00"
    },
    {
      "day": "wednesday",
      "isOpen": true,
      "openTime": "08:00",
      "closeTime": "17:00"
    },
    {
      "day": "thursday",
      "isOpen": true,
      "openTime": "08:00",
      "closeTime": "17:00"
    },
    {
      "day": "friday",
      "isOpen": true,
      "openTime": "08:00",
      "closeTime": "17:00"
    },
    {
      "day": "saturday",
      "isOpen": false,
      "openTime": "08:00",
      "closeTime": "17:00"
    },
    {
      "day": "sunday",
      "isOpen": false,
      "openTime": "08:00",
      "closeTime": "17:00"
    }
  ],
  "timezone": "Asia/Manila",
  "intervalMinutes": 60
}

Fields:

  • businessHours[].day: Day of week (mondaysunday)
  • businessHours[].isOpen: Whether this day is a working day
  • businessHours[].openTime / closeTime: Operating hours in HH:MM format
  • timezone: IANA timezone (e.g. Asia/Manila)
  • intervalMinutes: Booking slot duration in minutes (e.g. 60 = 1-hour slots)

Error Responses

422 Unprocessable Entity — Missing tenant slug:

{
  "statusCode": 422,
  "message": "Tenant identifier is required to process this request."
}

404 Not Found — Tenant not found:

{
  "statusCode": 404,
  "message": "Organization not found."
}

cURL Example

curl -X GET http://localhost:4001/api/v1/business-hours \
  -H "X-Tenant-Slug: janes-salon"

GET /api/v1/business-hours/open-days — Get Open Days of Week

Auth: Public (requires x-tenant-slug header)
Used by: customer-booki-web-app, cms-booki-web-app · Role: guest / customer
Description: Get only the days of the week when the business is open. Useful for disabling closed days in a date picker.

Request

Headers (required):

X-Tenant-Slug: janes-salon

Response (200 OK)

{
  "openDays": ["monday", "tuesday", "wednesday", "thursday", "friday"]
}

cURL Example

curl -X GET http://localhost:4001/api/v1/business-hours/open-days \
  -H "X-Tenant-Slug: janes-salon"

GET /api/v1/business-hours/timeslots — Get Available Timeslots

Auth: Public (requires x-tenant-slug header)
Used by: customer-booki-web-app, cms-booki-web-app · Role: guest / customer
Description: Get the list of available booking time slots for a specific date. Returns slots generated from the business's open hours and intervalMinutes, minus already fully-booked slots.

Request

Headers (required):

X-Tenant-Slug: janes-salon

Query Parameters (required):

  • date (string): Target date in YYYY-MM-DD format
GET /api/v1/business-hours/timeslots?date=2026-05-10

Response (200 OK)

{
  "timeslots": [
    { "time": "08:00", "available": true },
    { "time": "09:00", "available": true },
    { "time": "10:00", "available": false },
    { "time": "11:00", "available": true },
    { "time": "12:00", "available": true },
    { "time": "13:00", "available": true },
    { "time": "14:00", "available": false },
    { "time": "15:00", "available": true },
    { "time": "16:00", "available": true }
  ]
}
  • time: Slot start time in HH:MM format
  • available: false if this slot has reached the maximum booking count (MAX_SLOTS_PER_TIME, default 3)

cURL Example

curl -X GET "http://localhost:4001/api/v1/business-hours/timeslots?date=2026-05-10" \
  -H "X-Tenant-Slug: janes-salon"