---
title: "Create a room"
method: POST
path: "/shop/rooms"
tags: ["Rooms"]
---

# Create a room

`POST /shop/rooms`

Creates a new `Room` at the given site. The minimum body is
`name`, `capacity`, and `site_id`. The room initially follows the
site's opening hours; pass `use_custom_opening_hours = true`
together with `availability_rules` to override.

Requires the `SETTINGS_MANAGE` permission on the room's site.

## Request body

- object
  - `name` string, required — Display name for the room. Shown to staff in the calendar and admin UI. Plain text only.
  - `capacity` integer, required — How many concurrent bookings the room can host. `1` means exclusive single-occupancy. Multi-guest sharing requires an appointment type with `allocate_multi_capacity_rooms = true`.
  - `site_id` string, uuid, required — ID of the site this room belongs to. The caller's API key must have access to this site, otherwise the request 422s.
  - `organisation_id` string, uuid — Optional organisation ID. Defaults to the caller's primary organisation when omitted.
  - `use_custom_opening_hours` boolean — When true, the room uses its own `availability_rules` instead of the site's opening hours. When false (or omitted), the site's hours are used and `availability_rules` is ignored.
  - `availability_rules` object[] — Per-day availability windows for the room. Only honoured when `use_custom_opening_hours = true`. Each rule must specify `weekday`, `time_from`, and `time_to`.
    - `weekday` 'monday' | 'tuesday' | 'wednesday' | 'thursday' | 'friday' | 'saturday' | 'sunday', required — Day of the week this rule applies to.
    - `time_from` string, required — Daily start time in 24-hour `HH:MM`.
    - `time_to` string, required — Daily end time in 24-hour `HH:MM`. Must be after `time_from`.
  - `suitable_for_tags` string[] — Tag IDs the room is suitable for. Used by the availability engine to match rooms against an appointment type's required tags.
  - `tag_ids` string[] — Free-form tag IDs for reporting and filtering. Distinct from `suitable_for_tags`. Tags must belong to the caller's organisation and apply to rooms.
  - `zone_ids` string[] — Zone IDs the room belongs to. Zones must exist at the same `site_id`; mismatched zones are rejected with 422.

## Response `201`

A single `Room`.

- object — Single-item envelope mixin. `allOf` this into any show response that wraps its `data` payload in an outer object; the concrete schema (e.g. `ShowUser`) adds its own `data` property with the appropriate `$ref` and keeps its own title so the SDK surface is unchanged.
  - `data` Room, required — A `Room` is a physical space in which appointments are delivered. Rooms have capacity (1 = single occupancy, >1 = multi-guest), an availability schedule, and optional tags / zones. They power room allocation when an appointment is booked: the availability engine picks an unoccupied room whose capacity, tags, and zones match the appointment type.
    - `id` string, object-id, required — Unique identifier of the room.
    - `organisation_id` string, uuid, required — ID of the organisation the room belongs to.
    - `site_id` string, uuid, required — ID of the site the room belongs to. A room is scoped to exactly one site.
    - `name` string, required — Display name for the room. Visible to staff in the calendar and admin UI; not shown to customers.
    - `capacity` integer, required — How many concurrent bookings the room can host. `1` means single-occupancy (appointments exclusively block the room); values > 1 enable multi-guest sharing when the appointment type opts in via `allocate_multi_capacity_rooms`.
    - `availability_rules` AvailabilityRule[], required — Per-day availability windows that override the site's opening hours for this room. Empty array means the room follows site opening hours.
      - `id` string, object-id, required — The ID of the availability rule.
      - `date_from` string, date, required — The start of the rule period.
      - `date_to` string, date, required — The end of the rule period.
      - `is_available` boolean, required — Whether the resource is available during this period. Any `false` rules will override `true` rules.
      - `max_duration` integer — Maximum number of minutes.
      - `min_duration` integer — Minimum number of minutes.
      - `time_from` string, required — The daily start time of the time period, in 24 hour format.
      - `time_to` string, required — The daily end time of the time period, in 24 hour format.
      - `weekdays` string[] — The weekdays this rule applies to.
    - `suitable_for_tags` string[], required — Tag IDs that this room is suitable for. The availability engine matches these against the booking's required tags to decide if the room can host the appointment (e.g. a "wet room" tag for hydrotherapy treatments).
    - `tag_ids` string[], required — Free-form tag IDs attached to the room for reporting and filtering. Distinct from `suitable_for_tags` — these don't affect allocation logic.
    - `tags` Tag[] — Hydrated `Tag` records for the room's `tag_ids`.
      - `id` string, required
      - `name` string, required
      - `organisation_id` string, required
    - `zones` Zone[] — Hydrated `Zone` records this room belongs to. Zones group rooms in the floor plan and are used for spatial constraints in availability.
      - `id` string, object-id, required — Unique identifier for the zone.
      - `name` string, required — Display name for the zone, shown wherever zones are listed or filtered. Plain text only.
      - `organisation_id` string, uuid, required — ID of the organisation that owns this zone. Inherited from the site on create.
      - `site_id` string, uuid, required — ID of the site this zone belongs to.

## Other responses

- `401` — The user is unauthenticated
- `403` — The authenticated user does not have permission.
- `422` — The request didn't pass validation

---

[API](https://skmtc.dev/try/apis/trybe-api.md) · [All operations](https://skmtc.dev/try/apis/trybe-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/try/trybe-api/revisions/f37f92702da5/schema)
