---
title: "Update a product"
method: PUT
path: "/shop/products/{productId}"
tags: ["Products"]
---

# Update a product

`PUT /shop/products/{productId}`

Patch the editable fields on a retail product (e.g. product code,
linked inventory product). Requires the `SETTINGS_MANAGE` permission;
fields omitted from the body are left untouched.

## Request body

- UpdateProduct
  - `name` string — Display name of the retail product, shown on the storefront, in the POS product picker, on receipts, and on reports. Plain text; must not contain HTML. 1-255 characters.
  - `product_code` string, nullable — Site-unique SKU used to identify this product at the till and on receipts. Free-text and not validated against any pattern; choose a stable identifier that maps cleanly to your accounting or stock system. Pass `null` to clear an existing code.
  - `currency` string — The currency of the product price, as a 3-letter ISO currency code
  - `description` string, nullable — A brief description of the product
  - `standard_price` integer, nullable — The standard price for the product, in the smallest currency unit eg pence. Pass `null` to clear a previously-set standard price.
  - `external_id` string, nullable — An external identifier for this offering.
  - `offered_online` boolean — Whether this product is offered for sale online
  - `barcode` string, nullable — The barcode of the product
  - `private` boolean — Whether this product is private
  - `visibility` 'public' | 'link_only' | 'private' — The visibility status of the product
  - `inventory_product_id` string, nullable — ID of the linked stock-tracked inventory product. When set, each sale of this retail product decrements the inventory item's stock count; pass `null` to break the link and stop tracking inventory for this product.
  - `image_id` string, nullable — The image ID of the product
  - `revenue_centre` string, nullable — The revenue centre of the product
  - `customer_cancellation_permitted` 'allowed' | 'disallowed' | 'unpaid'
  - `customer_cancellation_min_duration` string — The minimum duration that must be left before the booking this product is a part of in order for the customer to cancel, as an ISO8601 string. See https://en.wikipedia.org/wiki/ISO_8601#Durations
  - `category_ids` string[] — An array of category IDs the product belongs to
  - `brand_id` string, uuid — The brand ID of the product

## Response `200`

A product response object.

- object
  - `data` SchemasProduct, required
    - `id` string, mongo-id, required — The ID of the product
    - `name` string, required — The name of this product
    - `currency` string, required — The ISO-4217 currency code in lower case
    - `description` string, nullable, required — A description of the product
    - `external_id` string, nullable, required — An external identifier for the product.
    - `product_code` string, nullable, required — A custom product code for the product.
    - `price_from` integer, nullable, required — The lowest price for the product as an integer of the smallest unit eg pence.
    - `price_to` integer, nullable, required — The highest price for the product as an integer of the smallest unit eg pence.
    - `standard_price` integer, nullable, required — The standard price for the product as an integer of the smallest unit eg pence. `null` if a standard price hasn't been configured — this is distinct from a price of zero.
    - `barcode` string, nullable, required — The barcode of the product
    - `inventory_product_id` string, object-id, nullable, required — The ID of the inventory product if this product is associated to one.
    - `image` Media, required
      - `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.
    - `offered_online` boolean, required — Whether this product is available online
    - `private` boolean, required — Whether this product is private. When private, it is accessible from the URL but doesn't appear on category pages and isn't indexed on search engines.
    - `site_id` string, uuid, required — The ID of the site this product belongs to
    - `tag_ids` string[], required
    - `tags` object[], required
      - `id` string, object-id, required — The ID of the tag
      - `name` string, required — The name of the tag
      - `organisation_id` string, uuid, required — The organisation ID which this tag belongs to
    - `category_ids` string[], required — An array of category IDs that this product belongs to
    - `categories` object[], required — An array of categories that this product belongs to
      - `id` string, object-id, required — The ID of the category
      - `name` string, required — The name of the category
    - `price_rules` ProductPriceRule[], required — The rules defining prices for this product
      - `id` string, object-id, required — The ID of the price rule.
      - `product_id` string, object-id, required — The ID of the product the price rule relates to.
      - `date_from` string, date, nullable, required — The rule should apply to products sold on or after this date.
      - `date_to` string, date, nullable, required — The rule should not apply to products sold after this date.
      - `price` integer, required — The price of the product as an integer of the smallest unit, ie pence.
    - `revenue_centre` string, required — The revenue centre to assign revenue to for this product
    - `customer_cancellation_permitted` 'allowed' | 'disallowed' | 'unpaid'
    - `customer_cancellation_min_duration` string — The minimum duration that must be left before the booking this product is a part of in order for the customer to cancel, as an ISO8601 string. See https://en.wikipedia.org/wiki/ISO_8601#Durations
    - `updated_at` string, date-time, required — The time and date that the product was last updated.
    - `deleted_at` string, date-time, nullable, required — The time and date that the product was archived.
    - `brand_id` string, uuid, nullable — The brand ID of the product.

## Other responses

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