---
title: "Update a catalog product (any type)"
method: PUT
path: "/catalog/products/{id}"
tags: ["Admin Catalog: Products"]
---

# Update a catalog product (any type)

`PUT /catalog/products/{id}`

## Request

- Base URL: `http://localhost:8000/api/admin`
- URL: `http://localhost:8000/api/admin/catalog/products/{id}`
- Auth: HTTP bearer
- TypeScript: <https://skmtc.dev/bagisto/apis/bagisto-admin-api/docs/catalog/products/:id/put.ts> (a function with typed inputs; its response is checked against the schema)

Partial update (PATCH-style): send only the fields you want to change — every attribute on the product's family is editable by its code (sku, name, url_key, short_description, description, meta_title, color, size, brand, price, weight, status, …). Translatable fields are written to the requested locale; pass `?locale=fr&channel=default` to target a specific locale/channel (defaults to the store default). Omitted fields keep their current value. Type-structure keys are accepted for the matching type: `variants` (configurable), `bundle_options` (bundle), `links` (grouped), `downloadable_links`/`downloadable_samples` (downloadable), `booking` (booking). `categories`/`channels`/`related_products`/`up_sells`/`cross_sells` replace the current set when sent (omit to keep). Sub-resources `images`/`videos`/`inventories`/`customer_group_prices` have dedicated endpoints and are ignored here (noted in `_warnings`). Returns the full product detail (same shape as GET /catalog/products/{id}).

## Path parameters

- `id` integer, required

## Request body

- object: Every field on the product edit form is editable by its attribute code. Send only what you change. Pick a product type from the Examples dropdown to see the full edit-form body for that type.
  - `sku` string
  - `name` string
  - `product_number` string
  - `url_key` string
  - `status` 0 | 1
  - `visible_individually` 0 | 1
  - `guest_checkout` 0 | 1
  - `new` 0 | 1
  - `featured` 0 | 1
  - `manage_stock` 0 | 1
  - `price` string
  - `cost` string
  - `special_price` string
  - `special_price_from` string, date
  - `special_price_to` string, date
  - `GST` string
  - `weight` string
  - `length` string
  - `width` string
  - `height` string
  - `tax_category_id` integer
  - `color` integer: Attribute option id.
  - `size` integer: Attribute option id.
  - `brand` integer: Attribute option id.
  - `short_description` string
  - `description` string
  - `meta_title` string
  - `meta_keywords` string
  - `meta_description` string
  - `categories` integer[]
  - `channels` integer[]
  - `up_sells` integer[]
  - `cross_sells` integer[]
  - `related_products` integer[]
  - `customizable_options` object: Custom options (simple & virtual only). Keyed option_*; each option may carry a prices map keyed price_*.
  - `super_attributes` object: Configurable only. Map of attribute code to option-id list.
  - `variants` object: Configurable only. Per-variant fields keyed by variant product id.
  - `bundle_options` object: Bundle only. Option groups keyed option_*; products keyed product_*.
  - `links` object: Grouped only. Associated products keyed link_*.
  - `downloadable_links` object: Downloadable only. Links keyed link_*.
  - `downloadable_samples` object: Downloadable only. Samples keyed sample_*.
  - `booking` object: Booking only. type ∈ default/appointment/event/rental/table.
  - `translations` object: Optional locale-keyed override. Top-level codes already write to the request locale (?locale=).

## Response `200`

Product updated. Returns the full AdminCatalogProduct payload, plus _warnings (array of strings) if any sub-resource fields were stripped from the payload.

## Other responses

- `400`: Invalid input
- `401`: Missing or invalid admin token.
- `403`: Admin role lacks catalog.products.edit.
- `404`: Product not found.
- `422`: Validation failure (sku duplicate, url_key duplicate, invalid boolean field, special_price ≥ price, invalid date range).

---

[API](https://skmtc.dev/bagisto/apis/bagisto-admin-api.md) - [All operations](https://skmtc.dev/bagisto/apis/bagisto-admin-api/llms.txt) - [OpenAPI document](https://skmtc.dev/bagisto/apis/bagisto-admin-api/revisions/3198f11be70f?raw)
