Products
Products
Create and update products with support for branches, variations, and modifiers.
POST
You can create or update products in bulk by their SKU. If a product with the specified SKU already exists, it is updated; otherwise, it is created. Products can be assigned to a branch, have multiple variations, and modifier groups.
Your store ID in Jelou Shop.
List of products to create or update (max. 500 per request).
Product fields
Each object withinresources accepts the following fields:
Unique product identifier (max. 255 characters).
Product name (max. 255 characters).
Product price (min. 0).
Product description.
Indicates whether the price includes taxes.
Individual product tax rate (between
0 and 100). Example: 15 for 15%, 12 for 12%. Only applies when enable_per_product_tax is active in the store settings. If not sent or is 0, the store’s global rate is used.Product status (active/inactive).
Inventory type:
limited or unlimited.Available quantity. Applies only when
stock_type is limited.URL of the product in your store (max. 2048 characters).
Discount type:
value (fixed amount) or percentage.Discount value (min. 0).
List of category names. They are created automatically if they do not exist.
List of public image URLs for the product.
Enables a note field on the product detail page, allowing the customer to add a comment when adding the product to the cart (e.g., “No onions”, “Gift wrap”).
Placeholder text displayed in the note field (max. 255 characters). If not specified, a generic default text is used.
Code of the branch to which the product is assigned. The branch must already exist.
List of product features (spec sheet).
Controls how variations are synced. With
false (default), variations are updated or created by SKU and existing ones not present in the payload are kept. With true, variations not present in the payload are removed.List of product variations.
Product modifier groups (add-ons). Common in food delivery (e.g., “Choose your Drinks”, “Pick your Sauces”). If the field is absent, existing modifiers are preserved. If it is an empty array
[], all modifiers are deleted. If it has data, modifiers are completely replaced.Modifiers are stored on the product and returned automatically in all endpoints that return products.
Full example
This example creates three products: a t-shirt with size variations, a simple pair of pants, and a pizza with modifier groups.Replace
{app_id} with your store ID and YOUR_API_KEY with your API key.Behavior
Asynchronous processing (default)
Asynchronous processing (default)
The endpoint returns
202 Accepted immediately. Products are processed in the background.Synchronous processing (X-Sync)
Synchronous processing (X-Sync)
Send the
X-Sync: true header to process synchronously and receive the per-product result in the same response (200 OK). In this mode the maximum is 50 products per request.200 OK
Non-existent branch
Non-existent branch
If the branch code does not match any branch in the store, the product is created without a branch assignment. No error is produced.
Automatic categories
Automatic categories
If a category does not exist, it is created automatically within the store and the corresponding branch.
Asynchronous images
Asynchronous images
Images are downloaded and processed in the background after the product is created.
Variations by SKU
Variations by SKU
Variations are identified by their SKU. If a variation with that SKU already exists, it is updated instead of creating a new one. By default, existing variations not present in the payload are kept; send
replace_variations: true to remove them.Modifiers
Modifiers
If
modifier_groups is absent in the payload, existing modifiers are preserved. If it is an empty array [], all modifiers are deleted. If it has data, modifiers are completely replaced.Validation errors
If the data does not meet the validation rules, the API responds with422 and details the fields with errors.
Common error messages
Common error messages
| Field | Message |
|---|---|
resources | At least one product is required. |
resources | Cannot process more than 500 products at once. |
resources.*.sku | Each product must have a SKU. |
resources.*.name | Each product must have a name. |
resources.*.price | Each product must have a price. / Price cannot be negative. |
resources.*.stock_type | Stock type must be either limited or unlimited. |
resources.*.images.* | Each image must be a valid URL. |
resources.*.variations.*.stock_type | Variation stock type must be either limited or unlimited. |
resources.*.variations.*.stock | Variation stock must be an integer. / Cannot be negative. |
resources.*.modifier_groups.*.code | Each modifier group must have a code. |
resources.*.modifier_groups.*.name | Each modifier group must have a name. |
resources.*.modifier_groups.*.options | Each modifier group must have at least one option. |
resources.*.modifier_groups.*.options.*.code | Each modifier option must have a code. |
resources.*.modifier_groups.*.options.*.name | Each modifier option must have a name. |
resources.*.tax | Tax rate must be a number. / cannot be negative. / cannot exceed 100. |
resources.*.replace_variations | Replace variations flag must be true or false. |
resources.*.features.*.label | Each feature must have a label. / cannot exceed 255 characters. |
resources.*.features.*.value | Each feature must have a value. / cannot exceed 200 characters. |
Limits
- Maximum 500 products per request in asynchronous mode (default), or 50 in synchronous mode (
X-Sync: true). - Maximum 10,000 products per 60-second window per store (rate limit). If exceeded, the API responds with
429 Too Many Requests. - All products are validated before being processed.