Skip to main content
POST
/
api
/
v1
/
products.json
Create Product
curl --request POST \
  --url https://api.launchmystore.io/api/v1/products.json \
  --header 'Authorization: Bearer <token>' \
  --header 'Content-Type: application/json' \
  --data '
{
  "title": "<string>",
  "description": "<string>",
  "handle": "<string>",
  "vendor": "<string>",
  "product_type": "<string>",
  "categoryId": "<string>",
  "categoryIds": [
    {}
  ],
  "status": "<string>",
  "tags": [
    {}
  ],
  "options": [
    {
      "name": "<string>",
      "values": [
        {}
      ]
    }
  ],
  "variants": [
    {
      "title": "<string>",
      "price": 123,
      "compare_at_price": 123,
      "sku": "<string>",
      "barcode": "<string>",
      "inventory_quantity": 123,
      "weight": 123,
      "weight_unit": "<string>",
      "option1": "<string>",
      "option2": "<string>",
      "option3": "<string>",
      "requires_shipping": true,
      "taxable": true
    }
  ],
  "images": [
    {
      "src": "<string>",
      "alt": "<string>",
      "position": 123
    }
  ]
}
'
{
  "success": true,
  "data": {}
}

Create Product

Creates a new product in the store.

Request

curl -X POST "https://api.launchmystore.io/api/v1/products.json" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Classic T-Shirt",
    "description": "<p>A comfortable cotton t-shirt.</p>",
    "vendor": "MyBrand",
    "product_type": "Apparel",
    "status": "draft",
    "tags": ["cotton", "casual"],
    "variants": [
      {
        "title": "Small / Black",
        "price": 2500,
        "sku": "TSHIRT-S-BLK",
        "inventory_quantity": 50
      }
    ]
  }'

Body Parameters

title
string
required
The product title
description
string
Product description (supports HTML)
handle
string
URL-safe handle. Auto-generated from title if not provided
vendor
string
Product vendor/brand name
product_type
string
Product type or category
categoryId
string
Primary category ID (legacy single-category FK). Creating a product with this field also writes a ProductCategories join row, so the product appears on the corresponding collection page without needing categoryIds. Send this on its own for single-category products.
categoryIds
array
Array of category IDs for the many-to-many ProductCategories join. This is the relation /collections/{handle} listings and the collection.products Liquid drop read from. The first entry (or the one matching categoryId) is stored as the primary association. Use this when a product belongs to multiple categories. If omitted, the backend falls back to [categoryId].
status
string
default:"draft"
Product status: active, draft, archived
tags
array
Array of tags for organizing and filtering products
options
array
Product options (e.g., Size, Color). Max 3 options per product.
variants
array
Array of product variants. At least one variant is required.
images
array
Array of product images

Response

success
boolean
Whether the request succeeded
data
object
The created product object (same structure as Get Product response)

Example Response

{
  "success": true,
  "data": {
    "id": "prod_new123",
    "title": "Classic T-Shirt",
    "handle": "classic-t-shirt",
    "description": "<p>A comfortable cotton t-shirt.</p>",
    "vendor": "MyBrand",
    "product_type": "Apparel",
    "status": "draft",
    "tags": ["cotton", "casual"],
    "variants": [
      {
        "id": "var_new456",
        "title": "Small / Black",
        "price": 2500,
        "sku": "TSHIRT-S-BLK",
        "inventory_quantity": 50
      }
    ],
    "images": [],
    "created_at": "2024-01-25T10:00:00Z",
    "updated_at": "2024-01-25T10:00:00Z"
  }
}

Error Codes

CodeDescription
UNAUTHORIZEDInvalid or missing access token
FORBIDDENApp doesn’t have write_products scope
VALIDATION_ERRORInvalid request body (see error details)
DUPLICATE_HANDLEA product with this handle already exists