Справочник API

Товары

Каталог отдаётся одним и тем же эндпоинтом покупателю и интеграции — различается только набор полей. По ключу с правами на товары вы получаете служебные поля: физический остаток без вычета резервов, код маркировки, настройки производства и лимиты продаж. С 16.09.2026 товар может быть заведён не только на размерах, но и на системе атрибутов (Размер, Цвет, Принт — в любой комбинации). Ответ дополнен полями attributes[] (какие атрибуты и значения есть у товара) и variants[] (конкретные комбинации значений со своим остатком) — см. термин «Атрибут и вариант». Поле sizes[] и адресация по sizeId остаются рабочими для товаров на легаси-размере; variantId — рекомендуемый способ для новых интеграций.

GET/products

Список товаров

Каталог бренда с размерами, ценами и остатками.

Доступ:Ключ интеграцииСессия сотрудникаБез авторизацииПраво:manage_products или products.view_production — для служебных полей

Набор полей зависит от прав ключа. Без прав на товары ответ будет таким же, каким его видит покупатель: без служебных полей.

Параметры запроса

ПараметрТипОбязателенОписание
categorystring | numberнетЧисло понимается как идентификатор категории, строка — как её точное название.
searchstringнетПоиск по названию и адресному имени.
hasDiscounttrue | falseнетТолько со скидкой либо только без неё.
collectionIdstringнетТовары одной коллекции.
sortBystringнетПорядок. Неизвестное значение молча заменяется порядком по умолчанию.name_asc · name_desc · price_asc · price_desc · newest · oldest
inStocktrue | falseнетРучной флаг наличия. Служебный фильтр — покупателю такого выбора нет.
soldouttrue | falseнетРучная пометка «продано».
isDeletedtrue | falseнетПоказать удалённые товары. Без прав на товары игнорируется.
brandstringнетКод бренда — только если ключ имеет доступ к нескольким брендам.
publictrueнетТо же самое поле, что и у публичного каталога: отсекает скрытые и «только по ссылке» товары. Служебному ключу передавать не обязательно.

Поля ответа

ПолеТипОписание
pricenumberЦена товара.в копейках
discountnumberСкидка: сумма или проценты, смотря что указано в discountType.
sizes[].quantitynumberОстаток размера УЖЕ за вычетом резервов.
sizes[].physicalQuantitynumberСырой остаток на складе. Только со служебными правами.
sizes[].chestnyZnakstring | nullКод маркировки. Только со служебными правами.
sizes[].productionThresholdnumberПорог, ниже которого позиция попадает в очередь производства.
sizes[].productionBatchSizenumberРазмер производственной партии. Ноль означает «не производить».
attributes[].namestringНазвание атрибута (Размер, Цвет, Принт…) — оси выбора для UI-переключателей. Не путать с variants[] ниже: attributes[] отвечает "какие есть параметры и значения", variants[] — "какие конкретно комбинации можно купить и с каким остатком". См. термин «Атрибут и вариант».
attributes[].values[]arrayЗначения атрибута, реально используемые в вариантах этого товара: { id, value }.
variants[].idnumberИдентификатор варианта (конкретной покупаемой комбинации значений attributes[] выше) — используйте как variantId в корзине и заказе.
variants[].availableQuantitynumberОстаток варианта за вычетом резервов.
variants[].attributeValueIdsnumber[]Значения атрибутов, образующие этот вариант.
variants[].attributes[]arrayТо же самое человекочитаемо: { attributeId, attributeName, valueId, value }.
soldoutbooleanРучная пометка «продано».
popularityRankintМесто в рейтинге популярности по числу продаж среди товаров этой выдачи, 1 — самый продаваемый; считается только для списка.
GET/products/{slug}

Карточка товара

Один товар со всеми размерами.

Доступ:Ключ интеграцииСессия сотрудникаБез авторизации

Параметры пути

