Bulk create or update products. Each product is matched by its `sku` — existing rows are updated, new ones are created. The SKU is stored on the product as the external reference for later stock/price updates.
Request body
{
"products": [
{
"sku": "MDL-001", // required, unique external reference
"name": "Marble Desk Lamp", // required
"slug": "marble-desk-lamp", // optional, auto-derived if omitted
"description": "…",
"details": "…",
"category_id": "uuid", // either category_id or category_slug
"category_slug": "lighting",
"mrp": 4999,
"sale_price": 3499,
"min_sale_price": 3000,
"stock_quantity": 12,
"gst_pct": 18,
"image_url": "https://…",
"video_url": null,
"vendor_id": "uuid",
"vendor_cost": 2500,
"b2b_price": 3200,
"b2b_min_qty": 5,
"is_active": true,
"approval_status": "approved",
// Optional inline images — uploaded to Cloud storage and linked.
"image_base64": "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEA...",
"image_content_type": "image/jpeg", // required if image_base64 is raw (no data: prefix)
"images": [
// Each entry may be:
// • a data URL string ("data:image/png;base64,...")
// • a raw base64 string (requires content_type on the object form below)
// • a public https URL string
// • an object: { base64 | data | url, content_type?, alt?, sort_order? }
{ "base64": "/9j/4AAQSkZJ...", "content_type": "image/jpeg", "alt": "Front", "sort_order": 0 },
{ "url": "https://cdn.example.com/lamp-side.jpg", "alt": "Side", "sort_order": 1 }
]
}
]
}Example request
curl -X POST -H "Authorization: Bearer lvbl_..." \
-H "Content-Type: application/json" \
-d '{ "products": [{
"sku": "MDL-001",
"name": "Marble Desk Lamp",
"category_slug": "lighting",
"mrp": 4999,
"sale_price": 3499,
"image_base64": "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEA..."
}] }' \
"https://shop.innosate.com/api/public/v1/products/bulk"Example response
{
"summary": { "total": 1, "created": 1, "updated": 0, "errors": 0 },
"results": [
{ "sku": "MDL-001", "status": "created", "id": "uuid", "images_uploaded": 1 }
]
}