Перейти к содержимому
СервисАпп API
На этой странице

Товары и запчасти

Все операции. Авторизация. Запросы и повторы.

Все пути в этом файле дополняют /api/v1 на домене организации.

Описание и ограничения

Назначение

Создание и ведение номенклатуры с артикулами, ценами, изготовителем, типом, гарантией и признаками учёта.

Доступные возможности и ограничения

Реализованы GET списка/карточки и POST для создания, изменения, архивирования и восстановления. Изменения используют обязательные Idempotency-Key и, кроме создания, If-Resource-Version. Записи об операциях сохраняются вместе с бизнес-записью и событием; повтор заново проверяет текущий доступ. Доступ к API — «Энтерпрайз», «Энтерпрайз Про» или действующий пробный период; «Энтерпрайз Лайт» не включает API.

Требуются products:read и текущее «Товары → Просмотр». Поле purchase_price читается по этому же праву и изменяется с «Товары → Изменение». filter[archived]=true дополнительно требует права удаления товара. external_id читается только для текущего подключения.

data.version — строка Unix-секунд из updated_at. Два изменения в одну секунду могут иметь одинаковую версию. Для проверки изменений используйте правила синхронизации. Карточка также возвращает отдельный ETag своего представления.

Признаки серийного учёта, маркировки и asset_tracking_type можно задать при создании. Изменение режима существующего товара пока возвращает 409 TRACKING_MODE_CHANGE_UNAVAILABLE. Изменение свойств обновляет updated_at товара.

Поля и назначение

Публичное поле Формат и смысл Доступ
id, name id / обязательная строка только чтение / чтение и запись
sku, manufacturer_sku строки/null, артикулы чтение и запись
barcode, barcode_type_id строка и код вида штрихкода чтение и запись
manufacturer_id, product_type_id, category_id связи справочников чтение и запись
sale_price, purchase_price денежные значения; закупочная цена ограничена правом чтение и запись
description, warranty, tax описание, гарантия и налог чтение и запись
discontinued логическое значение чтение и запись
is_serial_tracked, requires_marking, asset_tracking_type признаки учёта чтение и запись
properties список property_id и value чтение и запись
external_id строка подключения чтение и запись

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

Доступ и выборка

products:read/write и «Товары → Просмотр, Изменение, Удаление»; purchase_price использует обычные права товара.

Фильтры: q, sku, barcode, manufacturer_id, product_type_id, category_id, external_id, updated_since, archived.

Правила и связи

  • Артикулы и штрихкоды — строки; сохраняются ведущие нули и внутренние символы.
  • Изменение товарной карточки не создаёт поступление, продажу или списание.
  • Архив сохраняет исторические строки документов и недоступен для новой продажи по умолчанию.
  • Изменение режима серийного/маркированного учёта проверяется по существующим остаткам.
  • Свойства принадлежат типу товара и принимаются по явной схеме.

Операции

Метод Путь Назначение
POST /products Создание
GET /products Список с фильтрами и пагинацией
POST /products/{id}/update Изменение разрешённых полей
POST /products/{id}/archive Архивация
POST /products/{id}/restore Возврат товара из архива
GET /products/{id} Карточка

POST /products

Создание.

Доступ. Разрешения подключения: products:write. Права сотрудника: «Товары → Изменение», «Товары → Просмотр». Дополнительно действуют доступ к записям, мастерским, модулям и условия полей из описания ресурса выше.

Параметры

Имя Где Тип Обязательно null Ограничения
Authorization заголовок строка да нет Bearer <SERVICEAPP_TOKEN>
Idempotency-Key заголовок строка да нет не менее 1 символов; не более 128 символов; Шаблон: ^[A-Za-z0-9._:-]+$

Тело запроса

Content-Type: application/json. Тело обязательно.

