Skip to main content
POST
Update a product

Authorizations

Authorization
string
header
required

Authenticate using a bearer token. To create a token, navigate to /settings/api-tokens and click Create API Token.

Body

application/json
name
string

Product name

Maximum string length: 200
category_id
integer

ID of the product category

category
object | null

Product category information

sku
string

Internal SKU. Changing this value requires the skus.update.sku permission; the request returns 403 if the authenticated token's role lacks it. Omitting the field or sending the same value as the current SKU skips the check.

Maximum string length: 100
qty_low_alert
integer | null

Quantity threshold for low stock alerts

qty_reorder_threshold
integer | null

Quantity threshold for reordering

qty_minimum
integer | null

Minimum quantity to maintain

supplier_id
integer | null

ID of the preferred supplier

supplier
object | null

Product preferred supplier information

distribution_template_id
integer | null

ID of the distribution template (size curve) to assign to this product. Pass null to clear the current assignment. Use GET /products/{productId}/distribution-template/candidates to find compatible templates for a master SKU.

image_url
string | null

URL to product image

Maximum string length: 255
sellable
boolean | null

Whether the product can be sold

lot_tracking
boolean | null

Whether to track product by lots

is_drop_ship_item
boolean | null

Flag the product as a drop-ship item. A preference marker only — it does not currently change fulfillment-order routing or purchase-order creation.

taxable
boolean | null

Whether the product is subject to sales tax. Defaults to true when omitted.

sub_category_id
integer | null

ID of the product subcategory

subcategory
object | null

Product sub-category information

default_receiving_location_id
integer | null

Default location ID for receiving this product

default_assembly_location_id
integer | null

Default location (bin) ID where assembled goods (BOM output) are credited for this product. When set, it is used as the destination when defaulting assembly/disassembly work, falling back to default_receiving_location_id and then the warehouse default.

description
string | null

Product description

wholesale_price
number<float> | null

Wholesale price

Required range: x >= 0
retail_price
number<float> | null

Retail price

Required range: x >= 0
unit_cost
number<float> | null

Cost per unit

Required range: x >= 0
manufacturing_fee
number<float> | null

Manufacturing fee per unit

Required range: x >= 0
product_weight
object
dimensional_weight
object
product_length
number<float> | null

Length of the product (in inches)

Required range: x >= 0
product_width
number<float> | null

Width of the product (in inches)

Required range: x >= 0
product_height
number<float> | null

Height of the product (in inches)

Required range: x >= 0
box_weight
object
box_length
number<float> | null

Length of the box (in inches)

Required range: x >= 0
box_width
number<float> | null

Width of the box (in inches)

Required range: x >= 0
box_height
number<float> | null

Height of the box (in inches)

Required range: x >= 0
carton_weight
object
carton_length
number<float> | null

Length of the carton (in inches)

Required range: x >= 0
carton_width
number<float> | null

Width of the carton (in inches)

Required range: x >= 0
carton_height
number<float> | null

Height of the carton (in inches)

Required range: x >= 0
shipping_weight
object
shipping_length
number<float> | null

Shipping length (in inches)

Required range: x >= 0
shipping_width
number<float> | null

Shipping width (in inches)

Required range: x >= 0
shipping_height
number<float> | null

Shipping height (in inches)

Required range: x >= 0
pallet_weight
object
pallet_length
number<float> | null

Length of the pallet (in inches)

Required range: x >= 0
pallet_width
number<float> | null

Width of the pallet (in inches)

Required range: x >= 0
pallet_height
number<float> | null

Height of the pallet (in inches)

Required range: x >= 0
upc
string | null

UPC/Barcode. Changing this value requires the skus.update.upc permission; the request returns 403 if the authenticated token's role lacks it. Omitting the field or sending the same value as the current UPC skips the check.

default_supply_method
enum<string> | null

Default supply mode used when planning replenishment for this product. Determines whether the system expects to purchase, drop-ship, assemble, or pull from on-hand stock when supplying demand.

Available options:
purchase,
vendor_supplied,
assemble,
on_hand,
assembly_order,
buy_and_ship,
brand_supplied
Maximum string length: 50
priority_list_id
integer | null

ID of the fulfillment priority list to assign to this product

custom_fields
object | null

Custom field values

tags
string[] | null

Tags to associate with the product

default_selling_unit_id
integer | null

ID of the unit of measure this product is sold in.

If omitted (along with selling_uom), Luminous defaults it to the account's base unit of measure (e.g. ea under the Quantity unit class). The request is rejected only if the account has no unit of measure configured at all.

Required range: x >= 1
default_purchase_unit_id
integer | null

ID of the unit of measure this product is purchased in.

If omitted (along with purchase_uom), Luminous defaults it to the account's base unit of measure (e.g. ea).

Required range: x >= 1
unit_class_id
integer | null

ID of the unit class this product's units belong to (e.g. Quantity).

If omitted, Luminous defaults it to the unit class of the account's base unit.

Required range: x >= 1
selling_uom
object | null

Selling unit of measure by name — an alternative to default_selling_unit_id. When default_selling_unit_id is not provided, the named UOM is resolved to its ID.

purchase_uom
object | null

Purchase unit of measure by name — an alternative to default_purchase_unit_id. When default_purchase_unit_id is not provided, the named UOM is resolved to its ID.

product_variants
object[] | null

Variant option taxonomy for the product — the axes (e.g. Size, Color) and the allowed terms on each axis.

You almost never need to set this. Tag each child SKU under variants[].product_variants with the terms it represents instead, and Luminous will extend the parent taxonomy automatically as the union of every term used by the children. Setting this directly is only useful as an escape hatch (e.g. seeding an empty option set, or pruning a term no child uses).

Returned on the response as variant_attributes (same shape).

variant_template

A variant template to expand into child SKUs, given as either the template's id (integer) or its name (string). When set on a master product, the template's option axes are expanded into child variant SKUs — the same one-click "generate variants" step available in the SKU form, reachable from the API.

Rules:

  • Ignored when you also send an explicit variants array — being specific always wins over a preset.
  • Idempotent — skipped when the product already has child variants, so re-sending the same request does not duplicate them.
  • An unknown template name/id fails loudly with a 422 validation error rather than silently producing a master with no variants.
variants
object[] | null

Product variants

boms
integer[] | null

Array of BOM IDs to attach to the product. Omit this field entirely to leave the product's existing BOM associations unchanged (partial updates do not touch BOMs unless boms is provided). When the field is provided, it replaces all existing BOM associations: pass an array of IDs to set them, or null/an empty array to detach all BOMs.

BOM ID

Response

Successful response

data
object