Offerings catalog

Products

A Product represents a physical product that can be sold at a site.

The Product object

Attributes

  • idmongo-idrequired

    The ID of the product

  • namestringrequired

    The name of this product

  • currencystringrequired

    The ISO-4217 currency code in lower case

  • descriptionstringrequirednullable

    A description of the product

  • external_idstringrequirednullable

    An external identifier for the product.

  • product_codestringrequirednullable

    A custom product code for the product.

  • price_fromintegerrequirednullable

    The lowest price for the product as an integer of the smallest unit eg pence.

  • price_tointegerrequirednullable

    The highest price for the product as an integer of the smallest unit eg pence.

  • barcodestringrequirednullable

    The barcode of the product

  • inventory_product_idobject-idrequirednullable

    The ID of the inventory product if this product is associated to one.

  • imagerequired
  • offered_onlinebooleanrequired

    Whether this product is available online

  • privatebooleanrequired

    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_iduuidrequired

    The ID of the site this product belongs to

  • tag_idsstring[]requiredDeprecated
  • tagsobject[]requiredDeprecated
  • category_idsstring[]required

    An array of category IDs that this product belongs to

  • categoriesobject[]required

    An array of categories that this product belongs to

  • price_rulesobject[]required

    The rules defining prices for this product

  • revenue_centrestringrequired

    The revenue centre to assign revenue to for this product

  • Whether this product may be cancelled online by customers. A value of unpaid means this product may be cancelled only if no payments have been recorded against the order it is part of.

  • 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_atdate-timerequired

    The time and date that the product was last updated.

  • deleted_atdate-timerequirednullable

    The time and date that the product was archived.

  • brand_iduuidoptionalnullable

    The brand ID of the product.

{
  "id": "64a9f3b2c3d8e1f4a5b6c7d8",
  "name": "Dan's Hand Moisturiser",
  "currency": "gbp",
  "description": "For silky soft hands",
  "external_id": "00000000-0000-0000-0000-000000000000",
  "product_code": "MAS123",
  "price_from": 1000,
  "price_to": 5000,
  "barcode": 5013635312160,
  "inventory_product_id": "64a9f3b2c3d8e1f4a5b6c7d8",
  "image": "string",
  "offered_online": false,
  "private": false,
  "site_id": "00000000-0000-0000-0000-000000000000",
  "tag_ids": [
    "string"
  ],
  "tags": [
    {
      "id": "64a9f3b2c3d8e1f4a5b6c7d8",
      "name": "Moisturisers",
      "organisation_id": "00000000-0000-0000-0000-000000000000"
    }
  ],
  "category_ids": [
    "00000000-0000-0000-0000-000000000000"
  ],
  "categories": [
    {
      "id": "64a9f3b2c3d8e1f4a5b6c7d8",
      "name": "Moisturisers"
    }
  ],
  "price_rules": [
    {
      "id": "64a9f3b2c3d8e1f4a5b6c7d8",
      "product_id": "64a9f3b2c3d8e1f4a5b6c7d8",
      "date_from": "2020-02-01",
      "date_to": "2020-04-01",
      "price": 20000
    }
  ],
  "revenue_centre": "spa",
  "customer_cancellation_permitted": "string",
  "customer_cancellation_min_duration": "P7D",
  "updated_at": "2026-01-15T09:30:00+00:00",
  "deleted_at": "2026-01-15T09:30:00+00:00",
  "brand_id": "00000000-0000-0000-0000-000000000000"
}
get/shop/products

List products

getProducts

List the retail products available across the sites the caller's API key can access. Results are paginated and support filtering by free-text query, exact product code and inventory category. Use the show endpoint to retrieve the full product detail for any item returned here.

Query parameters

  • pageintegeroptional

    The page to retrieve results from

  • per_pageintegeroptional

    The number of results to return per page

  • querystringoptional

    Filter for products where the name matches a search query.

  • product_codestringoptional

    Filter for products with the specified product code. Partial matches can be searched by using a * wildcard.

  • inventory_category_idstring[]optional

    Filter for products that belong to one of the specified inventory categories.

Responses

  • 200

    A list of product response objects.

  • 401

    The user is unauthenticated

post/shop/products

Create a product

createProduct

Create a new product. Requires the SETTINGS_MANAGE permission.