ПараметрТипОбязателенОписание
slugstringдаАдресное имя товара.
ответ
{
  "id": "123",
  "slug": "futbolka-basic",
  "moySkladId": "abc-123",
  "vitrineArticle": "CSH-001",
  "name": "Футболка Basic",
  "description": "Хлопок 100%",
  "price": 199000,
  "discount": 10,
  "discountType": "percent",
  "images": ["https://cdn.amarix.ru/products/123/1.jpg"],
  "category": { "id": 5, "name": "Футболки", "slug": "futbolki" },
  "sizes": [
    {
      "id": 45,
      "size": "M",
      "quantity": 12,
      "availableQuantity": 12,
      "reservedQuantity": 0,
      "physicalQuantity": 12,
      "chestnyZnak": null,
      "variantId": "v-1",
      "isVisible": true,
      "salesLimitLeft": 5,
      "salesLimit": 50,
      "salesLimitSince": null,
      "salesLimitSold": 0,
      "productionThreshold": 5,
      "productionBatchSize": 10,
      "price": 199000,
      "discount": 10,
      "discountType": "percent"
    }
  ],
  "attributes": [],
  "variants": [],
  "productGroups": [],
  "inStock": true,
  "productionTime": 3,
  "assemblyTime": 1,
  "isDeleted": false,
  "brand": "acme",
  "brandId": 1,
  "material": "Хлопок",
  "care": "Стирка 30°",
  "soldout": false,
  "freeShipping": false,
  "salesLimit": 50,
  "salesLimitReached": false,
  "salesLimitSold": 0,
  "isLinkOnly": false,
  "collectionId": 12,
  "sizeGrid": [],
  "badgeText": "Новинка",
  "badgeColor": "#FF0000",
  "displayOrder": 0,
  "imageMetadata": {},
  "relatedProductIds": []
}

Ошибки

КодОтвет сервераКогда возникаетЧто делать
404{"error":"Товар не найден"}Товара нет или он чужого бренда.—
PUT/products/{id}

Изменить товар

Правка карточки и набора размеров.

Доступ:Ключ интеграцииСессия сотрудникаПраво:manage_products

Если в теле передан ключ sizes, он заменяет набор размеров целиком: размеры, которых нет в списке, будут скрыты. Это не частичное обновление.

Параметры пути

ПараметрТипОбязателенОписание
idnumberдаИдентификатор товара.

Тело запроса

