[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"docs-entities\u002Fitems":3,"docs-tabs-entities\u002Fitems":6},{"content":4,"lastmod":5},"# Смарт-процессы (Items)\n\nУправление элементами смарт-процессов CRM: создание, получение, обновление, удаление, фильтрация.\n\nБитрикс24 API: `crm.item.*`\nСкоуп: `crm`\n\nПуть содержит динамический параметр `:entityTypeId` — ID типа смарт-процесса. Узнать доступные типы: `GET \u002Fv1\u002Fsmart-processes`.\n\n## Операции\n\n- [Создать элемент](.\u002Fitems\u002Fcreate.md) — `POST \u002Fv1\u002Fitems\u002F:entityTypeId`\n- [Список элементов](.\u002Fitems\u002Flist.md) — `GET \u002Fv1\u002Fitems\u002F:entityTypeId`\n- [Получить элемент](.\u002Fitems\u002Fget.md) — `GET \u002Fv1\u002Fitems\u002F:entityTypeId\u002F:id`\n- [Обновить элемент](.\u002Fitems\u002Fupdate.md) — `PATCH \u002Fv1\u002Fitems\u002F:entityTypeId\u002F:id`\n- [Удалить элемент](.\u002Fitems\u002Fdelete.md) — `DELETE \u002Fv1\u002Fitems\u002F:entityTypeId\u002F:id`\n- [Поиск элементов](.\u002Fitems\u002Fsearch.md) — `POST \u002Fv1\u002Fitems\u002F:entityTypeId\u002Fsearch`\n- [Поля элемента](.\u002Fitems\u002Ffields.md) — `GET \u002Fv1\u002Fitems\u002F:entityTypeId\u002Ffields`\n- [Агрегация элементов](.\u002Fitems\u002Faggregate.md) — `POST \u002Fv1\u002Fitems\u002F:entityTypeId\u002Faggregate`\n- [Получить товары](.\u002Fitems\u002Fproducts-get.md) — `GET \u002Fv1\u002Fitems\u002F:entityTypeId\u002F:id\u002Fproducts`\n- [Установить товары](.\u002Fitems\u002Fproducts-set.md) — `PUT \u002Fv1\u002Fitems\u002F:entityTypeId\u002F:id\u002Fproducts`\n- [Добавить товар](.\u002Fitems\u002Fproducts-add.md) — `POST \u002Fv1\u002Fitems\u002F:entityTypeId\u002F:id\u002Fproducts`\n- [Удалить товар](.\u002Fitems\u002Fproducts-delete.md) — `DELETE \u002Fv1\u002Fitems\u002F:entityTypeId\u002F:id\u002Fproducts\u002F:rowId`\n- [Получить товар](.\u002Fitems\u002Fproducts-get-single.md) — `GET \u002Fv1\u002Fitems\u002F:entityTypeId\u002F:id\u002Fproducts\u002F:rowId`\n- [Обновить товар](.\u002Fitems\u002Fproducts-update.md) — `PATCH \u002Fv1\u002Fitems\u002F:entityTypeId\u002F:id\u002Fproducts\u002F:rowId`\n- [Поля товаров](.\u002Fitems\u002Fproducts-fields.md) — `GET \u002Fv1\u002Fitems\u002F:entityTypeId\u002F:id\u002Fproducts\u002Ffields`\n\n## Ключевые поля\n\n| Поле | Описание |\n|------|---------|\n| `title` | Название элемента |\n| `stageId` | Стадия. Формат `DT{typeId}_{catId}:{stage}`. Список: `GET \u002Fv1\u002Fstatuses?filter[entityId]=DYNAMIC_{entityTypeId}_STAGE_{categoryId}` |\n| `categoryId` | ID воронки. Список: `GET \u002Fv1\u002Fcategories\u002F:entityTypeId` |\n| `opportunity` | Сумма |\n| `currencyId` | Валюта. Список: `GET \u002Fv1\u002Fcurrencies` |\n| `assignedById` | Ответственный. Список: `GET \u002Fv1\u002Fusers` |\n| `companyId` \u002F `contactId` | Привязки к компании и контакту. Списки: `GET \u002Fv1\u002Fcompanies`, `GET \u002Fv1\u002Fcontacts` |\n\nПолный список полей — [`GET \u002Fv1\u002Fitems\u002F:entityTypeId\u002Ffields`](.\u002Fitems\u002Ffields.md).\n\n## Что нужно знать перед работой\n\n1. `entityTypeId` в пути — ID типа смарт-процесса из [`GET \u002Fv1\u002Fsmart-processes`](\u002Fdocs\u002Fentities\u002Fsmart-processes). Значения `1`, `2`, `3`, `4`, `7`, `31` зарезервированы за специализированными API (`\u002Fv1\u002Fleads`, `\u002Fv1\u002Fdeals`, `\u002Fv1\u002Fcontacts`, `\u002Fv1\u002Fcompanies`, `\u002Fv1\u002Fquotes`, `\u002Fv1\u002Finvoices`) — обращение к ним через `\u002Fv1\u002Fitems` возвращает `400 INVALID_DYNAMIC_PARAM`.\n2. Минимум для создания — `title`. Остальные обязательные поля зависят от настроек типа.\n3. Имена пользовательских полей используют внутренний номер типа — `ufCrm\u003CtypeId>_*`, который не равен `entityTypeId`. Точные имена приходят в [`GET \u002Fv1\u002Fitems\u002F:entityTypeId\u002Ffields`](.\u002Fitems\u002Ffields.md).\n4. Поля-даты `begindate` и `closedate` хранятся без времени — переданное время отбрасывается.\n5. Списочные ответы кладут пагинацию в `meta` (`meta.total`, `meta.hasMore`), не на верхний уровень.\n\n## Типичный сценарий\n\n1. Найти тип смарт-процесса: [`GET \u002Fv1\u002Fsmart-processes`](\u002Fdocs\u002Fentities\u002Fsmart-processes) — взять `entityTypeId`.\n2. Посмотреть поля типа: [`GET \u002Fv1\u002Fitems\u002F:entityTypeId\u002Ffields`](.\u002Fitems\u002Ffields.md).\n3. Создать элемент: [`POST \u002Fv1\u002Fitems\u002F:entityTypeId`](.\u002Fitems\u002Fcreate.md).\n4. Найти и отфильтровать: [`GET \u002Fv1\u002Fitems\u002F:entityTypeId`](.\u002Fitems\u002Flist.md) или [`POST \u002Fv1\u002Fitems\u002F:entityTypeId\u002Fsearch`](.\u002Fitems\u002Fsearch.md).\n5. При необходимости — добавить товарные позиции: [`GET \u002Fv1\u002Fitems\u002F:entityTypeId\u002F:id\u002Fproducts`](.\u002Fitems\u002Fproducts-get.md).\n\n## Лимиты\n\n| Лимит | Значение |\n|-------|----------|\n| Максимум записей на запрос | 5000 (`limit ≤ 5000`) |\n| Авто-пагинация | включается при `limit > 50` |\n| Batch-запросы | до 50 операций в [`POST \u002Fv1\u002Fbatch`](\u002Fdocs\u002Fbatch) |\n| Ограничение частоты | общее для API Вайбкод — см. [Лимиты и оптимизация](\u002Fdocs\u002Foptimization) |\n\n## Пользовательские поля\n\nУправление пользовательскими полями элементов смарт-процесса — отдельный раздел: [Поля смарт-процессов](\u002Fdocs\u002Fuserfields\u002Fsmart-processes) (`\u002Fv1\u002Fitems\u002F:entityTypeId\u002Fuserfields*`).\n\n## Смотрите также\n\n- [Типы смарт-процессов](\u002Fdocs\u002Fentities\u002Fsmart-processes)\n- [Поля смарт-процессов](\u002Fdocs\u002Fuserfields\u002Fsmart-processes)\n- [Entity API](\u002Fdocs\u002Fentity-api)\n- [Синтаксис фильтрации](\u002Fdocs\u002Ffiltering)\n- [Справочник сущностей](\u002Fdocs\u002Fentities-index)\n","2026-06-29",{"items\u002Fcreate.md":7,"items\u002Flist.md":8,"items\u002Fget.md":9,"items\u002Fupdate.md":10,"items\u002Fdelete.md":11,"items\u002Fsearch.md":12,"items\u002Ffields.md":13,"items\u002Faggregate.md":14,"items\u002Fproducts-get.md":15,"items\u002Fproducts-set.md":16,"items\u002Fproducts-add.md":17,"items\u002Fproducts-delete.md":18,"items\u002Fproducts-get-single.md":19,"items\u002Fproducts-update.md":20,"items\u002Fproducts-fields.md":21},"\n## Создать элемент смарт-процесса\n\n`POST \u002Fv1\u002Fitems\u002F:entityTypeId`\n\nСоздаёт новый элемент в указанном смарт-процессе. Параметр `entityTypeId` определяет тип смарт-процесса. Узнать доступные типы: `GET \u002Fv1\u002Fsmart-processes`.\n\n## Поля запроса (body)\n\n| Параметр | Тип | Описание |\n|----------|-----|---------|\n| `title` | string | Название |\n| `xmlId` | string | Внешний код |\n| `stageId` | string | Стадия. Формат: `DT{typeId}_{catId}:{stage}`. Список: `GET \u002Fv1\u002Fstatuses?filter[entityId]=DYNAMIC_{entityTypeId}_STAGE_{categoryId}` |\n| `categoryId` | number | ID воронки. Список: `GET \u002Fv1\u002Fcategories\u002F:entityTypeId` |\n| `contactId` | number | ID контакта. Поиск: `GET \u002Fv1\u002Fcontacts` |\n| `companyId` | number | ID компании. Поиск: `GET \u002Fv1\u002Fcompanies` |\n| `mycompanyId` | number | ID своей компании |\n| `assignedById` | number | Ответственный. Список: `GET \u002Fv1\u002Fusers` |\n| `opportunity` | number | Сумма |\n| `currencyId` | string | Валюта. Список: `GET \u002Fv1\u002Fcurrencies` |\n| `opened` | boolean | Доступен для всех |\n| `begindate` | datetime | Дата начала. Принимает ISO 8601, но сохраняется только дата — время отбрасывается |\n| `closedate` | datetime | Дата завершения. Принимает ISO 8601, но сохраняется только дата — время отбрасывается |\n| `sourceId` | string | Источник |\n| `observers` | array | ID наблюдателей |\n\nПолный список полей: [GET \u002Fv1\u002Fitems\u002F:entityTypeId\u002Ffields](\u002Fdocs\u002Fentities\u002Fitems\u002Ffields). Пользовательские поля (`ufCrmN_*`) также принимаются.\n\n## Примеры\n\nВ примерах `entityTypeId = 156` — замените на ID вашего смарт-процесса.\n\n### curl — личный ключ\n\n```bash\ncurl -X POST https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fitems\u002F156 \\\n  -H \"X-Api-Key: YOUR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"title\": \"Новый договор\",\n    \"categoryId\": 41,\n    \"assignedById\": 1,\n    \"companyId\": 15,\n    \"opportunity\": 500000,\n    \"currencyId\": \"RUB\"\n  }'\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl -X POST https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fitems\u002F156 \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"title\": \"Новый договор\",\n    \"categoryId\": 41,\n    \"assignedById\": 1,\n    \"companyId\": 15,\n    \"opportunity\": 500000,\n    \"currencyId\": \"RUB\"\n  }'\n```\n\n### JavaScript — личный ключ\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fitems\u002F156', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': 'YOUR_API_KEY',\n    'Content-Type': 'application\u002Fjson',\n  },\n  body: JSON.stringify({\n    title: 'Новый договор',\n    categoryId: 41,\n    assignedById: 1,\n    companyId: 15,\n    opportunity: 500000,\n    currencyId: 'RUB',\n  }),\n})\n\nconst { success, data } = await res.json()\nconsole.log('Item ID:', data.id)\n```\n\n### JavaScript — OAuth-приложение\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fitems\u002F156', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': 'YOUR_APP_KEY',\n    'Authorization': 'Bearer USER_SESSION_TOKEN',\n    'Content-Type': 'application\u002Fjson',\n  },\n  body: JSON.stringify({\n    title: 'Новый договор',\n    categoryId: 41,\n    assignedById: 1,\n    companyId: 15,\n    opportunity: 500000,\n    currencyId: 'RUB',\n  }),\n})\n\nconst { success, data } = await res.json()\n```\n\n## Поля ответа\n\n| Поле | Тип | Описание |\n|------|-----|---------|\n| `id` | number | ID элемента |\n| `title` | string | Название |\n| `stageId` | string | Стадия |\n| `categoryId` | number | ID воронки |\n| `companyId` | number | ID компании |\n| `contactId` | number | ID контакта |\n| `opportunity` | number | Сумма |\n| `currencyId` | string | Валюта |\n| `assignedById` | number | Ответственный |\n| `createdBy` | number | Создатель |\n| `createdTime` | datetime | Дата создания |\n| `updatedTime` | datetime | Дата изменения |\n\nОтвет содержит все поля элемента, включая пользовательские (`ufCrmN_*`).\n\nURL карточки элемента в Битрикс24 строится из `id`:\n\n```\nhttps:\u002F\u002F\u003Cportal>.bitrix24.ru\u002Fcrm\u002Ftype\u002F\u003CentityTypeId>\u002Fdetails\u002F\u003Cid>\u002F\n```\n\n`\u003CentityTypeId>` — ID типа смарт-процесса (тот же, что в пути запроса). `\u003Cportal>` — домен портала. Если смарт-процесс вынесен в отдельный раздел портала, Битрикс24 откроет карточку по соответствующему пути. Доступ ограничен правами сотрудника в Битрикс24.\n\n## Пример ответа\n\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"id\": 783,\n    \"title\": \"Новый договор\",\n    \"stageId\": \"DT156_41:NEW\",\n    \"categoryId\": 41,\n    \"companyId\": 15,\n    \"contactId\": null,\n    \"opportunity\": 500000,\n    \"currencyId\": \"RUB\",\n    \"assignedById\": 1,\n    \"createdBy\": 1,\n    \"createdTime\": \"2026-04-15T14:30:00+03:00\",\n    \"updatedTime\": \"2026-04-15T14:30:00+03:00\"\n  }\n}\n```\n\n## Пример ответа при ошибке\n\n403 — нет скоупа:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"SCOPE_DENIED\",\n    \"message\": \"This endpoint requires 'crm' scope\"\n  }\n}\n```\n\n## Ошибки\n\n| HTTP | Код | Описание |\n|------|-----|---------|\n| 400 | `INVALID_DYNAMIC_PARAM` | `entityTypeId` не является положительным целым или является зарезервированным (1, 2, 3, 4, 7, 31) |\n| 400 | `READONLY_FIELD` | В теле передано поле только для чтения (`id`, `createdTime`, `updatedTime` и другие) |\n| 422 | `BITRIX_ERROR` | Ошибка валидации полей от Битрикс24. Конкретная причина — в поле `message` |\n| 403 | `SCOPE_DENIED` | API-ключ не имеет скоупа `crm` |\n| 401 | `TOKEN_MISSING` | API-ключ не имеет настроенных токенов |\n\nПолный список общих ошибок API — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Смотрите также\n\n- [Работа с файлами в полях CRM](\u002Fdocs\u002Frecipes\u002Fcrm-files)\n- [Список элементов](\u002Fdocs\u002Fentities\u002Fitems\u002Flist)\n- [Поля элемента](\u002Fdocs\u002Fentities\u002Fitems\u002Ffields)\n- [Смарт-процессы](\u002Fdocs\u002Fentities\u002Fsmart-processes)\n- [Контакты](\u002Fdocs\u002Fentities\u002Fcontacts)\n- [Компании](\u002Fdocs\u002Fentities\u002Fcompanies)\n- [Entity API](\u002Fdocs\u002Fentity-api)\n","\n## Список элементов смарт-процесса\n\n`GET \u002Fv1\u002Fitems\u002F:entityTypeId`\n\nВозвращает список элементов указанного смарт-процесса с фильтрацией, сортировкой и пагинацией.\n\n## Параметры\n\n| Параметр | Тип | По умолч. | Описание |\n|----------|-----|-----------|---------|\n| `entityTypeId` (path) | number | — | ID типа смарт-процесса. Список: `GET \u002Fv1\u002Fsmart-processes` |\n| `limit` | number | `50` | Количество записей (до 5000) |\n| `offset` | number | `0` | Пропустить N записей |\n| `order` | object | — | Сортировка: `?order[createdTime]=desc` |\n| `select` | string | — | Выборка полей: `?select=id,title,stageId` |\n| `filter` | object | — | Фильтрация по полям `GET \u002Fv1\u002Fitems\u002F:entityTypeId\u002Ffields`.\u003Cbr>[Синтаксис фильтрации](\u002Fdocs\u002Ffiltering). Пример: `?filter[assignedById]=1` |\n\n## Примеры\n\nВ примерах `entityTypeId = 156` — замените на ID вашего смарт-процесса.\n\n### curl — личный ключ\n\n```bash\ncurl -X GET \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fitems\u002F156?limit=10&order[createdTime]=desc&filter[assignedById]=1\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\"\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl -X GET \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fitems\u002F156?limit=10&order[createdTime]=desc&filter[assignedById]=1\" \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\"\n```\n\n### JavaScript — личный ключ\n\n```javascript\nconst params = new URLSearchParams({\n  limit: '10',\n  'order[createdTime]': 'desc',\n  'filter[assignedById]': '1',\n})\n\nconst res = await fetch(`https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fitems\u002F156?${params}`, {\n  headers: { 'X-Api-Key': 'YOUR_API_KEY' },\n})\n\nconst { success, data, meta } = await res.json()\nconsole.log(`Найдено: ${meta.total}`)\n```\n\n### JavaScript — OAuth-приложение\n\n```javascript\nconst params = new URLSearchParams({\n  limit: '10',\n  'order[createdTime]': 'desc',\n  'filter[assignedById]': '1',\n})\n\nconst res = await fetch(`https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fitems\u002F156?${params}`, {\n  headers: {\n    'X-Api-Key': 'YOUR_APP_KEY',\n    'Authorization': 'Bearer USER_SESSION_TOKEN',\n  },\n})\n\nconst { success, data, meta } = await res.json()\n```\n\n## Поля ответа\n\nПагинация возвращается в объекте `meta` (как у всех списочных эндпоинтов платформы), **не** на верхнем уровне.\n\n| Поле | Тип | Описание |\n|------|-----|---------|\n| `data` | array | Массив элементов |\n| `meta.total` | number | Общее количество записей |\n| `meta.hasMore` | boolean | Есть ли ещё страницы |\n| `data[].id` | number | ID элемента |\n| `data[].title` | string | Название |\n| `data[].stageId` | string | Стадия |\n| `data[].categoryId` | number | ID воронки |\n| `data[].opportunity` | number | Сумма |\n| `data[].currencyId` | string | Валюта |\n| `data[].assignedById` | number | Ответственный |\n| `data[].createdTime` | datetime | Дата создания |\n\nURL карточки любого элемента из массива `data` — его `id`:\n\n```\nhttps:\u002F\u002F\u003Cportal>.bitrix24.ru\u002Fcrm\u002Ftype\u002F\u003CentityTypeId>\u002Fdetails\u002F\u003Cid>\u002F\n```\n\n`\u003CentityTypeId>` — ID типа смарт-процесса (тот же, что в пути запроса). `\u003Cportal>` — домен портала. Если смарт-процесс вынесен в отдельный раздел портала, Битрикс24 откроет карточку по соответствующему пути. Доступ ограничен правами сотрудника в Битрикс24.\n\n## Пример ответа\n\n```json\n{\n  \"success\": true,\n  \"data\": [\n    {\n      \"id\": 783,\n      \"title\": \"Договор на поставку\",\n      \"stageId\": \"DT156_41:NEW\",\n      \"categoryId\": 41,\n      \"companyId\": 15,\n      \"contactId\": 42,\n      \"opportunity\": 500000,\n      \"currencyId\": \"RUB\",\n      \"assignedById\": 1,\n      \"createdBy\": 1,\n      \"createdTime\": \"2026-04-15T14:30:00+03:00\",\n      \"updatedTime\": \"2026-04-15T14:30:00+03:00\"\n    }\n  ],\n  \"meta\": { \"total\": 23, \"hasMore\": true }\n}\n```\n\n## Пример ответа при ошибке\n\n403 — нет скоупа:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"SCOPE_DENIED\",\n    \"message\": \"This endpoint requires 'crm' scope\"\n  }\n}\n```\n\n## Ошибки\n\n| HTTP | Код | Описание |\n|------|-----|---------|\n| 403 | `SCOPE_DENIED` | API-ключ не имеет скоупа `crm` |\n| 401 | `TOKEN_MISSING` | API-ключ не имеет настроенных токенов |\n| 400 | `INVALID_DYNAMIC_PARAM` | `entityTypeId` не является положительным целым или является зарезервированным (1, 2, 3, 4, 7, 31) |\n| 400 | `UNKNOWN_FILTER_FIELD` | Поле фильтра не существует у сущности — сообщение перечисляет доступные поля |\n\nПолный список общих ошибок API — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Смотрите также\n\n- [Получить элемент](\u002Fdocs\u002Fentities\u002Fitems\u002Fget)\n- [Поиск элементов](\u002Fdocs\u002Fentities\u002Fitems\u002Fsearch)\n- [Поля элемента](\u002Fdocs\u002Fentities\u002Fitems\u002Ffields)\n- [Смарт-процессы](\u002Fdocs\u002Fentities\u002Fsmart-processes)\n- [Entity API](\u002Fdocs\u002Fentity-api)\n- [Лимиты и оптимизация](\u002Fdocs\u002Foptimization)\n","\n## Получить элемент смарт-процесса\n\n`GET \u002Fv1\u002Fitems\u002F:entityTypeId\u002F:id`\n\nВозвращает элемент смарт-процесса по ID.\n\n## Параметры запроса\n\n| Параметр | Тип | Описание |\n|----------|-----|---------|\n| `entityTypeId` | number | ID типа смарт-процесса (в URL) |\n| `id` | number | ID элемента (в URL) |\n\n## Примеры\n\nВ примерах `entityTypeId = 156`, `id = 783` — замените на ваши значения.\n\n### curl — личный ключ\n\n```bash\ncurl -X GET https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fitems\u002F156\u002F783 \\\n  -H \"X-Api-Key: YOUR_API_KEY\"\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl -X GET https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fitems\u002F156\u002F783 \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\"\n```\n\n### JavaScript — личный ключ\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fitems\u002F156\u002F783', {\n  headers: { 'X-Api-Key': 'YOUR_API_KEY' },\n})\n\nconst { success, data } = await res.json()\nconsole.log('Элемент:', data.title)\n```\n\n### JavaScript — OAuth-приложение\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fitems\u002F156\u002F783', {\n  headers: {\n    'X-Api-Key': 'YOUR_APP_KEY',\n    'Authorization': 'Bearer USER_SESSION_TOKEN',\n  },\n})\n\nconst { success, data } = await res.json()\n```\n\n## Поля ответа\n\n| Поле | Тип | Описание |\n|------|-----|---------|\n| `id` | number | ID элемента |\n| `title` | string | Название |\n| `xmlId` | string | Внешний код |\n| `stageId` | string | Стадия |\n| `categoryId` | number | ID воронки |\n| `companyId` | number | ID компании |\n| `contactId` | number | ID контакта |\n| `contactIds` | array | Привязанные контакты |\n| `opportunity` | number | Сумма |\n| `currencyId` | string | Валюта |\n| `opened` | boolean | Доступен для всех |\n| `assignedById` | number | Ответственный |\n| `createdBy` | number | Создатель |\n| `updatedBy` | number | Последний редактор |\n| `movedBy` | number | Переместил стадию |\n| `createdTime` | datetime | Дата создания |\n| `updatedTime` | datetime | Дата изменения |\n| `movedTime` | datetime | Дата смены стадии |\n| `observers` | array | Наблюдатели |\n\nОтвет содержит все поля элемента, включая пользовательские (`ufCrmN_*`) и родительские ссылки (`parentIdN`).\n\n## Пример ответа\n\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"id\": 783,\n    \"title\": \"Договор на поставку\",\n    \"xmlId\": null,\n    \"stageId\": \"DT156_41:NEW\",\n    \"categoryId\": 41,\n    \"companyId\": 15,\n    \"contactId\": 42,\n    \"contactIds\": [42],\n    \"opportunity\": 500000,\n    \"currencyId\": \"RUB\",\n    \"opened\": true,\n    \"assignedById\": 1,\n    \"createdBy\": 1,\n    \"updatedBy\": 1,\n    \"movedBy\": 1,\n    \"createdTime\": \"2026-04-15T14:30:00+03:00\",\n    \"updatedTime\": \"2026-04-15T14:30:00+03:00\",\n    \"movedTime\": \"2026-04-15T14:30:00+03:00\",\n    \"observers\": [1, 5],\n    \"mycompanyId\": 0\n  }\n}\n```\n\n## Пример ответа при ошибке\n\n404 — элемент не найден:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"ENTITY_NOT_FOUND\",\n    \"message\": \"Элемент не найден\"\n  }\n}\n```\n\n## Ошибки\n\n| HTTP | Код | Описание |\n|------|-----|---------|\n| 400 | `INVALID_DYNAMIC_PARAM` | `entityTypeId` не является положительным целым или является зарезервированным (1, 2, 3, 4, 7, 31) |\n| 404 | `ENTITY_NOT_FOUND` | Элемент с указанным ID не найден |\n| 403 | `SCOPE_DENIED` | API-ключ не имеет скоупа `crm` |\n| 401 | `TOKEN_MISSING` | API-ключ не имеет настроенных токенов |\n\nПолный список общих ошибок API — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Смотрите также\n\n- [Работа с файлами в полях CRM](\u002Fdocs\u002Frecipes\u002Fcrm-files)\n- [Список элементов](\u002Fdocs\u002Fentities\u002Fitems\u002Flist)\n- [Обновить элемент](\u002Fdocs\u002Fentities\u002Fitems\u002Fupdate)\n- [Поля элемента](\u002Fdocs\u002Fentities\u002Fitems\u002Ffields)\n- [Смарт-процессы](\u002Fdocs\u002Fentities\u002Fsmart-processes)\n- [Entity API](\u002Fdocs\u002Fentity-api)\n","\n## Обновить элемент смарт-процесса\n\n`PATCH \u002Fv1\u002Fitems\u002F:entityTypeId\u002F:id`\n\nОбновляет поля элемента смарт-процесса. Передавайте только изменяемые поля.\n\n## Параметры запроса\n\n| Параметр | Тип | Описание |\n|----------|-----|---------|\n| `entityTypeId` | number | ID типа смарт-процесса (в URL) |\n| `id` | number | ID элемента (в URL) |\n\n## Поля запроса (body)\n\n| Параметр | Тип | Описание |\n|----------|-----|---------|\n| `title` | string | Название |\n| `stageId` | string | Стадия. Список: `GET \u002Fv1\u002Fstatuses?filter[entityId]=DYNAMIC_{entityTypeId}_STAGE_{categoryId}` |\n| `contactId` | number | ID контакта |\n| `companyId` | number | ID компании |\n| `opportunity` | number | Сумма |\n| `currencyId` | string | Валюта. Список: `GET \u002Fv1\u002Fcurrencies` |\n| `assignedById` | number | Ответственный. Список: `GET \u002Fv1\u002Fusers` |\n| `opened` | boolean | Доступен для всех |\n| `begindate` | datetime | Дата начала. Принимает ISO 8601, но сохраняется только дата — время отбрасывается |\n| `closedate` | datetime | Дата завершения. Принимает ISO 8601, но сохраняется только дата — время отбрасывается |\n| `observers` | array | ID наблюдателей |\n\nПолный список полей: [GET \u002Fv1\u002Fitems\u002F:entityTypeId\u002Ffields](\u002Fdocs\u002Fentities\u002Fitems\u002Ffields). Пользовательские поля (`ufCrmN_*`) также принимаются.\n\n## Примеры\n\nВ примерах `entityTypeId = 156`, `id = 783` — замените на ваши значения.\n\n### curl — личный ключ\n\n```bash\ncurl -X PATCH https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fitems\u002F156\u002F783 \\\n  -H \"X-Api-Key: YOUR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"stageId\": \"DT156_41:WON\",\n    \"opportunity\": 750000\n  }'\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl -X PATCH https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fitems\u002F156\u002F783 \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"stageId\": \"DT156_41:WON\",\n    \"opportunity\": 750000\n  }'\n```\n\n### JavaScript — личный ключ\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fitems\u002F156\u002F783', {\n  method: 'PATCH',\n  headers: {\n    'X-Api-Key': 'YOUR_API_KEY',\n    'Content-Type': 'application\u002Fjson',\n  },\n  body: JSON.stringify({\n    stageId: 'DT156_41:WON',\n    opportunity: 750000,\n  }),\n})\n\nconst { success, data } = await res.json()\nconsole.log('Обновлён:', data.id)\n```\n\n### JavaScript — OAuth-приложение\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fitems\u002F156\u002F783', {\n  method: 'PATCH',\n  headers: {\n    'X-Api-Key': 'YOUR_APP_KEY',\n    'Authorization': 'Bearer USER_SESSION_TOKEN',\n    'Content-Type': 'application\u002Fjson',\n  },\n  body: JSON.stringify({\n    stageId: 'DT156_41:WON',\n    opportunity: 750000,\n  }),\n})\n\nconst { success, data } = await res.json()\n```\n\n## Поля ответа\n\n| Поле | Тип | Описание |\n|------|-----|---------|\n| `id` | number | ID элемента |\n| `title` | string | Название |\n| `stageId` | string | Стадия |\n| `opportunity` | number | Сумма |\n| `assignedById` | number | Ответственный |\n| `updatedBy` | number | Последний редактор |\n| `updatedTime` | datetime | Дата изменения |\n\nОтвет содержит все поля элемента после обновления.\n\n## Пример ответа\n\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"id\": 783,\n    \"title\": \"Договор на поставку\",\n    \"stageId\": \"DT156_41:WON\",\n    \"categoryId\": 41,\n    \"companyId\": 15,\n    \"contactId\": 42,\n    \"opportunity\": 750000,\n    \"currencyId\": \"RUB\",\n    \"assignedById\": 1,\n    \"createdBy\": 1,\n    \"updatedBy\": 1,\n    \"movedBy\": 1,\n    \"createdTime\": \"2026-04-15T14:30:00+03:00\",\n    \"updatedTime\": \"2026-04-15T16:45:00+03:00\",\n    \"movedTime\": \"2026-04-15T16:45:00+03:00\"\n  }\n}\n```\n\n## Пример ответа при ошибке\n\n404 — элемент не найден:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"ENTITY_NOT_FOUND\",\n    \"message\": \"Элемент не найден\"\n  }\n}\n```\n\n## Ошибки\n\n| HTTP | Код | Описание |\n|------|-----|---------|\n| 400 | `INVALID_DYNAMIC_PARAM` | `entityTypeId` не является положительным целым или является зарезервированным (1, 2, 3, 4, 7, 31) |\n| 400 | `READONLY_FIELD` | В теле передано поле только для чтения (`id`, `createdTime`, `updatedTime` и другие) |\n| 404 | `ENTITY_NOT_FOUND` | Элемент с указанным ID не найден |\n| 422 | `BITRIX_ERROR` | Ошибка валидации полей от Битрикс24. Конкретная причина — в поле `message` |\n| 403 | `SCOPE_DENIED` | API-ключ не имеет скоупа `crm` |\n| 401 | `TOKEN_MISSING` | API-ключ не имеет настроенных токенов |\n\nПолный список общих ошибок API — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Смотрите также\n\n- [Работа с файлами в полях CRM](\u002Fdocs\u002Frecipes\u002Fcrm-files)\n- [Получить элемент](\u002Fdocs\u002Fentities\u002Fitems\u002Fget)\n- [Поля элемента](\u002Fdocs\u002Fentities\u002Fitems\u002Ffields)\n- [Создать элемент](\u002Fdocs\u002Fentities\u002Fitems\u002Fcreate)\n- [Entity API](\u002Fdocs\u002Fentity-api)\n","\n## Удалить элемент\n\n`DELETE \u002Fv1\u002Fitems\u002F:entityTypeId\u002F:id`\n\nУдаляет элемент смарт-процесса по ID. Восстановить удалённый элемент через API нельзя — создавайте новый при необходимости.\n\n## Параметры\n\n| Параметр | Тип | Обяз. | Описание |\n|----------|-----|:-----:|---------|\n| `entityTypeId` (path) | number | да | ID типа смарт-процесса. Получить: [GET \u002Fv1\u002Fsmart-processes](\u002Fdocs\u002Fentities\u002Fsmart-processes\u002Flist). Зарезервированные значения (`1`, `2`, `3`, `4`, `7`, `31`) обслуживаются специализированными API: `\u002Fv1\u002Fleads`, `\u002Fv1\u002Fdeals`, `\u002Fv1\u002Fcontacts`, `\u002Fv1\u002Fcompanies`, `\u002Fv1\u002Fquotes`, `\u002Fv1\u002Finvoices` |\n| `id` (path) | number | да | ID элемента |\n\n## Примеры\n\nВ примерах `entityTypeId = 177`, `id = 783` — замените на ваши значения.\n\n### curl — личный ключ\n\n```bash\ncurl -X DELETE \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fitems\u002F177\u002F783\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\"\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl -X DELETE \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fitems\u002F177\u002F783\" \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\"\n```\n\n### JavaScript — личный ключ\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fitems\u002F177\u002F783', {\n  method: 'DELETE',\n  headers: { 'X-Api-Key': 'YOUR_API_KEY' },\n})\n\nif (res.status === 204) {\n  console.log('Элемент удалён')\n}\n```\n\n### JavaScript — OAuth-приложение\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fitems\u002F177\u002F783', {\n  method: 'DELETE',\n  headers: {\n    'X-Api-Key': 'YOUR_APP_KEY',\n    'Authorization': 'Bearer USER_SESSION_TOKEN',\n  },\n})\n\nif (res.status === 204) {\n  console.log('Удалено')\n}\n```\n\n## Ответ\n\nПри успешном удалении возвращается HTTP-статус `204 No Content` с пустым телом — признак успеха проверяется по статусу.\n\n## Пример ответа\n\n```\nHTTP\u002F1.1 204 No Content\n```\n\n## Пример ответа при ошибке\n\n400 — зарезервированный `entityTypeId` (для стандартных CRM-сущностей):\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"INVALID_DYNAMIC_PARAM\",\n    \"message\": \"entityTypeId 2 has a dedicated API: use \u002Fv1\u002Fdeals instead\"\n  }\n}\n```\n\n## Ошибки\n\n| HTTP | Код | Описание |\n|------|-----|---------|\n| 400 | `INVALID_DYNAMIC_PARAM` | `entityTypeId` не является положительным целым или является зарезервированным (1, 2, 3, 4, 7, 31) |\n| 404 | `ENTITY_NOT_FOUND` | Элемент с указанным ID не найден |\n| 403 | `SCOPE_DENIED` | API-ключ не имеет скоупа `crm` |\n| 401 | `TOKEN_MISSING` | API-ключ не имеет настроенных токенов |\n\nПолный список общих ошибок API — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Смотрите также\n\n- [Список элементов](\u002Fdocs\u002Fentities\u002Fitems\u002Flist)\n- [Создать элемент](\u002Fdocs\u002Fentities\u002Fitems\u002Fcreate)\n- [Смарт-процессы](\u002Fdocs\u002Fentities\u002Fsmart-processes\u002Flist)\n- [Лимиты и оптимизация](\u002Fdocs\u002Foptimization)\n","\n## Поиск элементов смарт-процесса\n\n`POST \u002Fv1\u002Fitems\u002F:entityTypeId\u002Fsearch`\n\nРасширенный поиск элементов с фильтрацией, сортировкой и авто-пагинацией. Поддерживает до 5000 записей.\n\n## Поля запроса (body)\n\n| Параметр | Тип | Описание |\n|----------|-----|---------|\n| `filter` | object | Фильтрация по полям `GET \u002Fv1\u002Fitems\u002F:entityTypeId\u002Ffields`.\u003Cbr>[Синтаксис фильтрации](\u002Fdocs\u002Ffiltering). Пример: `{ \"filter\": { \"assignedById\": 1 } }` |\n| `sort` | string | Сортировка. Префикс `-` — по убыванию |\n| `limit` | number | Количество записей (по умолчанию 50, макс. 5000) |\n| `select` | array | Список возвращаемых полей |\n| `autoWindow` | boolean | Авто-разбивка по датам (по умолчанию `true`) |\n\n### Синтаксис фильтров\n\nПоддерживаются три формата:\n\n```json\n{ \"filter\": { \">=opportunity\": 100000 } }\n{ \"filter\": { \"opportunity\": { \"$gte\": 100000 } } }\n{ \"filter\": { \"opportunity\": { \">=\": 100000 } } }\n```\n\n## Примеры\n\nВ примерах `entityTypeId = 156` — замените на ID вашего смарт-процесса.\n\n### curl — личный ключ\n\n```bash\ncurl -X POST https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fitems\u002F156\u002Fsearch \\\n  -H \"X-Api-Key: YOUR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"filter\": {\n      \"assignedById\": 1,\n      \"stageId\": \"DT156_41:NEW\"\n    },\n    \"select\": [\"id\", \"title\", \"opportunity\", \"stageId\"],\n    \"sort\": \"-createdTime\",\n    \"limit\": 100\n  }'\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl -X POST https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fitems\u002F156\u002Fsearch \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"filter\": {\n      \"assignedById\": 1,\n      \"stageId\": \"DT156_41:NEW\"\n    },\n    \"select\": [\"id\", \"title\", \"opportunity\", \"stageId\"],\n    \"sort\": \"-createdTime\",\n    \"limit\": 100\n  }'\n```\n\n### JavaScript — личный ключ\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fitems\u002F156\u002Fsearch', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': 'YOUR_API_KEY',\n    'Content-Type': 'application\u002Fjson',\n  },\n  body: JSON.stringify({\n    filter: { assignedById: 1, stageId: 'DT156_41:NEW' },\n    select: ['id', 'title', 'opportunity', 'stageId'],\n    sort: '-createdTime',\n    limit: 100,\n  }),\n})\n\nconst { success, data, meta } = await res.json()\nconsole.log(`Найдено: ${meta.total}`)\n```\n\n### JavaScript — OAuth-приложение\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fitems\u002F156\u002Fsearch', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': 'YOUR_APP_KEY',\n    'Authorization': 'Bearer USER_SESSION_TOKEN',\n    'Content-Type': 'application\u002Fjson',\n  },\n  body: JSON.stringify({\n    filter: { assignedById: 1, stageId: 'DT156_41:NEW' },\n    select: ['id', 'title', 'opportunity', 'stageId'],\n    sort: '-createdTime',\n    limit: 100,\n  }),\n})\n\nconst { success, data, meta } = await res.json()\n```\n\n## Поля ответа\n\n| Поле | Тип | Описание |\n|------|-----|---------|\n| `data` | array | Массив элементов |\n| `meta.total` | number | Общее количество записей под фильтр |\n| `meta.hasMore` | boolean | Есть ли ещё страницы |\n| `meta.durationMs` | number | Время выполнения запроса в миллисекундах |\n\nURL карточки любого элемента из массива `data` — его `id`:\n\n```\nhttps:\u002F\u002F\u003Cportal>.bitrix24.ru\u002Fcrm\u002Ftype\u002F\u003CentityTypeId>\u002Fdetails\u002F\u003Cid>\u002F\n```\n\n`\u003CentityTypeId>` — ID типа смарт-процесса (тот же, что в пути запроса). `\u003Cportal>` — домен портала. Если смарт-процесс вынесен в отдельный раздел портала, Битрикс24 откроет карточку по соответствующему пути. Доступ ограничен правами сотрудника в Битрикс24.\n\n## Пример ответа\n\n```json\n{\n  \"success\": true,\n  \"data\": [\n    {\n      \"id\": 783,\n      \"title\": \"Договор на поставку\",\n      \"stageId\": \"DT156_41:NEW\",\n      \"opportunity\": 500000\n    }\n  ],\n  \"meta\": { \"total\": 5, \"hasMore\": false, \"durationMs\": 320 }\n}\n```\n\n## Пример ответа при ошибке\n\n403 — нет скоупа:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"SCOPE_DENIED\",\n    \"message\": \"This endpoint requires 'crm' scope\"\n  }\n}\n```\n\n## Ошибки\n\n| HTTP | Код | Описание |\n|------|-----|---------|\n| 403 | `SCOPE_DENIED` | API-ключ не имеет скоупа `crm` |\n| 401 | `TOKEN_MISSING` | API-ключ не имеет настроенных токенов |\n| 400 | `INVALID_DYNAMIC_PARAM` | `entityTypeId` не является положительным целым или является зарезервированным (1, 2, 3, 4, 7, 31) |\n| 400 | `UNKNOWN_FILTER_FIELD` | Поле фильтра не существует у сущности — сообщение перечисляет доступные поля |\n\nПолный список общих ошибок API — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Смотрите также\n\n- [Список элементов](\u002Fdocs\u002Fentities\u002Fitems\u002Flist)\n- [Поля элемента](\u002Fdocs\u002Fentities\u002Fitems\u002Ffields)\n- [Пакетные запросы](\u002Fdocs\u002Fbatch)\n- [Смарт-процессы](\u002Fdocs\u002Fentities\u002Fsmart-processes)\n- [Entity API](\u002Fdocs\u002Fentity-api)\n","\n## Поля элемента смарт-процесса\n\n`GET \u002Fv1\u002Fitems\u002F:entityTypeId\u002Ffields`\n\nВозвращает описание всех полей для указанного типа смарт-процесса, включая пользовательские (`ufCrmN_*`) и родительские ссылки (`parentIdN`).\n\nНабор полей зависит от `entityTypeId` — каждый тип смарт-процесса имеет собственные пользовательские поля.\n\n## Примеры\n\nВ примерах `entityTypeId = 156` — замените на ID вашего смарт-процесса.\n\n### curl — личный ключ\n\n```bash\ncurl -X GET https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fitems\u002F156\u002Ffields \\\n  -H \"X-Api-Key: YOUR_API_KEY\"\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl -X GET https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fitems\u002F156\u002Ffields \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\"\n```\n\n### JavaScript — личный ключ\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fitems\u002F156\u002Ffields', {\n  headers: { 'X-Api-Key': 'YOUR_API_KEY' },\n})\n\nconst { success, data } = await res.json()\nconsole.log('Полей:', Object.keys(data).length)\n```\n\n### JavaScript — OAuth-приложение\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fitems\u002F156\u002Ffields', {\n  headers: {\n    'X-Api-Key': 'YOUR_APP_KEY',\n    'Authorization': 'Bearer USER_SESSION_TOKEN',\n  },\n})\n\nconst { success, data } = await res.json()\n```\n\n## Поля ответа\n\n| Поле | Тип | Только чтение | Описание |\n|------|-----|:---:|---------|\n| `id` | number | да | ID элемента |\n| `title` | string | | Название |\n| `xmlId` | string | | Внешний код |\n| `stageId` | string | | Стадия. Формат: `DT{typeId}_{catId}:{stage}` |\n| `categoryId` | number | | ID воронки. Список: `GET \u002Fv1\u002Fcategories\u002F:entityTypeId` |\n| `assignedById` | number | | Ответственный. Список: `GET \u002Fv1\u002Fusers` |\n| `companyId` | number | | ID компании. Поиск: `GET \u002Fv1\u002Fcompanies` |\n| `contactId` | number | | ID контакта. Поиск: `GET \u002Fv1\u002Fcontacts` |\n| `contactIds` | array | да | Привязанные контакты |\n| `opportunity` | number | | Сумма |\n| `currencyId` | string | | Валюта. Список: `GET \u002Fv1\u002Fcurrencies` |\n| `opened` | boolean | | Доступен для всех |\n| `begindate` | datetime | | Дата начала. Хранится без времени — переданное время отбрасывается |\n| `closedate` | datetime | | Дата завершения. Хранится без времени — переданное время отбрасывается |\n| `sourceId` | string | | Источник |\n| `observers` | array | | Наблюдатели |\n| `mycompanyId` | number | | ID своей компании |\n| `createdBy` | number | да | Создатель |\n| `updatedBy` | number | да | Последний редактор |\n| `movedBy` | number | да | Переместил стадию |\n| `createdTime` | datetime | да | Дата создания |\n| `updatedTime` | datetime | да | Дата изменения |\n| `movedTime` | datetime | да | Дата смены стадии |\n| `isManualOpportunity` | boolean | | Сумма задана вручную (`Y`\u002F`N` → `true`\u002F`false`) |\n| `isRecurring` | boolean | да | Признак регулярного элемента |\n| `lastActivityTime` | datetime | да | Время последней активности |\n\n`isManualOpportunity` и `isRecurring` приходят от Битрикс24 строкой `\"Y\"`\u002F`\"N\"` — платформа нормализует их в JSON-`boolean` на чтении (и принимает `true`\u002F`false` на запись для `isManualOpportunity`), как и `opened`.\n\nПользовательские поля (`ufCrmN_*`) и родительские ссылки (`parentIdN`) зависят от конкретного смарт-процесса. Для полей типа `enumeration` ответ содержит массив `items` с доступными значениями.\n\n> **Нульность.** Многие поля приходят `null`, когда не заполнены — в частности `xmlId`, `sourceDescription`, `lastActivityTime` и UTM-поля (`utmSource`\u002F`utmMedium`\u002F`utmCampaign`\u002F`utmContent`\u002F`utmTerm`, если включены на портале). Типобезопасным клиентам (TS) объявляйте такие поля как `T | null`.\n\n> ⚠ **`\u002Ffields` отражает живой контракт Битрикс24, а не форму платформенных доков.** Это сквозной проброс схемы полей Битрикс24 как есть: типы приходят в нотации Битрикс24 (`number`, `string`, `boolean`, `datetime`, `double`, `enumeration`, `crm_contact`, `crm_status`, `user` и другие), флаг — `readonly` (а не `isReadOnly`), у части полей есть `label`, отдельного `isRequired` или `title` нет. Схема также объявляет поля-привязки вроде `contacts` (тип `crm_contact`) — это **входной** формат для create\u002Fupdate. В данных list\u002Fget таких ключей нет, привязки читаются через `contactId` \u002F `contactIds`. Системные поля, которые Битрикс24 отдаёт в list\u002Fget, но не описаны выше (`taxValue`, `webformId`, `previousStageId`, `lastActivityBy`, `lastCommunication*`, `utm*`), проходят сквозным проксированием.\n\n## Пример ответа\n\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"fields\": {\n      \"id\": { \"type\": \"number\", \"readonly\": true },\n      \"title\": { \"type\": \"string\", \"readonly\": false },\n      \"stageId\": { \"type\": \"string\", \"readonly\": false },\n      \"begindate\": { \"type\": \"datetime\", \"readonly\": false },\n      \"contacts\": { \"type\": \"crm_contact\", \"readonly\": false, \"label\": \"Контакты\" },\n      \"ufCrm156_custom\": { \"type\": \"string\", \"readonly\": false },\n      \"parentId156\": { \"type\": \"number\", \"readonly\": false }\n    }\n  }\n}\n```\n\nПоля приходят внутри `data.fields`. Объект ответа также содержит `data.products` (схема товарных строк), `data.aggregatable` (поля, доступные в [агрегации](\u002Fdocs\u002Fentities\u002Fitems\u002Faggregate)) и `data.batch`.\n\n\n## Пример ответа при ошибке\n\n404 — не найден:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"ENTITY_NOT_FOUND\",\n    \"message\": \"Элемент не найден\"\n  }\n}\n```\n\n## Ошибки\n\n| HTTP | Код | Описание |\n|------|-----|---------|\n| 403 | `SCOPE_DENIED` | API-ключ не имеет скоупа `crm` |\n| 401 | `TOKEN_MISSING` | API-ключ не имеет настроенных токенов |\n| 400 | `INVALID_DYNAMIC_PARAM` | `entityTypeId` не является положительным целым или является зарезервированным (1, 2, 3, 4, 7, 31) |\n\nПолный список общих ошибок API — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Смотрите также\n\n- [Создать элемент](\u002Fdocs\u002Fentities\u002Fitems\u002Fcreate)\n- [Список элементов](\u002Fdocs\u002Fentities\u002Fitems\u002Flist)\n- [Смарт-процессы](\u002Fdocs\u002Fentities\u002Fsmart-processes)\n- [Entity API](\u002Fdocs\u002Fentity-api)\n","\n## Агрегация элементов\n\n`POST \u002Fv1\u002Fitems\u002F:entityTypeId\u002Faggregate`\n\nПодсчёт количества, сумма, среднее, минимум и максимум по элементам смарт-процесса с фильтрацией и группировкой. Смарт-процесс задаётся в пути через `entityTypeId` — ID типа процесса, который можно получить через [GET \u002Fv1\u002Fsmart-processes](\u002Fdocs\u002Fentities\u002Fsmart-processes\u002Flist).\n\n**Стандартные поля:**\n\n- `opportunity` — сумма элемента (числовое агрегирование имеет смысл)\n- `categoryId` — категория (для `groupBy`)\n- `assignedById` — ответственный (для `groupBy`)\n- `stageId` — стадия (для `groupBy`)\n- `createdBy` — создал (для `groupBy`)\n- `updatedBy` — последний изменил (для `groupBy`)\n\n**Пользовательские поля (UF):** имена UF-полей имеют префикс с внутренним номером типа смарт-процесса — `ufCrm\u003CtypeId>_*` (например, `ufCrm7_1652689362`). Этот номер не равен `entityTypeId` из пути — точные имена UF-полей берите из ответа [`GET \u002Fv1\u002Fitems\u002F:entityTypeId\u002Ffields`](\u002Fdocs\u002Fentities\u002Fitems\u002Ffields) или из текста ошибки `INVALID_PARAMS`, она перечисляет доступные поля портала. Типы `integer`, `double`, `money` — для числовых функций, UF любого типа — для `groupBy`. Основной источник бизнес-данных в смарт-процессах — именно UF.\n\n## Path-параметры\n\n| Параметр | Тип | Обяз. | Описание |\n|----------|-----|:-----:|---------|\n| `entityTypeId` | number | да | ID типа смарт-процесса. Для пользовательских смарт-процессов — любое положительное целое из `GET \u002Fv1\u002Fsmart-processes`. Значения `1` (лиды), `2` (сделки), `3` (контакты), `4` (компании), `7` (предложения), `31` (счета) зарезервированы — используйте специализированные API: [\u002Fv1\u002Fdeals](\u002Fdocs\u002Fentities\u002Fdeals\u002Faggregate), [\u002Fv1\u002Fleads](\u002Fdocs\u002Fentities\u002Fleads\u002Faggregate) и т.д. |\n\n## Поля запроса (body)\n\n| Параметр | Тип | Обяз. | Описание |\n|----------|-----|:-----:|---------|\n| `aggregate` | array | нет | Массив агрегаций. Каждый элемент: `{ \"field\": \"opportunity\", \"function\": \"sum\" }`. Функции: `count`, `sum`, `avg`, `min`, `max`. Для `count` поле — `\"*\"`. Без массива — только `count` |\n| `filter` | object | нет | Фильтрация по полям `GET \u002Fv1\u002Fitems\u002F:entityTypeId\u002Ffields`. [Синтаксис фильтрации](\u002Fdocs\u002Ffiltering) |\n| `groupBy` | string \\| string[] | нет | Поле или массив полей для группировки (максимум 5). Принимает стандартные поля и UF-поля любого типа |\n\n## Примеры\n\n### curl — личный ключ\n\n```bash\ncurl -X POST \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fitems\u002F177\u002Faggregate\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"aggregate\": [\n      { \"field\": \"opportunity\", \"function\": \"sum\" },\n      { \"field\": \"opportunity\", \"function\": \"avg\" }\n    ],\n    \"filter\": { \"categoryId\": 7 },\n    \"groupBy\": \"stageId\"\n  }'\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl -X POST \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fitems\u002F177\u002Faggregate\" \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"aggregate\": [\n      { \"field\": \"opportunity\", \"function\": \"sum\" },\n      { \"field\": \"opportunity\", \"function\": \"avg\" }\n    ],\n    \"filter\": { \"categoryId\": 7 },\n    \"groupBy\": \"stageId\"\n  }'\n```\n\n### JavaScript — личный ключ\n\n```javascript\nconst entityTypeId = 177\n\nconst res = await fetch(`https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fitems\u002F${entityTypeId}\u002Faggregate`, {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': 'YOUR_API_KEY',\n    'Content-Type': 'application\u002Fjson',\n  },\n  body: JSON.stringify({\n    aggregate: [\n      { field: 'opportunity', function: 'sum' },\n      { field: 'opportunity', function: 'avg' },\n    ],\n    filter: { categoryId: 7 },\n    groupBy: 'stageId',\n  }),\n})\n\nconst { success, data } = await res.json()\nconsole.log('Всего элементов:', data.count)\nconsole.log('По стадиям:', data.groups)\n```\n\n### JavaScript — OAuth-приложение\n\n```javascript\nconst entityTypeId = 177\n\nconst res = await fetch(`https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fitems\u002F${entityTypeId}\u002Faggregate`, {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': 'YOUR_APP_KEY',\n    'Authorization': 'Bearer USER_SESSION_TOKEN',\n    'Content-Type': 'application\u002Fjson',\n  },\n  body: JSON.stringify({\n    aggregate: [\n      { field: 'opportunity', function: 'sum' },\n      { field: 'opportunity', function: 'avg' },\n    ],\n    filter: { categoryId: 7 },\n    groupBy: 'stageId',\n  }),\n})\n\nconst { success, data } = await res.json()\n```\n\n> Для группировки по нескольким полям передайте массив: `\"groupBy\": [\"stageId\", \"categoryId\"]` (максимум 5).\n\n## Другие сценарии\n\nПодсчёт записей — `count` с полем `\"*\"`, самый быстрый запрос без выгрузки записей. Без массива `aggregate` результат тот же:\n\n```json\n{ \"aggregate\": [{ \"field\": \"*\", \"function\": \"count\" }] }\n```\n\nРабота с пользовательскими полями (UF) — `sum` по UF + группировка по другому UF:\n\n```json\n{\n  \"aggregate\": [{ \"field\": \"ufCrm7_1741091916816\", \"function\": \"sum\" }],\n  \"groupBy\": \"ufCrm7_1652689362\"\n}\n```\n\n## Поля ответа\n\n| Поле | Тип | Описание |\n|------|-----|---------|\n| `success` | boolean | Всегда `true` при успехе |\n| `data.count` | number | Количество элементов, соответствующих фильтру |\n| `data.aggregates` | object | Результаты агрегаций: `{ \"opportunity\": { \"sum\": 65911, \"avg\": 4707.92 } }` |\n| `data.groups` | array | Группы (только при `groupBy`). Каждый элемент: поля группировки + `count` + `aggregates` |\n| `data.meta.totalRecords` | number | Общее количество записей под фильтр |\n| `data.meta.recordsProcessed` | number | Сколько записей было фактически обработано для агрегации |\n| `data.meta.truncated` | boolean | `true`, если под фильтр попало больше 5000 записей |\n| `data.meta.groupTotal` | number | Количество групп (только при `groupBy`) |\n| `data.meta.groupsTruncated` | boolean | `true`, если список групп был усечён |\n\n## Пример ответа\n\nОтвет на основной запрос (агрегации + `groupBy: \"stageId\"`):\n\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"count\": 14,\n    \"aggregates\": {\n      \"opportunity\": { \"sum\": 65911, \"avg\": 4707.92 }\n    },\n    \"groups\": [\n      {\n        \"stageId\": \"DT177_7:NEW\",\n        \"count\": 8,\n        \"aggregates\": { \"opportunity\": { \"sum\": 40000 } }\n      },\n      {\n        \"stageId\": \"DT177_7:SUCCESS\",\n        \"count\": 6,\n        \"aggregates\": { \"opportunity\": { \"sum\": 25911 } }\n      }\n    ],\n    \"meta\": {\n      \"totalRecords\": 14,\n      \"recordsProcessed\": 14,\n      \"truncated\": false,\n      \"groupTotal\": 2,\n      \"groupsTruncated\": false\n    }\n  }\n}\n```\n\nБез `groupBy` поле `data.groups` в ответе отсутствует.\n\n## Пример ответа при ошибке\n\n400 — зарезервированный `entityTypeId` (для стандартных CRM-сущностей):\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"INVALID_DYNAMIC_PARAM\",\n    \"message\": \"entityTypeId 2 has a dedicated API: use \u002Fv1\u002Fdeals instead\"\n  }\n}\n```\n\n## Ошибки\n\n| HTTP | Код | Описание |\n|------|-----|---------|\n| 400 | `INVALID_DYNAMIC_PARAM` | `entityTypeId` не является положительным целым или является зарезервированным (1, 2, 3, 4, 7, 31) |\n| 400 | `INVALID_PARAMS` | Некорректное имя функции, несуществующее поле или нечисловое поле в `sum`\u002F`avg`\u002F`min`\u002F`max` |\n| 401 | `TOKEN_MISSING` | API-ключ не имеет настроенных токенов |\n| 403 | `SCOPE_DENIED` | API-ключ не имеет скоупа `crm` |\n\nПолный список общих ошибок API — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Известные особенности\n\n**Без массива `aggregate` — только `count`.** Если не передать `aggregate`, метод сделает один быстрый вызов в Битрикс24 и вернёт `count` записей под фильтр. Подходит для счётчиков на дашбордах.\n\n**Несколько агрегаций в одном запросе.** Можно объединить в одном вызове: `[{ \"field\": \"opportunity\", \"function\": \"sum\" }, { \"field\": \"opportunity\", \"function\": \"avg\" }]`.\n\n**Money-поля.** UF-поля типа `money` хранятся в формате `\"сумма|валюта\"` (`\"1500|RUB\"`) — агрегат извлекает числовую часть автоматически, складывать можно без парсинга.\n\n**Фильтрация по UF работает.** В `filter` можно передавать любые поля — стандартные и пользовательские, любого типа. Например, `{ \"filter\": { \"ufCrm7_1652689362\": 1435 } }` вернёт количество элементов с этим значением UF.\n\n**Ограничение 5000 записей.** Числовые агрегации подгружают записи постранично и считают на стороне Вайбкод. Если под фильтр попадает больше 5000 записей, результат будет помечен `meta.truncated: true` — берётся только первые 5000. Для точного количества используйте `count` (он работает на любом объёме) или сужайте фильтр.\n\n**Зарезервированные `entityTypeId`.** Значения `1` (лиды), `2` (сделки), `3` (контакты), `4` (компании), `7` (предложения), `31` (счета) обслуживаются специализированными API — используйте [\u002Fv1\u002Fdeals\u002Faggregate](\u002Fdocs\u002Fentities\u002Fdeals\u002Faggregate), [\u002Fv1\u002Fleads\u002Faggregate](\u002Fdocs\u002Fentities\u002Fleads\u002Faggregate), [\u002Fv1\u002Fcontacts\u002Faggregate](\u002Fdocs\u002Fentities\u002Fcontacts\u002Faggregate), [\u002Fv1\u002Fcompanies\u002Faggregate](\u002Fdocs\u002Fentities\u002Fcompanies\u002Faggregate), [\u002Fv1\u002Fquotes\u002Faggregate](\u002Fdocs\u002Fentities\u002Fquotes\u002Faggregate), [\u002Fv1\u002Finvoices\u002Faggregate](\u002Fdocs\u002Fentities\u002Finvoices\u002Faggregate).\n\n## Смотрите также\n\n- [Список смарт-процессов](\u002Fdocs\u002Fentities\u002Fsmart-processes\u002Flist)\n- [Список элементов](\u002Fdocs\u002Fentities\u002Fitems\u002Flist)\n- [Поиск элементов](\u002Fdocs\u002Fentities\u002Fitems\u002Fsearch)\n- [Поля смарт-процесса](\u002Fdocs\u002Fentities\u002Fitems\u002Ffields)\n- [Синтаксис фильтрации](\u002Fdocs\u002Ffiltering)\n- [Лимиты и оптимизация](\u002Fdocs\u002Foptimization)\n","\n## Товарные позиции элемента\n\n`GET \u002Fv1\u002Fitems\u002F:entityTypeId\u002F:id\u002Fproducts`\n\nВозвращает список товарных позиций, привязанных к элементу смарт-процесса.\n\n## Параметры\n\n| Параметр | Тип | Обяз. | Описание |\n|----------|-----|:-----:|---------|\n| `entityTypeId` (path) | number | да | ID типа смарт-процесса |\n| `id` (path) | number | да | ID элемента |\n\n## Примеры\n\n### curl — личный ключ\n\n```bash\ncurl \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fitems\u002F156\u002F741\u002Fproducts\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\"\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fitems\u002F156\u002F741\u002Fproducts\" \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\"\n```\n\n### JavaScript — личный ключ\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fitems\u002F156\u002F741\u002Fproducts', {\n  headers: {\n    'X-Api-Key': 'YOUR_API_KEY',\n  },\n})\n\nconst { success, data } = await res.json()\nconsole.log('Товаров:', data.length)\n```\n\n### JavaScript — OAuth-приложение\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fitems\u002F156\u002F741\u002Fproducts', {\n  headers: {\n    'X-Api-Key': 'YOUR_APP_KEY',\n    'Authorization': 'Bearer USER_SESSION_TOKEN',\n  },\n})\n\nconst { success, data } = await res.json()\n```\n\n## Поля ответа\n\n| Поле | Тип | Описание |\n|------|-----|---------|\n| `data` | array | Массив товарных позиций |\n| `data[].productId` | number | ID товара. Каталог: `GET \u002Fv1\u002Fproducts` |\n| `data[].productName` | string | Название товара |\n| `data[].price` | number | Цена за единицу |\n| `data[].quantity` | number | Количество |\n| `data[].discount` | number | Сумма скидки |\n| `data[].taxRate` | number\u002Fnull | Ставка налога (%) |\n| `data[].taxIncluded` | boolean | Налог включён в цену |\n\nПоказаны основные поля. Полный список — [Поля товаров](\u002Fdocs\u002Fentities\u002Fitems\u002Fproducts-fields).\n\n## Пример ответа\n\n```json\n{\n  \"success\": true,\n  \"data\": [\n    {\n      \"productId\": 1,\n      \"productName\": \"Серверное оборудование\",\n      \"price\": 1000,\n      \"quantity\": 2,\n      \"discount\": 0,\n      \"taxRate\": null,\n      \"taxIncluded\": false\n    }\n  ]\n}\n```\n\n## Пример ответа при ошибке\n\n404 — элемент не найден:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"ENTITY_NOT_FOUND\",\n    \"message\": \"Элемент не найден\"\n  }\n}\n```\n\n## Ошибки\n\n| HTTP | Код | Описание |\n|------|-----|---------|\n| 400 | `INVALID_DYNAMIC_PARAM` | `entityTypeId` не является положительным целым или является зарезервированным (1, 2, 3, 4, 7, 31) |\n| 404 | `ENTITY_NOT_FOUND` | Элемент не найден |\n| 403 | `SCOPE_DENIED` | API-ключ не имеет скоупа `crm` |\n| 401 | `TOKEN_MISSING` | API-ключ не имеет настроенных токенов |\n\nПолный список общих ошибок API — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Смотрите также\n\n- [Установить товары](\u002Fdocs\u002Fentities\u002Fitems\u002Fproducts-set)\n- [Получить элемент](\u002Fdocs\u002Fentities\u002Fitems\u002Fget)\n- [Товары каталога](\u002Fdocs\u002Fentities\u002Fproducts)\n- [Лимиты и оптимизация](\u002Fdocs\u002Foptimization)\n","\n## Установить товары элемента смарт-процесса\n\n`PUT \u002Fv1\u002Fitems\u002F:entityTypeId\u002F:id\u002Fproducts`\n\nУстанавливает товарные позиции элемента смарт-процесса. Полностью заменяет текущий список — передайте все нужные позиции.\n\n## Поля запроса (body)\n\n| Параметр | Тип | Обяз. | Описание |\n|----------|-----|:-----:|---------|\n| `entityTypeId` (path) | number | да | ID типа смарт-процесса |\n| `id` (path) | number | да | ID элемента |\n| `items` | array | да | Массив товарных позиций |\n| `items[].productId` | number | да | ID товара. Каталог: `GET \u002Fv1\u002Fproducts` |\n| `items[].price` | number | да | Цена за единицу |\n| `items[].quantity` | number | да | Количество |\n| `items[].discount` | number | нет | Сумма скидки |\n| `items[].taxRate` | number | нет | Ставка налога (%) |\n| `items[].taxIncluded` | boolean | нет | Налог включён в цену |\n\n## Примеры\n\n### curl — личный ключ\n\n```bash\ncurl -X PUT \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fitems\u002F180\u002F47\u002Fproducts\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"items\": [\n      { \"productId\": 1, \"price\": 25000, \"quantity\": 2 },\n      { \"productId\": 5, \"price\": 5000, \"quantity\": 1, \"discount\": 500 }\n    ]\n  }'\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl -X PUT \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fitems\u002F180\u002F47\u002Fproducts\" \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"items\": [\n      { \"productId\": 1, \"price\": 25000, \"quantity\": 2 },\n      { \"productId\": 5, \"price\": 5000, \"quantity\": 1, \"discount\": 500 }\n    ]\n  }'\n```\n\n### JavaScript — личный ключ\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fitems\u002F180\u002F47\u002Fproducts', {\n  method: 'PUT',\n  headers: {\n    'X-Api-Key': 'YOUR_API_KEY',\n    'Content-Type': 'application\u002Fjson',\n  },\n  body: JSON.stringify({\n    items: [\n      { productId: 1, price: 25000, quantity: 2 },\n      { productId: 5, price: 5000, quantity: 1, discount: 500 },\n    ],\n  }),\n})\n\nconst { success, data } = await res.json()\n```\n\n### JavaScript — OAuth-приложение\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fitems\u002F180\u002F47\u002Fproducts', {\n  method: 'PUT',\n  headers: {\n    'X-Api-Key': 'YOUR_APP_KEY',\n    'Authorization': 'Bearer USER_SESSION_TOKEN',\n    'Content-Type': 'application\u002Fjson',\n  },\n  body: JSON.stringify({\n    items: [\n      { productId: 1, price: 25000, quantity: 2 },\n      { productId: 5, price: 5000, quantity: 1, discount: 500 },\n    ],\n  }),\n})\n\nconst { success, data } = await res.json()\n```\n\n## Поля ответа\n\nМассив установленных позиций с полями `productId`, `productName`, `price`, `quantity`, `discount`, `taxRate`, `taxIncluded`.\n\n## Пример ответа\n\n```json\n{\n  \"success\": true,\n  \"data\": [\n    {\n      \"productId\": 1,\n      \"productName\": \"Серверное оборудование\",\n      \"price\": 25000,\n      \"quantity\": 2,\n      \"discount\": 0,\n      \"taxRate\": null,\n      \"taxIncluded\": false\n    },\n    {\n      \"productId\": 5,\n      \"productName\": \"Установка и настройка\",\n      \"price\": 5000,\n      \"quantity\": 1,\n      \"discount\": 500,\n      \"taxRate\": null,\n      \"taxIncluded\": false\n    }\n  ]\n}\n```\n\n## Пример ответа при ошибке\n\n400 — неверный формат:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"INVALID_PARAMS\",\n    \"message\": \"items must be an array\"\n  }\n}\n```\n\n## Ошибки\n\n| HTTP | Код | Описание |\n|------|-----|---------|\n| 400 | `INVALID_DYNAMIC_PARAM` | `entityTypeId` не является положительным целым или является зарезервированным (1, 2, 3, 4, 7, 31) |\n| 400 | `INVALID_PARAMS` | `items` не является массивом или элемент массива не является объектом товарной строки |\n| 404 | `ENTITY_NOT_FOUND` | Элемент не найден |\n| 403 | `SCOPE_DENIED` | API-ключ не имеет скоупа `crm` |\n| 401 | `TOKEN_MISSING` | API-ключ не имеет настроенных токенов |\n\nПолный список общих ошибок API — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Известные особенности\n\n**Полная замена:** PUT заменяет весь список товаров. Чтобы добавить позицию — сначала получите текущие (`GET`), добавьте новую в массив, отправьте всё (`PUT`).\n\n## Смотрите также\n\n- [Товарные позиции](\u002Fdocs\u002Fentities\u002Fitems\u002Fproducts-get)\n- [Получить элемент](\u002Fdocs\u002Fentities\u002Fitems\u002Fget)\n- [Товары каталога](\u002Fdocs\u002Fentities\u002Fproducts)\n- [Лимиты и оптимизация](\u002Fdocs\u002Foptimization)\n","\n## Добавить товар в элемент смарт-процесса\n\n`POST \u002Fv1\u002Fitems\u002F:entityTypeId\u002F:id\u002Fproducts`\n\nДобавляет одну товарную позицию в элемент смарт-процесса. В отличие от `PUT \u002Fv1\u002Fitems\u002F:entityTypeId\u002F:id\u002Fproducts`, не заменяет существующие позиции.\n\n## Поля запроса (body)\n\n| Параметр | Тип | Обяз. | Описание |\n|----------|-----|:-----:|---------|\n| `entityTypeId` (path) | number | да | ID типа смарт-процесса |\n| `id` (path) | number | да | ID элемента |\n| `productId` | number | нет | ID товара из каталога. Если задан без `productName`, имя подставляется из каталога. Каталог: `GET \u002Fv1\u002Fproducts` |\n| `productName` | string | нет | Название товарной позиции — для произвольной строки без товара из каталога. Укажите хотя бы одно из `productId` \u002F `productName`. |\n| `price` | number | нет | Цена за единицу |\n| `quantity` | number | нет | Количество |\n| `discount` | number | нет | Сумма скидки |\n| `taxRate` | number | нет | Ставка налога (%) |\n| `taxIncluded` | boolean | нет | Налог включён в цену |\n\n## Примеры\n\n### curl — личный ключ\n\n```bash\ncurl -X POST \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fitems\u002F180\u002F47\u002Fproducts\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{ \"productId\": 1, \"price\": 25000, \"quantity\": 2 }'\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl -X POST \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fitems\u002F180\u002F47\u002Fproducts\" \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{ \"productId\": 1, \"price\": 25000, \"quantity\": 2 }'\n```\n\n### JavaScript — личный ключ\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fitems\u002F180\u002F47\u002Fproducts', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': 'YOUR_API_KEY',\n    'Content-Type': 'application\u002Fjson',\n  },\n  body: JSON.stringify({ productId: 1, price: 25000, quantity: 2 }),\n})\n\nconst { success, data } = await res.json()\nconsole.log('ID строки:', data.id)\n```\n\n### JavaScript — OAuth-приложение\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fitems\u002F180\u002F47\u002Fproducts', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': 'YOUR_APP_KEY',\n    'Authorization': 'Bearer USER_SESSION_TOKEN',\n    'Content-Type': 'application\u002Fjson',\n  },\n  body: JSON.stringify({ productId: 1, price: 25000, quantity: 2 }),\n})\n\nconst { success, data } = await res.json()\n```\n\n## Поля ответа\n\n| Поле | Тип | Описание |\n|------|-----|---------|\n| `data` | object | Созданная товарная строка целиком, HTTP-статус `201`. Состав полей — [Поля товаров](\u002Fdocs\u002Fentities\u002Fitems\u002Fproducts-fields) |\n\n## Пример ответа\n\nПоказаны основные поля. Полный список — [Поля товаров](\u002Fdocs\u002Fentities\u002Fitems\u002Fproducts-fields).\n\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"id\": 1465,\n    \"productId\": 1,\n    \"productName\": \"Серверное оборудование\",\n    \"price\": 25000,\n    \"quantity\": 2,\n    \"discount\": 0,\n    \"discountTypeId\": 2,\n    \"taxIncluded\": false\n  }\n}\n```\n\n## Пример ответа при ошибке\n\n404 — элемент не найден:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"ENTITY_NOT_FOUND\",\n    \"message\": \"Элемент не найден\"\n  }\n}\n```\n\n## Ошибки\n\n| HTTP | Код | Описание |\n|------|-----|---------|\n| 400 | `INVALID_DYNAMIC_PARAM` | `entityTypeId` не является положительным целым или является зарезервированным (1, 2, 3, 4, 7, 31) |\n| 400 | `INVALID_PARAMS` | Тело запроса не объект или не содержит распознанных полей товарной строки |\n| 404 | `ENTITY_NOT_FOUND` | Элемент не найден |\n| 403 | `SCOPE_DENIED` | API-ключ не имеет скоупа `crm` |\n| 401 | `TOKEN_MISSING` | API-ключ не имеет настроенных токенов |\n\nПолный список общих ошибок API — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Смотрите также\n\n- [Товарные позиции](\u002Fdocs\u002Fentities\u002Fitems\u002Fproducts-get)\n- [Установить товары](\u002Fdocs\u002Fentities\u002Fitems\u002Fproducts-set)\n- [Удалить товар](\u002Fdocs\u002Fentities\u002Fitems\u002Fproducts-delete)\n- [Товары каталога](\u002Fdocs\u002Fentities\u002Fproducts)\n","\n## Удалить товар из элемента смарт-процесса\n\n`DELETE \u002Fv1\u002Fitems\u002F:entityTypeId\u002F:id\u002Fproducts\u002F:rowId`\n\nУдаляет одну товарную позицию из элемента смарт-процесса по ID строки.\n\n## Параметры\n\n| Параметр | Тип | Обяз. | Описание |\n|----------|-----|:-----:|---------|\n| `entityTypeId` (path) | number | да | ID типа смарт-процесса |\n| `id` (path) | number | да | ID элемента |\n| `rowId` (path) | number | да | ID товарной строки (из ответа add или list) |\n\n`rowId` — это ID товарной строки, а не `productId` из каталога товаров.\n\n## Примеры\n\n### curl — личный ключ\n\n```bash\ncurl -X DELETE \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fitems\u002F180\u002F47\u002Fproducts\u002F1465\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\"\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl -X DELETE \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fitems\u002F180\u002F47\u002Fproducts\u002F1465\" \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\"\n```\n\n### JavaScript — личный ключ\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fitems\u002F180\u002F47\u002Fproducts\u002F1465', {\n  method: 'DELETE',\n  headers: {\n    'X-Api-Key': 'YOUR_API_KEY',\n  },\n})\n\nif (res.status === 204) {\n  console.log('Товар удалён')\n}\n```\n\n### JavaScript — OAuth-приложение\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fitems\u002F180\u002F47\u002Fproducts\u002F1465', {\n  method: 'DELETE',\n  headers: {\n    'X-Api-Key': 'YOUR_APP_KEY',\n    'Authorization': 'Bearer USER_SESSION_TOKEN',\n  },\n})\n\nif (res.status === 204) {\n  console.log('Товар удалён')\n}\n```\n\n## Ответ\n\nПри успешном удалении возвращается HTTP-статус `204 No Content` с пустым телом — признак успеха проверяется по статусу.\n\n## Пример ответа\n\n```\nHTTP\u002F1.1 204 No Content\n```\n\n## Пример ответа при ошибке\n\n404 — элемент не найден:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"ENTITY_NOT_FOUND\",\n    \"message\": \"Элемент не найден\"\n  }\n}\n```\n\n## Ошибки\n\n| HTTP | Код | Описание |\n|------|-----|---------|\n| 400 | `INVALID_DYNAMIC_PARAM` | `entityTypeId` не является положительным целым или является зарезервированным (1, 2, 3, 4, 7, 31) |\n| 400 | `INVALID_ROW_ID` | `rowId` не является положительным целым |\n| 404 | `ENTITY_NOT_FOUND` | Элемент или товарная строка не найдена |\n| 403 | `SCOPE_DENIED` | API-ключ не имеет скоупа `crm` |\n| 401 | `TOKEN_MISSING` | API-ключ не имеет настроенных токенов |\n\nПолный список общих ошибок API — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Смотрите также\n\n- [Товарные позиции](\u002Fdocs\u002Fentities\u002Fitems\u002Fproducts-get)\n- [Добавить товар](\u002Fdocs\u002Fentities\u002Fitems\u002Fproducts-add)\n- [Установить товары](\u002Fdocs\u002Fentities\u002Fitems\u002Fproducts-set)\n- [Товары каталога](\u002Fdocs\u002Fentities\u002Fproducts)\n","\n## Получить товар из элемента\n\n`GET \u002Fv1\u002Fitems\u002F:entityTypeId\u002F:id\u002Fproducts\u002F:rowId`\n\nВозвращает одну товарную позицию элемента по ID строки.\n\n## Параметры\n\n| Параметр | Тип | Обяз. | Описание |\n|----------|-----|:-----:|---------|\n| `entityTypeId` (path) | number | да | ID типа смарт-процесса |\n| `id` (path) | number | да | ID элемента |\n| `rowId` (path) | number | да | ID товарной строки (из ответа add или list) |\n\n`rowId` — это ID товарной строки, а не `productId` из каталога товаров.\n\n## Примеры\n\n### curl — личный ключ\n\n```bash\ncurl -X GET \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fitems\u002F156\u002F741\u002Fproducts\u002F1471\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\"\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl -X GET \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fitems\u002F156\u002F741\u002Fproducts\u002F1471\" \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\"\n```\n\n### JavaScript — личный ключ\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fitems\u002F156\u002F741\u002Fproducts\u002F1471', {\n  headers: {\n    'X-Api-Key': 'YOUR_API_KEY',\n  },\n})\n\nconst { success, data } = await res.json()\nconsole.log('Цена:', data.price)\n```\n\n### JavaScript — OAuth-приложение\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fitems\u002F156\u002F741\u002Fproducts\u002F1471', {\n  headers: {\n    'X-Api-Key': 'YOUR_APP_KEY',\n    'Authorization': 'Bearer USER_SESSION_TOKEN',\n  },\n})\n\nconst { success, data } = await res.json()\n```\n\n## Поля ответа\n\n| Поле | Тип | Описание |\n|------|-----|---------|\n| `data.id` | number | ID товарной строки |\n| `data.productId` | number | ID товара. Каталог: `GET \u002Fv1\u002Fproducts` |\n| `data.productName` | string | Название товара |\n| `data.price` | number | Цена за единицу |\n| `data.quantity` | number | Количество |\n| `data.discount` | number | Сумма скидки |\n| `data.discountRate` | number | Процент скидки |\n| `data.discountTypeId` | number | Тип скидки (1 — сумма, 2 — процент) |\n| `data.taxRate` | number \\| null | Ставка налога (%) |\n| `data.taxIncluded` | boolean | Налог включён в цену |\n| `data.priceExclusive` | number | Цена без налога со скидкой |\n| `data.priceNetto` | number | Цена нетто |\n| `data.priceBrutto` | number | Цена брутто |\n| `data.priceAccount` | number | Цена в валюте учёта |\n| `data.measureCode` | number | Код единицы измерения |\n| `data.measureName` | string | Название единицы измерения |\n| `data.sort` | number | Сортировка |\n\n## Пример ответа\n\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"id\": 1471,\n    \"productId\": 1,\n    \"productName\": \"День добрый!\",\n    \"price\": 5000,\n    \"priceAccount\": 5000,\n    \"priceExclusive\": 5000,\n    \"priceNetto\": 5000,\n    \"priceBrutto\": 5000,\n    \"quantity\": 3,\n    \"discountTypeId\": 2,\n    \"discountRate\": 0,\n    \"discount\": 0,\n    \"taxRate\": null,\n    \"taxIncluded\": false,\n    \"customized\": \"Y\",\n    \"measureCode\": 796,\n    \"measureName\": \"шт\",\n    \"sort\": 0,\n    \"xmlId\": \"sale_basket_995\",\n    \"type\": 1\n  }\n}\n```\n\n## Пример ответа при ошибке\n\n404 — элемент или товарная строка не найден:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"ENTITY_NOT_FOUND\",\n    \"message\": \"Элемент не найден\"\n  }\n}\n```\n\n## Ошибки\n\n| HTTP | Код | Описание |\n|------|-----|---------|\n| 400 | `INVALID_DYNAMIC_PARAM` | `entityTypeId` не является положительным целым или является зарезервированным (1, 2, 3, 4, 7, 31) |\n| 400 | `INVALID_ROW_ID` | `rowId` не является положительным целым |\n| 404 | `ENTITY_NOT_FOUND` | Элемент или товарная строка не найдена |\n| 404 | `NOT_FOUND` | Битрикс24 вернул успех, но товарная строка отсутствует (`Product row not found`) |\n| 403 | `SCOPE_DENIED` | API-ключ не имеет скоупа `crm` |\n| 401 | `TOKEN_MISSING` | API-ключ не имеет настроенных токенов |\n\nПолный список общих ошибок API — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Смотрите также\n\n- [Товарные позиции](\u002Fdocs\u002Fentities\u002Fitems\u002Fproducts-get)\n- [Обновить товар](\u002Fdocs\u002Fentities\u002Fitems\u002Fproducts-update)\n- [Добавить товар](\u002Fdocs\u002Fentities\u002Fitems\u002Fproducts-add)\n- [Удалить товар](\u002Fdocs\u002Fentities\u002Fitems\u002Fproducts-delete)\n- [Товары каталога](\u002Fdocs\u002Fentities\u002Fproducts)\n","\n## Обновить товар элемента\n\n`PATCH \u002Fv1\u002Fitems\u002F:entityTypeId\u002F:id\u002Fproducts\u002F:rowId`\n\nОбновляет товарную позицию элемента. Передайте только изменяемые поля.\n\n## Параметры\n\n| Параметр | Тип | Обяз. | Описание |\n|----------|-----|:-----:|---------|\n| `entityTypeId` (path) | number | да | ID типа смарт-процесса |\n| `id` (path) | number | да | ID элемента |\n| `rowId` (path) | number | да | ID товарной позиции (из ответа list или add, не productId из каталога) |\n\n## Поля запроса (body)\n\n| Параметр | Тип | Описание |\n|----------|-----|---------|\n| `price` | number | Цена за единицу |\n| `quantity` | number | Количество |\n| `productId` | number | ID товара. Каталог: `GET \u002Fv1\u002Fproducts` |\n| `discount` | number | Сумма скидки |\n| `taxRate` | number | Ставка налога (%) |\n| `taxIncluded` | boolean | Налог включён в цену |\n| `sort` | number | Сортировка |\n\n## Примеры\n\n### curl — личный ключ\n\n```bash\ncurl -X PATCH \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fitems\u002F156\u002F741\u002Fproducts\u002F1471\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{ \"price\": 9999, \"quantity\": 10 }'\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl -X PATCH \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fitems\u002F156\u002F741\u002Fproducts\u002F1471\" \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{ \"price\": 9999, \"quantity\": 10 }'\n```\n\n### JavaScript — личный ключ\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fitems\u002F156\u002F741\u002Fproducts\u002F1471', {\n  method: 'PATCH',\n  headers: {\n    'X-Api-Key': 'YOUR_API_KEY',\n    'Content-Type': 'application\u002Fjson',\n  },\n  body: JSON.stringify({ price: 9999, quantity: 10 }),\n})\n\nconst { success, data } = await res.json()\nconsole.log('Обновлено:', data.price, 'x', data.quantity)\n```\n\n### JavaScript — OAuth-приложение\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fitems\u002F156\u002F741\u002Fproducts\u002F1471', {\n  method: 'PATCH',\n  headers: {\n    'X-Api-Key': 'YOUR_APP_KEY',\n    'Authorization': 'Bearer USER_SESSION_TOKEN',\n    'Content-Type': 'application\u002Fjson',\n  },\n  body: JSON.stringify({ price: 9999, quantity: 10 }),\n})\n\nconst { success, data } = await res.json()\n```\n\n## Поля ответа\n\nОбновлённый объект товарной позиции: `id`, `productId`, `productName`, `price`, `quantity`, `discount`, `taxRate`, `taxIncluded`.\n\n## Пример ответа\n\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"id\": 1471,\n    \"productId\": 1,\n    \"productName\": \"Серверное оборудование\",\n    \"price\": 9999,\n    \"quantity\": 10,\n    \"discount\": 0,\n    \"taxRate\": null,\n    \"taxIncluded\": false\n  }\n}\n```\n\n## Пример ответа при ошибке\n\n404 — позиция не найдена:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"ENTITY_NOT_FOUND\",\n    \"message\": \"Элемент не найден\"\n  }\n}\n```\n\n## Ошибки\n\n| HTTP | Код | Описание |\n|------|-----|---------|\n| 400 | `INVALID_DYNAMIC_PARAM` | `entityTypeId` не является положительным целым или является зарезервированным (1, 2, 3, 4, 7, 31) |\n| 400 | `INVALID_ROW_ID` | `rowId` не является положительным целым |\n| 400 | `INVALID_PARAMS` | Тело запроса не объект или не содержит распознанных полей товарной строки |\n| 404 | `ENTITY_NOT_FOUND` | Позиция не найдена |\n| 403 | `SCOPE_DENIED` | API-ключ не имеет скоупа `crm` |\n| 401 | `TOKEN_MISSING` | API-ключ не имеет настроенных токенов |\n\nПолный список общих ошибок API — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Смотрите также\n\n- [Получить товар](\u002Fdocs\u002Fentities\u002Fitems\u002Fproducts-get-single)\n- [Получить товары](\u002Fdocs\u002Fentities\u002Fitems\u002Fproducts-get)\n- [Добавить товар](\u002Fdocs\u002Fentities\u002Fitems\u002Fproducts-add)\n- [Лимиты и оптимизация](\u002Fdocs\u002Foptimization)\n","\n## Поля товаров элемента\n\n`GET \u002Fv1\u002Fitems\u002F:entityTypeId\u002F:id\u002Fproducts\u002Ffields`\n\nВозвращает описание полей товарных позиций элемента: названия, типы, доступность для чтения и записи.\n\n## Параметры\n\n| Параметр | Тип | Обяз. | Описание |\n|----------|-----|:-----:|---------|\n| `entityTypeId` (path) | number | да | ID типа смарт-процесса |\n| `id` (path) | number | да | ID элемента |\n\n## Примеры\n\n### curl — личный ключ\n\n```bash\ncurl \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fitems\u002F156\u002F741\u002Fproducts\u002Ffields\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\"\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fitems\u002F156\u002F741\u002Fproducts\u002Ffields\" \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\"\n```\n\n### JavaScript — личный ключ\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fitems\u002F156\u002F741\u002Fproducts\u002Ffields', {\n  headers: {\n    'X-Api-Key': 'YOUR_API_KEY',\n  },\n})\n\nconst { success, data } = await res.json()\nconsole.log('Полей:', Object.keys(data).length)\n```\n\n### JavaScript — OAuth-приложение\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fitems\u002F156\u002F741\u002Fproducts\u002Ffields', {\n  headers: {\n    'X-Api-Key': 'YOUR_APP_KEY',\n    'Authorization': 'Bearer USER_SESSION_TOKEN',\n  },\n})\n\nconst { success, data } = await res.json()\n```\n\n## Поля ответа\n\n| Поле | Тип | RO | Обяз. | Описание |\n|------|-----|:--:|:-----:|---------|\n| `id` | integer | да | | ID позиции |\n| `productId` | integer | | да | ID товара. Каталог: `GET \u002Fv1\u002Fproducts` |\n| `productName` | string | | | Название товара |\n| `price` | double | | | Цена |\n| `quantity` | double | | | Количество |\n| `discountSum` | double | | | Сумма скидки |\n| `discountRate` | double | | | Величина скидки (%) |\n| `discountTypeId` | integer | | | Тип скидки |\n| `taxRate` | double | | | Налог (%) |\n| `taxIncluded` | char | | | Налог включён в цену (`Y`\u002F`N`) |\n| `priceExclusive` | double | да | | Цена без налога со скидкой |\n| `priceNetto` | double | да | | Цена нетто |\n| `priceBrutto` | double | да | | Цена брутто |\n| `measureCode` | integer | | | Код единицы измерения |\n| `measureName` | string | | | Единица измерения |\n| `customized` | char | | | Изменён (`Y`\u002F`N`) |\n| `sort` | integer | | | Сортировка |\n| `type` | integer | да | | Тип |\n| `storeId` | integer | да | | ID склада |\n| `ownerId` | integer | | да | ID владельца (элемента) |\n| `ownerType` | string | | да | Тип владельца |\n\n## Пример ответа\n\nПоказаны 6 полей из 21. Каждое поле описано ключами `type`, `isRequired`, `isReadOnly`, `isImmutable`, `isMultiple`, `isDynamic`, `title`. Полный список полей — в таблице выше.\n\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"id\": { \"type\": \"integer\", \"isRequired\": false, \"isReadOnly\": true, \"isImmutable\": false, \"isMultiple\": false, \"isDynamic\": false, \"title\": \"ID\" },\n    \"ownerId\": { \"type\": \"integer\", \"isRequired\": true, \"isReadOnly\": false, \"isImmutable\": true, \"isMultiple\": false, \"isDynamic\": false, \"title\": \"ID владельца\" },\n    \"ownerType\": { \"type\": \"string\", \"isRequired\": true, \"isReadOnly\": false, \"isImmutable\": true, \"isMultiple\": false, \"isDynamic\": false, \"title\": \"Тип владельца\" },\n    \"productId\": { \"type\": \"integer\", \"isRequired\": true, \"isReadOnly\": false, \"isImmutable\": false, \"isMultiple\": false, \"isDynamic\": false, \"title\": \"Товар\" },\n    \"price\": { \"type\": \"double\", \"isRequired\": false, \"isReadOnly\": false, \"isImmutable\": false, \"isMultiple\": false, \"isDynamic\": false, \"title\": \"Цена\" },\n    \"priceExclusive\": { \"type\": \"double\", \"isRequired\": false, \"isReadOnly\": true, \"isImmutable\": false, \"isMultiple\": false, \"isDynamic\": false, \"title\": \"Цена без налога со скидкой\" }\n  }\n}\n```\n\n## Пример ответа при ошибке\n\n404 — элемент не найден:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"ENTITY_NOT_FOUND\",\n    \"message\": \"Элемент не найден\"\n  }\n}\n```\n\n## Ошибки\n\n| HTTP | Код | Описание |\n|------|-----|---------|\n| 400 | `INVALID_DYNAMIC_PARAM` | `entityTypeId` не является положительным целым или является зарезервированным (1, 2, 3, 4, 7, 31) |\n| 404 | `ENTITY_NOT_FOUND` | Элемент не найден |\n| 403 | `SCOPE_DENIED` | API-ключ не имеет скоупа `crm` |\n| 401 | `TOKEN_MISSING` | API-ключ не имеет настроенных токенов |\n\nПолный список общих ошибок API — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Смотрите также\n\n- [Товарные позиции](\u002Fdocs\u002Fentities\u002Fitems\u002Fproducts-get)\n- [Добавить товар](\u002Fdocs\u002Fentities\u002Fitems\u002Fproducts-add)\n- [Установить товары](\u002Fdocs\u002Fentities\u002Fitems\u002Fproducts-set)\n- [Поля элемента](\u002Fdocs\u002Fentities\u002Fitems\u002Ffields)\n"]