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