[go: nahoru, domu]

Product Tailoring

Product Tailoring lets you manage market-specific Product data.

With Product Tailoring, you can adapt your Product information to different brands or regions, based on your business requirements. By adapting Product information to different markets, businesses can increase their visibility, customer loyalty, and number of orders.

You can only create one Product Tailoring for each combination of a Product and a Store. It is not possible to share a Product Tailoring between Stores. To assign the same tailored values to a given Product in different Stores, you need to create a separate Product Tailoring for each Store.

A maximum number of 100 000 000 Product Tailoring over all Products and Stores can be created per Project. Learn more about this limit here.

A Product Tailoring lets you control what Product data is available in the storefront.

Product Tailoring is not a replacement for Localization but an additional option when using Stores. With this, you can control the tailoring of your Product data for each locale individually.

To ensure a consistent user experience for your Customers, Composable Commerce carries forward the tailored data to all entities involved in the buying process, such as Shopping Lists, Carts, and Orders.

Do not change the Product key of your tailored Products. If you were to change the Product key, you would lose all tailoring associated with that Product.

Product data available in Store

The intended approach to populate your storefront is to retrieve the products through the Get ProductProjection in Store methods, or through the Query ProductProjections endpoint in combination with the storeProjection parameter.

With a Product Tailoring for a Product and a Store, you control whether the original Product data or the tailored data is contained in the Product Projection retrieved through those endpoints.

For each data you want to tailor for the Store, add the tailored data field to the ProductTailoringData object. For data fields you don't add to this data object, Composable Commerce projects the corresponding original data from the Product (from its ProductData object) to the Store-specific Product. In the following example, you see a Product Tailoring for the fields name and description of a Product, but not for its slug. For the slug field, the ProductProjection takes the original value from the ProductData.

Data fieldProductDataProductTailoringDataProductProjection in Store
name"en: original name""en: tailored name""en: tailored name"
description"en: original desc""en: tailored desc""en: tailored desc"
slug"en: original_slug""en: original_slug"

The fallback to the original data gives you the flexibility to tailor only those data that need to be adapted for your Store, the other fields still provide the original data for the ProductProjection in Store. You don't need to tailor the entire product data at once, you can prepare the tailored fields in a staged version of the ProductTailoringData and when you want to release them to production, you can publish the tailoring at once.

The published flag on the ProductTailoring indicates the publication status of the tailoring as a whole. When true, you'll find only the fields in the current ProductTailoringData object in the related current ProductProjection in Store. With the unpublish action you can set this flag to false which leads to all fields falling back to their original values from ProductData regardless of what is stored in the current version of the ProductTailoringData.

The hasStagedChanges field is true whenever someone modified tailored data in the staged tailoring data, that are not yet reflected in the current tailoring data. This can give your team some indication to review the staged changes before publishing them, but your reviewer needs to find out which fields have changed. If you are interested in changes on particular fields of the ProductTailoring, we recommend subscribing to Product Tailoring Messages.

The publishing status of the Product Tailoring is independent of the publishing status of a Product itself. The Product's published field on the ProductCatalogData determines whether the current Product Projection in Store is available at all or not. The following table summarizes the effect the different publishing statuses have on the availability of Product Projections and their tailored data:

ProductProduct TailoringStaged Product Projection in StoreCurrent Product Projection in Store
unpublishedunpublisheddefault Product datanot available
unpublishedpublishedtailored Product datanot available
publishedunpublishedtailored Product datadefault Product data
publishedpublishedtailored Product datatailored Product data

When using Product Selections in addition to Product Tailoring, more criteria determine whether a Product is available in Store or not.

Representations

ProductTailoring

A single ProductTailoring representation contains the current and the staged representation of its product data tailored per Store.

id
String

Unique identifier of the ProductTailoring.

version
Int

Current version of the ProductTailoring.

key
String

User-defined unique identifier of the ProductTailoring.

The Store to which the ProductTailoring belongs.

product

Reference to the Product the ProductTailoring belongs to.

published
Boolean

true if the ProductTailoring is published.

Current (published) data of the ProductTailoring.

Staged (unpublished) data of the ProductTailoring.

hasStagedChanges
Boolean

true if the staged data is different from the current data.

createdAt

Date and time (UTC) the ProductTailoring was initially created.

createdByBETA

IDs and references that created the ProductTailoring.

lastModifiedAt

Date and time (UTC) the ProductTailoring was last updated.

lastModifiedByBETA

IDs and references that last modified the ProductTailoring.

Example: json
{
"id": "207ee692-6002-4570-a78c-d15e7adbebbb",
"version": 2,
"versionModifiedAt": "2023-09-01T13:41:50.662Z",
"createdAt": "2023-09-01T13:26:10.475Z",
"lastModifiedAt": "2023-09-01T13:26:10.475Z",
"lastModifiedBy": {
"clientId": "ywjliB_u26xzmcJNKznjbJp4",
"isPlatformClient": false
},
"createdBy": {
"clientId": "ywjliB_u26xzmcJNKznjbJp4",
"isPlatformClient": false
},
"product": {
"typeId": "product",
"id": "daf720e5-9e8e-4300-98db-3a3219327db9"
},
"store": {
"typeId": "store",
"key": "store-key"
},
"current": {
"variants": []
},
"staged": {
"name": {
"en": "tailored name"
},
"description": {
"en": "tailored description"
},
"metaTitle": {
"en": "tailored meta title"
},
"metaDescription": {
"en": "tailored meta description"
},
"metaKeywords": {
"en": "tailored meta keywords"
},
"slug": {
"en": "tailored-slug"
},
"variants": [
{
"id": 1,
"images": [
{
"url": "//myimage.jpg",
"dimensions": {
"w": 400,
"h": 300
}
}
],
"assets": []
},
{
"id": 2,
"images": [
{
"url": "//myimage-2.png",
"dimensions": {
"w": 400,
"h": 300
}
}
],
"assets": []
}
]
},
"published": false,
"hasStagedChanges": true
}

ProductTailoringData

Contains all the tailored data of a Product.

name

Tailored name of the Product.

description

Tailored description of the Product.

metaTitle

Tailored title of the Product used by external search engines for improved search engine performance.

metaDescription

Tailored description of the Product used by external search engines for improved search engine performance.

metaKeywords

Tailored keywords related to the Product used by external search engines for improved search engine performance.

slug

User-defined identifier used in a deep-link URL for the ProductTailoring. Matches the pattern [a-zA-Z0-9_-]{2,256}.

variantsBETA

Tailored Variants of the Product.

ProductVariantTailoring BETA

The tailoring of a ProductVariant.

id
Int

The id of the tailored ProductVariant.

images
Array of Image

Images of the tailored Product Variant. If present, these images will override the images of the corresponding ProductVariant in total.

assets
Array of Asset

Media assets of the tailored Product Variant. If present, these assets will override the assets of the corresponding ProductVariant in total.

ProductTailoringDraft

Contains all the tailored data of a Product.

key
String

User-defined unique identifier of the ProductTailoring.

The Store to which the ProductTailoring belongs.

ResourceIdentifier of the Product the ProductTailoring belongs to.

name

Tailored name of the Product.

description

Tailored description of the Product.

metaTitle

Tailored title of the Product used by external search engines for improved search engine performance.

metaDescription

Tailored description of the Product used by external search engines for improved search engine performance.

metaKeywords

Tailored keywords related to the Product used by external search engines for improved search engine performance.

slug

User-defined identifier used in a deep-link URL for the ProductTailoring. Matches the pattern [a-zA-Z0-9_-]{2,256}.

publish
Boolean

If true, the ProductTailoring is published immediately.

Default: false
variantsBETA

Tailored Variants of the Product.

ProductVariantTailoringDraft BETA

Either id or sku is required to reference a ProductVariant that exists.

id
Int

The id of the ProductVariant to be tailored.

sku
String

The sku of the ProductVariant to be tailored.

images
Array of Image

Images of the tailored Product Variant.

assets
Array of Asset

Media assets of the tailored Product Variant.

ProductTailoringInStoreDraft

Contains all the tailored data of a Product for a specific Store.

key
String

User-defined unique identifier of the ProductTailoring.

ResourceIdentifier of the Product the ProductTailoring belongs to.

name

Tailored name of the Product.

description

Tailored description of the Product.

metaTitle

Tailored title of the Product used by external search engines for improved search engine performance.

metaDescription

Tailored description of the Product used by external search engines for improved search engine performance.

metaKeywords

Tailored keywords related to the Product used by external search engines for improved search engine performance.

slug

User-defined identifier used in a deep-link URL for the ProductTailoring. Matches the pattern [a-zA-Z0-9_-]{2,256}.

publish
Boolean

If true, the ProductTailoring is published immediately.

Default: false
variantsBETA

Tailored Variants of the Product.

ProductTailoringPagedQueryResponse

PagedQueryResult with results containing an array of ProductTailoring.

limit
Int
offset
Int

Number of elements skipped.

count
Int

Actual number of results returned.

total
Int

