Skip to content

Variants

View as Markdown

A Variant is a single purchasable version of a Product - a specific combination of the product’s Options (for example Size: M / Color: Red). Each variant carries its own sku, barcode, physical measurement and pricing, and is the unit that channels, orders and stock are attached to.

A product always has at least one variant. Products with no declared options have a single default variant; products with options have one variant per combination of Option Values.

PropertyTypeRequiredDescription
idstring-The resource's unique identifier (UUID).
barcodestringrequiredThe barcode, unique UPC, or ISBN number for the product.
skustringrequiredA unique identifier for the product variant.
measurementEmbeddedMeasurementResource | null-The measurement used to compute per-unit prices for the variant.
Show measurement fields
PropertyTypeRequiredDescription
measuredType"volume" | "weight" | "length" | "area" | "unit"requiredThe kind of physical quantity measured (volume, weight, length, area or unit).
quantityUnit"ml" | "cl" | "l" | "mg" | "g" | "kg" | "mm" | "cm" | "m" | "m2" | "unit"requiredThe unit the variant's quantity is expressed in.
quantityValueintegerrequiredThe variant's quantity, expressed in the quantity unit.
referenceUnit"ml" | "cl" | "l" | "mg" | "g" | "kg" | "mm" | "cm" | "m" | "m2" | "unit"requiredThe unit used as the basis for per-unit price calculations.
referenceValueintegerrequiredThe number of reference units used for per-unit price calculations.
productstringrequiredThe product resource it belongs to.
optionValuesstring[]-A list of Option Value, each one representing an option value associated with the variant.
mediasstring[]-A list of Media, ordered by position. Only media of type "image" can be associated with a variant. Returned as IRI strings by default; pass ?expand=medias to embed full Media objects.
resolvedPriceResolvedPriceResource | null-The price resolved for the current resolveContext (country, channel and instant). Null unless resolveContext[country], resolveContext[channel] and resolveContext[at] are all provided.
Show resolvedPrice fields
PropertyTypeRequiredDescription
priceEmbeddedMoneyResource-
Show price fields
PropertyTypeRequiredDescription
amountstringrequiredThe monetary amount, as a decimal string.
currencystringrequiredThe ISO 4217 currency code (e.g. EUR).
discountPriceEmbeddedMoneyResource | null-
Show discountPrice fields
PropertyTypeRequiredDescription
amountstringrequiredThe monetary amount, as a decimal string.
currencystringrequiredThe ISO 4217 currency code (e.g. EUR).
currencystring-ISO 4217 currency code (mirrors price.currency for convenience).
taxRatenumber-Tax rate applied, in percent (e.g. 20.0).
taxExcludedPriceEmbeddedMoneyResource-
Show taxExcludedPrice fields
PropertyTypeRequiredDescription
amountstringrequiredThe monetary amount, as a decimal string.
currencystringrequiredThe ISO 4217 currency code (e.g. EUR).
discountTaxExcludedPriceEmbeddedMoneyResource | null-
Show discountTaxExcludedPrice fields
PropertyTypeRequiredDescription
amountstringrequiredThe monetary amount, as a decimal string.
currencystringrequiredThe ISO 4217 currency code (e.g. EUR).
countryIdstring-The Country used to resolve the price.
channelIdstring-The Channel used to resolve the price.
atstring-The instant used to resolve the price (defaults to request time).
saleOfferIdstring-The SaleOffer that was resolved.
lowestPriceLast30DaysEmbeddedMoneyResource | null-
Show lowestPriceLast30Days fields
PropertyTypeRequiredDescription
amountstringrequiredThe monetary amount, as a decimal string.
currencystringrequiredThe ISO 4217 currency code (e.g. EUR).
lowestPriceLast30DaysAtstring | null-The instant at which lowestPriceLast30Days was active. Falls back to at when no prior data exists.
metafieldsstring[]-Metafields owned by this variant. Serialized as IRI strings by default; pass ?expand=metafields to embed full MetafieldResource objects.
createdAtstring-The date and time when the resource was created (ISO 8601 format).
updatedAtstring-The date and time when the resource was last modified (ISO 8601 format).

When you set the resolveContext[*] query parameters on a read endpoint, each variant gains a resolvedPrice object describing what a buyer would pay in the given channel and country at a given moment - including tax, discounts and the lowest price over the last 30 days (for EU Omnibus compliance).

?resolveContext[channel]=<channel_id>&resolveContext[country]=FR&resolveContext[at]=2026-01-15T10:00:00Z

All three parameters must be set together, or none.

  • Add a variant to an existing product. POST /products/{productId}/variants with the option values that identify it. Reference existing Option Values by IRI.
  • Update stock-keeping data. Use PATCH to change a variant’s sku, barcode or measurement without touching the rest of the product.
  • Display channel-specific prices. Pass resolveContext to GET /products/{productId}/variants so each variant’s resolvedPrice reflects the buyer’s channel and country.