For AI agents: markdown of this page — /docs-content-en/entities/catalog-products/update.md documentation index — /llms.txt

Update catalog 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 Required Description
Parameterid (path) Typenumber Requiredyes DescriptionProduct identifier. List: GET /v1/catalog-products

Request fields (body)

Field Type Required Description
Fieldname Typestring Requiredno DescriptionProduct name
Fieldactive Typeboolean Requiredno DescriptionWhether the product is active
FieldiblockSectionId Typenumber Requiredno DescriptionCatalog section ID. List: GET /v1/catalog-sections
Fieldmeasure Typenumber Requiredno DescriptionUnit of measure ID. List: GET /v1/catalog-measures
Fieldweight Typenumber Requiredno DescriptionWeight of a product unit
FieldvatIncluded Typeboolean Requiredno DescriptionVAT included in the price
FieldcanBuyZero Typeboolean Requiredno DescriptionAllow purchase when stock is zero
FieldquantityTrace Typeboolean Requiredno DescriptionEnable quantity tracking
Fieldsubscribe Typeboolean Requiredno DescriptionAllow subscription to the product
FieldbarcodeMulti Typeboolean Requiredno DescriptionSeparate barcodes for product units
FieldwithoutOrder Typeboolean Requiredno DescriptionAvailable for ordering without stock on hand
FieldpurchasingPrice Typenumber Requiredno DescriptionPurchase price. Not applied when inventory management is enabled
FieldpurchasingCurrency Typestring Requiredno DescriptionPurchase price currency. Not applied when inventory management is enabled
Fieldquantity Typenumber Requiredno DescriptionStock balance. Not applied when inventory management is enabled
Fieldcode Typestring Requiredno DescriptionProduct symbolic code
FieldxmlId Typestring Requiredno DescriptionExternal code
Fieldsort Typenumber Requiredno DescriptionSort index
FieldvatId Typenumber Requiredno DescriptionVAT rate ID. List: GET /v1/catalog-vat-rates
Fieldheight Typenumber Requiredno DescriptionHeight
Fieldlength Typenumber Requiredno DescriptionLength
Fieldwidth Typenumber Requiredno DescriptionWidth
FielddateActiveFrom Typedatetime Requiredno DescriptionActivity start
FielddateActiveTo Typedatetime Requiredno DescriptionActivity end
FieldpreviewText Typestring Requiredno DescriptionPreview description
FielddetailText Typestring Requiredno DescriptionDetailed description
FieldpreviewTextType Typestring Requiredno DescriptionPreview description type: text or html
FielddetailTextType Typestring Requiredno DescriptionDetailed description type: text or html
FieldpreviewPicture Typeobject Requiredno DescriptionPreview image: { "fileData": ["name.png", "<base64>"] } or { "remove": "Y" }
FielddetailPicture Typeobject Requiredno DescriptionDetailed image (same format)
FieldiblockSection Typeobject Requiredno DescriptionArray of all sections the product is linked to
FieldpropertyNNN Typeobject/array Requiredno DescriptionProduct 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 — 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) is rejected 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 used for filtering or sorting (the request is rejected with an explicit UNKNOWN_FILTER_FIELD/UNKNOWN_SORT_FIELD error); 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 writing them returns READONLY_FIELD. 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 remained in its original catalog). The audit fields createdBy and modifiedBy are filled by the system, and writing them also returns READONLY_FIELD.

Examples

curl — personal key

Terminal
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

Terminal
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

javascript
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

javascript
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
Fieldsuccess Typeboolean DescriptionAlways true on success
Fielddata Typeobject DescriptionFull object of the updated product. The field set is the same as GET /v1/catalog-products/:id

Response example

The main fields are shown.

JSON
{
  "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

404 — no product with the specified id exists:

JSON
{
  "success": false,
  "error": {
    "code": "ENTITY_NOT_FOUND",
    "message": "product does not exist."
  }
}

Errors

HTTP Code Description
HTTP404 CodeENTITY_NOT_FOUND DescriptionNo product with the specified id exists. Message: product does not exist.
HTTP400 CodeEMPTY_UPDATE_BODY DescriptionThe request body is empty — pass at least one field
HTTP400 CodeNO_RECOGNIZED_UPDATE_FIELDS DescriptionThe body carries no recognized writable field (only typos / junk)
HTTP400 CodeREADONLY_FIELD DescriptionA read-only field was passed in the body, for example id, available, or bundle
HTTP403 CodeSCOPE_DENIED DescriptionThe key lacks the catalog scope
HTTP401 CodeMISSING_API_KEY DescriptionThe X-Api-Key header was not passed

Full list of common API errors — Errors.

Known specifics

A catalog property is passed as an object. A PATCH with a scalar property value — "property301": "A-200" — returns 200 but does not write the value: a string property is cleared, and a checkbox keeps its previous value. Pass { "value": … } — this changes both a string and a "Y"/"N" checkbox. When you create a product, a property also accepts a plain value.

See also