ПараметрТипОбязателенОписание
namestringнетНазвание.
descriptionstringнетОписание.
priceintнетЦена, в копейках.
discountnumberнетСкидка: сумма или проценты — смотря что в discountType.
discountTypestringнетТип скидки.percent · amount
imagesstring[]нетСсылки на изображения, по порядку.
categoryIdintнетКатегория товара.
brandIdintнетБренд — сменить можно только на доступный этому ключу/сессии.
materialstringнетМатериал.
carestringнетУход.
inStockbooleanнетРучной флаг наличия.
soldoutbooleanнетРучная пометка «продано».
freeShippingbooleanнетБесплатная доставка.
isLinkOnlybooleanнетДоступен только по прямой ссылке, вне каталога.
collectionIdintнетКоллекция товара.
salesLimitintнетЛимит продаж товара целиком, если задан.
productionTimeintнетСрок производства, дней.
assemblyTimeintнетСрок сборки, дней.
badgeTextstringнетТекст бейджа на карточке.
badgeColorstringнетЦвет бейджа.
displayOrderintнетПорядок в каталоге.
sizes[].idintнетИдентификатор существующего размера — без него создаётся новый.
sizes[].sizestringдаНазвание размера.
sizes[].quantityintнетФизический остаток размера.
sizes[].chestnyZnakstring | nullнетКод маркировки. Нормализуется до цифр — длина и уникальность не проверяются.
sizes[].isVisiblebooleanнетПоказывать ли размер на витрине.
sizes[].salesLimitint | nullнетЛимит продаж этого размера.
sizes[].productionThresholdintнетПорог, ниже которого размер попадает в очередь производства.
sizes[].productionBatchSizeintнетРазмер производственной партии. Ноль — «не производить».
ответ
{
  "id": "123",
  "slug": "futbolka-basic",
  "moySkladId": "abc-123",
  "vitrineArticle": "CSH-001",
  "name": "Футболка Basic",
  "description": "Хлопок 100%",
  "price": 199000,
  "discount": 10,
  "discountType": "percent",
  "images": ["https://cdn.amarix.ru/products/123/1.jpg"],
  "category": { "id": 5, "name": "Футболки", "slug": "futbolki" },
  "sizes": [
    {
      "id": 45,
      "size": "M",
      "quantity": 12,
      "availableQuantity": 12,
      "reservedQuantity": 0,
      "physicalQuantity": 12,
      "chestnyZnak": null,
      "variantId": "v-1",
      "isVisible": true,
      "salesLimitLeft": 5,
      "salesLimit": 50,
      "salesLimitSince": null,
      "salesLimitSold": 0,
      "productionThreshold": 5,
      "productionBatchSize": 10,
      "price": 199000,
      "discount": 10,
      "discountType": "percent"
    }
  ],
  "attributes": [],
  "variants": [],
  "productGroups": [],
  "inStock": true,
  "productionTime": 3,
  "assemblyTime": 1,
  "isDeleted": false,
  "brand": "acme",
  "brandId": 1,
  "material": "Хлопок",
  "care": "Стирка 30°",
  "soldout": false,
  "freeShipping": false,
  "salesLimit": 50,
  "salesLimitReached": false,
  "salesLimitSold": 0,
  "isLinkOnly": false,
  "collectionId": 12,
  "sizeGrid": [],
  "badgeText": "Новинка",
  "badgeColor": "#FF0000",
  "displayOrder": 0,
  "imageMetadata": {},
  "relatedProductIds": []
}

Ошибки

КодОтвет сервераКогда возникаетЧто делать
403{"error":"Forbidden: Missing permission manage_products"}Нет права на изменение товаров.—
404{"error":"Товар не найден"}Товара нет или он чужого бренда.—
GET/products/brands/:brandId/attributes

Справочник атрибутов бренда

Все атрибуты бренда (Размер, Цвет, Принт…) со своими значениями.

Доступ:Ключ интеграцииСессия сотрудника

Атрибут — параметр товара со своим набором значений; см. термин «Атрибут и вариант» в разделе «Термины и понятия». Значения приходят отсортированными по sortOrder — тому же порядку, что задаёт PUT .../values/reorder.

Параметры пути

ПараметрТипОбязателенОписание
brandIdnumberдаИдентификатор бренда.

Поля ответа

ПолеТипОписание
idnumberИдентификатор атрибута.
brandIdnumberБренд-владелец.
namestringНазвание атрибута, например «Размер» или «Цвет».
sortOrdernumberПорядок среди атрибутов бренда.
values[].idnumberИдентификатор значения.
values[].valuestringСамо значение, например «M» или «Жёлтый».
values[].sortOrdernumberПорядок значения внутри атрибута.
values[].isArchivedbooleanАрхивное значение не предлагается для новых вариантов, но остаётся у уже созданных.

Ошибки

КодОтвет сервераКогда возникаетЧто делать
400{"error":"Некорректный brandId"}brandId не число.—
403{"error":"Forbidden"}Ключ/сессия не имеют доступа к этому бренду.—
POST/products/brands/:brandId/attributes

Создать атрибут

Новый атрибут в справочнике бренда — новый параметр выбора для товаров.

Доступ:Ключ интеграцииСессия сотрудникаПраво:manage_products

Параметры пути

ПараметрТипОбязателенОписание
brandIdnumberдаИдентификатор бренда.

Тело запроса

ПараметрТипОбязателенОписание
namestringдаНазвание атрибута. Уникально в пределах бренда.

Поля ответа