Поле Тип Обязательно null Ограничения и смысл
name строка да нет не менее 1 символов; не более 255 символов
sku строка / null нет да не более 255 символов
manufacturer_sku строка / null нет да не более 255 символов
barcode строка / null нет да не более 255 символов
description строка / null нет да не более 10000 символов
warranty строка / null нет да не более 255 символов
manufacturer_id целое число / null нет да ≥ 1
product_type_id целое число / null нет да ≥ 1
category_id целое число / null нет да ≥ 1
barcode_type_id целое число / null нет да Допустимо: 13, null
tax целое число / null нет да ≥ 0; ≤ 100
discontinued логическое значение нет нет —
is_serial_tracked логическое значение нет нет —
requires_marking логическое значение нет нет —
asset_tracking_type строка / null нет да Допустимо: "equipment", "component", "license", "certificate", null
external_id строка / null нет да не более 255 символов
properties массив нет нет не более 100 элементов; Без повторов
properties[] объект да нет Только перечисленные ключи
properties[].property_id целое число да нет ≥ 1
properties[].value строка / null да да не более 255 символов
sale_price объект да нет Только перечисленные ключи
sale_price.amount строка да нет Шаблон: ^(?:0|[1-9][0-9]{0,15})(?:\.[0-9]{1,4})?$; Условие: required_with:sale_price
sale_price.currency строка да нет не менее 3 символов; не более 3 символов; Условие: required_with:sale_price
purchase_price объект / null нет да Только перечисленные ключи
purchase_price.amount строка да нет Шаблон: ^(?:0|[1-9][0-9]{0,15})(?:\.[0-9]{1,4})?$; Условие: required_with:purchase_price
purchase_price.currency строка да нет не менее 3 символов; не более 3 символов; Условие: required_with:purchase_price

Ответы

HTTP Назначение и схема
201 Создано. Полная схема и пример
400 Некорректный запрос. Коды и формат ошибки
401 Требуется действующий Bearer. Коды и формат ошибки
403 Недостаточно допуска. Коды и формат ошибки
404 Не найдено или недоступно. Коды и формат ошибки
409 Конфликт состояния или повтора. Коды и формат ошибки
413 Превышен размер. Коды и формат ошибки
415 Неподдерживаемый Content-Type. Коды и формат ошибки
422 Ошибка входных данных. Коды и формат ошибки
429 Лимит запросов, Retry-After. Коды и формат ошибки
500 Внутренняя ошибка, исход нужно уточнить. Коды и формат ошибки
503 Временно недоступно. Коды и формат ошибки
HTTP Заголовок ответа Тип Описание
201 Location строка

Каждый ответ содержит новый X-Request-Id в заголовке. Общие транспортные отказы и правила повтора действуют также при отказе до контроллера; см. ошибки.

У принятого POST Location и meta.operation_id указывают на журнал операции; ETag отсутствует. При повторе запроса сохраняются исходные data/meta, добавляется Idempotency-Replayed: true. Версии передавайте по назначению, указанному в описании ресурса.

Пример запроса

Запускается из каталога комплекта после настройки переменных в быстром старте. Замените демонстрационные идентификаторы 101 и UUID идентификаторами доступных записей. $RESOURCE_VERSION берётся из GET владельца версии, описанного выше. Для нового действия сохраните новый ключ; для повтора используйте прежний.

curl --silent --show-error --globoff --request POST \
  "$API/products" \
  --header "Authorization: Bearer $SERVICEAPP_TOKEN" \
  --header "Accept: application/json" \
  --header "Idempotency-Key: example:v1-catalog-products-store:001" \
  --header "Content-Type: application/json" \
  --data-binary '@examples/requests/v1.catalog-products.store.json'

GET /products

Список с фильтрами и пагинацией.

Доступ. Разрешения подключения: products:read. Права сотрудника: «Товары → Просмотр». Дополнительно действуют доступ к записям, мастерским, модулям и условия полей из описания ресурса выше.

Параметры

Имя Где Тип Обязательно null Ограничения
Authorization заголовок строка да нет Bearer <SERVICEAPP_TOKEN>
sort параметр запроса строка нет нет Допустимо: "id", "-id", "updated_at,id", "-updated_at,-id"
page[size] параметр запроса целое число нет нет ≥ 1; ≤ 100
page[cursor] параметр запроса строка нет нет не более 8192 символов
filter[q] параметр запроса строка нет нет не более 200 символов
filter[sku] параметр запроса строка нет нет не более 255 символов
filter[barcode] параметр запроса строка нет нет не более 255 символов
filter[manufacturer_id] параметр запроса целое число нет нет ≥ 1
filter[product_type_id] параметр запроса целое число нет нет ≥ 1
filter[category_id] параметр запроса целое число нет нет ≥ 1
filter[external_id] параметр запроса строка нет нет не более 255 символов
filter[updated_since] параметр запроса строка (дата и время) нет нет Шаблон: ^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{1,6})?(?:Z|[+-]\d{2}:\d{2})$
filter[updated_before] параметр запроса строка (дата и время) нет нет Шаблон: ^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{1,6})?(?:Z|[+-]\d{2}:\d{2})$
filter[archived] параметр запроса строка нет нет Допустимо: "true", "false"

Ответы

