[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"docs-entities\u002Fcalendar-sections\u002Fbatch":3,"docs-tabs-entities\u002Fcalendar-sections\u002Fbatch":6},{"content":4,"lastmod":5},"## Пакет операций над секциями календаря\n\n`POST \u002Fv1\u002Fcalendar-sections\u002Fbatch`\n\nМассовое создание, обновление или удаление секций календаря одним запросом — до 500 элементов за вызов. Это отдельный эндпоинт сущности, не путать с [универсальным batch](\u002Fdocs\u002Fbatch), который объединяет операции разных сущностей и ограничен 50 вызовами.\n\n## Поля запроса (body)\n\n| Поле | Тип | Обяз. | Описание |\n|------|-----|:-----:|---------|\n| `action` | string | да | Тип операции: `create`, `update` или `delete` |\n| `items` | array | да при `create` и `update` | Список элементов, до 500. Для `create` — `[{ type, ownerId, name, color?, ... }]`. Для `update` — `[{ id, type, ownerId, name, ... }]`. Набор полей элемента совпадает с телом [`POST \u002Fv1\u002Fcalendar-sections`](.\u002Fcreate.md) и [`PATCH \u002Fv1\u002Fcalendar-sections\u002F:id`](.\u002Fupdate.md) |\n| `ids` | number[] | да при `delete` | Идентификаторы секций для удаления, до 500 |\n| `type` | string | да при `delete` | Тип календаря, передаётся рядом с `ids`. Значения — `user`, `group`, `company_calendar`, `location` |\n| `ownerId` | number | да при `delete` | Идентификатор владельца календаря, передаётся рядом с `ids`. Для `type=user` — `id` сотрудника из [`GET \u002Fv1\u002Fusers`](\u002Fdocs\u002Fentities\u002Fusers), для `type=group` — `id` рабочей группы, для `type=location` — `0` |\n\nДля `create` и `update` пара `type` + `ownerId` и поле `name` входят в каждый элемент `items`. Для `delete` `type` и `ownerId` общие для всего пакета и передаются на верхнем уровне рядом с `ids`.\n\n## Примеры\n\n### curl — личный ключ\n\n```bash\ncurl -X POST \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fcalendar-sections\u002Fbatch\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"action\": \"create\",\n    \"items\": [\n      { \"type\": \"user\", \"ownerId\": 1, \"name\": \"Командные встречи\", \"color\": \"#ff5b49\" },\n      { \"type\": \"user\", \"ownerId\": 1, \"name\": \"Личное\", \"color\": \"#2fc6f6\" }\n    ]\n  }'\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl -X POST \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fcalendar-sections\u002Fbatch\" \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"action\": \"create\",\n    \"items\": [\n      { \"type\": \"user\", \"ownerId\": 1, \"name\": \"Командные встречи\", \"color\": \"#ff5b49\" },\n      { \"type\": \"user\", \"ownerId\": 1, \"name\": \"Личное\", \"color\": \"#2fc6f6\" }\n    ]\n  }'\n```\n\n### JavaScript — личный ключ\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fcalendar-sections\u002Fbatch', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': 'YOUR_API_KEY',\n    'Content-Type': 'application\u002Fjson',\n  },\n  body: JSON.stringify({\n    action: 'create',\n    items: [\n      { type: 'user', ownerId: 1, name: 'Командные встречи', color: '#ff5b49' },\n      { type: 'user', ownerId: 1, name: 'Личное', color: '#2fc6f6' },\n    ],\n  }),\n})\n\nconst { data } = await res.json()\ndata.results.forEach((item) => {\n  if (item.success) console.log(`#${item.index} → id=${item.id}`)\n  else console.log(`#${item.index} → ошибка: ${item.error} ${item.message}`)\n})\n```\n\n### JavaScript — OAuth-приложение\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fcalendar-sections\u002Fbatch', {\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    action: 'create',\n    items: [\n      { type: 'user', ownerId: 1, name: 'Командные встречи', color: '#ff5b49' },\n      { type: 'user', ownerId: 1, name: 'Личное', color: '#2fc6f6' },\n    ],\n  }),\n})\n\nconst { data } = await res.json()\n```\n\n## Поля ответа\n\n| Поле | Тип | Описание |\n|------|-----|---------|\n| `success` | boolean | Всегда `true`, если запрос прошёл верхнеуровневую валидацию. Результат каждого элемента — в `data.results[i].success` |\n| `data.results` | array | Массив результатов в том же порядке, что `items` или `ids` запроса |\n| `data.results[].index` | number | Индекс элемента, начиная с `0` |\n| `data.results[].success` | boolean | Результат этой операции |\n| `data.results[].id` | number | Идентификатор секции при `create`, `update` и `delete` |\n| `data.results[].error` | string | Код ошибки для упавшего элемента, `UNKNOWN` если код не определён. Может быть пустой строкой, если Битрикс24 прислал только текст без кода |\n| `data.results[].message` | string | Текст ошибки для упавшего элемента |\n| `data.summary.total` | number | Всего обработано элементов |\n| `data.summary.succeeded` | number | Сколько выполнено успешно |\n| `data.summary.failed` | number | Сколько завершилось ошибкой |\n\n## Пример ответа\n\n`action: create` — обе секции созданы:\n\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"results\": [\n      { \"index\": 0, \"success\": true, \"id\": 181 },\n      { \"index\": 1, \"success\": true, \"id\": 183 }\n    ],\n    \"summary\": { \"total\": 2, \"succeeded\": 2, \"failed\": 0 }\n  }\n}\n```\n\n`action: update` — элемент без `type` завершился ошибкой, а верхний `success` остался `true`:\n\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"results\": [\n      {\n        \"index\": 0,\n        \"success\": false,\n        \"error\": \"\",\n        \"message\": \"Не задан обязательный параметр \\\"type\\\" для метода \\\"calendar.section.update\\\"\"\n      }\n    ],\n    \"summary\": { \"total\": 1, \"succeeded\": 0, \"failed\": 1 }\n  }\n}\n```\n\n## Пример ответа при ошибке\n\n400 — при `action: delete` не переданы `type` и `ownerId` рядом с `ids`:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"MISSING_REQUIRED_PARAMS\",\n    \"message\": \"POST \u002Fv1\u002Fcalendar-sections\u002Fbatch { action: \\\"delete\\\" } requires type, ownerId alongside ids. Example: { \\\"action\\\": \\\"delete\\\", \\\"ids\\\": [...], \\\"type\\\": ..., \\\"ownerId\\\": ... }\",\n    \"missing\": [\"type\", \"ownerId\"]\n  }\n}\n```\n\n## Ошибки\n\n| HTTP | Код | Описание |\n|------|-----|---------|\n| 400 | `MISSING_REQUIRED_PARAMS` | `action: delete` без `type` или `ownerId` рядом с `ids` |\n| 400 | `INVALID_BATCH_ACTION` | `action` не является поддерживаемой операцией |\n| 400 | `BATCH_ITEM_VALIDATION` | `items` или `ids` пустой либо не массив, или элемент `update` без `id` |\n| 400 | `BATCH_LIMIT_EXCEEDED` | В запросе передано более 500 элементов |\n| 403 | `SCOPE_DENIED` | Ключу не хватает скоупа `calendar` |\n| 403 | `WRITE_BLOCKED_READONLY_KEY` | Ключ в режиме «только чтение» — запись запрещена |\n| 403 | `MANAGEMENT_KEY_NO_ENTITY_ACCESS` | Использован management-ключ вместо ключа приложения |\n| 401 | `TOKEN_MISSING` | У ключа нет настроенных токенов |\n\nОшибки отдельных элементов приходят внутри `data.results[i]` — поле `error` с кодом или пустой строкой и `message` с текстом.\n\nПолный список общих ошибок API — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Известные особенности\n\n**Верхний `success` остаётся `true`, если запрос прошёл верхнеуровневую валидацию.** Упавшие элементы не превращают весь ответ в ошибку — это позволяет обработать частичный результат. Перед использованием результата проверяйте `data.results[i].success` для каждого элемента, а сводку смотрите в `data.summary`.\n\n**Пакетный `update` не дополняет `type`, `ownerId` и `name` из существующей секции.** В отличие от одиночного [`PATCH \u002Fv1\u002Fcalendar-sections\u002F:id`](.\u002Fupdate.md), который подставляет эти поля сам, в пакете их нужно передать в каждом элементе `items`. Без них элемент завершается ошибкой, а остальные продолжают обрабатываться.\n\n## Смотрите также\n\n- [Создать секцию](.\u002Fcreate.md)\n- [Обновить секцию](.\u002Fupdate.md)\n- [Удалить секцию](.\u002Fdelete.md)\n- [Секции календаря](\u002Fdocs\u002Fentities\u002Fcalendar-sections)\n- [Универсальный batch](\u002Fdocs\u002Fbatch)\n","2026-07-23",{}]