ПолеТипОписание
idnumberИдентификатор нового атрибута.
brandIdnumberБренд-владелец.
namestringНазвание атрибута.
sortOrdernumberСтавится последним среди атрибутов бренда.

Ошибки

КодОтвет сервераКогда возникаетЧто делать
400{"error":"Название атрибута обязательно"}Имя пустое или из одних пробелов.—
403{"error":"Forbidden: Missing permission manage_products"}Нет права на изменение товаров.—
POST/products/attributes/:id/values

Добавить значение атрибута

Новое значение в списке атрибута — например, добавить «XXL» в «Размер».

Доступ:Ключ интеграцииСессия сотрудникаПраво:manage_products

Параметры пути

ПараметрТипОбязателенОписание
idnumberдаИдентификатор атрибута.

Тело запроса

ПараметрТипОбязателенОписание
valuestringдаСамо значение, например «M».

Поля ответа

ПолеТипОписание
idnumberИдентификатор значения.
attributeIdnumberАтрибут-владелец.
valuestringЗначение как передано.
sortOrdernumberДля атрибута «Размер» — по естественному порядку (S < M < L < XL…), для остальных — в конец списка.
isArchivedbooleanВсегда false у нового значения.

Ошибки

КодОтвет сервераКогда возникаетЧто делать
400{"error":"Значение атрибута обязательно"}Значение пустое.—
409{"error":"Значение «S» уже есть в списке","code":"VALUE_EXISTS","existingValueId":42,"existingIsArchived":false}code: VALUE_EXISTSЗначение с таким текстом уже есть у этого атрибута (уникальность по паре атрибут+значение) — в том числе архивное.Проверьте existingIsArchived: если true, значение нужно восстановить (PATCH .../archive с archived:false), а не создавать заново.
PUT/products/attributes/:id/values/reorder

Порядок значений атрибута

Задать порядок значений внутри атрибута — например, S, M, L, XL в нужной последовательности.

Доступ:Ключ интеграцииСессия сотрудникаПраво:manage_products

Параметры пути

ПараметрТипОбязателенОписание
idnumberдаИдентификатор атрибута.

Тело запроса

ПараметрТипОбязателенОписание
valueIdsnumber[]даПОЛНЫЙ список id значений этого атрибута в желаемом порядке — не только изменившиеся.

Поля ответа

ПолеТипОписание
[].sortOrdernumberНовый порядковый номер = позиция id в переданном массиве.

Ошибки

КодОтвет сервераКогда возникаетЧто делать
400{"error":"Список значений пуст"}valueIds пуст или не массив чисел.—
400{"error":"Часть значений не принадлежит этому атрибуту"}В списке есть id значения другого атрибута.—
DELETE/products/attributes/:id

Удалить атрибут

Полностью убрать атрибут из справочника бренда.

Доступ:Ключ интеграцииСессия сотрудникаПраво:manage_products

Параметры пути

ПараметрТипОбязателенОписание
idnumberдаИдентификатор атрибута.

Поля ответа

ПолеТипОписание
okbooleantrue при успехе.

Ошибки

КодОтвет сервераКогда возникаетЧто делать
409{"error":"Атрибут используется в 7 вариантах товаров — сначала уберите его с товаров","code":"ATTRIBUTE_IN_USE"}code: ATTRIBUTE_IN_USEХотя бы одно значение атрибута используется в варианте товара.Сначала удалите/пересоздайте затрагиваемые варианты (DELETE .../variants/:id), либо отвяжите атрибут от товара (DELETE .../products/:id/attributes/:attributeId), затем повторите.
PATCH/products/attribute-values/:id/archive

Архивировать / восстановить значение

Скрыть значение от выбора для новых вариантов, не трогая уже существующие.

Доступ:Ключ интеграцииСессия сотрудникаПраво:manage_products

Архивирование — мягкая альтернатива удалению для значений, которые уже используются: архивное значение не предлагается при создании новых вариантов, но варианты, у которых оно уже есть, продолжают работать как прежде.

