Business Hours - Public
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 (monday–sunday)businessHours[].isOpen: Whether this day is a working daybusinessHours[].openTime/closeTime: Operating hours inHH:MMformattimezone: 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 inYYYY-MM-DDformat
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 inHH:MMformatavailable:falseif 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"
