For AI agents: markdown of this page — /docs-content-en/entities/catalog-products/update.md documentation index — /llms.txt
Update a product
PATCH /v1/catalog-products/:id
Updates an existing product. Fields are passed flat at the root of the JSON. Pass only the fields you want to change — the rest keep their current values. The response returns the full object of the updated product.
Parameters
| Parameter | Type | Req. | Description |
|---|---|---|---|
id (path) |
number | yes | Product identifier |
Request fields (body)
| Field | Type | Req. | Description |
|---|---|---|---|
name |
string | no | Product name |
active |
boolean | no | Whether the product is active |
iblockSectionId |
number | no | Catalog section ID. List: GET /v1/catalog-sections |
measure |
number | no | Unit of measure ID |
weight |
number | no | Weight of a product unit |
vatIncluded |
boolean | no | VAT included in the price |
canBuyZero |
boolean | no | Allow purchase when stock is zero |
quantityTrace |
boolean | no | Enable quantity tracking |
subscribe |
boolean | no | Allow subscription to the product |
barcodeMulti |
boolean | no | Separate barcodes for product units |
withoutOrder |
boolean | no | Available for ordering without stock on hand |
purchasingPrice |
number | no | Purchase price. Not applied when warehouse management is enabled |
purchasingCurrency |
string | no | Purchase price currency. Not applied when warehouse management is enabled |
quantity |
number | no | Stock balance. Not applied when warehouse management is enabled |
code |
string | no | Product symbolic code |
xmlId |
string | no | External code |
sort |
number | no | Sort index |
vatId |
number | no | VAT rate ID |
height |
number | no | Height |
length |
number | no | Length |
width |
number | no | Width |
dateActiveFrom |
datetime | no | Activity start |
dateActiveTo |
datetime | no | Activity end |
previewText |
string | no | Preview description |
detailText |
string | no | Detailed description |
previewTextType |
string | no | Preview description type: text or html |
detailTextType |
string | no | Detailed description type: text or html |
previewPicture |
object | no | Preview image: { "fileData": ["name.png", "<base64>"] } or { "remove": "Y" } |
detailPicture |
object | no | Detailed image (same format) |
iblockSection |
object | no | Array of all sections the product is linked to |
propertyNNN |
object/array | no | Product property value, where NNN is the property ID: { "valueId": …, "value": … } (or an array for multiple values) |
Custom product properties are passed as propertyNNN; on-premise fields (recurSchemeType, recurSchemeLength, trialPriceId) are accepted too. Full field list — in GET /v1/catalog-products/fields.
The body must carry at least one writable field. An empty PATCH ({}) is rejected with 400 EMPTY_UPDATE_BODY, and a PATCH that carries no recognized writable field (for example only typos) with 400 NO_RECOGNIZED_UPDATE_FIELDS. Previously such a request returned 200 with the unchanged object, misleading the client. The object fields iblockSection/previewPicture/detailPicture are writable but cannot be filtered or sorted by (the request is rejected with an explicit UNKNOWN_FILTER_FIELD/UNKNOWN_SORT_FIELD); for reliable filtering use the indexable fields (code, xmlId, sort, vatId, dimensions).
id is passed in the path; it cannot be passed in the body — it is read-only. The available and bundle fields are computed by Bitrix24 and respond with READONLY_FIELD on write. iblockId is set on create only: changing the catalog via PATCH is rejected with READONLY_FIELD — Bitrix24 does not move a product between catalogs (previously such a request returned 200 while the product stayed put). The audit fields createdBy and modifiedBy are filled by the system and also respond with READONLY_FIELD on write.
Examples
curl — personal key
curl -X PATCH "https://vibecode.bitrix24.com/v1/catalog-products/541" \
-H "X-Api-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "USB-C cable, 2 m"
}'
curl — OAuth application
curl -X PATCH "https://vibecode.bitrix24.com/v1/catalog-products/541" \
-H "X-Api-Key: YOUR_APP_KEY" \
-H "Authorization: Bearer USER_SESSION_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "USB-C cable, 2 m"
}'
JavaScript — personal key
const res = await fetch('https://vibecode.bitrix24.com/v1/catalog-products/541', {
method: 'PATCH',
headers: {
'X-Api-Key': 'YOUR_API_KEY',
'Content-Type': 'application/json',
},
body: JSON.stringify({
name: 'USB-C cable, 2 m',
}),
})
const { success, data } = await res.json()
console.log('New name:', data.name)
JavaScript — OAuth application
const res = await fetch('https://vibecode.bitrix24.com/v1/catalog-products/541', {
method: 'PATCH',
headers: {
'X-Api-Key': 'YOUR_APP_KEY',
'Authorization': 'Bearer USER_SESSION_TOKEN',
'Content-Type': 'application/json',
},
body: JSON.stringify({
name: 'USB-C cable, 2 m',
}),
})
const { success, data } = await res.json()
Response fields
| Field | Type | Description |
|---|---|---|
success |
boolean | Always true on success |
data |
object | Full object of the updated product. The field set is the same as GET /v1/catalog-products/:id |
Response example
The main fields are shown.
{
"success": true,
"data": {
"id": 541,
"iblockId": 25,
"iblockSectionId": null,
"name": "USB-C cable, 2 m",
"active": true,
"measure": 9,
"available": true,
"bundle": false,
"canBuyZero": true,
"quantityTrace": false,
"subscribe": true,
"vatIncluded": false,
"purchasingPrice": 110,
"purchasingCurrency": "USD",
"quantity": null,
"dateCreate": "2021-08-06T12:59:15.000Z",
"timestampX": "2026-06-15T13:11:33.000Z",
"xmlId": "541"
}
}
Error response example
422 — no product with the specified id exists:
{
"success": false,
"error": {
"code": "BITRIX_ERROR",
"message": "product does not exist."
}
}
Errors
| HTTP | Code | Description |
|---|---|---|
| 422 | BITRIX_ERROR |
No product with the specified id exists (product does not exist.) |
| 400 | EMPTY_UPDATE_BODY |
The request body is empty — pass at least one field |
| 400 | NO_RECOGNIZED_UPDATE_FIELDS |
The body carries no recognized writable field (only typos / junk) |
| 400 | READONLY_FIELD |
A read-only field was passed in the body, for example id, available, or bundle |
| 403 | SCOPE_DENIED |
The key lacks the catalog scope |
| 401 | MISSING_API_KEY |
The X-Api-Key header was not passed |
Full list of common API errors — Errors.