openapi: 3.2.0 info: title: Catalog Data Ingestion Product Metadata 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. ' 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.\n\nFor each Commerce project, you must define metadata for the following attributes for each catalog source (`locale`):\n - `sku`\n - `name`\n - `description`\n - `shortDescription`\n - `price`\n\nAlso, you can define metadata for custom attributes.\n\nWhen creating product attribute metadata:\n - Each product attribute requires a unique `code` and `source`.\n - Use the `dataType` field to define the data type for the product attribute.\n - Use the `visibleIn` field to define where the product attribute is displayed on the storefront.\n - Use the `filterable`, `sortable`, and `searchable` fields to define how the product attribute\n is used for filtering, sorting, and searching.\n - Use the `searchWeight` field to define the search weight for the product attribute.\n - Use the `searchTypes` field to define the search type for the product attribute.\n\nTo update existing product attribute metadata, use the update operation.\n" 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 components: schemas: 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 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 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: '' 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 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' 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 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 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. 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 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 responses: 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' 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' 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' 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' 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: 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. Authorization: name: Authorization in: header required: true schema: type: string description: Authorization Bearer token 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