Total number of results matching the query. This number is an estimation that is not strongly consistent. This field is returned by default. For improved performance, calculating this field can be deactivated by using the query parameter withTotal=false. When the results are filtered with a Query Predicate, total is subject to a limit.

results
Array of ProductTailoring

ProductTailoring list matching the query.

Example: json
{
"limit": 20,
"offset": 0,
"count": 2,
"results": [
{
"id": "207ee692-6002-4570-a78c-d15e7adbebbb",
"version": 2,
"versionModifiedAt": "2023-09-01T13:41:50.662Z",
"createdAt": "2023-09-01T13:26:10.475Z",
"lastModifiedAt": "2023-09-01T13:26:10.475Z",
"lastModifiedBy": {
"clientId": "ywjliB_u26xzmcJNKznjbJp4",
"isPlatformClient": false
},
"createdBy": {
"clientId": "ywjliB_u26xzmcJNKznjbJp4",
"isPlatformClient": false
},
"product": {
"typeId": "product",
"id": "daf720e5-9e8e-4300-98db-3a3219327db9"
},
"store": {
"typeId": "store",
"key": "store-key"
},
"current": {
"variants": []
},
"staged": {
"name": {
"en": "tailored name"
},
"description": {
"en": "tailored description"
},
"metaTitle": {
"en": "tailored meta title"
},
"metaDescription": {
"en": "tailored meta description"
},
"metaKeywords": {
"en": "tailored meta keywords"
},
"slug": {
"en": "tailored-slug"
},
"variants": [
{
"id": 1,
"images": [
{
"url": "//myimage.jpg",
"dimensions": {
"w": 400,
"h": 300
}
}
],
"assets": []
},
{
"id": 2,
"images": [
{
"url": "//myimage-2.png",
"dimensions": {
"w": 400,
"h": 300
}
}
],
"assets": []
}
]
},
"published": false,
"hasStagedChanges": true
},
{
"id": "207ee692-6002-4570-a78c-d15e7adbecc",
"version": 2,
"versionModifiedAt": "2023-09-01T13:42:50.662Z",
"createdAt": "2023-09-01T13:27:10.475Z",
"lastModifiedAt": "2023-09-01T14:26:10.475Z",
"lastModifiedBy": {
"clientId": "ywjliB_u26xzmcJNKznjbJp4",
"isPlatformClient": false
},
"createdBy": {
"clientId": "ywjliB_u26xzmcJNKznjbJp4",
"isPlatformClient": false
},
"product": {
"typeId": "product",
"id": "daf720e5-9e8e-4300-98db-3a3219327db9"
},
"store": {
"typeId": "store",
"key": "store-two"
},
"current": {
"variants": []
},
"staged": {
"name": {
"en": "Second store tailored name"
},
"description": {
"en": "This is a tailored description"
},
"metaTitle": {
"en": "tailored meta title"
},
"metaDescription": {
"en": "tailored meta description"
},
"metaKeywords": {
"en": "tailored meta keywords"
},
"slug": {
"en": "tailored-slug-two"
},
"variants": []
},
"published": false,
"hasStagedChanges": true
}
]
}

ProductTailoringReference

id
String

Unique identifier of the referenced ProductTailoring.

typeId
String
"product-tailoring"

References a ProductTailoring.

Contains the representation of the expanded ProductTailoring. Only present in responses to requests with Reference Expansion for ProductTailoring.

ProductTailoringResourceIdentifier

id
String

Unique identifier of the referenced ProductTailoring. Either id or key is required.

key
String

User-defined unique identifier of the referenced ProductTailoring. Either id or key is required.

typeId
String
"product-tailoring"

References a ProductTailoring.

Get ProductTailoring

Get ProductTailoring by ID

GET
https://api.{region}.commercetools.com/{projectKey}/product-tailoring/{id}
OAuth 2.0 Scopes:
view_products:{projectKey}
Path parameters:
region
String

Region in which the Project is hosted.

projectKey
String

key of the Project.

id
String

id of the ProductTailoring.

Query parameters:
expand
The parameter can be passed multiple times.
Response:
200ProductTailoringasapplication/json
Request Example:cURL
curl --get https://api.{region}.commercetools.com/{projectKey}/product-tailoring/{id} -i \
--header 'Authorization: Bearer ${BEARER_TOKEN}'
200 Response Example: ProductTailoringjson
{
"id": "207ee692-6002-4570-a78c-d15e7adbebbb",
"version": 2,
"versionModifiedAt": "2023-09-01T13:41:50.662Z",
"createdAt": "2023-09-01T13:26:10.475Z",
"lastModifiedAt": "2023-09-01T13:26:10.475Z",
"lastModifiedBy": {
"clientId": "ywjliB_u26xzmcJNKznjbJp4",
"isPlatformClient": false
},
"createdBy": {
"clientId": "ywjliB_u26xzmcJNKznjbJp4",
"isPlatformClient": false
},
"product": {
"typeId": "product",
"id": "daf720e5-9e8e-4300-98db-3a3219327db9"
},
"store": {
"typeId": "store",
"key": "store-key"
},
"current": {
"variants": []
},
"staged": {
"name": {
"en": "tailored name"
},
"description": {
"en": "tailored description"
},
"metaTitle": {
"en": "tailored meta title"
},
"metaDescription": {
"en": "tailored meta description"
},
"metaKeywords": {
"en": "tailored meta keywords"
},
"slug": {
"en": "tailored-slug"
},
"variants": [
{
"id": 1,
"images": [
{
"url": "//myimage.jpg",
"dimensions": {
"w": 400,
"h": 300
}
}
],
"assets": []
},
{
"id": 2,
"images": [
{
"url": "//myimage-2.png",
"dimensions": {
"w": 400,
"h": 300
}
}
],
"assets": []
}
]
},
"published": false,
"hasStagedChanges": true
}

Get ProductTailoring by Key

GET
https://api.{region}.commercetools.com/{projectKey}/product-tailoring/key={key}
OAuth 2.0 Scopes:
view_products:{projectKey}
Path parameters:
region
String

Region in which the Project is hosted.

projectKey
String

key of the Project.

key
String

key of the ProductTailoring.

Query parameters:
expand
The parameter can be passed multiple times.
Response:
200ProductTailoringasapplication/json
Request Example:cURL
curl --get https://api.{region}.commercetools.com/{projectKey}/product-tailoring/key={key} -i \
--header 'Authorization: Bearer ${BEARER_TOKEN}'
200 Response Example: ProductTailoringjson
{
"id": "207ee692-6002-4570-a78c-d15e7adbebbb",
"version": 2,
"versionModifiedAt": "2023-09-01T13:41:50.662Z",
"createdAt": "2023-09-01T13:26:10.475Z",
"lastModifiedAt": "2023-09-01T13:26:10.475Z",
"lastModifiedBy": {
"clientId": "ywjliB_u26xzmcJNKznjbJp4",
"isPlatformClient": false
},
"createdBy": {
"clientId": "ywjliB_u26xzmcJNKznjbJp4",
"isPlatformClient": false
},
"product": {
"typeId": "product",
"id": "daf720e5-9e8e-4300-98db-3a3219327db9"
},
"store": {
"typeId": "store",
"key": "store-key"
},
"current": {
"variants": []
},
"staged": {
"name": {
"en": "tailored name"
},
"description": {
"en": "tailored description"
},
"metaTitle": {
"en": "tailored meta title"
},
"metaDescription": {
"en": "tailored meta description"
},
"metaKeywords": {
"en": "tailored meta keywords"
},
"slug": {
"en": "tailored-slug"
},
"variants": [
{
"id": 1,
"images": [
{
"url": "//myimage.jpg",
"dimensions": {
"w": 400,
"h": 300
}
}
],
"assets": []
},
{
"id": 2,
"images": [
{
"url": "//myimage-2.png",
"dimensions": {
"w": 400,
"h": 300
}
}
],
"assets": []
}
]
},
"published": false,
"hasStagedChanges": true
}

Get ProductTailoring assigned to Product in Store

Get ProductTailoring assigned to Product in Store by Product ID

GET
https://api.{region}.commercetools.com/{projectKey}/in-store/key={storeKey}/products/{productID}/product-tailoring

Gets the current or staged representation of a Product Tailoring by its Product ID in the specified Store.

OAuth 2.0 Scopes:
view_products:{projectKey} , view_products:{projectKey}:{storeKey}
Path parameters:
region
String

Region in which the Project is hosted.

projectKey
String

key of the Project.

storeKey
String

key of the Store.

productID
String

id of the Product.