Request body

  • namestringrequired

    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_codestringoptionalnullable

    A custom product code for the product.

  • external_idstringoptionalnullable

    An external identifier for the product.

  • currencystringoptional

    The ISO-4217 currency code in lower case.

  • descriptionstringoptionalnullable

    A description of the product.

  • offered_onlinebooleanoptional

    Whether this product is available online.

  • barcodestringoptionalnullable

    The barcode of the product. Must be unique within the site.

  • privatebooleanoptional

    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.

  • visibilitystringoptional

    The visibility status of the product.

    Possible values:publiclink_onlyprivate
  • inventory_product_idobject-idoptionalnullable

    Optional identifier of the inventory product that backs this retail product. When linked, sales of this product decrement stock on the inventory product. Pass null for products that do not draw down stock.

  • image_idstringoptionalnullable

    Media ID of the primary product image, shown on the storefront product page and in the POS picker. Upload via createMedia first and pass the returned ID here.

  • revenue_centrestringoptionalnullable

    The revenue centre to assign revenue to for this product.

  • category_idsstring[]optionalnullable

    An array of category IDs the product belongs to

  • brand_iduuidoptionalnullable

    The brand ID of the product

Responses

  • 201

    A product response object.

  • 401

    The user is unauthenticated

  • 403

    The authenticated user does not have permission.

  • 422

    The request didn't pass validation

get/shop/products/{productId}

Get a product

getProduct

Fetch the full record for a single retail product, including its inventory link, pricing and metadata. Returns 404 if the ID is not visible to the caller's site scope.

Path parameters

  • productIdobject-idrequired

    The ID of the product

Responses

  • 200

    A product response object.

  • 401

    The user is unauthenticated

  • 404

    The resource couldn't be found

put/shop/products/{productId}

Update a product

updateProduct

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.

Path parameters

  • productIdobject-idrequired

    The ID of the product

Request body

  • namestringoptional

    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_codestringoptionalnullable

    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.

  • currencystringoptional

    The currency of the product price, as a 3-letter ISO currency code

  • descriptionstringoptionalnullable

    A brief description of the product

  • external_idstringoptionalnullable

    An external identifier for this offering.

  • offered_onlinebooleanoptional

    Whether this product is offered for sale online

  • barcodestringoptionalnullable

    The barcode of the product

  • privatebooleanoptional

    Whether this product is private

  • visibilitystringoptional

    The visibility status of the product

    Possible values:publiclink_onlyprivate
  • inventory_product_idstringoptionalnullable

    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_idstringoptionalnullable

    The image ID of the product

  • revenue_centrestringoptionalnullable

    The revenue centre of the product

  • Whether this product may be cancelled online by customers. A value of unpaid means this product may be cancelled only if no payments have been recorded against the order it is part of

    Possible values:alloweddisallowedunpaid
  • 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_idsstring[]optional

    An array of category IDs the product belongs to

  • brand_iduuidoptional

    The brand ID of the product

Responses

  • 200

    A product response object.

  • 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

delete/shop/products/{productId}

Delete a product

deleteProduct

Soft-deletes a retail product. The product is hidden from the storefront and cannot be added to new baskets; existing orders that already contain the product are unaffected. Use POST /shop/products/{productId}/restore to bring a deleted product back.

Path parameters

  • productIdobject-idrequired

    The ID of the product

Responses

  • 204

    The product was successfully deleted.

  • 401

    The user is unauthenticated

  • 403

    The authenticated user does not have permission.

  • 404

    The resource couldn't be found

post/shop/products/{productId}/copy

Duplicate a product

copyProduct

Creates a copy of an existing Product with new fields applied from the request body. Useful when seeding a new product off an existing one rather than building from scratch.

Requires the SETTINGS_MANAGE permission on the original product's site. The new product is created at the same site as the source.

Path parameters

  • productIdobject-idoptional

    The ID of the product

Request body

  • namestringrequired

    Display name for the new copy. Plain text only — HTML tags are rejected. Required so the copy is distinguishable from the source in the admin list.

  • external_idstringoptionalnullable

    External identifier for integrations.

  • currencystringoptional

    The ISO-4217 currency code.

  • descriptionstringoptional

    Long-form product description shown on the shopfront. Markdown rendered.

  • offered_onlinebooleanoptional

    Whether the new copy is bookable via the public shopfront.

  • privatebooleanoptional

    When true, only customers with the direct link can purchase.

  • visibilitystringoptional

    Visibility override for the new copy. public shows it to everyone; hidden keeps it out of search/browse (still purchasable by direct link); members_only restricts to permitted membership-type holders.

    Possible values:publichiddenmembers_only
  • revenue_centrestringoptionalnullable

    Revenue centre to post sales of this product to. Must be valid for the source product's site.

Responses

  • 201

    A product response object.

  • 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

get/shop/products/{productId}/price-rules

List price rules for a product

listProductPriceRules

Returns all PriceRules configured for the given Product, filterable by date range. Product price rules let you charge different prices for the same product at different times — e.g. seasonal promotions, peak vs off-peak. The first rule whose conditions match the time of sale wins.

Product price rules are simpler than appointment/session equivalents: they only support date-range filters (no time-of-day or weekday conditions).

Path parameters

  • productIdobject-idoptional

    The ID of the product

