Catalog Product — Copy
Duplicates an existing catalog product. Fires catalog.product.create.before / catalog.product.create.after so listeners (search index, cache flush) trigger on the copy.
Endpoint
| Endpoint | Method |
|---|---|
/api/admin/catalog/products/{sourceId}/copy | POST |
Path parameters
| Field | Type | Required | Notes |
|---|---|---|---|
sourceId | integer | yes | ID of the product to duplicate. |
Request body
Empty. Send an empty JSON object {} if your client requires a body.
Response
200 OK
| Field | Type | Notes |
|---|---|---|
id | integer | ID of the newly created copy. |
sourceId | integer | ID of the source product. |
sku | string | Auto-suffixed SKU (Bagisto appends -copy-N). |
type | string | Product type — matches the source. |
name | string|null | Display name of the copy, when available. |
success | bool | Always true on success. |
message | string | Translated confirmation. |
Errors
| HTTP | Cause |
|---|---|
401 Unauthorized | Missing or invalid admin Bearer token. |
403 Forbidden | Admin role lacks catalog.products.create. |
404 Not Found | Source product not found. |
422 Unprocessable Entity | Source is a configurable variant (parent_id != null). |
500 Internal Server Error | Underlying copy threw an exception. |
Notes
- The new SKU suffix is generated by Bagisto core — clients cannot pre-specify it.
- Variant rows are NOT copy targets — only the parent configurable product is.