Query parameters:
expand
The parameter can be passed multiple times.
Response:
200ProductTailoringasapplication/json
Request Example:cURL
curl --get https://api.{region}.commercetools.com/{projectKey}/in-store/key={storeKey}/products/{productID}/product-tailoring -i \
--header 'Authorization: Bearer ${BEARER_TOKEN}'
200 Response Example: ProductTailoringjson
{
"id": "207ee692-6002-4570-a78c-d15e7adbebbb",
"version": 2,
"versionModifiedAt": "2023-09-01T13:41:50.662Z",
"createdAt": "2023-09-01T13:26:10.475Z",
"lastModifiedAt": "2023-09-01T13:26:10.475Z",
"lastModifiedBy": {
"clientId": "ywjliB_u26xzmcJNKznjbJp4",
"isPlatformClient": false
},
"createdBy": {
"clientId": "ywjliB_u26xzmcJNKznjbJp4",
"isPlatformClient": false
},
"product": {
"typeId": "product",
"id": "daf720e5-9e8e-4300-98db-3a3219327db9"
},
"store": {
"typeId": "store",
"key": "store-key"
},
"current": {
"variants": []
},
"staged": {
"name": {
"en": "tailored name"
},
"description": {
"en": "tailored description"
},
"metaTitle": {
"en": "tailored meta title"
},
"metaDescription": {
"en": "tailored meta description"
},
"metaKeywords": {
"en": "tailored meta keywords"
},
"slug": {
"en": "tailored-slug"
},
"variants": [
{
"id": 1,
"images": [
{
"url": "//myimage.jpg",
"dimensions": {
"w": 400,
"h": 300
}
}
],
"assets": []
},
{
"id": 2,
"images": [
{
"url": "//myimage-2.png",
"dimensions": {
"w": 400,
"h": 300
}
}
],
"assets": []
}
]
},
"published": false,
"hasStagedChanges": true
}

Get ProductTailoring assigned to Product in Store by Product Key

GET
https://api.{region}.commercetools.com/{projectKey}/in-store/key={storeKey}/products/key={productKey}/product-tailoring

Gets the current or staged representation of a Product Tailoring by its Product key in the specified Store.

OAuth 2.0 Scopes:
view_products:{projectKey} , view_products:{projectKey}:{storeKey}
Path parameters:
region
String

Region in which the Project is hosted.

projectKey
String

key of the Project.

storeKey
String

key of the Store.

productKey
String

key of the Product.

Query parameters:
expand
The parameter can be passed multiple times.
Response:
200ProductTailoringasapplication/json
Request Example:cURL
curl --get https://api.{region}.commercetools.com/{projectKey}/in-store/key={storeKey}/products/key={productKey}/product-tailoring -i \
--header 'Authorization: Bearer ${BEARER_TOKEN}'
200 Response Example: ProductTailoringjson
{
"id": "207ee692-6002-4570-a78c-d15e7adbebbb",
"version": 2,
"versionModifiedAt": "2023-09-01T13:41:50.662Z",
"createdAt": "2023-09-01T13:26:10.475Z",
"lastModifiedAt": "2023-09-01T13:26:10.475Z",
"lastModifiedBy": {
"clientId": "ywjliB_u26xzmcJNKznjbJp4",
"isPlatformClient": false
},
"createdBy": {
"clientId": "ywjliB_u26xzmcJNKznjbJp4",
"isPlatformClient": false
},
"product": {
"typeId": "product",
"id": "daf720e5-9e8e-4300-98db-3a3219327db9"
},
"store": {
"typeId": "store",
"key": "store-key"
},
"current": {
"variants": []
},
"staged": {
"name": {
"en": "tailored name"
},
"description": {
"en": "tailored description"
},
"metaTitle": {
"en": "tailored meta title"
},
"metaDescription": {
"en": "tailored meta description"
},
"metaKeywords": {
"en": "tailored meta keywords"
},
"slug": {
"en": "tailored-slug"
},
"variants": [
{
"id": 1,
"images": [
{
"url": "//myimage.jpg",
"dimensions": {
"w": 400,
"h": 300
}
}
],
"assets": []
},
{
"id": 2,
"images": [
{
"url": "//myimage-2.png",
"dimensions": {
"w": 400,
"h": 300
}
}
],
"assets": []
}
]
},
"published": false,
"hasStagedChanges": true
}

Query ProductTailoring

GET
https://api.{region}.commercetools.com/{projectKey}/product-tailoring
OAuth 2.0 Scopes:
view_products:{projectKey}
Path parameters:
region
String

Region in which the Project is hosted.

projectKey
String

key of the Project.

Query parameters:
where
The parameter can be passed multiple times.
/^var[.][a-zA-Z0-9]+$/
Any string parameter matching this regular expression

Predicate parameter values.

The parameter can be passed multiple times.
sort
The parameter can be passed multiple times.
expand
The parameter can be passed multiple times.
limit
Int
offset
Int

Number of elements skipped.

withTotal
Boolean

Controls the calculation of the total number of query results. Set to false to improve query performance when the total is not needed.

Response:
Request Example:cURL
curl --get https://api.{region}.commercetools.com/{projectKey}/product-tailoring -i \
--header 'Authorization: Bearer ${BEARER_TOKEN}'
200 Response Example: ProductTailoringPagedQueryResponsejson
{
"limit": 20,
"offset": 0,
"count": 2,
"results": [
{
"id": "207ee692-6002-4570-a78c-d15e7adbebbb",
"version": 2,
"versionModifiedAt": "2023-09-01T13:41:50.662Z",
"createdAt": "2023-09-01T13:26:10.475Z",
"lastModifiedAt": "2023-09-01T13:26:10.475Z",
"lastModifiedBy": {
"clientId": "ywjliB_u26xzmcJNKznjbJp4",
"isPlatformClient": false
},
"createdBy": {
"clientId": "ywjliB_u26xzmcJNKznjbJp4",
"isPlatformClient": false
},
"product": {
"typeId": "product",
"id": "daf720e5-9e8e-4300-98db-3a3219327db9"
},
"store": {
"typeId": "store",
"key": "store-key"
},
"current": {
"variants": []
},
"staged": {
"name": {
"en": "tailored name"
},
"description": {
"en": "tailored description"
},
"metaTitle": {
"en": "tailored meta title"
},
"metaDescription": {
"en": "tailored meta description"
},
"metaKeywords": {
"en": "tailored meta keywords"
},
"slug": {
"en": "tailored-slug"
},
"variants": [
{
"id": 1,
"images": [
{
"url": "//myimage.jpg",
"dimensions": {
"w": 400,
"h": 300
}
}
],
"assets": []
},
{
"id": 2,
"images": [
{
"url": "//myimage-2.png",
"dimensions": {
"w": 400,
"h": 300
}
}
],
"assets": []
}
]
},
"published": false,
"hasStagedChanges": true
},
{
"id": "207ee692-6002-4570-a78c-d15e7adbecc",
"version": 2,
"versionModifiedAt": "2023-09-01T13:42:50.662Z",
"createdAt": "2023-09-01T13:27:10.475Z",
"lastModifiedAt": "2023-09-01T14:26:10.475Z",
"lastModifiedBy": {
"clientId": "ywjliB_u26xzmcJNKznjbJp4",
"isPlatformClient": false
},
"createdBy": {
"clientId": "ywjliB_u26xzmcJNKznjbJp4",
"isPlatformClient": false
},
"product": {
"typeId": "product",
"id": "daf720e5-9e8e-4300-98db-3a3219327db9"
},
"store": {
"typeId": "store",
"key": "store-two"
},
"current": {
"variants": []
},
"staged": {
"name": {
"en": "Second store tailored name"
},
"description": {
"en": "This is a tailored description"
},
"metaTitle": {
"en": "tailored meta title"
},
"metaDescription": {
"en": "tailored meta description"
},
"metaKeywords": {
"en": "tailored meta keywords"
},
"slug": {
"en": "tailored-slug-two"
},
"variants": []
},
"published": false,
"hasStagedChanges": true
}
]
}

Query ProductTailoring in Store

GET
https://api.{region}.commercetools.com/{projectKey}/in-store/key={storeKey}/product-tailoring

Queries Product Tailoring in a specific Store.

OAuth 2.0 Scopes:
view_products:{projectKey}
Path parameters:
region
String

Region in which the Project is hosted.

projectKey
String

key of the Project.

storeKey
String

key of the Store.

Query parameters:
where
The parameter can be passed multiple times.
/^var[.][a-zA-Z0-9]+$/
Any string parameter matching this regular expression

Predicate parameter values.

The parameter can be passed multiple times.
sort
The parameter can be passed multiple times.
expand
The parameter can be passed multiple times.
limit
Int
offset
Int

Number of elements skipped.

withTotal
Boolean

By default, the response does not include the total field. Set to true to get the total number of query results included.