Query parameters

  • date_fromdateoptional

    Restrict results to those on or after this date, ISO-8601 YYYY-MM-DD.

  • date_todateoptional

    Restrict results to those on or before this date, ISO-8601 YYYY-MM-DD.

  • pageintegeroptional

    The page to retrieve results from

  • per_pageintegeroptional

    The number of results to return per page

Responses

  • 200

    A list of price rules for a product.

  • 401

    The user is unauthenticated

  • 404

    The resource couldn't be found

post/shop/products/{productId}/price-rules

Create a price rule for a product

createProductPriceRule

Adds a new PriceRule to a Product. Set price and optionally a date_from/date_to window. With no date filters the rule applies always — useful as a fallback baseline price.

Requires the update permission on the parent Product (typically SETTINGS_MANAGE on the product's site).

Path parameters

  • productIdobject-idoptional

    The ID of the product

Request body

  • priceintegerrequired

    Price in the smallest currency unit (e.g. pence, cents). 4800 is £48.00 on a GBP site.

  • date_fromdateoptionalnullable

    First date this rule applies (inclusive). Defaults to today in the product's timezone when omitted.

  • date_todateoptionalnullable

    Last date this rule applies (inclusive). When omitted, the rule has no end date.

Responses

  • 201

    A single PriceRule on a Product.

  • 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

get/shop/products/{productId}/price-rules/{priceRuleId}

Retrieve a product price rule

getProductPriceRule

Returns a single PriceRule belonging to the given Product.

Path parameters

  • productIdobject-idoptional

    The ID of the product

  • priceRuleIdobject-idrequired

    The unique identifier of the price rule.

Responses

  • 200

    A single PriceRule on a Product.

  • 401

    The user is unauthenticated

  • 403

    The authenticated user does not have permission.

  • 404

    The resource couldn't be found

put/shop/products/{productId}/price-rules/{priceRuleId}

Update a product price rule

updateProductPriceRule

Partially updates a PriceRule on a Product. Every field is optional. Requires the update permission on the parent product.

Path parameters

  • productIdobject-idoptional

    The ID of the product

  • priceRuleIdobject-idrequired

    The unique identifier of the price rule.

Request body

  • priceintegeroptional

    Price in the smallest currency unit.

  • date_fromdateoptionalnullable

    First date this rule applies (inclusive).

  • date_todateoptionalnullable

    Last date this rule applies (inclusive).

Responses

  • 200

    A single PriceRule on a Product.

  • 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

delete/shop/products/{productId}/price-rules/{priceRuleId}

Delete a product price rule

deleteProductPriceRule

Removes a PriceRule from a Product. Past orders already priced under this rule are unaffected — they retain the price set at order time. Future sales are repriced from whatever rules remain (falling back to the product's base price if none apply).

Path parameters

  • productIdobject-idoptional

    The ID of the product

  • priceRuleIdobject-idrequired

    The unique identifier of the price rule.

Responses

  • 204

    Price rule deleted successfully.

  • 401

    The user is unauthenticated

  • 403

    The authenticated user does not have permission.

  • 404

    The resource couldn't be found

post/shop/products/{productId}/restore

Restore a deleted product

restoreProduct

Un-deletes a previously soft-deleted Product. The product returns to its pre-deletion state, including price, inventory associations, and categories. Existing orders containing the product remain unaffected.

Requires the SETTINGS_MANAGE permission on the product's site. No request body.

Path parameters

  • productIdobject-idoptional

    The ID of the product

Responses

  • 200

    A product response object.

  • 401

    The user is unauthenticated

  • 403

    The authenticated user does not have permission.

  • 404

    The resource couldn't be found

post/shop/products/{productId}/suggest-description

Suggest description

actionSuggestDescriptionForProduct

Use this endpoint to suggest a description for a Product using Trybe Intelligence.

Path parameters

  • productIdobject-idoptional

    The ID of the product

Request body

  • descriptionstringoptional

    A starting point which Trybe Intelligence can use to suggest a better description.

Responses

  • 200

    A suggested description

  • 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

get/shop/barcode-search/products/{code}

Search products by barcode

actionSearchProductsByBarcode

Use this endpoint to search for products by their barcode.

Path parameters

  • codestringrequired

    The barcode to search for

Query parameters

  • site_iduuidoptional

    The ID of the site to filter products on

Responses

  • 200

    A product response object.

  • 401

    The user is unauthenticated

  • 404

    The resource couldn't be found

get/shop/products/barcode-search/{code}

Look up a product by barcode

getProductByBarcode

Looks up a single retail product by its barcode. Returns 404 if no product with the supplied barcode is visible to the caller's site scope. For barcode-driven product search with site scoping consider GET /shop/barcode-search/products/{code} instead.

Path parameters

  • codestringrequired

    The barcode to search for.

Responses

  • 200

    A product response object.

  • 401

    The user is unauthenticated

  • 404

    The resource couldn't be found