HTTP Назначение и схема
200 Успех. Полная схема и пример
401 Требуется действующий Bearer. Коды и формат ошибки
403 Недостаточно допуска. Коды и формат ошибки
404 Не найдено или недоступно. Коды и формат ошибки
409 Конфликт состояния или повтора. Коды и формат ошибки
422 Ошибка входных данных. Коды и формат ошибки
429 Лимит запросов, Retry-After. Коды и формат ошибки
503 Временно недоступно. Коды и формат ошибки

Каждый ответ содержит новый X-Request-Id в заголовке. Общие транспортные отказы и правила повтора действуют также при отказе до контроллера; см. ошибки.

Пример запроса

Запускается из каталога комплекта после настройки переменных в быстром старте. Замените демонстрационные идентификаторы 101 и UUID идентификаторами доступных записей. $RESOURCE_VERSION берётся из GET владельца версии, описанного выше. Для нового действия сохраните новый ключ; для повтора используйте прежний.

curl --silent --show-error --globoff \
  "$API/products" \
  --header "Authorization: Bearer $SERVICEAPP_TOKEN" \
  --header "Accept: application/json"

POST /products/{id}/update

Изменение разрешённых полей.

Доступ. Разрешения подключения: products:write. Права сотрудника: «Товары → Изменение», «Товары → Просмотр». Дополнительно действуют доступ к записям, мастерским, модулям и условия полей из описания ресурса выше.

Параметры

Имя Где Тип Обязательно null Ограничения
Authorization заголовок строка да нет Bearer <SERVICEAPP_TOKEN>
id путь строка да нет Шаблон: ^(?:[0-9]+)$
Idempotency-Key заголовок строка да нет не менее 1 символов; не более 128 символов; Шаблон: ^[A-Za-z0-9._:-]+$
If-Resource-Version заголовок строка да нет не менее 1 символов; не более 128 символов; Шаблон: ^[A-Za-z0-9._~-]+$

Тело запроса

Content-Type: application/json. Тело обязательно.

Поле Тип Обязательно null Ограничения и смысл
name строка нет нет не менее 1 символов; не более 255 символов
sku строка / null нет да не более 255 символов
manufacturer_sku строка / null нет да не более 255 символов
barcode строка / null нет да не более 255 символов
description строка / null нет да не более 10000 символов
warranty строка / null нет да не более 255 символов
manufacturer_id целое число / null нет да ≥ 1
product_type_id целое число / null нет да ≥ 1
category_id целое число / null нет да ≥ 1
barcode_type_id целое число / null нет да Допустимо: 13, null
tax целое число / null нет да ≥ 0; ≤ 100
discontinued логическое значение нет нет —
is_serial_tracked логическое значение нет нет —
requires_marking логическое значение нет нет —
asset_tracking_type строка / null нет да Допустимо: "equipment", "component", "license", "certificate", null
external_id строка / null нет да не более 255 символов
properties массив нет нет не более 100 элементов; Без повторов
properties[] объект да нет Только перечисленные ключи
properties[].property_id целое число да нет ≥ 1
properties[].value строка / null да да не более 255 символов
sale_price объект нет нет Только перечисленные ключи
sale_price.amount строка да нет Шаблон: ^(?:0|[1-9][0-9]{0,15})(?:\.[0-9]{1,4})?$; Условие: required_with:sale_price
sale_price.currency строка да нет не менее 3 символов; не более 3 символов; Условие: required_with:sale_price
purchase_price объект / null нет да Только перечисленные ключи
purchase_price.amount строка да нет Шаблон: ^(?:0|[1-9][0-9]{0,15})(?:\.[0-9]{1,4})?$; Условие: required_with:purchase_price
purchase_price.currency строка да нет не менее 3 символов; не более 3 символов; Условие: required_with:purchase_price

Ответы

HTTP Назначение и схема
200 Успех. Полная схема и пример
400 Некорректный запрос. Коды и формат ошибки
401 Требуется действующий Bearer. Коды и формат ошибки
403 Недостаточно допуска. Коды и формат ошибки
404 Не найдено или недоступно. Коды и формат ошибки
409 Конфликт состояния или повтора. Коды и формат ошибки
412 Версия устарела. Коды и формат ошибки
413 Превышен размер. Коды и формат ошибки
415 Неподдерживаемый Content-Type. Коды и формат ошибки
422 Ошибка входных данных. Коды и формат ошибки
428 Нужно предусловие версии. Коды и формат ошибки
429 Лимит запросов, Retry-After. Коды и формат ошибки
500 Внутренняя ошибка, исход нужно уточнить. Коды и формат ошибки
503 Временно недоступно. Коды и формат ошибки
HTTP Заголовок ответа Тип Описание
200 Location строка