Response:
Request Example:cURL
curl --get https://api.{region}.commercetools.com/{projectKey}/in-store/key={storeKey}/product-tailoring -i \
--header 'Authorization: Bearer ${BEARER_TOKEN}'
200 Response Example: ProductTailoringPagedQueryResponsejson
{
"limit": 20,
"offset": 0,
"count": 2,
"results": [
{
"id": "207ee692-6002-4570-a78c-d15e7adbebbb",
"version": 2,
"versionModifiedAt": "2023-09-01T13:41:50.662Z",
"createdAt": "2023-09-01T13:26:10.475Z",
"lastModifiedAt": "2023-09-01T13:26:10.475Z",
"lastModifiedBy": {
"clientId": "ywjliB_u26xzmcJNKznjbJp4",
"isPlatformClient": false
},
"createdBy": {
"clientId": "ywjliB_u26xzmcJNKznjbJp4",
"isPlatformClient": false
},
"product": {
"typeId": "product",
"id": "daf720e5-9e8e-4300-98db-3a3219327db9"
},
"store": {
"typeId": "store",
"key": "store-key"
},
"current": {
"variants": []
},
"staged": {
"name": {
"en": "tailored name"
},
"description": {
"en": "tailored description"
},
"metaTitle": {
"en": "tailored meta title"
},
"metaDescription": {
"en": "tailored meta description"
},
"metaKeywords": {
"en": "tailored meta keywords"
},
"slug": {
"en": "tailored-slug"
},
"variants": [
{
"id": 1,
"images": [
{
"url": "//myimage.jpg",
"dimensions": {
"w": 400,
"h": 300
}
}
],
"assets": []
},
{
"id": 2,
"images": [
{
"url": "//myimage-2.png",
"dimensions": {
"w": 400,
"h": 300
}
}
],
"assets": []
}
]
},
"published": false,
"hasStagedChanges": true
},
{
"id": "207ee692-6002-4570-a78c-d15e7adbecc",
"version": 2,
"versionModifiedAt": "2023-09-01T13:42:50.662Z",
"createdAt": "2023-09-01T13:27:10.475Z",
"lastModifiedAt": "2023-09-01T14:26:10.475Z",
"lastModifiedBy": {
"clientId": "ywjliB_u26xzmcJNKznjbJp4",
"isPlatformClient": false
},
"createdBy": {
"clientId": "ywjliB_u26xzmcJNKznjbJp4",
"isPlatformClient": false
},
"product": {
"typeId": "product",
"id": "daf720e5-9e8e-4300-98db-3a3219327db9"
},
"store": {
"typeId": "store",
"key": "store-two"
},
"current": {
"variants": []
},
"staged": {
"name": {
"en": "Second store tailored name"
},
"description": {
"en": "This is a tailored description"
},
"metaTitle": {
"en": "tailored meta title"
},
"metaDescription": {
"en": "tailored meta description"
},
"metaKeywords": {
"en": "tailored meta keywords"
},
"slug": {
"en": "tailored-slug-two"
},
"variants": []
},
"published": false,
"hasStagedChanges": true
}
]
}

Create ProductTailoring

POST
https://api.{region}.commercetools.com/{projectKey}/product-tailoring

Generates the ProductTailoringCreated Message.

OAuth 2.0 Scopes:
manage_products:{projectKey}
Path parameters:
region
String

Region in which the Project is hosted.

projectKey
String

key of the Project.

Query parameters:
expand
The parameter can be passed multiple times.
Request Body:ProductTailoringDraftasapplication/json
Response:
201ProductTailoringasapplication/json
Request Example:cURL
curl https://api.{region}.commercetools.com/{projectKey}/product-tailoring -i \
--header 'Authorization: Bearer ${BEARER_TOKEN}' \
--header 'Content-Type: application/json' \
--data-binary @- << DATA
{
"product" : {
"typeId" : "product",
"id" : "daf720e5-9e8e-4300-98db-3a3219327db9"
},
"store" : {
"key" : "store-key"
},
"name" : {
"en" : "tailored name"
},
"metaTitle" : {
"en" : "tailored meta title"
},
"metaDescription" : {
"en" : "tailored meta description"
},
"metaKeywords" : {
"en" : "tailored meta keywords"
},
"slug" : {
"en" : "tailored-slug"
},
"description" : {
"en" : "tailored description"
},
"variants" : [ {
"id" : 1,
"images" : [ {
"url" : "//myimage.jpg",
"dimensions" : {
"w" : 400,
"h" : 300
}
} ]
}, {
"sku" : "sku-1",
"images" : [ {
"url" : "//myimage-2.png",
"dimensions" : {
"w" : 400,
"h" : 300
}
} ]
} ],
"publish" : false
}
DATA
201 Response Example: ProductTailoringjson
{
"id": "207ee692-6002-4570-a78c-d15e7adbebbb",
"version": 2,
"versionModifiedAt": "2023-09-01T13:41:50.662Z",
"createdAt": "2023-09-01T13:26:10.475Z",
"lastModifiedAt": "2023-09-01T13:26:10.475Z",
"lastModifiedBy": {
"clientId": "ywjliB_u26xzmcJNKznjbJp4",
"isPlatformClient": false
},
"createdBy": {
"clientId": "ywjliB_u26xzmcJNKznjbJp4",
"isPlatformClient": false
},
"product": {
"typeId": "product",
"id": "daf720e5-9e8e-4300-98db-3a3219327db9"
},
"store": {
"typeId": "store",
"key": "store-key"
},
"current": {
"variants": []
},
"staged": {
"name": {
"en": "tailored name"
},
"description": {
"en": "tailored description"
},
"metaTitle": {
"en": "tailored meta title"
},
"metaDescription": {
"en": "tailored meta description"
},
"metaKeywords": {
"en": "tailored meta keywords"
},
"slug": {
"en": "tailored-slug"
},
"variants": [
{
"id": 1,
"images": [
{
"url": "//myimage.jpg",
"dimensions": {
"w": 400,
"h": 300
}
}
],
"assets": []
},
{
"id": 2,
"images": [
{
"url": "//myimage-2.png",
"dimensions": {
"w": 400,
"h": 300
}
}
],
"assets": []
}
]
},
"published": false,
"hasStagedChanges": true
}

Create ProductTailoring in Store

POST
https://api.{region}.commercetools.com/{projectKey}/in-store/key={storeKey}/product-tailoring

Creates a ProductTailoring in the Store specified by storeKey. When using this endpoint the ProductTailoring's store field is always set to the Store specified in the path parameter.

Generates the ProductTailoringCreated Message.

OAuth 2.0 Scopes:
manage_products:{projectKey} , manage_products:{projectKey}:{storeKey}
Path parameters:
region
String

Region in which the Project is hosted.

projectKey
String

key of the Project.

storeKey
String

key of the Store.

Query parameters:
expand
The parameter can be passed multiple times.
Request Body:ProductTailoringInStoreDraftasapplication/json
Response:
201ProductTailoringasapplication/json
Request Example:cURL
curl https://api.{region}.commercetools.com/{projectKey}/in-store/key={storeKey}/product-tailoring -i \
--header 'Authorization: Bearer ${BEARER_TOKEN}' \
--header 'Content-Type: application/json' \
--data-binary @- << DATA
{
"product" : {
"typeId" : "product",
"id" : "daf720e5-9e8e-4300-98db-3a3219327db9"
},
"name" : {
"en" : "tailored name"
},
"metaTitle" : {
"en" : "tailored meta title"
},
"metaDescription" : {
"en" : "tailored meta description"
},
"metaKeywords" : {
"en" : "tailored meta keywords"
},
"slug" : {
"en" : "tailored-slug"
},
"description" : {
"en" : "tailored description"
},
"variants" : [ {
"id" : 1,
"images" : [ {
"url" : "//myimage.jpg",
"dimensions" : {
"w" : 400,
"h" : 300
}
} ]
} ],
"publish" : false
}
DATA
201 Response Example: ProductTailoringjson
{
"id": "207ee692-6002-4570-a78c-d15e7adbebbb",
"version": 2,
"versionModifiedAt": "2023-09-01T13:41:50.662Z",
"createdAt": "2023-09-01T13:26:10.475Z",
"lastModifiedAt": "2023-09-01T13:26:10.475Z",
"lastModifiedBy": {
"clientId": "ywjliB_u26xzmcJNKznjbJp4",
"isPlatformClient": false
},
"createdBy": {
"clientId": "ywjliB_u26xzmcJNKznjbJp4",
"isPlatformClient": false
},
"product": {
"typeId": "product",
"id": "daf720e5-9e8e-4300-98db-3a3219327db9"
},
"store": {
"typeId": "store",
"key": "store-key"
},
"current": {
"variants": []
},
"staged": {
"name": {
"en": "tailored name"
},
"description": {
"en": "tailored description"
},
"metaTitle": {
"en": "tailored meta title"
},
"metaDescription": {
"en": "tailored meta description"
},
"metaKeywords": {
"en": "tailored meta keywords"
},
"slug": {
"en": "tailored-slug"
},
"variants": [
{
"id": 1,
"images": [
{
"url": "//myimage.jpg",
"dimensions": {
"w": 400,
"h": 300
}
}
],
"assets": []
},
{
"id": 2,
"images": [
{
"url": "//myimage-2.png",
"dimensions": {
"w": 400,
"h": 300
}
}
],
"assets": []
}
]
},
"published": false,
"hasStagedChanges": true
}

Update ProductTailoring

Update ProductTailoring by ID

POST
https://api.{region}.commercetools.com/{projectKey}/product-tailoring/{id}
OAuth 2.0 Scopes:
manage_products:{projectKey}
Path parameters:
region
String

