Use POST https://www.wixapis.com/stores/v1/products to create a product.
CRITICAL: Description accepts an HTML string in V1 (unlike V3 which requires rich text nodes).
Key V1 fields:
| Field | Type | Notes |
|---|---|---|
name | string | Required. Max 80 characters |
description | string | HTML string — NOT rich text nodes (e.g. "<p>text</p>") |
productType | string | "physical" only (digital not supported via API) |
priceData.price | number | Product base price |
visible | boolean | Whether the product is visible to customers |
In V1, options are defined via productOptions. Variants are auto-generated from the choices — you do not need to define them manually.
V1 Options structure:
optionType: "drop_down" for text choices, "color" for color swatcheschoices[].description: Display name shown to customerschoices[].value: Internal value (use hex color code for color type, e.g. "#000000")choices[].inStock: Whether this choice is in stockchoices[].visible: Whether this choice is visible to customersVariants in V1 responses are returned as an object with option name keys:
This is different from V3 which uses an array structure.
| Feature | Catalog V1 | Catalog V3 |
|---|---|---|
| Create endpoint | POST /stores/v1/products | POST /stores/v3/products |
| Description | HTML string ("<p>text</p>") | Rich text nodes object |
| Options field | productOptions | options |
| Option type field | optionType (drop_down, color) | optionRenderType (TEXT_CHOICES, SWATCH_CHOICES) |
| Choice visibility | choices[].visible | choices[].isVisible |
| Variants | Auto-generated from choices | Must be explicitly defined in variantsInfo.variants |
| Variant choices | Object: {"Weight": "250g"} | Array of optionChoiceNames |
| Price field | priceData.price (number) | price.actualPrice.amount (string) |
/stores/v3/ endpoints on a CATALOG_V1 site — they return 428 Precondition Required.productType only supports "physical" via the API.