Каждый ответ содержит новый X-Request-Id в заголовке. Общие транспортные отказы и правила повтора действуют также при отказе до контроллера; см. ошибки.

У принятого POST Location и meta.operation_id указывают на журнал операции; ETag отсутствует. При повторе запроса сохраняются исходные data/meta, добавляется Idempotency-Replayed: true. Версии передавайте по назначению, указанному в описании ресурса.

Пример запроса

Запускается из каталога комплекта после настройки переменных в быстром старте. Замените демонстрационные идентификаторы 101 и UUID идентификаторами доступных записей. $RESOURCE_VERSION берётся из GET владельца версии, описанного выше. Для нового действия сохраните новый ключ; для повтора используйте прежний.

curl --silent --show-error --globoff --request POST \
  "$API/products/101/update" \
  --header "Authorization: Bearer $SERVICEAPP_TOKEN" \
  --header "Accept: application/json" \
  --header "Idempotency-Key: example:v1-catalog-products-update:001" \
  --header "If-Resource-Version: $RESOURCE_VERSION" \
  --header "Content-Type: application/json" \
  --data-binary '@examples/requests/v1.catalog-products.update.json'

POST /products/{id}/archive

Архивация.

Доступ. Разрешения подключения: products:write. Права сотрудника: «Товары → Изменение». Дополнительно действуют доступ к записям, мастерским, модулям и условия полей из описания ресурса выше.

Параметры

Имя Где Тип Обязательно null Ограничения
Authorization заголовок строка да нет Bearer <SERVICEAPP_TOKEN>
id путь строка да нет Шаблон: ^(?:[0-9]+)$
Idempotency-Key заголовок строка да нет не менее 1 символов; не более 128 символов; Шаблон: ^[A-Za-z0-9._:-]+$
If-Resource-Version заголовок строка да нет не менее 1 символов; не более 128 символов; Шаблон: ^[A-Za-z0-9._~-]+$

Тело запроса

Content-Type: application/json. Тело обязательно.

Тело — пустой JSON-объект {}. Другие ключи не принимаются.

Ответы

HTTP Назначение и схема
200 Успех. Полная схема и пример
400 Некорректный запрос. Коды и формат ошибки
401 Требуется действующий Bearer. Коды и формат ошибки
403 Недостаточно допуска. Коды и формат ошибки
404 Не найдено или недоступно. Коды и формат ошибки
409 Конфликт состояния или повтора. Коды и формат ошибки
412 Версия устарела. Коды и формат ошибки
413 Превышен размер. Коды и формат ошибки
415 Неподдерживаемый Content-Type. Коды и формат ошибки
422 Ошибка входных данных. Коды и формат ошибки
428 Нужно предусловие версии. Коды и формат ошибки
429 Лимит запросов, Retry-After. Коды и формат ошибки
500 Внутренняя ошибка, исход нужно уточнить. Коды и формат ошибки
503 Временно недоступно. Коды и формат ошибки
HTTP Заголовок ответа Тип Описание
200 Location строка

Каждый ответ содержит новый X-Request-Id в заголовке. Общие транспортные отказы и правила повтора действуют также при отказе до контроллера; см. ошибки.

У принятого POST Location и meta.operation_id указывают на журнал операции; ETag отсутствует. При повторе запроса сохраняются исходные data/meta, добавляется Idempotency-Replayed: true. Версии передавайте по назначению, указанному в описании ресурса.

Пример запроса

Запускается из каталога комплекта после настройки переменных в быстром старте. Замените демонстрационные идентификаторы 101 и UUID идентификаторами доступных записей. $RESOURCE_VERSION берётся из GET владельца версии, описанного выше. Для нового действия сохраните новый ключ; для повтора используйте прежний.

curl --silent --show-error --globoff --request POST \
  "$API/products/101/archive" \
  --header "Authorization: Bearer $SERVICEAPP_TOKEN" \
  --header "Accept: application/json" \
  --header "Idempotency-Key: example:v1-catalog-products-archive:001" \
  --header "If-Resource-Version: $RESOURCE_VERSION" \
  --header "Content-Type: application/json" \
  --data-binary '@examples/requests/v1.catalog-products.archive.json'

POST /products/{id}/restore

Возврат товара из архива.

Доступ. Разрешения подключения: products:write. Права сотрудника: «Товары → Изменение». Дополнительно действуют доступ к записям, мастерским, модулям и условия полей из описания ресурса выше.

Параметры