Region in which the Project is hosted.

projectKey
String

key of the Project.

id
String

id of the ProductTailoring.

Query parameters:
expand
The parameter can be passed multiple times.
Request Body:
application/json
version
Int

Expected version of the ProductTailoring on which the changes apply. If the expected version does not match the actual version, a 409 Conflict is returned.

actions

Update actions to be performed on the ProductTailoring.

Response:
200ProductTailoringasapplication/json
Request Example:cURL
curl https://api.{region}.commercetools.com/{projectKey}/product-tailoring/{id} -i \
--header 'Authorization: Bearer ${BEARER_TOKEN}' \
--header 'Content-Type: application/json' \
--data-binary @- << DATA
{
"version" : 1,
"actions" : [ {
"action" : "setDescription",
"description" : {
"en" : "A description"
},
"staged" : true
} ]
}
DATA
200 Response Example: ProductTailoringjson
{
"id": "207ee692-6002-4570-a78c-d15e7adbebbb",
"version": 2,
"versionModifiedAt": "2023-09-01T13:41:50.662Z",
"createdAt": "2023-09-01T13:26:10.475Z",
"lastModifiedAt": "2023-09-01T13:26:10.475Z",
"lastModifiedBy": {
"clientId": "ywjliB_u26xzmcJNKznjbJp4",
"isPlatformClient": false
},
"createdBy": {
"clientId": "ywjliB_u26xzmcJNKznjbJp4",
"isPlatformClient": false
},
"product": {
"typeId": "product",
"id": "daf720e5-9e8e-4300-98db-3a3219327db9"
},
"store": {
"typeId": "store",
"key": "store-key"
},
"current": {
"variants": []
},
"staged": {
"name": {
"en": "tailored name"
},
"description": {
"en": "A description"
},
"slug": {
"en": "tailored-slug"
},
"variants": []
},
"published": false,
"hasStagedChanges": true
}

Update ProductTailoring by Key

POST
https://api.{region}.commercetools.com/{projectKey}/product-tailoring/key={key}
OAuth 2.0 Scopes:
manage_products:{projectKey}
Path parameters:
region
String

Region in which the Project is hosted.

projectKey
String

key of the Project.

key
String

key of the ProductTailoring.

Query parameters:
expand
The parameter can be passed multiple times.
Request Body:
application/json
version
Int

Expected version of the ProductTailoring on which the changes apply. If the expected version does not match the actual version, a 409 Conflict is returned.

actions

Update actions to be performed on the ProductTailoring.

Response:
200ProductTailoringasapplication/json
Request Example:cURL
curl https://api.{region}.commercetools.com/{projectKey}/product-tailoring/key={key} -i \
--header 'Authorization: Bearer ${BEARER_TOKEN}' \
--header 'Content-Type: application/json' \
--data-binary @- << DATA
{
"version" : 1,
"actions" : [ {
"action" : "setDescription",
"description" : {
"en" : "A description"
},
"staged" : true
} ]
}
DATA
200 Response Example: ProductTailoringjson
{
"id": "207ee692-6002-4570-a78c-d15e7adbebbb",
"version": 2,
"versionModifiedAt": "2023-09-01T13:41:50.662Z",
"createdAt": "2023-09-01T13:26:10.475Z",
"lastModifiedAt": "2023-09-01T13:26:10.475Z",
"lastModifiedBy": {
"clientId": "ywjliB_u26xzmcJNKznjbJp4",
"isPlatformClient": false
},
"createdBy": {
"clientId": "ywjliB_u26xzmcJNKznjbJp4",
"isPlatformClient": false
},
"product": {
"typeId": "product",
"id": "daf720e5-9e8e-4300-98db-3a3219327db9"
},
"store": {
"typeId": "store",
"key": "store-key"
},
"current": {
"variants": []
},
"staged": {
"name": {
"en": "tailored name"
},
"description": {
"en": "A description"
},
"slug": {
"en": "tailored-slug"
},
"variants": []
},
"published": false,
"hasStagedChanges": true
}

Update ProductTailoring assigned to Product in Store

Use these update methods in case you know the Product ID or key rather than the ID or key of the ProductTailoring.

Update ProductTailoring assigned to Product in Store by Product ID

POST
https://api.{region}.commercetools.com/{projectKey}/in-store/key={storeKey}/products/{productID}/product-tailoring

Updates the current or staged representation of a Product Tailoring by its Product ID in the specified Store.

OAuth 2.0 Scopes:
manage_products:{projectKey} , manage_products:{projectKey}:{storeKey}
Path parameters:
region
String

Region in which the Project is hosted.

projectKey
String

key of the Project.

storeKey
String

key of the Store.

productID
String

id of the Product.

Query parameters:
expand
The parameter can be passed multiple times.
Request Body:
application/json
version
Int

Expected version of the ProductTailoring on which the changes apply. If the expected version does not match the actual version, a 409 Conflict is returned.

actions

Update actions to be performed on the ProductTailoring.

Response:
200ProductTailoringasapplication/json
Request Example:cURL
curl https://api.{region}.commercetools.com/{projectKey}/in-store/key={storeKey}/products/{productID}/product-tailoring -i \
--header 'Authorization: Bearer ${BEARER_TOKEN}' \
--header 'Content-Type: application/json' \
--data-binary @- << DATA
{
"version" : 1,
"actions" : [ {
"action" : "setDescription",
"description" : {
"en" : "A description"
},
"staged" : true
} ]
}
DATA
200 Response Example: ProductTailoringjson
{
"id": "207ee692-6002-4570-a78c-d15e7adbebbb",
"version": 2,
"versionModifiedAt": "2023-09-01T13:41:50.662Z",
"createdAt": "2023-09-01T13:26:10.475Z",
"lastModifiedAt": "2023-09-01T13:26:10.475Z",
"lastModifiedBy": {
"clientId": "ywjliB_u26xzmcJNKznjbJp4",
"isPlatformClient": false
},
"createdBy": {
"clientId": "ywjliB_u26xzmcJNKznjbJp4",
"isPlatformClient": false
},
"product": {
"typeId": "product",
"id": "daf720e5-9e8e-4300-98db-3a3219327db9"
},
"store": {
"typeId": "store",
"key": "store-key"
},
"current": {
"variants": []
},
"staged": {
"name": {
"en": "tailored name"
},
"description": {
"en": "A description"
},
"slug": {
"en": "tailored-slug"
},
"variants": []
},
"published": false,
"hasStagedChanges": true
}

Update ProductTailoring assigned to Product in Store by Product Key

POST
https://api.{region}.commercetools.com/{projectKey}/in-store/key={storeKey}/products/key={productKey}/product-tailoring

Updates the current or staged representation of a Product Tailoring by its Product key in the specified Store.

OAuth 2.0 Scopes:
manage_products:{projectKey} , manage_products:{projectKey}:{storeKey}
Path parameters:
region
String

Region in which the Project is hosted.

projectKey
String

key of the Project.

storeKey
String

key of the Store.

productKey
String

key of the Product.

Query parameters:
expand
The parameter can be passed multiple times.
Request Body:
application/json
version
Int

Expected version of the ProductTailoring on which the changes apply. If the expected version does not match the actual version, a 409 Conflict is returned.

actions

Update actions to be performed on the ProductTailoring.

Response:
200ProductTailoringasapplication/json
Request Example:cURL
curl https://api.{region}.commercetools.com/{projectKey}/in-store/key={storeKey}/products/key={productKey}/product-tailoring -i \
--header 'Authorization: Bearer ${BEARER_TOKEN}' \
--header 'Content-Type: application/json' \
--data-binary @- << DATA
{
"version" : 1,
"actions" : [ {
"action" : "setDescription",
"description" : {
"en" : "A description"
},
"staged" : true
} ]
}
DATA
200 Response Example: ProductTailoringjson
{
"id": "207ee692-6002-4570-a78c-d15e7adbebbb",
"version": 2,
"versionModifiedAt": "2023-09-01T13:41:50.662Z",
"createdAt": "2023-09-01T13:26:10.475Z",
"lastModifiedAt": "2023-09-01T13:26:10.475Z",
"lastModifiedBy": {
"clientId": "ywjliB_u26xzmcJNKznjbJp4",
"isPlatformClient": false
},
"createdBy": {
"clientId": "ywjliB_u26xzmcJNKznjbJp4",
"isPlatformClient": false
},
"product": {
"typeId": "product",
"id": "daf720e5-9e8e-4300-98db-3a3219327db9"
},
"store": {
"typeId": "store",
"key": "store-key"
},
"current": {
"variants": []
},
"staged": {
"name": {
"en": "tailored name"
},
"description": {
"en": "A description"
},
"slug": {
"en": "tailored-slug"
},
"variants": []
},
"published": false,
"hasStagedChanges": true
}

Update actions

on Product

Set Name

Generates the ProductTailoringNameSet Message.

action
String
"setName"
name

Value to set. If empty, any existing value will be removed.

staged
Boolean

