# `catalog.product.create` Create a product. price/compareAt in kuruş; stock null = untracked; handle derived from title when omitted. - **scope**: `catalog:write` - **storefront-visible** (bumps the catalog generation): yes - **destructive**: no ## Payload | field | type | required | notes | |---|---|---|---| | `title` | string (≤200 chars) | yes | | | `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}$/) | no | | | `price` | integer (0..10000000000000) | yes | | | `compareAt` | integer (0..10000000000000) | no | | | `stock` | integer (0..9007199254740991) \| null | no | | | `badges` | array (≤10) | no | | | `status` | "draft" \| "active" | no | | ### JSON Schema ```json { "$schema": "https://json-schema.org/draft/2020-12/schema", "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": { "type": "string", "pattern": "^cat_[a-zA-Z0-9]{1,32}$" }, "price": { "type": "integer", "minimum": 0, "maximum": 10000000000000 }, "compareAt": { "type": "integer", "minimum": 0, "maximum": 10000000000000 }, "stock": { "anyOf": [ { "type": "integer", "minimum": 0, "maximum": 9007199254740991 }, { "type": "null" } ] }, "badges": { "maxItems": 10, "type": "array", "items": { "type": "string", "pattern": "^[a-z0-9-]{1,24}$" } }, "status": { "type": "string", "enum": [ "draft", "active" ] } }, "required": [ "title", "price" ], "additionalProperties": false } ```