Параметры пути

ПараметрТипОбязателенОписание
idnumberдаИдентификатор значения атрибута.

Тело запроса

ПараметрТипОбязателенОписание
archivedbooleanнетпо умолчанию truefalse — восстановить ранее заархивированное значение.

Поля ответа

ПолеТипОписание
isArchivedbooleanИтоговое состояние после запроса.

Ошибки

КодОтвет сервераКогда возникаетЧто делать
404{"error":"Значение не найдено"}id не существует или чужого бренда.—
DELETE/products/attribute-values/:id

Удалить значение атрибута

Физически убрать значение из списка — только если оно нигде не используется.

Доступ:Ключ интеграцииСессия сотрудникаПраво:manage_products

Параметры пути

ПараметрТипОбязателенОписание
idnumberдаИдентификатор значения атрибута.

Поля ответа

ПолеТипОписание
okbooleantrue при успехе.

Ошибки

КодОтвет сервераКогда возникаетЧто делать
409{"error":"Значение используется в 3 вариантах товаров — архивируйте вместо удаления","code":"ATTRIBUTE_VALUE_IN_USE"}code: ATTRIBUTE_VALUE_IN_USEЗначение используется хотя бы в одном варианте товара.Используйте PATCH .../archive вместо удаления.
GET/products/:id/attributes

Атрибуты товара

Какие атрибуты подключены к товару и какие их значения реально используются в вариантах.

Доступ:Ключ интеграцииСессия сотрудникаБез авторизации

Список короче, чем полный справочник бренда: значение атрибута попадает сюда, только если оно реально встречается хотя бы в одном варианте этого товара — заведённые «про запас» значения не показываются.

Параметры пути

ПараметрТипОбязателенОписание
idnumberдаИдентификатор товара.

Поля ответа

ПолеТипОписание
idnumberИдентификатор атрибута.
namestringНазвание атрибута.
requiredbooleanОбязателен ли выбор этого атрибута при заказе (задаётся в момент привязки к товару).
values[]array{ id, value } — только значения, встречающиеся в вариантах этого товара.
POST/products/:id/attributes

Подключить атрибут к товару

Добавить товару ось выбора (например, «Цвет») — до генерации вариантов.

Доступ:Ключ интеграцииСессия сотрудникаПраво:manage_products

Параметры пути

ПараметрТипОбязателенОписание
idnumberдаИдентификатор товара.

Тело запроса

ПараметрТипОбязателенОписание
attributeIdnumberдаАтрибут из справочника бренда.
requiredbooleanнетОбязателен ли выбор значения этого атрибута.

Поля ответа

ПолеТипОписание
idnumberИдентификатор связи.
productIdnumber
attributeIdnumber
requiredboolean
DELETE/products/:id/attributes/:attributeId

Отключить атрибут от товара

Убрать ось выбора у товара.

Доступ:Ключ интеграцииСессия сотрудникаПраво:manage_products

Параметры пути

ПараметрТипОбязателенОписание
idnumberдаИдентификатор товара.
attributeIdnumberдаИдентификатор атрибута.

Поля ответа

ПолеТипОписание
okbooleantrue всегда, даже если связи не было.
GET/products/:id/variants

Варианты товара

Все комбинации значений атрибутов товара со своим остатком.

Доступ:Ключ интеграцииСессия сотрудникаБез авторизации

Параметры пути

ПараметрТипОбязателенОписание
idnumberдаИдентификатор товара.

Поля ответа