If true, only the staged name is updated. If false, both the current and staged name are updated.

Default: true
Example: json
{
"action": "setName",
"name": {
"en": "A name"
},
"staged": true
}

Set Description

Generates the ProductTailoringDescriptionSet Message.

action
String
"setDescription"
description

Value to set. If empty, any existing value will be removed.

staged
Boolean

If true, only the staged description is updated. If false, both the current and staged description are updated.

Default: true
Example: json
{
"action": "setDescription",
"description": {
"en": "A description"
},
"staged": true
}

Set Slug

Generates the ProductTailoringSlugSet Message.

action
String
"setSlug"
slug

Value to set. If empty, any existing value will be removed.

staged
Boolean

If true, only the staged slug is updated. If false, both the current and staged slug are updated.

Default: true
Example: json
{
"action": "setSlug",
"slug": {
"en": "a-slug"
},
"staged": true
}

Set Meta Attributes

Updates all meta attributes at the same time.

action
String
"setMetaAttributes"
metaTitle

Value to set. If empty, any existing value will be removed.

metaDescription

Value to set. If empty, any existing value will be removed.

metaKeywords

Value to set. If empty, any existing value will be removed.

staged
Boolean

If true, only the staged attributes are updated. If false, both the current and staged attributes are updated.

Default: true
Example: json
{
"action": "setMetaAttributes",
"metaTitle": {
"en": "A Meta Title"
},
"metaDescription": {
"en": "A Meta Description"
},
"metaKeywords": {
"en": "Meta Keywords"
},
"staged": true
}

Set Meta Title

action
String
"setMetaTitle"
metaTitle

Value to set. If empty, any existing value will be removed.

staged
Boolean

If true, only the staged metaTitle is updated. If false, both the current and staged metaTitle are updated.

Default: true
Example: json
{
"action": "setMetaTitle",
"metaTitle": {
"en": "A Meta Title"
},
"staged": true
}

Set Meta Keywords

action
String
"setMetaKeywords"
metaKeywords

Value to set. If empty, any existing value will be removed.

staged
Boolean

If true, only the staged metaKeywords is updated. If false, both the current and staged metaKeywords are updated.

Default: true
Example: json
{
"action": "setMetaKeywords",
"metaKeywords": {
"en": "Meta Keywords"
},
"staged": true
}

Set Meta Description

action
String
"setMetaDescription"
metaDescription

Value to set. If empty, any existing value will be removed.

staged
Boolean

If true, only the staged metaDescription is updated. If false, both the current and staged metaDescription are updated.

Default: true
Example: json
{
"action": "setMetaDescription",
"metaDescription": {
"en": "A Meta Description"
},
"staged": true
}

Publish

Publishes the staged data of the ProductTailoring to current. Sets hasStagedChanges to false. Generates the ProductTailoringPublished Message.

action
String
"publish"
Example: json
{
"action": "publish"
}

Unpublish

Unpublishes the current data of the ProductTailoring. Sets the published field to false. Generates the ProductTailoringUnpublished Message.

action
String
"unpublish"
Example: json
{
"action": "unpublish"
}

on ProductVariant BETA

Add Variant

Either id or sku is required to reference a ProductVariant that exists. Produces the ProductVariantTailoringAdded Message.

id
Int

The id of the tailored ProductVariant to update.

action
String
"addVariant"
sku
String

The sku of the tailored ProductVariant to update.

images
Array of Image

Images for the Product Variant Tailoring.

assets
Array of AssetDraft

Media assets for the Product Variant Tailoring.

staged
Boolean

If true the new Product Variant Tailoring is only staged. If false the new Product Variant Tailoring is both current and staged.

Default: true
Example: json
{
"action": "addVariant",
"id": 2,
"sku": "VariantSKU"
}

Remove Variant

Either id or sku is required. Produces the ProductVariantTailoringDeleted Message.

id
Int

The id of the ProductVariant to remove from the Tailoring.

action
String
"removeVariant"
sku
String

The sku of the ProductVariant to remove from the Tailoring.

staged
Boolean

If true, only the staged Product Variant Tailoring is removed. If false, both the current and staged Product Variant Tailoring is removed.

Default: true
Example: json
{
"action": "removeVariant",
"id": 2
}

Add External Image

Either variantId or sku is required to reference a ProductVariant that exists. Produces the ProductTailoringImageAdded Message.

action
String
"addExternalImage"
variantId
Int

The id of the tailored ProductVariant to update.

sku
String

The sku of the tailored ProductVariant to update.

image

Value to add to images.

staged
Boolean

If true, only the staged images is updated. If false, both the current and staged images is updated.

Default: true
Example: json
{
"action": "addExternalImage",
"variantId": 1,
"image": {
"url": "//myimage.jpg",
"dimensions": {
"w": 1400,
"h": 1400
},
"label": "myImage"
}
}

Move Image To Position

Either variantId or sku is required to reference a ProductVariant that exists.

action
String
"moveImageToPosition"
variantId
Int

The id of the tailored ProductVariant to update.

sku
String

The sku of the tailored ProductVariant to update.

imageUrl
String

The URL of the image to update.

position
Int

Position in images where the image should be moved. Must be between 0 and the total number of images minus 1.

staged
Boolean

If true, only the staged images is updated. If false, both the current and staged images is updated.

Default: true
Example: json
{
"action": "moveImageToPosition",
"variantId": 1,
"imageUrl": "//myimage2.jpg",
"position": 1
}

Remove Image

Either variantId or sku is required to reference a ProductVariant that exists.

action
String
"removeImage"
variantId
Int

The id of the tailored ProductVariant to update.

sku
String

The sku of the tailored ProductVariant to update.

imageUrl
String

The URL of the image to remove.

staged
Boolean

If true, only the staged image is removed. If false, both the current and staged image is removed.

Default: true
Example: json
{
"action": "removeImage",
"variantId": 1,
"imageUrl": "//myimage2.jpg"
}

Set Images

Either variantId or sku is required to reference a ProductVariant that exists. Produces the ProductTailoringImagesSet Message.

action
String
"setImages"
variantId
Int

The id of the tailored ProductVariant to update.

sku
String

The sku of the tailored ProductVariant to update.

images
Array of Image

Value to set to images.

staged
Boolean

If true, only the staged images is updated. If false, both the current and staged images is updated.

Default: true
Example: json
{
"action": "setImages",
"variantId": 1,
"images": [
{
"url": "//myimage.jpg",
"dimensions": {
"w": 100,
"h": 100
}
},
{
"url": "//myimage2.jpg",
"dimensions": {
"w": 100,
"h": 100
}
}
]
}

Set Image Label

Either variantId or sku is required to reference a ProductVariant that exists.

action
String
"setImageLabel"
sku
String

The sku of the tailored ProductVariant to update.

variantId
Int

The id of the tailored ProductVariant to update.

imageUrl
String

The URL of the image to set the label.

label
String

Value to set. If empty, any existing value will be removed.

staged
Boolean

If true, only the staged image is updated. If false, both the current and staged image is updated.

Default: true
Example: json
{
"action": "setImageLabel",
"variantId": 2,
"imageUrl": "//image.png",
"label": "labelString",
"staged": true
}

Add Asset

Either variantId or sku is required to reference a ProductVariant that exists.

action
String
"addAsset"
variantId
Int

The id of the tailored ProductVariant to update.

sku
String

The sku of the tailored ProductVariant to update.

staged
Boolean

If true, only the staged assets are updated. If false, both the current and staged assets are updated.

Default: true
asset

Value to append.

position
Int

Position in assets where the Asset should be put. When specified, the value must be between 0 and the total number of Assets minus 1.

Example: json
{
"action": "addAsset",
"variantId": 1,
"asset": {
"sources": [
{
"uri": "//asset.mp4"
}
],
"name": {
"de": "FirstAssetDE",
"en": "FirstassetEN"
}
}
}

Remove Asset

Either variantId or sku is required to reference a ProductVariant that exists. The Asset to remove must be specified using either assetId or assetKey.

action
String
"removeAsset"
variantId
Int

The id of the tailored ProductVariant to update.

sku
String

The sku of the tailored ProductVariant to update.

staged
Boolean

If true, only the staged Asset is removed. If false, both the current and staged Asset is removed.

Default: true
assetId
String

The id of the Asset to remove.

assetKey
String

The key of the Asset to remove.

Example: json
{
"action": "removeAsset",
"variantId": 1,
"assetId": "{{assetId}}"
}

on Assets BETA

Set Asset Key

Either variantId or sku is required to reference a ProductVariant that exists.

action
String
"setAssetKey"
variantId
Int

The id of the tailored ProductVariant to update.

sku
String

The sku of the tailored ProductVariant to update.

staged
Boolean

If true, only the staged Asset is updated. If false, both the current and staged Asset is updated.

Default: true
assetId
String

The id of the Asset to update.

assetKey
String

Value to set. If empty, any existing value will be removed.

