commercetools · Schema
commercetools Product
A product resource in the commercetools Composable Commerce platform. Products contain both a current (published) and a staged version of their data, enabling a preview workflow before publishing changes to the storefront. Product attributes are defined by the associated product type.
CommerceComposable CommerceE-CommerceGraphQLRESTSDK
Properties
| Name | Type | Description |
|---|---|---|
| id | string | System-generated unique identifier for the product. |
| version | integer | Current version for optimistic concurrency control. |
| key | string | User-defined unique key for the product within the project. |
| productType | object | Reference to the product type defining valid attributes for this product. |
| masterData | object | Container for both current (published) and staged versions of product data. |
| taxCategory | object | Reference to the tax category used for tax rate determination. |
| state | object | Reference to a custom state for workflow management. |
| reviewRatingStatistics | object | Aggregated review rating statistics including average rating and count. |
| priceMode | string | Whether prices are managed as embedded prices on variants or as standalone price resources. |
| createdAt | string | ISO 8601 timestamp when the product was created. |
| lastModifiedAt | string | ISO 8601 timestamp when the product was last modified. |
JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://api-evangelist.github.io/schemas/commercetools/product.json",
"title": "commercetools Product",
"description": "A product resource in the commercetools Composable Commerce platform. Products contain both a current (published) and a staged version of their data, enabling a preview workflow before publishing changes to the storefront. Product attributes are defined by the associated product type.",
"type": "object",
"required": ["id", "version", "productType", "masterData"],
"properties": {
"id": {
"type": "string",
"description": "System-generated unique identifier for the product."
},
"version": {
"type": "integer",
"minimum": 1,
"description": "Current version for optimistic concurrency control."
},
"key": {
"type": "string",
"minLength": 2,
"maxLength": 256,
"pattern": "^[a-zA-Z0-9_-]+$",
"description": "User-defined unique key for the product within the project."
},
"productType": {
"$ref": "#/$defs/Reference",
"description": "Reference to the product type defining valid attributes for this product."
},
"masterData": {
"$ref": "#/$defs/ProductCatalogData",
"description": "Container for both current (published) and staged versions of product data."
},
"taxCategory": {
"$ref": "#/$defs/Reference",
"description": "Reference to the tax category used for tax rate determination."
},
"state": {
"$ref": "#/$defs/Reference",
"description": "Reference to a custom state for workflow management."
},
"reviewRatingStatistics": {
"type": "object",
"description": "Aggregated review rating statistics including average rating and count.",
"properties": {
"averageRating": {
"type": "number",
"minimum": 0,
"maximum": 5,
"description": "Average rating across all reviews."
},
"highestRating": {
"type": "number",
"description": "Highest individual rating received."
},
"lowestRating": {
"type": "number",
"description": "Lowest individual rating received."
},
"count": {
"type": "integer",
"minimum": 0,
"description": "Total number of reviews."
},
"ratingsDistribution": {
"type": "object",
"description": "Distribution of ratings by score value."
}
}
},
"priceMode": {
"type": "string",
"enum": ["Embedded", "Standalone"],
"description": "Whether prices are managed as embedded prices on variants or as standalone price resources."
},
"createdAt": {
"type": "string",
"format": "date-time",
"description": "ISO 8601 timestamp when the product was created."
},
"lastModifiedAt": {
"type": "string",
"format": "date-time",
"description": "ISO 8601 timestamp when the product was last modified."
}
},
"$defs": {
"Reference": {
"type": "object",
"description": "A reference to another commercetools resource by type and ID.",
"required": ["typeId", "id"],
"properties": {
"typeId": {
"type": "string",
"description": "The type identifier of the referenced resource."
},
"id": {
"type": "string",
"description": "The system-generated unique identifier of the referenced resource."
}
}
},
"KeyReference": {
"type": "object",
"description": "A reference to another resource using its user-defined key.",
"required": ["typeId", "key"],
"properties": {
"typeId": {
"type": "string",
"description": "The type identifier of the referenced resource."
},
"key": {
"type": "string",
"description": "The user-defined key of the referenced resource."
}
}
},
"LocalizedString": {
"type": "object",
"description": "A map of IETF language tags to localized string values.",
"additionalProperties": {
"type": "string"
}
},
"ProductCatalogData": {
"type": "object",
"description": "Container holding both the published (current) and staged versions of product content.",
"required": ["published", "hasStagedChanges"],
"properties": {
"published": {
"type": "boolean",
"description": "Whether a current (published) version of the product data exists."
},
"current": {
"$ref": "#/$defs/ProductData",
"description": "The currently published version of the product data, visible in storefronts."
},
"staged": {
"$ref": "#/$defs/ProductData",
"description": "The staged version containing unpublished edits awaiting publication."
},
"hasStagedChanges": {
"type": "boolean",
"description": "Whether the staged version differs from the published version."
}
}
},
"ProductData": {
"type": "object",
"description": "A complete version of product content including name, slug, variants, and category assignments.",
"required": ["name", "slug", "masterVariant", "variants", "categories"],
"properties": {
"name": {
"$ref": "#/$defs/LocalizedString",
"description": "Localized display name of the product."
},
"description": {
"$ref": "#/$defs/LocalizedString",
"description": "Localized description of the product for display on product detail pages."
},
"slug": {
"$ref": "#/$defs/LocalizedString",
"description": "Localized URL-friendly identifier, unique per project and locale."
},
"categories": {
"type": "array",
"items": {
"$ref": "#/$defs/Reference"
},
"description": "References to categories this product is assigned to."
},
"categoryOrderHints": {
"type": "object",
"description": "Map of category ID to decimal ordering hint for custom ordering within categories.",
"additionalProperties": {
"type": "string"
}
},
"masterVariant": {
"$ref": "#/$defs/ProductVariant",
"description": "The master (first) variant of the product."
},
"variants": {
"type": "array",
"maxItems": 100,
"items": {
"$ref": "#/$defs/ProductVariant"
},
"description": "Additional variants beyond the master variant. A product supports up to 100 variants."
},
"metaTitle": {
"$ref": "#/$defs/LocalizedString",
"description": "Localized SEO title for the product page."
},
"metaDescription": {
"$ref": "#/$defs/LocalizedString",
"description": "Localized SEO description for the product page."
},
"metaKeywords": {
"$ref": "#/$defs/LocalizedString",
"description": "Localized SEO keywords for the product page."
},
"searchKeywords": {
"type": "object",
"description": "Map of locale to search keyword arrays for the product search index.",
"additionalProperties": {
"type": "array",
"items": {
"type": "object"
}
}
}
}
},
"ProductVariant": {
"type": "object",
"description": "A product variant representing a specific purchasable version of a product with its own SKU, prices, attributes, and images.",
"required": ["id"],
"properties": {
"id": {
"type": "integer",
"minimum": 1,
"description": "Variant ID, unique within the product. The master variant always has ID 1."
},
"key": {
"type": "string",
"minLength": 2,
"maxLength": 256,
"description": "User-defined unique key for the variant."
},
"sku": {
"type": "string",
"description": "Stock keeping unit identifier for this variant."
},
"prices": {
"type": "array",
"items": {
"$ref": "#/$defs/Price"
},
"description": "Embedded prices for this variant, scoped by currency, country, channel, and customer group."
},
"attributes": {
"type": "array",
"items": {
"$ref": "#/$defs/Attribute"
},
"description": "Product attribute values as defined by the product type schema."
},
"images": {
"type": "array",
"items": {
"$ref": "#/$defs/Image"
},
"description": "Images for this variant."
},
"assets": {
"type": "array",
"items": {
"type": "object"
},
"description": "Digital assets (PDFs, videos, etc.) associated with this variant."
},
"availability": {
"type": "object",
"description": "Inventory availability information for the variant across channels."
},
"isMatchingVariant": {
"type": "boolean",
"description": "Whether this variant matches the current search or filter context (set by product projections)."
}
}
},
"Price": {
"type": "object",
"description": "An embedded price for a product variant with optional scoping by currency, country, channel, and customer group.",
"required": ["id", "value"],
"properties": {
"id": {
"type": "string",
"description": "System-generated unique identifier for the price."
},
"key": {
"type": "string",
"description": "User-defined unique key for the price."
},
"value": {
"$ref": "#/$defs/Money",
"description": "The monetary value of the price."
},
"country": {
"type": "string",
"minLength": 2,
"maxLength": 2,
"description": "ISO 3166-1 alpha-2 country code for geographic scoping."
},
"customerGroup": {
"$ref": "#/$defs/Reference",
"description": "Customer group reference for customer-group-specific pricing."
},
"channel": {
"$ref": "#/$defs/Reference",
"description": "Channel reference for channel-specific pricing."
},
"validFrom": {
"type": "string",
"format": "date-time",
"description": "Start of the price validity period."
},
"validUntil": {
"type": "string",
"format": "date-time",
"description": "End of the price validity period."
},
"discounted": {
"type": "object",
"description": "Discounted price information if a product discount applies."
},
"tiers": {
"type": "array",
"items": {
"type": "object"
},
"description": "Volume-based pricing tiers for this price."
}
}
},
"Money": {
"type": "object",
"description": "A monetary value with ISO 4217 currency code and amount in the smallest currency unit.",
"required": ["currencyCode", "centAmount"],
"properties": {
"currencyCode": {
"type": "string",
"pattern": "^[A-Z]{3}$",
"description": "ISO 4217 three-letter currency code (e.g., USD, EUR, GBP)."
},
"centAmount": {
"type": "integer",
"description": "Amount in the smallest indivisible unit of the currency (e.g., cents for USD)."
},
"fractionDigits": {
"type": "integer",
"minimum": 0,
"maximum": 20,
"description": "Number of fraction digits for the currency. Defaults to 2 for most currencies."
}
}
},
"Attribute": {
"type": "object",
"description": "A name-value pair representing a product attribute as defined by the product type schema.",
"required": ["name", "value"],
"properties": {
"name": {
"type": "string",
"description": "The attribute name as defined in the product type."
},
"value": {
"description": "The attribute value. Type depends on the attribute type (string, number, boolean, LocalizedString, enum, reference, etc.)."
}
}
},
"Image": {
"type": "object",
"description": "A product image with URL, pixel dimensions, and optional label.",
"required": ["url", "dimensions"],
"properties": {
"url": {
"type": "string",
"format": "uri",
"description": "URL of the product image."
},
"dimensions": {
"type": "object",
"description": "Pixel dimensions of the image.",
"required": ["w", "h"],
"properties": {
"w": {
"type": "integer",
"minimum": 1,
"description": "Image width in pixels."
},
"h": {
"type": "integer",
"minimum": 1,
"description": "Image height in pixels."
}
}
},
"label": {
"type": "string",
"description": "Optional descriptive label for the image."
}
}
}
}
}