[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"docs-entities\u002Fworkgroups":3,"docs-tabs-entities\u002Fworkgroups":6},{"content":4,"lastmod":5},"# Рабочие группы\n\nУправление рабочими группами и проектами портала: создание, получение, обновление, удаление, поиск. Рабочая группа объединяет сотрудников вокруг общей темы или проекта — у неё есть владелец, тема, флаги открытости и архивирования, а также счётчик участников.\n\nБитрикс24 API: `sonet_group.*`\nСкоуп: `sonet_group`\n\n## Операции\n\n- [Создать рабочую группу](.\u002Fworkgroups\u002Fcreate.md) — `POST \u002Fv1\u002Fworkgroups`\n- [Список рабочих групп](.\u002Fworkgroups\u002Flist.md) — `GET \u002Fv1\u002Fworkgroups`\n- [Получить рабочую группу](.\u002Fworkgroups\u002Fget.md) — `GET \u002Fv1\u002Fworkgroups\u002F:id`\n- [Обновить рабочую группу](.\u002Fworkgroups\u002Fupdate.md) — `PATCH \u002Fv1\u002Fworkgroups\u002F:id`\n- [Удалить рабочую группу](.\u002Fworkgroups\u002Fdelete.md) — `DELETE \u002Fv1\u002Fworkgroups\u002F:id`\n- [Поиск рабочих групп](.\u002Fworkgroups\u002Fsearch.md) — `POST \u002Fv1\u002Fworkgroups\u002Fsearch`\n- [Поля рабочей группы](.\u002Fworkgroups\u002Ffields.md) — `GET \u002Fv1\u002Fworkgroups\u002Ffields`\n- [Агрегация рабочих групп](.\u002Fworkgroups\u002Faggregate.md) — `POST \u002Fv1\u002Fworkgroups\u002Faggregate`\n\n## Ключевые поля\n\n| Поле | Описание |\n|------|---------|\n| `name` | Название рабочей группы |\n| `ownerId` | Идентификатор владельца. Источник: [`GET \u002Fv1\u002Fusers`](\u002Fdocs\u002Fentities\u002Fusers) |\n| `subjectId` | Идентификатор темы. Список допустимых значений отдаётся в ответах [`GET \u002Fv1\u002Fworkgroups`](.\u002Fworkgroups\u002Flist.md) в поле `subjectName` рядом с `subjectId` |\n| `opened` | Признак открытости — может ли вступить любой сотрудник портала |\n| `isProject` | Признак проекта — у проектов отдельная семантика в задачах и отчётах |\n| `archived` | Признак архива — группа скрыта из активных списков, но сохранена |\n| `membersCount` | Текущее количество участников группы |\n\nПолный список полей — [`GET \u002Fv1\u002Fworkgroups\u002Ffields`](.\u002Fworkgroups\u002Ffields.md).\n\n## Что нужно знать перед работой\n\n1. **Булевы поля имеют разный формат на входе и в ответе.** В URL-фильтрах (`?filter[active]=...`) булевы поля передаются как `Y` или `N`. В теле запросов `POST` \u002F `PATCH` и в body `POST \u002Fv1\u002Fworkgroups\u002Fsearch` работают и `Y` \u002F `N`, и нативные JSON `true` \u002F `false`. В ответах всех эндпоинтов — всегда `true` \u002F `false`.\n2. **`archived` и `active` — разные признаки.** `archived: true` означает, что группа перенесена в архив и не отображается в активных списках. `active: false` означает, что группа выключена. Это два независимых состояния.\n3. **`isProject: true` — отдельная семантика.** Проектные группы по-другому ведут себя в задачах и отчётах Битрикс24. Чтобы создать обычную рабочую группу без проектной логики, оставьте `isProject` пустым или передайте `false`.\n4. **Темы задаются на стороне портала.** Перечень допустимых `subjectId` настраивается администратором Битрикс24 и не редактируется через API рабочих групп. Сопоставление `subjectId` ↔ `subjectName` возвращается в каждом элементе списка рабочих групп.\n\n## Типичный сценарий\n\n1. Найти будущего владельца группы: [`GET \u002Fv1\u002Fusers?filter[name]=Иван`](\u002Fdocs\u002Fentities\u002Fusers).\n2. Создать рабочую группу: [`POST \u002Fv1\u002Fworkgroups`](.\u002Fworkgroups\u002Fcreate.md) с `name`, `ownerId`, `subjectId`, `opened`.\n3. Получить список рабочих групп сотрудника: [`GET \u002Fv1\u002Fworkgroups?filter[ownerId]=15`](.\u002Fworkgroups\u002Flist.md).\n4. Обновить параметры: [`PATCH \u002Fv1\u002Fworkgroups\u002F:id`](.\u002Fworkgroups\u002Fupdate.md) — например, переключить `opened` или изменить `description`.\n5. Перенести группу в архив: [`PATCH \u002Fv1\u002Fworkgroups\u002F:id`](.\u002Fworkgroups\u002Fupdate.md) с `archived: true`.\n\n## Лимиты\n\n| Лимит | Значение |\n|-------|----------|\n| Максимум записей на запрос | 5000 (`limit ≤ 5000`) |\n| Авто-пагинация | включается при `limit > 50` |\n| `offset` на больших выборках | рекомендуется `limit ≤ 500` при `offset ≥ 2500` |\n| Batch-запросы | до 50 операций в [`POST \u002Fv1\u002Fbatch`](\u002Fdocs\u002Fbatch) |\n| Ограничение частоты запросов | общее для API Вайбкод — см. [Лимиты и оптимизация](\u002Fdocs\u002Foptimization) |\n\n## Смотрите также\n\n- [Справочник сущностей](\u002Fdocs\u002Fentities-index)\n- [Синтаксис фильтрации](\u002Fdocs\u002Ffiltering)\n- [Batch](\u002Fdocs\u002Fbatch)\n- [Сотрудники](\u002Fdocs\u002Fentities\u002Fusers)\n- [Отделы](\u002Fdocs\u002Fentities\u002Fdepartments)\n","2026-07-01",{"workgroups\u002Fcreate.md":7,"workgroups\u002Flist.md":8,"workgroups\u002Fget.md":9,"workgroups\u002Fupdate.md":10,"workgroups\u002Fdelete.md":11,"workgroups\u002Fsearch.md":12,"workgroups\u002Ffields.md":13,"workgroups\u002Faggregate.md":14},"\n## Создать рабочую группу\n\n`POST \u002Fv1\u002Fworkgroups`\n\nСоздаёт новую рабочую группу на портале. Возвращает полный объект созданной группы. Обязательное поле одно — `name`; остальные параметры опциональны.\n\n## Поля запроса (body)\n\n| Поле | Тип | Обяз. | По умолч. | Описание |\n|------|-----|:-----:|-----------|---------|\n| `name` | string | ★ | — | Название рабочей группы |\n| `description` | string | нет | — | Описание |\n| `ownerId` | number | нет | текущий пользователь ключа | Идентификатор владельца группы. Список: `GET \u002Fv1\u002Fusers` |\n| `subjectId` | number | нет | тема портала по умолчанию | Идентификатор темы |\n| `active` | boolean | нет | `true` | Активна ли группа |\n| `visible` | boolean | нет | `true` | Видна ли в общих списках |\n| `opened` | boolean | нет | `false` | Открыта ли для вступления без приглашения |\n| `archived` | boolean | нет | `false` | Поместить в архив сразу при создании |\n| `isProject` | boolean | нет | `false` | Создать как проект |\n| `isExtranet` | boolean | нет | `false` | Группа экстранета |\n| `keywords` | string | нет | — | Ключевые слова для поиска |\n\n## Примеры\n\n### curl — личный ключ\n\n```bash\ncurl -X POST \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fworkgroups\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"name\": \"Маркетинг 2026\",\n    \"description\": \"Координация рекламных кампаний\",\n    \"opened\": true,\n    \"isProject\": false\n  }'\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl -X POST \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fworkgroups\" \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"name\": \"Маркетинг 2026\",\n    \"description\": \"Координация рекламных кампаний\",\n    \"opened\": true,\n    \"isProject\": false\n  }'\n```\n\n### JavaScript — личный ключ\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fworkgroups', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': 'YOUR_API_KEY',\n    'Content-Type': 'application\u002Fjson',\n  },\n  body: JSON.stringify({\n    name: 'Маркетинг 2026',\n    description: 'Координация рекламных кампаний',\n    opened: true,\n    isProject: false,\n  }),\n})\n\nconst { success, data } = await res.json()\nconsole.log('Workgroup ID:', data.id)\n```\n\n### JavaScript — OAuth-приложение\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fworkgroups', {\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    name: 'Маркетинг 2026',\n    description: 'Координация рекламных кампаний',\n    opened: true,\n    isProject: false,\n  }),\n})\n\nconst { success, data } = await res.json()\n```\n\n## Поля ответа\n\nВозвращается полный объект созданной рабочей группы.\n\n| Поле | Тип | Описание |\n|------|-----|---------|\n| `success` | boolean | Всегда `true` при успехе |\n| `data` | object | Объект созданной рабочей группы. Полное описание полей — [Получить рабочую группу](.\u002Fget.md) или [Поля рабочей группы](.\u002Ffields.md) |\n\n## Пример ответа\n\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"id\": 173,\n    \"siteId\": \"s1\",\n    \"name\": \"Маркетинг 2026\",\n    \"description\": \"Координация рекламных кампаний\",\n    \"dateCreate\": \"2026-05-26T05:56:40.000Z\",\n    \"dateUpdate\": \"2026-05-26T05:56:40.000Z\",\n    \"active\": true,\n    \"visible\": true,\n    \"opened\": true,\n    \"archived\": false,\n    \"subjectId\": 1,\n    \"ownerId\": 1,\n    \"keywords\": null,\n    \"membersCount\": 1,\n    \"dateActivity\": \"2026-05-26T05:56:40.000Z\",\n    \"subjectName\": \"Рабочие группы\",\n    \"isProject\": false,\n    \"isExtranet\": false\n  }\n}\n```\n\n## Пример ответа при ошибке\n\n422 — не передано обязательное поле `name`:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"BITRIX_ERROR\",\n    \"message\": \"Не указано название\"\n  }\n}\n```\n\n## Ошибки\n\n| HTTP | `error.code` | Описание |\n|------|--------------|---------|\n| 422 | `BITRIX_ERROR` | Битрикс24 отказал в создании группы — текст причины в `error.message`. Типичная причина: отсутствует обязательное поле `name` |\n| 401 | `MISSING_API_KEY` | Не передан заголовок `X-Api-Key` |\n| 401 | `INVALID_API_KEY` | Переданный ключ не распознан |\n| 403 | `SCOPE_DENIED` | У ключа нет скоупа `sonet_group` |\n\nПолный список общих ошибок API — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Смотрите также\n\n- [Список рабочих групп](.\u002Flist.md)\n- [Получить рабочую группу](.\u002Fget.md)\n- [Обновить рабочую группу](.\u002Fupdate.md)\n- [Поля рабочей группы](.\u002Ffields.md)\n","\n## Список рабочих групп\n\n`GET \u002Fv1\u002Fworkgroups`\n\nВозвращает список рабочих групп портала с поддержкой фильтрации, сортировки и автоматической пагинации.\n\n## Параметры\n\n| Параметр | Тип | Обяз. | По умолч. | Описание |\n|----------|-----|:-----:|-----------|---------|\n| `filter` (query) | object | нет | — | Фильтрация по полям [GET \u002Fv1\u002Fworkgroups\u002Ffields](.\u002Ffields.md).\u003Cbr>[Синтаксис фильтрации](\u002Fdocs\u002Ffiltering). Пример: `?filter[archived]=N` |\n| `select` (query) | array | нет | — | Список полей в ответе. Имена — из [GET \u002Fv1\u002Fworkgroups\u002Ffields](.\u002Ffields.md). |\n| `sort` (query) | object | нет | — | Сортировка: `sort[\u003Cполе>]=ASC\\|DESC`. Пример: `?sort[dateCreate]=DESC`. |\n| `limit` (query) | number | нет | `50` | Максимум записей в ответе. Допустимо до 5000. |\n| `offset` (query) | number | нет | `0` | Смещение от начала выборки. |\n\nДля `limit > 50` Вайбкод автоматически пагинирует запрос на стороне сервера. Максимум — 5000 записей за вызов. Если под фильтр попадает больше — `meta.hasMore` придёт `true`.\n\n### Получить только проекты\n\nВ одной коллекции хранятся и рабочие группы, и проекты. Поле `isProject` различает их: `true` — проект, `false` — обычная рабочая группа. Для выборки проектов передавайте `filter[isProject]=Y`.\n\n## Примеры\n\n### curl — личный ключ\n\n```bash\ncurl \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fworkgroups?limit=3\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\"\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fworkgroups?limit=3\" \\\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\u002Fworkgroups?limit=3', {\n  headers: {\n    'X-Api-Key': 'YOUR_API_KEY',\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\u002Fworkgroups?limit=3', {\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| Поле | Тип | Описание |\n|------|-----|---------|\n| `success` | boolean | Всегда `true` при успехе |\n| `data` | array | Массив рабочих групп (все поля — см. [Поля рабочей группы](.\u002Ffields.md)) |\n| `meta.total` | number | Общее количество записей, соответствующих фильтру |\n| `meta.hasMore` | boolean | Есть ли ещё записи за пределами `limit` |\n\n## Пример ответа\n\n```json\n{\n  \"success\": true,\n  \"data\": [\n    {\n      \"id\": 85,\n      \"siteId\": \"s1\",\n      \"name\": \"Маркетинг 2026\",\n      \"description\": null,\n      \"dateCreate\": \"2026-03-20T06:45:10.000Z\",\n      \"dateUpdate\": \"2026-03-20T06:45:10.000Z\",\n      \"active\": true,\n      \"visible\": true,\n      \"opened\": false,\n      \"archived\": false,\n      \"subjectId\": 1,\n      \"ownerId\": 1271,\n      \"keywords\": null,\n      \"membersCount\": 2,\n      \"dateActivity\": \"2026-03-20T06:45:10.000Z\",\n      \"subjectName\": \"Рабочие группы\",\n      \"isProject\": true,\n      \"isExtranet\": false\n    },\n    {\n      \"id\": 83,\n      \"siteId\": \"s1\",\n      \"name\": \"Команда разработки нового продукта\",\n      \"description\": null,\n      \"dateCreate\": \"2026-03-20T06:41:07.000Z\",\n      \"dateUpdate\": \"2026-03-20T06:41:07.000Z\",\n      \"active\": true,\n      \"visible\": true,\n      \"opened\": false,\n      \"archived\": false,\n      \"subjectId\": 1,\n      \"ownerId\": 1269,\n      \"keywords\": null,\n      \"membersCount\": 1,\n      \"dateActivity\": \"2026-03-20T06:41:07.000Z\",\n      \"subjectName\": \"Рабочие группы\",\n      \"isProject\": true,\n      \"imageUrl\": \"https:\u002F\u002Fcdn-ru.bitrix24.ru\u002Fexample\u002Fdisk\u002Favatar.jpg\",\n      \"isExtranet\": false\n    },\n    {\n      \"id\": 81,\n      \"siteId\": \"s1\",\n      \"name\": \"Запуск регионального офиса\",\n      \"description\": null,\n      \"dateCreate\": \"2026-03-20T06:29:07.000Z\",\n      \"dateUpdate\": \"2026-03-20T06:29:07.000Z\",\n      \"active\": true,\n      \"visible\": true,\n      \"opened\": false,\n      \"archived\": false,\n      \"subjectId\": 1,\n      \"ownerId\": 1271,\n      \"keywords\": null,\n      \"membersCount\": 1,\n      \"dateActivity\": \"2026-03-20T06:29:07.000Z\",\n      \"subjectName\": \"Рабочие группы\",\n      \"isProject\": true,\n      \"isExtranet\": false\n    }\n  ],\n  \"meta\": {\n    \"total\": 33,\n    \"hasMore\": true\n  }\n}\n```\n\n## Пример ответа при ошибке\n\n401 — нет ключа авторизации:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"MISSING_API_KEY\",\n    \"message\": \"API key required. Pass via X-Api-Key header.\"\n  }\n}\n```\n\n## Ошибки\n\n| HTTP | Код | Описание |\n|------|-----|---------|\n| 401 | `MISSING_API_KEY` | Не передан заголовок `X-Api-Key` |\n| 401 | `INVALID_API_KEY` | Переданный ключ не распознан |\n| 403 | `SCOPE_DENIED` | Ключу не хватает скоупа `sonet_group` |\n| 429 | `RATE_LIMITED` | Превышен лимит запросов |\n\nПолный список общих ошибок API — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Известные особенности\n\n**Логические поля в фильтре принимают `Y` \u002F `N`.** В ответе те же поля приходят как `true` \u002F `false`, но при фильтрации используйте `filter[active]=Y` \u002F `filter[archived]=N`. Значения `true` \u002F `false` в фильтре не дадут совпадений и не вызовут ошибку.\n\n**Префикс `%` в имени поля — поиск по подстроке.** `?filter[%name]=Маркетинг` найдёт все группы, в названии которых встречается «Маркетинг». Без префикса фильтр требует точного совпадения.\n\n**`limit = 0` возвращает все записи**, а не пустой массив. Для пустой выборки используйте фильтр, который заведомо ничего не находит.\n\n## Смотрите также\n\n- [Поля рабочей группы](.\u002Ffields.md)\n- [Синтаксис фильтрации](\u002Fdocs\u002Ffiltering)\n- [Entity API](\u002Fdocs\u002Fentity-api)\n- [Batch](\u002Fdocs\u002Fbatch)\n- [Лимиты и оптимизация](\u002Fdocs\u002Foptimization)\n","\n## Получить рабочую группу\n\n`GET \u002Fv1\u002Fworkgroups\u002F:id`\n\nВозвращает рабочую группу по идентификатору со всеми её полями.\n\n## Параметры\n\n| Параметр | Тип | Обяз. | По умолч. | Описание |\n|----------|-----|:-----:|-----------|---------|\n| `id` (path) | number | ★ да | — | Идентификатор рабочей группы. Список: [`GET \u002Fv1\u002Fworkgroups`](.\u002Flist.md) |\n\n## Примеры\n\n### curl — личный ключ\n\n```bash\ncurl \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fworkgroups\u002F85\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\"\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fworkgroups\u002F85\" \\\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\u002Fworkgroups\u002F85', {\n  headers: {\n    'X-Api-Key': 'YOUR_API_KEY',\n  },\n})\n\nconst { success, data } = await res.json()\nconsole.log('Группа:', data.name, '— участников:', data.membersCount)\n```\n\n### JavaScript — OAuth-приложение\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fworkgroups\u002F85', {\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| `success` | boolean | Всегда `true` при успехе |\n| `data.id` | number | Идентификатор рабочей группы (только чтение) |\n| `data.name` | string | Название |\n| `data.description` | string \\| null | Описание |\n| `data.active` | boolean | Активна ли группа |\n| `data.visible` | boolean | Видна ли группа в общих списках |\n| `data.opened` | boolean | Открыта ли для вступления без приглашения |\n| `data.ownerId` | number | Идентификатор владельца (ответственного). Список: [`GET \u002Fv1\u002Fusers`](\u002Fdocs\u002Fentities\u002Fusers) |\n| `data.subjectId` | number | Идентификатор темы |\n| `data.subjectName` | string | Название темы (только чтение) |\n| `data.membersCount` | number | Количество участников (только чтение) |\n| `data.dateCreate` | string | Дата создания, ISO 8601 (только чтение) |\n| `data.dateUpdate` | string | Дата последнего обновления, ISO 8601 (только чтение) |\n| `data.dateActivity` | string | Дата последней активности, ISO 8601 (только чтение) |\n| `data.archived` | boolean | Помещена ли в архив |\n| `data.isProject` | boolean | Является ли проектом с задачами и сроками |\n| `data.isExtranet` | boolean | Группа экстранета — с доступом для внешних пользователей |\n| `data.keywords` | string \\| null | Ключевые слова |\n| `data.siteId` | string | Идентификатор сайта портала, для основного сайта — `s1` (только чтение) |\n| `data.imageUrl` | string \\| null | URL аватара группы (только чтение) |\n\n## Пример ответа\n\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"id\": 85,\n    \"siteId\": \"s1\",\n    \"name\": \"Команда разработки нового продукта\",\n    \"description\": \"Внутренний проект инфраструктуры\",\n    \"dateCreate\": \"2026-03-20T06:45:10.000Z\",\n    \"dateUpdate\": \"2026-03-20T06:45:10.000Z\",\n    \"active\": true,\n    \"visible\": true,\n    \"opened\": false,\n    \"archived\": false,\n    \"subjectId\": 1,\n    \"ownerId\": 1271,\n    \"keywords\": null,\n    \"membersCount\": 2,\n    \"dateActivity\": \"2026-03-20T06:45:10.000Z\",\n    \"subjectName\": \"Рабочие группы\",\n    \"isProject\": true,\n    \"isExtranet\": false,\n    \"imageUrl\": null\n  }\n}\n```\n\n## Пример ответа при ошибке\n\n404 — рабочая группа с таким id не существует:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"ENTITY_NOT_FOUND\",\n    \"message\": \"workgroup 999999 not found\"\n  }\n}\n```\n\n## Ошибки\n\n| HTTP | Код | Описание |\n|------|-----|---------|\n| 404 | `ENTITY_NOT_FOUND` | Рабочая группа с указанным `id` не найдена |\n| 401 | `MISSING_API_KEY` | Не передан `X-Api-Key` |\n| 401 | `INVALID_API_KEY` | Передан некорректный ключ |\n| 403 | `SCOPE_DENIED` | Ключу не хватает скоупа `sonet_group` |\n\nПолный список общих ошибок API — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Известные особенности\n\n- Нечисловой `id` (например `abc`) возвращает `404 ENTITY_NOT_FOUND`, а не `400` — учитывайте это при обработке ошибок валидации на клиенте.\n- Чтобы сменить тему рабочей группы, передавайте числовой `subjectId` в [`PATCH \u002Fv1\u002Fworkgroups\u002F:id`](.\u002Fupdate.md). Поле `subjectName` доступно только для чтения — попытка передать его в теле PATCH вернёт `400 READONLY_FIELD`.\n\n## Смотрите также\n\n- [Список рабочих групп](.\u002Flist.md)\n- [Создать рабочую группу](.\u002Fcreate.md)\n- [Обновить рабочую группу](.\u002Fupdate.md)\n- [Удалить рабочую группу](.\u002Fdelete.md)\n- [Поля рабочей группы](.\u002Ffields.md)\n","\n## Обновить рабочую группу\n\n`PATCH \u002Fv1\u002Fworkgroups\u002F:id`\n\nОбновляет указанные поля рабочей группы. Возвращает полный объект группы после обновления. Неупомянутые в теле поля остаются без изменений.\n\n## Параметры\n\n| Параметр | Тип | Обяз. | Описание |\n|----------|-----|:-----:|---------|\n| `id` (path) | number | ★ | Идентификатор рабочей группы. Список: [`GET \u002Fv1\u002Fworkgroups`](.\u002Flist.md) |\n\n## Поля запроса (body)\n\nПередавайте только те поля, которые нужно изменить. Остальные сохраняют текущие значения.\n\n| Поле | Тип | Обяз. | По умолч. | Описание |\n|------|-----|:-----:|-----------|---------|\n| `name` | string | нет | текущее значение | Название рабочей группы |\n| `description` | string | нет | текущее значение | Описание |\n| `ownerId` | number | нет | текущее значение | Идентификатор нового владельца группы. Список: `GET \u002Fv1\u002Fusers` |\n| `subjectId` | number | нет | текущее значение | Идентификатор темы |\n| `active` | boolean | нет | текущее значение | Активна ли группа |\n| `visible` | boolean | нет | текущее значение | Видна ли в общих списках |\n| `opened` | boolean | нет | текущее значение | Открыта ли для вступления без приглашения |\n| `archived` | boolean | нет | текущее значение | Помещена ли в архив |\n| `isProject` | boolean | нет | текущее значение | Является ли проектом |\n| `isExtranet` | boolean | нет | текущее значение | Группа экстранета |\n| `keywords` | string | нет | текущее значение | Ключевые слова для поиска |\n\nПоля `id`, `subjectName`, `membersCount`, `dateCreate`, `dateUpdate`, `dateActivity`, `siteId`, `imageUrl` доступны только для чтения. Передача любого из них в теле возвращает `400 READONLY_FIELD`.\n\n## Примеры\n\n### curl — личный ключ\n\n```bash\ncurl -X PATCH \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fworkgroups\u002F85\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"description\": \"Обновлённое описание команды\",\n    \"opened\": true,\n    \"archived\": false\n  }'\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl -X PATCH \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fworkgroups\u002F85\" \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"description\": \"Обновлённое описание команды\",\n    \"opened\": true,\n    \"archived\": false\n  }'\n```\n\n### JavaScript — личный ключ\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fworkgroups\u002F85', {\n  method: 'PATCH',\n  headers: {\n    'X-Api-Key': 'YOUR_API_KEY',\n    'Content-Type': 'application\u002Fjson',\n  },\n  body: JSON.stringify({\n    description: 'Обновлённое описание команды',\n    opened: true,\n    archived: false,\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\u002Fworkgroups\u002F85', {\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    description: 'Обновлённое описание команды',\n    opened: true,\n    archived: false,\n  }),\n})\n\nconst { success, data } = await res.json()\n```\n\n## Поля ответа\n\n| Поле | Тип | Описание |\n|------|-----|---------|\n| `success` | boolean | Всегда `true` при успехе |\n| `data` | object | Полный объект рабочей группы после обновления — все поля см. [Получить рабочую группу](.\u002Fget.md) |\n\n## Пример ответа\n\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"id\": 85,\n    \"siteId\": \"s1\",\n    \"name\": \"Маркетинг 2026\",\n    \"description\": \"Обновлённое описание команды\",\n    \"dateCreate\": \"2026-05-12T08:14:21.000Z\",\n    \"dateUpdate\": \"2026-05-26T05:58:08.000Z\",\n    \"active\": true,\n    \"visible\": true,\n    \"opened\": true,\n    \"archived\": false,\n    \"subjectId\": 1,\n    \"ownerId\": 1,\n    \"keywords\": \"проект,команда\",\n    \"membersCount\": 7,\n    \"dateActivity\": \"2026-05-26T05:58:08.000Z\",\n    \"subjectName\": \"Рабочие группы\",\n    \"isProject\": false,\n    \"isExtranet\": false\n  }\n}\n```\n\n## Пример ответа при ошибке\n\nБитрикс24 не различает «группа не существует» и «нет прав на обновление»:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"BITRIX_ERROR\",\n    \"message\": \"User has no permissions to update group\"\n  }\n}\n```\n\n## Ошибки\n\n| HTTP | `error.code` | Описание |\n|------|--------------|---------|\n| 400 | `READONLY_FIELD` | В теле передано поле, доступное только для чтения (`id`, `subjectName`, `membersCount`, `dateCreate`, `dateUpdate`, `dateActivity`, `siteId`, `imageUrl`) |\n| 422 | `BITRIX_ERROR` | Битрикс24 отказал в обновлении. Текст в `error.message`. Типичные причины: ошибка валидации, конфликт значений, отсутствие прав на изменение, отсутствие рабочей группы с указанным `id` (два последних случая возвращают одинаковое сообщение) |\n| 401 | `MISSING_API_KEY` | В запросе не передан заголовок `X-Api-Key` |\n| 401 | `INVALID_API_KEY` | Переданный ключ недействителен или отозван |\n| 403 | `SCOPE_DENIED` | У ключа нет скоупа `sonet_group` |\n\nПолный список общих ошибок API — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Известные особенности\n\n- Сообщение `User has no permissions to update group` возвращается и при отсутствии рабочей группы с указанным `id`, и при отсутствии прав на её изменение. Чтобы различить эти два случая, сделайте дополнительный запрос [`GET \u002Fv1\u002Fworkgroups\u002F:id`](.\u002Fget.md): ответ `404` — группы нет, успешный ответ — нет прав на изменение.\n\n## Смотрите также\n\n- [Создать рабочую группу](.\u002Fcreate.md)\n- [Получить рабочую группу](.\u002Fget.md)\n- [Список рабочих групп](.\u002Flist.md)\n","\n## Удалить рабочую группу\n\n`DELETE \u002Fv1\u002Fworkgroups\u002F:id`\n\nУдаляет рабочую группу и все связанные с ней данные. Операция необратимая.\n\n## Параметры\n\n| Параметр | Тип | Обяз. | По умолч. | Описание |\n|----------|-----|:-----:|-----------|---------|\n| `id` (path) | number | ★ да | — | Идентификатор рабочей группы. Список: [`GET \u002Fv1\u002Fworkgroups`](.\u002Flist.md) |\n\n## Примеры\n\n### curl — личный ключ\n\n```bash\ncurl -X DELETE \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fworkgroups\u002F85\" \\\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\u002Fworkgroups\u002F85\" \\\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\u002Fworkgroups\u002F85', {\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\u002Fworkgroups\u002F85', {\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```http\nHTTP\u002F1.1 204 No Content\n```\n\n## Пример ответа при ошибке\n\n422 — попытка удалить несуществующую группу:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"BITRIX_ERROR\",\n    \"message\": \"Socialnetwork group not found\"\n  }\n}\n```\n\n## Ошибки\n\n| HTTP | Код | Описание |\n|------|-----|---------|\n| 422 | `BITRIX_ERROR` | Битрикс24 отказал в удалении. Типичные причины: группа не существует, нет прав на удаление |\n| 401 | `MISSING_API_KEY` | Не передан `X-Api-Key` |\n| 401 | `INVALID_API_KEY` | Передан некорректный ключ |\n| 403 | `SCOPE_DENIED` | Ключу не хватает скоупа `sonet_group` |\n\nПолный список общих ошибок API — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Известные особенности\n\n- Для временного скрытия группы без потери данных используйте [`PATCH \u002Fv1\u002Fworkgroups\u002F:id`](.\u002Fupdate.md) с `archived: true` — группа перестанет показываться в активных списках, но останется доступной для восстановления.\n- Сообщение `Socialnetwork group not found` возвращается и при отсутствии группы, и при отсутствии прав на удаление — точную причину по ответу определить нельзя.\n\n## Смотрите также\n\n- [Список рабочих групп](.\u002Flist.md)\n- [Получить рабочую группу](.\u002Fget.md)\n- [Обновить рабочую группу](.\u002Fupdate.md)\n","\n## Поиск рабочих групп\n\n`POST \u002Fv1\u002Fworkgroups\u002Fsearch`\n\nВозвращает список рабочих групп по заданным фильтрам. Тот же контракт, что [GET \u002Fv1\u002Fworkgroups](.\u002Flist.md), но условия передаются в теле запроса — подходит для длинных фильтров и нелатинских значений.\n\n## Поля запроса (body)\n\n| Поле | Тип | Описание |\n|------|-----|---------|\n| `filter` | object | Условия фильтрации. Список полей: [GET \u002Fv1\u002Fworkgroups\u002Ffields](.\u002Ffields.md). Синтаксис: [Фильтрация](\u002Fdocs\u002Ffiltering). |\n| `select` | array | Список полей в ответе. Имена — из [GET \u002Fv1\u002Fworkgroups\u002Ffields](.\u002Ffields.md). |\n| `sort` | object | Сортировка: `{\"\u003Cполе>\": \"ASC\"\\|\"DESC\"}`. |\n| `limit` | number | Максимум записей. По умолчанию 50, максимум 5000. |\n| `offset` | number | Смещение от начала выборки. По умолчанию 0. |\n\nДля `limit > 50` Вайбкод автоматически пагинирует запрос на стороне сервера. Максимум — 5000 записей за вызов. Если под фильтр попадает больше — `meta.hasMore` придёт `true`.\n\n### Получить только проекты\n\nВ одной коллекции хранятся и рабочие группы, и проекты. Поле `isProject` различает их: `true` — проект, `false` — обычная рабочая группа. Для выборки проектов передавайте `\"filter\": { \"isProject\": \"Y\" }`.\n\n## Примеры\n\n### curl — личный ключ\n\n```bash\ncurl -X POST \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fworkgroups\u002Fsearch\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"filter\": { \"%name\": \"Маркетинг\", \"archived\": \"N\" },\n    \"select\": [\"id\", \"name\", \"ownerId\", \"membersCount\"],\n    \"sort\": { \"dateCreate\": \"DESC\" },\n    \"limit\": 5\n  }'\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl -X POST \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fworkgroups\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\": { \"%name\": \"Маркетинг\", \"archived\": \"N\" },\n    \"select\": [\"id\", \"name\", \"ownerId\", \"membersCount\"],\n    \"sort\": { \"dateCreate\": \"DESC\" },\n    \"limit\": 5\n  }'\n```\n\n### JavaScript — личный ключ\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fworkgroups\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: { '%name': 'Маркетинг', archived: 'N' },\n    select: ['id', 'name', 'ownerId', 'membersCount'],\n    sort: { dateCreate: 'DESC' },\n    limit: 5,\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\u002Fworkgroups\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: { '%name': 'Маркетинг', archived: 'N' },\n    select: ['id', 'name', 'ownerId', 'membersCount'],\n    sort: { dateCreate: 'DESC' },\n    limit: 5,\n  }),\n})\n\nconst { success, data, meta } = await res.json()\n```\n\n## Поля ответа\n\n| Поле | Тип | Описание |\n|------|-----|---------|\n| `success` | boolean | Всегда `true` при успехе |\n| `data` | array | Массив рабочих групп (все поля — см. [Поля рабочей группы](.\u002Ffields.md)) |\n| `meta.total` | number | Общее количество записей по фильтру |\n| `meta.hasMore` | boolean | Есть ли ещё записи за пределами `limit` |\n\n## Пример ответа\n\n```json\n{\n  \"success\": true,\n  \"data\": [\n    {\n      \"id\": 85,\n      \"name\": \"Маркетинг 2026\",\n      \"ownerId\": 1271,\n      \"membersCount\": 2,\n      \"dateCreate\": \"2026-03-20T06:45:10.000Z\"\n    },\n    {\n      \"id\": 83,\n      \"name\": \"Команда разработки нового продукта\",\n      \"ownerId\": 1269,\n      \"membersCount\": 1,\n      \"dateCreate\": \"2026-03-20T06:41:07.000Z\"\n    },\n    {\n      \"id\": 81,\n      \"name\": \"Запуск регионального офиса\",\n      \"ownerId\": 1271,\n      \"membersCount\": 1,\n      \"dateCreate\": \"2026-03-20T06:29:07.000Z\"\n    }\n  ],\n  \"meta\": {\n    \"total\": 3,\n    \"hasMore\": false\n  }\n}\n```\n\n## Пример ответа при ошибке\n\n401 — не передан ключ авторизации:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"MISSING_API_KEY\",\n    \"message\": \"API key required. Pass via X-Api-Key header.\"\n  }\n}\n```\n\n## Ошибки\n\n| HTTP | Код | Описание |\n|------|-----|---------|\n| 400 | `INVALID_PARAMS` | Тело запроса не парсится или содержит недопустимые поля |\n| 401 | `MISSING_API_KEY` | Не передан заголовок `X-Api-Key` |\n| 401 | `INVALID_API_KEY` | Переданный ключ не распознан |\n| 403 | `SCOPE_DENIED` | Ключу не хватает скоупа `sonet_group` |\n\nПолный список общих ошибок API — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Известные особенности\n\n**Логические поля в фильтре можно передавать двумя способами.** В теле POST допустимы и `Y` \u002F `N`, и нативные JSON `true` \u002F `false`: `\"filter\": {\"active\": \"Y\"}` и `\"filter\": {\"active\": true}` дают одинаковую выборку. В ответе те же поля всегда приходят как `true` \u002F `false`.\n\n**Префикс `%` в имени поля — поиск по подстроке.** `\"filter\": {\"%name\": \"Маркетинг\"}` найдёт все группы, в названии которых встречается «Маркетинг». Без префикса фильтр требует точного совпадения.\n\n**Параметр сортировки в теле — `sort`.** Ключ `order` в теле игнорируется без ошибки — выборка возвращается в порядке по умолчанию. Используйте `\"sort\": {\"dateCreate\": \"DESC\"}` или строковую форму `\"sort\": \"dateCreate\"` (направление по умолчанию — `ASC`).\n\n## Смотрите также\n\n- [Список рабочих групп](.\u002Flist.md)\n- [Получить рабочую группу](.\u002Fget.md)\n- [Поля рабочей группы](.\u002Ffields.md)\n- [Синтаксис фильтрации](\u002Fdocs\u002Ffiltering)\n","\n## Поля рабочей группы\n\n`GET \u002Fv1\u002Fworkgroups\u002Ffields`\n\nВозвращает схему полей рабочей группы и список операций, доступных в пакетных запросах.\n\n## Примеры\n\n### curl — личный ключ\n\n```bash\ncurl \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fworkgroups\u002Ffields\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\"\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fworkgroups\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\u002Fworkgroups\u002Ffields', {\n  headers: {\n    'X-Api-Key': 'YOUR_API_KEY',\n  },\n})\n\nconst { success, data } = await res.json()\nconsole.log('Полей:', Object.keys(data.fields).length)\nconsole.log('Доступные batch-операции:', data.batch)\n```\n\n### JavaScript — OAuth-приложение\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fworkgroups\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| `success` | boolean | Всегда `true` при успехе |\n| `data.fields` | object | Объект схемы полей рабочей группы |\n| `data.fields.\u003Cимя>` | object | Описание одного поля |\n| `data.fields.\u003Cимя>.type` | string | Тип значения: `number`, `string`, `boolean` или `datetime` |\n| `data.fields.\u003Cимя>.readonly` | boolean | Доступно ли поле для записи через `POST` \u002F `PATCH` |\n| `data.batch` | array | Список операций сущности, доступных в [`POST \u002Fv1\u002Fbatch`](\u002Fdocs\u002Fbatch): `create`, `update`, `delete` |\n\n### Поля рабочей группы\n\n| Поле | Тип | Только чтение | Описание |\n|------|-----|:--:|---------|\n| `id` | number | да | Идентификатор рабочей группы |\n| `name` | string | | Название |\n| `description` | string | | Описание |\n| `active` | boolean | | Активна ли группа |\n| `visible` | boolean | | Видна ли в общих списках |\n| `opened` | boolean | | Открыта ли для вступления без приглашения |\n| `ownerId` | number | | Владелец (ответственный). Список: [`GET \u002Fv1\u002Fusers`](\u002Fdocs\u002Fentities\u002Fusers) |\n| `subjectId` | number | | Идентификатор темы |\n| `subjectName` | string | да | Название темы |\n| `membersCount` | number | да | Количество участников |\n| `dateCreate` | datetime | да | Дата создания |\n| `dateUpdate` | datetime | да | Дата последнего обновления |\n| `dateActivity` | datetime | да | Дата последней активности |\n| `archived` | boolean | | Помещена ли в архив |\n| `isProject` | boolean | | Является ли проектом с задачами и сроками |\n| `isExtranet` | boolean | | Экстранет-группа |\n| `keywords` | string | | Ключевые слова |\n| `siteId` | string | да | Идентификатор сайта портала |\n| `imageUrl` | string | да | URL аватара группы |\n\n## Пример ответа\n\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"fields\": {\n      \"id\": { \"type\": \"number\", \"readonly\": true },\n      \"name\": { \"type\": \"string\", \"readonly\": false },\n      \"description\": { \"type\": \"string\", \"readonly\": false },\n      \"active\": { \"type\": \"boolean\", \"readonly\": false },\n      \"visible\": { \"type\": \"boolean\", \"readonly\": false },\n      \"opened\": { \"type\": \"boolean\", \"readonly\": false },\n      \"ownerId\": { \"type\": \"number\", \"readonly\": false },\n      \"subjectId\": { \"type\": \"number\", \"readonly\": false },\n      \"subjectName\": { \"type\": \"string\", \"readonly\": true },\n      \"membersCount\": { \"type\": \"number\", \"readonly\": true },\n      \"dateCreate\": { \"type\": \"datetime\", \"readonly\": true },\n      \"dateUpdate\": { \"type\": \"datetime\", \"readonly\": true },\n      \"dateActivity\": { \"type\": \"datetime\", \"readonly\": true },\n      \"archived\": { \"type\": \"boolean\", \"readonly\": false },\n      \"isProject\": { \"type\": \"boolean\", \"readonly\": false },\n      \"isExtranet\": { \"type\": \"boolean\", \"readonly\": false },\n      \"keywords\": { \"type\": \"string\", \"readonly\": false },\n      \"siteId\": { \"type\": \"string\", \"readonly\": true },\n      \"imageUrl\": { \"type\": \"string\", \"readonly\": true }\n    },\n    \"batch\": [\"create\", \"update\", \"delete\"]\n  }\n}\n```\n\n## Пример ответа при ошибке\n\n401 — нет ключа авторизации:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"MISSING_API_KEY\",\n    \"message\": \"API key is required\"\n  }\n}\n```\n\n## Ошибки\n\n| HTTP | Код | Описание |\n|------|-----|---------|\n| 401 | `MISSING_API_KEY` | Не передан заголовок `X-Api-Key` |\n| 401 | `INVALID_API_KEY` | Передан неверный ключ |\n| 403 | `SCOPE_DENIED` | API-ключ не имеет скоупа `sonet_group` |\n\nПолный список общих ошибок API — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Известные особенности\n\n- Список полей не зависит от прав пользователя ключа — возвращается полная схема сущности.\n- Кроме операций, перечисленных в `data.batch`, в [`POST \u002Fv1\u002Fbatch`](\u002Fdocs\u002Fbatch) для рабочих групп можно вызывать `get`, `list` и `fields`.\n\n## Смотрите также\n\n- [Список рабочих групп](.\u002Flist.md)\n- [Создать рабочую группу](.\u002Fcreate.md)\n- [Обновить рабочую группу](.\u002Fupdate.md)\n- [Batch](\u002Fdocs\u002Fbatch)\n- [Entity API](\u002Fdocs\u002Fentity-api)\n","\n## Агрегация рабочих групп\n\n`POST \u002Fv1\u002Fworkgroups\u002Faggregate`\n\nПодсчёт количества рабочих групп, числовые агрегаты и группировка по фильтру. Без тела запроса возвращает общее количество групп одним вызовом, без выгрузки записей.\n\n**Стандартные поля:**\n\n- `membersCount` — число участников (числовое агрегирование имеет смысл)\n- `active` — признак активности (для `groupBy`)\n- `isProject` — признак проекта (для `groupBy`)\n- `ownerId` — владелец группы (для `groupBy`)\n\n## Поля запроса (body)\n\n| Параметр | Тип | Обяз. | Описание |\n|----------|-----|:-----:|---------|\n| `aggregate` | array | нет | Массив агрегаций. Числовая функция: `{ \"field\": \"membersCount\", \"function\": \"sum\" }`. Функция подсчёта: `{ \"field\": \"*\", \"function\": \"count\" }`. Функции: `count`, `sum`, `avg`, `min`, `max`. Без массива возвращается только `count` |\n| `filter` | object | нет | Фильтрация по полям `GET \u002Fv1\u002Fworkgroups\u002Ffields`. [Синтаксис фильтрации](\u002Fdocs\u002Ffiltering) |\n| `groupBy` | string \\| string[] | нет | Поле или массив полей для группировки (максимум 5). Допустимые значения — из списка выше |\n| `groupOrderBy` | array | нет | Сортировка групп: `[{ \"field\": \"membersCount:sum\", \"direction\": \"desc\" }]` |\n| `groupLimit` | number | нет | Ограничение количества возвращаемых групп (1-1000) |\n\nФункции `sum`, `avg`, `min`, `max` требуют имя числового поля, `count` требует поле `\"*\"`. Осмысленная числовая агрегация по рабочим группам — по полю `membersCount`, числу участников.\n\n## Примеры\n\n### curl — личный ключ\n\n```bash\ncurl -X POST \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fworkgroups\u002Faggregate\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"aggregate\": [\n      { \"field\": \"membersCount\", \"function\": \"sum\" },\n      { \"field\": \"membersCount\", \"function\": \"avg\" },\n      { \"field\": \"membersCount\", \"function\": \"min\" },\n      { \"field\": \"membersCount\", \"function\": \"max\" }\n    ]\n  }'\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl -X POST \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fworkgroups\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\": \"membersCount\", \"function\": \"sum\" },\n      { \"field\": \"membersCount\", \"function\": \"avg\" },\n      { \"field\": \"membersCount\", \"function\": \"min\" },\n      { \"field\": \"membersCount\", \"function\": \"max\" }\n    ]\n  }'\n```\n\n### JavaScript — личный ключ\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fworkgroups\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: 'membersCount', function: 'sum' },\n      { field: 'membersCount', function: 'avg' },\n      { field: 'membersCount', function: 'min' },\n      { field: 'membersCount', function: 'max' },\n    ],\n  }),\n})\n\nconst { success, data } = await res.json()\nconsole.log('Всего участников во всех группах:', data.aggregates.membersCount.sum)\n```\n\n### JavaScript — OAuth-приложение\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fworkgroups\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: 'membersCount', function: 'sum' },\n      { field: 'membersCount', function: 'avg' },\n      { field: 'membersCount', function: 'min' },\n      { field: 'membersCount', function: 'max' },\n    ],\n  }),\n})\n\nconst { success, data } = await res.json()\n```\n\n## Другие сценарии\n\nОбщее количество групп в портале, самый быстрый запрос без выгрузки записей:\n\n```json\n{}\n```\n\nСредний размер группы среди проектов:\n\n```json\n{\n  \"filter\": { \"isProject\": true },\n  \"aggregate\": [{ \"field\": \"membersCount\", \"function\": \"avg\" }]\n}\n```\n\nРазбивка количества групп по признаку активности:\n\n```json\n{\n  \"groupBy\": \"active\"\n}\n```\n\n## Поля ответа\n\n| Поле | Тип | Описание |\n|------|-----|---------|\n| `success` | boolean | Всегда `true` при успехе |\n| `data.count` | number | Количество групп под фильтр |\n| `data.aggregates` | object | Результаты числовых агрегаций по полям. Пустой объект, если массив `aggregate` не передан |\n| `data.groups` | array | Группы (только при `groupBy`). Каждый элемент: поля группировки, `count` и `aggregates` |\n| `data.meta.totalRecords` | number | Общее количество групп под фильтр |\n| `data.meta.recordsProcessed` | number | Сколько записей обработано: `0` для чистого `count`, число записей при числовых функциях и при `groupBy` |\n| `data.meta.truncated` | boolean | `true`, если под фильтр попало больше 5000 записей и результат посчитан по первым 5000. Для запроса только `count` всегда `false` |\n| `data.meta.groupTotal` | number | Количество групп в разбивке. Приходит только при `groupBy` |\n| `data.meta.groupsTruncated` | boolean | Признак того, что часть групп не попала в ответ. Приходит только при `groupBy` |\n\n## Пример ответа\n\nЧисловые агрегаты по полю `membersCount`:\n\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"count\": 33,\n    \"aggregates\": {\n      \"membersCount\": {\n        \"sum\": 65,\n        \"avg\": 1.9696969696969697,\n        \"min\": 0,\n        \"max\": 7\n      }\n    },\n    \"meta\": {\n      \"totalRecords\": 33,\n      \"recordsProcessed\": 33,\n      \"truncated\": false\n    }\n  }\n}\n```\n\nГруппировка, тело `{ \"groupBy\": \"active\" }`:\n\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"count\": 33,\n    \"aggregates\": {},\n    \"groups\": [\n      {\n        \"active\": true,\n        \"count\": 33,\n        \"aggregates\": {}\n      }\n    ],\n    \"meta\": {\n      \"totalRecords\": 33,\n      \"recordsProcessed\": 33,\n      \"truncated\": false,\n      \"groupTotal\": 1,\n      \"groupsTruncated\": false\n    }\n  }\n}\n```\n\nЗапрос количества, тело `{}`, записи не выгружаются и `recordsProcessed` равен `0`:\n\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"count\": 33,\n    \"aggregates\": {},\n    \"meta\": {\n      \"totalRecords\": 33,\n      \"recordsProcessed\": 0,\n      \"truncated\": false\n    }\n  }\n}\n```\n\nБез `groupBy` поле `data.groups` в ответе отсутствует.\n\n## Пример ответа при ошибке\n\n400 — в `groupBy` передано поле, по которому группировка недоступна. Сообщение содержит список допустимых полей:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"INVALID_PARAMS\",\n    \"message\": \"groupBy field 'name' is not aggregatable on this entity. Available: membersCount, active, isProject, ownerId.\"\n  }\n}\n```\n\n## Ошибки\n\n| HTTP | Код | Описание |\n|------|-----|---------|\n| 400 | `INVALID_PARAMS` | Некорректное имя функции, числовая функция по нечисловому полю, `groupBy` по недопустимому полю или больше 5 полей в `groupBy` |\n| 403 | `SCOPE_DENIED` | API-ключ не имеет скоупа `sonet_group` |\n| 401 | `TOKEN_MISSING` | API-ключ не имеет настроенных токенов |\n\nПолный список общих ошибок API — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Известные особенности\n\n**`count` против числовых функций и группировки.** `count` считается одним вызовом на любом объёме — записи не выгружаются, `recordsProcessed` равен `0`, а результат совпадает с полем `total` из [списка рабочих групп](.\u002Flist.md). Функции `sum`, `avg`, `min`, `max` и группировка через `groupBy` подгружают записи постранично и считаются на стороне платформы, поэтому `recordsProcessed` равен числу обработанных групп. При более чем 5000 записей под фильтр `meta.truncated` становится `true`, а результат считается по первым 5000 — для точного результата на больших выборках сузьте фильтр.\n\n## Смотрите также\n\n- [Список рабочих групп](\u002Fdocs\u002Fentities\u002Fworkgroups\u002Flist)\n- [Поиск рабочих групп](\u002Fdocs\u002Fentities\u002Fworkgroups\u002Fsearch)\n- [Синтаксис фильтрации](\u002Fdocs\u002Ffiltering)\n"]