MinLength: 2MaxLength: 256Pattern: ^[A-Za-z0-9_-]+$
Example: json
{
"action": "setAssetKey",
"variantId": 1,
"assetId": "{{assetId}}",
"assetKey": "assetKeyString"
}

Change Asset Order

Either variantId or sku is required to reference a ProductVariant that exists.

action
String
"changeAssetOrder"
variantId
Int

The id of the tailored ProductVariant to update.

sku
String

The sku of the tailored ProductVariant to update.

staged
Boolean

If true, only the staged assets is updated. If false, both the current and staged assets are updated.

Default: true
assetOrder
Array of String

All existing Asset ids of the ProductTailoringVariant in the desired new order.

Example: json
{
"action": "changeAssetOrder",
"variantId": 1,
"assetOrder": ["{{assetId1}}", "{{assetId2}}"]
}

Change Asset Name

Either variantId or sku is required to reference a ProductVariant that exists. The Asset to update must be specified using either assetId or assetKey.

action
String
"changeAssetName"
variantId
Int

The id of the tailored ProductVariant to update.

sku
String

The sku of the tailored ProductVariant to update.

staged
Boolean

If true, only the staged Asset is updated. If false, both the current and staged Asset is updated.

Default: true
assetId
String

The id of the Asset to update.

assetKey
String

The key of the Asset to update.

name

New value to set. Must not be empty.

Example: json
{
"action": "changeAssetName",
"variantId": 1,
"assetId": "{{assetId}}",
"name": {
"de": "Mein Asset",
"en": "My asset"
}
}

Set Asset Description

Either variantId or sku is required to reference a ProductVariant that exists. The Asset to update must be specified using either assetId or assetKey.

action
String
"setAssetDescription"
variantId
Int

The id of the tailored ProductVariant to update.

sku
String

The sku of the tailored ProductVariant to update.

staged
Boolean

If true, only the staged Asset is updated. If false, both the current and staged Asset is updated.

Default: true
assetId
String

The id of the Asset to update.

assetKey
String

The key of the Asset to update.

description

Value to set. If empty, any existing value will be removed.

Example: json
{
"action": "setAssetDescription",
"assetId": "{{assetId}}",
"variantId": 1,
"description": {
"de": "Dies ist eine Asset-Beschreibung",
"en": "This is an asset description"
}
}

Set Asset Tags

Either variantId or sku is required to reference a ProductVariant that exists. The Asset to update must be specified using either assetId or assetKey.

action
String
"setAssetTags"
variantId
Int

The id of the tailored ProductVariant to update.

sku
String

The sku of the tailored ProductVariant to update.

staged
Boolean

If true, only the staged Asset is updated. If false, both the current and staged Asset is updated.

Default: true
assetId
String

The id of the Asset to update.

assetKey
String

The key of the Asset to update.

tags
Array of String

Keywords for categorizing and organizing Assets.

Example: json
{
"action": "setAssetTags",
"variantId": 1,
"assetId": "{{assetId}}",
"tags": ["commercetools", "awesome"]
}

Set Asset Sources

Either variantId or sku is required to reference a ProductVariant that exists. The Asset to update must be specified using either assetId or assetKey.

action
String
"setAssetSources"
variantId
Int

The id of the tailored ProductVariant to update.

sku
String

The sku of the tailored ProductVariant to update.

staged
Boolean

If true, only the staged Asset is updated. If false both the current and staged Asset is updated.

Default: true
assetId
String

The id of the Asset to update.

assetKey
String

The key of the Asset to update.

sources
Array of AssetSource

Value to set.

MinItems: 1
Example: json
{
"action": "setAssetSources",
"variantId": 1,
"assetId": "{{assetId}}",
"sources": [
{
"uri": "https://www.commercetools.de/ct-logo.svg",
"key": "vector"
}
]
}

Set Asset Custom Type

Either variantId or sku is required to reference a ProductVariant that exists. The Asset to update must be specified using either assetId or assetKey.

action
String
"setAssetCustomType"
variantId
Int

The id of the tailored ProductVariant to update.

sku
String

The sku of the tailored ProductVariant to update.

staged
Boolean

If true, only the staged Asset is updated. If false, both the current and staged Asset is updated.

Default: true
assetId
String

The id of the Asset to update.

assetKey
String

The key of the Asset to update.

Defines the Type that extends the Asset with Custom Fields. If absent, any existing Type and Custom Fields are removed from the Asset.

fields

Sets the Custom Fields fields for the Asset.

Example: json
{
"action": "setAssetCustomType",
"variantId": 1,
"assetId": "{{assetId}}",
"type": {
"id": "{{type-id}}",
"typeId": "type"
},
"fields": {
"exampleStringTypeField": "TextString"
}
}

Set Asset CustomField

Either variantId or sku is required to reference a ProductVariant that exists. The Asset to update must be specified using either assetId or assetKey.

action
String
"setAssetCustomField"
variantId
Int

The id of the tailored ProductVariant to update.

sku
String

The sku of the tailored ProductVariant to update.

staged
Boolean

If true, only the staged Asset is updated. If false, both the current and staged Asset is updated.

Default: true
assetId
String

The id of the Asset to update.

assetKey
String

The key of the Asset to update.

name
String

Name of the Custom Field.

value

If value is absent or null, this field will be removed if it exists. Removing a field that does not exist returns an InvalidOperation error. If value is provided, it is set for the field defined by name.

Example: json
{
"action": "setAssetCustomField",
"assetId": "{{assetId}}",
"variantId": 1,
"name": "ExampleStringTypeField",
"value": "TextString"
}

Upload Product Tailoring image BETA

Uploads a binary image file to a given ProductVariantTailoring. After upload, the system converts the original image to several sizes that are available on the builtin Content Delivery Network (CDN). Supported image formats are JPEG, PNG, and GIF. The maximum file size of the image to upload is 10 MB.

Only images in sRGB color space are supported. When trying to upload images with other color spaces, like Adobe RGB, the API returns a 400 Bad Request Error with code InvalidInput and the message Unsupported image data. Not able to identify the color model of your image.

The API responds with 200 OK status code and returns a ProductTailoring once the Small version of the image has been uploaded to the CDN. Other sizes may not be available immediately after a response is returned, but soon after. Produces the ProductTailoringImageAdded Message once the Small version of the image has been uploaded to the CDN.

The Image uploaded to the CDN is publicly available and its url may be shared across different Products in the same Project or in other Projects. However, the Image itself is tied to the Product Variant Tailoring where it was originally uploaded. If this Product Variant Tailoring is deleted, or if the Image is removed from the Product Variant Tailoring, the Image will be deleted from the CDN, and will no longer be available at its original URL.

Endpoint for Product ID: /{projectKey}/in-store/key={storeKey}/products/{productID}/product-tailoring/images
Endpoint for Product key: /{projectKey}/in-store/key={storeKey}/products/key={productKey}/product-tailoring/images
Method: POST
OAuth 2.0 Scopes: manage_products:{projectKey}
Response Representation: ProductTailoring

Headers:

  • Content-Type - one of "image/jpeg", "image/png" or "image/gif".

Query Parameters:

variant or sku is required to update a specific ProductVariant. The image is uploaded to the Master Variant if variant or sku are not provided.

  • variant - String - Optional
    The id of the ProductTailoringVariant the image should be uploaded to. It must correspond to an existing ProductVariant in the Product.
  • sku - String - Optional
    The sku of the ProductTailoringVariant the image should be uploaded to. It must correspond to an existing ProductVariant in the Product.
  • filename - String - Optional (Defaults to "img")
    URL-encoded filename of the image when stored in the Content Delivery Network (CDN). The filename is modified when uploaded to prevent filename conflicts. If not provided, a random filename is generated.
  • staged - Boolean - Optional (Defaults to true)
    If true, only the staged ProductVariantTailoring is updated. If false, both the current and staged ProductVariantTailoring are updated.

Body: The raw binary data.

The cURL example below adds an Image to tailor the ProductVariant with id = 2, in the Product with specified {productID} and the Store specified in {storeKey}:

curl -X POST \
-H "Content-Type: image/jpeg" \
-H "Authorization: Bearer {token}" \
--upload-file "detail.jpg" \
"https://api.{region}.commercetools.com/{projectKey}/in-store/{storeKey}/products/{productID}/product-tailoring/images?variant=2&filename=detail.jpg"

As the filename parameter was included (filename=detail.jpg), an example URL of the uploaded image is https://{commercetools-cdn}/detail-6xAq4Efp.jpg.

File upload using Content-Type: multipart/form-data is currently not supported.

Delete ProductTailoring

Delete ProductTailoring by ID

DELETE
https://api.{region}.commercetools.com/{projectKey}/product-tailoring/{id}

Generates the ProductTailoringDeleted Message.

OAuth 2.0 Scopes:
manage_products:{projectKey}
Path parameters:
region
String

Region in which the Project is hosted.

projectKey
String

key of the Project.

id
String

id of the ProductTailoring.

Query parameters:
version
Int

Last seen version of the resource.

