Для AI-агентов: markdown этой страницы — /docs-content/entities/catalog-offers.md индекс документации — /llms.txt

Вариации товара

Вариации товара каталога: список, получение, создание, изменение и удаление. Вариация описывает конкретный вариант головного товара — например, размер футболки — и хранится в отдельном каталоге вариаций. Головной товар создаётся в Головных товарах (SKU), цены продажи вариации задаются в Ценах каталога.

Битрикс24 API: catalog.product.offer.* Скоуп: catalog

Создать вариацию

POST /v1/catalog-offers

Создаёт вариацию товара в каталоге вариаций и привязывает её к головному товару. Поля передаются плоско в корне JSON.

Поля запроса (body)

Поле Тип Обяз. Описание
name string да Название вариации
iblockId number да ID каталога вариаций — каталога, у которого заполнен productIblockId. Список: GET /v1/catalogs
parentId object нет Связь с головным товаром: { "value": "<ID>" }, ID — строкой. Список: GET /v1/catalog-skus. Без поля создаётся свободная вариация с type: 5
active boolean нет Активна ли вариация. По умолчанию true
iblockSectionId number нет ID раздела каталога. Список: GET /v1/catalog-sections
measure number нет ID единицы измерения. Список: GET /v1/catalog-measures
weight number нет Вес единицы товара
vatIncluded boolean нет НДС включён в цену
canBuyZero boolean нет Разрешить покупку при нулевом остатке
quantityTrace boolean нет Включить учёт количества
subscribe boolean нет Разрешить подписку на товар
barcodeMulti boolean нет Отдельные штрихкоды для единиц товара
withoutOrder boolean нет Доступна к заказу без наличия на складе
purchasingPrice number нет Закупочная цена
purchasingCurrency string нет Валюта закупочной цены. Список: GET /v1/currencies
quantity number нет Остаток на складе

Символьный код, габариты, тексты, картинки и свойства каталога propertyNNN перечислены в Полях вариации. Цена продажи задаётся отдельно — в POST /v1/catalog-prices с id вариации в productId.

Примеры

curl — личный ключ

Terminal
curl -X POST "https://vibecode.bitrix24.tech/v1/catalog-offers" \
  -H "X-Api-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Футболка базовая, размер M",
    "iblockId": 27,
    "parentId": { "value": "7189" },
    "measure": 9,
    "purchasingPrice": 450,
    "purchasingCurrency": "RUB"
  }'

curl — OAuth-приложение

Terminal
curl -X POST "https://vibecode.bitrix24.tech/v1/catalog-offers" \
  -H "X-Api-Key: YOUR_APP_KEY" \
  -H "Authorization: Bearer USER_SESSION_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Футболка базовая, размер M",
    "iblockId": 27,
    "parentId": { "value": "7189" },
    "measure": 9,
    "purchasingPrice": 450,
    "purchasingCurrency": "RUB"
  }'

JavaScript — личный ключ

javascript
const res = await fetch('https://vibecode.bitrix24.tech/v1/catalog-offers', {
  method: 'POST',
  headers: {
    'X-Api-Key': 'YOUR_API_KEY',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    name: 'Футболка базовая, размер M',
    iblockId: 27,
    parentId: { value: '7189' },
    measure: 9,
    purchasingPrice: 450,
    purchasingCurrency: 'RUB',
  }),
})

const { success, data } = await res.json()
console.log('ID вариации:', data.id)

JavaScript — OAuth-приложение

javascript
const res = await fetch('https://vibecode.bitrix24.tech/v1/catalog-offers', {
  method: 'POST',
  headers: {
    'X-Api-Key': 'YOUR_APP_KEY',
    'Authorization': 'Bearer USER_SESSION_TOKEN',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    name: 'Футболка базовая, размер M',
    iblockId: 27,
    parentId: { value: '7189' },
    measure: 9,
    purchasingPrice: 450,
    purchasingCurrency: 'RUB',
  }),
})

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

Поля ответа

Поле Тип Описание
success boolean Всегда true при успехе
data object Полный объект созданной вариации. Набор полей — как у GET /v1/catalog-offers/:id

Пример ответа

Показаны основные поля.

JSON
{
  "success": true,
  "data": {
    "id": 7191,
    "iblockId": 27,
    "iblockSectionId": null,
    "name": "Футболка базовая, размер M",
    "parentId": { "value": "7189", "valueId": "3895" },
    "type": 4,
    "active": true,
    "available": true,
    "code": null,
    "xmlId": "7191",
    "measure": 9,
    "purchasingPrice": 450,
    "purchasingCurrency": "RUB",
    "quantity": null,
    "quantityTrace": true,
    "canBuyZero": true,
    "vatIncluded": false,
    "createdBy": 1295,
    "dateCreate": "2026-10-08T18:41:55.000Z",
    "timestampX": "2026-10-08T18:41:55.000Z"
  }
}

Пример ответа при ошибке

400 — не передано обязательное поле:

JSON
{
  "success": false,
  "error": {
    "code": "MISSING_REQUIRED_FIELDS",
    "message": "Body field \"name\" is required to create catalogOffer."
  }
}

Ошибки

HTTP Код Описание
400 MISSING_REQUIRED_FIELDS Не передано обязательное поле — сообщение называет его. Пустое тело отклоняется сообщением про iblockId
400 READONLY_FIELD В теле передано поле только для чтения, например available
422 BITRIX_ERROR Головного товара с ID из parentId нет (Parent product not found.)
422 BITRIX_ERROR В iblockId передан ID товарного каталога, а не каталога вариаций (productType is not allowed for this catalog)
422 BITRIX_ERROR Каталога с указанным iblockId нет (iblock is not catalog)
403 SCOPE_DENIED Ключу не хватает скоупа catalog
401 MISSING_API_KEY Не передан заголовок X-Api-Key

Полный список общих ошибок API — Ошибки.

Смотрите также