Duplicate a product
Creates a copy of an existing product including its categories, tags, collections, images, videos, files, attributes, and translations. Variants, redirects, and product relations are not copied. The duplicated product status is set to draft. Optionally provide a product_number; otherwise a unique product number is auto-generated.
/api/v1/{team_slug}/{app_slug}/products/{product_id}/duplicate- API
- Management
- OpenAPI
- management-api
- Updated
- Apr 26, 2026
management-api:POST:/api/v1/{team_slug}/{app_slug}/products/{product_id}/duplicate
Creates a copy of an existing product including its categories, tags, collections, images, videos, files, attributes, and translations. Variants, redirects, and product relations are not copied. The duplicated product status is set to draft. Optionally provide a product_number; otherwise a unique product number is auto-generated.
API ownership
- API family: Management API
- Best for: Trusted back-office workflows that create, update, organize, or delete merchant-owned data.
- Do not use from: Browser-only storefront code or public clients.
- Guide route: /apis/management/latest
The OpenAPI contract defines the method, path, parameters, request body, and responses for this operation.
Operation
- Method:
POST - Path:
/api/v1/\{team_slug\}/\{app_slug\}/products/\{product_id\}/duplicate - Summary: Duplicate a product
- Description: Creates a copy of an existing product including its categories, tags, collections, images, videos, files, attributes, and translations. Variants, redirects, and product relations are not copied. The duplicated product status is set to draft. Optionally provide a product_number; otherwise a unique product number is auto-generated.
- OpenAPI contract: management-api
- Operation ID: Not documented in the OpenAPI contract.
Operation key uses API family, method, and path because this OpenAPI contract does not publish an operation ID.
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
| app_slug | path | Yes | string | App slug |
| team_slug | path | Yes | string | Team slug |
| product_id | path | Yes | string | Product ID to duplicate |
Request body
- Required: No
- Description: Optional duplicate overrides
- Content: application/json (object)
Duplicate Product Payload
| Property | Type | Required | Details |
|---|---|---|---|
product_number | string | No | Optional product number for the duplicated product |
Generated example (synthetic):
{
"product_number": "string"
}Responses
| Status | Description | Content |
|---|---|---|
| 201 | Product duplicated successfully | application/json (object) |
| 400 | Invalid request (e.g. bad UUID) | application/json (object) |
| 401 | Unauthorized access | application/json (object) |
| 404 | Product not found | application/json (object) |
| 500 | Internal server error | application/json (object) |
201 - object
Product Response
| Property | Type | Required | Details |
|---|---|---|---|
data | object | No | - |
details | string[] | No | Additional contextual information about the response. Used to provide supplementary details beyond the main data payload, such as validation warnings or processing notes |
success | boolean | No | - |
Product
| Property | Type | Required | Details |
|---|---|---|---|
attributes | object[] | No | Product attributes |
brand | object | No | Brand of the product |
categories | object[] | No | Associated categories |
channel_statuses | object[] | No | - |
collections | object[] | No | Associated collections |
created_at | string | No | Creation timestamp |
custom | object | No | - |
description | string | No | Description of the product |
exclude_from_feeds | boolean | No | If the products should exist in feeds or not |
files | object[] | No | Product files |
html_description | string | No | Html description |
html_short_description | string | No | Html short description |
id | string | No | Product ID |
images | object[] | No | Images of the product |
market_status | object[] | No | - |
markets | object[] | No | Associated markets |
meta_description | string | No | Meta description for SEO |
meta_title | string | No | Meta title for SEO |
package_dimensions | object | No | The package dimensions |
product_dimensions | object | No | The products dimensions |
product_name | string | No | VariantName of the product |
product_number | string | No | Product number |
product_type | string | No | Product type |
redirects | object[] | No | Product redirects |
relations | object[] | No | Product relations |
schedules | object[] | No | - |
short_description | string | No | Short description of the product |
slug | string | No | Slug for the product |
source_app_id | string | No | - |
source_id | string | No | - |
status | string | No | Status of the product |
tags | object[] | No | Product tags |
tax_group_id | string | No | The id of the tax group |
third_part_links | object[] | No | - |
translations | object | No | Product translations |
updated_at | string | No | Last updated timestamp |
variant_groups | object[] | No | Variant groups with images, attributes, videos |
variants | object[] | No | Product variants |
videos | object[] | No | Videos of the product |
Attribute
| Property | Type | Required | Details |
|---|---|---|---|
created_at | string | No | - |
description | string | No | - |
filterable | boolean | No | - |
id | string | No | - |
key | string | No | - |
name | string | No | - |
template_key | string | No | - |
template_name | string | No | - |
translatable | boolean | No | - |
translations | object | No | - |
updated_at | string | No | - |
values | object | No | - |
Product Brand
| Property | Type | Required | Details |
|---|---|---|---|
address | object | No | - |
email | string | No | - |
id | string | No | - |
name | string | No | - |
series | object | No | - |
slug | string | No | - |
Brand Address
| Property | Type | Required | Details |
|---|---|---|---|
city | string | No | - |
co_address | string | No | - |
country | string | No | - |
house_number | string | No | - |
postal_code | string | No | - |
state_province | string | No | - |
street_address | string | No | - |
Product Series
| Property | Type | Required | Details |
|---|---|---|---|
id | string | No | - |
name | string | No | - |
slug | string | No | - |
Product Category
| Property | Type | Required | Details |
|---|---|---|---|
attributes | object[] | No | - |
children | object[] | No | - |
cover_url | string | No | - |
created_at | string | No | - |
google_product_category_id | string | No | - |
id | string | No | - |
is_main_category | boolean | No | - |
name | string | No | - |
order | integer | No | - |
parent_id | string | No | - |
redirects | object[] | No | - |
slug | string | No | - |
sort_order | integer | No | Used for ordering categories themselves |
status | string | No | - |
translations | object | No | - |
updated_at | string | No | - |
uri | string | No | - |
Product Channel Status
| Property | Type | Required | Details |
|---|---|---|---|
channel_id | string | No | - |
channel_slug | string | No | - |
status | string | No | - |
Product Collection
| Property | Type | Required | Details |
|---|---|---|---|
children | object[] | No | - |
created_at | string | No | - |
id | string | No | - |
order | integer | No | - |
parent_id | string | No | - |
redirects | object[] | No | - |
slug | string | Yes | - |
status | enum("active", "inactive", "draft") | Yes | - |
title | string | No | - |
translations | object | No | - |
updated_at | string | No | - |
uri | string | No | - |
File
| Property | Type | Required | Details |
|---|---|---|---|
attributes | object[] | No | - |
created_at | string | No | - |
folder_id | string | No | - |
id | string | No | - |
public | boolean | No | - |
title | string | No | - |
translations | object | No | - |
type | string | No | - |
updated_at | string | No | - |
url | string | No | - |
Image With Priority
| Property | Type | Required | Details |
|---|---|---|---|
alt | string | No | - |
app_id | string | No | - |
attributes | object[] | No | - |
blurhash | string | No | - |
copyright | string | No | - |
custom | object | No | - |
folder_id | string | No | - |
id | string | No | - |
parent_id | string | No | - |
priority | integer | No | - |
public | boolean | No | - |
source_app_id | string | No | - |
source_id | string | No | - |
status | string | No | - |
title | string | No | - |
translations | object | No | - |
url | string | No | - |
Market Status
| Property | Type | Required | Details |
|---|---|---|---|
created_at | string | No | - |
market_id | string | No | - |
market_slug | string | No | - |
status | string | No | - |
store_group_id | string | No | - |
store_group_slug | string | No | - |
updated_at | string | No | - |
Market
| Property | Type | Required | Details |
|---|---|---|---|
active | boolean | No | - |
country_codes | string[] | No | - |
created_at | string | No | - |
currency_code | string | No | - |
id | string | No | - |
locale | string | No | - |
name | string | No | - |
slug | string | No | - |
updated_at | string | No | - |
Dimensions
| Property | Type | Required | Details |
|---|---|---|---|
capacity_milliliter | integer | No | min: 0 the capacity in milliliter |
depth | integer | No | min: 0 The products depth in millimeter |
diameter | integer | No | min: 0 the products diameter in millimeter |
height | integer | No | min: 0 The products height in millimeter |
length | integer | No | min: 0 The products length in millimeter |
weight | integer | No | min: 0 The products weight in grams |
width | integer | No | min: 0 The products width in millimeter |
Redirects
| Property | Type | Required | Details |
|---|---|---|---|
id | string | No | - |
item_id | string | No | - |
locale | string | No | - |
new_slug | string | No | - |
old_slug | string | No | - |
type | enum("product", "page", "collection", "category", "product_bundle") | No | - |
Relation
| Property | Type | Required | Details |
|---|---|---|---|
direction | string | No | - |
id | string | No | - |
primary_product_id | string | No | - |
products | object[] | No | - |
title | string | No | - |
type | string | No | - |
type_id | string | No | - |
Job
| Property | Type | Required | Details |
|---|---|---|---|
add_category_names | string[] | No | - |
add_collection_names | string[] | No | - |
add_tag_names | string[] | No | - |
execute_at | string | No | Date when the job should run |
finished_at | string | No | If a job is finished will this timestamp be filled |
id | string | No | - |
item_id | string | No | - |
item_name | string | No | - |
item_type | string | No | - |
remove_category_names | string[] | No | - |
remove_collection_names | string[] | No | - |
remove_tag_names | string[] | No | - |
to_amount_cents_with_tax | integer | No | - |
to_market_id | string | No | - |
to_market_status | string | No | - |
to_on_sale | boolean | No | - |
to_sale_amount_cents_with_tax | integer | No | - |
to_start_sale_timestamp | string | No | - |
to_status | string | No | - |
to_stop_sale_timestamp | string | No | - |
to_store_group_id | string | No | - |
Product Tag
| Property | Type | Required | Details |
|---|---|---|---|
attributes | object[] | No | - |
created_at | string | No | - |
filterable | boolean | No | - |
id | string | No | - |
key | string | No | - |
markets | object[] | No | - |
name | string | No | - |
order | integer | No | - |
schedules | object[] | No | - |
source_app_id | string | No | - |
source_id | string | No | - |
status | string | No | - |
translations | object | No | - |
updated_at | string | No | - |
Third Party Link
| Property | Type | Required | Details |
|---|---|---|---|
created_at | string | No | - |
id | string | No | - |
title | string | No | - |
type | string | No | - |
updated_at | string | No | - |
url | string | No | - |
Product Translations
| Property | Type | Required | Details |
|---|---|---|---|
description | object[] | No | - |
html_description | object[] | No | - |
html_short_description | object[] | No | - |
meta_description | object[] | No | - |
meta_title | object[] | No | - |
name | object[] | No | - |
short_description | object[] | No | - |
slug | object[] | No | - |
Variant Group
| Property | Type | Required | Details |
|---|---|---|---|
attributes | object[] | No | - |
channel_statuses | object[] | No | - |
created_at | string | No | - |
id | string | No | - |
images | object[] | No | - |
name | string | No | - |
priority | integer | No | - |
product_id | string | No | - |
slug | string | No | - |
tags | object[] | No | - |
translations | object | No | - |
updated_at | string | No | - |
variants | object[] | No | - |
videos | object[] | No | - |
Variant
| Property | Type | Required | Details |
|---|---|---|---|
attributes | object[] | No | - |
created_at | string | No | - |
custom_fields | object | No | - |
id | string | No | - |
images | object[] | No | Images of the product |
listings | object | No | - |
parent_product_id | string | No | - |
purchase_price | object | No | - |
shipping_attributes | string[] | No | - |
source_app_id | string | No | - |
source_id | string | No | - |
status | string | No | - |
store_group | object[] | No | Product StoreGroup |
tags | object[] | No | - |
translations | object | No | - |
updated_at | string | No | - |
validate_stock | boolean | No | - |
variant_dimensions | object | No | - |
variant_group_id | string | No | - |
variant_name | string | No | - |
variant_number | string | No | - |
videos | object[] | No | Videos of the product |
warehouse_variant_stock | object[] | No | - |
Video
| Property | Type | Required | Details |
|---|---|---|---|
attributes | object[] | No | - |
description | string | No | - |
folder_id | string | No | - |
id | string | No | - |
path | string | No | - |
public | boolean | No | - |
status | string | No | - |
title | string | No | - |
translations | object | No | - |
variants | object[] | No | - |
{
"data": {
"attributes": [
{
"created_at": "string",
"description": "string",
"filterable": false,
"id": "string",
"key": "string",
"name": "string",
"template_key": "string",
"template_name": "string",
"translatable": false,
"translations": {
"description": null,
"name": null
},
"updated_at": "string",
"values": {}
}
],
"brand": {
"address": {
"city": "string",
"co_address": "string",
"country": "string",
"house_number": "string",
"postal_code": "string",
"state_province": "string",
"street_address": "string"
},
"email": "string",
"id": "string",
"name": "string",
"series": {
"id": "string",
"name": "string",
"slug": "string"
},
"slug": "string"
},
"categories": [
{
"attributes": [],
"children": [],
"cover_url": "string",
"created_at": "string",
"google_product_category_id": "string",
"id": "string",
"is_main_category": false,
"name": "string",
"order": 0,
"parent_id": "string",
"redirects": [],
"slug": "string",
"sort_order": 0,
"status": "string",
"translations": {
"name": null,
"slug": null
},
"updated_at": "string",
"uri": "string"
}
],
"channel_statuses": [
{
"channel_id": "string",
"channel_slug": "string",
"status": "string"
}
],
"collections": [
{
"children": [],
"created_at": "string",
"id": "string",
"order": 0,
"parent_id": "string",
"redirects": [],
"slug": "string",
"status": "active",
"title": "string",
"translations": {
"slug": null,
"title": null
},
"updated_at": "string",
"uri": "string"
}
],
"created_at": "string",
"custom": {},
"description": "string",
"exclude_from_feeds": false,
"files": [
{
"attributes": [],
"created_at": "string",
"folder_id": "string",
"id": "string",
"public": false,
"title": "string",
"translations": {
"title": null,
"type": null
},
"type": "string",
"updated_at": "string",
"url": "string"
}
],
"html_description": "string",
"html_short_description": "string",
"id": "string",
"images": [
{
"alt": "string",
"app_id": "string",
"attributes": [],
"blurhash": "string",
"copyright": "string",
"custom": {},
"folder_id": "string",
"id": "string",
"parent_id": "string",
"priority": 0,
"public": false,
"source_app_id": "string",
"source_id": "string",
"status": "string",
"title": "string",
"translations": {
"alt": null,
"copyright": null,
"title": null
},
"url": "string"
}
],
"market_status": [
{
"created_at": "string",
"market_id": "string",
"market_slug": "string",
"status": "string",
"store_group_id": "string",
"store_group_slug": "string",
"updated_at": "string"
}
],
"markets": [
{
"active": false,
"country_codes": [],
"created_at": "string",
"currency_code": "string",
"id": "string",
"locale": "string",
"name": "string",
"slug": "string",
"updated_at": "string"
}
],
"meta_description": "string",
"meta_title": "string",
"package_dimensions": {
"capacity_milliliter": 0,
"depth": 0,
"diameter": 0,
"height": 0,
"length": 0,
"weight": 0,
"width": 0
},
"product_dimensions": {
"capacity_milliliter": 0,
"depth": 0,
"diameter": 0,
"height": 0,
"length": 0,
"weight": 0,
"width": 0
},
"product_name": "string",
"product_number": "string",
"product_type": "string",
"redirects": [
{
"id": "string",
"item_id": "string",
"locale": "string",
"new_slug": "string",
"old_slug": "string",
"type": "product"
}
],
"relations": [
{
"direction": "string",
"id": "string",
"primary_product_id": "string",
"products": [],
"title": "string",
"type": "string",
"type_id": "string"
}
],
"schedules": [
{
"add_category_names": [],
"add_collection_names": [],
"add_tag_names": [],
"execute_at": "string",
"finished_at": "string",
"id": "string",
"item_id": "string",
"item_name": "string",
"item_type": "string",
"remove_category_names": [],
"remove_collection_names": [],
"remove_tag_names": [],
"to_amount_cents_with_tax": 0,
"to_market_id": "string",
"to_market_status": "string",
"to_on_sale": false,
"to_sale_amount_cents_with_tax": 0,
"to_start_sale_timestamp": "string",
"to_status": "string",
"to_stop_sale_timestamp": "string",
"to_store_group_id": "string"
}
],
"short_description": "string",
"slug": "string",
"source_app_id": "string",
"source_id": "string",
"status": "string",
"tags": [
{
"attributes": [],
"created_at": "string",
"filterable": false,
"id": "string",
"key": "string",
"markets": [],
"name": "string",
"order": 0,
"schedules": [],
"source_app_id": "string",
"source_id": "string",
"status": "string",
"translations": {
"name": null
},
"updated_at": "string"
}
],
"tax_group_id": "string",
"third_part_links": [
{
"created_at": "string",
"id": "string",
"title": "string",
"type": "string",
"updated_at": "string",
"url": "string"
}
],
"translations": {
"description": [
{
"id": null,
"locale": null,
"value": null
}
],
"html_description": [
{
"id": null,
"locale": null,
"value": null
}
],
"html_short_description": [
{
"id": null,
"locale": null,
"value": null
}
],
"meta_description": [
{
"id": null,
"locale": null,
"value": null
}
],
"meta_title": [
{
"id": null,
"locale": null,
"value": null
}
],
"name": [
{
"id": null,
"locale": null,
"value": null
}
],
"short_description": [
{
"id": null,
"locale": null,
"value": null
}
],
"slug": [
{
"id": null,
"locale": null,
"value": null
}
]
},
"updated_at": "string",
"variant_groups": [
{
"attributes": [],
"channel_statuses": [],
"created_at": "string",
"id": "string",
"images": [],
"name": "string",
"priority": 0,
"product_id": "string",
"slug": "string",
"tags": [],
"translations": {
"name": null,
"slug": null
},
"updated_at": "string",
"variants": [],
"videos": []
}
],
"variants": [
{
"attributes": [],
"created_at": "string",
"custom_fields": {},
"id": "string",
"images": [],
"listings": {
"smart": null,
"static": null
},
"parent_product_id": "string",
"purchase_price": {
"currency": null,
"value_cents": null
},
"shipping_attributes": [],
"source_app_id": "string",
"source_id": "string",
"status": "string",
"store_group": [],
"tags": [],
"translations": {
"name": null
},
"updated_at": "string",
"validate_stock": false,
"variant_dimensions": {
"capacity_milliliter": null,
"depth": null,
"diameter": null,
"height": null,
"length": null,
"weight": null,
"width": null
},
"variant_group_id": "string",
"variant_name": "string",
"variant_number": "string",
"videos": [],
"warehouse_variant_stock": []
}
],
"videos": [
{
"attributes": [],
"description": "string",
"folder_id": "string",
"id": "string",
"path": "string",
"public": false,
"status": "string",
"title": "string",
"translations": {
"description": null,
"title": null
},
"variants": []
}
]
},
"details": [
"string"
],
"success": false
}400 - object
Error Message
| Property | Type | Required | Details |
|---|---|---|---|
details | string[] | No | - |
message | string | No | - |
success | boolean | No | - |
Generated example (synthetic):
{
"details": [
"string"
],
"message": "string",
"success": false
}401 - object
Error Message
| Property | Type | Required | Details |
|---|---|---|---|
details | string[] | No | - |
message | string | No | - |
success | boolean | No | - |
Generated example (synthetic):
{
"details": [
"string"
],
"message": "string",
"success": false
}404 - object
Error Message
| Property | Type | Required | Details |
|---|---|---|---|
details | string[] | No | - |
message | string | No | - |
success | boolean | No | - |
Generated example (synthetic):
{
"details": [
"string"
],
"message": "string",
"success": false
}500 - object
Error Message
| Property | Type | Required | Details |
|---|---|---|---|
details | string[] | No | - |
message | string | No | - |
success | boolean | No | - |
Generated example (synthetic):
{
"details": [
"string"
],
"message": "string",
"success": false
}Contract identity
Use these fields to confirm you are implementing the intended endpoint contract.
- API family: Management API
- Method:
POST - Path:
/api/v1/\{team_slug\}/\{app_slug\}/products/\{product_id\}/duplicate - Operation ID: Not documented in the OpenAPI contract.
- OpenAPI tag: Products
- OpenAPI summary: Duplicate a product