Товары и запчасти
Все операции. Авторизация. Запросы и повторы.
Все пути в этом файле дополняют /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"