Stores let you model the context your customers shop in.
Stores can be used to model, for example, physical retail locations, brand stores, or regions. They allow to define what subset of resources within a project is available in the context of a store.
manage_orders:acme-inc:luxury-brand
, an API Client can only access Carts and Orders inside the luxury-brand
Store, but not within the budget-brand
Store. For more information, see the Helpers section.Representations
Store
id ​String​ | Unique ID of the Store. |
version ​Int​ | Current version of the Store. |
key ​String​ | User-defined unique and immutable identifier for the Store. MinLength:Â2 ​MaxLength: 256 ​Pattern: ^[A-Za-z0-9_-]+$ ​ |
name ​ | Name of the Store. |
languages ​Array of Locale​ | Languages configured for the Store. |
countries ​Array of StoreCountry​ | Countries defined for the Store. |
distributionChannels ​Array of ChannelReference​ | Product Distribution Channels allowed for the Store. MaxItems:Â100 ​ |
supplyChannels ​Array of ChannelReference​ | Inventory Supply Channels allowed for the Store. MaxItems:Â100 ​ |
productSelections ​Array of ProductSelectionSetting​ | Controls availability of Products for this Store via Product Selections:
100 ​ |
custom ​CustomFields​ | Custom fields for the Store. |
createdAt ​DateTime​ | Date and time (UTC) the Store was initially created. |
createdBy ​BETACreatedBy​ | IDs and references that created the Store. |
lastModifiedAt ​DateTime​ | Date and time (UTC) the Store was last updated. |
lastModifiedBy ​BETA | IDs and references that last modified the Store. |
StoreCountry
code ​CountryCode​ | Two-digit country code as per ISO 3166-1 alpha-2. DisplayName: CountryCode ​ |
StoreDraft
key ​String​ | User-defined unique and immutable identifier for the Store. Keys can only contain alphanumeric characters, underscores, and hyphens. MinLength:Â2 ​MaxLength: 256 ​Pattern: ^[A-Za-z0-9_-]+$ ​ |
name ​ | Name of the Store. |
languages ​Array of Locale​ | Languages defined in Project. Only languages defined in the Project can be used. |
countries ​Array of StoreCountry​ | Countries defined for the Store. |
distributionChannels ​Array of ChannelResourceIdentifier​ | ResourceIdentifier of a Channel with MaxItems: ProductDistribution ChannelRoleEnum.100 ​ |
supplyChannels ​Array of ChannelResourceIdentifier​ | ResourceIdentifier of a Channel with MaxItems: InventorySupply ChannelRoleEnum.100 ​ |
productSelections ​Array of ProductSelectionSettingDraft​ | Controls availability of Products for this Store via active/inactive Product Selections:
100 ​ |
custom ​ | Custom fields for the Store. |
StorePagedQueryResponse
limit ​Int​ | Number of results requested. Default: 20 ​Minimum: 0 ​Maximum: 500 ​ |
offset ​Int​ | Number of elements skipped. Default: 0 ​Maximum: 10000 ​ |
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 Store​ | Stores matching the query. |
StoreReference
id ​String​ | Unique ID of the referenced Store. |
typeId ​ | store Type of referenced resource. |
obj ​Store​ | Contains the representation of the expanded Store. Only present in responses to requests with Reference Expansion for Stores. |
StoreResourceIdentifier
id
or key
is required. If both are set, an InvalidJsonInput error is returned.id ​String​ | Unique ID of the referenced Store. Required if key is absent. |
key ​String​ | Unique key of the referenced Store. Required if id is absent. |
typeId ​ | store Type of referenced resource. If given, it must match the expected ReferenceTypeId of the referenced resource. |
StoreKeyReference
key ​String​ | Unique and immutable key of the referenced Store. |
typeId ​ | store Type of referenced resource. |
ProductSelectionSetting
productSelection ​ | Reference to a ProductSelection. |
active ​Boolean​ | If true , all Products assigned to this Product Selection are part of the Store's assortment. |
ProductSelectionSettingDraft
productSelection ​ | Resource Identifier of a ProductSelection. |
active ​Boolean​ | Set to true if all Products assigned to the Product Selection should become part of the Store's assortment. |
Get Store
Get Store by ID
view_stores:{projectKey}
region String ​ | Region in which the Project is hosted. |
projectKey String ​ | key of the Project. |
id String ​ | id of the Store. |
expand | The parameter can be passed multiple times. |
application/json
curl --get https://api.{region}.commercetools.com/{projectKey}/stores/{id} -i \
--header "Authorization: Bearer ${BEARER_TOKEN}"
{
"id": "c2f93299-c967-44af-8c2a-d2220bf39eb2",
"version": 1,
"key": "random-key-12314",
"name": {
"en": "big store"
},
"languages": [],
"countries": [],
"distributionChannels": [],
"supplyChannels": [],
"productSelections": [],
"createdAt": "1971-01-01T00:00:00.001Z",
"lastModifiedAt": "1972-01-01T00:00:00.001Z"
}
Get Store by Key
view_stores:{projectKey}
region String ​ | Region in which the Project is hosted. |
projectKey String ​ | key of the Project. |
key String ​ | key of the Store. |
expand | The parameter can be passed multiple times. |
application/json
curl --get https://api.{region}.commercetools.com/{projectKey}/stores/key={key} -i \
--header "Authorization: Bearer ${BEARER_TOKEN}"
{
"id": "c2f93299-c967-44af-8c2a-d2220bf39eb2",
"version": 1,
"key": "random-key-12314",
"name": {
"en": "big store"
},
"languages": [],
"countries": [],
"distributionChannels": [],
"supplyChannels": [],
"productSelections": [],
"createdAt": "1971-01-01T00:00:00.001Z",
"lastModifiedAt": "1972-01-01T00:00:00.001Z"
}
Query Stores
view_stores:{projectKey}
region String ​ | Region in which the Project is hosted. |
projectKey String ​ | key of the Project. |
where | 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 ​ | Number of results requested. Default: 20 ​Minimum: 0 ​Maximum: 500 ​ |
offset Int ​ | Number of elements skipped. Default: 0 ​Maximum: 10000 ​ |
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.Default: true ​ |
var.<varName> String ​ | Predicate parameter values. The parameter can be passed multiple times. |
application/json
curl --get https://api.{region}.commercetools.com/{projectKey}/stores -i \
--header "Authorization: Bearer ${BEARER_TOKEN}"
{
"limit": 20,
"offset": 0,
"count": 2,
"total": 2,
"results": [
{
"id": "c2f93299-c967-44af-8c2a-d2220bf39eb2",
"version": 1,
"key": "random-key-12314",
"name": {
"en": "big store"
},
"languages": [],
"countries": [],
"distributionChannels": [],
"supplyChannels": [],
"productSelections": [],
"createdAt": "1971-01-01T00:00:00.001Z",
"lastModifiedAt": "1972-01-01T00:00:00.001Z"
},
{
"id": "c2f93209-c967-44af-8c2a-d2220bf39eb2",
"version": 1,
"key": "random-key-1234314",
"name": {
"en": "second store"
},
"languages": [],
"countries": [],
"distributionChannels": [],
"supplyChannels": [],
"productSelections": [],
"createdAt": "1973-01-01T00:00:00.001Z",
"lastModifiedAt": "1973-01-01T00:00:00.001Z"
}
]
}
Check if Store exists
Check if Store exists by ID
id
. Returns a 200 OK
status if the Store exists or a 404 Not Found
otherwise.view_states:{projectKey}
region String ​ | Region in which the Project is hosted. |
projectKey String ​ | key of the Project. |
id String ​ | id of the Store. |
curl --head https://api.{region}.commercetools.com/{projectKey}/stores/{id} -i \
--header "Authorization: Bearer ${BEARER_TOKEN}"
Check if Store exists by Key
key
. Returns a 200 OK
status if the Store exists or a 404 Not Found
otherwise.view_stores:{projectKey}
region String ​ | Region in which the Project is hosted. |
projectKey String ​ | key of the Project. |
key String ​ | key of the Store. |
curl --head https://api.{region}.commercetools.com/{projectKey}/stores/key={key} -i \
--header "Authorization: Bearer ${BEARER_TOKEN}"
Check if Store exists by Query Predicate
200 OK
status if any Stores match the query predicate, or a 404 Not Found
otherwise.view_stores:{projectKey}
region String ​ | Region in which the Project is hosted. |
projectKey String ​ | key of the Project. |
where |
curl --head https://api.{region}.commercetools.com/{projectKey}/stores -i \
--header "Authorization: Bearer ${BEARER_TOKEN}"
Create Store
manage_stores:{projectKey}
region String ​ | Region in which the Project is hosted. |
projectKey String ​ | key of the Project. |
expand | The parameter can be passed multiple times. |
application/json
application/json
curl https://api.{region}.commercetools.com/{projectKey}/stores -i \
--header "Authorization: Bearer ${BEARER_TOKEN}" \
--header 'Content-Type: application/json' \
--data-binary @- << DATA
{
"key" : "random-key-123",
"name" : {
"en" : "main store"
}
}
DATA
{
"id": "c2f93299-c967-44af-8c2a-d2220bf39eb2",
"version": 1,
"key": "random-key-12314",
"name": {
"en": "big store"
},
"languages": [],
"countries": [],
"distributionChannels": [],
"supplyChannels": [],
"productSelections": [],
"createdAt": "1971-01-01T00:00:00.001Z",
"lastModifiedAt": "1972-01-01T00:00:00.001Z"
}
Specific error codes:
Update Store
Update Store by ID
manage_stores:{projectKey}
region String ​ | Region in which the Project is hosted. |
projectKey String ​ | key of the Project. |
id String ​ | id of the Store. |
expand | The parameter can be passed multiple times. |
application/json
version ​Int​ | Expected version of the Store on which the changes should be applied.
If the expected version does not match the actual version, a ConcurrentModification error will be returned. |
actions ​Array of StoreUpdateAction​ | Update actions to be performed on the Store. |
application/json
curl https://api.{region}.commercetools.com/{projectKey}/stores/{id} -i \
--header "Authorization: Bearer ${BEARER_TOKEN}" \
--header 'Content-Type: application/json' \
--data-binary @- << DATA
{
"version" : 1,
"actions" : [ {
"action" : "setName",
"name" : {
"en" : "New Name"
}
} ]
}
DATA
{
"id": "c2f93299-c967-44af-8c2a-d2220bf39eb2",
"version": 1,
"key": "random-key-12314",
"name": {
"en": "big store"
},
"languages": [],
"countries": [],
"distributionChannels": [],
"supplyChannels": [],
"productSelections": [],
"createdAt": "1971-01-01T00:00:00.001Z",
"lastModifiedAt": "1972-01-01T00:00:00.001Z"
}
Update Store by Key
manage_stores:{projectKey}
region String ​ | Region in which the Project is hosted. |
projectKey String ​ | key of the Project. |
key String ​ | key of the Store. |
expand | The parameter can be passed multiple times. |
application/json
version ​Int​ | Expected version of the Store on which the changes should be applied.
If the expected version does not match the actual version, a ConcurrentModification error will be returned. |
actions ​Array of StoreUpdateAction​ | Update actions to be performed on the Store. |
application/json
curl https://api.{region}.commercetools.com/{projectKey}/stores/key={key} -i \
--header "Authorization: Bearer ${BEARER_TOKEN}" \
--header 'Content-Type: application/json' \
--data-binary @- << DATA
{
"version" : 1,
"actions" : [ {
"action" : "setName",
"name" : {
"en" : "New Name"
}
} ]
}
DATA
{
"id": "c2f93299-c967-44af-8c2a-d2220bf39eb2",
"version": 1,
"key": "random-key-12314",
"name": {
"en": "big store"
},
"languages": [],
"countries": [],
"distributionChannels": [],
"supplyChannels": [],
"productSelections": [],
"createdAt": "1971-01-01T00:00:00.001Z",
"lastModifiedAt": "1972-01-01T00:00:00.001Z"
}
Update actions
Set Name
action ​String​ | "setName" |
name ​ | Value to set. |
{
"action": "setName",
"name": {
"en": "New Name"
}
}
Set Languages
action ​String​ | "setLanguages" |
languages ​Array of Locale​ | Value to set. |
{
"action": "setLanguages",
"languages": [
"en"
]
}
Set Countries
action ​String​ | "setCountries" |
countries ​Array of StoreCountry​ | New value to set. |
{
"action": "setCountries",
"countries": [
{
"code": "DE"
},
{
"code": "IT"
}
]
}
Add Country
action ​String​ | "addCountry" |
country ​StoreCountry​ | Value to append to countries . |
{
"action": "addCountry",
"country": {
"code": "DE"
}
}
Remove Country
action ​String​ | "removeCountry" |
country ​StoreCountry​ | Value to remove from countries . |
{
"action": "removeCountry",
"country": {
"code": "DE"
}
}
Set Distribution Channels
ProductDistribution
ChannelRoleEnum returns a MissingRoleOnChannel error.action ​String​ | "setDistributionChannels" |
distributionChannels ​Array of ChannelResourceIdentifier​ | Value to set.
If not defined, the Store's MaxItems: distributionChannels are unset.100 ​ |
{
"action": "setDistributionChannels",
"distributionChannels": [
{
"typeId": "channel",
"id": "12345"
}
]
}
Add Distribution Channel
ProductDistribution
ChannelRoleEnum returns a MissingRoleOnChannel error.action ​String​ | "addDistributionChannel" |
distributionChannel ​ | Value to append. |
{
"action": "addDistributionChannel",
"distributionChannel": {
"typeId": "channel",
"id": "12345"
}
}
Remove Distribution Channel
action ​String​ | "removeDistributionChannel" |
distributionChannel ​ | Value to remove. ResourceIdentifier of a Channel with the ProductDistribution ChannelRoleEnum. |
{
"action": "removeDistributionChannel",
"distributionChannel": {
"typeId": "channel",
"id": "12345"
}
}
Set Supply Channels
action ​String​ | "setSupplyChannels" |
supplyChannels ​Array of ChannelResourceIdentifier​ | Value to set.
If not defined, the Store's MaxItems: supplyChannels are unset.100 ​ |
{
"action": "setSupplyChannels",
"supplyChannels": [
{
"typeId": "channel",
"id": "12345"
}
]
}
Add Supply Channel
This action has no effect if a given supply channel is already present in a Store.
action ​String​ | "addSupplyChannel" |
supplyChannel ​ | Value to append. |
{
"action": "addSupplyChannel",
"supplyChannel": {
"typeId": "channel",
"id": "12345"
}
}
Remove Supply Channel
action ​String​ | "removeSupplyChannel" |
supplyChannel ​ | Value to remove. ResourceIdentifier of a Channel with the InventorySupply ChannelRoleEnum. |
{
"action": "removeSupplyChannel",
"supplyChannel": {
"typeId": "channel",
"id": "12345"
}
}
Add Product Selection
active
flag.action ​String​ | "addProductSelection" |
productSelection ​ | Product Selection to add to the Store either activated or deactivated. |
active ​Boolean​ | Set to true to make all Products assigned to the referenced Product Selection available in the Store. |
{
"action": "addProductSelection",
"productSelection": {
"typeId": "product-selection",
"id": "e7ba4555-b1bb-483d-92d8-2c4a10778427"
},
"active": false
}
A Store can incorporate multiple Product Selections, which is useful if a Product Selection is shared between Stores. For example, you may want to create a shared Product Selection as your base catalog which is supplemented by individual Product Selections for each Store.
A Store without any Product Selection includes all Products of a Project.
100
.Remove Product Selection
This action has no effect if the given Product Selection is not in the Store.
action ​String​ | "removeProductSelection" |
productSelection ​ | Value to remove. The removed Product Selection is made offline. |
{
"action": "removeProductSelection",
"productSelection": {
"typeId": "product-selection",
"id": "e7ba4555-b1bb-483d-92d8-2c4a10778427"
}
}
Set Product Selections
action ​String​ | "setProductSelections" |
productSelections ​Array of ProductSelectionSettingDraft​ | Value to set.
100 ​ |
{
"action": "setProductSelections",
"productSelections": [
{
"productSelection": {
"typeId": "product-selection",
"id": "e7ba4555-b1bb-483d-92d8-2c4a10778427"
},
"active": false
},
{
"productSelection": {
"typeId": "product-selection",
"id": "a7ba45e5-b1c2-482d-94d5-2c1a10118426"
},
"active": true
}
]
}
100
.Change Product Selection Active
action ​String​ | "changeProductSelectionActive" |
productSelection ​ | Current Product Selection of the Store to be activated or deactivated. |
active ​Boolean​ | Set to true if all Products assigned to the Product Selection should become part of the Store's assortment. |
{
"action": "changeProductSelectionActive",
"productSelection": {
"typeId": "product-selection",
"id": "e7ba4555-b1bb-483d-92d8-2c4a10778427"
},
"active": true
}
Set Custom Type
action ​String​ | "setCustomType" |
type ​ | Defines the Type that extends the Store with Custom Fields.
If absent, any existing Type and Custom Fields are removed from the Store. |
fields ​ | Sets the Custom Fields fields for the Store. |
{
"action": "setCustomType",
"type": {
"id": "{{type-id}}",
"typeId": "type"
},
"fields": {
"exampleStringField": "TextString"
}
}
Set CustomField
action ​String​ | "setCustomField" |
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 . |
{
"action": "setCustomField",
"name": "exampleStringField",
"value": "TextString"
}
Delete Store
Delete Store by ID
manage_stores:{projectKey}
region String ​ | Region in which the Project is hosted. |
projectKey String ​ | key of the Project. |
id String ​ | id of the Store. |
version Int ​ | Last seen version of the resource. |
expand | The parameter can be passed multiple times. |
application/json
curl -X DELETE https://api.{region}.commercetools.com/{projectKey}/stores/{id}?version={version} -i \
--header "Authorization: Bearer ${BEARER_TOKEN}"
{
"id": "c2f93299-c967-44af-8c2a-d2220bf39eb2",
"version": 1,
"key": "random-key-12314",
"name": {
"en": "big store"
},
"languages": [],
"countries": [],
"distributionChannels": [],
"supplyChannels": [],
"productSelections": [],
"createdAt": "1971-01-01T00:00:00.001Z",
"lastModifiedAt": "1972-01-01T00:00:00.001Z"
}
Delete Store by Key
manage_stores:{projectKey}
region String ​ | Region in which the Project is hosted. |
projectKey String ​ | key of the Project. |
key String ​ | key of the Store. |
version Int ​ | Last seen version of the resource. |
expand | The parameter can be passed multiple times. |
application/json
curl -X DELETE https://api.{region}.commercetools.com/{projectKey}/stores/key={key}?version={version} -i \
--header "Authorization: Bearer ${BEARER_TOKEN}"
{
"id": "c2f93299-c967-44af-8c2a-d2220bf39eb2",
"version": 1,
"key": "random-key-12314",
"name": {
"en": "big store"
},
"languages": [],
"countries": [],
"distributionChannels": [],
"supplyChannels": [],
"productSelections": [],
"createdAt": "1971-01-01T00:00:00.001Z",
"lastModifiedAt": "1972-01-01T00:00:00.001Z"
}
Helpers in the HTTP and GraphQL APIs
commercetools Composable Commerce provides some helper methods for accessing resources within a specified Store.
In-Store representations
manage_orders:{projectKey}:{storeKey}
.Products available in Store
- not excluded by any of that Store's active Product Selection with
IndividualExclusion
ProductSelectionMode. - included in at least one of that Store's active Product Selections with
Individual
ProductSelectionMode.
When a Store has two, or more, active Product Selection(s) that contain the same Product but have different Variant Selections, Product's In-Store representation is resolved in following manner:
- All Product Variants that are part of a Variant Exclusion across Product Selections are discarded.
- All Product Variants that are part of a Variant Selection of type IncludeOnly across Product Selections are kept, with the exception of ones that are part of a Variant Selection of type IncludeAllExcept.
IndividualExclusion
without specifying any Variant Exclusion, the Product is considered as absent in the Store.GraphQL query fields
inStore
and inStores
are available to only query resources belonging to specified Stores. For example, the following query only returns IDs of Carts created in the luxury-brand
Store, and the total
field counts only Carts within that Store:query {
inStore(key: "luxury-brand") {
carts {
results {
id
}
total
}
}
}
inStores(keys: ["luxury-brand", "budget-brand"])
performs the queries only within these two Stores.manage_orders:project-key
) or with the store-based OAuth permissions (for example manage_orders:project-key:store-key
). For the inStores
example, the OAuth scope must contain manage_orders:project-key:luxury-brand
or manage_orders:project-key:budget-brand
, else an insufficient_scope
error is returned.GraphQL mutations
storeKey
. In the following example, the Cart is created in the Store luxury-brand
:mutation {
createCart(draft: { currency: "USD" }, storeKey: "luxury-brand") {
id
}
}
luxury-brand
:mutation {
updateCart(
id: "123e4567-e89b-12d3-a456-426655440000"
version: 1
actions: [{ addLineItem: { sku: "..." } }]
storeKey: "luxury-brand"
) {
id
}
}
manage_orders:project-key
) or with the store-based OAuth permissions (for example manage_orders:project-key:store-key
).