# `catalog.product.update` Patch product fields. Price and stock are NOT here — use catalog.price.set / catalog.stock.set. - **scope**: `catalog:write` - **storefront-visible** (bumps the catalog generation): yes - **destructive**: no ## Payload | field | type | required | notes | |---|---|---|---| | `id` | string (/^prd_[a-zA-Z0-9]{1,32}$/) | yes | | | `patch` | object | yes | | | ` title` | string (≤200 chars) | no | | | ` handle` | string (/^[a-z0-9](?:[a-z0-9-]{0,62}[a-z0-9])?$/, ≤64 chars) | no | | | ` descriptionMd` | string (≤20000 chars) | no | | | ` categoryId` | string (/^cat_[a-zA-Z0-9]{1,32}$/) \| null | no | | | ` badges` | array (≤10) | no | | | ` status` | "draft" \| "active" | no | | | ` lowStockThreshold` | integer (1..1000000) \| null | no | | ### JSON Schema ```json { "$schema": "https://json-schema.org/draft/2020-12/schema", "type": "object", "properties": { "id": { "type": "string", "pattern": "^prd_[a-zA-Z0-9]{1,32}$" }, "patch": { "type": "object", "properties": { "title": { "type": "string", "minLength": 1, "maxLength": 200 }, "handle": { "type": "string", "maxLength": 64, "pattern": "^[a-z0-9](?:[a-z0-9-]{0,62}[a-z0-9])?$" }, "descriptionMd": { "type": "string", "maxLength": 20000 }, "categoryId": { "anyOf": [ { "type": "string", "pattern": "^cat_[a-zA-Z0-9]{1,32}$" }, { "type": "null" } ] }, "badges": { "maxItems": 10, "type": "array", "items": { "type": "string", "pattern": "^[a-z0-9-]{1,24}$" } }, "status": { "type": "string", "enum": [ "draft", "active" ] }, "lowStockThreshold": { "anyOf": [ { "type": "integer", "minimum": 1, "maximum": 1000000 }, { "type": "null" } ] } }, "additionalProperties": false } }, "required": [ "id", "patch" ], "additionalProperties": false } ```