Closed Days
Which dates the business is shut over a window, and why. Three settings can stop a booking being taken on a date, and this folds all three into one answer:
- a closure (one-off, weekly, or imported from a connected calendar);
- a date outside every open-dates window (see Open Dates);
- a special-hours entry whose answer for that weekday is Closed (see Special Hours).
Use this to draw a calendar or to answer "are we open on the 21st". To manage the closure rows themselves, use the closures endpoints, which list and edit rows rather than dates.
Objectโ
| Field | Type | Description |
|---|---|---|
date | string | The closed date, in the business's own timezone (YYYY-MM-DD) |
all_day | boolean | true when the business is shut for the whole date |
closed_windows | array | Closed wall-clock windows, e.g. [{ "start": "13:00", "end": "15:00" }]. Empty when all_day is true |
reasons | array | What shuts the date. Each carries type, id, label and when |
reasons[].type is closure, season (outside your open dates) or
special_hours. id is the closure's id, or null for the other two. A date
shut by more than one thing lists them all.
Overlapping closed windows are merged, so a date closed 12:00โ14:00 and 13:00โ15:00 comes back as one window of 12:00โ15:00.
List closed daysโ
GET /v1/settings/calendar/closed-days?from=2026-11-01&to=2026-11-30
Requires the calendar:read scope.
Parametersโ
| Parameter | Type | Required | Description |
|---|---|---|---|
from | string | Yes | First date to check (YYYY-MM-DD) |
to | string | Yes | Last date to check (YYYY-MM-DD), on or after from |
location_id | integer | No | Check one location. Omit for the whole business, where a closure scoped to a single site does not count as closed |
Ask for a year or less at a time; a longer window returns 422.
Only the dates the business is actually shut come back. An open date is absent rather than present with an empty payload.
Success (200 OK)โ
{
"data": [
{
"date": "2026-11-02",
"all_day": true,
"closed_windows": [],
"reasons": [
{
"type": "closure",
"id": 41,
"label": "Public holiday",
"when": "Nov 2, 2026 ยท All day"
}
]
},
{
"date": "2026-11-05",
"all_day": false,
"closed_windows": [
{ "start": "13:00", "end": "15:00" }
],
"reasons": [
{
"type": "closure",
"id": 42,
"label": "Lunch break",
"when": "Nov 5, 2026 ยท 1:00 PM โ 3:00 PM"
}
]
},
{
"date": "2026-11-21",
"all_day": true,
"closed_windows": [],
"reasons": [
{
"type": "season",
"id": null,
"label": "Outside your open dates",
"when": "All day"
}
]
}
],
"meta": {
"request_id": "01JBQ8...",
"timestamp": "2026-11-01T09:12:44+00:00"
}
}
Errorsโ
| Status | Code | When |
|---|---|---|
422 | validation_error | from or to missing, not YYYY-MM-DD, or to before from |
422 | validation_error | The window is longer than a year |
403 | insufficient_scope | The key lacks calendar:read |
Locationsโ
With location_id, a closure scoped to other sites is ignored and one scoped to
that site shuts it. Without it, only business-wide closures shut the business:
one site being closed is not the business being closed.