openapi: 3.0.3 info: description: | SCAYLE Storefront API is a REST API used to access your product data in any customer-facing application. Some common scenarios include retrieving campaigns, promotions, categories or configuration. You can also use it to save baskets or wishlists for individual customers and filter and search products. Core concepts of the Storefront API are: Variant: Any distinct sellable item, for example: a blue colored shirt in size L. Available quantity/stock information is always on variant level. Product: A product is a collection of one or more variants with some shared attributes, for example: A blue colored shirt (product) available in different sizes (variants). A product will be sold out when all its variants are sold out. Sibling: A product closely related to another product, for example, the same shirt by the same brand, but in another color. Category: Each product can be assigned to one or more category nodes in the category tree. Attribute: Attributes are, for example, size, material, color. Attributes can be assigned to product level or variant level. Filter: Any criteria available to filter a list of products, for example: an attribute or a category. Basket: The basket holds variants that a customer intends to buy and has added to his shopping cart. Wishlist: Customers can add variants to a wishlist to remember them or buy them later. Requests Base URL: https://{{tenant-space}}.storefront.api.scayle.cloud Authentication 1. Generate access token in the SCAYLE Panel > Shops > Storefront > API Keys. 2. Provide the generated access token in the X-Access-Token Header Note: After the token is generated in the SCAYLE Panel, it can take some time for changes to take effect. version: '{{version}}' title: Storefront API Documentation tags: - name: products description: Get products - name: variants description: Get product variants - name: campaigns description: Get campaigns available per shop - name: categories description: Get categories - name: attributes description: Get attributes - name: search-v1 description: Deprecated Search Endpoints - name: search-v2 description: Search for Categories, Attributes & more - name: filters description: Get filters - name: baskets description: Manage baskets - name: wishlists description: Manage wishlists - name: shop-configuration description: Manage the shop configuration - name: navigation description: Manage navigation - name: brands description: Manage brands - name: redirects description: Manage redirects - name: promotions description: Manage promotions paths: # Basket /v1/baskets/{basketId}: get: tags: - baskets summary: Get a basket description: | Fetch the content of an existing basket. Baskets are created on demand when the first variant is added to it. Fetching a non existent basket will not return an error but instead just return an empty basket. Using the `with` parameter, it is possible to retrieve extra information in the response (see parameters below). operationId: fetch-basket-by-key parameters: - $ref: '#/components/parameters/OrderCustomData' - $ref: '#/components/parameters/CustomerToken' - $ref: '#/components/parameters/basketId' - $ref: '#/components/parameters/campaignKey' - $ref: '#/components/parameters/includeItemsWithoutProductData' - $ref: '#/components/parameters/skipAvailabilityCheck' - $ref: '#/components/parameters/basketWith' - $ref: '#/components/parameters/shopId' responses: '200': description: Successful Operation content: application/json: schema: $ref: '#/components/schemas/Basket' example: $ref: '#/components/examples/basket' '400': description: Required parameter is missing or invalid. '401': description: Authentication failed. '408': description: Basket is currently locked due to another request, please retry. '424': description: The API Request failed due to an underlying dependency error. x-codeSamples: - lang: 'bash' label: 'CLI' source: | curl --location 'https://{{tenant-space}}.storefront.api.scayle.cloud/v1/basket/{{basketId}}?shopId={{shopId}}' \ --header 'X-Access-Token: {{ACCESSTOKEN}}' - lang: 'ts' label: 'Typescript' source: | const response = await client.basket.get("myshop_customer_1234"); console.log(response.basket) /v1/baskets/{basketId}/items: post: tags: - baskets summary: Add a variant description: | Adds a new variant to a given basket, so the user can purchase it in the checkout process. Baskets are created on demand when the first variant is added to the basket. Only one variant can be added to the basket with each request. Use multiple requests to add more variants. The variant and quantity to be added is specified in the POST request body (see below). The only strictly required parameters are `variantId` and `quantity`. The response will return the updated content of the basket. operationId: add-basket-item parameters: - $ref: '#/components/parameters/OrderCustomData' - $ref: '#/components/parameters/CustomerToken' - $ref: '#/components/parameters/basketId' - $ref: '#/components/parameters/campaignKey' - $ref: '#/components/parameters/includeItemsWithoutProductData' - $ref: '#/components/parameters/pricePromotionKey' - $ref: '#/components/parameters/skipAvailabilityCheck' - $ref: '#/components/parameters/basketWith' - $ref: '#/components/parameters/shopId' requestBody: content: application/json: schema: $ref: '#/components/schemas/CreateBasketItemBody' examples: Basic: value: variantId: 5 quantity: 1 WithCustomData: value: variantId: 5 quantity: 1 customData: field1: "value1" isApp: false WithPromotion: value: variantId: 5 quantity: 1 promotionId: "65e04665b1d03700f7864e4c" responses: '201': description: The variant was added to the Basket with all of the request quantity. content: application/json: schema: $ref: '#/components/schemas/Basket' example: $ref: '#/components/examples/basket' '206': description: The variant was added to the Basket however with a reduced quantity. content: application/json: schema: $ref: '#/components/schemas/Basket' example: $ref: '#/components/examples/basket' '400': description: Required parameter is missing or invalid. '401': description: Authentication failed. '404': description: Variant not found. '408': description: Basket is currently locked due to another request, please retry. '409': description: Basket item for the given variant already exists. content: application/json: schema: $ref: '#/components/schemas/Basket' example: $ref: '#/components/examples/basket' '412': description: The variant is out of stock. content: application/json: schema: $ref: '#/components/schemas/Basket' example: $ref: '#/components/examples/basket' '413': description: The Basket has reached it's maximum size of items. content: application/json: schema: $ref: '#/components/schemas/Basket' example: $ref: '#/components/examples/basket' '424': description: The API Request failed due to an underlying dependency error. x-codeSamples: - lang: 'bash' label: 'CLI' source: | curl --location --request POST 'https://{{tenant-space}}.storefront.api.scayle.cloud/v1/basket/{{basketId}}/items?shopId={{shopId}}' \ --header 'X-Access-Token: {{ACCESSTOKEN}}' --data '{ "quantity": 2, "variantId": 1 }' - lang: 'ts' label: 'Typescript' source: | const response = await client.basket.addItem( "myshop_customer_1234", 1, // variantId 2, // quantity ); const item = response.basket.items[0]; console.log(item); /v1/baskets/{basketId}/items/{itemKey}: patch: tags: - baskets summary: Update an item description: | Updates the quantity of a basket item or other properties such as the custom data or the promotion id. To update the item you will need to use the item key which can be found when fetching the Basket. You can't update the variant id of a given basket item, for this operation you would need to do a delete and then an add operation. The response will show the updated content of the basket. operationId: update-basket-item parameters: - $ref: '#/components/parameters/OrderCustomData' - $ref: '#/components/parameters/CustomerToken' - $ref: '#/components/parameters/basketId' - $ref: '#/components/parameters/basketItemKey' - $ref: '#/components/parameters/campaignKey' - $ref: '#/components/parameters/includeItemsWithoutProductData' - $ref: '#/components/parameters/skipAvailabilityCheck' - $ref: '#/components/parameters/basketWith' - $ref: '#/components/parameters/shopId' requestBody: content: application/json: schema: $ref: '#/components/schemas/UpdateBasketItemBody' examples: Basic: value: quantity: 2 WithCustomData: value: quantity: 2 customData: field1: "value1" isApp: true responses: '200': description: The Basket Item was successfully updated. content: application/json: schema: $ref: '#/components/schemas/Basket' example: $ref: '#/components/examples/basket' '206': description: The Basket Item was updated however with a reduced quantity. content: application/json: schema: $ref: '#/components/schemas/Basket' example: $ref: '#/components/examples/basket' '400': description: Required parameter is missing or invalid. '401': description: Authentication failed. '404': description: The Basket Item doesn't exist for the referenced Basket. '408': description: Basket is currently locked due to another request, please retry. '424': description: The API Request failed due to an underlying dependency error. x-codeSamples: - lang: 'bash' label: 'CLI' source: | curl --location --request PATCH 'https://{{tenant-space}}.storefront.api.scayle.cloud/v1/basket/{{basketId}}/items/{{itemKey}}?shopId={{shopId}}' \ --header 'X-Access-Token: {{ACCESSTOKEN}}' --data '{ "quantity": 4 }' - lang: 'ts' label: 'Typescript' source: | const response = await client.basket.updateItem( "myshop_customer_1234", "aec0f393f63d0e70f0418d10cc1acb2e", //item key 3 // quantity ); console.log(response.basket); delete: tags: - baskets summary: Delete an item description: | Removes a specific item from a given basket using the item's key. The item key can be found when fetching the Basket. The response will return the updated content of the basket. operationId: remove-basket-item parameters: - $ref: '#/components/parameters/OrderCustomData' - $ref: '#/components/parameters/CustomerToken' - $ref: '#/components/parameters/basketId' - $ref: '#/components/parameters/basketItemKey' - $ref: '#/components/parameters/campaignKey' - $ref: '#/components/parameters/includeItemsWithoutProductData' - $ref: '#/components/parameters/basketWith' - $ref: '#/components/parameters/shopId' responses: '200': description: The Basket Item was successfully deleted. content: application/json: schema: $ref: '#/components/schemas/Basket' example: $ref: '#/components/examples/basket' '400': description: Required parameter is missing or invalid. '401': description: Authentication failed. '404': description: The Basket Item doesn't exist for the referenced Basket. '408': description: Basket is currently locked due to another request, please retry. '424': description: The API Request failed due to an underlying dependency error. x-codeSamples: - lang: 'bash' label: 'CLI' source: | curl --location --request DELETE 'https://{{tenant-space}}.storefront.api.scayle.cloud/v1/basket/{{basketId}}/items/{{itemKey}}?shopId={{shopId}}' \ --header 'X-Access-Token: {{ACCESSTOKEN}}' - lang: 'ts' label: 'Typescript' source: | const response = await client.basket.deleteItem( "myshop_customer_1234", "d3467d079a1cc261b2b818be9fce0212" // item key ); console.log(response.items); # Variants '/v1/variants': get: tags: - variants summary: List variants description: | Get multiple variants by specifying variant IDs. __Fetching variants by variant ID__ To fetch a list of known variants, simply specify them by variant ID using the `ids` parameter, for example, `/v1/variants?ids=1,2,3`. *** __Selecting included variant data__ By default, only basic variant data is included in the response. Use the `with` parameters (see below) to include more variant data. To see all available variant data, for example, for debugging, you might use unrestricted `with` parameters: `?with=attributes,advancedAttributes,lowestPriorPrice`. Beware of using unrestricted `with` parameters in production applications. It will result in slow performance, as download sizes for full variant data lists can be quite big. Including only exactly what is needed will be best for performance when downloading and parsing the result. A typical request for a variant list optimized for maximum performance is, for example, `?with=attributes:key(ean|shopSize),advancedAttributes:key(modelHeight),lowestPriorPrice`. operationId: fetch-variants parameters: - $ref: '#/components/parameters/shopId' - $ref: '#/components/parameters/variantIds' - $ref: '#/components/parameters/campaignKey' - $ref: '#/components/parameters/pricePromotionKey' - $ref: '#/components/parameters/variantsWith' responses: 200: description: successful operation content: application/json: schema: type: object properties: entities: type: array items: $ref: '#/components/schemas/Variant' pagination: $ref: '#/components/schemas/Pagination' example: pagination: current: 2 total: 2 perPage: 2 page: 1 first: 1 prev: 1 next: 1 last: 1 entities: - id: 1 referenceKey: external-reference attributes: size: id: 2 key: size label: Size type: '' multiSelect: false values: id: 15 label: S value: s firstLiveAt: '2023-09-22T14:36:42+00:00' createdAt: '2023-09-22T14:34:45+00:00' updatedAt: '2024-04-23T09:32:13+00:00' stock: supplierId: 3 warehouseId: 1 quantity: 21 isSellableWithoutStock: false price: currencyCode: EUR withTax: 4999 withoutTax: 4201 recommendedRetailPrice: tax: vat: amount: 798 rate: 0.19 appliedReductions: [ ] customData: { } - id: 5 referenceKey: external-reference attributes: size: id: 2 key: size label: Size type: '' multiSelect: false values: id: 18 label: M value: m firstLiveAt: '2023-09-22T14:35:29+00:00' createdAt: '2023-09-22T14:34:45+00:00' updatedAt: '2024-04-23T03:17:39+00:00' stock: supplierId: 3 warehouseId: 1 quantity: 7 isSellableWithoutStock: false price: currencyCode: EUR withTax: 4999 withoutTax: 4201 recommendedRetailPrice: tax: vat: amount: 798 rate: 0.19 appliedReductions: [ ] customData: { } 400: $ref: '#/components/responses/RequestError' 401: $ref: '#/components/responses/Unauthorized' x-codeSamples: - lang: 'bash' label: 'CLI' source: | curl --location 'https://{{tenant-space}}.storefront.api.scayle.cloud/v1/variants?ids={{variantIds}}&shopId={{shopId}}' - lang: 'ts' label: 'Typescript' source: | const variants = await client.variants.getByIds([123, 456]); console.log(variants); /v1/variants/{variantId}: get: tags: - variants summary: Get a variant description: Get one variant by variantId. operationId: fetch-variant-by-id parameters: - $ref: '#/components/parameters/shopId' - $ref: '#/components/parameters/variantId' - $ref: '#/components/parameters/campaignKey' - $ref: '#/components/parameters/pricePromotionKey' - $ref: '#/components/parameters/variantsWith' responses: 200: description: successful operation content: application/json: schema: $ref: '#/components/schemas/Variant' example: id: 5 referenceKey: external-reference attributes: size: id: 2 key: size label: Size type: '' multiSelect: false values: id: 18 label: M value: m firstLiveAt: '2023-09-22T14:35:29+00:00' createdAt: '2023-09-22T14:34:45+00:00' updatedAt: '2024-04-23T03:17:39+00:00' stock: supplierId: 3 warehouseId: 1 quantity: 7 isSellableWithoutStock: false price: currencyCode: EUR withTax: 4999 withoutTax: 4201 recommendedRetailPrice: tax: vat: amount: 798 rate: 0.19 appliedReductions: [ ] customData: { } 400: $ref: '#/components/responses/RequestError' 401: $ref: '#/components/responses/Unauthorized' 404: $ref: '#/components/responses/NotFound' x-codeSamples: - lang: 'bash' label: 'CLI' source: | curl --location 'https://{{tenant-space}}.storefront.api.scayle.cloud/v1/variants/{{variantId}}?shopId={{shopId}}' # Products /v1/products: get: tags: - products summary: List products description: | Requesting this API endpoint is the main way to retrieve your product data to display in any context. A product is basically any individual item in the shop. There are basically two ways to use this endpoint: * Search for products by specifying search/filter parameters * Directly fetch known products by their product IDs *** __Searching for products__ The various `filter` parameters can be used to restrict the list of products included in the response (see available parameters below). You can also use the `/v1/filters` endpoint to determine which filters are available in the current context. This way, you can, for example, enable users to narrow down general product lists to very specific results by incrementally adding more and more filter parameters. The `minProductId`, `includeSellableForFree`, and `includeSoldOut` parameters can further restrict or expand the search results (see below). *** __Fetching products by product ID__ To fetch a list of known products, simply specify them by product ID using the `ids` parameter, for example, `/v1/products?ids=1,2,3`. This offers a notable performance advantage since it eliminates the need for a search step. If you specify the `ids` parameter, all other search/filter parameters will be ignored. *** __Selecting included product data__ By default, only basic product data is included in the response. Use the `with` parameters (see below) to include more product data. To see all available product data, for example, for debugging, you might use unrestricted `with` parameters: `?with=attributes,advancedAttributes,categories,images.attributes,priceRange,reductionRange,siblings,variants.attributes,variants.advancedAttributes`. Beware of using these unrestricted `with` parameters in production applications. It will result in slow performance, as download sizes for full product data lists can be quite big. Including only exactly what is needed will be best for performance when downloading and parsing the result. A typical request for a product list optimized for maximum performance is, for example, `?with=attributes:key(brand|color),advancedAttributes:key(description),variants.attributes:key(vendorSize),images,priceRange,reductionRange`. *** __Sorting__ You can order the results using different sorting strategies, based on the provided `sort`, `sortingKey`, and `sortDir` parameters. * __Default sorting__: If no sorting parameter is specified, the products will be sorted by product ID. To specify the order, use the `sortDir` parameter (default `desc`, highest product ID first). * __Price sorting__: `sort=price` will sort the results by price. To specify the order, use the `sortDir` parameter (default `desc`, highest price first). * __Reduction sorting__: `sort=reduction` will sort the results by price reduction. This sorting is based on the available `appliedReductions` for each product's variants. When a `campaignKey` is also provided, the sorting will also consider the campaign reduction. To specify the order, use the `sortDir` parameter (default `desc`, highest reduction first). * __Date sorting__: `sort=new` will order the products by `firstLiveAt` field. If `firstLiveAt` is not set the products will be ordered by creation date. To specify the order, use the `sortDir` parameter (default `desc`, most recent date first). * __Key sorting__: `sortingKey` will order the results based on your custom sorting keys, for example, `sortingKey=wcc-default`. If the `sortingKey` parameter has been provided, the `sort` parameter will be ignored. operationId: fetch-products parameters: - $ref: '#/components/parameters/productIds' - $ref: '#/components/parameters/campaignKey' - $ref: '#/components/parameters/includeSellableForFree' - $ref: '#/components/parameters/includeSoldOut' - $ref: '#/components/parameters/referenceKey' - $ref: '#/components/parameters/pricePromotionKey' - $ref: '#/components/parameters/sort' - $ref: '#/components/parameters/sortDir' - $ref: '#/components/parameters/sortingKey' - $ref: '#/components/parameters/filterAttributeKey' - $ref: '#/components/parameters/negativeFilterAttributeKey' - $ref: '#/components/parameters/negativeFilterIds' - $ref: '#/components/parameters/orFiltersOperator' - $ref: '#/components/parameters/filterCategory' - $ref: '#/components/parameters/filterEan' - $ref: '#/components/parameters/filterIsnew' - $ref: '#/components/parameters/filterMaxPrice' - $ref: '#/components/parameters/filterMaxReduction' - $ref: '#/components/parameters/filterMinPrice' - $ref: '#/components/parameters/filterMinReduction' - $ref: '#/components/parameters/filterReferenceKey' - $ref: '#/components/parameters/filterVariantReferenceKey' - $ref: '#/components/parameters/filterVariantAttributeKey' - $ref: '#/components/parameters/filterSale' - $ref: '#/components/parameters/filterMasterKey' - $ref: '#/components/parameters/filterTerm' - $ref: '#/components/parameters/filterMinFirstLiveAt' - $ref: '#/components/parameters/filterMerchantId' - $ref: '#/components/parameters/filterHasCampaignReduction' - $ref: '#/components/parameters/productsWith' - $ref: '#/components/parameters/minProductId' - $ref: '#/components/parameters/disableFuzziness' - $ref: '#/components/parameters/page' - $ref: '#/components/parameters/perPage' - $ref: '#/components/parameters/limit' - $ref: '#/components/parameters/offset' responses: '200': description: successful operation content: application/json: schema: type: object properties: entities: type: array items: $ref: '#/components/schemas/Product' pagination: oneOf: - $ref: '#/components/schemas/Pagination' - $ref: '#/components/schemas/OffsetPagination' example: pagination: current: 10 total: 95 perPage: 10 page: 1 first: 1 prev: 1 next: 2 last: 10 entities: - id: 7 isActive: true isSoldOut: false isNew: false createdAt: '2023-09-22T14:34:44+00:00' updatedAt: '2024-04-10T10:30:08+00:00' indexedAt: '2024-04-23T17:22:14+00:00' firstLiveAt: '2023-09-22T14:35:29+00:00' masterKey: master-key referenceKey: external-reference attributes: name: id: 20005 key: name label: Name type: '' multiSelect: false values: id: 20005 label: Women dress value: name color: id: 1 key: color label: Color type: '' multiSelect: true values: - id: 38932 label: Black value: black brand: id: 3 key: brand label: Brand type: '' multiSelect: false values: id: 232 label: SCAYLE value: scayle advancedAttributes: combineWith: id: 1223 key: combineWith label: Combine with Products type: '' values: - fieldSet: - - value: '51' - value: '63' - value: '27' groupSet: [ ] images: - hash: images/52d08cac15a71b5c02428c7989f634b9 attributes: imageFocus: id: 1253 key: imageFocus label: Image Focus type: '' multiSelect: false values: id: 66484 label: Product value: product - hash: images/3e81768c43aab1d12b3c53956a64ff2d.jpg attributes: imageFocus: id: 1253 key: imageFocus label: Image Focus type: '' multiSelect: false values: id: 66483 label: Detail value: detail variants: - id: 1 referenceKey: external-reference attributes: size: id: 2 key: size label: Size type: '' multiSelect: false values: id: 15 label: S value: s firstLiveAt: '2023-09-22T14:36:42+00:00' createdAt: '2023-09-22T14:34:45+00:00' updatedAt: '2024-04-23T09:32:13+00:00' stock: supplierId: 3 warehouseId: 1 quantity: 21 isSellableWithoutStock: false price: currencyCode: EUR withTax: 4999 withoutTax: 4201 recommendedRetailPrice: tax: vat: amount: 798 rate: 0.19 appliedReductions: [ ] customData: { } - id: 5 referenceKey: external-reference attributes: size: id: 2 key: size label: Size type: '' multiSelect: false values: id: 18 label: M value: m firstLiveAt: '2023-09-22T14:35:29+00:00' createdAt: '2023-09-22T14:34:45+00:00' updatedAt: '2024-04-23T03:17:39+00:00' stock: supplierId: 3 warehouseId: 1 quantity: 7 isSellableWithoutStock: false price: currencyCode: EUR withTax: 4999 withoutTax: 4201 recommendedRetailPrice: tax: vat: amount: 798 rate: 0.19 appliedReductions: [ ] customData: { } customData: { } '400': description: required query parameter missing / invalid '401': description: authentication failed x-codeSamples: - lang: 'bash' label: 'CLI' source: | curl --location 'https://{{tenant-space}}.storefront.api.scayle.cloud/v1/products?shopId={{shopId}}' - lang: 'ts' label: 'Typescript' source: | const response = await client.products.query({}); console.log(response.entities) /v1/products/{productId}: get: tags: - products summary: Get a product description: Get one product by productId. operationId: fetch-product-by-id parameters: - name: productId in: path description: Get product with specified `productId`. required: true explode: false schema: type: integer - $ref: '#/components/parameters/campaignKey' - $ref: '#/components/parameters/productsWith' - $ref: '#/components/parameters/pricePromotionKey' responses: '200': description: successful operation content: application/json: schema: $ref: '#/components/schemas/Product' example: id: 7 isActive: true isSoldOut: false isNew: false createdAt: '2023-09-22T14:34:44+00:00' updatedAt: '2024-04-10T10:30:08+00:00' indexedAt: '2024-04-23T17:22:14+00:00' firstLiveAt: '2023-09-22T14:35:29+00:00' masterKey: master-key referenceKey: external-reference attributes: name: id: 20005 key: name label: Name type: '' multiSelect: false values: id: 20005 label: Women dress value: name color: id: 1 key: color label: Color type: '' multiSelect: true values: - id: 38932 label: Black value: black brand: id: 3 key: brand label: Brand type: '' multiSelect: false values: id: 232 label: SCAYLE value: scayle advancedAttributes: combineWith: id: 1223 key: combineWith label: Combine with Products type: '' values: - fieldSet: - - value: '51' - value: '63' - value: '27' groupSet: [ ] images: - hash: images/52d08cac15a71b5c02428c7989f634b9 attributes: imageFocus: id: 1253 key: imageFocus label: Image Focus type: '' multiSelect: false values: id: 66484 label: Product value: product - hash: images/3e81768c43aab1d12b3c53956a64ff2d.jpg attributes: imageFocus: id: 1253 key: imageFocus label: Image Focus type: '' multiSelect: false values: id: 66483 label: Detail value: detail variants: - id: 1 referenceKey: external-reference attributes: size: id: 2 key: size label: Size type: '' multiSelect: false values: id: 15 label: S value: s firstLiveAt: '2023-09-22T14:36:42+00:00' createdAt: '2023-09-22T14:34:45+00:00' updatedAt: '2024-04-23T09:32:13+00:00' stock: supplierId: 3 warehouseId: 1 quantity: 21 isSellableWithoutStock: false price: currencyCode: EUR withTax: 4999 withoutTax: 4201 recommendedRetailPrice: tax: vat: amount: 798 rate: 0.19 appliedReductions: [ ] customData: { } - id: 5 referenceKey: external-reference attributes: size: id: 2 key: size label: Size type: '' multiSelect: false values: id: 18 label: M value: m firstLiveAt: '2023-09-22T14:35:29+00:00' createdAt: '2023-09-22T14:34:45+00:00' updatedAt: '2024-04-23T03:17:39+00:00' stock: supplierId: 3 warehouseId: 1 quantity: 7 isSellableWithoutStock: false price: currencyCode: EUR withTax: 4999 withoutTax: 4201 recommendedRetailPrice: tax: vat: amount: 798 rate: 0.19 appliedReductions: [ ] customData: { } customData: { } '400': description: required query parameter missing / invalid '401': description: authentication failed x-codeSamples: - lang: 'bash' label: 'CLI' source: | curl --location 'https://{{tenant-space}}.storefront.api.scayle.cloud/v1/products/{{productId}}?shopId={{shopId}}' - lang: 'ts' label: 'Typescript' source: | const product = await client.products.getById(1); console.log(product.referenceKey) # Categories /v1/categories: get: tags: - categories summary: List categories description: | Each product can be assigned to one or more shop categories in a hierarchical shop category tree. You can use `/categories to get all categories. By default the categories will be returned as a tree in it's hierarchical order. This can be changes with the `format` parameter. To retrieve only specific categories the `ids` parameter can be used e.g.: `/categories?ids=123,456,789`. You can also get individual categories with `/v1/categories/{categoryId}` or `/v1/categories/{categoryPath}`. operationId: fetch-categories parameters: - $ref: '#/components/parameters/categoriesIds' - $ref: '#/components/parameters/categoriesFormat' - $ref: '#/components/parameters/categoriesShowHidden' - $ref: '#/components/parameters/categoriesDepth' - $ref: '#/components/parameters/categoriesWith' - $ref: '#/components/parameters/locale' responses: '200': description: successful operation content: application/json: schema: type: array items: $ref: '#/components/schemas/Category' example: - id: 1 path: "/women" name: Women slug: women parentId: 0 rootlineIds: [1] childrenIds: [2, 3] isHidden: false depth: 1 supportedFilter: [size, material] shopLevelCustomData: {} countryLevelCustomData: {} children: - id: 2 path: "/women/clothing" name: Women clothing slug: clothing parentId: 1 rootlineIds: [1, 2] isHidden: false depth: 2 supportedFilter: [size, material, style] shopLevelCustomData: {} countryLevelCustomData: {} children: [] childrenIds: [] properties: [] - id: 3 path: "/women/shoes" name: Shoes slug: shoes parentId: 1 rootlineIds: [1, 3] childrenIds: [] properties: [] isHidden: false depth: 2 supportedFilter: [size, material, heel] shopLevelCustomData: {} countryLevelCustomData: {} children: [] '400': description: required query parameter missing / invalid '401': description: authentication failed x-codeSamples: - lang: 'bash' label: 'CLI' source: | curl --location 'https://{{tenant-space}}.storefront.api.scayle.cloud/v1/categories?shopId={{shopId}}' - lang: 'ts' label: 'Typescript' source: | const categories = await client.categories.getRoots({}); console.log(categories[0].name); /v1/categories/{category}: get: tags: - categories summary: Get a category description: | Get category information for the specified categoryId or category path for example, `/v1/categories/20204` or `/v1/categories/women/clothing`. operationId: fetch-category-by-id parameters: - $ref: '#/components/parameters/category' - $ref: '#/components/parameters/categoriesFormat' - $ref: '#/components/parameters/categoriesShowHidden' - $ref: '#/components/parameters/categoriesDepth' - $ref: '#/components/parameters/categoriesWith' - $ref: '#/components/parameters/locale' responses: '200': description: successful operation content: application/json: schema: $ref: '#/components/schemas/Category' example: id: 3 path: "/women/shoes" name: Shoes slug: shoes parentId: 1 rootlineIds: [ 1, 3 ] childrenIds: [ ] properties: [ ] isHidden: false depth: 2 supportedFilter: [ size, material, heel ] shopLevelCustomData: { } countryLevelCustomData: { } children: [ ] '400': description: required query parameter missing / invalid '401': description: authentication failed '404': description: category not found x-codeSamples: - lang: 'bash' label: 'CLI' source: | curl --location 'https://{{tenant-space}}.storefront.api.scayle.cloud/v1/categories/{{category}}?shopId={{shopId}}' - lang: 'ts' label: 'Typescript' source: | // Get a category by ID const category = await client.categories.getById(6); console.log(category.name); // Get a category by path const category = await client.categories.getByPath( [ "frauen", "bekleidung", "shirts" ] ); console.log(category.name); # Attributes /v1/attributes: get: tags: - attributes summary: List attributes description: | To work with attributes, we distinguish between __attribute groups__ and __attribute values__: * Each product can be assigned to many __attribute values__, for example: `white` or `M`. * Each attribute belongs to exactly one __attribute group__, for example: `color` or `size`. When generally talking about attributes, both [attribute groups](/en/user-guide/settings/product-structure/attributes) and attribute values are sometimes referred to as just __attributes__. To avoid confusion when addressing technical details, use the more specific terms __attribute groups__ and __attribute values__. You can use `/attributes` to retrieve all your attribute groups. To get only a few attribute groups, you can specify their attribute group IDs or their attribute group names. You can also get individual attribute groups and their attribute values with `/v1/attributes/{attributeGroupName}`. operationId: fetch-attributes parameters: - $ref: '#/components/parameters/attributeGroupNames' - $ref: '#/components/parameters/attributeGroupIds' - $ref: '#/components/parameters/attributeGroupWith' - $ref: '#/components/parameters/shopId' responses: 200: description: successful operation content: application/json: schema: type: array items: $ref: '#/components/schemas/Attribute' example: - id: 1 key: color label: Color type: '' multiSelect: true - id: 2 key: size label: Size type: '' multiSelect: false - id: 3 key: brand label: Brand type: '' multiSelect: false 400: $ref: '#/components/responses/RequestError' 401: $ref: '#/components/responses/Unauthorized' 404: $ref: '#/components/responses/NotFound' x-codeSamples: - lang: 'bash' label: 'CLI' source: | curl --location 'https://{{tenant-space}}.storefront.api.scayle.cloud/v1/attributes?shopId={{shopId}}' /v1/attributes/{groupName}: get: tags: - attributes summary: Get an attribute description: Get attribute group specified by `groupName`. The response will also include the available attribute values for the attribute group. operationId: fetch-attribute-by-key parameters: - $ref: '#/components/parameters/attributeGroupName' - $ref: '#/components/parameters/shopId' responses: 200: description: successful operation content: application/json: schema: $ref: '#/components/schemas/Attribute' example: id: 1 key: color label: Color type: '' multiSelect: true 400: $ref: '#/components/responses/RequestError' 401: $ref: '#/components/responses/Unauthorized' 404: $ref: '#/components/responses/NotFound' x-codeSamples: - lang: 'bash' label: 'CLI' source: | curl --location 'https://{{tenant-space}}.storefront.api.scayle.cloud/v1/attributes/{{groupName}}?shopId={{shopId}}' - lang: 'ts' label: 'Typescript' source: | const attribute = await client.attributes.getByKey("color"); console.log(attribute) # Campaigns /v1/campaigns: get: tags: - campaigns summary: List campaigns description: | This endpoint shows all campaigns that are available for the shop. Campaigns are used to allow temporary discounts on products. After the indexing process completes, campaign details become immediately available. However, developers should be cautious. Before displaying a campaign, always validate the 'start_at' and 'end_at' fields. Failure to do so might result in campaigns displaying earlier than intended. operationId: fetch-campaigns parameters: - $ref: '#/components/parameters/sortCampaigns' - $ref: '#/components/parameters/sortDir' - $ref: '#/components/parameters/page' - $ref: '#/components/parameters/perPage' - $ref: '#/components/parameters/limit' - $ref: '#/components/parameters/offset' responses: '200': description: successful operation content: application/json: schema: $ref: '#/components/schemas/CampaignsResponse' example: pagination: current: 1 total: 2 perPage: 1 page: 1 first: 1 prev: 1 next: 2 last: 2 entities: - id: 1 name: scayle_campaign key: 'ca' description: Our first campaign. reduction: 10 start_at: '2024-05-1T11:00:00+00:00' end_at: '2024-05-6T23:00:00+00:00' customData: { } '401': description: authentication failed x-codeSamples: - lang: 'bash' label: 'CLI' source: | curl --location 'https://{{tenant-space}}.storefront.api.scayle.cloud/v1/campaigns?shopId={{shopId}}' - lang: 'ts' label: 'Typescript' source: | const response = await client.campaigns.get(); console.log(response.entities[0].key); /v1/campaigns/{campaignId}: get: tags: - campaigns summary: Get a campaign description: | Get one campaign by campaignId. operationId: fetch-campaign-by-id parameters: - name: campaignId in: path description: Campaign id required: true explode: false schema: type: integer responses: '200': description: successful operation content: application/json: schema: $ref: '#/components/schemas/Campaign' example: id: 1 name: scayle_campaign key: 'ca' description: Our first campaign. reduction: 10 start_at: '2024-05-1T11:00:00+00:00' end_at: '2024-05-6T23:00:00+00:00' customData: { } '401': description: authentication failed '404': description: "It was not possible possible to find the campaign" x-codeSamples: - lang: 'bash' label: 'CLI' source: | curl --location 'https://{{tenant-space}}.storefront.api.scayle.cloud/v1/campaigns/{{campaignId}}?shopId={{shopId}}' - lang: 'ts' label: 'Typescript' source: | const campaign = await client.campaigns.getById(1); console.log(campaign.key); # Search /v1/search/resolve: get: tags: - search-v1 summary: Resolve v1 description: | This endpoint is intended to provide one best match. The request needs to match at least one category and one attribute. For example, searching for `pants black denim useless` would return category `pants` that have two attributes: `black` and `denim`. The `useless` will be discarded. If the best match was found, it will return the relevant result; otherwise, it will return nothing. A detailed explanation of the functionality can be found in [SCAYLE Panel developer guide](/en/developer-guide/products/search#resolve) operationId: fetch-search-resolve parameters: - $ref: '#/components/parameters/searchTerm' - $ref: '#/components/parameters/categoryId' responses: '200': description: successful operation content: application/json: schema: $ref: '#/components/schemas/SearchResolveResponse' '401': description: authentication failed '400': description: term not provided '422': description: formal validation failure (see schema) /v1/typeahead: post: tags: - search-v1 summary: Typeahead v1 description: | The endpoint searches and returns: - brands by their name - categories by their name or their synonyms - products by their name, brand, and attributes (or attribute synonyms) When there is an exact one-to-one match present in the results, it is placed under the `topMatch` property. The rest of the results are sorted by relevancy and placed under the `suggestions` property. Sorting gives more weight to categories and brands, so products are generally placed below categories and brands. The suggestions array has two types of objects: - `BrandOrCategory` object, which is either a brand or category. Whether it is a brand or category can be identified by the property `primaryMatch`. The brand suggestions will also include the most relevant category under the `category` property. - product object When the search term finds a matching attribute, the attribute is then applied as a filter to the brand and category searches, adjusting the product count. Applied filters can be found under the `attributeFilters` property. **Please use the `?fullAttributeValue=true` parameter for all searches**. The old response that returns only attribute IDs is deprecated. The response will default to full attribute values in the future. operationId: fetch-typeahead-suggestions-post parameters: - $ref: '#/components/parameters/typeaheadTerm' - $ref: '#/components/parameters/fullAttributeValue' - $ref: '#/components/parameters/typeaheadLimit' - $ref: '#/components/parameters/typeaheadWith' - $ref: '#/components/parameters/typeaheadDepth' - $ref: '#/components/parameters/categoryId' requestBody: #TypeaheadRequestBody content: application/json: schema: $ref: '#/components/schemas/TypeaheadRequestBody' responses: '200': description: successful operation content: application/json: schema: $ref: '#/components/schemas/TypeaheadResponse' '400': description: required query parameter missing / query parameter invalid '401': description: authentication failed # Search V2 /v2/search/suggestions: get: tags: - search-v2 summary: Suggestions v2 description: | The endpoint searches and returns: - categories by their name - products by their unique ids (reference keys, EANs or internal ids) The purpose of this endpoint is to provide category suggestions based on the given search term. Additionally this endpoint might provide product suggestions, but for this to happen there need to be an exact match between the search term and one of the searchable ids. The response of the suggestions endpoint can be tuned using the synonyms settings in the SCAYLE panel. __Word Synonyms__ enable configuration of multiple words as a synonym of a particular word. For example, "babyleggings" can be set as a synonym for "baby leggings". This will ensure that a typeahead search with keyword "babyleggings" points to products that have "baby leggings" in the product specification. __Category synonyms__ allow mapping of certain words to categories. Example the word "office" can be mapped to a category /women/clothing/blazers. Setting this configuration will ensure that a /typeahead search with the keyword "office" returns the category /women/clothing/blazers. A detailed explanation of the functionality can be found in [SCAYLE Panel developer guide](/en/developer-guide/products/search#suggestions) operationId: fetch-search-v2-suggestions-get parameters: - $ref: '#/components/parameters/searchV2Term' - $ref: '#/components/parameters/searchV2With' - $ref: '#/components/parameters/searchV2CategoryDepth' - $ref: '#/components/parameters/searchV2ShowHiddenCategories' - $ref: '#/components/parameters/categoryId' responses: '200': description: successful operation content: application/json: schema: $ref: '#/components/schemas/SearchV2SuggestionsResponse' example: suggestions: - type: category categorySuggestion: category: id: 1 path: "/women" name: Women slug: women parentId: 0 rootlineIds: [ 1 ] childrenIds: [ 2, 3 ] isHidden: false depth: 1 supportedFilter: [ size, material ] shopLevelCustomData: { } countryLevelCustomData: { } filters: - type: attribute attributeFilter: group: id: 1 key: color label: Color type: multiSelect: true values: - name: Blue id: 27 value: blue '401': description: authentication failed '400': description: required query parameter missing / query parameter invalid x-codeSamples: - lang: 'bash' label: 'CLI' source: | curl --location 'https://{{tenant-space}}.storefront.api.scayle.cloud/v2/search/suggestions?term={{term}}&shopId={{shopId}}' - lang: 'ts' label: 'Typescript' source: | const response = await client.searchv2.suggestions("blue jeans"); console.log(response); /v2/search/resolve: get: tags: - search-v2 summary: Resolve v2 description: | The endpoint searches and returns a category that is matched by the name or a product that is matched by one of its ids. The purpose of this endpoint is to redirect a user to a specific entity, either a category or a product when he inputs a full search query. The response of the resolve endpoint can be tuned using the synonyms settings in the SCAYLE panel. __Word Synonyms__ enable configuration of multiple words as a synonym of a particular word. For example, "babyleggings" can be set as a synonym for "baby leggings". This will ensure that a typeahead search with keyword "babyleggings" points to products that have "baby leggings" in the product specification. __Category synonyms__ allow mapping of certain words to categories. Example the word "office" can be mapped to a category /women/clothing/blazers. Setting this configuration will ensure that a /typeahead search with the keyword "office" returns the category /women/clothing/blazers. A detailed explanation of the functionality can be found in [SCAYLE Panel developer guide](/en/developer-guide/products/search#suggestions) operationId: fetch-search-v2-resolve-get parameters: - $ref: '#/components/parameters/searchV2Term' - $ref: '#/components/parameters/searchV2With' - $ref: '#/components/parameters/searchV2CategoryDepth' - $ref: '#/components/parameters/searchV2ShowHiddenCategories' - $ref: '#/components/parameters/categoryId' responses: '200': description: successful operation content: application/json: schema: $ref: '#/components/schemas/SearchV2ResolveResponse' examples: ProductSuggestion: value: type: product productSuggestion: product: id: 7 isActive: true isSoldOut: false isNew: false createdAt: '2023-09-22T14:34:44+00:00' updatedAt: '2024-04-10T10:30:08+00:00' indexedAt: '2024-04-23T17:22:14+00:00' firstLiveAt: '2023-09-22T14:35:29+00:00' masterKey: master-key referenceKey: external-reference attributes: name: id: 20005 key: name label: Name type: '' multiSelect: false values: id: 20005 label: Women dress value: name color: id: 1 key: color label: Color type: '' multiSelect: true values: - id: 38932 label: Black value: black brand: id: 3 key: brand label: Brand type: '' multiSelect: false values: id: 232 label: SCAYLE value: scayle advancedAttributes: combineWith: id: 1223 key: combineWith label: Combine with Products type: '' values: - fieldSet: - - value: '51' - value: '63' - value: '27' groupSet: [ ] images: - hash: images/52d08cac15a71b5c02428c7989f634b9 attributes: imageFocus: id: 1253 key: imageFocus label: Image Focus type: '' multiSelect: false values: id: 66484 label: Product value: product - hash: images/3e81768c43aab1d12b3c53956a64ff2d.jpg attributes: imageFocus: id: 1253 key: imageFocus label: Image Focus type: '' multiSelect: false values: id: 66483 label: Detail value: detail variants: - id: 1 referenceKey: external-reference attributes: size: id: 2 key: size label: Size type: '' multiSelect: false values: id: 15 label: S value: s firstLiveAt: '2023-09-22T14:36:42+00:00' createdAt: '2023-09-22T14:34:45+00:00' updatedAt: '2024-04-23T09:32:13+00:00' stock: supplierId: 3 warehouseId: 1 quantity: 21 isSellableWithoutStock: false price: currencyCode: EUR withTax: 4999 withoutTax: 4201 recommendedRetailPrice: tax: vat: amount: 798 rate: 0.19 appliedReductions: [ ] customData: { } - id: 5 referenceKey: external-reference attributes: size: id: 2 key: size label: Size type: '' multiSelect: false values: id: 18 label: M value: m firstLiveAt: '2023-09-22T14:35:29+00:00' createdAt: '2023-09-22T14:34:45+00:00' updatedAt: '2024-04-23T03:17:39+00:00' stock: supplierId: 3 warehouseId: 1 quantity: 7 isSellableWithoutStock: false price: currencyCode: EUR withTax: 4999 withoutTax: 4201 recommendedRetailPrice: tax: vat: amount: 798 rate: 0.19 appliedReductions: [ ] customData: { } customData: { } CategorySuggestion: value: type: category categorySuggestion: category: id: 1 path: "/women" name: Women slug: women parentId: 0 rootlineIds: [ 1 ] childrenIds: [ 2, 3 ] isHidden: false depth: 1 supportedFilter: [ size, material ] shopLevelCustomData: { } countryLevelCustomData: { } filters: - type: attribute attributeFilter: group: id: 1 key: color label: Color type: multiSelect: true values: - name: Blue id: 27 value: blue '401': description: authentication failed '400': description: required query parameter missing / query parameter invalid x-codeSamples: - lang: 'bash' label: 'CLI' source: | curl --location 'https://{{tenant-space}}.storefront.api.scayle.cloud/v2/search/resolve?term={{term}}&shopId={{shopId}}' - lang: 'ts' label: 'Typescript' source: | const response = await client.searchv2.resolve("blue jeans"); console.log(response); # Filters /v1/filters: get: tags: - filters summary: List filters description: | Filters endpoint should be used to display a reduced list of products based on specific criteria. Often, it is the same criteria, as it was sent to show products. Multiple filter criteria can and should be combined in the single request. As an example, the following request: `/v1/filters?filters[category]=235870&filters[sale]=true&with=values` will restrict the response to include only the available filter values for a specific *category* for products on *sale*. When adding the `with=values` parameter, the response will include values and their product counts for the combination of the filters used. In the next section, all the available filters will be described in detail. __Note__: Inactive products (sold out) are always automatically filtered out from the filter's response, and they are not taken into account for any of the described filters below. operationId: fetch-filters parameters: - $ref: '#/components/parameters/filterCategory' - $ref: '#/components/parameters/filterEan' - $ref: '#/components/parameters/filterTerm' - $ref: '#/components/parameters/disableFuzziness' - $ref: '#/components/parameters/filterIsnew' - $ref: '#/components/parameters/filterMaxPrice' - $ref: '#/components/parameters/filterMinPrice' - $ref: '#/components/parameters/filterSale' - $ref: '#/components/parameters/filterAttributeKey' - $ref: '#/components/parameters/negativeFilterAttributeKey' - $ref: '#/components/parameters/orFiltersOperator' - $ref: '#/components/parameters/filterMasterKey' - $ref: '#/components/parameters/filterReferenceKey' - $ref: '#/components/parameters/filterVariantReferenceKey' - $ref: '#/components/parameters/filterMerchantId' - $ref: '#/components/parameters/filterHasCampaignReduction' - $ref: '#/components/parameters/campaignKey' - $ref: '#/components/parameters/includeSoldOut' - name: with in: query description: | The `with` parameter can also include related resources of a filter in the response. * By calling `with=values`, the parameter will include the available filter values and product counts for each filter. required: false explode: false schema: type: array example: [values] items: type: string responses: '200': description: successful operation content: application/json: schema: type: array items: $ref: '#/components/schemas/Filter' example: - id: slug: prices name: Prices attributeGroupType: computed_attribute type: range values: - min: 490 max: 2990 productCount: 42 - id: slug: sale name: Sale attributeGroupType: computed_attribute type: boolean values: - name: false productCount: 12 - name: true productCount: 30 - id: slug: max_savings_percentage name: Savings attributeGroupType: computed_attribute type: range values: - min: 0 max: 20 productCount: 42 - id: 2 slug: size name: Size attributeGroupType: '' type: attributes values: - name: S productCount: 11 id: 15 value: s - name: M productCount: 23 id: 18 value: m - name: L productCount: 8 id: 23 value: l - id: 1 slug: color name: Color attributeGroupType: '' type: attributes values: - name: Black productCount: 9 id: 21 value: black - name: Blue productCount: 15 id: 27 value: blue - name: Green productCount: 18 id: 31 value: green - id: 3 slug: brand name: Brand attributeGroupType: '' type: attributes values: - name: SCAYLE productCount: 36 id: 37 value: scayle - name: About You productCount: 6 id: 62 value: about_you - id: 318 slug: materialStyle name: Material attributeGroupType: design type: attributes values: - name: Cotton productCount: 32 id: 87 value: cotton - name: Jersey productCount: 10 id: 91 value: jersey x-codeSamples: - lang: 'bash' label: 'CLI' source: | curl --location 'https://{{tenant-space}}.storefront.api.scayle.cloud/v1/filters?shopId={{shopId}}' - lang: 'ts' label: 'Typescript' source: | const filters = await client.filters.get(); console.log(filters); /v1/filters/{groupName}/values: get: tags: - filters summary: List values description: | Retrieve the filter values and product counts for a specific `filterGroup`, for example: `/v1/filters/sale/values?filters[category]=20201` will show how many products in the category "20201" are on sale and how many of them are not on sale. Any valid attribute group can be used. Additionally, these special filters are supported: `sale`, `categoryids`, `savings`, `prices`, `brands`, and `isnew`. operationId: fetch-filter-by-group parameters: - name: groupName in: path description: Group Name required: true explode: false schema: type: string - $ref: '#/components/parameters/filterCategory' - $ref: '#/components/parameters/filterTerm' - $ref: '#/components/parameters/disableFuzziness' - $ref: '#/components/parameters/filterIsnew' - $ref: '#/components/parameters/filterAttributeKey' - $ref: '#/components/parameters/negativeFilterAttributeKey' - $ref: '#/components/parameters/campaignKey' responses: '200': description: successful operation content: application/json: schema: $ref: '#/components/schemas/FilterValues' example: - name: S productCount: 11 id: 15 value: s - name: M productCount: 23 id: 18 value: m - name: L productCount: 8 id: 23 value: l x-codeSamples: - lang: 'bash' label: 'CLI' source: | curl --location 'https://{{tenant-space}}.storefront.api.scayle.cloud/v1/filters/{{groupName}}/values?shopId={{shopId}}' - lang: 'ts' label: 'Typescript' source: | const values = await client.filters.getValues("sale"); console.log(values) # Wishlist /v1/wishlists/{wishlistId}: get: tags: - wishlists summary: Get a wishlist description: | This endpoint allows you to retrieve items previously placed in a customer's wishlist. An example would be: `/v1/wishlists/`. * The wishlist key is created on demand when an item is added to the wishlist. * Using the `with=` parameter, it is possible to retrieve extra information in the response. Please check the next section for all options. operationId: fetch-wishlist-by-key parameters: - $ref: '#/components/parameters/wishlistId' - $ref: '#/components/parameters/campaignKey' - $ref: '#/components/parameters/pricePromotionKey' - $ref: '#/components/parameters/displayHighestPpkPrice' - $ref: '#/components/parameters/forcePPKSaleCategories' - $ref: '#/components/parameters/wishlistWith' responses: 200: description: request successful content: application/json: schema: $ref: '#/components/schemas/Wishlist' example: $ref: '#/components/examples/wishlist' 400: description: only one parameter must be set (variantId or productId) / either variantId or productId must be set 401: $ref: '#/components/responses/Unauthorized' 404: $ref: '#/components/responses/NotFound' x-codeSamples: - lang: 'bash' label: 'CLI' source: | curl --location 'https://{{tenant-space}}.storefront.api.scayle.cloud/v1/wishlists/{{wishlistId}}?shopId={{shopId}}' \ --header 'X-Access-Token: {{ACCESSTOKEN}}' - lang: 'ts' label: 'Typescript' source: | const response = await client.wishlist.get("myshop_customer_1234"); console.log(response.items); /v1/wishlists/{wishlistId}/items: post: tags: - wishlists summary: Add an item description: | Through this endpoint, you are able to add items to a customer's wishlist. Some important points should be taken into consideration: * Items might be added both using its product ID or the variant ID. * There is a limit regarding the maximum amount of items that might be added to the wishlist. The current limit is **200 items**. operationId: add-wishlist-item parameters: - $ref: '#/components/parameters/wishlistId' - $ref: '#/components/parameters/campaignKey' - $ref: '#/components/parameters/pricePromotionKey' - $ref: '#/components/parameters/displayHighestPpkPrice' - $ref: '#/components/parameters/forcePPKSaleCategories' - $ref: '#/components/parameters/wishlistWith' requestBody: content: application/json: schema: $ref: '#/components/schemas/CreateWishlistBody' examples: WithProductId: value: productId: 7 quantity: 1 WithVariantId: value: variantId: 5 quantity: 1 responses: 200: description: request successful content: application/json: schema: $ref: '#/components/schemas/Wishlist' example: $ref: '#/components/examples/wishlist' 400: description: only one parameter must be set (variantId or productId) / either variantId or productId must be set 401: $ref: '#/components/responses/Unauthorized' 404: $ref: '#/components/responses/NotFound' 409: description: conflict - wishlist item for given variant already exists 412: description: product currently unavailable / no variant for product id found 413: description: wishlist exceeds maximum items size limitation x-codeSamples: - lang: 'bash' label: 'CLI' source: | curl --location --request POST 'https://{{tenant-space}}.storefront.api.scayle.cloud/v1/wishlists/{{wishlistId}}/items?shopId={{shopId}}' \ --header 'X-Access-Token: {{ACCESSTOKEN}}' \ --data '{ "variantId": 1 }' - lang: 'ts' label: 'Typescript' source: | const response = await client.wishlist.addItem( "myshop_customer_1234", { variantId: 1 } ); console.log(response.wishlist); /v1/wishlists/{wishlistId}/items/{itemKey}: delete: tags: - wishlists summary: Remove a item description: | This endpoint allows you to remove an item previously added to any given wishlist. __Note__: It will remove single items from the wishlist, not the entire wishlist. operationId: remove-wishlist-item parameters: - $ref: '#/components/parameters/wishlistId' - $ref: '#/components/parameters/wishlistItemKey' - $ref: '#/components/parameters/campaignKey' - $ref: '#/components/parameters/pricePromotionKey' - $ref: '#/components/parameters/displayHighestPpkPrice' - $ref: '#/components/parameters/forcePPKSaleCategories' - $ref: '#/components/parameters/wishlistWith' responses: 200: description: request successful content: application/json: schema: $ref: '#/components/schemas/Wishlist' example: $ref: '#/components/examples/wishlist' 401: $ref: '#/components/responses/Unauthorized' 404: $ref: '#/components/responses/NotFound' x-codeSamples: - lang: 'bash' label: 'CLI' source: | curl --location --request DELETE 'https://{{tenant-space}}.storefront.api.scayle.cloud/v1/wishlists/{{wishlistId}}/items/{{itemKey}}?shopId={{shopId}}' \ --header 'X-Access-Token: {{ACCESSTOKEN}}' - lang: 'ts' label: 'Typescript' source: | const response = await client.wishlist.deleteItem( "myshop_customer_1234", "c4ca4238a0b923820dcc509a6f75849b" // item key ); console.log(response.items); # Shop Configuration /v1/shop-configuration: get: tags: - shop-configuration summary: Get the configuration description: | Retrieve information about the current shop. operationId: fetch-shop-configuration parameters: - $ref: '#/components/parameters/locale' responses: '200': description: successful operation content: application/json: schema: $ref: '#/components/schemas/ShopConfiguration' example: shopId: 1 name: scayle shopCustomData: { } properties: [ ] customData: { } country: DE '401': description: authentication failed '404': description: item not found x-codeSamples: - lang: 'bash' label: 'CLI' source: | curl --location 'https://{{tenant-space}}.storefront.api.scayle.cloud/v1/shop-configuration?shopId={{shopId}}' - lang: 'ts' label: 'Typescript' source: | const configuration = await client.shopConfiguration.get(); console.log(configuration.name); # Navigation /v1/navigation/trees: get: tags: - navigation summary: List navigation trees description: | Navigation trees map to menus and sub-menus on the front-end. Each shop can be assigned one ore more navigation trees. This End-point retrieves the complete list of navigation trees that are created for a shop. You can also get individual navigation trees with `/v1/navigation/trees/{navigationTreeId}`. parameters: - $ref: '#/components/parameters/locale' - $ref: '#/components/parameters/categoryWith' operationId: fetch-navigation-trees responses: '200': description: request successful content: application/json: schema: $ref: '#/components/schemas/NavigationTreeResponse' '401': description: authentication failed x-codeSamples: - lang: 'bash' label: 'CLI' source: | curl --location 'https://{{tenant-space}}.storefront.api.scayle.cloud/v1/navigation/trees?shopId={{shopId}}' - lang: 'ts' label: 'Typescript' source: | const navigations = await client.navigation.getAll(); console.log(navigations[0].name); /v1/navigation/trees/{navigationTreeId}: get: tags: - navigation summary: Get a navigation tree description: | Get navigation tree by navigationTreeId, for example, `/v1/navigation/trees/123`. operationId: fetch-navigation-tree-by-id parameters: - name: navigationTreeId in: path description: Navigation tree ID required: true explode: false schema: type: integer example: 123 - $ref: '#/components/parameters/locale' - $ref: '#/components/parameters/categoryWith' responses: '200': description: request successful content: application/json: schema: $ref: '#/components/schemas/NavigationTree' '400': description: required query parameter missing / invalid '401': description: authentication failed '404': description: navigation tree not found x-codeSamples: - lang: 'bash' label: 'CLI' source: | curl --location 'https://{{tenant-space}}.storefront.api.scayle.cloud/v1/navigation/trees/{{navigationId}}?shopId={{shopId}}' - lang: 'ts' label: 'Typescript' source: | const navigationTree = await client.navigation.getById(1); console.log(navigationTree) # Brands /v1/brands: get: tags: - brands summary: List brands description: | Each product can be assigned to one or more brands. operationId: fetch-brands parameters: - $ref: '#/components/parameters/brandIds' - $ref: '#/components/parameters/brandSlugs' - $ref: '#/components/parameters/page' - $ref: '#/components/parameters/perPage' responses: 200: description: request successful content: application/json: schema: $ref: '#/components/schemas/BrandsResponse' example: pagination: current: 1 total: 5 perPage: 1 page: 1 first: 1 prev: 1 next: 2 last: 5 entities: - id: 1 slug: scayle name: SCAYLE externalReference: external-system-id group: default isActive: true logoHash: '' createdAt: '2019-06-05T09:11:25+00:00' updatedAt: '2019-06-05T09:11:25+00:00' indexedAt: '2024-04-22T00:07:01+00:00' customData: { } 400: $ref: '#/components/responses/RequestError' 401: $ref: '#/components/responses/Unauthorized' x-codeSamples: - lang: 'bash' label: 'CLI' source: | curl --location 'https://{{tenant-space}}.storefront.api.scayle.cloud/v1/brands?shopId={{shopId}}' - lang: 'ts' label: 'Typescript' source: | const brands = await client.brands.get(); console.log(brands.entities[0].name); /v1/brands/{brand}: get: tags: - brands summary: Get a brand description: | Retrieve a brand by its brandId or slug, for example, `/v1/brands/123` or `/v1/brands/abc` operationId: fetch-brand-by-id parameters: - name: brand in: path description: brandId or brand slug required: true explode: false schema: type: string example: "123" - name: forceSlug in: query description: When `forceSlug` is set to `true` (e.g. `/v1/brands/33?forceSlug=true`), the response will be the brand with the slug "33" not the brand with the ID 33. required: false explode: false schema: type: boolean example: true responses: 200: description: request successful content: application/json: schema: $ref: '#/components/schemas/Brand' example: id: 1 slug: scayle name: SCAYLE externalReference: external-system-id group: default isActive: true logoHash: '' createdAt: '2019-06-05T09:11:25+00:00' updatedAt: '2019-06-05T09:11:25+00:00' indexedAt: '2024-04-22T00:07:01+00:00' customData: { } 400: $ref: '#/components/responses/RequestError' 401: $ref: '#/components/responses/Unauthorized' 404: $ref: '#/components/responses/NotFound' x-codeSamples: - lang: 'bash' label: 'CLI' source: | curl --location 'https://{{tenant-space}}.storefront.api.scayle.cloud/v1/brands/{{brand}}?shopId={{shopId}}' - lang: 'ts' label: 'Typescript' source: | const brand = await client.brands.getById(44); console.log(brand.name); # Redirects /v1/redirects: get: tags: - redirects summary: List redirects description: | Redirects can be created on both the shop (global) and country levels. operationId: fetch-redirects responses: '200': description: request successful content: application/json: schema: $ref: '#/components/schemas/RedirectsResponse' example: pagination: current: 14 total: 14 perPage: 100 page: 1 first: 1 prev: 1 next: 1 last: 1 entities: - id: 1196 source: scayle\.com target: www.scayle.com statusCode: 301 priority: 1 isRegex: true - id: 1207 source: "^http://" target: https:// statusCode: 301 priority: 106 isRegex: true '401': description: authentication failed x-codeSamples: - lang: 'bash' label: 'CLI' source: | curl --location 'https://{{tenant-space}}.storefront.api.scayle.cloud/v1/redirects?shopId={{shopId}}' - lang: 'ts' label: 'Typescript' source: | const redirects = await client.redirects.get(); console.log(redirects); post: tags: - redirects summary: Match redirect description: | Matches a redirect for a given URL operationId: match-redirects requestBody: content: application/json: schema: $ref: '#/components/schemas/MatchRedirectBody' example: id: -1 source: http://scayle.com target: https://www.scayle.com statusCode: 301 responses: '200': description: request successful content: application/json: schema: $ref: '#/components/schemas/MatchRedirect' '401': description: authentication failed '404': description: there is no redirect for the requested url x-codeSamples: - lang: 'bash' label: 'CLI' source: | curl --location --request POST 'https://{{tenant-space}}.storefront.api.scayle.cloud/v1/redirects?shopId={{shopId}}' --data '{ "url": "example.com" }' - lang: 'ts' label: 'Typescript' source: | const redirect = await client.redirects.post(`example.com`); console.log(redirect.target); # Promotions /v1/promotions: get: tags: - promotions summary: List promotions description: | Retrieve promotions operationId: fetch-promotions parameters: - $ref: '#/components/parameters/promotionIds' - $ref: '#/components/parameters/activeAt' - $ref: '#/components/parameters/shopId' - $ref: '#/components/parameters/page' - $ref: '#/components/parameters/perPage' responses: '200': description: request successful content: application/json: schema: $ref: '#/components/schemas/PromotionsResponse' example: pagination: current: 4 total: 4 perPage: 100 page: 1 first: 1 prev: 1 next: 1 last: 1 entities: - id: 65e04665b1d03700f7864e4c name: SCAYLE Promo schedule: from: '2024-02-29T23:00:00Z' to: '2024-05-09T21:59:59Z' isActive: true effect: type: automatic_discount additionalData: type: relative value: 20 conditions: - level: global key: panels_automatic-discount_any_products_condition_e5b66afa5eacabdb6bb855c6a9344db49cc372b4 condition: size(payload.items) >= 1 - level: global key: panels_automatic-discount_minimum_order_amount_8000 condition: payload.totals.withTax >= 8000 customData: minOrderValue: 8000 terms: By buying Pullovers with the minimum order value of 80€, you get 20% off on any other product in your basket. The promotion lasts until May 9th 2024. priority: 1 tiers: [ ] '401': description: authentication failed x-codeSamples: - lang: 'bash' label: 'CLI' source: | curl --location 'https://{{tenant-space}}.storefront.api.scayle.cloud/v1/promotions?shopId={{shopId}}' - lang: 'ts' label: 'Typescript' source: | // Fetch all promotions const response = await client.promotions.get(); console.log(response.entities[0].name); // Fetch promotions by ids const response = await client.promotions.getByIds({ ids: ['promotionid_123', 'promotionid_456'] }); console.log(response.entities[0].name); components: schemas: # Product LowestPriorPrice: type: object description: Information about the lowest price in the past 30 days. required: - withTax - relativeDifferenceToPrice properties: withTax: type: integer description: The lowest price including tax. nullable: true relativeDifferenceToPrice: type: number format: float nullable: true description: | The relative difference from the lowest prior price to the current price. If the value is positive, it means that the current price is higher than the lowest prior price. If the value is negative, it means that the current price is lower than the lowest prior price. # Basket Types Basket: type: object properties: key: description: A unique key identifying the basket. type: string items: type: array items: $ref: '#/components/schemas/BasketItem' cost: $ref: '#/components/schemas/Price' packages: type: array items: $ref: '#/components/schemas/Package' applicablePromotions: type: array items: $ref: '#/components/schemas/ApplicablePromotion' x-ayOperations: - methodName: get operation: get operationId: fetch-basket-by-key path: baskets/{basketId} responseModel: Basket parameters: - name: basketId type: string - methodName: addItem operation: post operationId: add-basket-item path: baskets/{basketId}/items responseModel: Basket requestModel: CreateBasketItemBody parameters: - name: basketId type: string - methodName: remove operation: delete operationId: remove-basket-item path: baskets/{basketId}/items/{itemKey} responseModel: Basket parameters: - name: basketId type: string - name: itemKey type: string - methodName: update operation: patch operationId: update-basket-item path: baskets/{basketId}/items/{itemKey} responseModel: Basket requestModel: UpdateBasketItemBody parameters: - name: basketId type: string - name: itemKey type: string Packages: type: array items: $ref: '#/components/schemas/Package' Package: type: object description: | A group of items which will be sent together as a single logistical package. The items for the package can be found by iterating through the basket items and comparing the `packageId`. properties: id: type: integer carrierKey: type: string description: The carrier key which will deliver the package deliveryDate: $ref: '#/components/schemas/DeliveryDate' DeliveryDate: type: object description: The estimated delivery date for the package properties: min: type: string example: '2018-02-02' max: type: string example: '2018-02-05' ApplicablePromotion: type: object description: A promotion that would be valid if it's applied to the current basket. properties: itemId: type: string nullable: true description: The Basket Item ID to which the promotion should be applied. This can be null in case of a `bux_x_get_y` effect where the free item is not in the basket yet. promotion: $ref: '#/components/schemas/Promotion' BasketItem: type: object description: Describes a specific variant in a Basket with a given quantity. properties: key: type: string description: A unique key for the basket item which can be used for updating or deleting it. packageId: type: integer description: | The package in which the basket item will be send. Corresponds to a package id in the `packages` list of a `Basket`. quantity: type: integer description: The quantity of the item. availableQuantity: type: integer description: The total available quantity for the variant which can be added to the basket. status: type: string description: | The status of the basket item, either it is 'available' which means in stock or it's unavailable meaning it's out of stock. enum: - "available" - "unavailable" variant: $ref: '#/components/schemas/Variant' product: $ref: '#/components/schemas/Product' price: $ref: '#/components/schemas/BasketItemPrice' lowestPriorPrice: $ref: '#/components/schemas/LowestPriorPrice' promotionId: type: string description: The promotion which will be applied to the item. itemGroup: $ref: '#/components/schemas/ItemGroup' customData: $ref: "#/components/schemas/BasketItemCustomData" displayData: $ref: '#/components/schemas/BasketItemDisplayData' deliveryForecast: $ref: '#/components/schemas/DeliveryForecast' promotion: $ref: '#/components/schemas/BasketItemPromotion' BasketItemPrice: type: object properties: total: $ref: '#/components/schemas/Price' unit: $ref: '#/components/schemas/Price' ItemGroup: type: object description: An item group allows to define multiple basket items into a unit. properties: id: type: string description: | A unique identifier for the item group which should be used for all basket items of the item group. Any string based identifier can be chosen and it only has to be unique within the current basket. isMainItem: type: boolean description: | Whether or not the current item is the main item within the item group. This property can be used for display purposes to only show the main item within the Checkout. isRequired: type: boolean description: | Whether or not the item is required to be present for the item group. When you delete an item from your basket which is required for the item group, all other items assigned to the item group will also be deleted. DeliveryForecast: type: object properties: deliverable: $ref: '#/components/schemas/Deliverable' subsequentDelivery: $ref: '#/components/schemas/SubsequentDelivery' Deliverable: type: object properties: key: type: string quantity: type: integer SubsequentDelivery: type: object properties: key: type: string quantity: type: integer BasketItemDisplayData: description: | Display Data allows to show additional information next to each item during the SCAYLE Checkout process. The properties will remain attached to the basket item during the checkout and order process. type: object properties: meta: $ref: '#/components/schemas/DisplayDataValue' name: $ref: '#/components/schemas/DisplayDataValue' identifier: $ref: '#/components/schemas/DisplayDataValue' attribute-1: $ref: '#/components/schemas/DisplayDataValue' attribute-2: $ref: '#/components/schemas/DisplayDataValue' attribute-3: $ref: '#/components/schemas/DisplayDataValue' DisplayDataValue: type: object properties: key: type: string description: | A key identifying which data is displayed here. The value is not shown in the Scayle Checkout. example: 'size' label: type: string description: The label explaining the value which will be displayed in the Scayle Checkout for the Basket Item. example: Size value: type: string description: The value which will be displayed in the Scayle Checkout for the Basket Item. example: M BasketItemCustomData: type: object description: | Custom Data allows to store additional data on each basket item. The information is persisted during the order flow and will be accessible after Scayle's Checkout process on each order item. properties: pricePromotionKey: description: A price promotion key which will be used for this item during the Checkout process. type: string additionalProperties: true CreateBasketItemBody: type: object required: - variantId - quantity properties: quantity: type: integer description: The quantity for the variant. variantId: type: integer description: The variant to be added to the basket. promotionId: type: string description: An optional promotion ID which should be applied to this item. customData: $ref: '#/components/schemas/BasketItemCustomData' displayData: $ref: '#/components/schemas/BasketItemDisplayData' itemGroup: $ref: "#/components/schemas/ItemGroup" UpdateBasketItemBody: type: object required: - quantity properties: quantity: type: integer description: The updated quantity for the basket item. promotionId: type: string nullable: true description: | Updates the promotion id of the item. If the 'promotionId' property is not sent in the request no update is performed on the field. if the value is null then any previous applied promotion will be removed from the item. customData: $ref: '#/components/schemas/BasketItemCustomData' displayData: $ref: "#/components/schemas/BasketItemDisplayData" itemGroup: $ref: '#/components/schemas/ItemGroup' AdvancedAttribute: type: object required: - id - key - label - type - values properties: id: type: integer key: type: string label: type: string type: type: string nullable: true values: type: array items: $ref: '#/components/schemas/AdvancedAttributeGroupSet' AdvancedAttributeGroupSet: type: object required: - fieldSet - groupSet properties: fieldSet: type: array items: type: object groupSet: type: array items: $ref: '#/components/schemas/AdvancedAttributeGroupSet' Attribute: type: object required: - id - key - label - multiSelect - type properties: id: type: integer key: type: string description: Reference that identifies the attribute label: type: string description: The label that describes the attribute group will be set according to the shop's language in the SCAYLE Panel. multiSelect: type: boolean description: A flag which determines whether an attribute has a single or possibly multiple values. type: type: string description: Attribute type values: type: array nullable: true description: The values are a collection of attributes from the attribute group. items: $ref: '#/components/schemas/AttributeValue' x-ayObjects: - property: values isCollection: true className: AttributeValue x-ayOperations: - methodName: getByKey operation: get operationId: fetch-attribute-by-key path: attributes/{groupName} responseModel: Attribute withOptions: false parameters: - name: groupName type: string AttributeValue: type: object properties: id: type: integer example: 428 label: type: string example: "Tommy Jeans" value: type: string example: "hilfiger_denim" AppliedReduction: type: object required: - category - type - amount properties: amount: $ref: "#/components/schemas/AppliedReductionAmount" category: type: string enum: - sale - campaign - promotion example: campaign type: type: string example: relative AppliedReductionAmount: type: object properties: absoluteWithTax: type: integer relative: type: number WishlistItem: type: object required: - key - packageId - quantity - status - productId - customData properties: key: type: string example: "cafb0e089cb74691e66ca33a0c9954d9" packageId: type: integer example: 1 quantity: type: integer example: 2 status: type: string enum: - available - unavailable product: $ref: '#/components/schemas/Product' variant: $ref: '#/components/schemas/Variant' productId: type: integer example: 4468167 masterKey: type: string example: "35925-99" variantId: type: integer example: 38513903 customData: type: object additionalProperties: $ref: '#/components/schemas/CustomData' x-ayObjects: - property: product className: Product - property: variant className: Variant - property: customData className: CustomData BaseCategory: description: Array of the `baseCategories` attached to the product. type: object required: - categoryId - categoryName - categoryParentId - categoryPath properties: categoryId: type: integer description: Unique identifier of the category example: 1866 categoryName: type: string description: Name of the category example: Top categoryParentId : type: integer description: Parent ID of the category example: Top categoryPath: type: string description: Category path as text example: New|Fashion|Women|Top Brand: description: Brand information required: - id - slug - group - name - isActive - logoHash - createdAt - updatedAt - indexedAt - customData - externalReference type: object properties: id: type: integer description: The unique identifier of the brand (referred as `attributeId`), can be used for retrieving specific brand. ID which would be used to filter for brands in the `products` and `filters` endpoint example: 21 slug: type: string description: short text to describe the current category (usable, for example, in URLs as `fashion`). example: fashion name: type: string example: Fashion customData: $ref: '#/components/schemas/BrandCustomData' externalReference: type: string description: External reference set by the client to integrate a third-party party system. group: type: string description: Brand group. isActive: type: boolean description: Whether the brand is currently active or not. logoHash: type: string description: Logo hash used for generating the full url. createdAt: $ref: '#/components/schemas/Timestamp' updatedAt: $ref: '#/components/schemas/Timestamp' indexedAt: $ref: '#/components/schemas/Timestamp' x-ayObjects: - property: customData isCollection: true className: CustomData x-ayModels: - property: createdAt isTimestamp: true - property: updatedAt isTimestamp: true x-ayOperations: - methodName: get operation: get operationId: fetch-brands path: brands responseModel: BrandsResponse - methodName: getById operation: get operationId: fetch-brand-by-id path: brands/{brandId} responseModel: BrandsResponse parameters: - name: brandId type: integer BrandCustomData: description: Arbitrary custom data object to be added to the brand. type: object example: localizedJson: - key1: value1 localizedString: keyValue BrandsResponse: type: object properties: entities: type: array items: $ref: '#/components/schemas/Brand' pagination: oneOf: - $ref: '#/components/schemas/Pagination' - $ref: '#/components/schemas/OffsetPagination' x-ayObjects: - property: entities className: Brand isCollection: true BrandOrCategorySuggestion: type: object required: - attributeFilters - brand - category - primaryMatch - productCount - suggestion properties: attributeFilters: type: array items: type: object properties: id: type: integer example: 550 name: type: string example: "brand" slug: type: string description: short text to describe the current category (usable, for example, in URLs as `fashion`). example: brand values: type: array items: type: integer example: - 53709 brand: type: object nullable: true properties: id: type: integer example: 53709 name: type: string example: "Nike Sportswear" category: $ref: '#/components/schemas/Category' primaryMatch: type: string enum: - "brand" - "category" productCount: type: integer example: 140 suggestion: type: string example: "Nike Sportswear" Category: type: object required: - id - path - name - slug - parentId - rootlineIds - childrenIds - properties - isHidden - depth - supportedFilter - shopLevelCustomData properties: id: type: integer format: int64 description: The unique identifier of the category. path: type: string description: The slugs for all `rootlineIds` combined with `/` (e.g., `/women/fashion`). example: /women name: type: string description: The name of the category example: Women slug: type: string description: A short string to describe the current category (usable, for example, in URLs as). example: women parentId: description: The parent category ID (root-level categories have a parent ID of `0`) type: integer example: 20201 rootlineIds: type: array description: The IDs for the path from the topmost root category to the current category, which is included as the last item. items: type: integer example: [ 10, 12 ] childrenIds: type: array description: The child category IDs attached to the current category items: type: integer example: - 10 properties: type: array description: Properties attached to this category. items: $ref: '#/components/schemas/CategoryProperty' isHidden: type: boolean description: A flag that defines if a category should be displayed by the frontend example: false depth: type: integer description: The nesting level of the category (root-level depth = 1, child nodes = 2, child nodes' children = 3, etc.) example: 2 supportedFilter: type: array description: A list of filters that can be used for filtering products in the category items: type: string example: - "pattern" - "armLength" parent: nullable: true allOf: - $ref: '#/components/schemas/Category' shopLevelCustomData: type: object description: Additional category data defined on the shop level countryLevelCustomData: type: object description: Additional category data defined on the country level children: type: array items: $ref: '#/components/schemas/Category' description: | An array of child category objects. Returned if requested as `tree format` or using `with`. x-ayObjects: - property: parent className: Category - property: children isCollection: true className: Category x-ayOperations: - methodName: getRoots operation: get operationId: fetch-categories path: categories responseModel: Category isResponseCollection: true - methodName: getByIds operation: get operationId: fetch-categories path: categories responseModel: Category isResponseCollection: true parameters: - name: categoryIds type: array isQueryParameter: true queryName: ids - methodName: getById operation: get operationId: fetch-category-by-id path: categories/{categoryId} responseModel: Category parameters: - name: categoryId type: integer - methodName: getByPath operation: get operationId: fetch-category-by-id path: categories/{categoryPath} responseModel: Category parameters: - name: categoryPath type: string CategoryProperty: type: object required: - name - value properties: name: type: string example: "gender" value: nullable: true oneOf: - type: string - type: number example: "male" CustomData: type: object properties: key: type: string example: "value" value: type: string example: "value2" pricePromotionKey: type: string description: Adjust variant price based on the specified `pricePromotionKey`. If the variant does not have a matching price promotion, the default price is returned. example: "abc" ResponseCustomData: type: object CreateWishlistBody: type: object description: Either variantId or productId must be provided. properties: variantId: type: integer nullable: true description: Variant ID to add to the wishlist. example: 1 productId: type: integer nullable: true description: Product ID to add to the wishlist. When provided, the first found in-stock variant of the product will be added. customData: type: object additionalProperties: $ref: '#/components/schemas/CustomData' quantity: type: integer nullable: true description: The quantity for the variant. default: 1 DefiningAttribute: type: object required: - id - label properties: id: type: integer label: type: string FilterValues: oneOf: - type: array items: $ref: '#/components/schemas/AttributeFilterValue' - type: array items: $ref: '#/components/schemas/BooleanFilterValue' - type: array items: $ref: '#/components/schemas/RangeFilterValue' Filter: type: object required: - id - slug - name - attributeGroupType - type properties: id: type: integer nullable: true example: null name: type: string example: "Savings" slug: type: string description: short text to describe the current category (usable, for example, in URLs as `fashion`). example: "max_savings_percentage" attributeGroupType: type: string example: "computed_attribute" type: type: string example: "range" values: $ref: '#/components/schemas/FilterValues' x-ayModels: - property: values discriminatedBy: type discriminatorMapping: - value: boolean className: BooleanFilterValue isCollection: true fieldName: booleanFilterValues - value: range className: RangeFilterValue isCollection: true fieldName: rangeFilterValues - value: attributes className: AttributeFilterValue isCollection: true fieldName: attributeFilterValues x-ayOperations: - methodName: get operation: get operationId: fetch-filters path: filters responseModel: Filter isResponseCollection: true AttributeFilterValue: type: object required: - name - productCount - id - value properties: name: type: string example: '42' productCount: type: integer example: 1231 id: type: integer example: 55 value: type: string example: '42' BooleanFilterValue: type: object required: - name - productCount - id - value properties: name: type: boolean example: true productCount: type: integer example: 1231 RangeFilterValue: type: object required: - name - productCount - id - value properties: max: type: integer example: 3255 min: type: integer example: 735 productCount: type: integer example: 1231 Image: type: object properties: attributes: type: object additionalProperties: $ref: '#/components/schemas/Attribute' hash: type: string x-ayObjects: - property: attributes isCollection: true className: Attribute Match: type: object properties: type: type: string example: "category" enum: - attribute - category id: type: integer example: 282 nullable: true name: type: string example: pullover nullable: true match: type: string example: Langarmshirts nullable: true attributeGroup: type: object nullable: true properties: id: type: integer example: 97 slug: type: string description: short text to describe the current category (usable, for example, in URLs as `fashion`). example: "searchColor" attributeIds: type: array items: type: integer example: - 895 # Search Types SearchResolveResponse: type: object properties: matches: items: $ref: '#/components/schemas/ResolveMatch' ResolveMatch: type: object properties: count: type: integer example: 20201 match: type: string example: "pants Unifarben" category: type: object properties: match: type: string example: "pants" id: type: integer example: 20201 name: type: string example: "pants" attributes: type: array items: type: object properties: match: type: string example: "Unifarben" name: type: string example: "pattern" attributeGroup: type: integer example: 123 attributeId: type: integer example: 223344 TypeaheadResponse: type: object required: - suggestions - topMatch properties: suggestions: oneOf: - $ref: '#/components/schemas/TypeaheadBrandOrCategorySuggestion' - $ref: '#/components/schemas/TypeaheadProductSuggestion' topMatch: type: object nullable: true properties: brandOrCategorySuggestion: $ref: '#/components/schemas/BrandOrCategorySuggestion' score: type: number example: 66.48743 type: type: string example: "brandOrCategory" TypeaheadRequestBody: type: object properties: fuzziness: description: "The fuzziness parameter can enable some typo tolerance. Available values are 0, 1, 2, and auto. Defaults to auto. Note: The value set in the SCAYLE Panel will not impact this search." oneOf: - type: string - type: integer enum: - 0 - 1 - 2 - auto categoryId: type: integer description: The `categoryId` parameter can filter by category ID. example: 20201 limit: type: integer description: The `limit` parameter allows limiting the number of suggested products returned. example: 10 term: type: string description: The `term` parameter allows you to query for any entity with a full or partial match with the given term. Typeahead: type: object properties: suggestions: oneOf: - $ref: '#/components/schemas/BrandOrCategorySuggestion' - $ref: '#/components/schemas/ProductSuggestion' topMatch: $ref: '#/components/schemas/BrandOrCategorySuggestion' x-ayOptions: isServiceSingular: true x-ayOperations: - methodName: postSuggestions operation: post operationId: fetch-typeahead-suggestions-post path: typeahead responseModel: Typeahead requestModel: TypeaheadBody parameters: - name: term type: string isQueryParameter: true queryName: term x-ayObjects: - property: suggestions isCollection: true className: TypeaheadSuggestion - property: topMatch className: TypeaheadSuggestion TypeaheadBody: type: object properties: fuzziness: description: 'The fuzziness parameter can enable some typo tolerance. Available values are 0, 1, 2, and auto. Defaults to auto. Note: The value set in the SCAYLE Panel will not impact this search.' type: string enum: - 0 - 1 - 2 - auto likedBrands: type: array description: The `likedBrands` parameter can boost and adjust results by matching the given brand IDs. items: type: integer categoryId: type: integer description: The `categoryId` parameter can filter by category ID. example: 20201 limit: type: integer description: The `limit` parameter allows limiting the number of suggested products returned. example: 10 term: type: string description: The `term` parameter allows you to query for any entity with a full or partial match with the given term. TypeaheadBrandOrCategorySuggestion: type: object properties: brandOrCategorySuggestion: $ref: '#/components/schemas/BrandOrCategorySuggestion' score: type: number example: 52.762222 type: type: string example: "brandOrCategory" x-ayObjects: - property: brandOrCategorySuggestion className: BrandOrCategorySuggestion TypeaheadProductSuggestion: type: object properties: productSuggestion: $ref: '#/components/schemas/ProductSuggestion' score: type: number example: 52.762222 type: type: string example: "product" x-ayObjects: - property: productSuggestion className: ProductSuggestion # Search V2 Types SearchV2ResolveResponse: oneOf: - $ref: '#/components/schemas/SearchV2CategoryResponse' - $ref: '#/components/schemas/SearchV2ProductResponse' SearchV2SuggestionsResponse: type: object required: - suggestions properties: suggestions: type: array items: oneOf: - $ref: '#/components/schemas/SearchV2CategoryResponse' - $ref: '#/components/schemas/SearchV2ProductResponse' SearchV2CategoryResponse: type: object required: - type - categorySuggestion properties: type: type: string example: "category" categorySuggestion: $ref: '#/components/schemas/SearchV2CategorySuggestion' SearchV2CategorySuggestion: type: object required: - category - filters properties: category: $ref: '#/components/schemas/Category' filters: type: array items: oneOf: - $ref: '#/components/schemas/SearchV2AttributeFilter' SearchV2AttributeFilter: type: object required: - type - attributeFilter properties: type: type: string example: "attribute" attributeFilter: type: object properties: group: type: object properties: id: type: number description: "The ID of the attribute group" example: 123 key: type: string description: "Also known as slug" example: "color" label: type: string description: "The label which can be shown in the FE" example: "Color" type: type: string description: "The type of the attribute group" example: "design" multiSelect: type: boolean example: true values: type: array items: properties: id: type: number description: "The unique ID for the attribute" example: 1234 value: type: string example: "blue" label: type: string description: "The label which can be shown in the FE" example: "Blue" SearchV2ProductResponse: type: object required: - type - productSuggestion properties: type: type: string example: "product" productSuggestion: $ref: '#/components/schemas/SearchV2ProductSuggestion' SearchV2ProductSuggestion: type: object required: - product properties: product: $ref: '#/components/schemas/Product' # Campaign Types Campaign: type: object properties: id: type: integer example: 20201 name: type: string example: "Summer_Campaign" key: type: string description: type: string example: "10% discount for all summer products" reduction: type: integer example: 10 customData: type: object start_at: type: string example: "2021-04-13T08:45:00+00:00" end_at: type: string example: "2021-05-13T08:45:00+00:00" x-ayOptions: isServiceSingular: true x-ayOperations: - methodName: getAll operation: get operationId: fetch-campaigns path: campaigns responseModel: CampaignsResponse - methodName: getById operation: get operationId: fetch-campaign-by-id path: campaigns/{campaignId} responseModel: Campaign withOptions: false parameters: - name: campaignId type: integer CampaignsResponse: type: object properties: pagination: oneOf: - $ref: '#/components/schemas/Pagination' - $ref: '#/components/schemas/OffsetPagination' entities: type: array items: "$ref": "#/components/schemas/Campaign" x-ayObjects: - property: pagination className: Pagination - property: entities className: Campaign isCollection: true Pagination: type: object required: - current - first - last - next - page - perPage - prev - total properties: current: type: integer first: type: integer last: type: integer next: type: integer page: type: integer perPage: type: integer prev: type: integer total: type: integer # Navigation Types Navigation: x-ayOptions: isServiceSingular: true x-ayOperations: - methodName: getAll operation: get operationId: fetch-navigation-trees path: navigation/trees responseModel: NavigationTree isResponseCollection: true withOptions: false - methodName: getById operation: get operationId: fetch-navigation-tree-by-id path: navigation/trees/{navigationTreeId} responseModel: NavigationTree withOptions: false parameters: - name: navigationTreeId type: integer NavigationTree: type: object required: - id - key - name - items properties: id: type: integer key: type: string name: type: string items: type: array items: $ref: '#/components/schemas/NavigationItem' NavigationItemExtraFilter: type: object required: - attributes properties: attributes: type: array items: type: object required: - attribute - include properties: attribute: type: object required: - id - key - label - type - multiSelect properties: id: type: integer key: type: string label: type: string type: type: string multiSelect: type: boolean include: type: array items: type: integer NavigationItem: type: object required: - id - assets - name - type - visibleFrom - visibleTo - children - customData properties: id: type: integer assets: type: object name: type: string type: type: string example: "external" visibleFrom: type: string nullable: true visibleTo: type: string nullable: true options: type: object properties: url: type: string isOpenInNewWindow: type: boolean extraFilters: $ref: '#/components/schemas/NavigationItemExtraFilter' category: $ref: '#/components/schemas/Category' children: type: array items: $ref: '#/components/schemas/NavigationItem' customData: type: object NavigationTreeResponse: type: array items: $ref: '#/components/schemas/NavigationTree' OffsetPagination: type: object required: - total properties: total: type: integer additionalProperties: false Price: type: object required: - currencyCode - withTax - withoutTax - recommendedRetailPrice - tax - appliedReductions properties: appliedReductions: type: array items: $ref: '#/components/schemas/AppliedReduction' currencyCode: type: string description: The currency of the price. reference: type: object properties: size: type: integer description: Size of the reference (100m, 100ml), but in this field fill in only the value without the unit of measurement. unit: type: string description: The size of reference unit (KG, ml, L, etc.) without the value withoutTax: type: integer description: Reference price excluding the taxes. withTax: type: integer description: Item price including taxes. The price is calculated including taxes and all applicable reductions such as discounts for sale and campaigns (should a campaign key be provided on the request). tax: $ref: '#/components/schemas/Tax' withoutTax: type: integer withTax: type: integer recommendedRetailPrice: type: integer nullable: false x-ayObjects: - property: appliedReductions isCollection: true className: AppliedReduction - property: tax className: Tax PriceRange: type: object required: - min - max properties: max: $ref: '#/components/schemas/Price' min: $ref: '#/components/schemas/Price' x-ayObjects: - property: max className: Price - property: min className: Price ReductionRange: type: object properties: max: $ref: '#/components/schemas/Price' min: $ref: '#/components/schemas/Price' x-ayObjects: - property: max className: Price - property: min className: Price Product: type: object required: - id - isActive - isSoldOut - isNew - createdAt - updatedAt - indexedAt - firstLiveAt - masterKey - referenceKey - images - customData properties: id: type: integer format: int64 advancedAttributes: type: object additionalProperties: $ref: '#/components/schemas/AdvancedAttribute' attributes: type: object additionalProperties: $ref: '#/components/schemas/Attribute' baseCategories: type: array items: $ref: '#/components/schemas/BaseCategory' categories: type: array items: type: array items: $ref: '#/components/schemas/ProductCategory' definingAttributes: $ref: '#/components/schemas/DefiningAttribute' images: type: array items: $ref: '#/components/schemas/Image' customData: $ref: '#/components/schemas/ResponseCustomData' isActive: type: boolean description: Identifies whether a product is active or not isNew: type: boolean description: Identifies whether a product is new or not isSoldOut: type: boolean description: Identifies if a product is still available to sell masterKey: type: string description: Identifies the master product which this product belongs example: "480306626-1" firstLiveAt: $ref: '#/components/schemas/Timestamp' priceRange: $ref: '#/components/schemas/PriceRange' reductionRange: $ref: '#/components/schemas/ReductionRange' lowestPriorPrice: $ref: '#/components/schemas/LowestPriorPrice' referenceKey: type: string searchCategoryIds: type: array items: type: integer example: - 123456 - 234567 - 345678 siblings: type: array items: $ref: '#/components/schemas/Product' description: list of Products variants: type: array items: $ref: '#/components/schemas/Variant' createdAt: $ref: '#/components/schemas/Timestamp' updatedAt: $ref: '#/components/schemas/Timestamp' indexedAt: $ref: '#/components/schemas/Timestamp' x-ayObjects: - property: attributes isCollection: true className: Attribute - property: advancedAttributes isCollection: true className: AdvancedAttribute - property: categories is2dCollection: true className: ProductCategory - property: definingAttributes className: DefiningAttribute - property: images isCollection: true className: Image - property: priceRange className: PriceRange - property: reductionRange className: ReductionRange - property: lowestPriorPrice className: LowestPriorPrice - property: siblings isCollection: true className: Product - property: baseCategories isCollection: true className: BaseCategory - property: variants isCollection: true className: Variant x-ayModels: - property: createdAt isTimestamp: true - property: updatedAt isTimestamp: true x-ayOperations: - methodName: getById operation: get operationId: fetch-product-by-id path: products/{productId} responseModel: Product parameters: - name: productId type: integer - methodName: query operation: get operationId: fetch-products path: products responseModel: ProductsResponse ProductCategory: type: object properties: categoryId: type: integer format: int64 categoryHidden: type: boolean categoryName: type: string categoryProperties: type: object properties: is_inheritable: type: integer name: type: string value: type: string shopLevelCustomData: type: object properties: appCatName: type: object appCatLocalizedConfig: type: object countryLevelCustomData: type: object properties: appCatCountryName: type: string appCatCountryScore: type: number appCatCountryBubbleUp: type: boolean appCatCountrySampleName: type: string appCatCountrySampleConfig: type: object appCatCountryLocalizedConfig: type: object categoryUrl: type: string categorySlug: type: string ProductName: type: object properties: term: type: string ProductsResponse: type: object properties: entities: type: array items: $ref: '#/components/schemas/Product' pagination: oneOf: - $ref: '#/components/schemas/Pagination' - $ref: '#/components/schemas/OffsetPagination' x-ayObjects: - property: entities className: Product isCollection: true ProductSuggestion: type: object properties: suggestion: type: string example: "jeans" product: $ref: '#/components/schemas/Product' x-ayObjects: - property: product className: Product SearchSuggestions: type: object properties: brands: type: array items: $ref: '#/components/schemas/AttributeValue' categories: type: array items: $ref: '#/components/schemas/Category' productNames: type: array items: $ref: '#/components/schemas/ProductName' products: type: array items: $ref: '#/components/schemas/Product' x-ayObjects: - property: brands isCollection: true className: AttributeValue - property: categories isCollection: true className: Category - property: productNames isCollection: true className: ProductName - property: products isCollection: true className: Product ShopConfiguration: type: object required: - shopId - name - shopCustomData - properties - customData - country properties: shopId: type: integer example: 139 name: type: string example: aboutyou shopCustomData: type: object nullable: true additionalProperties: $ref: '#/components/schemas/CustomData' properties: type: array items: $ref: '#/components/schemas/ShopProperties' customData: type: object additionalProperties: $ref: '#/components/schemas/CustomData' country: type: string example: DE x-ayObjects: - property: customData className: CustomData - property: properties isCollection: true className: ShopProperties x-ayOperations: - methodName: get operation: get operationId: fetch-shop-configuration path: shop-configuration responseModel: ShopConfiguration parameters: - name: locale type: string isQueryParameter: true queryName: locale ShopProperties: type: object properties: key: type: string value: type: string Stock: type: object required: - supplierId - warehouseId - quantity - isSellableWithoutStock - expectedAvailabilityAt properties: supplierId: type: integer warehouseId: nullable: true type: integer quantity: type: integer isSellableWithoutStock: type: boolean expectedAvailabilityAt: type: string nullable: true example: "2023-01-26" Tax: type: object properties: vat: $ref: '#/components/schemas/Vat' x-ayObjects: - property: vat className: Vat Timestamp: type: string description: Date string, formatted according to RFC 3339, e.g. 2018-06-01T14:56:08+02:00 example: "2023-01-26T09:30:15+00:00" Variant: type: object required: - id - referenceKey - firstLiveAt - createdAt - updatedAt - stock - price - customData - productId properties: id: type: integer advancedAttributes: type: object additionalProperties: $ref: '#/components/schemas/AdvancedAttribute' appliedPricePromotionKey: type: string attributes: type: object additionalProperties: $ref: '#/components/schemas/Attribute' lowestPriorPrice: $ref: '#/components/schemas/LowestPriorPrice' price: $ref: '#/components/schemas/Price' productId: type: integer example: 123456 referenceKey: type: string example: "563843898" firstLiveAt: $ref: '#/components/schemas/Timestamp' stock: $ref: '#/components/schemas/Stock' customData: type: object additionalProperties: $ref: '#/components/schemas/CustomData' merchant: $ref: '#/components/schemas/Merchant' createdAt: $ref: '#/components/schemas/Timestamp' updatedAt: $ref: '#/components/schemas/Timestamp' x-ayObjects: - property: attributes isCollection: true className: Attribute - property: advancedAttributes isCollection: true className: AdvancedAttribute - property: price className: Price - property: stock className: Stock x-ayOperations: - methodName: getByIds operation: get operationId: fetch-variant-by-id path: variants responseModel: VariantsResponse parameters: - name: variantIds type: array isQueryParameter: true queryName: ids x-ayModels: - property: firstLiveAt isTimestamp: true - property: createdAt isTimestamp: true - property: updatedAt isTimestamp: true VariantsResponse: type: object properties: entities: type: array items: $ref: '#/components/schemas/Variant' pagination: $ref: '#/components/schemas/Pagination' x-ayObjects: - property: entities isCollection: true className: Variant - property: pagination className: Pagination Merchant: type: object required: - id - key - name properties: id: type: integer key: type: string name: type: string legal: type: object properties: legaName: type: string parentCompanyLegalName: type: string streetWithNumber: type: string zip: type: string city: type: string country: type: string telephone: type: string email: type: string registryCourtCity: type: string registerNumber: type: string parentCompanyRegistryCourtCity: type: string parentCompanyRegisterNumber: type: string managingDirectors: type: string representative: type: string shippingMerchantName: type: string registryCourtType: type: string parentCompanyRegistryCourtType: type: string vatId: type: string Vat: type: object properties: amount: type: number rate: type: number Wishlist: type: object required: - key - items properties: key: type: string items: type: array items: $ref: '#/components/schemas/WishlistItem' x-ayOperations: - methodName: addItem operation: post operationId: add-wishlist-item path: wishlists/{wishlistId}/items responseModel: Wishlist requestModel: CreateWishlistBody parameters: - name: wishlistId type: string - methodName: get operation: get operationId: fetch-wishlist-by-key path: wishlists/{wishlistId} responseModel: Wishlist parameters: - name: wishlistId type: string - methodName: remove operation: delete operationId: remove-wishlist-item path: wishlists/{wishlistId}/items/{itemKey} responseModel: Wishlist parameters: - name: wishlistId type: string - name: itemKey type: string x-ayObjects: - property: items isCollection: true className: WishlistItem MatchRedirectBody: type: object properties: url: type: string example: example.com description: | The url to find a redirect for RedirectsResponse: type: object properties: entities: type: array items: $ref: '#/components/schemas/Redirect' pagination: oneOf: - $ref: '#/components/schemas/Pagination' - $ref: '#/components/schemas/OffsetPagination' Redirect: type: object required: - id - source - target - statusCode - priority - isRegex properties: id: type: integer description: The unique identifier of the redirect source: type: string description: The source URL for the redirect example: example.com target: type: string description: The target URL for the redirect example: example.de statusCode: type: integer description: The status code for the redirect example: 301 priority: type: integer description: The priority for the redirect example: 1 isRegex: type: boolean description: The flag if the source is a regex example: false x-ayOperations: - methodName: get operation: get operationId: fetch-redirects path: redirects responseModel: RedirectsResponse MatchRedirect: type: object required: - source - target - statusCode properties: source: type: string description: The source URL for the redirect example: example.com target: type: string description: The target URL for the redirect example: example.de statusCode: type: integer description: The status code for the redirect example: 301 x-ayOperations: - methodName: match operation: post operationId: match-redirects path: redirects requestModel: MatchRedirectBody responseModel: MatchRedirect Condition: type: object properties: level: type: string example: global key: type: string example: condition_key condition: type: string example: condition description BuyXGetYEffect: type: object properties: type: type: string enum: - buy_x_get_y - automatic_discount example: buy_x_get_y additionalData: type: object properties: eligibleItemsQuantity: type: integer example: 1 maxCount: type: integer example: 1 maxCountType: type: string enum: - per_eligible_items_quantity - per_eligible_uniq_items example: per_eligible_items_quantity variantIds: type: array items: type: integer example: [1,2,3] description: Promotion's effect AutomaticDiscountEffect: type: object properties: type: type: string enum: - buy_x_get_y - automatic_discount example: automatic_discount additionalData: type: object properties: type: description: The type is either `absolute` or `relative`. type: string enum: - absolute - relative example: relative value: description: The value is either a relative percentage or an absolute reduction in cents, determined by the additionalData.type field. If the type is relative, the value should be expressed as a percentage; if the type is absolute, the value will be in cents. type: number format: float example: 20.5 description: Promotion's effect Tier: type: object properties: id: type: integer example: 1 name: type: string example: Tier 1 MOV: type: integer example: 30000 effect: type: object properties: additionalData: type: object properties: type: type: string example: relative value: type: number format: float example: 60 Promotion: type: object properties: id: type: string description: The unique identifier of the promotion example: 651cb0bec0b00af2d4dbf610 name: type: string description: Promotion name example: Promotion_Name_Example schedule: type: object properties: from: $ref: '#/components/schemas/Timestamp' to: $ref: '#/components/schemas/Timestamp' description: Promotion's initial and end date, formatted according to RFC 3339. isActive: type: boolean description: Promotion's status effect: oneOf: - $ref: '#/components/schemas/AutomaticDiscountEffect' - $ref: '#/components/schemas/BuyXGetYEffect' conditions: type: array items: $ref: '#/components/schemas/Condition' description: Promotion's conditions customData: type: object description: Promotion's custom data example: customLabel: customValue priority: type: number description: | The priority of the promotion compared to other promotions. This can be used to decide which promotion to apply if there is a conflict between two. tiers: type: array items: $ref: '#/components/schemas/Tier' x-ayOperations: - methodName: get operation: get operationId: fetch-promotions path: promotions responseModel: PromotionsResponse BasketItemPromotion: allOf: - $ref: '#/components/schemas/Promotion' - type: object properties: isValid: type: boolean example: false failedConditions: type: array items: type: object properties: key: type: string example: MOV_100 level: type: string example: global PromotionsResponse: type: object properties: entities: type: array items: $ref: '#/components/schemas/Promotion' pagination: $ref: '#/components/schemas/Pagination' parameters: locale: name: locale in: query description: | Use enabled locale instead of default locale e.g. `?locale=de_DE`. required: false explode: false schema: type: string OrderCustomData: name: X-Order-Custom-Data description: Base64-encoded data for custom order information. Should be in the format of `map[string]any`. in: header required: false schema: type: string CustomerToken: name: X-Customer-Token description: A JWT token containing the customer ID used to validate promotions in the promotion engine. in: header required: false schema: type: string basketId: name: basketId in: path description: The ID of the Basket required: true explode: false schema: type: string example: fySXbTJxa9q_xu_t8edGOHYeJSpaxe7A basketItemKey: name: itemKey in: path description: The Key of the Item to be sent to the request required: true explode: false schema: type: string example: ga2iyonk4vgpifcdm1xeuj6ezsev8ke basketWith: name: with in: query description: | The `with` parameter can be applied to include related resources, for example, the attributes of a product can be attached using `with=items.product.attributes`. It is also possible to filter attributes by key `with=items.product.attributes:key(plusSize)` or by type `with=items.product.attributes:type(material_care)`. The `with=applicablePromotions` parameter can also be applied to include all promotions applicable for the current basket. In the following table, there is more information about possible includes. Include | Nested Includes | Available Filters ------------ | ------------- | ------------- `items.product` | See available includes for products | Check the filters available for products `items.variant` | See available includes for variants | Check the filters available for variants `applicablePromotions` | | required: false explode: false schema: type: array items: type: string campaignKey: name: campaignKey in: query description: | Adjust prices based on the specified `campaignKey`. If results are not having a matching campaign, the default price is returned. Please note, that campaign prices are stored in advance and available earlier than the campaign starts. required: false explode: false example: e6413f96-b47c-4be1-be61-d2206adeae71 schema: type: string displayHighestPpkPrice: name: displayHighestPpkPrice in: query description: Include Display highest PPK Price required: false explode: false example: false schema: type: boolean forcePPKSaleCategories: name: forcePPKSaleCategories in: query description: Include PPK sale categories required: false explode: false example: false schema: type: boolean categoriesPath: name: categoryPath in: path description: Category Path. required: true explode: false schema: type: string example: women/clothing/dresses category: name: category in: path description: Category required: true explode: false schema: type: string example: 20201 categoriesIds: name: ids in: query description: Only include results with `categoryId` matching one of the specified `ids` required: false explode: false schema: type: array items: type: integer example: [123,456,789] categoriesFormat: name: format in: query description: The format determines whether the categories should be returned as a tree (nested lists) or a flattened list. required: false explode: false schema: type: string enum: - tree - list default: tree categoriesShowHidden: name: showHidden in: query description: Include hidden categories in the result. required: false explode: false schema: type: boolean default: false categoriesDepth: name: depth in: query description: | The number of nested categories to include in the response. If not defined the depth defaults to infinite. required: false explode: false schema: type: integer example: 3 categoriesWith: name: with in: query description: | The `with` parameter can be applied to include related resources, for example, the parents of a category can be attached using `with=parents`, and multiple includes are separated by commas, e.g. `with=parents,children`. Include | includes ------------ | ------------- `parents` | includes all ancestors of the category `children` | includes all descendants of the category, which are available as children on each node; depth can be modified using the depth parameter `properties:name(property)` | retrieves only selected properties required: false explode: false schema: type: array items: type: string example: "parents,children" categoryWith: name: with in: query description: | The `with` parameter can be applied to include category in the navigationItem lists using `with=category`. Include | includes ------------ | ------------- `category` | includes category as an object into the navigation-item required: false explode: false schema: type: array items: type: string includeSellableForFree: name: includeSellableForFree in: query description: If `includeSellableForFree` is set to true, response will also include variants with `price=0`. required: false explode: false schema: type: boolean includeSoldOut: name: includeSoldOut in: query description: Also include sold out results when `includeSoldOut` is set to `true`. required: false explode: false schema: type: boolean default: false minProductId: name: minProductId in: query description: Only include results with a productId greater than or equal to `minProductId`. required: false explode: false schema: type: integer disableFuzziness: name: disableFuzziness in: query description: It disables the typo tolerance value configured for this request. When the parameter is not provided, the typo tolerance is automatically applied according to the [typo tolerance configuration](/en/user-guide/shops/storefront/search/configuration#typo-tolerance) in SCAYLE panel. required: false explode: false schema: type: boolean page: name: page in: query description: Return results for `page` (for example, `page=2`). required: false explode: false schema: type: integer default: 1 perPage: name: perPage in: query description: Return `perPage` number of results per page (for example, `perPage=25`). required: false explode: false schema: type: integer default: 100 limit: name: limit in: query description: Return `limit` results per page (for example, `limit=25`). Using this parameter is exclusive with both `page` and `perPage` and is meant to be used with `offset` parameter. It will transform the pagination response. required: false explode: false schema: type: integer default: 100 offset: name: offset in: query description: Skips first `offset` results. Using this parameter is exclusive with both `page` and `perPage` and is meant to be used with `limit` parameter. It will transform the pagination response. required: false explode: false schema: type: integer default: 0 referenceKey: name: referenceKey in: query description: | Allow fetching products using its reference key e.g. `?referenceKey=014901100002-Blue`. required: false explode: false schema: type: string pricePromotionKey: name: pricePromotionKey in: query description: Adjust variant price based on the specified `pricePromotionKey`. If the variant does not have a matching price promotion, the default price is returned. required: false explode: false schema: type: string productIds: name: ids in: query description: Retrieve results with `productId` matching specified `ids`, for example, `ids=1,2,3`. required: false explode: false schema: type: array items: type: integer promotionIds: name: ids in: query description: Retrieve results with `id` matching specified `ids`, for example, `ids=abc123,def456`. required: false explode: false schema: type: array items: type: string activeAt: name: activeAt in: query description: | Retrieve all active promotions falling within the specified active range. Note: The provided value should be datetime in the RFC3339 format: "2020-10-13T00:00:00Z" required: false explode: false schema: type: string shopId: name: shopId in: query description: | In case you are operating multiple shops (for example, for different domain names or different languages), each shop is identified by its specific `shopId` required: true explode: false example: 139 schema: type: string productsWith: name: with in: query description: | Include related product resources, for example, the attributes of a product can be included using `with=attributes` or `with=attributes:key(plusSize)`. Nested includes can be included with `with=variants.attributes`. Multiple includes are separated by commas `with=siblings,variants`. with | includes ------------ | ------------- attributes | see attributes filtering below advancedAttributes | see attributes filtering below variants | full variants variants.\ | partial variants (see available includes for variants in /variants endpoint) images | images (included by default) images.attributes | see attributes filtering below categories | categories categories:hidden(true) | also include hidden categories categories.countryLevelCustomData | include country custom data information categories.shopLevelCustomData | include shop custom data information categories.categoryProperties:name(property_name) | only return specified categoryProperties for included categories definingAttributes | definingAttributes siblings | sibling products siblings.\ | partial sibling products (see available includes for products in /products endpoint) priceRange | priceRange lowestPriorPrice | lowestPriorPrice reductionRange | reductionRange searchCategoryIds | searchCategoryIds baseCategories | baseCategories filters for with=attributes, with=advancedAttributes and with=images.attributes | includes ------------ | ------------- attributes | all attributes attributes:key(\|\|...) | only attributes with specified keys attributes:type(\|\|...) | only attributes with specified types required: false explode: false schema: type: array items: type: string skipAvailabilityCheck: name: skipAvailabilityCheck in: query description: | This parameter allows disabling the availability check when adding an item into the wishlist or basket. This is needed to make sure that sold out products can be reserved via Click & Reserve in retail stores (where they are still available). Important – Check if this resource is available for your shop. required: false explode: false schema: type: boolean sort: name: sort in: query description: | Sort results by specified `sort` type. When no sort is specified, results will be sorted by `productId`. `sort` | `sortDir=asc` | `sortDir=desc` ------------ | ------------- | ------------- price | results with lowest price first | results with highest price first (default) reduction | results with lowest reduction first | results with highest reduction first (default) new | results with oldest firstLiveAt date first | results with newest firstLiveAt date first (default) (none) | results with lowest productId first | results with highest productId first (default) required: false explode: false schema: type: string enum: - new - price - reduction sortCampaigns: name: sort in: query description: | Sort results by specified `sort` type. When no sort is specified, results will be sorted by campaign `id`. required: false explode: false schema: type: string enum: - id - reduction - start_at - end_at sortDir: name: sortDir in: query description: Sort results in the specified direction (`asc` for ascending or `desc` for descending). required: false explode: false schema: type: string enum: - asc - desc sortingKey: name: sortingKey in: query description: Ignore `sort` parameter and sort results by specified `sortingKey` instead. required: false explode: false schema: type: string variantIds: name: ids in: query description: Only include results with `variantId` matching one of the specified `ids`, for example `ids=123,456,789`. required: true explode: false schema: type: array items: type: integer variantId: name: variantId in: path description: Get variant with specified `variantId`. required: true explode: false schema: type: integer variantsWith: name: with in: query description: | Include related variant resources, for example, the attributes of a variant can be included using `with=attributes` or `with=attributes:key(plusSize)`. Multiple includes are separated by commas `with=attributes,advancedAttributes,lowestPriorPrice`. with | includes ------------ | ------------- attributes | all attributes attributes:key(\,\,...) | only attributes with specified keys attributes:type(\,\,...) | only attributes with specified types advancedAttributes | all advancedAttributes advancedAttributes:key(\,\,...) | only advancedAttributes with specified keys advancedAttributes:type(\,\,...) | only advancedAttributes with specified types lowestPriorPrice | include variant lowestPriorPrice merchant | include merchant information required: false explode: false schema: type: array items: type: string filterAttributeKey: name: filters[attributeKey] in: query description: | Only include results with the specified attribute value for the attribute parameter `attributeKey`, e.g,: `filters[brand]=882`. * Any attribute available on the products via `with=attributes` might be used as a filter. required: false explode: false schema: type: array items: type: string negativeFilterIds: name: filters:not[id] in: query description: | Exclude results with the specified id values e.g. `filters:not[id]=100,101`. required: false explode: false schema: type: array items: type: integer negativeFilterAttributeKey: name: filters:not[attributeKey] in: query description: | Exclude results with the specified attribute value for the attribute parameter `attributeKey`, e.g,: `filters:not[brand]=882&filters:not[color]=549`. * Any attribute available on the products via `with=attributes` might be used as a filter exclusion. * You can provide multiple not filters (e.g. retrieve all products that are not red and not from brand Nike) in the query and multiple values for a single attribute e.g.: `filters:not[color]=545,345` required: false explode: false schema: type: array items: type: integer orFiltersOperator: name: orFiltersOperator in: query description: | By default, if multiple filters are given, each filter is working as `AND` filter. This parameter accepts comma separated attribute group names and enables `OR` logic for these fields. * Can be used together with attribute filters * Example: `?filters[attributeGroup1]=123&filters[attributeGroup2]=456,789&filters[attributeGroup3]=9&orFiltersOperator=attributeGroup2,attributeGroup3` is equivalent to `attributeGroup1 AND (attributeGroup2 OR attributeGroup3)` required: false explode: false schema: type: array items: type: string filterCategory: name: filters[category] in: query description: | Filter the products which belong to a specific category. required: false explode: false schema: type: array items: type: integer filterEan: name: filters[ean] in: query description: | Retrieve a list of products matching the specified `ean` value, e.g.: `filters[ean]=121213213`. required: false explode: false schema: type: array items: type: string filterIsnew: name: filters[isNew] in: query description: | You can include only results for products with the specified `is_new` state. * The `filters[isNew]=true` parameter only retrieves products which are considered new. * The `filters[isNew]=false` parameter only retrieves products which are not considered new. __When is a product considered as `new`?__: Products are considered "new" when they were inserted into the shop within a period of 28 days. This value can be adjusted accordingly for each shop. required: false explode: false schema: type: boolean filterMaxPrice: name: filters[maxPrice] in: query description: | Only include results with a price less than or equal to `maxPrice`. __Note__: The value is passed in a currency's fractional monetary unit (for example, 990 cents for 9,90 EUR). required: false explode: false schema: type: integer filterMaxReduction: name: filters[maxReduction] in: query description: | Only include results with a reduction of less than or equal to `maxReduction` percent. E.g.: `filters[maxReduction]=30`, for example, will include all products which have 30% or less reduction on the price. required: false explode: false schema: type: integer filterMinPrice: name: filters[minPrice] in: query description: | Only include results with a price greater than or equal to `minPrice`. __Note__: The value is passed in a currency's fractional monetary unit (for example, 990 cents for 9,90 EUR). required: false explode: false schema: type: integer filterMinReduction: name: filters[minReduction] in: query description: | Only include results with a reduction greater than or equal to `minReduction` percent. `filters[minReduction]=10`, for example, will include all products which have at least 10% reduction on the price. required: false explode: false schema: type: integer filterReferenceKey: name: filters[referenceKey] in: query description: | Only include results with the specified product's `referenceKey`. Multiple referenceKeys can be given with a comma as a separator. required: false explode: false examples: one reference key: value: ES0007001 multiple reference keys: value: ES0007001,ES0007002 schema: type: string filterVariantReferenceKey: name: filters[variants.referenceKey] in: query description: | Only retrieve products with the specified variant's `referenceKey`. Multiple referenceKeys can be given with a comma as a separator. example: ESR0307001,2170-20-00449_36 required: false explode: false schema: type: array items: type: string filterVariantAttributeKey: name: filters[variants.color] in: query description: | Only retrieve products that have a variant which matches the provided attribute parameters. required: false example: filters[variants.color]=446&filters[variants.size]=886 explode: false schema: type: array items: type: integer filterSale: name: filters[sale] in: query description: | Only include results based on a products' `sale` state. Products are considered as `sale` when: * Any of its variants is on sale. * There is an active campaign and the `campaignKey={campaignKey}` is given. required: false explode: false examples: sale filter: value: filters[sale]=true&campaignKey={campaignKey} description: will include results for both products with sale and campaign prices schema: type: boolean filterHasCampaignReduction: name: filters[hasCampaignReduction] in: query description: | Only include results that have a campaign reduction for the given campaignKey. This filter can only be used together with an active campaign key and will return results that have a campaign reductions in the campaign. required: false example: filters[hasCampaignReduction]=true&campaignKey={campaignKey} explode: false schema: type: boolean filterMasterKey: name: filters[masterKey] in: query description: | Only include results that are matching given `masterKeys` (also known as `styleKeys`). The `masterKey` define the `siblings` relation between products. Multiple masterKeys can be given with a comma as a separator. required: false explode: false examples: one master key: value: 502227553 multiple master keys: value: 502227553,502227554 schema: type: array items: type: string filterTerm: name: filters[term] in: query description: | Term-based search that returns products where the provided search term matches the name or attribute value within the products. E.g., `filters[term]=blue shirts` __Note__: The attributes used for searching are [configured](/en/user-guide/shops/storefront/search/configuration#searchable-attributes) in the Panel. The API will split the searched term into multiple words. Then it will try to match each of these words against products' name and searchable attributes. The better the searched term matches against a product, the higher the product is returned. But it only requires a single word to match for a product to be returned. A detailed explanation of the functionality can be found in [SCAYLE Panel developer guide](/en/developer-guide/products/search#text-search) required: false explode: false schema: type: string filterMinFirstLiveAt: name: filters[minFirstLiveAt] in: query description: | Retrieve products which first appeared live after the provided value. __Note__: The provided value shall be datetime in the RFC3339 format: "2020-10-13T00:00:00Z" required: false explode: false schema: type: string filterMerchantId: name: filters[merchantId] in: query description: | Only include results with merchantId equal to the given `merchantId`. Example: `filters[merchantId]=130`. required: false explode: false schema: type: integer includeItemsWithoutProductData: name: includeItemsWithoutProductData in: query description: If `includeItemsWithoutProductData` is set to true, basket items will be included even if there is no product information available (`items.product` and `items.variant` might be empty). required: false explode: false schema: type: boolean brandIds: name: ids in: query description: Retrieve results with `brandId` matching given `ids`, for example `ids=1,4,5`. required: false explode: false schema: type: array items: type: integer brandSlugs: name: slugs in: query description: Retrieve results with `slug` matching given `slugs`, for example `slugs=puma,nike`. required: false explode: false schema: type: array items: type: string # Search parameters searchTerm: name: term in: query description: The search term to match attributes and categories. required: true explode: false schema: type: string example: pants black categoryId: name: categoryId in: query description: The categoryId parameter is used to filter the results and limit the returned data to items that belong to the specified category or its child categories. required: false explode: false schema: type: integer example: 20201 typeaheadWith: name: with in: query description: | The `with` parameter can be applied to include related resources, for example, the attributes of a product can be attached using `with=product.attributes`. It is also possible to filter product attributes by key `with=product.attributes:key(plusSize)` or by type `with=product.attributes:type(material_care)`. Nested includes can also be attached when available `with=product.variants.attributes` and multiple combinations are likewise accepted `with=prodcut.siblings,product.variants,category.children`. When using `with=category.children`, you can provide `categoryDepth` parameter to increase child depth. In the following table, there is more information about possible includes. Include | includes | Available Filters ------------ | ------------- | ------------- `product.attributes` | | `key`, `type` `product.advancedAttributes` | | `key`, `type` `product.variants` | See available includes for variants at variants endpoint | `product.images` (default) | `images.attributes` | `product.categories` | | `hidden(true)` `product.definingAttributes` | | `product.siblings` | | `product.priceRange` | | `product.reductionRange` | | `product.lowestPriorPrice` | | `product.searchCategoryIds` | | `product.baseCategories` | | `category.parents` | | `category.children` | | `category.properties:name(property_name)` | | required: false explode: false schema: type: array items: type: string typeaheadTerm: name: term in: query description: The `term` parameter specifies the search term. required: true explode: false schema: type: string typeaheadDepth: name: categoryDepth in: query description: Defines the number of nested child categories to include in the response. required: false schema: type: integer example: 3 typeaheadLimit: name: limit in: query description: The `limit` parameter allows limiting the number of suggested products returned. required: false schema: type: integer fullAttributeValue: name: fullAttributeValue in: query description: | Changes the values within the `attributeFilters` array to following format: `{"id": 1, "name": "black"}` required: false schema: type: boolean default: false searchV2Term: name: term in: query description: The `term` parameter specifies the search term. required: true explode: false schema: type: string searchV2With: name: with in: query description: | The `with` parameter can be applied to include related resources, for example, the attributes of a product can be attached using `with=product.attributes`. It is also possible to filter product attributes by key `with=product.attributes:key(plusSize)` or by type `with=product.attributes:type(material_care)`. Nested includes can also be attached when available `with=product.variants.attributes` and multiple combinations are likewise accepted `with=prodcut.siblings,product.variants,category.children`. When using `with=category.children`, you can provide `categoryDepth` parameter to increase child depth. In the following table, there is more information about possible includes. Include | includes | Available Filters ------------ | ------------- | ------------- `product.attributes` | | `key`, `type` `product.advancedAttributes` | | `key`, `type` `product.variants` | See available includes for variants at variants endpoint | `product.images` (default) | `images.attributes` | `product.categories` | | `hidden(true)` `product.definingAttributes` | | `product.siblings` | | `product.priceRange` | | `product.reductionRange` | | `product.lowestPriorPrice` | | `product.searchCategoryIds` | | `product.baseCategories` | | `category.parents` | | `category.children` | | `category.properties:name(property_name)` | | required: false explode: false schema: type: array items: type: string searchV2CategoryDepth: name: category.depth in: query description: Defines the number of nested child categories to include in the response. required: false schema: type: integer example: 3 searchV2ShowHiddenCategories: name: category.showHidden in: query description: Include hidden categories in the result. required: false explode: false schema: type: boolean default: false attributeGroupNames: name: names in: query description: Only include results with `groupName` matching one of the specified `names`. required: false explode: false schema: type: array items: type: string example: - color - brand attributeGroupIds: name: ids in: query description: Only include results with `groupId` matching one of the specified `ids`. required: false explode: false schema: type: array items: type: integer example: - 550 - 1000 attributeGroupWith: name: with in: query description: | Include related attribute resource. Right now, the only possible include is `values`. When adding the `with=values` parameter, the response will also include the available attribute values for each attribute group. required: false explode: false schema: type: array items: type: string example: values attributeGroupName: name: groupName in: path description: Get attribute group with values by specified `groupName`. required: true explode: false schema: type: string example: brand wishlistId: name: wishlistId in: path description: Wishlist ID required: true explode: false schema: type: string example: your-wishlist-key wishlistWith: name: with in: query description: | The `with` parameter can be applied to include only product related resources, for example, the attributes of a product can be attached using `with=items.product.attributes`. It is also possible to filter attributes by key `with=items.product.attributes:key(plusSize)` or by type `with=items.product.attributes:type(material_care)`. In the following table, there is more information about possible includes. Include | Nested includes and Available Filters for products ----------------------------------------------------------- | ------------------------------------------------------------- `items.variant.attributes` | Include item variant attributes. `items.variant.attributes:key(ean)` | Include all item variant attributes filtered by key `items.variant.attributes:type(fit_size)` | Include all item variant attributes filtered by type `items.variant.advancedAttributes:key(productName)` | Include all item variant advancedAttributes filtered by key `items.variant.advancedAttributes:type()` | Include all item variant advancedAttributes filtered by type `items.variant.lowestPriorPrice` | Include all item variant lowestPriorPrice `items.product.variants` | Include item product variants. `items.product.variants.attributes` | Include item product variants attributes. `items.product.variants.attributes:key(ean)` | Include all item product variants attributes filtered by key `items.product.variants.attributes:type(fit_size)` | Include all item product variants attributes filtered by type `items.product.variants.advancedAttributes:key(productName)`| Include all item product variants advancedAttributes filtered by key `items.product.variants.advancedAttributes:type()` | Include all item product variants advancedAttributes filtered by type `items.product.variants.lowestPriorPrice` | Include item product variants lowestPriorPrice `items.product.priceRange` | Include item product priceRange `items.product.reductionRange` | Include item product reductionRange `items.product.lowestPriorPrice` | Include item product lowestPriorPrice `items.product.searchCategoryIds` | Include item product filtered by searchCategoryIds `items.product.baseCategories` | Include item product baseCategories `items.product.pricePromotionInfo` | Include item product pricePromotionInfo `items.product.definingAttributes` | Include item product definingAttributes `items.product.attributes` | Include item product attributes `items.product.attributes:key(new)` | Include all item product attributes filtered by key `items.product.attributes:type(localizedString)` | Include all item product attributes filtered by type `items.product.advancedAttributes:key(productName)` | Include all item product advancedAttributes filtered by key `items.product.advancedAttributes:type()` | Include all item product advancedAttributes filtered by type `items.product.images.attributes` | Include item product image attributes `items.product.images.attributes:key()` | Include all item product image attributes filtered by key `items.product.images.attributes:type()` | Include all item product image attributes filtered by type `items.product.categories` | Include item product categories `items.product.categories:hidden(true)` | Include item product with hidden categories `items.product.categories.categoryProperties:name` | Include item product categories only with name property `items.product.categories.countryLevelCustomData` | Include item product categories country level custom data `items.product.categories.shopLevelCustomData` | Include item product categories shop level custom data `items.product.siblings.*` | Include item product available siblings products and apply the same filters, and other properties such as `items.product.siblings.variants, ..., items.product.siblings.categories.shopLevelCustomData`. required: false explode: false schema: type: array items: type: string wishlistItemKey: name: itemKey in: path description: Item key required: true explode: false schema: type: string example: item-1234 responses: RequestError: description: Required query parameter missing / invalid NotFound: description: The specified resource was not found Unauthorized: description: Authentication information is missing or invalid examples: basket: value: key: basket-id items: - key: 043c2ec6c6390dd0ac5519190a57c88c packageId: 1 quantity: 1 status: available displayData: { } availableQuantity: 21 customData: { } lowestPriorPrice: withTax: relativeDifferenceToPrice: price: total: currencyCode: EUR withTax: 4999 withoutTax: 4201 recommendedRetailPrice: tax: vat: amount: 798 rate: 0.19 appliedReductions: [ ] unit: currencyCode: EUR withTax: 4999 withoutTax: 4201 recommendedRetailPrice: tax: vat: amount: 798 rate: 0.19 appliedReductions: [ ] variant: id: 1 referenceKey: external-reference attributes: size: id: 2 key: size label: Size type: '' multiSelect: false values: id: 15 label: S value: s firstLiveAt: '2023-09-22T14:36:42+00:00' createdAt: '2023-09-22T14:34:45+00:00' updatedAt: '2024-04-23T09:32:13+00:00' stock: supplierId: 3 warehouseId: 1 quantity: 21 isSellableWithoutStock: false price: currencyCode: EUR withTax: 4999 withoutTax: 4201 recommendedRetailPrice: tax: vat: amount: 798 rate: 0.19 appliedReductions: [ ] customData: { } product: id: 7 isActive: true isSoldOut: false isNew: false createdAt: '2023-09-22T14:34:44+00:00' updatedAt: '2024-04-10T10:30:08+00:00' indexedAt: '2024-04-23T17:22:14+00:00' firstLiveAt: '2023-09-22T14:35:29+00:00' masterKey: master-key referenceKey: external-reference attributes: name: id: 20005 key: name label: Name type: '' multiSelect: false values: id: 20005 label: Women dress value: name color: id: 1 key: color label: Color type: '' multiSelect: true values: - id: 38932 label: Black value: black brand: id: 3 key: brand label: Brand type: '' multiSelect: false values: id: 232 label: SCAYLE value: scayle advancedAttributes: combineWith: id: 1223 key: combineWith label: Combine with Products type: '' values: - fieldSet: - - value: '51' - value: '63' - value: '27' groupSet: [ ] images: - hash: images/52d08cac15a71b5c02428c7989f634b9 attributes: imageFocus: id: 1253 key: imageFocus label: Image Focus type: '' multiSelect: false values: id: 66484 label: Product value: product - hash: images/3e81768c43aab1d12b3c53956a64ff2d.jpg attributes: imageFocus: id: 1253 key: imageFocus label: Image Focus type: '' multiSelect: false values: id: 66483 label: Detail value: detail variants: - id: 1 referenceKey: external-reference attributes: size: id: 2 key: size label: Size type: '' multiSelect: false values: id: 15 label: S value: s firstLiveAt: '2023-09-22T14:36:42+00:00' createdAt: '2023-09-22T14:34:45+00:00' updatedAt: '2024-04-23T09:32:13+00:00' stock: supplierId: 3 warehouseId: 1 quantity: 21 isSellableWithoutStock: false price: currencyCode: EUR withTax: 4999 withoutTax: 4201 recommendedRetailPrice: tax: vat: amount: 798 rate: 0.19 appliedReductions: [ ] customData: { } - id: 5 referenceKey: external-reference attributes: size: id: 2 key: size label: Size type: '' multiSelect: false values: id: 18 label: M value: m firstLiveAt: '2023-09-22T14:35:29+00:00' createdAt: '2023-09-22T14:34:45+00:00' updatedAt: '2024-04-23T03:17:39+00:00' stock: supplierId: 3 warehouseId: 1 quantity: 7 isSellableWithoutStock: false price: currencyCode: EUR withTax: 4999 withoutTax: 4201 recommendedRetailPrice: tax: vat: amount: 798 rate: 0.19 appliedReductions: [ ] customData: { } customData: { } packages: - carrierKey: DEFAULT deliveryDate: max: '2024-05-10' min: '2024-05-07' id: 1 cost: currencyCode: EUR withTax: 4999 withoutTax: 4201 recommendedRetailPrice: tax: vat: amount: 798 rate: 0.19 appliedReductions: [ ] wishlist: value: key: wishlist-id items: - key: 043c2ec6c6390dd0ac5519190a57c88c packageId: 1 quantity: 1 status: available customData: { } product: id: 7 isActive: true isSoldOut: false isNew: false createdAt: '2023-09-22T14:34:44+00:00' updatedAt: '2024-04-10T10:30:08+00:00' indexedAt: '2024-04-23T17:22:14+00:00' firstLiveAt: '2023-09-22T14:35:29+00:00' masterKey: master-key referenceKey: external-reference attributes: name: id: 20005 key: name label: Name type: '' multiSelect: false values: id: 20005 label: Women dress value: name color: id: 1 key: color label: Color type: '' multiSelect: true values: - id: 38932 label: Black value: black brand: id: 3 key: brand label: Brand type: '' multiSelect: false values: id: 232 label: SCAYLE value: scayle advancedAttributes: combineWith: id: 1223 key: combineWith label: Combine with Products type: '' values: - fieldSet: - - value: '51' - value: '63' - value: '27' groupSet: [ ] images: - hash: images/52d08cac15a71b5c02428c7989f634b9 attributes: imageFocus: id: 1253 key: imageFocus label: Image Focus type: '' multiSelect: false values: id: 66484 label: Product value: product - hash: images/3e81768c43aab1d12b3c53956a64ff2d.jpg attributes: imageFocus: id: 1253 key: imageFocus label: Image Focus type: '' multiSelect: false values: id: 66483 label: Detail value: detail variants: - id: 1 referenceKey: external-reference attributes: size: id: 2 key: size label: Size type: '' multiSelect: false values: id: 15 label: S value: s firstLiveAt: '2023-09-22T14:36:42+00:00' createdAt: '2023-09-22T14:34:45+00:00' updatedAt: '2024-04-23T09:32:13+00:00' stock: supplierId: 3 warehouseId: 1 quantity: 21 isSellableWithoutStock: false price: currencyCode: EUR withTax: 4999 withoutTax: 4201 recommendedRetailPrice: tax: vat: amount: 798 rate: 0.19 appliedReductions: [ ] customData: { } - id: 5 referenceKey: external-reference attributes: size: id: 2 key: size label: Size type: '' multiSelect: false values: id: 18 label: M value: m firstLiveAt: '2023-09-22T14:35:29+00:00' createdAt: '2023-09-22T14:34:45+00:00' updatedAt: '2024-04-23T03:17:39+00:00' stock: supplierId: 3 warehouseId: 1 quantity: 7 isSellableWithoutStock: false price: currencyCode: EUR withTax: 4999 withoutTax: 4201 recommendedRetailPrice: tax: vat: amount: 798 rate: 0.19 appliedReductions: [ ] customData: { } customData: { }