openapi: 3.0.3
externalDocs:
url: https://github.com/adobe-commerce/aco-ts-sdk/blob/main/README.md
description: Learn about the Adobe Commerce Optimizer TypeScript and JavaScript SDK for Merchandising Services
info:
title: Catalog Data Ingestion API
description: |
The Catalog Data Ingestion API allows you to create and manage products and price books and directly integrate catalog data with the Commerce catalog service.
This API provides the following resource collections to create and update catalog data:
- [Product Metadata](#tag/ProductMetadata)—define and manage product attribute metadata including display settings, search characteristics, filtering options, and sorting rules.
- [Category Metadata](#tag/CategoryMetadata)—define and manage category attribute metadata.
- [Categories](#tag/Categories)—Define and manage categories with hierarchical structure to build navigation menu.
- [Products](#tag/Products)—Define and manage catalog items with their attributes (name, description, SKU, images, and variants).
- [Price books](#tag/Price-Books)—Define and manage pricing scopes for different customer tiers and markets.
- [Prices](#tag/Prices)—Define and manage product SKU prices and their associated price books.
- [Product Layers](#tag/Product-Layers)—Define and manage product layers to customize and override base product data for specific contexts, locales, or business requirements.
version: 1.0.0
servers:
- url: https://na1-sandbox.api.commerce.adobe.com/{tenantId}
variables:
tenantId:
default: string
tags:
- name: ProductMetadata
description: |
Manage product attribute definitions including display settings, search behavior, and filtering capabilities.
These settings control how product attributes appear and function throughout the storefront.
Product attribute metadata specifies how product attributes are displayed on the storefront.
For example, you can define a product attribute as searchable, filterable, and sortable.
You can also define the search type for a product attribute, such as autocomplete or exact match.
- name: CategoryMetadata
description: |
Manage category attribute definitions.
These settings control how category attributes appear and function throughout the storefront.
Category attribute metadata specifies how category attributes are displayed on the storefront.
- name: Categories
description: |
Manage categories in a hierarchical structure with localization support.
Categories organize products into logical groups and support nested hierarchies using slug-based paths.
Category management includes:
- Creating categories with localized names and hierarchical slugs
- Updating existing category information
- Deleting categories from the catalog
- Associating categories with product families for enhanced organization
- Adding SEO meta tags (title, description, keywords) to categories
- Associating images with categories
Categories use a slug-based hierarchy format to represent parent-child relationships, for example, "men/clothing/pants".
After you create categories and assign them to products, you can retrieve category data to render storefront menus and manage hierarchical category
trees using the GraphQL `navigation` and `categorytree` queries. See
[Implement categories on the storefront](https://developer.adobe.com/commerce/services/optimizer/merchandising-services/categories-storefront-implementation/).
- name: Products
description: Create and manage product data including simple products, configurable products, and their variants. Control product visibility, attributes, images, and pricing
- name: Price Books
description: |
Define pricing scopes to manage product prices across different customer tiers and markets. Price books support a hierarchical model, allowing up to three levels of nested child price books under each base price book. Each price book can reference a parent price book, forming a tree structure for pricing scopes.
The base price book defines the currency for itself and all its child price books. Child price books inherit this currency and cannot override it.
Note: You cannot assign a parent price book to a base price book. Due to the asynchronous nature of the API, this validation is not enforced at runtime. API requests that attempt to set a parent price book for a base price book are ignored.
- name: Prices
description: |
Manage product SKU prices across different price books and customer tiers. Define regular prices,
discounts, and tiered pricing for specific customer segments or markets by specifying a price book id.
Before creating prices with the Prices API, first create [Price books](#tag/Price-Books). Prices that reference a non-existing price book are ignored.
The Prices API supports three main pricing components:
* **Regular Price** - The base price for a product SKU in a specific price book
* **Discounts** - Percentage or fixed amount discounts applied to the regular price
* **Tiered Pricing** - Quantity-based pricing that offers different prices based on purchase quantity.
Tiered pricing can be configured as a fixed or percentage price.
Price lookup logic
The product price lookup follows a hierarchical path through price books. The search starts at the specified price book
and traverses upward through parent price books until it finds a price or reaches the root level. A product is not assigned
a price if:
- No price is found in the entire hierarchy
- The price book specified in a price record has not been created
Important notes
* You cannot define prices for configurable products. Prices for configurable products are calculated based on the price of the selected product variant.
* Each discount requires a unique `code` identifier to distinguish between different discount types.
* Tier quantities must be greater than 1.
Best practices
**Price Book Management**
* Create price books before defining prices
* Use descriptive price book IDs and names
* Plan your pricing hierarchy before implementation
* Test price book relationships in development
**Pricing Strategy**
* Use consistent discount codes across your catalog
* Implement tiered pricing for bulk purchase incentives
* Consider geographic and customer segment pricing
* Monitor price performance and adjust strategies
**Data Management**
* Validate all price data before sending to production
* Use bulk operations for large price updates
* Implement proper error handling for failed requests
* Keep backup copies of pricing configurations
**Performance Considerations**
* Batch price updates for better performance
* Use gzip compression for large payloads
* Monitor API rate limits (300 requests per minute)
* Implement retry logic for failed requests
Common Use Cases
**Seasonal Pricing**
```json
{
"sku": "summer-dress",
"priceBookId": "us-seasonal",
"regular": 89.99,
"discounts": [
{
"code": "summer_sale",
"percentage": 30
}
]
}
```
**Customer Segment Pricing**
```json
{
"sku": "premium-product",
"priceBookId": "us-vip",
"regular": 199.99,
"discounts": [
{
"code": "vip_member",
"percentage": 20
}
],
"tierPrices": [
{
"qty": 2,
"percentage": 10
}
]
}
```
**Bulk Purchase Incentives**
```json
{
"sku": "office-supplies",
"priceBookId": "us-business",
"regular": 15.99,
"tierPrices": [
{
"qty": 10,
"price": 12.99
},
{
"qty": 25,
"price": 10.99
},
{
"qty": 50,
"percentage": 35
}
]
}
```
paths:
/v1/catalog/products/metadata:
post:
tags:
- ProductMetadata
summary: Create product attribute metadata
description: |
To ensure product data is indexed for discovery, create or replace existing product attribute metadata resources before creating products.
For each Commerce project, you must define metadata for the following attributes for each catalog source (`locale`):
- `sku`
- `name`
- `description`
- `shortDescription`
- `price`
Also, you can define metadata for custom attributes.
When creating product attribute metadata:
- Each product attribute requires a unique `code` and `source`.
- Use the `dataType` field to define the data type for the product attribute.
- Use the `visibleIn` field to define where the product attribute is displayed on the storefront.
- Use the `filterable`, `sortable`, and `searchable` fields to define how the product attribute
is used for filtering, sorting, and searching.
- Use the `searchWeight` field to define the search weight for the product attribute.
- Use the `searchTypes` field to define the search type for the product attribute.
To update existing product attribute metadata, use the update operation.
operationId: createProductMetadata
parameters:
- $ref: "#/components/parameters/Authorization"
- $ref: "#/components/parameters/ContentType"
- $ref: "#/components/parameters/ContentEncoding"
responses:
"200":
$ref: "#/components/responses/AcceptedResponse"
"400":
$ref: "#/components/responses/InvalidItemsResponse"
"401":
$ref: "#/components/responses/UnauthorizedResponse"
"403":
$ref: "#/components/responses/ForbiddenResponse"
"429":
$ref: "#/components/responses/TooManyRequestsResponse"
requestBody:
content:
application/json:
schema:
type: array
items:
$ref: "#/components/schemas/FeedProductMetadata"
examples:
FeedWithMetadataInformation:
summary: Create product attributes metadata
description: |
Creates searchable text attributes. This example defines metadata for the required attributes
with recommended default values.
value:
[
{
"code": "sku",
"source": { "locale": "en-US" },
"label": "Product Name",
"dataType": "TEXT",
"visibleIn":
[
"PRODUCT_DETAIL",
"PRODUCT_LISTING",
"SEARCH_RESULTS",
"PRODUCT_COMPARE"
],
"filterable": true,
"sortable": false,
"searchable": true,
"searchWeight": 1,
"searchTypes": ["AUTOCOMPLETE"]
},
{
"code": "name",
"source": { "locale": "en-US" },
"label": "Product Name",
"dataType": "TEXT",
"visibleIn":
[
"PRODUCT_DETAIL",
"PRODUCT_LISTING",
"SEARCH_RESULTS",
"PRODUCT_COMPARE"
],
"filterable": false,
"sortable": true,
"searchable": true,
"searchWeight": 1,
"searchTypes": ["AUTOCOMPLETE"]
},
{
"code": "description",
"source": { "locale": "en-US" },
"label": "Product Description",
"dataType": "TEXT",
"visibleIn": ["PRODUCT_DETAIL"],
"filterable": false,
"sortable": false,
"searchable": false,
"searchWeight": 1,
"searchTypes": ["AUTOCOMPLETE"]
},
{
"code": "shortDescription",
"source": { "locale": "en-US" },
"label": "Product Short Description",
"dataType": "TEXT",
"visibleIn": ["PRODUCT_DETAIL"],
"filterable": false,
"sortable": false,
"searchable": true,
"searchWeight": 1,
"searchTypes": ["AUTOCOMPLETE"]
},
{
"code": "price",
"source": { "locale": "en-US" },
"label": "Price",
"dataType": "DECIMAL",
"visibleIn":
[
"PRODUCT_DETAIL",
"PRODUCT_LISTING",
"SEARCH_RESULTS",
"PRODUCT_COMPARE"
],
"filterable": true,
"sortable": true,
"searchable": false,
"searchWeight": 1,
"searchTypes": []
}
]
patch:
tags:
- ProductMetadata
summary: Update product attribute metadata
description: |
Update existing product attribute metadata with new values.
When the update is processed, the merge strategy is used to apply changes to `scalar` and `object` type fields. The replace strategy is used to apply changes for fields in an `array`.
> **Note:** Before submitting an update request, verify that the target entity exists using the
[attributeMetadata](https://developer.adobe.com/commerce/services/includes/autogenerated/merchandising-api#attributemetadata) GraphQL query. Update operations do not verify that the entity exists. Requests targeting a nonexistent entity are accepted, but the update has no effect.
operationId: updateProductMetadata
parameters:
- $ref: "#/components/parameters/Authorization"
- $ref: "#/components/parameters/ContentType"
- $ref: "#/components/parameters/ContentEncoding"
responses:
"200":
$ref: "#/components/responses/AcceptedResponse"
"400":
$ref: "#/components/responses/InvalidItemsResponse"
"401":
$ref: "#/components/responses/UnauthorizedResponse"
"403":
$ref: "#/components/responses/ForbiddenResponse"
"429":
$ref: "#/components/responses/TooManyRequestsResponse"
requestBody:
content:
application/json:
schema:
type: array
items:
$ref: "#/components/schemas/FeedProductMetadataUpdate"
examples:
FeedWithMetadataInformation:
summary: Example of product attribute metadata
description: |
Update existing product attribute metadata with new values.
Note that fields with the `array` type will replace existing data.
The example below updates the following attributes:
* `label` - Change the product attribute label.
* `visibleIn` - Add `PRODUCT_LISTING` role to the product attribute.
value:
[
{
"code": "name",
"source": { "locale": "en-US" },
"label": "Updated - Product Name",
"visibleIn": [
"PRODUCT_DETAIL",
"PRODUCT_LISTING"
]
}
]
/v1/catalog/products/metadata/delete:
post:
tags:
- ProductMetadata
summary: Delete product attributes metadata
description: Remove product attribute metadata resources from the catalog data.
operationId: deleteProductMetadata
parameters:
- $ref: "#/components/parameters/Authorization"
- $ref: "#/components/parameters/ContentType"
- $ref: "#/components/parameters/ContentEncoding"
responses:
"200":
$ref: "#/components/responses/AcceptedResponse"
"400":
$ref: "#/components/responses/InvalidItemsResponse"
"401":
$ref: "#/components/responses/UnauthorizedResponse"
"403":
$ref: "#/components/responses/ForbiddenResponse"
"429":
$ref: "#/components/responses/TooManyRequestsResponse"
requestBody:
content:
application/json:
schema:
type: array
items:
$ref: "#/components/schemas/FeedProductMetadataDelete"
examples:
FeedWithMetadataInformation:
summary: Delete product attribute metadata
description: Marks existing product attribute metadata as deleted.
value: [
{
"code": "name",
"source": { "locale": "en-US" }
}
]
/v1/catalog/categories/metadata:
post:
tags:
- CategoryMetadata
summary: Create category attribute metadata
description: |
When creating category attribute metadata:
- Each category attribute requires a unique `code` and `source`.
- Use the `dataType` field to define the data type for the category attribute.
To update existing category attribute metadata, use the update operation.
operationId: createCategoryMetadata
parameters:
- $ref: "#/components/parameters/Authorization"
- $ref: "#/components/parameters/ContentType"
- $ref: "#/components/parameters/ContentEncoding"
responses:
"200":
$ref: "#/components/responses/AcceptedResponse"
"400":
$ref: "#/components/responses/InvalidItemsResponse"
"401":
$ref: "#/components/responses/UnauthorizedResponse"
"403":
$ref: "#/components/responses/ForbiddenResponse"
"429":
$ref: "#/components/responses/TooManyRequestsResponse"
requestBody:
content:
application/json:
schema:
type: array
items:
$ref: "#/components/schemas/FeedCategoryMetadata"
examples:
FeedWithMetadataInformation:
summary: Create category attributes metadata
description: |
This example defines metadata for the required attributes with recommended default values.
value:
[
{
"code": "bottom_description",
"source": { "locale": "en-US" },
"label": "Category Description",
"dataType": "TEXT"
}
]
patch:
tags:
- CategoryMetadata
summary: Update category attribute metadata
description: |
Update existing category attribute metadata with new values.
When the update is processed, the merge strategy is used to apply changes to `scalar` and `object` type fields. The replace strategy is used to apply changes for fields in an `array`.
> **Note:** Update operations do not verify that the entity exists. Requests targeting a nonexistent entity are accepted, but the update has no effect.
operationId: updateCategoryMetadata
parameters:
- $ref: "#/components/parameters/Authorization"
- $ref: "#/components/parameters/ContentType"
- $ref: "#/components/parameters/ContentEncoding"
responses:
"200":
$ref: "#/components/responses/AcceptedResponse"
"400":
$ref: "#/components/responses/InvalidItemsResponse"
"401":
$ref: "#/components/responses/UnauthorizedResponse"
"403":
$ref: "#/components/responses/ForbiddenResponse"
"429":
$ref: "#/components/responses/TooManyRequestsResponse"
requestBody:
content:
application/json:
schema:
type: array
items:
$ref: "#/components/schemas/FeedCategoryMetadataUpdate"
examples:
FeedWithMetadataInformation:
summary: Example of category attribute metadata
description: |
Update existing category attribute metadata with new values.
Note that fields with the `array` type will replace existing data.
The example below updates the following attributes:
* `label` - Change the category attribute label.
value:
[
{
"code": "bottom_description",
"source": { "locale": "en-US" },
"label": "Updated - Category Description"
}
]
/v1/catalog/categories/metadata/delete:
post:
tags:
- CategoryMetadata
summary: Delete category attributes metadata
description: Remove category attribute metadata resources from the catalog data.
operationId: deleteCategoryMetadata
parameters:
- $ref: "#/components/parameters/Authorization"
- $ref: "#/components/parameters/ContentType"
- $ref: "#/components/parameters/ContentEncoding"
responses:
"200":
$ref: "#/components/responses/AcceptedResponse"
"400":
$ref: "#/components/responses/InvalidItemsResponse"
"401":
$ref: "#/components/responses/UnauthorizedResponse"
"403":
$ref: "#/components/responses/ForbiddenResponse"
"429":
$ref: "#/components/responses/TooManyRequestsResponse"
requestBody:
content:
application/json:
schema:
type: array
items:
$ref: "#/components/schemas/FeedCategoryMetadataDelete"
examples:
FeedWithMetadataInformation:
summary: Delete category attribute metadata
description: Marks existing category attribute metadata as deleted.
value: [
{
"code": "bottom_description",
"source": { "locale": "en-US" }
}
]
/v1/catalog/categories:
post:
tags:
- Categories
summary: Create categories
description: |
Create new categories with hierarchical structure and slug-based paths.
Categories organize products into logical groups and support nested hierarchies.
When creating categories:
- Each category requires a unique `slug` and `source`.
- To create parent-child relationships, create the `slug` field in a hierarchical format, for example `men/clothing/pants'.
- A category `slug` string can contain only lowercase letters, numbers, and hyphens with `/` used as a separator for hierarchy.
- Create each category as a separate entity.
- Use the `name` field to define the display name for the category.
- Use the optional `description` field to provide a full-text description of the category.
- Use the optional `families` field to associate categories with product families for enhanced organization.
- Use the optional `position` field to assign a numeric sort order to the category.
- Use the optional `metaTags` field to define SEO meta tags (title, description, keywords) for the category.
- Use the optional `images` field to associate images with the category.
- Use the optional `attributes` field to add additional attributes.
After you create categories, link a product to a category using the `path` value for the [routes](#operation/createProducts!path=routes&t=request) field. When you create or update products. The value of `path` in the route must match the `slug` value for the category.
To update existing categories, use the update operation.
operationId: createCategories
parameters:
- $ref: "#/components/parameters/Authorization"
- $ref: "#/components/parameters/ContentType"
- $ref: "#/components/parameters/ContentEncoding"
responses:
"200":
$ref: "#/components/responses/AcceptedResponse"
"400":
$ref: "#/components/responses/InvalidItemsResponse"
"401":
$ref: "#/components/responses/UnauthorizedResponse"
"403":
$ref: "#/components/responses/ForbiddenResponse"
"429":
$ref: "#/components/responses/TooManyRequestsResponse"
requestBody:
content:
application/json:
schema:
type: array
items:
$ref: "#/components/schemas/FeedCategory"
examples:
FeedWithCategoryInformation:
summary: Create product categories
description: |
Creates hierarchical product categories. This example shows creating parent and child categories
with product family associations.
value:
[
{
"slug": "men",
"source": { "locale": "en-US" },
"name": "Men",
"description": "Men's clothing, shoes, and accessories",
"families": ["apparel", "accessories"],
"position": 1,
"metaTags": {
"title": "Men's Collection",
"description": "Shop men's clothing, shoes, and accessories",
"keywords": ["men", "clothing", "accessories"]
},
"attributes": [
{
"code": "bottom_description",
"values": ["The bottom description"]
}
],
"images": [
{
"url": "https://example.com/images/men-category.png",
"label": "Men's Category",
"roles": ["BASE"],
"customRoles": []
}
]
},
{
"slug": "men/clothing",
"source": { "locale": "en-US" },
"name": "Men's Clothing",
"description": "Men's clothing and apparel",
"families": ["apparel"]
},
{
"slug": "men/clothing/pants",
"source": { "locale": "en-US" },
"name": "Men's Pants",
"families": ["apparel"]
}
]
patch:
tags:
- Categories
summary: Update categories
description: |
Update existing product categories with new values.
When the update is processed, the merge strategy is used to apply changes to `scalar` and `object` type fields. The replace strategy is used to apply changes for fields in an `array`.
> **Note:** Update operations do not verify that the entity exists. Requests targeting a nonexistent entity are accepted, but the update has no effect.
operationId: updateCategories
parameters:
- $ref: "#/components/parameters/Authorization"
- $ref: "#/components/parameters/ContentType"
- $ref: "#/components/parameters/ContentEncoding"
responses:
"200":
$ref: "#/components/responses/AcceptedResponse"
"400":
$ref: "#/components/responses/InvalidItemsResponse"
"401":
$ref: "#/components/responses/UnauthorizedResponse"
"403":
$ref: "#/components/responses/ForbiddenResponse"
"429":
$ref: "#/components/responses/TooManyRequestsResponse"
requestBody:
content:
application/json:
schema:
type: array
items:
$ref: "#/components/schemas/FeedCategoryUpdate"
examples:
FeedWithCategoryInformation:
summary: Example of category updates
description: |
Update existing product categories with new values.
Note that fields with the `array` type will replace existing data.
The example below updates the following:
* `name` - Change the category display name.
* `families` - Replace the product families associated with the category.
* `metaTags` - Update the SEO meta tags for the category.
* `images` - Replace the images associated with the category.
value:
[
{
"slug": "men/clothing",
"source": { "locale": "en-US" },
"name": "Men's Apparel",
"description": "Updated collection of men's apparel and fashion",
"families": ["clothing", "fashion"],
"metaTags": {
"title": "Men's Apparel - Updated",
"description": "Updated collection of men's apparel",
"keywords": ["men", "apparel", "fashion"]
},
"images": [
{
"url": "https://example.com/images/mens-apparel.png",
"label": "Men's Apparel",
"roles": ["BASE"],
"customRoles": []
}
]
}
]
/v1/catalog/categories/delete:
post:
tags:
- Categories
summary: Delete categories
description: |
Delete categories and all their associated children
Cascading Deletion
When you delete a category:
* **Child categories**: All child categories in the hierarchy are deleted automatically
* **Hierarchy Impact**: The entire branch below the deleted category is removed
Recovery Options
If a category is deleted by mistake:
* **Time Window**: You have up to one week to restore deleted categories
* **Restoration Method**: Recreate the top-level deleted category using the [Create category operation](#operation/createCategories)
* **State Recovery**: Categories are restored to their exact state from the time of deletion, including all metadata, family associations, and hierarchy relationships
* **Hierarchy Reconstruction**: The entire hierarchy is rebuilt from the restoration payload
operationId: deleteCategories
parameters:
- $ref: "#/components/parameters/Authorization"
- $ref: "#/components/parameters/ContentType"
- $ref: "#/components/parameters/ContentEncoding"
responses:
"200":
$ref: "#/components/responses/AcceptedResponse"
"400":
$ref: "#/components/responses/InvalidItemsResponse"
"401":
$ref: "#/components/responses/UnauthorizedResponse"
"403":
$ref: "#/components/responses/ForbiddenResponse"
"429":
$ref: "#/components/responses/TooManyRequestsResponse"
requestBody:
content:
application/json:
schema:
type: array
items:
$ref: "#/components/schemas/FeedCategoryDelete"
examples:
FeedWithCategoryInformation:
summary: Delete categories
description: Marks existing categories as deleted.
value: [
{
"slug": "men/clothing/pants",
"source": { "locale": "en-US" }
},
{
"slug": "women/shoes/boots",
"source": { "locale": "en-US" }
}
]
/v1/catalog/products:
post:
tags:
- Products
summary: Create or replace products
description: |
You can create different types of products, such as simple products and configurable products.
When creating products:
- Each product requires a unique SKU identifier.
- Products must have a defined catalog source, for example `locale`.
- Add values for the required `name`, `slug`, and `status` fields.
- Define optional fields such as descriptions, images, and custom attributes as needed.
- Use the `links` field to define relationships between products, such as linking a product variant to its parent
configurable product.
- You can create multiple products in a single request, and also create product variants for configurable products in the same request.
- Use the `routes` field to set category paths. The `path` value must match an existing category slug, for example `men/clothing`.
- Create a route for each category path. For example to include a product in each of the following categories `men`, `men/clothing`, and `men/clothing/pants`, specify three `path` values, one for each category.
Simple products
Create products or replace existing products with specified `sku` and `source` values.
Use the [update operation](#operation/updateProducts) to modify values for an existing product.
Configurable products
A configurable product is a parent product that allows customers to select from multiple predefined attributes such as color, size, and material.
Each unique combination of these attribute values (for example, `color=green`, `size=large`) represents a product variant.
Each variant is treated as a distinct child product with its own SKU, price, and inventory. These variants are stored as separate entities in the database and linked to the parent configurable product.
The configurable product itself acts as a container or abstraction layer, enabling a unified frontend experience while maintaining
granular control over each variant on the backend.
To create a configurable product, you need the following:
* Product attributes—Create product attributes (for example, "color", "size")
that will be used to differentiate product variants. These attributes must be registered in the system before they can be referenced in
product definitions.
* Configurable product—Define the parent product and include a
[configurations](#operation/createProducts!path=configurations&t=request) array that specifies the selectable options
and maps each option to a set of possible values. Each value must include a
[variantReferenceId](#operation/createProducts!path=configurations/values/variantReferenceId&t=request),
which links to a specific variant.
* Product variants—Define a product variant for each valid combination of attribute values. Each variant must:
* Include relevant attribute values in an [attributes](#operation/createProducts!path=attributes&t=request) array.
* Reference the parent configurable product using variantReferenceId.
* Include a [links](#operation/createProducts!path=links&t=request) array with a link of type `VARIANT_OF` pointing to the configurable product.
For example:
{
"sku": "pants-red-32",
"attributes": [
{
"code": "color",
"values": ["Red"],
"variantReferenceId": "pants-color-red"
}
],
"links": [
{
"type": "VARIANT_OF",
"sku": "pants"
}
]
}
Each product variant links back to the configurable product through its `variantReferenceId`, which corresponds to specific `configurations[].values[].variantReferenceId` in the configurable product.
To unassign a product variant from a configurable product, do one of the following:
- Use [Delete Product API](#operation/deleteProducts) to delete the product variant.
- Use [Update Product API](#operation/updateProducts) to set the ["variantReferenceId"](#operation/createProducts!path=attributes/variantReferenceId&t=request) to `null` and unassign the product variant from the configurable product by removing the ["links"](#operation/createProducts!path=links&t=request) association.
Bundle products
A bundle product combines several simple products into one sellable unit. Items within the bundle can be categorized into logical groups like `tops`, `bottoms`, and `accessories`.
Each group can have multiple items, and shoppers can select items from each group to create a customized bundle.
To create a bundle product, you need the following:
* Bundle product—[Define the parent product](#operation/createProducts) and include a [bundles](#operation/createProducts!path=bundles) array that
specifies the groups and items included in the bundle. Each group must define:
* `group` - Name of the group (for example, "tops", "bottoms")
* `required` - Whether a selection from this group is mandatory
* `multiSelect` - Whether multiple items can be selected
* `items` - List of products that can be selected from this group
* Simple products—Define each simple product to include in the bundle. Each product must:
* Include a [links](#operation/createProducts!path=links) array with a link of type `IN_BUNDLE` pointing to the bundle product
* Be created separately using the [create product API](#operation/createProducts)
Note: A simple product can be included only once in each bundle.
If the same item is specified in multiple groups, the API returns a `Duplicate SKU found in bundle items` error.
To update a bundle product, do one of the following:
* Use the [Update products API](#operation/updateProducts) to modify the groups and items in the bundle
* Use the [Delete products API](#operation/deleteProducts) to remove items from the bundle
operationId: createProducts
parameters:
- $ref: "#/components/parameters/Authorization"
- $ref: "#/components/parameters/ContentType"
- $ref: "#/components/parameters/ContentEncoding"
responses:
"200":
$ref: "#/components/responses/AcceptedResponse"
"400":
$ref: "#/components/responses/InvalidItemsResponse"
"401":
$ref: "#/components/responses/UnauthorizedResponse"
"403":
$ref: "#/components/responses/ForbiddenResponse"
"429":
$ref: "#/components/responses/TooManyRequestsResponse"
requestBody:
content:
application/json:
schema:
type: array
items:
$ref: "#/components/schemas/FeedProduct"
examples:
SimpleProductWithImages:
summary: Create a simple product
description: >
Create a simple product with required and optional fields.
value:
[
{
"sku": "red-pants",
"source": { "locale": "en-US" },
"name": "red pants",
"slug": "red-pants.html",
"status": "ENABLED",
"description": "long description about red pants",
"shortDescription": "just pants",
"visibleIn":
[
"CATALOG",
"SEARCH"
],
"metaTags":
{
"title": "Yoga pants ",
"description": "Climb with Zeppelin Yoga Pant",
"keywords": ["pants", "yoga"]
},
"attributes":
[
{
"code": "cost",
"values": ["10.5"]
},
{
"code": "states",
"values": ["TX", "CA"]
}
],
"images":
[
{
"url": "https://example.com/images/pants.jpg",
"label": "photo of my pants!",
"roles": ["BASE", "THUMBNAIL"],
"customRoles": ["widget"]
}
],
"routes":
[
{ "path": "men" },
{ "path": "men/clothing/", "position": 1 },
{ "path": "men/clothing/pants", "position": 1}
]
}
]
ConfigurableProductWithVariants:
summary: Create a configurable product with four product variants
description: >
Create a configurable product `pants` with four product variants: `pants-red-32`, `pants-red-44`, `pants-green-32` and `pants-green-44`.
value:
[
{
"sku": "pants",
"source": { "locale": "en-US" },
"name": "Yoga pants",
"slug": "zeppelin-yoga-pant",
"status": "ENABLED",
"visibleIn": ["CATALOG"],
"configurations":
[
{
"attributeCode": "color",
"label": "Pants color",
"defaultVariantReferenceId": "pants-color-red",
"type": "SWATCH",
"values":
[
{
"variantReferenceId": "pants-color-red",
"label": "Red",
"colorHex": "#ff0000"
},
{
"variantReferenceId": "pants-color-green",
"label": "Green",
"imageUrl": "https://www.example.com/media/catalog/product/green_main_1.jpg"
}
]
},
{
"attributeCode": "size",
"label": "Pants size",
"defaultVariantReferenceId": "pants-size-32",
"type": "CONFIGURABLE",
"values":
[
{
"variantReferenceId": "pants-size-32",
"label": "32"
},
{
"variantReferenceId": "pants-size-44",
"label": "44"
}
]
}
]
},
{
"sku": "pants-red-32",
"source": { "locale": "en-US" },
"name": "Zeppelin Yoga Pant Red 32 size",
"slug": "pants-red-32",
"status": "ENABLED",
"attributes":
[
{
"code": "color",
"values": ["Red Pants"],
"variantReferenceId": "pants-color-red"
},
{
"code": "size",
"values": ["32"],
"variantReferenceId": "pants-size-32"
}
],
"links":
[
{
"type": "variant_of",
"sku": "pants"
}
]
},
{
"sku": "pants-red-44",
"source": { "locale": "en-US" },
"name": "Zeppelin Yoga Pant Red 44 size",
"slug": "pants-red-44",
"status": "ENABLED",
"attributes":
[
{
"code": "color",
"values": ["Red Pants"],
"variantReferenceId": "pants-color-red"
},
{
"code": "size",
"values": ["44"],
"variantReferenceId": "pants-size-44"
}
],
"links":
[
{
"type": "VARIANT_OF",
"sku": "pants"
}
]
},
{
"sku": "pants-green-32",
"source": { "locale": "en-US" },
"name": "Zeppelin Yoga Pant Green 32 size",
"slug": "pants-green-32",
"status": "ENABLED",
"attributes":
[
{
"code": "color",
"values": ["Green Pants"],
"variantReferenceId": "pants-color-green"
},
{
"code": "size",
"values": ["32"],
"variantReferenceId": "pants-size-32"
}
],
"links":
[
{
"type": "VARIANT_OF",
"sku": "pants"
}
]
},
{
"sku": "pants-green-44",
"source": { "locale": "en-US" },
"name": "Zeppelin Yoga Pant green 44 size",
"slug": "pants-green-44",
"status": "ENABLED",
"attributes":
[
{
"code": "color",
"values": ["Green Pants"],
"variantReferenceId": "pants-color-green"
},
{
"code": "size",
"values": ["44"],
"variantReferenceId": "pants-size-44"
}
],
"links":
[
{
"type": "VARIANT_OF",
"sku": "pants"
}
]
}
]
BundleProductWithItems:
summary: Create a bundle product with multiple items
description: >
Create a bundle product `bundle-outfit` with multiple items grouped into categories like `tops`, `bottoms`, and `accessories`.
An item can be included only once in each bundle product.
value:
[
{
"sku": "bundle-outfit",
"source": { "locale": "en-US" },
"name": "Bundle Outfit",
"slug": "bundle-outfit",
"status": "ENABLED",
"visibleIn": ["CATALOG"],
"bundles":
[
{
"group": "tops",
"required": true,
"multiSelect": false,
"defaultItemSkus": ["top-red"],
"items":
[
{
"sku": "top-red",
"qty": 1,
"userDefinedQty": false
},
{
"sku": "top-blue",
"qty": 1,
"userDefinedQty": false
}
]
},
{
"group": "bottoms",
"required": true,
"multiSelect": false,
"defaultItemSkus": ["bottom-black"],
"items":
[
{
"sku": "bottom-black",
"qty": 1,
"userDefinedQty": false
},
{
"sku": "bottom-white",
"qty": 1,
"userDefinedQty": false
}
]
},
{
"group": "accessories",
"required": false,
"multiSelect": true,
"items":
[
{
"sku": "socks",
"qty": 1,
"userDefinedQty": true
},
{
"sku": "headband",
"qty": 1,
"userDefinedQty": true
}
]
}
]
},
{
"sku": "top-red",
"source": { "locale": "en-US" },
"name": "Red Top",
"slug": "top-red",
"status": "ENABLED",
"visibleIn": ["CATALOG"],
"links":
[
{ "type": "in_bundle",
"sku": "bundle-outfit"
}
]
},
{
"sku": "top-blue",
"source": { "locale": "en-US" },
"name": "Blue Top",
"slug": "top-blue",
"status": "ENABLED",
"visibleIn": ["CATALOG"],
"links":
[
{ "type": "in_bundle",
"sku": "bundle-outfit"
}
]
},
{
"sku": "bottom-black",
"source": { "locale": "en-US" },
"name": "Black Bottom",
"slug": "bottom-black",
"status": "ENABLED",
"visibleIn": ["CATALOG"],
"links":
[
{ "type": "in_bundle",
"sku": "bundle-outfit"
}
]
},
{
"sku": "bottom-white",
"source": { "locale": "en-US" },
"name": "White Bottom",
"slug": "bottom-white",
"status": "ENABLED",
"visibleIn": ["CATALOG"],
"links":
[
{ "type": "in_bundle",
"sku": "bundle-outfit"
}
]
},
{
"sku": "socks",
"source": { "locale": "en-US" },
"name": "Socks",
"slug": "socks",
"status": "ENABLED",
"visibleIn": ["CATALOG"],
"links":
[
{ "type": "in_bundle",
"sku": "bundle-outfit"
}
]
},
{
"sku": "headband",
"source": { "locale": "en-US" },
"name": "Headband",
"slug": "headband",
"status": "ENABLED",
"visibleIn": ["CATALOG"],
"links":
[
{ "type": "in_bundle",
"sku": "bundle-outfit"
}
]
}
]
patch:
tags:
- Products
summary: Update products
description: |
Update products with specified `sku` and `source` values to replace existing field data with the data supplied in the request.
When the update is processed, the merge strategy is used to apply changes to `scalar` and `object` type fields.
For `array` type fields, a new value can be appended to the existing list. For an object list, you can update a specific object by matching on a key field. The following fields are supported:
* `attributes` - match on `code`
* `images` - match on `url`
* `routes` - match on `path`
* `links` - match on `type` and `sku`
* `bundles` match on `type` and `group`
* `configurations` match on `type` and `attributeCode`
* `externalIds` match on `type` and `origin`
> **Note:** Before submitting an update request, verify that the target entity exists using the [products](https://developer.adobe.com/commerce/services/includes/autogenerated/merchandising-api#products) GraphQL query. Update operations do not verify that the entity exists. Requests targeting a nonexistent entity are accepted, but the update has no effect.
operationId: updateProducts
parameters:
- $ref: "#/components/parameters/Authorization"
- $ref: "#/components/parameters/ContentType"
- $ref: "#/components/parameters/ContentEncoding"
responses:
"200":
$ref: "#/components/responses/AcceptedResponse"
"400":
$ref: "#/components/responses/InvalidItemsResponse"
"401":
$ref: "#/components/responses/UnauthorizedResponse"
"403":
$ref: "#/components/responses/ForbiddenResponse"
"429":
$ref: "#/components/responses/TooManyRequestsResponse"
requestBody:
content:
application/json:
schema:
type: array
items:
$ref: "#/components/schemas/FeedProductUpdate"
examples:
SimpleProductWithImages:
summary: Update a simple product
description: |
Update a simple product with the values provided in the request.
On update, changes to `scalar` and `object` type fields are applied using the merge strategy.
The replace strategy is used to apply changes for fields in an `array`.
In the example below, the following attributes are updated.
* `name` - Change the product name.
* `metaTags.title` - Change the title of the product detail page.
value:
[
{
"sku": "red-pants",
"source": { "locale": "en-US" },
"name": "Red pants - discounts!",
"metaTags": { "title": "Updated - Red" }
}
]
UnassignProductVariant:
summary: Unassign product variant `pants-red-32` from configurable product `pants`
description: |
To unassign product variant `pants-red-32` from configurable product `pants` you need:
* remove the `variantReferenceId` from the `attributes` field
* remove the `links` association
value:
[
{
"sku": "pants-red-32",
"source": { "locale": "en-US" },
"attributes":
[
{
"code": "color",
"values": ["Red Pants"],
"variantReferenceId": null
},
{
"code": "size",
"values": ["32"],
"variantReferenceId": null
}
],
"links": []
}
]
AddNewAccessoryItem:
summary: Add a new item `gloves` to the accessories group of the bundle product `bundle-outfit`
description: |
To add a new item `gloves` to the accessories group of the bundle product `bundle-outfit`, include the new item in the `items` array of the `accessories` group.
The previously created items `socks` and `headband` should be retained in the updated bundle.
Note that simple product `gloves` must be created separately using the create product API.
value:
[
{
"sku": "bundle-outfit",
"source": { "locale": "en-US" },
"bundles":
[
{
"group": "accessories",
"required": false,
"multiSelect": true,
"items":
[
{
"sku": "socks",
"qty": 1,
"userDefinedQty": true
},
{
"sku": "headband",
"qty": 1,
"userDefinedQty": true
},
{
"sku": "gloves",
"qty": 1,
"userDefinedQty": true
}
]
}
]
}
]
AddNewAttributeAndReplaceExisting:
summary: Add a new attribute and replace existing one
description: |
Add a new attribute `warehouse`, and update the value of the existing `cost` attribute for the simple product `red-pants`
In the example below:
* A new attribute with the code `warehouse` is added to the attributes list
* The value of the existing `cost` attribute is replaced with new value
The previously created `states` attribute is preserved.
Note: Don't forget to create the product attribute metadata (link for the `warehouse` attribute if it doesn't exist yet.
value:
[
{
"sku": "red-pants",
"source": { "locale": "en-US" },
"attributes":
[
{
"code": "warehouse",
"values": [ "Austin" ]
},
{
"code": "cost",
"values": ["12"]
}
]
}
]
/v1/catalog/products/delete:
post:
tags:
- Products
summary: Delete products
description: >
Delete products with specified `sku` and `source` values
operationId: deleteProducts
parameters:
- $ref: "#/components/parameters/Authorization"
- $ref: "#/components/parameters/ContentType"
- $ref: "#/components/parameters/ContentEncoding"
responses:
"200":
$ref: "#/components/responses/AcceptedResponse"
"400":
$ref: "#/components/responses/InvalidItemsResponse"
"401":
$ref: "#/components/responses/UnauthorizedResponse"
"403":
$ref: "#/components/responses/ForbiddenResponse"
"429":
$ref: "#/components/responses/TooManyRequestsResponse"
requestBody:
content:
application/json:
schema:
type: array
items:
$ref: "#/components/schemas/FeedProductDelete"
examples:
DeleteSimpleProduct:
summary: Delete product
description: >
Delete a simple product with specified `sku` and `source` values
value:
[
{
"sku": "red-pants",
"source": { "locale": "en-US" }
}
]
/v1/catalog/products/layers:
post:
tags:
- Product Layers
summary: Create or replace product layers
description: |
Create product layers to customize and override base product data for specific contexts, locales, or business requirements.
Product layers enable you to:
- Override product attributes for specific markets or channels
- Provide locale-specific content while maintaining a global base product
- Create seasonal or promotional variations without duplicating entire product records
- Implement A/B testing scenarios with different product presentations
For details on how to use layers with Adobe Commerce Optimizer, see
[Catalog Layers](https://experienceleague.adobe.com/en/docs/commerce/optimizer/setup/catalog-layer) in the
Adobe Commerce Optimizer documentation.
## Layer behavior and requirements
**Required fields:**
- `sku`: Must match an existing base product SKU
- `source.layer`: Identifies the layer name for organization and retrieval
**Optional Fields:**
- `source.locale`: When specified, layer applies only to that locale. When omitted, layer applies globally across all locales
- All product fields (name, description, images, and so on): Override corresponding base product values
## Merging logic
Product layers use intelligent merging:
- **Simple fields** (name, description, and so on): Complete replacement of base values
- **Array fields** (attributes, images, etc.): First-level arrays are merged with base arrays
- **Nested arrays** (attribute.values, etc.): Complete replacement of nested arrays
**Example:** Adding a color variant while preserving existing attributes:
```json
{
"sku": "red-pants",
"source": {
"locale": "en-US",
"layer": "seasonal-colors"
},
"attributes": [
{
"code": "color",
"values": ["Crimson Red", "Deep Red"],
"variantReferenceId": "pants-color-crimson"
}
]
}
```
operationId: createProductLayers
parameters:
- $ref: "#/components/parameters/Authorization"
- $ref: "#/components/parameters/ContentType"
- $ref: "#/components/parameters/ContentEncoding"
responses:
"200":
$ref: "#/components/responses/AcceptedResponse"
"400":
$ref: "#/components/responses/InvalidItemsResponse"
"401":
$ref: "#/components/responses/UnauthorizedResponse"
"403":
$ref: "#/components/responses/ForbiddenResponse"
"429":
$ref: "#/components/responses/TooManyRequestsResponse"
requestBody:
content:
application/json:
schema:
type: array
items:
$ref: "#/components/schemas/FeedProductLayer"
examples:
ProductLayerWithImages:
summary: Create a seasonal product layer
description: >
Create a product layer that overrides the base product with seasonal branding,
localized content, and updated imagery for the US market.
value:
[
{
"sku": "red-pants",
"source": {
"locale": "en-US",
"layer": "seasonal-winter-2024"
},
"name": "Premium Red Winter Pants - Limited Edition",
"description": "Stay warm and stylish with our premium red winter pants. Features thermal lining and water-resistant fabric perfect for cold weather adventures.",
"shortDescription": "Premium thermal-lined winter pants in warm, classic red",
"images": [
{
"url": "https://cdn.example.com/products/red-pants-winter-2024.jpg",
"label": "Premium Red Winter Pants - Front View",
"roles": ["BASE", "THUMBNAIL"],
"customRoles": ["hero", "seasonal-banner"]
}
]
}
]
/v1/catalog/products/layers/delete:
post:
tags:
- Product Layers
summary: Delete product layers
description: |
Remove specific product layers by SKU and source identifiers. This operation permanently deletes
the layer data while preserving the base product.
**Use Cases:**
- Remove expired seasonal or promotional layers
- Clean up test layers after A/B testing completion
- Delete locale-specific layers when discontinuing market support
- Remove outdated customizations
**Important Notes:**
- Only the specified layer is deleted; base product and other layers remain intact
- Both `sku` and `source` (locale + layer) must match exactly for successful deletion
operationId: deleteProductLayers
parameters:
- $ref: "#/components/parameters/Authorization"
- $ref: "#/components/parameters/ContentType"
- $ref: "#/components/parameters/ContentEncoding"
responses:
"200":
$ref: "#/components/responses/AcceptedResponse"
"400":
$ref: "#/components/responses/InvalidItemsResponse"
"401":
$ref: "#/components/responses/UnauthorizedResponse"
"403":
$ref: "#/components/responses/ForbiddenResponse"
"429":
$ref: "#/components/responses/TooManyRequestsResponse"
requestBody:
content:
application/json:
schema:
type: array
items:
$ref: "#/components/schemas/FeedProductLayerDelete"
examples:
DeleteSeasonalLayer:
summary: Delete seasonal product layer
description: >
Delete a seasonal product layer after the promotion period ends,
reverting the product to its base configuration.
value:
[
{
"sku": "red-pants",
"source": {
"locale": "en-US",
"layer": "seasonal-winter-2024"
}
}
]
/v1/catalog/price-books:
post:
tags:
- Price Books
summary: Create price books
description: |
Create or replace existing price books with support for hierarchical pricing structures.
Creating Base Price Books
Base price books are the foundation of your pricing hierarchy:
* **Required Fields**: `priceBookId`, `name`, `currency`
* **Currency Definition**: Sets the currency for the entire branch of child price books
* **No Parent**: Base price books cannot reference a parent price book
* **Unique ID**: Must have a unique `priceBookId` across all price books
Creating Child Price Books
Child price books inherit from their parent and can extend the hierarchy:
* **Required Fields**: `priceBookId`, `name`, `parentId`
* **Parent Reference**: Must reference an existing parent price book
* **Currency Inheritance**: Automatically inherits currency from parent
* **Hierarchy Depth**: Can create up to 3 levels of nesting
Hierarchy Management
* **Parent Assignment**: Once a `parentId` is assigned, it cannot be changed via update operations
* **Restructuring**: To change parent-child relationships, delete and recreate the child price book
* **Validation**: The system validates parent references and hierarchy depth limits
Use the [update price books operation](#operation/updatePriceBooks) to modify existing price book names or base price book currencies.
operationId: createPriceBooks
parameters:
- name: Content-Type
in: header
required: true
schema:
type: string
enum: [application/json]
- name: Authorization
in: header
required: true
schema:
type: string
description: Authorization Bearer token
- name: Content-Encoding
in: header
required: false
schema:
type: string
enum: [gzip]
description: Use this header if the payload is compressed with gzip.
requestBody:
content:
application/json:
schema:
type: array
items:
$ref: "#/components/schemas/FeedPricebook"
examples:
FeedWithPricebookInformation:
summary: Create a hierarchical price book structure
description: |
Create a comprehensive pricing hierarchy with a base price book and multiple child price books.
This example demonstrates geographic pricing with regional variations.
value:
[
{
"priceBookId": "us",
"name": "US Base Price Book",
"currency": "USD"
},
{
"priceBookId": "us-north",
"parentId": "us",
"name": "US North Region"
},
{
"priceBookId": "us-south",
"parentId": "us",
"name": "US South Region"
},
{
"priceBookId": "us-north-east",
"parentId": "us-north",
"name": "US Northeast Territory"
},
{
"priceBookId": "us-north-west",
"parentId": "us-north",
"name": "US Northwest Territory"
}
]
responses:
"200":
description: All items in the request are accepted for further processing.
content:
application/json;charset=UTF-8:
schema:
$ref: "#/components/schemas/ProcessFeedResponse"
"400":
description: Request rejected. Some of the received items are invalid. Check the "invalidFeedItems" node for specific errors.
content:
application/json;charset=UTF-8:
schema:
$ref: "#/components/schemas/400ProcessFeedResponse"
"401":
description: Unauthorized request. Verify that the Bearer token provided in the `Authorization` header is still valid.
content:
application/json;charset=UTF-8:
schema:
$ref: "#/components/schemas/401Response"
"403":
description: Forbidden request. Verify that the `Authorization` header is present, and that the Bearer token is still valid.
content:
application/json;charset=UTF-8:
schema:
$ref: "#/components/schemas/403Response"
"429":
description: |
Too many requests. Indicates that a client has exceeded the rate limit of 300 requests per minute.
Check the `retry-after` header to get the time (in seconds) to wait before sending the next request.
content:
text/html;charset=UTF-8:
schema:
$ref: "#/components/schemas/429Response"
patch:
tags:
- Price Books
summary: Update price books
description: |
Update existing price books with limitations on hierarchical changes.
Updatable Fields
* **Name**: Can be updated for both base and child price books
* **Currency**: Can only be updated for base price books (affects entire hierarchy)
* **Parent ID**: Cannot be updated - use delete and recreate to change hierarchy
Update Restrictions
* **Parent Assignment**: Cannot change `parentId` via update operations
* **Hierarchy Changes**: To restructure the hierarchy, delete and recreate child price books
* **Currency Inheritance**: Child price books automatically inherit currency changes from parent
* **Validation**: System validates that `parentId` references exist and hierarchy depth is maintained
Update Strategies
* **Base Price Books**: Update name and currency as needed
* **Child Price Books**: Include correct `parentId` in request (will be ignored if different)
* **Hierarchy Restructuring**: Delete child price book and recreate with new parent reference
> **Note:** Before submitting an update request, verify that the target entity exists by checking the available price books in [Commerce Optimizer](https://experienceleague.adobe.com/en/docs/commerce/optimizer/setup/pricebooks#view-price-books-in-commerce-optimizer). Update operations do not verify that the entity exists. Requests targeting a nonexistent entity are accepted, but the update has no effect.
operationId: updatePriceBooks
parameters:
- name: Content-Type
in: header
required: true
schema:
type: string
enum: [application/json]
- name: Authorization
in: header
required: true
schema:
type: string
description: Authorization Bearer token.
- name: Content-Encoding
in: header
required: false
schema:
type: string
enum: [gzip]
description: Use this header if the payload is compressed with gzip.
requestBody:
content:
application/json:
schema:
type: array
items:
$ref: "#/components/schemas/FeedPricebook"
examples:
FeedWithPriceBookInformation:
summary: Update existing price books
description: Update the name of child price book, "dealer-north"
value:
[
{
"priceBookId": "dealer-north",
"parentId": "us",
"name": "North dealership"
}
]
ComplexHierarchyExample:
summary: Create a complex multi-level pricing hierarchy
description: |
Create a comprehensive pricing structure for a global business with multiple regions,
customer segments, and sales channels. This demonstrates the full potential of
hierarchical price books.
value:
[
{
"priceBookId": "global",
"name": "Global Base Pricing",
"currency": "USD"
},
{
"priceBookId": "us-retail",
"parentId": "global",
"name": "US Retail Channel"
},
{
"priceBookId": "us-online",
"parentId": "global",
"name": "US Online Channel"
},
{
"priceBookId": "us-retail-premium",
"parentId": "us-retail",
"name": "US Retail Premium Customers"
},
{
"priceBookId": "us-retail-standard",
"parentId": "us-retail",
"name": "US Retail Standard Customers"
},
{
"priceBookId": "us-online-vip",
"parentId": "us-online",
"name": "US Online VIP Members"
},
{
"priceBookId": "us-online-regular",
"parentId": "us-online",
"name": "US Online Regular Customers"
}
]
responses:
"200":
description: All items in the request are accepted for further processing.
content:
application/json;charset=UTF-8:
schema:
$ref: "#/components/schemas/ProcessFeedResponse"
"400":
description: Request rejected. Some of the received items are invalid. Check the `invalidFeedItems` node for specific errors.
content:
application/json;charset=UTF-8:
schema:
$ref: "#/components/schemas/400ProcessFeedResponse"
"401":
description: Unauthorized request. Verify that the Bearer token provided in the `Authorization` header is still valid.
content:
application/json;charset=UTF-8:
schema:
$ref: "#/components/schemas/401Response"
"403":
description: Forbidden request. Verify that the `Authorization` header is present, and that the Bearer token is still valid.
content:
application/json;charset=UTF-8:
schema:
$ref: "#/components/schemas/403Response"
"429":
description: |
Too many requests. Indicates that a client has exceeded the rate limit of 300 requests per minute.
Check the `retry-after` header to get the time (in seconds) to wait before sending the next request.
content:
text/html;charset=UTF-8:
schema:
$ref: "#/components/schemas/429Response"
/v1/catalog/price-books/delete:
post:
tags:
- Price Books
summary: Delete price books
description: |
Delete price books and their associated pricing data with cascading effects on the hierarchy.
Cascading Deletion
When you delete a price book:
* **Child Price Books**: All child price books in the hierarchy are automatically deleted
* **Associated Prices**: All prices assigned to the deleted price book and its children are removed
* **Hierarchy Impact**: The entire branch below the deleted price book is removed
Deletion Scenarios
* **Base Price Book**: Deletes entire pricing hierarchy and all associated prices
* **Child Price Book**: Deletes the specific price book and its children, but preserves sibling price books
* **Leaf Price Book**: Deletes only the specified price book and its associated prices
Recovery Options
If a price book is deleted by mistake:
* **Time Window**: You have up to one week to restore deleted price books
* **Restoration Method**: Recreate the top-level parent price book using the original create payload
* **State Recovery**: Price books and prices are restored to their state when deleted
* **Hierarchy Reconstruction**: The entire hierarchy is rebuilt from the restoration payload
Best Practices
* **Backup Strategy**: Keep copies of price book configurations for recovery
* **Validation**: Verify hierarchy structure before deletion
* **Impact Assessment**: Review associated prices before deleting price books
operationId: deletePriceBooks
parameters:
- name: Content-Type
in: header
required: true
schema:
type: string
enum: [application/json]
- name: Authorization
in: header
required: true
schema:
type: string
description: Authorization Bearer token.
- name: Content-Encoding
in: header
required: false
schema:
type: string
enum: [gzip]
description: Use this header if the payload is compressed with gzip.
requestBody:
content:
application/json:
schema:
type: array
items:
$ref: "#/components/schemas/FeedPriceBookDelete"
examples:
DeleteExistingPricebook:
summary: Delete price book "dealer-north"
description: Delete the "dealer-north" price book. All prices assigned to this price book are also deleted.
value: [{ "priceBookId": "dealer-north" }]
responses:
"200":
description: All items in the request are accepted for further processing.
content:
application/json;charset=UTF-8:
schema:
$ref: "#/components/schemas/ProcessFeedResponse"
"400":
description: Request rejected. Some of the received items are invalid. Check the "invalidFeedItems" node for specific errors.
content:
application/json;charset=UTF-8:
schema:
$ref: "#/components/schemas/400ProcessFeedResponse"
"401":
description: Unauthorized request. Verify that the Bearer token provided in the `Authorization` header is still valid.
content:
application/json;charset=UTF-8:
schema:
$ref: "#/components/schemas/401Response"
"403":
description: Forbidden request. Verify that the `Authorization` header is present, and that the Bearer token is still valid.
content:
application/json;charset=UTF-8:
schema:
$ref: "#/components/schemas/403Response"
"429":
description: |
Too many requests. Indicates that a client has exceeded the rate limit of 300 requests per minute.
Check the `retry-after` header to get the time (in seconds) to wait before sending the next request.
content:
text/html;charset=UTF-8:
schema:
$ref: "#/components/schemas/429Response"
/v1/catalog/products/prices:
post:
tags:
- Prices
summary: Create prices
description: |
Create or replace existing product prices with support for regular pricing, discounts, and tiered pricing.
Pricing structure
Each price record can include:
* **Regular Price** - The base price for the product SKU
* **Discounts** - Percentage or fixed amount discounts applied to the regular price
* **Tiered Pricing** - Quantity-based pricing for bulk purchases
Discount configuration
Discounts can be configured in two ways:
* **Fixed Amount Discounts** - Use `price` field to specify a fixed discount amount (e.g., 10.00 for $10 off)
* **Percentage Discounts** - Use `percentage` field to specify a discount percentage (e.g., 20 for 20% off)
Each discount requires a unique `code` identifier to distinguish between different discount types.
Tiered pricing
Tiered pricing offers different prices based on purchase quantity:
* **Tier Fixed Prices** - Use `price` field with `qty` to specify quantity-based fixed prices
* **Tier Percentage Discounts** - Use `percentage` field with `qty` to specify quantity-based percentage discounts
Tier quantities must be greater than 1.
Pricing for configurable products
Because configurable product price is calculated based on the price of the selected product variant, you don't need to send the price
data for configurable product SKUs. Sending price data for these SKUs can cause incorrect price calculations.
operationId: createPrices
parameters:
- $ref: "#/components/parameters/Authorization"
- $ref: "#/components/parameters/ContentType"
- $ref: "#/components/parameters/ContentEncoding"
responses:
"200":
$ref: "#/components/responses/AcceptedResponse"
"400":
$ref: "#/components/responses/InvalidItemsResponse"
"401":
$ref: "#/components/responses/UnauthorizedResponse"
"403":
$ref: "#/components/responses/ForbiddenResponse"
"429":
$ref: "#/components/responses/TooManyRequestsResponse"
requestBody:
content:
application/json:
schema:
type: array
items:
$ref: "#/components/schemas/FeedPrices"
examples:
FeedWithNewProductPrice:
summary: Add product price information with discounts and tiered pricing
description: |
Add product price information to the catalog data with examples of regular pricing,
percentage discounts, and tiered pricing for bulk purchases.
value:
[
{
"sku": "red-pants",
"priceBookId": "us",
"regular": 20
},
{
"sku": "red-pants",
"priceBookId": "dealer-north",
"regular": 19.9,
"discounts": [
{
"code": "seasonal_sale",
"percentage": 10
},
{
"code": "loyalty_discount",
"price": 2.00
}
],
"tierPrices": [
{
"qty": 5,
"percentage": 15
},
{
"qty": 10,
"price": 15.00
}
]
}
]
FeedWithComplexPricing:
summary: Complex pricing with multiple discount types and tier levels
description: |
Example showing complex pricing scenarios with multiple discount types,
tiered pricing for different quantity levels, and geographic pricing variations.
value:
[
{
"sku": "premium-watch",
"priceBookId": "us-premium",
"regular": 299.99,
"discounts": [
{
"code": "holiday_sale",
"percentage": 15
},
{
"code": "vip_member",
"price": 25.00
}
],
"tierPrices": [
{
"qty": 2,
"percentage": 10
},
{
"qty": 5,
"percentage": 20
},
{
"qty": 10,
"price": 250.00
}
]
},
{
"sku": "premium-watch",
"priceBookId": "us-wholesale",
"regular": 250.00,
"discounts": [
{
"code": "bulk_discount",
"percentage": 25
}
],
"tierPrices": [
{
"qty": 10,
"price": 200.00
},
{
"qty": 25,
"price": 175.00
},
{
"qty": 50,
"percentage": 40
}
]
}
]
patch:
tags:
- Prices
summary: Update prices
description: |
Change existing product prices, discounts, and tiered pricing.
When the update is processed, the merge strategy is used to apply changes to `scalar` and `object` type fields.
For `array` type fields, a new value can be appended to the existing list. For an object list, you can update a specific object by matching on a key field. The following fields are supported:
* `discounts` - match on `code`
* `tierPrices` - match on `qty`
Update strategies
* **Regular Price** - Updated using merge strategy
* **Discounts Array** - Updated using the append or merge strategy
* **Tiered Pricing Array** - Updated using the append or merge strategy
Discount and tier pricing updates
When updating discounts or tiered pricing:
* Include all desired discounts/tiers in the array
* The entire array replaces the existing configuration
* To remove all discounts/tiers, send an empty array
* To add new discounts/tiers, include both existing and new items
Best practices
* Always include the complete array of discounts/tiers when updating
* Use descriptive discount codes for easier management
* Ensure tier quantities are in ascending order
* Test updates in a development environment first
> **Note:** Before submitting an update request, verify that the target entity exists using the [products GraphQL query](https://developer.adobe.com/commerce/services/includes/autogenerated/merchandising-api#products) to check the prices assigned to the product SKU. Update operations do not verify that the entity exists. Requests targeting a nonexistent entity are accepted, but the update has no effect.
operationId: updatePrices
parameters:
- $ref: "#/components/parameters/Authorization"
- $ref: "#/components/parameters/ContentType"
- $ref: "#/components/parameters/ContentEncoding"
responses:
"200":
$ref: "#/components/responses/AcceptedResponse"
"400":
$ref: "#/components/responses/InvalidItemsResponse"
"401":
$ref: "#/components/responses/UnauthorizedResponse"
"403":
$ref: "#/components/responses/ForbiddenResponse"
"429":
$ref: "#/components/responses/TooManyRequestsResponse"
requestBody:
content:
application/json:
schema:
type: array
items:
$ref: "#/components/schemas/FeedPricesUpdate"
examples:
FeedWithProductPricesInformation:
summary: Update product prices with enhanced discounts and tiered pricing
description: |
Update existing product prices for the given SKU ("red-pants") and price book id ("dealer-north").
This example shows how to update both discounts and tiered pricing simultaneously:
* **discounts**: Update the existing `seasonal_sale` discount and add a new `holiday_sale` discount
* **tierPrices**: Update the existing percentage discount for quantity 5 and add a new discount for quantity 20
value:
[
{
"sku": "red-pants",
"priceBookId": "dealer-north",
"discounts": [
{
"code": "seasonal_sale",
"percentage": 30
},
{
"code": "holiday_sale",
"price": 5.00
}
],
"tierPrices": [
{
"qty": 5,
"percentage": 20
},
{
"qty": 20,
"price": 13
}
]
}
]
/v1/catalog/products/prices/delete:
post:
tags:
- Prices
summary: Delete prices
description: >
Delete existing product prices
operationId: deletePrices
parameters:
- $ref: "#/components/parameters/Authorization"
- $ref: "#/components/parameters/ContentType"
- $ref: "#/components/parameters/ContentEncoding"
responses:
"200":
$ref: "#/components/responses/AcceptedResponse"
"400":
$ref: "#/components/responses/InvalidItemsResponse"
"401":
$ref: "#/components/responses/UnauthorizedResponse"
"403":
$ref: "#/components/responses/ForbiddenResponse"
"429":
$ref: "#/components/responses/TooManyRequestsResponse"
requestBody:
content:
application/json:
schema:
type: array
items:
$ref: "#/components/schemas/FeedPricesDelete"
examples:
FeedWithProductPricesInformation:
summary: Delete product prices
description: >
Delete the existing product prices information
value: [{ "sku": "red-pants", "priceBookId": "dealer-north" }]
components:
responses:
AcceptedResponse:
x-summary: All items accepted
description: |
All items accepted and will be processed asynchronously
content:
application/json;charset=UTF-8:
schema:
$ref: "#/components/schemas/ProcessFeedResponse"
InvalidItemsResponse:
x-summary: Request rejected
description: |
Some of the received items are invalid. Check the "message" and "errors" fields for details.
Common causes of validation errors include:
* **Invalid SKU**: SKU does not exist in the catalog
* **Invalid Price Book**: Price book ID does not exist
* **Invalid Discount Code**: Duplicate or invalid discount codes
* **Invalid Tier Quantities**: Quantities not in ascending order or less than 2
* **Configurable Product Price**: Attempting to set price for configurable product SKU
* **Invalid Price Format**: Non-numeric or negative price values
* **Incorrect Category Slug**: Invalid category slug format
* **Incorrect hierarchy configuration**: Misconfiguration of price book parent-child relationship
content:
application/json;charset=UTF-8:
schema:
$ref: "#/components/schemas/400ProcessFeedResponse"
UnauthorizedResponse:
x-summary: Unauthorized request
description: |
Verify that the Bearer token provided in the `Authorization` header is still valid.
content:
application/json;charset=UTF-8:
schema:
$ref: "#/components/schemas/401Response"
ForbiddenResponse:
x-summary: Forbidden request
description: |
Verify that the `Authorization` header is present, and that the Bearer token is still valid.
content:
application/json;charset=UTF-8:
schema:
$ref: "#/components/schemas/403Response"
TooManyRequestsResponse:
x-summary: Too many requests
description: |
Indicates that a client has exceeded the rate limit of 300 requests per minute.
Check the `retry-after` header to get the time (in seconds) to wait before sending the next request.
content:
text/html;charset=UTF-8:
schema:
$ref: "#/components/schemas/429Response"
parameters:
Authorization:
name: Authorization
in: header
required: true
schema:
type: string
description: Authorization Bearer token
ContentType:
name: Content-Type
in: header
required: true
schema:
type: string
enum: [application/json]
default: application/json
ContentEncoding:
name: Content-Encoding
in: header
required: false
schema:
type: string
enum: [gzip]
description: Use this header if the payload is compressed with gzip.
schemas:
FeedItemFailedValidationResult:
title: FeedItemFailedValidationResult
type: object
properties:
code:
type: string
description: Code name of invalid field.
itemIndex:
type: integer
format: int32
description: Reference to the line item with an invalid payload. The line count begins at 0.
message:
type: string
description: Error description
value:
type: string
description: Original value passed in the request.
FeedProductMetadata:
title: Create or update product metadata attribute
description: Metadata information for a product attribute.
required:
- code
- source
- label
- dataType
type: object
properties:
code:
type: string
description: Attribute code
source:
$ref: "#/components/schemas/Source"
visibleIn:
type: array
description: |
Determines how the attribute is used on the storefront.
* `PRODUCT_DETAIL`: Product attribute is visible on the Product Detail Page.
* `PRODUCT_LISTING`: Product attribute is visible on Product Listing Page.
* `SEARCH_RESULTS`: Product attribute is visible on Search Results Page.
* `PRODUCT_COMPARE`: Product attribute is visible on Product Compare Page.
items:
enum:
- PRODUCT_DETAIL
- PRODUCT_LISTING
- SEARCH_RESULTS
- PRODUCT_COMPARE
label:
type: string
description: Label for the attribute that is displayed in user interfaces.
example: Attribute Name
dataType:
type: string
description: Data type
example: TEXT
enum:
- TEXT
- DECIMAL
- INTEGER
- BOOLEAN
filterable:
type: boolean
description: Indicates whether the attribute can be used to filter products.
example: true
sortable:
type: boolean
description: Indicates whether the attribute can be used to sort products.
example: true
searchable:
type: boolean
description: Indicates whether the attribute value can be used in search queries to filter results.
example: true
searchWeight:
type: number
description: |
The weight associated with a searchable attribute.
Attributes with a greater weight are returned before attributes with a lower weight.
format: float
searchTypes:
type: array
description: >
Search types associated with this attribute, for example: `autocomplete`, `starts_with`, and so on.
items:
type: string
enum:
- AUTOCOMPLETE
- CONTAINS
- STARTS_WITH
FeedProductMetadataUpdate:
title: Update product metadata attribute
description: Metadata information for a product attribute.
required:
- code
- source
type: object
properties:
code:
type: string
description: Attribute code
source:
$ref: "#/components/schemas/Source"
visibleIn:
type: array
description: |
Determines how the attribute is used on the storefront.
* `PRODUCT_DETAIL`: Product attribute is visible on the Product Detail Page.
* `PRODUCT_LISTING`: Product attribute is visible on Product Listing Page.
* `SEARCH_RESULTS`: Product attribute is visible on Search Results Page.
* `PRODUCT_COMPARE`: Product attribute is visible on Product Compare Page.
items:
enum:
- PRODUCT_DETAIL
- PRODUCT_LISTING
- SEARCH_RESULTS
- PRODUCT_COMPARE
label:
type: string
description: Label for the attribute that is displayed in user interfaces.
example: Attribute Name
dataType:
type: string
description: Data type
example: TEXT
enum:
- TEXT
- DECIMAL
- INTEGER
- BOOLEAN
filterable:
type: boolean
description: Indicates whether the attribute can be used to filter products.
example: true
sortable:
type: boolean
description: Indicates whether the attribute can be used to sort products.
example: true
searchable:
type: boolean
description: Indicates whether the attribute value can be used in search queries to filter results.
example: true
searchWeight:
type: number
description: |
The weight associated with a searchable attribute.
Attributes with a greater weight are returned before attributes with a lower weight.
format: float
searchTypes:
type: array
description: >
Search types associated with this attribute, for example: `autocomplete`, `starts_with`, and so on.
items:
type: string
enum:
- AUTOCOMPLETE
- CONTAINS
- STARTS_WITH
FeedProductMetadataDelete:
title: Delete product metadata attribute
description: Delete metadata information for a product attribute.
required:
- code
- source
type: object
properties:
code:
type: string
description: Attribute code
source:
$ref: "#/components/schemas/Source"
FeedCategoryMetadata:
title: Create or update category metadata attribute
description: Metadata information for a category attribute.
required:
- code
- source
- label
- dataType
type: object
properties:
code:
type: string
description: Attribute code
source:
$ref: "#/components/schemas/Source"
label:
type: string
description: Label for the attribute that is displayed in user interfaces.
example: Attribute Name
dataType:
type: string
description: Data type
example: TEXT
enum:
- TEXT
- DECIMAL
- INTEGER
- BOOLEAN
FeedCategoryMetadataUpdate:
title: Update category metadata attribute
description: Metadata information for a category attribute.
required:
- code
- source
type: object
properties:
code:
type: string
description: Attribute code
source:
$ref: "#/components/schemas/Source"
label:
type: string
description: Label for the attribute that is displayed in user interfaces.
example: Attribute Name
dataType:
type: string
description: Data type
example: TEXT
enum:
- TEXT
- DECIMAL
- INTEGER
- BOOLEAN
FeedCategoryMetadataDelete:
title: Delete category metadata attribute
description: Delete metadata information for a category attribute.
required:
- code
- source
type: object
properties:
code:
type: string
description: Attribute code
source:
$ref: "#/components/schemas/Source"
FeedCategory:
title: FeedCategory
description: Category information for organizing products with hierarchical structure and localization support.
required:
- slug
- source
- name
type: object
properties:
slug:
type: string
minLength: 1
maxLength: 1024
pattern: "^[a-z0-9-]+(?:\\/[a-z0-9-]+)*$"
description: |
Category slug using hierarchical format with forward slashes to represent parent-child relationships.
String can contain only lowercase letters, numbers, and hyphens.
Examples: 'men', 'men/clothing', 'men/clothing/pants'
example: "men/clothing/pants"
source:
$ref: "#/components/schemas/Source"
name:
type: string
minLength: 1
maxLength: 128
description: Display name of the category
example: "Men's Pants"
description:
type: string
nullable: true
description: Full-text description of the category.
example: "Men's clothing, shoes, and accessories"
families:
type: array
nullable: true
items:
type: string
description: |
Optional array of product family identifiers that this category is associated with.
Used for enhanced product organization and filtering.
example: ["apparel", "clothing"]
position:
type: integer
format: int32
description: Sort order for the category
metaTags:
$ref: "#/components/schemas/CategoryMetaAttribute"
attributes:
type: array
description: A list of category attributes.
items:
$ref: "#/components/schemas/CategoryAttribute"
images:
type: array
description: A list of category images.
items:
$ref: "#/components/schemas/CategoryImage"
additionalProperties: false
FeedCategoryUpdate:
title: FeedCategoryUpdate
description: Category information for updating existing categories.
required:
- slug
- source
type: object
properties:
slug:
type: string
minLength: 1
maxLength: 1024
pattern: "^[a-z0-9-]+(?:\\/[a-z0-9-]+)*$"
description: |
Category slug using hierarchical format with forward slashes to represent parent-child relationships.
String can contain only lowercase letters, numbers, and hyphens.
Examples: 'men', 'men/clothing', 'men/clothing/pants'
example: "men/clothing/pants"
source:
$ref: "#/components/schemas/Source"
name:
type: string
minLength: 1
maxLength: 128
description: Display name of the category
example: "Men's Pants"
description:
type: string
nullable: true
description: Full-text description of the category.
example: "Men's clothing, shoes, and accessories"
families:
type: array
nullable: true
items:
type: string
description: |
Optional array of product family identifiers that this category is associated with.
Used for enhanced product organization and filtering. For example, for a clothing category,
you can associate it with the "apparel" family.
Note: This field uses the replace strategy to replace the entire array with the new values.
example: ["apparel", "clothing"]
position:
type: integer
format: int32
description: Sort order for the category
metaTags:
$ref: "#/components/schemas/CategoryMetaAttribute"
attributes:
type: array
description: A list of category attributes.
items:
$ref: "#/components/schemas/CategoryAttribute"
images:
type: array
description: A list of category images.
items:
$ref: "#/components/schemas/CategoryImage"
additionalProperties: false
FeedCategoryDelete:
title: Delete category
description: Delete category information for removing categories from the catalog.
required:
- slug
- source
type: object
properties:
slug:
type: string
minLength: 1
maxLength: 1024
pattern: "^[a-z0-9-]+(?:\\/[a-z0-9-]+)*$"
description: |
Category slug using hierarchical format with forward slashes to represent parent-child relationships.
Must use only lowercase letters, numbers, and hyphens.
Examples: 'men', 'men/clothing', 'men/clothing/pants'
example: "men/clothing/pants"
source:
$ref: "#/components/schemas/Source"
additionalProperties: false
FeedProduct:
title: Catalog Product payload
type: object
required:
- sku
- source
- name
- slug
- status
properties:
sku:
type: string
description: SKU (Stock Keeping Unit) is a unique identifier for a product.
example: MH01
source:
$ref: "#/components/schemas/Source"
name:
type: string
description: Product name
example: Kangaroo Hoodie
slug:
type: string
description: The URL key for the product.
example: kangaroo-hoodie.html
description:
type: string
nullable: true
description: The main description for the product
example: A kangaroo hoodie for all seasons
shortDescription:
type: string
nullable: true
description: A short description of the product
example: A hoodie for all seasons with a kangaroo pocket
status:
type: string
description: |
Indicates whether the product is visible on the storefront.
The value is "Enabled" if it is visible, and "Disabled" if it is not visible.
example: ENABLED
enum:
- ENABLED
- DISABLED
visibleIn:
type: array
description: |
Storefront area where the product is visible. An empty list means that it is not visible as a stand alone product.
* `CATALOG`: Product is visible on Product Listing Page and Product Detail Page.
* `SEARCH`: Product is visible on Search Results Page and Product Detail Page.
example: [CATALOG]
items:
enum:
- CATALOG
- SEARCH
metaTags:
$ref: "#/components/schemas/ProductMetaAttribute"
attributes:
type: array
description: A list of product attributes.
items:
$ref: "#/components/schemas/ProductAttribute"
images:
type: array
description: A list of product images.
items:
$ref: "#/components/schemas/ProductImage"
links:
type: array
description: A list of linked SKUs.
items:
$ref: "#/components/schemas/ProductLink"
routes:
type: array
description: A list of product routes.
items:
$ref: "#/components/schemas/ProductRoutes"
configurations:
type: array
description: Composite products, such as configurable products, must provide a list of product options that a shopper can select (for example, "color", "size", etc.).
items:
$ref: "#/components/schemas/ProductConfiguration"
bundles:
type: array
description: Composite products, such as bundle products, must include a list of individual products that are part of the bundle, organized into groups (for example, "shirts", "pants", "accessories").
items:
$ref: "#/components/schemas/ProductBundle"
externalIds:
type: array
description: A list of external IDs for the product.
items:
$ref: "#/components/schemas/ProductExternalId"
FeedProductUpdate:
title: Catalog Product payload
type: object
required:
- sku
- source
properties:
sku:
type: string
description: SKU (Stock Keeping Unit) is a unique identifier for a product.
example: MH01
source:
$ref: "#/components/schemas/Source"
name:
type: string
description: Product name
example: Kangaroo Hoodie
slug:
type: string
description: The URL key for the product.
example: kangaroo-hoodie.html
description:
type: string
nullable: true
description: The main description for the product
example: A kangaroo hoodie for all seasons
shortDescription:
type: string
nullable: true
description: A short description of the product
example: A hoodie for all seasons with a kangaroo pocket
status:
type: string
description: |
Indicates whether the product is visible on the storefront.
The value is "Enabled" if it is visible, and "Disabled" if it is not visible.
example: ENABLED
enum:
- ENABLED
- DISABLED
visibleIn:
type: array
description: |
Storefront area where the product is visible. An empty list means that it is not visible as a stand alone product.
* `CATALOG`: Product is visible on Product Listing Page and Product Detail Page.
* `SEARCH`: Product is visible on Search Results Page and Product Detail Page.
example: [CATALOG]
items:
enum:
- CATALOG
- SEARCH
metaTags:
$ref: "#/components/schemas/ProductMetaAttribute"
attributes:
type: array
description: A list of product attributes.
items:
$ref: "#/components/schemas/ProductAttribute"
images:
type: array
description: A list of product images.
items:
$ref: "#/components/schemas/ProductImage"
links:
type: array
description: |
A list of linked SKUs. For product variants, this is a required field that establishes a link between a product variant and the corresponding configurable product.
`VARIANT_OF` link type must be specified to establish a connection to the configurable product SKU.
items:
$ref: "#/components/schemas/ProductLink"
routes:
type: array
description: A list of product routes.
items:
$ref: "#/components/schemas/ProductRoutes"
configurations:
type: array
description: Composite products, such as configurable products, must provide a list of product options that a shopper can select (for example, "color", "size", etc.).
items:
$ref: "#/components/schemas/ProductConfiguration"
bundles:
type: array
description: Composite products, such as bundle products, must include a list of individual products that are part of the bundle, organized into groups (for example, "shirts", "pants", "accessories").
items:
$ref: "#/components/schemas/ProductBundle"
externalIds:
type: array
description: A list of external IDs for the product.
items:
$ref: "#/components/schemas/ProductExternalId"
FeedProductDelete:
title: Catalog Product delete payload
type: object
required:
- sku
- source
properties:
sku:
type: string
description: Product unique identifier
example: MH01
source:
$ref: "#/components/schemas/Source"
FeedProductLayer:
title: Catalog Product Layer payload
type: object
required:
- sku
- source
properties:
sku:
type: string
description: SKU (Stock Keeping Unit) that uniquely identifies the base product this layer will modify. Must match an existing product SKU in the catalog.
example: red-pants
source:
$ref: "#/components/schemas/SourceLayer"
name:
type: string
description: Product display name that will override the base product name. Use for localized names, seasonal branding, or promotional titles.
example: Premium Red Winter Pants - Limited Edition
description:
type: string
nullable: true
description: Detailed product description that replaces the base product description. Use for localized content, seasonal messaging, or enhanced marketing copy.
example: Stay warm and stylish with our premium red winter pants. Features thermal lining and water-resistant fabric perfect for cold weather adventures.
shortDescription:
type: string
nullable: true
description: Brief product summary that appears in product listings and search results. Override for concise, layer-specific messaging.
example: Premium thermal-lined winter pants in classic red
metaTags:
$ref: "#/components/schemas/ProductMetaAttribute"
attributes:
type: array
description: Product attributes that will be merged with base product attributes. Use to add layer-specific variants, localized values, or seasonal properties.
items:
$ref: "#/components/schemas/ProductAttribute"
images:
type: array
description: Product images that will be merged with base product images. Use to add seasonal imagery, locale-specific photos, or promotional visuals.
items:
$ref: "#/components/schemas/ProductImage"
links:
type: array
description: Related product SKUs that will be merged with base product links. Use to add seasonal recommendations, locale-specific cross-sells, or promotional bundles.
items:
$ref: "#/components/schemas/ProductLink"
externalIds:
type: array
description: External system identifiers that will be merged with base product external IDs. Use to add layer-specific tracking codes, campaign IDs, or integration references.
items:
$ref: "#/components/schemas/ProductExternalId"
FeedProductLayerDelete:
title: Catalog Product Layer delete payload
type: object
required:
- sku
- source
properties:
sku:
type: string
description: SKU (Stock Keeping Unit) that identifies the base product containing the layer to delete. Must match an existing product SKU in the catalog.
example: red-pants
source:
$ref: "#/components/schemas/SourceLayer"
FeedPricebook:
title: FeedPricebook
description: |
Price book information supporting hierarchical pricing structures. Use base price books to define currency
and create child price books for specific pricing scenarios.
oneOf:
- $ref: '#/components/schemas/PriceBookBase'
- $ref: '#/components/schemas/PriceBookChild'
PriceBookBase:
title: Base price book
type: object
required: [priceBookId, name, currency]
properties:
priceBookId:
type: string
description: |
Unique identifier for the base price book. Must be unique across all price books.
Used to reference this price book in child price books and pricing data.
minLength: 1
maxLength: 64
example: "us-base"
name:
type: string
description: |
Human-readable name for the price book. Used for display and identification purposes.
minLength: 1
example: "US Base Pricing"
currency:
type: string
description: |
Currency code that applies to this price book and all its child price books in ISO format.
Child price books inherit this currency and cannot override it.
minLength: 1
maxLength: 5
example: "USD"
PriceBookChild:
title: Child price book
description: |
Nested price book that inherits currency from its parent and can extend the pricing hierarchy.
Child price books can have up to 3 levels of nesting from the base price book.
type: object
required: [priceBookId, name, parentId]
properties:
priceBookId:
type: string
description: |
Unique identifier for the child price book. Must be unique across all price books.
Used to reference this price book in pricing data and potential child price books.
minLength: 1
maxLength: 64
example: "us-retail"
name:
type: string
description: |
Human-readable name for the child price book. Used for display and identification purposes.
minLength: 1
example: "US Retail Channel"
parentId:
type: string
description: |
Reference to the parent price book ID. Must reference an existing price book.
Determines the currency inheritance and hierarchy level.
minLength: 1
maxLength: 64
FeedPriceBookDelete:
title: FeedPriceBookDelete
description: Price book information
required:
- priceBookId
type: object
properties:
priceBookId:
type: string
description: Price book id
FeedPrices:
title: FeedPrices
description: |
Product price information with support for regular pricing, discounts, and tiered pricing.
Each price record must reference an existing price book and can include multiple discount types
and tiered pricing levels for different quantity thresholds.
required:
- sku
- priceBookId
- regular
type: object
properties:
sku:
type: string
description: |
Product SKU identifier. Must match an existing product in the catalog.
For configurable products, use the variant SKU, not the parent SKU.
example: "red-pants-xl"
priceBookId:
type: string
description: |
Price book identifier. Must reference an existing price book.
Prices referencing non-existing price books are ignored.
example: "us-retail"
regular:
type: number
format: float
description: |
Base price for the product SKU in the specified price book.
This is the price before any discounts or tiered pricing are applied.
example: 29.99
discounts:
type: array
description: |
Array of active discounts applied to the regular price.
Each discount requires a unique code identifier.
Supports both percentage and fixed amount discounts.
items:
anyOf:
- $ref: "#/components/schemas/DiscountsFinalPrice"
- $ref: "#/components/schemas/DiscountsPercentage"
example:
- code: "seasonal_sale"
percentage: 15
- code: "loyalty_discount"
price: 5.00
tierPrices:
type: array
description: |
Array of tiered pricing for quantity-based discounts.
Quantities must be greater than 1. Supports both percentage and fixed price tiers.
items:
anyOf:
- $ref: "#/components/schemas/TierFinalPrice"
- $ref: "#/components/schemas/TierPercentage"
example:
- qty: 5
percentage: 10
- qty: 10
price: 25.00
FeedPricesUpdate:
title: FeedPrices
description: Product price information.
required:
- sku
- priceBookId
type: object
properties:
sku:
type: string
description: Product SKU
priceBookId:
type: string
description: Price book id
regular:
type: number
format: float
description: Regular price
discounts:
type: array
description: Active discounts
items:
anyOf:
- $ref: "#/components/schemas/DiscountsFinalPrice"
- $ref: "#/components/schemas/DiscountsPercentage"
tierPrices:
type: array
description: Tier prices for quantities greater-than one
items:
anyOf:
- $ref: "#/components/schemas/TierFinalPrice"
- $ref: "#/components/schemas/TierPercentage"
FeedPricesDelete:
title: FeedPricesDelete
description: Delete product price information.
required:
- sku
- priceBookId
type: object
properties:
sku:
type: string
description: Product SKU
priceBookId:
type: string
description: Price book id
DiscountsFinalPrice:
title: Fixed Amount Discount
description: |
Fixed amount discount that reduces the regular price by a specific monetary value.
Example: $100 regular price with a $10 fixed discount results in $90 final price.
type: object
required:
- code
- price
properties:
code:
type: string
description: |
Unique identifier for the discount. Must be unique within the price record.
Use descriptive codes for easier management (e.g., "loyalty_discount", "holiday_sale").
example: "loyalty_discount"
price:
type: number
format: float
description: |
Fixed discount amount in the same currency as the price book.
Must be a positive number less than the regular price.
example: 10.00
DiscountsPercentage:
title: Percentage Discount
description: |
Percentage discount that reduces the regular price by a specified percentage.
Example: $100 regular price with a 20% discount results in $80 final price.
type: object
required:
- code
- percentage
properties:
code:
type: string
description: |
Unique identifier for the discount. Must be unique within the price record.
Use descriptive codes for easier management (e.g., "seasonal_sale", "vip_member").
example: "seasonal_sale"
percentage:
type: number
format: float
description: |
Discount percentage as a positive number. Valid range is 0.01 to 99.99 (1% to 99.99%).
example: 15.5
TierFinalPrice:
title: Tier Final Price
description: |
Final price offered for bulk purchases at a specific quantity threshold.
Example: $100 regular price with tier price of $80 for quantity of 5 or more.
type: object
required:
- qty
- price
properties:
qty:
type: number
format: float
description: |
Minimum quantity required to qualify for this tier price.
Must be greater than 1.
example: 5
price:
type: number
format: float
description: |
Fixed price offered for the specified quantity threshold.
Must be a positive number less than or equal to the regular price.
example: 80.00
TierPercentage:
title: Tier Percentage Discount
description: |
Percentage discount applied to the regular price when purchasing at or above a specific quantity threshold.
Example: $100 regular price with 20% discount for quantity of 10 or more.
type: object
required:
- qty
- percentage
properties:
qty:
type: number
format: float
description: |
Minimum quantity required to qualify for this tier discount.
Must be greater than 1.
example: 10
percentage:
type: number
format: float
description: |
Discount percentage applied to the specified quantity threshold.
Valid range is 0.01 to 99.99 (1% to 99.99%).
example: 20.0
Source:
title: Catalog source
description: Source of the entity, for example, "en-US" for US English.
type: object
required:
- locale
properties:
locale:
type: string
description: A single value that represents content locale, for example, English.
example: English
SourceLayer:
title: Catalog layer source
description: |
Identifies the source context for a product layer, combining locale and layer name to create
a unique layer identifier. This allows for precise targeting of content overrides.
type: object
required:
- layer
properties:
locale:
type: string
description: |
ISO locale code (for example, "en-US", "fr-FR", "de-DE") that specifies the target market or language.
When omitted, the layer applies globally across all locales. Use for market-specific customizations.
example: en-US
layer:
type: string
description: |
Unique identifier for the layer within the product's layer hierarchy. Use descriptive names
that indicate the layer's purpose (for example, "seasonal-winter-2024", "promotional-black-friday", "a-b-test-variant").
example: seasonal-winter-2024
ProductMetaAttribute:
title: Meta Attributes
description: Meta attributes that are specified in tags.
type: object
properties:
title:
type: string
description: A meta title
keywords:
type: array
description: A meta keywords
items:
type: string
description:
type: string
description: A meta description
CategoryMetaAttribute:
title: Meta Attributes
description: Meta attributes that are specified in tags.
type: object
properties:
title:
type: string
description: A meta title
keywords:
type: array
description: A meta keywords
items:
type: string
description:
type: string
description: A meta description
ProductAttribute:
title: Product Attribute
type: object
required:
- code
- values
properties:
code:
type: string
description: Product Attribute Code
# DCAT-2461:
# type:
# enum:
# - BOOLEAN
# - NUMBER
# - STRING
# - ARRAY
# - OBJECT
# description: |
# Type of attribute value to be applied during the rendering phase. Validation occurs only when the code is rendered. Invalid values are ignored.
# - `BOOLEAN`: Accept single value: "true" or false
# - `NUMBER`: Accept single number,e.g. "85", "0.42", etc.
# - `STRING`: Accept single string,e.g. "Great day, yall!"
# - `ARRAY`: Accept list of strings ,e.g. ["red", "green", "blue"]
# - `OBJECT`: Accept JSON object `"{"name": "swatch", "color": "red"}"`
values:
type: array
description: A list of value(s) associated with a specified attribute code.
items:
type: string
variantReferenceId:
type: string
nullable: true
description: |
The variant reference ID establishes a link between a product variant and the corresponding
[Option Value ID](#operation/createProducts!path=options/values/id&t=request) in a configurable product.
A variant reference ID can be specified only for a product that represents a variant of a configurable product.
CategoryAttribute:
title: Category Attribute
type: object
required:
- code
- values
properties:
code:
type: string
description: Category Attribute Code
values:
type: array
description: A list of value(s) associated with a specified attribute code.
items:
type: string
ProductRoutes:
title: Routes
type: object
required:
- path
properties:
path:
type: string
description: URL path
position:
type: integer
description: Position of a product in the URL path. The default value is 0.
format: int32
ProductImage:
title: Product Image
type: object
required:
- url
properties:
url:
type: string
description: Media resource URL
label:
type: string
description: Media resource label
roles:
type: array
description: |
Roles associated with this image that determine how the image is used on the storefront.
- `BASE`: Product image is visible as a main image on the Product Detail Page.
- `SMALL`: Product image is visible as a main image on the Category or search result page or other product listing pages.
- `THUMBNAIL`: Thumbnail images appear in the thumbnail gallery, shopping cart, etc.
- `SWATCH`: A swatch can be used to illustrate the color, pattern, or texture.
items:
enum:
- BASE
- SMALL
- THUMBNAIL
- SWATCH
customRoles:
type: array
description: >
Custom image role. Merchants can define custom roles in addition to the predefined values.
items:
type: string
CategoryImage:
title: Category Image
type: object
required:
- url
properties:
url:
type: string
description: Media resource URL
label:
type: string
description: Media resource label
roles:
type: array
description: |
Roles associated with this image that determine how the image is used on the storefront.
- `BASE`: Category image is visible as a main image on the Category Detail Page.
- `THUMBNAIL`: Thumbnail images appear in the thumbnail gallery, shopping cart, etc.
items:
enum:
- BASE
- THUMBNAIL
customRoles:
type: array
description: >
Custom image role. Merchants can define custom roles in addition to the predefined values.
items:
type: string
ProductConfiguration:
title: Configurations
type: object
required:
- attributeCode
- type
- values
properties:
attributeCode:
type: string
description: |
Product option attribute code. For `CONFIGURABLE` or `SWATCH` option types, this ID must match the
["attribute code"](#operation/createProducts!path=attributes/code&t=request)
used for the configurable product (for example, "color").
label:
type: string
description: Option label
defaultVariantReferenceId:
type: string
description: Specifies the pre-selected value variant reference id of the current option.
nullable: true
type:
type: string
enum:
- CONFIGURABLE
- SWATCH
description: |
Option type. Indicates the product type the option can be assigned to.
- `CONFIGURABLE`: Configurable product option
- `SWATCH`: Swatch product option. Must be used for color or text swatches attributes
values:
type: array
description: A list of option values. Defines option values available to shoppers (for example, "red" color or "large" size).
items:
$ref: "#/components/schemas/ProductOptionValue"
ProductOptionValue:
title: ProductOptionValue
type: object
required:
- variantReferenceId
properties:
variantReferenceId:
type: string
description: |
Option value ID.
For `CONFIGURABLE` or `SWATCH` option types, this ID must match the ["variantReferenceId"](#operation/createProducts!path=attributes/variantReferenceId&t=request)
defined in the product variant.
label:
type: string
description: Option value label
colorHex:
type: string
description: A hex representation of the color of the option value. Can be used for option with a SWATCH type.
imageUrl:
type: string
description: Image URL of the option value. Can be used for option with a SWATCH type.
ProductBundle:
title: Bundles
type: object
required:
- group
- items
properties:
group:
type: string
description: |
Name of the group that organizes the bundle items.
This helps in categorizing the items within the bundle for better organization.
For example, groups can be "shirts", "pants", "accessories", etc.
required:
type: boolean
description: Indicates whether a shopper is required to select any products from this group to add the bundle to the shopping cart.
example: false
multiSelect:
type: boolean
description: Indicates whether multiple products can be selected by a shopper.
example: false
defaultItemSkus:
type: array
description: A list of default product SKUs that are selected in this bundle group.
items:
type: string
items:
type: array
description: |
A list of individual products that are part of the bundle.
Each item in the list represents a product that can be selected as part of the bundle.
items:
$ref: "#/components/schemas/ProductBundleItem"
ProductExternalId:
title: External Ids
type: object
required:
- id
- origin
properties:
id:
type: string
description: External ID of the product.
origin:
type: string
description: External ID origin. Specifies the system that generated the external ID, such as Adobe Commerce, Google Product Ratings, etc.
ProductBundleItem:
title: ProductBundleItem
type: object
required:
- sku
properties:
sku:
type: string
description: Product SKU of the bundle item.
qty:
type: number
description: Quantity of the item in the bundle.
format: float
userDefinedQty:
type: boolean
description: Indicates whether the quantity of the item in the bundle can be defined by a shopper.
example: false
ProductLink:
title: Links
required:
- type
- sku
type: object
properties:
type:
type: string
description: |
Product link type. Merchants can define custom types in addition to the predefined values.
- `VARIANT_OF` link type must be specified to establish a connection to the configurable product SKU.
- `IN_BUNDLE` link type must be specified to establish a connection to the bundle product SKU.
sku:
type: string
description: Product SKU
description: Product association
ProcessFeedResponse:
title: Response payload
type: object
properties:
status:
type: string
description: Request status.
default: ACCEPTED
acceptedCount:
type: integer
description: The number of received and accepted items.
format: int32
example: { "status": "ACCEPTED", "acceptedCount": 4 }
400ProcessFeedResponse:
title: Response payload
type: object
properties:
status:
type: string
description: Request status.
default: FAILED
message:
type: string
description: Error summary.
errors:
type: array
description: List of items that did not pass validation. Fix the payload for invalid items before resubmitting the request.
items:
$ref: "#/components/schemas/FeedItemFailedValidationResult"
example:
{
"status": "FAILED",
"message": "Items validation failed for 2 items",
"errors":
[
{
"itemIndex": 0,
"code": "status",
"message": 'status: does not have a value in the enumeration ["ENABLED", "DISABLED"]',
"value": "active"
},
{
"itemIndex": 1,
"code": "source",
"message": "required property 'source' not found",
"value": ""
}
]
}
401Response:
title: 401 Unauthorized
type: object
properties:
title:
type: string
description: Error title
status:
type: string
description: Error status code
error_code:
type: string
description: Error code
message:
type: string
description: Error message
example:
{
"title": "ErrInvalidOauthToken",
"status": "401",
"error_code": "401013",
"message": "Oauth token is not valid"
}
403Response:
title: 403 Forbidden
type: object
properties:
title:
type: string
description: Error title
status:
type: string
description: Error status code
error_code:
type: string
description: Error code
message:
type: string
description: Error message
example:
{
"title": "ErrMissingOauthToken",
"status": "403",
"error_code": "403010",
"message": "Oauth token is missing"
}
429Response:
title: 429 Too Many Requests
description: |
Too many requests. Indicates that a client has exceeded the rate limit of 300 requests per minute.
Check the `retry-after` header to get the time (in seconds) to wait before sending the next request.
type: string