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

Update an offer

PATCH /v1/catalog-offers/:id

Updates an existing product offer. Fields are passed flat at the JSON root. Pass only the ones you change — the rest keep their current values.

Parameters

Parameter Type Required Description
Parameterid (path) Typenumber Requiredyes DescriptionOffer identifier. List: GET /v1/catalog-offers

Request fields (body)

The main updatable fields are name, active, purchasingPrice, and quantity.

Field Type Required Description
Fieldname Typestring Requiredno DescriptionOffer name
Fieldactive Typeboolean Requiredno DescriptionWhether the offer 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 one 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
FieldpurchasingCurrency Typestring Requiredno DescriptionPurchase price currency. List: GET /v1/currencies
Fieldquantity Typenumber Requiredno DescriptionStock on hand
FieldquantityReserved Typenumber Requiredno DescriptionReserved quantity
Fieldcode Typestring Requiredno DescriptionSymbolic code
FieldxmlId Typestring Requiredno DescriptionExternal code
Fieldsort Typenumber Requiredno DescriptionSort order
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 text
FielddetailText Typestring Requiredno DescriptionDetailed description
FieldpreviewTextType Typestring Requiredno DescriptionPreview text format: text or html
FielddetailTextType Typestring Requiredno DescriptionDetailed description format: text or html
FieldpreviewPicture Typeobject Requiredno DescriptionPreview image
FielddetailPicture Typeobject Requiredno DescriptionDetailed image
FieldiblockSection Typeobject Requiredno DescriptionArray of IDs of the catalog sections the offer belongs to. List: GET /v1/catalog-sections
FieldrecurSchemeLength Typenumber Requiredno DescriptionPayment period length. Only for on-premise Bitrix24 when selling content
FieldrecurSchemeType Typestring Requiredno DescriptionPayment period unit: H, D, W, M, Q, S, Y. Only for on-premise Bitrix24 when selling content
FieldtrialPriceId Typenumber Requiredno DescriptionID of the trial payment product. Only for on-premise Bitrix24 when selling content
FieldpropertyNNN Typeobject/array Requiredno DescriptionCatalog property value as an object { "value": … }, where NNN is the property ID. Catalog properties are listed in GET /v1/catalog-offers/fields?iblockId=<id>

The body must contain at least one writable field. An empty PATCH is rejected with 400 EMPTY_UPDATE_BODY, and a body with only unknown field names is rejected with 400 NO_RECOGNIZED_UPDATE_FIELDS.

The parentId, iblockId and type fields are not accepted on update: the link to the parent product and the catalog are set at creation, and Bitrix24 computes the type. Fields with readonly: true in Offer fields, for example available, are filled by the system. A body with any of these fields is rejected with 400 READONLY_FIELD.

Examples

curl — personal key

Terminal
curl -X PATCH "https://vibecode.bitrix24.com/v1/catalog-offers/7191" \
  -H "X-Api-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "purchasingPrice": 470
  }'

curl — OAuth application

Terminal
curl -X PATCH "https://vibecode.bitrix24.com/v1/catalog-offers/7191" \
  -H "X-Api-Key: YOUR_APP_KEY" \
  -H "Authorization: Bearer USER_SESSION_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "purchasingPrice": 470
  }'

JavaScript — personal key

javascript
const res = await fetch('https://vibecode.bitrix24.com/v1/catalog-offers/7191', {
  method: 'PATCH',
  headers: {
    'X-Api-Key': 'YOUR_API_KEY',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    purchasingPrice: 470,
  }),
})

const { success, data } = await res.json()
console.log('Purchase price:', data.purchasingPrice)

JavaScript — OAuth application

javascript
const res = await fetch('https://vibecode.bitrix24.com/v1/catalog-offers/7191', {
  method: 'PATCH',
  headers: {
    'X-Api-Key': 'YOUR_APP_KEY',
    'Authorization': 'Bearer USER_SESSION_TOKEN',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    purchasingPrice: 470,
  }),
})

const { success, data } = await res.json()

Response fields

Field Type Description
Fieldsuccess Typeboolean DescriptionAlways true on success
Fielddata Typeobject DescriptionFull object of the updated offer. The field set is the same as in GET /v1/catalog-offers/:id

Response example

The main fields are shown.

JSON
{
  "success": true,
  "data": {
    "id": 7191,
    "iblockId": 27,
    "name": "Basic T-shirt, size M",
    "parentId": { "value": "7189", "valueId": "3895" },
    "type": 4,
    "active": true,
    "available": true,
    "measure": 9,
    "purchasingPrice": 470,
    "purchasingCurrency": "USD",
    "quantity": null,
    "dateCreate": "2026-10-08T18:41:55.000Z",
    "timestampX": "2026-10-08T18:41:59.000Z"
  }
}

Error response example

404 — no offer with the specified id exists:

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

Errors

HTTP Code Description
HTTP404 CodeENTITY_NOT_FOUND DescriptionNo record with the specified id exists (offer does not exist.)
HTTP422 CodeBITRIX_ERROR DescriptionThe id belongs to a regular product, not an offer (productType is not allowed for this catalog)
HTTP400 CodeEMPTY_UPDATE_BODY DescriptionThe request body is empty — pass at least one field
HTTP400 CodeNO_RECOGNIZED_UPDATE_FIELDS DescriptionThe body has no recognized writable field. The message lists the allowed ones
HTTP400 CodeREADONLY_FIELD DescriptionThe body contains a field that is not accepted on update: parentId, iblockId, type or a read-only field, for example available
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 — "property891": "B-200" — returns 200 but clears the value instead of writing it. String and list properties behave this way. Pass { "value": … }, and for a list property pass the option ID as a string: { "value": "1601" }. Option IDs are returned by GET /v1/catalog-product-property-enums with filter[propertyId]. When you create an offer, a property also accepts a plain value.

An offer cannot be moved to another parent product. parentId is set only at creation. To link the offer to another parent product, recreate it with the required parentId and delete the old one.

See also