Item. Номенклатура
Методы для работы с товарной номенклатурой: получение списка товаров вместе со штрихкодами, группами, ценами и изображениями, создание и изменение товаров по одному и пачками, загрузка изображений по ссылкам.
Как получить ключ, как формируются запросы и какие бывают ответы и ошибки — в статье Общие сведения. Здесь описаны только особенности методов раздела item.
Методы
| Метод | Адрес | Что делает |
|---|---|---|
| Получить товары | /api/item | Возвращает один товар или список товаров порциями |
| Создать или изменить товар | /api/item/update | Обновляет товар или создаёт новый |
| Массовое обновление | /api/item/updateAll | Создаёт или обновляет много товаров одним запросом |
| Загрузить изображения | /api/item/importImages | Скачивает изображения товаров по ссылкам |
Где передавать параметры. Ключ apikey и формат format принимаются и в адресной строке, и в теле POST-запроса. Параметры поиска id и external_id и параметры enabled_only и create_if_not_exist в методах item, update и updateAll читаются только из адресной строки (GET). Остальные параметры можно передавать и в адресной строке, и в теле POST. Значения с кириллицей, пробелами и знаками + кодируйте.
Получение товаров
GET https://[компания].myvirtualpos.ru/api/item?apikey=MySecret&limit=500&from_id=0&pricelist=1&images=1
Параметры запроса
| id | Число. Ид товара. Если указан, вернётся только он. Только GET |
| external_id | Строка. Код товара во внешней системе (например, в 1С). Только GET |
| enabled_only | 1 — только активные товары. Любое другое значение, включая 0, выдаёт все товары. Только GET |
| from_id | Число. Вернуть товары с ид больше указанного. Служит для порционной выгрузки |
| limit | Число, не более 10000. Максимальное количество товаров в ответе. Если не указан, в ответ собираются все товары |
| pricelist | Ид прайслиста или internet (прайслист интернет-магазина). К каждому товару добавляются цены из этого прайслиста |
| images | 1 — добавить к каждому товару список файлов изображений |
| manufacturer | 1 — добавить название производителя |
| format | json (по умолчанию) или xml |
Товары сортируются по возрастанию ид.
Выгружайте порциями. Без limit метод собирает в одном ответе всю номенклатуру. При десятках тысяч товаров это долго и может закончиться ошибкой сервера. Выгружайте в цикле: запросите limit=1000&from_id=0, возьмите из ответа last_id и передайте его как from_id в следующем запросе. Выгрузка закончена, когда count в ответе меньше limit (или равен нулю).
Структура ответа
| success | 1 — данные получены |
| type | Тип данных, всегда item |
| flexfields | Гибкие поля товара: соответствие attributeN и названия поля. Пустой список, если гибких полей нет. Значения в товарах приходят только для этих полей |
| last_id | Число. Ид последнего товара в ответе; используйте как from_id в следующем запросе. 0, если товаров нет |
| total | Число. Сколько товаров подходит под фильтр id, external_id, enabled_only, from_id — без учёта limit |
| count | Количество товаров в ответе |
| items | Список товаров. Каждый обёрнут в объект item |
Поля товара
Пустые значения в JSON приходят как null, в XML — как пустой элемент.
| id | Число. Ид товара |
| external_id | Строка. Код товара во внешней системе |
| name | Строка. Название |
| description | Строка. Описание |
| article | Строка. Артикул |
| enabled | Число. 1 — товар активен, 0 — заблокирован |
| type | Строка. Тип: G — товар, M — материальная ценность, K — комплект |
| measurement_type | Строка. Мерность: PIECE — штучный, WEIGHT — весовой, TAP — разливной |
| weight_good_flag | Строка. Y или N: признак весового товара. Устарел, используйте measurement_type |
| sales_weight | Число. Приоритет товара при продаже |
| volume | Строка. Объём |
| vat_percent | Число. Ставка НДС: 0, 10, 12, 18, 20 или -1 (без НДС) |
| not_show_in_shop | Число. 1 — не показывать в интернет-витрине и мобильном приложении |
| html_template_id | Число. Ид шаблона ценника |
| manufacturer_id | Число. Ид производителя |
| group_ids | Строка. Ид товарных групп через запятую |
| group_ext_ids | Строка. Коды товарных групп во внешней системе через запятую |
| barcodes | Строка. Штрихкоды через запятую |
| created_date, last_update_date | Строка. Дата и время создания и последнего изменения, формат гггг-мм-дд чч:мм:сс |
| attribute1 … attribute15 | Строка. Значения гибких полей. Приходят только те, что настроены (см. flexfields в ответе) |
Дополнительные поля, если они запрошены:
| images | (images=1) Строка. Имена файлов изображений через запятую в порядке отображения |
| manufacturer_name | (manufacturer=1) Строка. Название производителя |
| price, sale_price, price_old | (pricelist) Строка. Цена, акционная цена и старая цена из прайслиста. Пусто, если товара нет в прайслисте |
Пример ответа
{
"success": 1,
"type": "item",
"flexfields": { "attribute1": "Цвет" },
"last_id": 8,
"total": 2,
"count": 2,
"items": [
{
"item": {
"id": 8,
"external_id": "SKU-22222",
"name": "Шампунь для волос",
"description": "Увлажняющий шампунь",
"article": "SH-1000",
"enabled": 1,
"sales_weight": 0,
"volume": "1000.0000",
"manufacturer_id": 1,
"type": "G",
"weight_good_flag": "N",
"measurement_type": "PIECE",
"not_show_in_shop": 0,
"html_template_id": null,
"group_ids": "1,2",
"group_ext_ids": "GRP-1,GRP-2",
"barcodes": "4607092441788,9785864153055",
"vat_percent": 20,
"created_date": "2026-07-11 17:34:58",
"last_update_date": "2026-07-11 17:36:36",
"attribute1": "Красный"
}
}
]
}
В примере опущены пустые гибкие поля. Тот же ответ при format=xml (сокращённо):
<?xml version="1.0" encoding="UTF-8"?> <root> <success>1</success> <type>item</type> <flexfields><attribute1>Цвет</attribute1></flexfields> <last_id>8</last_id> <total>2</total> <count>2</count> <items> <item> <id>8</id> <external_id>SKU-22222</external_id> <name>Шампунь для волос</name> <!-- остальные поля товара --> </item> </items> </root>
Примеры запросов
| Задача | Запрос |
|---|---|
| Первые 1000 товаров | /api/item?apikey=MySecret&limit=1000 |
| Следующие 1000 после ид 1500 | /api/item?apikey=MySecret&limit=1000&from_id=1500 |
| Товар по коду из 1С | /api/item?apikey=MySecret&external_id=SKU-22222 |
| Активные товары с ценами и производителем | /api/item?apikey=MySecret&limit=1000&enabled_only=1&pricelist=1&manufacturer=1 |
| Цены интернет-магазина | /api/item?apikey=MySecret&limit=1000&pricelist=internet |
| Товары с изображениями | /api/item?apikey=MySecret&limit=500&images=1 |
Создание и изменение товара
POST https://[компания].myvirtualpos.ru/api/item/update?apikey=MySecret&external_id=SKU-22222&create_if_not_exist=1 name=Шампунь&type=G&vat_percent=20&barcodes=4607092441788,9785864153055
Товар ищется по id, а если он не указан — по external_id. Если товар не найден, а передан create_if_not_exist=1, создаётся новый. Изменяются только переданные параметры.
Параметры
| id | Число. Ид изменяемого товара. Только GET |
| external_id | Строка. Код товара во внешней системе. Если id не указан, по нему ищется товар; одновременно это поле товара. Только GET |
| create_if_not_exist | 1 — создать товар, если он не найден. Только GET. Для создания обязательно название name |
| name | Строка. Название. Обязательно при создании |
| description | Строка. Описание |
| article | Строка. Артикул |
| enabled | 1 — активен, 0 — заблокирован |
| type | G — товар, M — материальная ценность, K — комплект |
| measurement_type | PIECE, WEIGHT или TAP. Если не указан, можно передать устаревший weight_good_flag: Y даёт весовой товар, иначе штучный |
| sales_weight | Целое число. Приоритет при продаже |
| volume | Число. Объём |
| vat_percent | Ставка НДС: 0, 10, 12, 18, 20 или -1 |
| not_show_in_shop | 1 — не показывать в интернет-витрине и мобильном приложении, 0 — показывать |
| html_template_id | Число. Ид шаблона ценника; шаблон должен существовать |
| category_id | Число. Ид товарной категории |
| ext_category_id | Строка. Код категории во внешней системе; если категория найдена, заменяет category_id |
| manufacturer_id | Число. Ид производителя |
| manufacturer_name | Строка. Название производителя; используется, если не указан manufacturer_id. Если производителя с таким названием нет, он создаётся |
| group_ids | Строка. Ид товарных групп через запятую. Заменяет текущий набор групп товара |
| group_ext_ids | Строка. Коды товарных групп во внешней системе через запятую. Заменяет текущий набор групп |
| barcodes | Строка. Штрихкоды через запятую. Заменяет текущий набор штрихкодов товара |
| picture_url | Строка. Ссылка http или https на изображение jpg, png, gif или webp. Файл скачивается и становится изображением товара |
| attribute1 … attribute15 | Значения гибких полей товара |
Наборы групп и штрихкодов заменяются, а не дополняются. Если передан barcodes, штрихкоды, которых нет в списке, у товара удаляются. Так же работают group_ids и group_ext_ids. Если ни одной группы с указанными ид или кодами не существует, товар останется вообще без групп, а ошибки не будет. Чтобы не потерять данные, не передавайте эти параметры, если менять их не нужно.
Штрихкоды. Штрихкод, не прошедший проверку (например, неверной длины), не сохраняется и попадает в barcode_errors. Если в системе включена проверка уникальности штрихкодов, штрихкод, уже назначенный другому товару, попадает в barcode_conflicts.
Ответ
{"success":1,"id":"38331","isnew":"1","barcode_errors":"","barcode_conflicts":""}
| success | 1 — товар сохранён |
| id | Ид товара. При создании приходит строкой, при изменении — числом |
| isnew | «1» — товар создан, «0» — изменён существующий |
| barcode_errors | Строка. Штрихкоды через запятую, не прошедшие проверку |
| barcode_conflicts | Строка. Штрихкоды через запятую, которые уже принадлежат другим товарам |
Массовое обновление
POST https://[компания].myvirtualpos.ru/api/item/updateAll?apikey=MySecret&create_if_not_exist=1
data=[{"external_id":"SKU-1","name":"Товар 1","article":"A1"},{"id":"1941","description":"Описание"}]
Параметр data — JSON-массив товаров. В каждом элементе укажите id или external_id и поля, которые нужно изменить, — те же, что и в методе update. Все товары обрабатываются независимо: ошибка в одном не отменяет остальные. Параметр create_if_not_exist (только GET) действует на все товары запроса.
| success | 1 — запрос обработан (даже если часть товаров не сохранена) |
| success_count | Количество сохранённых товаров |
| fails_count | Количество товаров с ошибками |
| problem_ids | Товары, найденные по id, которые не удалось сохранить: объект problem_item с ид и текстом ошибки |
| problem_external_ids | То же для товаров, найденных по external_id: объект problem_item с полями id (код) и info (текст ошибки) |
{
"success": 1,
"success_count": 2,
"fails_count": 2,
"problem_ids": [ { "problem_item": { "id": "999999", "0": "Record not found" } } ],
"problem_external_ids": [ { "problem_item": { "id": "NOPE", "info": "Record not found" } } ]
}
В problem_ids текст ошибки приходит под ключом 0, а не info. Чтобы сверять результаты по всем ошибкам, ориентируйтесь на fails_count.
Загрузка изображений
POST https://[компания].myvirtualpos.ru/api/item/importImages?apikey=MySecret
items=[{"id":1940,"urls":["https://example.com/a.jpg","https://example.com/b.jpg"]}]&rewrite_all=1
| items | JSON-массив объектов вида {id, urls}: id — ид товара, urls — ссылки на изображения. Не должен быть пустым |
| rewrite_all | 1 — перезаписать существующие изображения товара загружаемыми |
Ответ: {«success»:1}. При ошибке — success равный 0 и текст в поле info.
Ошибки
Ошибка авторизации и общие ошибки описаны в статье Общие сведения. Ошибки приходят с кодом HTTP 200 и success равным 0:
| Сообщение | Метод | Причина | Что делать |
|---|---|---|---|
| You have to specify [id] or [external_id] to update record. Or set [create_if_not_exist] to true to add new record | update | Нет id, external_id и create_if_not_exist | Передайте идентификатор товара или create_if_not_exist=1 |
| Record not found | update | Товар не найден, а create_if_not_exist не указан | Проверьте идентификатор или передайте create_if_not_exist=1 |
| Data validation failed. … | update | Данные не прошли проверку; далее перечень полей и причин: не заполнено название, неверный type, measurement_type, vat_percent, нецелый sales_weight | Исправьте указанные поля |
| Cannot save data. … | update | Ошибка сохранения; например, html_template_id ссылается на несуществующий шаблон | Проверьте ссылки на связанные записи |
| You have to specify 'data' as post parameter in JSON format … | updateAll | Не передан data | Передайте JSON-массив в data |
| Параметр items должен быть непустым JSON-массивом объектов [{id, urls}] | importImages | items пуст или не JSON | Передайте корректный JSON |
| Каждый элемент items должен содержать целочисленный id и непустой массив urls | importImages | Элемент без id или urls | Проверьте элементы |
| Не удалось скачать файл: … | importImages | Ссылка недоступна | Проверьте адрес |
Если по условиям ничего не найдено, метод получения возвращает успешный ответ с count равным 0 и пустым списком items.