Имя Где Тип Обязательно null Ограничения
Authorization заголовок строка да нет Bearer <SERVICEAPP_TOKEN>
id путь строка да нет Шаблон: ^(?:[0-9]+)$
Idempotency-Key заголовок строка да нет не менее 1 символов; не более 128 символов; Шаблон: ^[A-Za-z0-9._:-]+$
If-Resource-Version заголовок строка да нет не менее 1 символов; не более 128 символов; Шаблон: ^[A-Za-z0-9._~-]+$

Тело запроса

Content-Type: application/json. Тело обязательно.

Тело — пустой JSON-объект {}. Другие ключи не принимаются.

Ответы

HTTP Назначение и схема
200 Успех. Полная схема и пример
400 Некорректный запрос. Коды и формат ошибки
401 Требуется действующий Bearer. Коды и формат ошибки
403 Недостаточно допуска. Коды и формат ошибки
404 Не найдено или недоступно. Коды и формат ошибки
409 Конфликт состояния или повтора. Коды и формат ошибки
412 Версия устарела. Коды и формат ошибки
413 Превышен размер. Коды и формат ошибки
415 Неподдерживаемый Content-Type. Коды и формат ошибки
422 Ошибка входных данных. Коды и формат ошибки
428 Нужно предусловие версии. Коды и формат ошибки
429 Лимит запросов, Retry-After. Коды и формат ошибки
500 Внутренняя ошибка, исход нужно уточнить. Коды и формат ошибки
503 Временно недоступно. Коды и формат ошибки
HTTP Заголовок ответа Тип Описание
200 Location строка

Каждый ответ содержит новый X-Request-Id в заголовке. Общие транспортные отказы и правила повтора действуют также при отказе до контроллера; см. ошибки.

У принятого POST Location и meta.operation_id указывают на журнал операции; ETag отсутствует. При повторе запроса сохраняются исходные data/meta, добавляется Idempotency-Replayed: true. Версии передавайте по назначению, указанному в описании ресурса.

Пример запроса

Запускается из каталога комплекта после настройки переменных в быстром старте. Замените демонстрационные идентификаторы 101 и UUID идентификаторами доступных записей. $RESOURCE_VERSION берётся из GET владельца версии, описанного выше. Для нового действия сохраните новый ключ; для повтора используйте прежний.

curl --silent --show-error --globoff --request POST \
  "$API/products/101/restore" \
  --header "Authorization: Bearer $SERVICEAPP_TOKEN" \
  --header "Accept: application/json" \
  --header "Idempotency-Key: example:v1-catalog-products-restore:001" \
  --header "If-Resource-Version: $RESOURCE_VERSION" \
  --header "Content-Type: application/json" \
  --data-binary '@examples/requests/v1.catalog-products.restore.json'

GET /products/{id}

Карточка.

Доступ. Разрешения подключения: products:read. Права сотрудника: «Товары → Просмотр». Дополнительно действуют доступ к записям, мастерским, модулям и условия полей из описания ресурса выше.

Параметры

Имя Где Тип Обязательно null Ограничения
Authorization заголовок строка да нет Bearer <SERVICEAPP_TOKEN>
id путь строка да нет Шаблон: ^(?:[0-9]+)$
If-None-Match заголовок строка нет нет —
filter[archived] параметр запроса строка нет нет Допустимо: "true", "false"

Ответы

HTTP Назначение и схема
200 Успех. Полная схема и пример
304 Представление не изменилось, без тела. Условный GET
401 Требуется действующий Bearer. Коды и формат ошибки
403 Недостаточно допуска. Коды и формат ошибки
404 Не найдено или недоступно. Коды и формат ошибки
409 Конфликт состояния или повтора. Коды и формат ошибки
422 Ошибка входных данных. Коды и формат ошибки
429 Лимит запросов, Retry-After. Коды и формат ошибки
503 Временно недоступно. Коды и формат ошибки
HTTP Заголовок ответа Тип Описание
200 ETag строка
304 ETag строка

Каждый ответ содержит новый X-Request-Id в заголовке. Общие транспортные отказы и правила повтора действуют также при отказе до контроллера; см. ошибки.

Пример запроса

Запускается из каталога комплекта после настройки переменных в быстром старте. Замените демонстрационные идентификаторы 101 и UUID идентификаторами доступных записей. $RESOURCE_VERSION берётся из GET владельца версии, описанного выше. Для нового действия сохраните новый ключ; для повтора используйте прежний.

curl --silent --show-error --globoff \
  "$API/products/101" \
  --header "Authorization: Bearer $SERVICEAPP_TOKEN" \
  --header "Accept: application/json"