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

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
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.

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

422 — no product with the specified id exists:

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

See also