ПолеТипОписание
idnumberИдентификатор варианта — используйте как variantId в корзине и заказе.
skustring | nullАртикул варианта, если задан.
quantitynumberСырой остаток склада.штук
reservedQuantitynumberВ резерве по неоплаченным заказам.
availableQuantitynumberquantity минус reservedQuantity — то, что реально можно продать.
salesLimitnumber | nullЛимит продаж, если задан.
salesLimitSoldnumberСколько из лимита уже продано с момента salesLimitSince.
isVisiblebooleanПоказывать ли вариант на витрине.
chestnyZnakstring | nullКод маркировки «Честный знак».
productionThresholdnumber | nullПорог для очереди производства.
productionBatchSizenumber | nullРазмер партии производства.
attributeValues[]arrayЗначения, образующие вариант: { attributeValue: { id, value, attribute: { id, name } } }.
POST/products/:id/variants

Сгенерировать варианты

Создать варианты по готовому набору комбинаций значений атрибутов.

Доступ:Ключ интеграцииСессия сотрудникаПраво:manage_products

Комбинации приходят уже готовыми с клиента — сервер не строит декартово произведение сам, только создаёт то, что прислали, и молча пропускает комбинации, которые у товара уже есть (по набору attributeValueId, без учёта порядка).

Параметры пути

ПараметрТипОбязателенОписание
idnumberдаИдентификатор товара.

Тело запроса

ПараметрТипОбязателенОписание
combinationsnumber[][]даСписок комбинаций; каждая — массив attributeValueId, образующих один вариант. Например [[10,20],[10,21]] — два варианта с общим значением 10 и разными 20/21.

Поля ответа

ПолеТипОписание
[]VariantТолько реально созданные варианты — уже существующие комбинации в ответе не повторяются.

Ошибки

КодОтвет сервераКогда возникаетЧто делать
400{"error":"combinations должен быть непустым массивом"}Тело запроса пустое или не массив.—
POST/products/:id/variants/default

Вариант без атрибутов

Единственный вариант товара, у которого в принципе нет осей выбора (например, для брендов без размерной сетки).

Доступ:Ключ интеграцииСессия сотрудникаПраво:manage_products

Параметры пути

ПараметрТипОбязателенОписание
idnumberдаИдентификатор товара.

Поля ответа

ПолеТипОписание
idnumberИдентификатор варианта — используйте как variantId, даже без атрибутов.
PATCH/products/variants/:id

Изменить вариант

Остаток, видимость, лимит продаж, параметры производства или сама комбинация значений.

Доступ:Ключ интеграцииСессия сотрудникаПраво:manage_products

Параметры пути

ПараметрТипОбязателенОписание
idnumberдаИдентификатор варианта.

Тело запроса

ПараметрТипОбязателенОписание
quantitynumberнетАбсолютный остаток. Если у варианта есть онлайн-склад, запись идёт через складской адаптер (резервы не задваиваются) — не пишите остаток напрямую в обход этого поля.
attributeValueIdsnumber[]нетНовый набор значений — переставляет вариант на другую комбинацию (например, «Размер: S» → «Размер: M») без удаления и пересоздания.
isVisiblebooleanнетПоказывать ли на витрине.
salesLimitnumber | nullнетnull снимает лимит. Установка нового значения сбрасывает счётчик проданного (salesLimitSince = сейчас).
productionThresholdnumberнетПорог для очереди производства.
productionBatchSizenumberнетРазмер партии. 0 — не производить.
chestnyZnakstring | nullнетКод маркировки; нецифровые символы отбрасываются автоматически.

Поля ответа

ПолеТипОписание
variantVariantВариант целиком после применения переданных полей.

Ошибки

КодОтвет сервераКогда возникаетЧто делать
404{"error":"Вариант не найден"}Передан attributeValueIds, но variantId не существует.—
409{"error":"У товара уже есть вариант с такой комбинацией значений"}attributeValueIds совпадает (без учёта порядка) с уже существующим у этого товара вариантом.—
DELETE/products/variants/:id

Удалить вариант

Мягкое удаление варианта — как у легаси-размера, не физическая запись.

Доступ:Ключ интеграцииСессия сотрудникаПраво:manage_products

Параметры пути

ПараметрТипОбязателенОписание
idnumberдаИдентификатор варианта.

Поля ответа

ПолеТипОписание
okbooleantrue при успехе.