---
title: "Update a package item choice"
method: PUT
path: "/shop/packages/{packageId}/item-choices/{itemChoiceId}"
tags: ["Packages"]
---

# Update a package item choice

`PUT /shop/packages/{packageId}/item-choices/{itemChoiceId}`

Updates a `PackageItemChoice` on a `Package`. Every field is
optional; only the fields you send are written. Update is the only
place where `start_time_rules`, `allow_overlaps` and
`choice_configuration` can be set.

Setting `visible: false` is only valid when `offering_type` is
`product`; other types return `400`. When `max_options` becomes `1`
any `option_budget` is dropped server-side. When the parent
package's `prevent_choice_overlaps` is not true, `allow_overlaps`
is forced to `null`.

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

## Request body

- object
  - `name` string — A short, customer-facing label for the choice.
  - `description` string, nullable — A longer explanation rendered alongside the options at booking time.
  - `min_options` integer — Minimum number of options the customer must pick.
  - `max_options` integer, nullable — Maximum number of options the customer may pick. With `max_options: 1` any `option_budget` is dropped.
  - `option_budget` integer, nullable — Included budget for the chosen options in the smallest currency unit.
  - `auto_select_timeslot` boolean — Whether the booking engine should auto-pick a timeslot for this choice.
  - `hide_times` boolean — Hide individual option start times from the customer-facing booking flow.
  - `allocation` object, nullable — An accounting allocation for this choice. Send `null` fields to clear the existing allocation.
    - `revenue_centre` string, nullable — The revenue centre's identifier.
    - `amount` integer, nullable — The allocated amount in the smallest currency unit.
  - `optional` boolean — Whether the customer can skip this choice entirely.
  - `visible` boolean — Whether the choice is visible to the customer. Setting `visible: false` is only allowed when `offering_type` is `product`; other types return `400`.
  - `offering_type` 'appointment' | 'area_booking' | 'hotel_room_reservation' | 'product' | 'session' | 'table_reservation' — The type of offerings this choice's options reference.
  - `start_time_rules` object[] — Rules restricting which start times are offered for this choice's options. Each rule is either `absolute` (fixed `HH:MM` window) or `relative` (offset in minutes from a base point such as the start of the package's first item).
    - `type` 'absolute' | 'relative', required — `absolute` constrains the start time to a fixed `HH:MM` window; `relative` to an offset (in minutes) from `relative_to`.
    - `relative_to` 'first_item_start', nullable — Required when `type` is `relative`. The base time the offsets are calculated from.
    - `relative_mins_from` integer, nullable — Earliest offset (minutes) from `relative_to`.
    - `relative_mins_to` integer, nullable — Latest offset (minutes) from `relative_to`. Must be ≥ `relative_mins_from`.
    - `absolute_time_from` string, nullable — Required when `type` is `absolute`. The earliest allowed start time in 24-hour `HH:MM` format.
    - `absolute_time_to` string, nullable — Required when `type` is `absolute`. The latest allowed start time in 24-hour `HH:MM` format.
  - `allow_overlaps` boolean — Allow this choice's items to overlap with other items even when `prevent_choice_overlaps` is true on the parent package. Has no effect unless the package opts in to overlap prevention.
  - `options` object[] — The list of selectable options. At least one option is required unless `offering_type` is `hotel_room_reservation`. Each option's `item_type` must match `offering_type`.
    - `id` string, required — The ID of the offering this option references.
    - `item_type` 'appointment' | 'area_booking' | 'hotel_room_reservation' | 'product' | 'session' | 'table_reservation', required — Must match the choice's `offering_type`.
    - `price_change` integer, nullable — A delta applied to the package price when this option is chosen, in the smallest currency unit.
  - `choice_configuration` object — Free-form additional configuration for the choice. Shape depends on `offering_type`.

## Response `200`

A single `PackageItemChoice` on a `Package`.

- object
  - `data` PackageItemChoice, required
    - `id` string, required — The ID of this choice.
    - `allocation` object, required
      - `amount` integer, required
      - `revenue_centre` string, required
    - `allow_overlaps` boolean, required — Allow this choice to overlap with other items when `prevent_choice_overlaps` is enabled on the package.
    - `auto_select_timeslot` boolean, required — Whether a timeslot should be automatically selected for this choice
    - `choice_configuration` object, required — Any additional configuration for this choice.
    - `description` string, required — A description of this choice.
    - `hide_times` boolean, required — Whether to hide times for this choice from customers
    - `name` string, required — A name for this choice.
    - `max_options` integer, nullable, required — The maximum number of options that may be chosen.
    - `min_options` integer, nullable, required — The minimum number of options that must be chosen.
    - `offering_type` 'appointment' | 'product' | 'session', required — The type of offerings included in this choice.
    - `option_budget` integer, required — The budget that this package allows for options in this choice. Each option will use its standalone price, and the overall package price will be increased if the total exceeds the budget.
    - `optional` boolean, required — Whether this item choice should be optional.
    - `options` PackageItemChoiceOption[], required — An array of options to make up this choice.
      - `id` string, required — Identifier of the offering this option points at — an `AppointmentType`, `SessionType` or retail `Product`, depending on `item_type`. The guest sees the offering's name and image when picking this option in the storefront.
      - `item_type` string, required — The type of item this option represents.
      - `offering` PackageShopOffering, required
        - `id` string, required — The ID of the offering
        - `categories` object[]
          - `id` string, required — The ID of the category
          - `name` string, required — The name of the category
        - `currency` string, required — The currency code for the price
        - `description` string, required — The name of the offering
        - `discounted_price_from` integer — If set, a discounted 'price from' that applies to the current customer
        - `duration` integer — The duration of the offering in minutes
        - `durations` integer[]
        - `external_id` string, nullable, required — An external identifier for this offering.
        - `has_availability` boolean — Whether there is availability for the offering on the requested date.
        - `image` Media
          - `id` string, uuid, required — Unique identifier of the uploaded media item, returned from `createMedia`. Pass this ID into any field that accepts a media reference (logos, hero images, product images, etc.).
          - `file_name` string, required — Original filename of the uploaded asset, preserved as provided at upload time. Used for display in the media library and as a hint when serving downloads.
          - `mime_type` string, required — The mime type of the media item.
          - `original_url` string, required — The url of the media resource.
          - `size` integer, required — The size of the media item in bytes.
          - `url` string, required — The url of the converted media resource.
        - `max_guests` integer — The maximum guests this offering is for
        - `min_guests` integer — The minimum guests this offering is for
        - `name` string, required — The name of the offering
        - `next_available_date` string, date — The next available date if there is no availability on the given date
        - `price_from` integer — The minimum price of the offering on the given date
        - `price_to` integer — The maximum price of the offering on the given date
        - `type` string — Identifies the type of this model
      - `price_change` integer, nullable, required — A currency amount that this option would increase the package price by.
    - `start_time_rules` PackageChoiceStartTimeRule[], required — An array of rules determining the start times that should be allowed for this choice.
      - `absolute_time_from` string, nullable, required — The earliest allowed start time.
      - `absolute_time_to` string, nullable, required — The latest allowed start time.
      - `relative_mins_from` integer, nullable, required — The minimum number of minutes from the relative base point that should be allowed.
      - `relative_mins_to` integer, nullable, required — The maximum number of minutes from the relative base point that should be allowed.
      - `relative_to` 'first_item_start', nullable, required — The base time that a relative start time should be calculated from.
      - `type` 'relative' | 'absolute', required — The type of the rule.
    - `visible` boolean, required — Whether this item choice should be visible to the customer.

## 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)
