/api/v1/organization/business-hours
Authentication: API key or dashboard session. Reads are open to any org member; writes need an owner or admin role.
1. What the org-level hours and holiday calendar are
Orbit resolves an inbound call’s schedule in three layers, per field. Each ofbusiness_hours and holiday_calendar_id resolves independently — a local value on one field never suppresses inheritance of the other:
- The surface’s own value — the queue, route, or attendant set this field itself → that value wins.
- The org default — the surface left the field unset → it inherits the org-wide value from this page.
- No gate — neither layer set the field → no restriction; calls are never gated by a schedule that was never configured.
Two properties to build on:
- Per-field independence. A queue can set its own weekday hours and still inherit the org holiday calendar, or the reverse. Override one field, inherit the other.
- Fail-open evaluation. A missing, unreadable, or misconfigured schedule never blocks a call — the surface behaves as if no gate fired. A bad org default degrades to “no restriction,” it does not lock your callers out.
2. Who can read and who can change it
- Read (
GET) — any member of the organization. Reading the company hours is a normal operator action, so the endpoint answers for every role. - Write (
PUT) — owner or admin only, matching the rest of the organization configuration writes. Members with a lower role get a 403 on write.
3. Set company hours and holiday dates
The endpoint is diff-submit: send only the fields you want to change. An omitted field keeps its stored value; an explicitnull clears that org default.
business_hours accepts the same two shapes the per-route scheduler accepts:
- Single window —
{ days, start, end, timezone }: one window applied across the listed days. Days can be numbers (0= Sunday …6= Saturday) or lowercase day names ("mon","tue", …), and omittingdaysmeans every day. - Per-day —
{ timezone, mon, tue, ... }: each weekday maps to{ open, close }ornull(closed that day).
holiday_calendar_id must reference a holiday calendar owned by your organization — the id from Voice → Calendars (see holiday calendars). An id from anywhere else answers 422.
cURL
cURL
{ "business_hours": null, "holiday_calendar_id": null } — no gate anywhere inherits anything until you set one. To clear just the holiday tie while keeping the hours, send { "holiday_calendar_id": null }.
4. Where the cascade lands
Because inheritance is per field, ten minutes of setup is: set both org fields once, then touch only the surfaces that genuinely differ.
The queue case in practice — one queue that inherits, then overrides:
Inherit. Create the queue with no schedule fields. It follows the org company hours and holidays automatically; nothing to maintain on the queue itself when the org schedule changes.
Override. Give it its own window and its inheritance of that field ends:
cURL
sun absent marks Sunday closed, and holiday_calendar_id was never touched on the queue so the org calendar keeps applying.
5. Two worked examples, both directions
Org-wide, cascaded down. A rotating on-call team wants weekends off everywhere. PUT the org defaultbusiness_hours to the per-day shape with sat: null, sun: null. Every queue, route, and attendant without a local override now treats weekends as closed; callers land on the fallback path (voicemail, a closed message, an IVR branch) per that surface’s closed action. One edit, whole org.
Surface-level override. The escalation queue must stay reachable on Saturday. Set the org default closed on weekends as above, then PUT that one queue’s business_hours with sat: { open: "09:00", close: "13:00" }. The whole org still inherits the weekend-closed org default; this one queue opens Saturday morning because its local value wins — and it still inherits the org holiday calendar, because that field is unset locally.
6. Production checklist
- Inheritance is per field, not per surface. Overriding hours does not stop holiday inheritance (and vice versa). Check both fields when a surface behaves unexpectedly — a local
holiday_calendar_idset months ago will keep blocking org-holiday inheritance even after the hours were overridden. - Holiday beats open hours. A date on the inherited org calendar closes the surface even inside an otherwise-open weekday window. Model genuine holidays there; a calendar that accidentally lists a normal Tuesday closes everything that inherits it.
- DST is handled per timezone. Both hours and calendar timezones are IANA zones, so the gate re-derives “today” correctly across daylight-saving transitions — no copy change needed, but any surface that pinned a fixed offset (avoidable only by not using the timezone field) would drift. Prefer the zone name everywhere.
- Clear with
null, not omit. Sending{}or omitting a field is a no-op; send the field explicitly set tonullto remove an org default. - 422 on the calendar id means wrong-org or missing. The holiday calendar must belong to your organization; re-check the id from the calendars list before retrying.
- Fallback path still needs configuring. Inheriting a “closed” decision only helps if the surface’s closed action (voicemail, IVR branch, callback offer) points somewhere sensible. The org default decides when a surface is closed; each surface’s own fallback decides what happens then.
See also
- Holiday calendars for inbound voice — author the calendar, per-DID attach, precedence and troubleshooting
- Inbound number routing — per-route
business_hoursandholiday_calendar_idfields - ACD queues — the queue surface that inherits from this page
- Workspace general settings — the sibling org-level page: timezone, locale, plan, danger zone