How to Update Product Data Using the Zepio Developer API
Updated 2 weeks ago
Products Update API
Creating API Key
The Products Update API allows you to bulk update product details in your Zepio store using a secure API key.
Create API Key
- Login to your Zepio Admin Dashboard.
- Go to: Settings > Developer API
- Create a new API key and select this ability: Update products
Use this API key when making requests to the Products Update API.
Base URL
https://yourwebsite.com/api/developer/v1
Replace yourwebsite.com with your store domain.
Authentication
Send your API key as a Bearer Token in the request header.
Authorization: Bearer YOUR_API_KEY
Accept: application/json
Content-Type: application/json
Endpoints
| Method | Endpoint | Description |
|---|---|---|
| POST | /products/bulk-update |
Bulk update one or more products |
Bulk Update Products
Updates one or more existing products in a single request. Only the fields you send are updated — you do not need to send the full product object.
POST /api/developer/v1/products/bulk-update
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
branch_id |
integer | No | Default branch ID for all products. Default: 1 |
products |
array | Yes | List of products to update. Minimum: 1, Maximum: 100 |
Product Object Fields
Each item in products must include either id or erp_id, plus at least one field to update.
| Field | Type | Required | Description |
|---|---|---|---|
id |
integer | Yes* | Internal Zepio product ID. Use this for normal stores. |
erp_id |
string | Yes* | ERP product ID. Use this when syncing from an external ERP system. |
branch_id |
integer | No | Branch ID for this product. Overrides the top-level branch_id. |
name |
string | No | Product name |
description |
string | No | Product description |
original_price |
number | No | Original/MRP price |
selling_price |
number | No | Selling price |
track_quantity |
boolean | No | Enable or disable stock tracking |
unit_quantity |
number | No | Available stock quantity |
weight_unit |
string | No | Weight unit. Allowed values: gm, kg |
unit_weight |
number | No | Product weight |
length |
number | No | Product length |
width |
number | No | Product width |
height |
number | No | Product height |
images |
array | No | Product images. See Images below. |
tax_id |
integer | No | Tax ID from your store |
min_quantity |
number | No | Minimum order quantity |
max_quantity |
number | No | Maximum order quantity |
low_stock_alert |
integer | No | Low stock alert threshold. Cleared when track_quantity is false. |
categories |
array | No | Array of category IDs. Replaces existing categories. |
is_active |
boolean | No | Enable or disable the product |
aliases_list |
array | No | Search aliases. Replaces existing aliases. |
* Either id or erp_id is required for each product. If both are sent, erp_id is used for lookup.
Product Lookup
| Lookup type | When to use | How it works |
|---|---|---|
id |
Normal Zepio stores | Finds product by internal product ID |
erp_id |
ERP / enterprise sync | Finds product by erp_id + branch_id |
Example Requests
Update by ERP ID
curl -X POST "https://yourwebsite.com/api/developer/v1/products/bulk-update" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{
"branch_id": 1,
"products": [
{
"erp_id": "123456",
"name": "Organic Almonds 500g",
"original_price": 120,
"selling_price": 100,
"track_quantity": true,
"unit_quantity": 120,
"images": [
"https://placehold.co/600x400/orange/white",
"https://placehold.co/600x400/orange/white"
],
"aliases_list": ["badam", "almonds"]
}
]
}'
Update by Internal Product ID
curl -X POST "https://yourwebsite.com/api/developer/v1/products/bulk-update" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{
"products": [
{
"id": 88,
"selling_price": 199,
"is_active": true
}
]
}'
Update Multiple Products
curl -X POST "https://yourwebsite.com/api/developer/v1/products/bulk-update" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{
"branch_id": 1,
"products": [
{
"erp_id": "123456",
"selling_price": 100,
"unit_quantity": 120
},
{
"erp_id": 6789,
"name": "Fresh Apples",
"is_active": false
}
]
}'
Update Price and Stock Only
curl -X POST "https://yourwebsite.com/api/developer/v1/products/bulk-update" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{
"products": [
{
"id": 88,
"selling_price": 149,
"track_quantity": true,
"unit_quantity": 50,
"low_stock_alert": 5
}
]
}'
Example Responses
Success
{
"success": true,
"message": "2 product(s) queued for processing.",
"data": {
"queued_count": 2,
}
}
Response Fields
| Field | Description |
|---|---|
updated_count |
Number of products successfully updated |
failed_count |
Number of products that failed to update |
failed |
List of failed product updates with error details |
failed[].index |
Position of the failed product in the request array |
failed[].id |
Product ID sent in the request, if any |
failed[].erp_id |
ERP ID sent in the request, if any |
failed[].branch_id |
Branch ID used for that product |
failed[].message |
Short error message |
failed[].errors |
Detailed validation errors, if available |
Images
The images field accepts an array of image URLs or media UUIDs.
Option 1: Image URLs
Send an array of public image URLs. This replaces all existing product images.
"images": [
"https://yourwebsite.com/images/product-1.jpg",
"https://yourwebsite.com/images/product-2.jpg"
]
Option 2: Media Manager UUIDs
Send an array of image objects using UUIDs from your Zepio Media Manager. This attaches existing uploaded images to the product.
"images": [
{ "uuid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890" },
{ "uuid": "b2c3d4e5-f6a7-8901-bcde-f12345678901" }
]
Option 3: UUID with URL
"images": [
{
"uuid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"url": "https://yourwebsite.com/media/product-1.jpg"
}
]
Image Notes
- If all images are UUID-based, existing media manager images are reassigned to the product.
- If image URLs are used, all existing product images are replaced with the new URLs.
- Sending an empty
imagesarray removes all product images. - Image order in the array is preserved as display position.
Categories and Aliases
Categories
categories replaces the product's current categories.
"categories": [12, 18, 25]
Aliases
aliases_list replaces the product's current search aliases.
"aliases_list": ["badam", "almonds", "dry fruit"]
Notes
- The API key must have the Update products ability (
products:update). - Maximum
100products per request. - This endpoint only updates existing products. It does not create new products.
- Each product must include either
idorerp_id. - Each product must include at least one field to update besides
id,erp_id, andbranch_id. - Use
idfor normal Zepio product updates. - Use
erp_idwhen syncing products from an external ERP system. - If both
idanderp_idare sent, lookup useserp_id. - For
erp_idlookup, the product is matched usingerp_id+branch_id. - For
idlookup,branch_idis optional. If provided, the product must belong to that branch. - Partial updates are supported — send only the fields you want to change.
- Updates are processed one product at a time. Some products may succeed while others fail in the same request.
- If at least one product is updated, the response returns
success: truewith details infailed. - If no products are updated, the response returns
success: falsewith HTTP status422.