productID, or upload a CSV file with multipart form-data for spreadsheet-based operational updates.Authorization header. Example: Bearer XXXXXX.store.communityID.401 or 403.application/json: raw array of product update objects. Do not wrap the array in an object such as products.multipart/form-data: CSV upload using the file field.text/csv, application/csv, or application/vnd.ms-excel.productID.userInformation, expiringVoucherHighlight, or productPermission, send the complete nested shape for that field.categoryName, productPermission, and purchaseStatusOverrideName use readable names resolved inside the API-key community.vouchers appends new voucher codes; it does not replace existing voucher codes.voucherExpireDate is required when vouchers contains voucher codes.409.file field, invalid CSV rows, invalid DTO fields, and product count limit violations.Product ID start a product update.Product ID append permission entries to the previous product update.Name, Price, Category Name, Vouchers, or Voucher Expire Date.Product ID, Name, Description, Image, Price, Category Name, Discount Enabled, Discount Price, Discount Start Date, Discount End Date, User Information Enabled, Collect Name, Collect Phone, Collect Address, Prioritize Expiring Vouchers, Display Remaining Quantity, Expiring Highlight Enabled, Expiring Highlight Duration, Expiring Highlight Timeframe, Archived, Redemption Instructions, Product Access Enabled, Purchase Status Override Name, Vouchers, Voucher Expire Date, Permission Enabled, Permission Type, Roles, Tags, Users, Combination Type, Combination Values, Special Price, Special Price Enabled, Purchase Limit Enabled, Purchase Limit Quantity, Purchase Limit Interval Count, Purchase Limit Interval Unit, Access Level, and Exclusive Tag Enabled.vouchers is not empty.PRODUCT_EVENTS.UPDATE_PRODUCTS through the partner publisher path.GET /products lists products.POST /products creates one product.POST /products/bulk creates products in bulk.GET /products/{productID} reads one product.PUT /products/{productID} updates one product.DELETE /products/{productID} deletes one product.curl --location --request PUT 'https://adss-integration.returning.ai/apis/products/bulk' \
--header 'Authorization: Bearer XXXXXX' \
--header 'Content-Type: application/json' \
--data '[
{
"productID": "507f1f77bcf86cd799439011",
"name": "Premium Voucher",
"price": 120,
"vouchers": [
"VOUCHER-003"
],
"voucherExpireDate": "2026-12-31T00:00:00.000Z"
}
]'{
"meta": {
"status": "success",
"statusCode": 200,
"updated": 1
},
"message": "Update products success.",
"data": [
{
"_id": "507f1f77bcf86cd799439011",
"communityID": "6502c9e514a3e564c5c09c0a",
"name": "Premium Voucher",
"description": "<p>Updated premium access reward.</p>",
"image": "https://example.com/product.png",
"price": 120,
"category": "Premium Rewards",
"stocks": 3,
"discountPrice": 100,
"isDiscountEnabled": false,
"discountStartDate": null,
"discountEndDate": null,
"userInformation": {
"isEnabled": false,
"shouldCollectName": false,
"shouldCollectPhone": false,
"shouldCollectAddress": false
},
"shouldPrioritiesExpiringVouchers": false,
"shouldDisplayRemainingQuantity": true,
"expiringVoucherHighlight": {
"isEnabled": false,
"duration": 7,
"timeframe": "days"
},
"isArchived": false,
"totalOrders": 0,
"redemptionInstructions": "<p>Show this voucher at checkout.</p>",
"productPermission": [
{
"isEnabled": true,
"type": "role",
"permission": {
"roleNames": [
"VIP Member"
],
"tagNames": [
"Early Access"
],
"usernames": [
"alex"
],
"combination": [
{
"type": "role",
"values": [
"VIP Member"
]
}
]
},
"purchaseAccess": {
"specialPrice": 80,
"isSpecialPriceEnabled": false
},
"purchaseLimit": {
"isPurchaseLimitEnabled": false,
"quantity": 1,
"intervalCount": 1,
"intervalUnit": "months"
},
"accessLevel": "full-access",
"isExclusiveTagEnabled": false
}
],
"isProductAccessEnabled": false,
"purchaseStatusOverride": {
"isEnabled": false,
"status": null
},
"createdAt": "2026-06-09T00:00:00.000Z",
"updatedAt": "2026-06-11T00:00:00.000Z"
}
]
}