---
title: "Update an AreaBooking"
method: PUT
path: "/shop/area-bookings/{areaBookingId}"
tags: ["AreaBookings"]
---

# Update an AreaBooking

`PUT /shop/area-bookings/{areaBookingId}`

Updates an existing `AreaBooking` — typically to reassign the
booked areas, reschedule the time slot, adjust the duration, or
progress the parent order through its check-in stages.

The update is routed through the basket / availability layer, so
every change is validated against the same rules as a fresh
booking: overlapping area reservations, capacity, site opening
hours, and the parent `AreaBookingType`'s permitted areas are all
enforced. Users with the `reservations.override-rules` permission
can bypass these checks server-side; everyone else will receive a
`400 Bad Request` describing the conflict.

When only `stage` is supplied the booking slot is left untouched
and the change is applied to the parent order, saving the
availability round-trip entirely.

## Request body

- UpdateAreaBooking — Body for `updateAreaBooking`. Every field is optional; pass only the fields you want to change. Time, duration, and area reassignments are revalidated against the same availability rules that the basket booking flow uses.
  - `area_ids` string[], nullable — Replace the set of `BookableArea`s assigned to this booking. Each area must permit the parent `AreaBookingType` and must be available for the booking's time slot.
  - `start_time` string, date-time — Move the booking so it starts at this date and time. If `end_time` is not also supplied it will be recalculated from the existing duration. Must be an RFC 3339 timestamp with offset.
  - `end_time` string, date-time — Move the booking so it ends at this date and time. Must be an RFC 3339 timestamp with offset and must be after `start_time`.
  - `time` string, date-time — **Deprecated**. Legacy alias for `start_time`. Will be removed once all calendar drag-and-drop clients have migrated.
  - `duration` integer — Set the booking duration in minutes. Must be positive. When only `duration` is supplied the booking's `end_time` is recalculated from the current `start_time`.
  - `stage` 'arrived' | 'in_treatment' | 'checked_out' | 'not_arrived', nullable — Move the parent order through its check-in flow. When `stage` is the only field provided the availability layer is skipped entirely. Pass `null` to clear the stage back to the default.

## Response `200`

The `AreaBooking` was successfully updated.

- object
  - `data` SchemasAreaBooking, required — A confirmed booking of one or more `BookableArea`s — for example a cabana, treatment pod, or pool deck — against a customer order. An `AreaBooking` is created by the basket pipeline when an `AreaBookingType` is added to a basket, and remains the source of truth for the reservation throughout its life-cycle.
    - `id` string, object-id, required — The ID of the area booking.
    - `area_booking_type_id` string, object-id, required — The ID of the `AreaBookingType` this booking is for.
    - `area_booking_type_name` string, required — The name of the `AreaBookingType` at the time the booking was made. This is captured at booking time so the value remains stable even if the parent type is later renamed.
    - `order_id` string, object-id, required — The ID of the order this area booking belongs to.
    - `order_ref` string, required — The human-readable reference of the parent order.
    - `order_item_id` string, object-id, required — The ID of the `OrderItem` this area booking represents.
    - `order_labels` SchemasLabel[], required
      - `id` string, object-id, required — The ID of the label.
      - `color` string, required — The color of the label.
      - `name` string, required — The name of the label.
      - `order_id` string, object-id, required
    - `order_is_locked` boolean, required — Whether the parent order has been locked from further changes.
    - `order_locked_at` string, date-time, nullable — The date and time the parent order was locked, if it has been.
    - `status` 'confirmed' | 'in_progress' | 'new', required — The current status of the area booking.
    - `stage` 'arrived' | 'in_treatment' | 'checked_out' | 'not_arrived', nullable — The check-in stage of the parent order.
    - `customer_id` string, object-id, required — The ID of the customer the booking is for.
    - `email` string, required — The customer's email address.
    - `phone` string, required — The customer's phone number.
    - `first_name` string, required — The customer's first name.
    - `last_name` string, required — The customer's last name.
    - `area_ids` string[], required — The IDs of the `BookableArea`s assigned to this booking.
    - `areas` BookableAreaSummary[], required — Summary records for each assigned `BookableArea`.
      - `id` string, mongo-id, required — The ID of the bookable area.
      - `name` string, required — The name of the bookable area.
    - `guests` Guest[], required
      - `id` string, object-id, required — Stable identifier for the guest slot on an order. Used to attach intake-form answers, check the guest in or out, and link the slot to a `Customer` once one is resolved.
      - `checked_in_at` string, date-time, nullable, required — ISO-8601 timestamp at which the guest checked in for their visit. `null` until check-in happens.
      - `checked_out_at` string, date-time, nullable, required — ISO-8601 timestamp at which the guest checked out / finished their visit. `null` while the visit is still in progress.
      - `customer_id` string, uuid, nullable, required — The `Customer` the guest slot has been linked to, if any. `null` for walk-ins or anonymous guests that haven't been matched to a customer record yet.
      - `email` string, email, nullable — Email address captured for this guest, used to send the pre-visit intake form and post-visit follow-ups. `null` when no email has been supplied for the slot.
      - `first_name` string, required — The first name of the guest.
      - `intake_form_submission_id` string, object-id — Identifier of the most recent intake-form submission for this guest, if one exists. Use this to fetch the submitted answers from the guest-intake API.
      - `intake_form_complete` boolean, required — Whether the intake form for the guest is complete.
      - `is_lead_booker` boolean, required — Whether the guest is the lead booker.
      - `last_name` string, required — The last name of the guest.
      - `name` string, required — Full display name for the guest — typically `first_name` plus `last_name`, but kept as a separate field so the platform can render it consistently across receipts, intake forms and check-in screens.
    - `start_time` string, date-time, required — When the booking starts.
    - `end_time` string, date-time, required — When the booking ends.
    - `duration` integer, required — The duration of the booking in minutes.
    - `end_buffer` integer, required — Minutes blocked out after the booking for changeover or cleaning.
    - `is_group_booking` boolean, required — Whether the parent order has more than one guest.
    - `has_outstanding_balance` boolean, required — Whether the parent order still has unpaid balance.
    - `has_notes` boolean, required — Whether the parent order has any notes.
    - `has_special_requests` boolean, required — Whether the parent order has special requests recorded.
    - `product_code` string, required — A custom product code for the `AreaBookingType`.
    - `is_part_of_package` boolean, required — Whether this booking was sold as part of a `Package`.
    - `package_product_code` string — The product code of the parent `Package`, if any.
    - `organisation_id` string, uuid, required — The ID of the organisation the booking belongs to.
    - `site_id` string, uuid, required — The ID of the site the booking belongs to.
    - `created_at` string, date-time, required — When then resource was created.
    - `updated_at` string, date-time, required — When then resource was last updated.

## Other responses

- `400` — The request failed.
- `401` — The user is unauthenticated
- `403` — The authenticated user does not have permission.
- `404` — The resource couldn't be found
- `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)