expand
The parameter can be passed multiple times.
Response:
200ProductTailoringasapplication/json
Request Example:cURL
curl -X DELETE https://api.{region}.commercetools.com/{projectKey}/product-tailoring/{id}?version={version} -i \
--header 'Authorization: Bearer ${BEARER_TOKEN}'
200 Response Example: ProductTailoringjson
{
"id": "207ee692-6002-4570-a78c-d15e7adbebbb",
"version": 2,
"versionModifiedAt": "2023-09-01T13:41:50.662Z",
"createdAt": "2023-09-01T13:26:10.475Z",
"lastModifiedAt": "2023-09-01T13:26:10.475Z",
"lastModifiedBy": {
"clientId": "ywjliB_u26xzmcJNKznjbJp4",
"isPlatformClient": false
},
"createdBy": {
"clientId": "ywjliB_u26xzmcJNKznjbJp4",
"isPlatformClient": false
},
"product": {
"typeId": "product",
"id": "daf720e5-9e8e-4300-98db-3a3219327db9"
},
"store": {
"typeId": "store",
"key": "store-key"
},
"current": {
"variants": []
},
"staged": {
"name": {
"en": "tailored name"
},
"description": {
"en": "tailored description"
},
"metaTitle": {
"en": "tailored meta title"
},
"metaDescription": {
"en": "tailored meta description"
},
"metaKeywords": {
"en": "tailored meta keywords"
},
"slug": {
"en": "tailored-slug"
},
"variants": [
{
"id": 1,
"images": [
{
"url": "//myimage.jpg",
"dimensions": {
"w": 400,
"h": 300
}
}
],
"assets": []
},
{
"id": 2,
"images": [
{
"url": "//myimage-2.png",
"dimensions": {
"w": 400,
"h": 300
}
}
],
"assets": []
}
]
},
"published": false,
"hasStagedChanges": true
}

Delete ProductTailoring by Key

DELETE
https://api.{region}.commercetools.com/{projectKey}/product-tailoring/key={key}

Generates the ProductTailoringDeleted Message.

OAuth 2.0 Scopes:
manage_products:{projectKey}
Path parameters:
region
String

Region in which the Project is hosted.

projectKey
String

key of the Project.

key
String

key of the ProductTailoring.

Query parameters:
version
Int

Last seen version of the resource.

expand
The parameter can be passed multiple times.
Response:
200ProductTailoringasapplication/json
Request Example:cURL
curl -X DELETE https://api.{region}.commercetools.com/{projectKey}/product-tailoring/key={key}?version={version} -i \
--header 'Authorization: Bearer ${BEARER_TOKEN}'
200 Response Example: ProductTailoringjson
{
"id": "207ee692-6002-4570-a78c-d15e7adbebbb",
"version": 2,
"versionModifiedAt": "2023-09-01T13:41:50.662Z",
"createdAt": "2023-09-01T13:26:10.475Z",
"lastModifiedAt": "2023-09-01T13:26:10.475Z",
"lastModifiedBy": {
"clientId": "ywjliB_u26xzmcJNKznjbJp4",
"isPlatformClient": false
},
"createdBy": {
"clientId": "ywjliB_u26xzmcJNKznjbJp4",
"isPlatformClient": false
},
"product": {
"typeId": "product",
"id": "daf720e5-9e8e-4300-98db-3a3219327db9"
},
"store": {
"typeId": "store",
"key": "store-key"
},
"current": {
"variants": []
},
"staged": {
"name": {
"en": "tailored name"
},
"description": {
"en": "tailored description"
},
"metaTitle": {
"en": "tailored meta title"
},
"metaDescription": {
"en": "tailored meta description"
},
"metaKeywords": {
"en": "tailored meta keywords"
},
"slug": {
"en": "tailored-slug"
},
"variants": [
{
"id": 1,
"images": [
{
"url": "//myimage.jpg",
"dimensions": {
"w": 400,
"h": 300
}
}
],
"assets": []
},
{
"id": 2,
"images": [
{
"url": "//myimage-2.png",
"dimensions": {
"w": 400,
"h": 300
}
}
],
"assets": []
}
]
},
"published": false,
"hasStagedChanges": true
}

Delete ProductTailoring assigned to Product in Store

Delete ProductTailoring assigned to Product in Store by Product ID

DELETE
https://api.{region}.commercetools.com/{projectKey}/in-store/key={storeKey}/products/{productID}/product-tailoring

Generates the ProductTailoringDeleted Message.

OAuth 2.0 Scopes:
manage_products:{projectKey} , manage_products:{projectKey}:{storeKey}
Path parameters:
region
String

Region in which the Project is hosted.

projectKey
String

key of the Project.

storeKey
String

key of the Store.

productID
String

id of the Product.

Query parameters:
version
Int

Last seen version of the resource.

expand
The parameter can be passed multiple times.
Response:
200ProductTailoringasapplication/json
Request Example:cURL
curl -X DELETE https://api.{region}.commercetools.com/{projectKey}/in-store/key={storeKey}/products/{productID}/product-tailoring?version={version} -i \
--header 'Authorization: Bearer ${BEARER_TOKEN}'
200 Response Example: ProductTailoringjson
{
"id": "207ee692-6002-4570-a78c-d15e7adbebbb",
"version": 2,
"versionModifiedAt": "2023-09-01T13:41:50.662Z",
"createdAt": "2023-09-01T13:26:10.475Z",
"lastModifiedAt": "2023-09-01T13:26:10.475Z",
"lastModifiedBy": {
"clientId": "ywjliB_u26xzmcJNKznjbJp4",
"isPlatformClient": false
},
"createdBy": {
"clientId": "ywjliB_u26xzmcJNKznjbJp4",
"isPlatformClient": false
},
"product": {
"typeId": "product",
"id": "daf720e5-9e8e-4300-98db-3a3219327db9"
},
"store": {
"typeId": "store",
"key": "store-key"
},
"current": {
"variants": []
},
"staged": {
"name": {
"en": "tailored name"
},
"description": {
"en": "tailored description"
},
"metaTitle": {
"en": "tailored meta title"
},
"metaDescription": {
"en": "tailored meta description"
},
"metaKeywords": {
"en": "tailored meta keywords"
},
"slug": {
"en": "tailored-slug"
},
"variants": [
{
"id": 1,
"images": [
{
"url": "//myimage.jpg",
"dimensions": {
"w": 400,
"h": 300
}
}
],
"assets": []
},
{
"id": 2,
"images": [
{
"url": "//myimage-2.png",
"dimensions": {
"w": 400,
"h": 300
}
}
],
"assets": []
}
]
},
"published": false,
"hasStagedChanges": true
}

Delete ProductTailoring assigned to Product in Store by Product Key

DELETE
https://api.{region}.commercetools.com/{projectKey}/in-store/key={storeKey}/products/key={productKey}/product-tailoring

Generates the ProductTailoringDeleted Message.

OAuth 2.0 Scopes:
manage_products:{projectKey} , manage_products:{projectKey}:{storeKey}
Path parameters:
region
String

Region in which the Project is hosted.

projectKey
String

key of the Project.

storeKey
String

key of the Store.

productKey
String

key of the Product.

Query parameters:
version
Int

Last seen version of the resource.

expand
The parameter can be passed multiple times.
Response:
200ProductTailoringasapplication/json
Request Example:cURL
curl -X DELETE https://api.{region}.commercetools.com/{projectKey}/in-store/key={storeKey}/products/key={productKey}/product-tailoring?version={version} -i \
--header 'Authorization: Bearer ${BEARER_TOKEN}'
200 Response Example: ProductTailoringjson
{
"id": "207ee692-6002-4570-a78c-d15e7adbebbb",
"version": 2,
"versionModifiedAt": "2023-09-01T13:41:50.662Z",
"createdAt": "2023-09-01T13:26:10.475Z",
"lastModifiedAt": "2023-09-01T13:26:10.475Z",
"lastModifiedBy": {
"clientId": "ywjliB_u26xzmcJNKznjbJp4",
"isPlatformClient": false
},
"createdBy": {
"clientId": "ywjliB_u26xzmcJNKznjbJp4",
"isPlatformClient": false
},
"product": {
"typeId": "product",
"id": "daf720e5-9e8e-4300-98db-3a3219327db9"
},
"store": {
"typeId": "store",
"key": "store-key"
},
"current": {
"variants": []
},
"staged": {
"name": {
"en": "tailored name"
},
"description": {
"en": "tailored description"
},
"metaTitle": {
"en": "tailored meta title"
},
"metaDescription": {
"en": "tailored meta description"
},
"metaKeywords": {
"en": "tailored meta keywords"
},
"slug": {
"en": "tailored-slug"
},
"variants": [
{
"id": 1,
"images": [
{
"url": "//myimage.jpg",
"dimensions": {
"w": 400,
"h": 300
}
}
],
"assets": []
},
{
"id": 2,
"images": [
{
"url": "//myimage-2.png",
"dimensions": {
"w": 400,
"h": 300
}
}
],
"assets": []
}
]
},
"published": false,
"hasStagedChanges": true
}