openapi: 3.1.0
info:
version: 25.1126.6886238
x-version-timestamp: 2025-11-26 19:10:23+00:00
title: Addresses Introduction Account Addresses Products API
description: 'The Addresses API allows you to organize account addresses. Addresses are a sub-resource of `account` resources, an account can have multiple addresses, such as home, work, and neighbour.
You can use an account address with either [client_credentials access token](/docs/api/authentication/create-an-access-token) or a combination of [implicit access token](/docs/api/authentication/create-an-access-token) and [Account Management authentication](/docs/api/accounts/post-v-2-account-members-tokens) token.
'
contact:
name: Elastic Path
url: https://www.elasticpath.com
email: support@elasticpath.com
license:
url: https://elasticpath.dev
name: MIT
servers:
- url: https://useast.api.elasticpath.com
description: US East
- url: https://euwest.api.elasticpath.com
description: EU West
security:
- BearerToken: []
tags:
- name: Products
description: '```mdx-code-block
import ProductsOverview from ''/docs/partials/pxm/products/productsoverview.mdx'';
import ProductTypes from ''/docs/partials/pxm/products/types.mdx'';
import ProductTags from ''/docs/partials/pxm/products/tags.mdx'';
import PersonalProducts from ''/docs/partials/pxm/products/personalizing.mdx'';
import ProductCatalogs from ''/docs/partials/pxm/products/catalogs.mdx'';
import Overview from "/docs/partials/pxm/bundles/bundles.mdx";
import ComponentOptions from "/docs/partials/pxm/bundles/components.mdx";
import BundlePricing from "/docs/partials/pxm/bundles/bundlepricing.mdx";
import DynamicBundles from "/docs/partials/pxm/bundles/dynamic.mdx";
import BundlesBundles from "/docs/partials/pxm/bundles/bundlesof.mdx";
<ProductsOverview />
### Product Types
<ProductTypes />
### Personalizing Products
<PersonalProducts />
### Products and Catalog Releases
<ProductCatalogs />
### Bundles
<Overview></Overview>
### Bundle Components and Options
<ComponentOptions></ComponentOptions>
### Bundle Pricing
<BundlePricing></BundlePricing>
### Dynamic Bundles
<DynamicBundles></DynamicBundles>
#### Creating Dynamic Bundles: An Overview
The following steps are an overview of how to use dynamic bundles.
1. Create your products using [**create a product**](/docs/api/pxm/products/create-product).
1. Create a bundle using [**create a bundle**](/docs/api/pxm/products/create-product).
1. Specify minimum and/or maximum values for the number of product options that can be selected within the bundle. For example, if you want the shopper to select exactly 4 out of 10 options, set both the minimum and maximum values to 4 for each of the 10 product options.
1. For each product option in the bundle, specify if it is a default option by adding `"default": true` to the product options that you want to be pre-selected for the shopper.
1. Publish the bundle to your catalog using the [Publish a catalog](/docs/api/pxm/catalog/publish-release) endpoint so you can display the products to your shoppers in your storefront.
1. When a shopper interacts with the bundle on your storefront, they can select the products they want from the list of options. Use the [configure a shopper bundle](/docs/api/pxm/catalog/configure-by-context-product) endpoint to capture the shoppers selections. This updates the `bundle_configuration` with the product options chosen by a shopper.
1. Once a shopper has configured their bundle, use the add a product to a cart endpoint to add the selected bundle to the shopper’s cart.
1. When the shopper proceeds to checkout, the selected product options from the bundle are included in the order.
### Bundles of Bundles
<BundlesBundles></BundlesBundles>
#### Creating Bundles of Bundles: An Overview
To create a bundle of bundles, simply add a bundle as a component to another bundle.
1. Create your products using [**create a product**](/docs/api/pxm/products/create-product).
1. Create all your child bundles using [**create a bundle**](/docs/api/pxm/products/create-product).
1. [**Create a parent bundle**](/docs/api/pxm/products/create-product) and specify the product ID of your child bundle as an option of a component in your bundle. You cannot have more than 1500 options in a bundle.
```
'
paths:
/pcm/products:
post:
summary: Create a product or bundle
description: "Creates a product or bundle with the attributes that are defined in the body.\n\n#### Product Types\n\nProduct Experience Manager automatically assigns types to the products you create. You can filter on product types. Product types can also be used in catalogs. For example, in your catalog, you can filter on `parent` so that only your parent products are displayed in your storefront. \n\nSee [**Product Types**](/docs/api/pxm/products/products#product-types).\n\n#### Product Tags\n\nYou can use product tags to store or assign a key word against a product or service that you sell in your store. The product tag can then be used to describe or label that product. Product tags represent similarities between products who do not share the same attributes. Using product tags means that you can group your products together, for example, by brand, category, subcategory, colors, types, industries, and so on. \n\nSee [**Product Tags**](/docs/api/pxm/products/product-tags).\n\n#### Personalizing Products\n\nYou can allow your shoppers to add custom text to a product when adding product items to their carts. This is useful, for example, if you have a product like a T-shirt that can be personalized, or you sell greetings cards that can be printed with your shoppers personalized messages. You can do this by configuring the `custom_inputs` attribute.\n\nWhen configuring the `custom_inputs` attribute:\n\n- You can rename `input` to something more representative of the input that shoppers are adding, for example, `message` or `front`.\n- `name` is the name that is displayed in your storefront.\n- You can add validation rules. For example, the input field must be a `string` and/or up to 255 characters in length. The limit is 255 characters.\n- You can specify if the input field is required.\n\n#### Curating Products\n\nYou can curate the products in a node. Product curation allows you to promote specific products within each node of your hierarchies, enabling you to create unique product collections in your storefront. For example, you may find you have an abundance of cotton T-Shirts and you want to promote these products to the top of the product list. When a shopper navigates to T-shirts, the cotton T-Shirts are displayed first. See [**Update a node**](/docs/api/pxm/products/update-node).\n\n#### Bundles\n\nWith Product Experience Manager, you can use the products API to create and manage bundles. A bundle is a purchasable product, consisting of one or more products that you want to sell together. \n\nSee [**Bundles**](/docs/api/pxm/products/products#bundles).\n"
operationId: createProduct
tags:
- Products
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/create_product_request'
examples:
create-product:
summary: Create a base product
$ref: '#/components/examples/product_request'
build-rules:
summary: Create a base product, associate variations, configure build rules
$ref: '#/components/examples/build_rules_request'
sku-bundles:
summary: SKU-based bundles
$ref: '#/components/examples/bundle_sku_based_request'
sku-less-bundles:
summary: SKU-less bundles
$ref: '#/components/examples/bundle_sku_less_request'
bundle-quantity-config:
summary: Create Bundle with Quantity Configuration
description: Create a bundle where each selected option can have a configurable quantity. In this example, syrup is optional (0-2 types) with up to 3 pumps per syrup, and exactly one coffee type must be selected.
$ref: '#/components/examples/create_bundle_with_quantity_config'
responses:
'201':
description: Creates a product with the following attributes.
content:
application/json:
schema:
$ref: '#/components/schemas/single_product_response'
examples:
created-product:
summary: Create a base product
$ref: '#/components/examples/create_single_product_response'
build-rules:
summary: Create a base product, associate variations, configure build rules
$ref: '#/components/examples/create_build_rules_response'
bundle-quantity-config:
summary: Create Bundle with Quantity Configuration
description: A bundle where each selected option can have a configurable quantity. In this example, syrup is optional (0-2 types) with up to 3 pumps per syrup, and exactly one coffee type must be selected.
$ref: '#/components/examples/bundle_with_quantity_config_response'
'422':
$ref: '#/components/responses/unprocessable_entity'
'500':
$ref: '#/components/responses/internal'
get:
summary: Get all products
description: "Retrieves a list of all your products in the Product Experience Manager system.\n\nYou can also use `include` to retrieve top-level resources, such as files or images, and key attribute data, such as SKU or slug for component products in a product bundle. With this option, you can get more information about the products in a product bundle in your store front, improving the buying experience for your shoppers.\n\n#### Pagination\n\nThis endpoint supports offset-based pagination using `page[offset]` and `page[limit]` query parameters.\n\n:::caution Planned pagination changes — on or after 1 September 2026\n\nThe pagination links returned by this endpoint currently differ from the Elastic Path Commerce Cloud platform standard. Specifically, the `current` link is not returned, `first`/`last` are not always present, `prev` is incorrectly omitted on the second page, and `next` is incorrectly omitted on the second-to-last page.\n\nOn or after **1 September 2026**, this endpoint will be updated so that `current` and `first` are always present, `last` is present on every page except the final page, `next` is present on every page except the last, and `prev` is present on every page except the first. See the [links](/docs/api/pxm/products/get-all-products#links) schema for full details.\n\nIf your integration iterates through pages using these links, please verify that it will handle the updated behaviour correctly before this date.\n\n:::\n\n#### Filtering\n\n Many Commerce API endpoints support filtering. The general syntax is described in [**Filtering**](/guides/Getting-Started/filtering).\n\n The following attributes and operators are supported.\n\n| Operator | Attribute | Description | Example |\n| :------------------------ | :------------------------------------------------------------------------------------------------------------------------------------------------------ | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | :----------------------------------------------- |\n| `eq` | `id`, `sku`, `slug`, `upc_ean`, `manufacturer_part_num`, `name`, `templates`, `commodity_type`, `owner`, `product_types`, `parent_id`, `component_option_id`, `tags`, `status`, `has_nodes (false only)`, `created_at`, `updated_at`, `external_ref`, `description` | Equals. Checks if the values of two operands are equal. If they are, the condition is true. For `product_types`, you can only specify one product type. **Note:** `has_nodes` can only be filtered as `false`. **Note:** `component_option_id` matches when a bundle includes that product id as a component option. | `?filter=eq(name,some-name)` |\n| `like` | `sku`, `slug`, `upc_ean`, `manufacturer_part_num`, `name`, `tags`, `description`, `external_ref` | Like. Checks if the operand contains the specified string. Wildcards are supported. | `?filter=like(name,*some-name*)` |\n| `in` | `id`, `name`, `sku`, `slug`, `upc_ean`, `manufacturer_part_num`, `product_types`, `parent_id`, `component_option_id`, `tags`, `external_ref` | Checks if the values are included in the specified list. If they are, the condition is true. For `product_types`, you can specify more than one product type. | `?filter=in(id,some-id)` |\n| `gt` | `id`, `created_at`, `updated_at`, `external_ref` | Greater than. Checks if the value of the field is greater than the given value. | `?filter=gt(updated_at,2024-01-01T00:00:00Z)` |\n| `ge` | `id`, `created_at`, `updated_at`, `external_ref` | Greater than or equal to. Checks if the value of the field is greater than or equal to the given value. | `?filter=ge(created_at,2023-01-01T00:00:00Z)` |\n| `lt` | `id`, `created_at`, `updated_at`, `external_ref` | Less than. Checks if the value of the field is less than the given value. | `?filter=lt(updated_at,2025-01-01T00:00:00Z)` |\n| `le` | `id`, `created_at`, `updated_at`, `external_ref` | Less than or equal to. Checks if the value of the field is less than or equal to the given value. | `?filter=le(created_at,2022-01-01T00:00:00Z)` |\n| `eq` (extensions) | `extensions.book.isbn` | Filters using a nested extension field. | `?filter=eq(extensions.book.isbn,1765426)` |\n| `eq` (shopper_attributes) | `shopper_attributes.color` | Filters using a shopper custom attribute field. | `?filter=eq(shopper_attributes.color,red)` |\n| `eq` (admin_attributes) | `admin_attributes.warehouse` | Filters using an admin custom attribute field. | `?filter=eq(admin_attributes.warehouse,US-EAST)` |\n"
operationId: getAllProducts
tags:
- Products
parameters:
- $ref: '#/components/parameters/page_offset'
- $ref: '#/components/parameters/page_limit'
- $ref: '#/components/parameters/filterproduct'
- $ref: '#/components/parameters/include'
responses:
'200':
description: Returns a list of all products.
content:
application/json:
schema:
$ref: '#/components/schemas/multi_product_response'
examples:
list-products:
$ref: '#/components/examples/multi_product_response'
'400':
$ref: '#/components/responses/bad_request'
'500':
$ref: '#/components/responses/internal'
/pcm/products/{productID}:
get:
summary: Get a product
description: "Returns a product by its identifier. \n\nYou can also use `include=component_products` to retrieve top-level resources, such as files or images, and key attribute data, such as SKU or slug for component products in a product bundle. With this option, you can get more information about the products in a product bundle in your store front, improving the buying experience for your shoppers.\n"
operationId: getProduct
parameters:
- $ref: '#/components/parameters/product_id'
- $ref: '#/components/parameters/include'
tags:
- Products
responses:
'200':
description: Returns a product by its identifier.
content:
application/json:
schema:
$ref: '#/components/schemas/single_product_response'
examples:
get-product:
summary: Product
$ref: '#/components/examples/get_single_product_response'
get-product-bundle:
summary: Bundle
$ref: '#/components/examples/get_bundle_response'
get-product-bundle-quantity-config:
summary: Bundle with Quantity Configuration
description: Retrieve a bundle where each selected option can have a configurable quantity. In this example, syrup is optional (0-2 types) with up to 3 pumps per syrup, and exactly one coffee type must be selected.
$ref: '#/components/examples/bundle_with_quantity_config_response'
get-product-component-parent:
summary: Parent Product
$ref: '#/components/examples/get_parent_product_response'
get-product-component-child:
summary: Child Product
$ref: '#/components/examples/get_child_product_response'
get-product-component-products:
summary: Component Product
$ref: '#/components/examples/get_component_product_response'
'400':
$ref: '#/components/responses/bad_request'
'404':
$ref: '#/components/responses/not_found'
'500':
$ref: '#/components/responses/internal'
put:
summary: Update a product or bundle
description: Specify whichever attributes you want to change. The values of the other attributes remain the same. If the attributes section is empty, the product or bundle is not updated.
operationId: updateProduct
parameters:
- $ref: '#/components/parameters/product_id'
tags:
- Products
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/update_product_request'
examples:
update-product:
summary: Update a base product
$ref: '#/components/examples/update_product_request'
update-product-build-rules:
summary: Update a base product and build rules
$ref: '#/components/examples/update_build_rules_request'
update-product-custom-inputs:
summary: Update using custom_inputs
description: You can allow your shoppers to add custom text to a product when checking out their carts. This is useful, for example, if you have a product like a T-shirt that can be personalized. You can do this using the custom_inputs attribute when creating your products.
$ref: '#/components/examples/update_custom_inputs_request'
update-product-bundle:
summary: Update a bundle
$ref: '#/components/examples/update_bundle_request'
update-product-bundle-quantity-config:
summary: Update Bundle with Quantity Configuration
description: Update a bundle where each selected option can have a configurable quantity. In this example, syrup is optional (0-2 types) with up to 3 pumps per syrup, and exactly one coffee type must be selected.
$ref: '#/components/examples/update_bundle_with_quantity_config'
responses:
'200':
description: Updates a product with the following attributes.
content:
application/json:
schema:
$ref: '#/components/schemas/single_product_response'
examples:
updated-product:
summary: Update a base product
$ref: '#/components/examples/update_single_product_response'
build-rules:
summary: Update a base product, configure build rules
$ref: '#/components/examples/update_build_rules_response'
update-product-custom-inputs:
summary: Update using custom_inputs
$ref: '#/components/examples/update_custom_inputs_response'
update-product-bundle:
summary: Update a bundle
$ref: '#/components/examples/update_bundle_response'
update-product-bundle-quantity-config:
summary: Update Bundle with Quantity Configuration
description: A bundle where each selected option can have a configurable quantity. In this example, syrup is optional (0-2 types) with up to 3 pumps per syrup, and exactly one coffee type must be selected.
$ref: '#/components/examples/bundle_with_quantity_config_response'
'403':
$ref: '#/components/responses/forbidden'
'404':
$ref: '#/components/responses/not_found'
'409':
$ref: '#/components/responses/write_conflict'
'422':
$ref: '#/components/responses/unprocessable_entity'
'500':
$ref: '#/components/responses/internal'
delete:
summary: Delete a product
description: 'Deletes the specified product.
You cannot delete a product if it is part of a bundle. You must first delete the bundle before you delete the product.
'
operationId: deleteProduct
parameters:
- $ref: '#/components/parameters/product_id'
tags:
- Products
responses:
'204':
description: Deletes the specified product.
'403':
$ref: '#/components/responses/forbidden'
'422':
$ref: '#/components/responses/unprocessable_entity'
'500':
$ref: '#/components/responses/internal'
/pcm/products/attach_nodes:
post:
summary: Attach multiple nodes
description: "Assigns products to multiple hierarchies and their children nodes. You can apply a filter to search for the appropriate products to attach to a node. For general filtering syntax, see [**Filtering**](/guides/Getting-Started/filtering).\n \n The following attributes and operators are supported.\n \n | Operator | Attribute | Description | Example |\n | :------------------------ | :------------------------------------------------------------------------------------------------------------------------------------------------------ | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | :----------------------------------------------- |\n | `eq` | `id`, `sku`, `slug`, `upc_ean`, `manufacturer_part_num`, `name`, `templates`, `commodity_type`, `owner`, `product_types`, `parent_id`, `component_option_id`, `tags`, `status`, `has_nodes (false only)`, `created_at`, `updated_at`, `external_ref`, `description` | Equals. Checks if the values of two operands are equal. If they are, the condition is true. For `product_types`, you can only specify one product type. **Note:** `has_nodes` can only be filtered as `false`. **Note:** `component_option_id` matches when a bundle includes that product id as a component option. | `?filter=eq(name,some-name)` |\n | `like` | `sku`, `slug`, `upc_ean`, `manufacturer_part_num`, `name`, `tags`, `description`, `external_ref` | Like. Checks if the operand contains the specified string. Wildcards are supported. | `?filter=like(name,*some-name*)` |\n | `in` | `id`, `name`, `sku`, `slug`, `upc_ean`, `manufacturer_part_num`, `product_types`, `parent_id`, `component_option_id`, `tags`, `external_ref` | Checks if the values are included in the specified list. If they are, the condition is true. For `product_types`, you can specify more than one product type. | `?filter=in(id,some-id)` |\n | `gt` | `id`, `created_at`, `updated_at`, `external_ref` | Greater than. Checks if the value of the field is greater than the given value. | `?filter=gt(updated_at,2024-01-01T00:00:00Z)` |\n | `ge` | `id`, `created_at`, `updated_at`, `external_ref` | Greater than or equal to. Checks if the value of the field is greater than or equal to the given value. | `?filter=ge(created_at,2023-01-01T00:00:00Z)` |\n | `lt` | `id`, `created_at`, `updated_at`, `external_ref` | Less than. Checks if the value of the field is less than the given value. | `?filter=lt(updated_at,2025-01-01T00:00:00Z)` |\n | `le` | `id`, `created_at`, `updated_at`, `external_ref` | Less than or equal to. Checks if the value of the field is less than or equal to the given value. | `?filter=le(created_at,2022-01-01T00:00:00Z)` |\n | `eq` (extensions) | `extensions.book.isbn` | Filters using a nested extension field. | `?filter=eq(extensions.book.isbn,1765426)` |\n | `eq` (shopper_attributes) | `shopper_attributes.color` | Filters using a shopper custom attribute field. | `?filter=eq(shopper_attributes.color,red)` |\n | `eq` (admin_attributes) | `admin_attributes.warehouse` | Filters using an admin custom attribute field. | `?filter=eq(admin_attributes.warehouse,US-EAST)` |\n"
operationId: attachNodes
tags:
- Products
requestBody:
required: true
content:
application/json:
schema:
type: object
required:
- data
properties:
data:
type: object
required:
- filter
- node_ids
properties:
filter:
type: string
description: 'Filters applied to search for appropriate products to attach to a node. See [Attach multiple nodes](/docs/api/pxm/products/attach-nodes).
'
example: eq(sku,book)
node_ids:
type: array
description: A list of node unique identifiers that you want to assign to the products.
example:
- '123'
items:
type: string
examples:
product-attach-nodes:
summary: Attach multiple nodes
value:
data:
filter: eq(sku,book)
node_ids:
- '123'
responses:
'200':
description: This request assigns the products that you have selected to multiple hierarchies and their children nodes and returns the following.
content:
application/json:
# --- truncated at 32 KB (135 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/elastic-path/refs/heads/main/openapi/elastic-path-products-api-openapi.yml