[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"docs-entities\u002Fbookings":3,"docs-tabs-entities\u002Fbookings":6},{"content":4,"lastmod":5},"\n# Бронирования\n\nБронирования резервируют ресурсы портала Битрикс24 на заданный интервал времени: создание, получение по идентификатору, список и поиск по диапазону дат, обновление и удаление. Каждое бронирование привязано к одному или нескольким ресурсам и хранит период от и до.\n\nБитрикс24 API: `booking.v1.booking.*`\nСкоуп: `booking`\n\n## Операции\n\n- [Создать бронирование](.\u002Fbookings\u002Fcreate.md) — `POST \u002Fv1\u002Fbookings`\n- [Список бронирований](.\u002Fbookings\u002Flist.md) — `GET \u002Fv1\u002Fbookings`\n- [Получить бронирование](.\u002Fbookings\u002Fget.md) — `GET \u002Fv1\u002Fbookings\u002F:id`\n- [Обновить бронирование](.\u002Fbookings\u002Fupdate.md) — `PATCH \u002Fv1\u002Fbookings\u002F:id`\n- [Удалить бронирование](.\u002Fbookings\u002Fdelete.md) — `DELETE \u002Fv1\u002Fbookings\u002F:id`\n- [Поиск бронирований](.\u002Fbookings\u002Fsearch.md) — `POST \u002Fv1\u002Fbookings\u002Fsearch`\n- [Поля бронирования](.\u002Fbookings\u002Ffields.md) — `GET \u002Fv1\u002Fbookings\u002Ffields`\n\n## Поля\n\n### Изменяемые поля\n\nПринимаются при [создании](.\u002Fbookings\u002Fcreate.md) и [обновлении](.\u002Fbookings\u002Fupdate.md).\n\n| Поле | Тип | Описание |\n|------|-----|---------|\n| `resourceIds` | number[] | Идентификаторы ресурсов, которые резервирует бронирование. Обязательно при создании, массив не может быть пустым. Получить список ресурсов через API Вайбкод нельзя — укажите известные идентификаторы |\n| `datePeriod` | object | Период бронирования. Обязательно при создании. Структура: `from` и `to`, у каждого `timestamp` (Unix-секунды) и `timezone` (часовой пояс в формате IANA, например `Europe\u002FMoscow`) |\n| `name` | string | Название бронирования. Необязательно — может быть `null` |\n| `description` | string | Описание бронирования. Необязательно — может быть `null` |\n\n### Только для чтения\n\nПриходит в ответе, не принимается при создании и обновлении.\n\n| Поле | Тип | Описание |\n|------|-----|---------|\n| `id` | number | Идентификатор бронирования |\n\n## Что нужно знать перед работой\n\n1. **Для создания нужны два поля:** `resourceIds` (непустой массив) и `datePeriod`. Без любого из них ответ — `422 BITRIX_ERROR` с перечнем недостающих полей. `name` и `description` необязательны.\n2. **`datePeriod` — вложенный объект, а не строка.** Время задаётся как `{\"from\": {\"timestamp\": 1780132384, \"timezone\": \"Europe\u002FMoscow\"}, \"to\": {\"timestamp\": 1780135984, \"timezone\": \"Europe\u002FMoscow\"}}`. `timestamp` — Unix-секунды, `timezone` — часовой пояс в формате IANA.\n3. **Список и поиск требуют интервал дат.** `GET \u002Fv1\u002Fbookings` и `POST \u002Fv1\u002Fbookings\u002Fsearch` принимают обязательные `dateFrom` и `dateTo` (формат ISO 8601 или Unix-секунды). Без них — `400 MISSING_REQUIRED_PARAMS`. Бронирования вне интервала в ответ не попадают.\n4. **Имена полей остаются как есть.** Имена полей в ответе совпадают с именами в запросе (`resourceIds`, `datePeriod`) — дополнительного преобразования регистра нет.\n5. **Набор полей фиксирован.** Все доступные поля перечислены в разделе «Поля» выше.\n\n## Типичный сценарий\n\n1. Создать бронирование на нужный период: [`POST \u002Fv1\u002Fbookings`](.\u002Fbookings\u002Fcreate.md).\n2. Получить бронирования за интервал: [`GET \u002Fv1\u002Fbookings?dateFrom=...&dateTo=...`](.\u002Fbookings\u002Flist.md).\n3. Изменить период или название: [`PATCH \u002Fv1\u002Fbookings\u002F:id`](.\u002Fbookings\u002Fupdate.md).\n4. Снять бронь: [`DELETE \u002Fv1\u002Fbookings\u002F:id`](.\u002Fbookings\u002Fdelete.md).\n\n## Лимиты\n\n| Лимит | Значение |\n|-------|----------|\n| Максимум записей на запрос | 5000 (`limit ≤ 5000`) |\n| Обязательный интервал для списка и поиска | `dateFrom` + `dateTo` |\n| Размер страницы по умолчанию | 50 (`limit`) |\n| Batch-запросы | до 50 операций в [`POST \u002Fv1\u002Fbatch`](\u002Fdocs\u002Fbatch) |\n| Rate limit | общий для API Вайбкод — см. [Лимиты и оптимизация](\u002Fdocs\u002Foptimization) |\n\n## Смотрите также\n\n- [Entity API](\u002Fdocs\u002Fentity-api)\n- [Синтаксис фильтрации](\u002Fdocs\u002Ffiltering)\n- [Batch](\u002Fdocs\u002Fbatch)\n- [Справочник сущностей](\u002Fdocs\u002Fentities-index)\n","2026-06-30",{"bookings\u002Fcreate.md":7,"bookings\u002Flist.md":8,"bookings\u002Fget.md":9,"bookings\u002Fupdate.md":10,"bookings\u002Fdelete.md":11,"bookings\u002Fsearch.md":12,"bookings\u002Ffields.md":13},"\n## Создать бронирование\n\n`POST \u002Fv1\u002Fbookings`\n\nСоздаёт новое бронирование на портале. Поля передаются плоско в корне JSON.\n\n## Поля запроса (body)\n\n| Поле | Тип | Обяз. | Описание |\n|------|-----|:-----:|---------|\n| `resourceIds` | number[] | да | Идентификаторы ресурсов, которые резервирует бронирование. Массив не может быть пустым. Получить список ресурсов через API Вайбкод нельзя — укажите известные идентификаторы |\n| `datePeriod` | object | да | Период бронирования. Структура: `from` и `to`, у каждого — `timestamp` (Unix-секунды) и `timezone` (часовой пояс в формате IANA, например `Europe\u002FMoscow`) |\n| `name` | string | нет | Название бронирования. Может быть `null` |\n| `description` | string | нет | Описание бронирования. Может быть `null` |\n\n## Примеры\n\n### curl — личный ключ\n\n```bash\ncurl -X POST \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fbookings\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"resourceIds\": [1],\n    \"datePeriod\": {\n      \"from\": { \"timestamp\": 1780132384, \"timezone\": \"Europe\u002FMoscow\" },\n      \"to\":   { \"timestamp\": 1780135984, \"timezone\": \"Europe\u002FMoscow\" }\n    },\n    \"name\": \"Переговорная на демонстрацию\",\n    \"description\": \"Бронь переговорной комнаты\"\n  }'\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl -X POST \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fbookings\" \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"resourceIds\": [1],\n    \"datePeriod\": {\n      \"from\": { \"timestamp\": 1780132384, \"timezone\": \"Europe\u002FMoscow\" },\n      \"to\":   { \"timestamp\": 1780135984, \"timezone\": \"Europe\u002FMoscow\" }\n    },\n    \"name\": \"Переговорная на демонстрацию\",\n    \"description\": \"Бронь переговорной комнаты\"\n  }'\n```\n\n### JavaScript — личный ключ\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fbookings', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': 'YOUR_API_KEY',\n    'Content-Type': 'application\u002Fjson',\n  },\n  body: JSON.stringify({\n    resourceIds: [1],\n    datePeriod: {\n      from: { timestamp: 1780132384, timezone: 'Europe\u002FMoscow' },\n      to:   { timestamp: 1780135984, timezone: 'Europe\u002FMoscow' },\n    },\n    name: 'Переговорная на демонстрацию',\n    description: 'Бронь переговорной комнаты',\n  }),\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\u002Fbookings', {\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    resourceIds: [1],\n    datePeriod: {\n      from: { timestamp: 1780132384, timezone: 'Europe\u002FMoscow' },\n      to:   { timestamp: 1780135984, timezone: 'Europe\u002FMoscow' },\n    },\n    name: 'Переговорная на демонстрацию',\n    description: 'Бронь переговорной комнаты',\n  }),\n})\n\nconst { success, data } = await res.json()\n```\n\n## Поля ответа\n\nВозвращается полный объект созданного бронирования.\n\n| Поле | Тип | Описание |\n|------|-----|---------|\n| `success` | boolean | Всегда `true` при успехе |\n| `data.id` | number | Идентификатор созданного бронирования |\n| `data.name` | string \\| null | Название бронирования |\n| `data.description` | string \\| null | Описание бронирования |\n| `data.resourceIds` | number[] | Идентификаторы зарезервированных ресурсов |\n| `data.datePeriod` | object | Период бронирования: `from` и `to`, у каждого `timestamp` и `timezone` |\n\n## Пример ответа\n\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"id\": 27,\n    \"name\": \"Переговорная на демонстрацию\",\n    \"description\": \"Бронь переговорной комнаты\",\n    \"resourceIds\": [1],\n    \"datePeriod\": {\n      \"from\": { \"timestamp\": 1780132384, \"timezone\": \"Europe\u002FMoscow\" },\n      \"to\":   { \"timestamp\": 1780135984, \"timezone\": \"Europe\u002FMoscow\" }\n    }\n  }\n}\n```\n\n## Пример ответа при ошибке\n\n422 — не переданы обязательные поля:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"BITRIX_ERROR\",\n    \"message\": \"Required fields: resourceIds, datePeriod\"\n  }\n}\n```\n\n## Ошибки\n\n| HTTP | Код | Описание |\n|------|--------------|---------|\n| 422 | `BITRIX_ERROR` | Не переданы обязательные поля `resourceIds` и\u002Fили `datePeriod`. Сообщение: `Required fields: resourceIds, datePeriod` |\n| 422 | `BITRIX_ERROR` | Передан пустой массив `resourceIds`. Сообщение: `Empty resource collection` |\n| 403 | `SCOPE_DENIED` | API-ключ не имеет скоупа `booking` |\n| 401 | `MISSING_API_KEY` | Не передан заголовок `X-Api-Key` |\n| 401 | `TOKEN_MISSING` | API-ключ не имеет настроенных токенов |\n\nПолный список общих ошибок API — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Смотрите также\n\n- [Бронирования](\u002Fdocs\u002Fentities\u002Fbookings)\n- [Обновить бронирование](\u002Fdocs\u002Fentities\u002Fbookings\u002Fupdate)\n- [Получить бронирование](\u002Fdocs\u002Fentities\u002Fbookings\u002Fget)\n- [Удалить бронирование](\u002Fdocs\u002Fentities\u002Fbookings\u002Fdelete)\n- [Batch](\u002Fdocs\u002Fbatch)\n","\n## Список бронирований\n\n`GET \u002Fv1\u002Fbookings`\n\nВозвращает бронирования за указанный диапазон дат. Начало и конец интервала обязательны — без них запрос вернётся с ошибкой. Записи вне переданного интервала в ответ не попадают.\n\n## Параметры\n\n| Параметр | Тип | Обяз. | По умолч. | Описание |\n|----------|-----|:-----:|-----------|---------|\n| `dateFrom` (query) | string \\| number | да | — | Начало интервала. ISO 8601 (`\"2026-05-01T00:00:00Z\"`) или Unix-секунды (`1714521600`) |\n| `dateTo` (query) | string \\| number | да | — | Конец интервала. ISO 8601 или Unix-секунды |\n| `limit` (query) | number | нет | `50` | Количество записей (от 1 до 5000). Отрицательное значение или ноль → `400 INVALID_PARAMS` |\n| `offset` (query) | number | нет | `0` | Смещение. Используйте с осторожностью — см. «Известные особенности» |\n\n## Примеры\n\n### curl — личный ключ\n\n```bash\ncurl \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fbookings?dateFrom=2024-01-01T00:00:00Z&dateTo=2026-12-31T23:59:59Z&limit=10\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\"\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fbookings?dateFrom=2024-01-01T00:00:00Z&dateTo=2026-12-31T23:59:59Z&limit=10\" \\\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  dateFrom: '2024-01-01T00:00:00Z',\n  dateTo: '2026-12-31T23:59:59Z',\n  limit: '10',\n})\n\nconst res = await fetch(`https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fbookings?${params}`, {\n  headers: {\n    'X-Api-Key': 'YOUR_API_KEY',\n  },\n})\n\nconst { success, data, meta } = await res.json()\nconsole.log(`Получено ${data.length} бронирований, hasMore: ${meta.hasMore}`)\n```\n\n### JavaScript — OAuth-приложение\n\n```javascript\nconst params = new URLSearchParams({\n  dateFrom: '2024-01-01T00:00:00Z',\n  dateTo: '2026-12-31T23:59:59Z',\n  limit: '10',\n})\n\nconst res = await fetch(`https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fbookings?${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| Поле | Тип | Описание |\n|------|-----|---------|\n| `success` | boolean | Всегда `true` при успехе |\n| `data` | array | Массив бронирований (поля каждой записи — см. [Бронирования](\u002Fdocs\u002Fentities\u002Fbookings)) |\n| `meta.total` | number | Всегда `0` — общее количество не вычисляется. Для определения наличия дополнительных записей используйте `meta.hasMore` |\n| `meta.hasMore` | boolean | `true`, если количество записей, подходящих под фильтр, превышает `limit` |\n\n## Пример ответа\n\n```json\n{\n  \"success\": true,\n  \"data\": [\n    {\n      \"datePeriod\": {\n        \"from\": {\n          \"timestamp\": 1723446900,\n          \"timezone\": \"Europe\u002FMoscow\"\n        },\n        \"to\": {\n          \"timestamp\": 1723447800,\n          \"timezone\": \"Europe\u002FMoscow\"\n        }\n      },\n      \"description\": null,\n      \"id\": 3,\n      \"name\": null,\n      \"resourceIds\": [1, 3]\n    },\n    {\n      \"datePeriod\": {\n        \"from\": {\n          \"timestamp\": 1741687200,\n          \"timezone\": \"Europe\u002FKaliningrad\"\n        },\n        \"to\": {\n          \"timestamp\": 1741690800,\n          \"timezone\": \"Europe\u002FKaliningrad\"\n        }\n      },\n      \"description\": null,\n      \"id\": 1,\n      \"name\": \"Запись\",\n      \"resourceIds\": [1]\n    },\n    {\n      \"datePeriod\": {\n        \"from\": {\n          \"timestamp\": 1752570000,\n          \"timezone\": \"Europe\u002FKaliningrad\"\n        },\n        \"to\": {\n          \"timestamp\": 1752571800,\n          \"timezone\": \"Europe\u002FKaliningrad\"\n        }\n      },\n      \"description\": null,\n      \"id\": 5,\n      \"name\": null,\n      \"resourceIds\": [1]\n    }\n  ],\n  \"meta\": {\n    \"total\": 0,\n    \"hasMore\": true\n  }\n}\n```\n\n## Пример ответа при ошибке\n\n400 — не переданы обязательные параметры:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"MISSING_REQUIRED_PARAMS\",\n    \"message\": \"GET \u002Fv1\u002Fbookings requires dateFrom and dateTo query parameters (ISO 8601 datetime or Unix seconds). Example: ?dateFrom=2026-05-01T00:00:00Z&dateTo=2026-05-31T23:59:59Z.\"\n  }\n}\n```\n\n## Ошибки\n\n| HTTP | Код | Описание |\n|------|-----|---------|\n| 400 | `MISSING_REQUIRED_PARAMS` | Не переданы `dateFrom` или `dateTo` |\n| 400 | `INVALID_DATE` | Значение `dateFrom` или `dateTo` не является ISO 8601 или Unix-секундами |\n| 400 | `INVALID_PARAMS` | `limit` меньше 1 или не является числом |\n| 403 | `SCOPE_DENIED` | API-ключ не имеет скоупа `booking` |\n| 401 | `MISSING_API_KEY` | Заголовок `X-Api-Key` не передан |\n| 401 | `TOKEN_MISSING` | API-ключ не имеет настроенных токенов |\n\nПолный список общих ошибок API — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Известные особенности\n\n**`offset` работает ненадёжно на малых значениях.** Значения `offset` меньше размера страницы не гарантируют пропуск записей. Для выборки бронирований за стандартный рабочий период (день, неделя, месяц) все записи помещаются в одну страницу при достаточном `limit` — предпочтительнее одного запроса с большим `limit` вместо серии запросов с малым `offset`.\n\n## Смотрите также\n\n- [Поиск бронирований](\u002Fdocs\u002Fentities\u002Fbookings\u002Fsearch)\n- [Получить бронирование](\u002Fdocs\u002Fentities\u002Fbookings\u002Fget)\n- [Создать бронирование](\u002Fdocs\u002Fentities\u002Fbookings\u002Fcreate)\n- [Синтаксис фильтрации](\u002Fdocs\u002Ffiltering)\n- [Batch](\u002Fdocs\u002Fbatch)\n- [Лимиты и оптимизация](\u002Fdocs\u002Foptimization)\n","\n## Получить бронирование\n\n`GET \u002Fv1\u002Fbookings\u002F:id`\n\nВозвращает одно бронирование по идентификатору.\n\n## Параметры\n\n| Параметр | Тип | Обяз. | Описание |\n|----------|-----|:-----:|---------|\n| `id` (path) | number | да | Идентификатор бронирования |\n\n## Примеры\n\n### curl — личный ключ\n\n```bash\ncurl \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fbookings\u002F27\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\"\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fbookings\u002F27\" \\\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\u002Fbookings\u002F27', {\n  headers: {\n    'X-Api-Key': 'YOUR_API_KEY',\n  },\n})\n\nconst { success, data } = await res.json()\nconsole.log('Бронирование:', data.name, data.resourceIds)\n```\n\n### JavaScript — OAuth-приложение\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fbookings\u002F27', {\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Объект содержит 5 полей — все приведены в таблице ниже.\n\n| Поле | Тип | Описание |\n|------|-----|---------|\n| `success` | boolean | Всегда `true` при успехе |\n| `data.id` | number | Идентификатор бронирования |\n| `data.name` | string \\| null | Название бронирования. Может быть `null` |\n| `data.description` | string \\| null | Описание бронирования. Может быть `null` |\n| `data.resourceIds` | number[] | Идентификаторы резервируемых ресурсов |\n| `data.datePeriod` | object | Период бронирования: `from` и `to`, у каждого `timestamp` (Unix-секунды) и `timezone` (IANA) |\n\n## Пример ответа\n\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"id\": 27,\n    \"name\": \"Переговорная на демонстрацию\",\n    \"description\": \"Бронь переговорной комнаты\",\n    \"resourceIds\": [1],\n    \"datePeriod\": {\n      \"from\": {\n        \"timestamp\": 1780132384,\n        \"timezone\": \"Europe\u002FMoscow\"\n      },\n      \"to\": {\n        \"timestamp\": 1780135984,\n        \"timezone\": \"Europe\u002FMoscow\"\n      }\n    }\n  }\n}\n```\n\n## Пример ответа при ошибке\n\n422 — бронирование не найдено:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"BITRIX_ERROR\",\n    \"message\": \"Booking not found\"\n  }\n}\n```\n\n## Ошибки\n\n| HTTP | Код | Описание |\n|------|-----|---------|\n| 422 | `BITRIX_ERROR` | Бронирование с указанным `id` не найдено |\n| 422 | `BITRIX_ERROR` | `id` содержит нечисловое значение |\n| 403 | `SCOPE_DENIED` | API-ключ не имеет скоупа `booking` |\n| 401 | `MISSING_API_KEY` | Запрос отправлен без заголовка `X-Api-Key` |\n| 401 | `TOKEN_MISSING` | API-ключ не имеет настроенных токенов |\n\nПолный список общих ошибок API — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Смотрите также\n\n- [Список бронирований](\u002Fdocs\u002Fentities\u002Fbookings\u002Flist)\n- [Обновить бронирование](\u002Fdocs\u002Fentities\u002Fbookings\u002Fupdate)\n- [Удалить бронирование](\u002Fdocs\u002Fentities\u002Fbookings\u002Fdelete)\n- [Лимиты и оптимизация](\u002Fdocs\u002Foptimization)\n","\n## Обновить бронирование\n\n`PATCH \u002Fv1\u002Fbookings\u002F:id`\n\nОбновляет поля существующего бронирования. Передавайте только изменяемые поля плоско в корне JSON.\n\n## Параметры\n\n| Параметр | Тип | Обяз. | Описание |\n|----------|-----|:-----:|---------|\n| `id` (path) | number | да | Идентификатор бронирования |\n\n## Поля запроса (body)\n\n| Поле | Тип | Описание |\n|------|-----|---------|\n| `resourceIds` | number[] | Идентификаторы ресурсов, которые резервирует бронирование. Массив не может быть пустым. Получить список ресурсов через API Вайбкод нельзя — укажите известные идентификаторы |\n| `datePeriod` | object | Период бронирования. Структура: `from` и `to`, у каждого — `timestamp` (Unix-секунды) и `timezone` (часовой пояс в формате IANA, например `Europe\u002FMoscow`) |\n| `name` | string | Название бронирования. Может быть `null` |\n| `description` | string | Описание бронирования. Может быть `null` |\n\n## Примеры\n\n### curl — личный ключ\n\n```bash\ncurl -X PATCH \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fbookings\u002F27\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"name\": \"Переговорная (обновлено)\",\n    \"description\": \"Изменённое описание\"\n  }'\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl -X PATCH \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fbookings\u002F27\" \\\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\": \"Переговорная (обновлено)\",\n    \"description\": \"Изменённое описание\"\n  }'\n```\n\n### JavaScript — личный ключ\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fbookings\u002F27', {\n  method: 'PATCH',\n  headers: {\n    'X-Api-Key': 'YOUR_API_KEY',\n    'Content-Type': 'application\u002Fjson',\n  },\n  body: JSON.stringify({\n    name: 'Переговорная (обновлено)',\n    description: 'Изменённое описание',\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\u002Fbookings\u002F27', {\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    name: 'Переговорная (обновлено)',\n    description: 'Изменённое описание',\n  }),\n})\n\nconst { success, data } = await res.json()\n```\n\n## Поля ответа\n\nВозвращается полный объект обновлённого бронирования.\n\n| Поле | Тип | Описание |\n|------|-----|---------|\n| `success` | boolean | Всегда `true` при успехе |\n| `data.id` | number | Идентификатор бронирования |\n| `data.name` | string \\| null | Название бронирования |\n| `data.description` | string \\| null | Описание бронирования |\n| `data.resourceIds` | number[] | Идентификаторы зарезервированных ресурсов |\n| `data.datePeriod` | object | Период бронирования: `from` и `to`, у каждого `timestamp` и `timezone` |\n\n## Пример ответа\n\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"id\": 27,\n    \"name\": \"Переговорная (обновлено)\",\n    \"description\": \"Изменённое описание\",\n    \"resourceIds\": [1],\n    \"datePeriod\": {\n      \"from\": { \"timestamp\": 1780132384, \"timezone\": \"Europe\u002FMoscow\" },\n      \"to\":   { \"timestamp\": 1780135984, \"timezone\": \"Europe\u002FMoscow\" }\n    }\n  }\n}\n```\n\n## Пример ответа при ошибке\n\n422 — бронирование не найдено:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"BITRIX_ERROR\",\n    \"message\": \"Booking not found\"\n  }\n}\n```\n\n## Ошибки\n\n| HTTP | Код | Описание |\n|------|--------------|---------|\n| 422 | `BITRIX_ERROR` | Бронирование с указанным `id` не существует. Сообщение: `Booking not found` |\n| 422 | `BITRIX_ERROR` | Передан пустой массив `resourceIds`. Сообщение: `Empty resource collection` |\n| 403 | `SCOPE_DENIED` | API-ключ не имеет скоупа `booking` |\n| 401 | `MISSING_API_KEY` | Не передан заголовок `X-Api-Key` |\n| 401 | `TOKEN_MISSING` | API-ключ не имеет настроенных токенов |\n\nПолный список общих ошибок API — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Смотрите также\n\n- [Бронирования](\u002Fdocs\u002Fentities\u002Fbookings)\n- [Создать бронирование](\u002Fdocs\u002Fentities\u002Fbookings\u002Fcreate)\n- [Получить бронирование](\u002Fdocs\u002Fentities\u002Fbookings\u002Fget)\n- [Удалить бронирование](\u002Fdocs\u002Fentities\u002Fbookings\u002Fdelete)\n- [Batch](\u002Fdocs\u002Fbatch)\n","\n## Удалить бронирование\n\n`DELETE \u002Fv1\u002Fbookings\u002F:id`\n\nУдаляет бронирование по идентификатору. Восстановить удалённое бронирование через API нельзя — создавайте новое при необходимости.\n\n## Параметры\n\n| Параметр | Тип | Обяз. | Описание |\n|----------|-----|:-----:|---------|\n| `id` (path) | number | да | Идентификатор бронирования |\n\n## Примеры\n\n### curl — личный ключ\n\n```bash\ncurl -X DELETE \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fbookings\u002F27\" \\\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\u002Fbookings\u002F27\" \\\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\u002Fbookings\u002F27', {\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\u002Fbookings\u002F27', {\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\": \"booking not found\"\n  }\n}\n```\n\n## Ошибки\n\n| HTTP | Код | Описание |\n|------|-----|---------|\n| 422 | `BITRIX_ERROR` | Бронирование с указанным `id` не найдено или уже удалено. Сообщение: `booking not found` |\n| 403 | `SCOPE_DENIED` | API-ключ не имеет скоупа `booking` |\n| 401 | `MISSING_API_KEY` | Запрос отправлен без заголовка `X-Api-Key` |\n| 401 | `TOKEN_MISSING` | API-ключ не имеет настроенных токенов |\n\nПолный список общих ошибок API — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Смотрите также\n\n- [Список бронирований](\u002Fdocs\u002Fentities\u002Fbookings\u002Flist)\n- [Создать бронирование](\u002Fdocs\u002Fentities\u002Fbookings\u002Fcreate)\n- [Batch](\u002Fdocs\u002Fbatch)\n- [Лимиты и оптимизация](\u002Fdocs\u002Foptimization)\n","\n## Поиск бронирований\n\n`POST \u002Fv1\u002Fbookings\u002Fsearch`\n\nВозвращает бронирования за указанный диапазон дат. Начало и конец интервала обязательны. Подходит, когда параметры запроса удобнее передавать в теле, а не в строке запроса.\n\n## Поля запроса (body)\n\nПринимает две равнозначные формы. Используйте любую из них.\n\n**Форма 1 — параметры на верхнем уровне:**\n\n| Поле | Тип | Обяз. | По умолч. | Описание |\n|------|-----|:-----:|-----------|---------|\n| `dateFrom` | string \\| number | да | — | Начало интервала. ISO 8601 (`\"2026-05-01T00:00:00Z\"`) или Unix-секунды (`1714521600`) |\n| `dateTo` | string \\| number | да | — | Конец интервала. ISO 8601 или Unix-секунды |\n| `limit` | number | нет | `50` | Количество записей (от 1 до 5000) |\n| `offset` | number | нет | `0` | Смещение |\n\n**Форма 2 — параметры во вложенном фильтре:**\n\n| Поле | Тип | Обяз. | Описание |\n|------|-----|:-----:|---------|\n| `filter.within.dateFrom` | string \\| number | да | Начало интервала |\n| `filter.within.dateTo` | string \\| number | да | Конец интервала |\n\n## Примеры\n\n### curl — личный ключ\n\n```bash\ncurl -X POST \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fbookings\u002Fsearch\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"dateFrom\": \"2024-01-01T00:00:00Z\",\n    \"dateTo\": \"2026-12-31T23:59:59Z\",\n    \"limit\": 10\n  }'\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl -X POST \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fbookings\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    \"dateFrom\": \"2024-01-01T00:00:00Z\",\n    \"dateTo\": \"2026-12-31T23:59:59Z\",\n    \"limit\": 10\n  }'\n```\n\n### JavaScript — личный ключ\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fbookings\u002Fsearch', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': 'YOUR_API_KEY',\n    'Content-Type': 'application\u002Fjson',\n  },\n  body: JSON.stringify({\n    dateFrom: '2024-01-01T00:00:00Z',\n    dateTo: '2026-12-31T23:59:59Z',\n    limit: 10,\n  }),\n})\n\nconst { success, data, meta } = await res.json()\nconsole.log(`Получено ${data.length} бронирований, hasMore: ${meta.hasMore}`)\n```\n\n### JavaScript — OAuth-приложение\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fbookings\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    dateFrom: '2024-01-01T00:00:00Z',\n    dateTo: '2026-12-31T23:59:59Z',\n    limit: 10,\n  }),\n})\n\nconst { success, data, meta } = await res.json()\n```\n\n## Поля ответа\n\n| Поле | Тип | Описание |\n|------|-----|---------|\n| `success` | boolean | Всегда `true` при успехе |\n| `data` | array | Массив бронирований (поля каждой записи — см. [Бронирования](\u002Fdocs\u002Fentities\u002Fbookings)) |\n| `meta.total` | number | Всегда `0` — общее количество не вычисляется. Для определения наличия дополнительных записей используйте `meta.hasMore` |\n| `meta.hasMore` | boolean | `true`, если количество записей, подходящих под условие, превышает `limit` |\n\n## Пример ответа\n\n```json\n{\n  \"success\": true,\n  \"data\": [\n    {\n      \"datePeriod\": {\n        \"from\": {\n          \"timestamp\": 1723446900,\n          \"timezone\": \"Europe\u002FMoscow\"\n        },\n        \"to\": {\n          \"timestamp\": 1723447800,\n          \"timezone\": \"Europe\u002FMoscow\"\n        }\n      },\n      \"description\": null,\n      \"id\": 3,\n      \"name\": null,\n      \"resourceIds\": [1, 3]\n    },\n    {\n      \"datePeriod\": {\n        \"from\": {\n          \"timestamp\": 1741687200,\n          \"timezone\": \"Europe\u002FKaliningrad\"\n        },\n        \"to\": {\n          \"timestamp\": 1741690800,\n          \"timezone\": \"Europe\u002FKaliningrad\"\n        }\n      },\n      \"description\": null,\n      \"id\": 1,\n      \"name\": \"Запись\",\n      \"resourceIds\": [1]\n    },\n    {\n      \"datePeriod\": {\n        \"from\": {\n          \"timestamp\": 1752570000,\n          \"timezone\": \"Europe\u002FKaliningrad\"\n        },\n        \"to\": {\n          \"timestamp\": 1752571800,\n          \"timezone\": \"Europe\u002FKaliningrad\"\n        }\n      },\n      \"description\": null,\n      \"id\": 5,\n      \"name\": null,\n      \"resourceIds\": [1]\n    }\n  ],\n  \"meta\": {\n    \"total\": 0,\n    \"hasMore\": true\n  }\n}\n```\n\n## Пример ответа при ошибке\n\n400 — не переданы обязательные параметры:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"MISSING_REQUIRED_PARAMS\",\n    \"message\": \"POST \u002Fv1\u002Fbookings\u002Fsearch requires { dateFrom, dateTo } at the top level OR { filter: { within: { dateFrom, dateTo } } }. Values are ISO 8601 or Unix seconds.\"\n  }\n}\n```\n\n## Ошибки\n\n| HTTP | Код | Описание |\n|------|-----|---------|\n| 400 | `MISSING_REQUIRED_PARAMS` | Не переданы `dateFrom` или `dateTo` ни в одной из допустимых форм |\n| 400 | `INVALID_DATE` | Значение `dateFrom` или `dateTo` не является ISO 8601 или Unix-секундами |\n| 400 | `INVALID_PARAMS` | `limit` меньше 1 или не является числом |\n| 403 | `SCOPE_DENIED` | API-ключ не имеет скоупа `booking` |\n| 401 | `MISSING_API_KEY` | Заголовок `X-Api-Key` не передан |\n| 401 | `TOKEN_MISSING` | API-ключ не имеет настроенных токенов |\n\nПолный список общих ошибок API — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Смотрите также\n\n- [Список бронирований](\u002Fdocs\u002Fentities\u002Fbookings\u002Flist)\n- [Получить бронирование](\u002Fdocs\u002Fentities\u002Fbookings\u002Fget)\n- [Создать бронирование](\u002Fdocs\u002Fentities\u002Fbookings\u002Fcreate)\n- [Синтаксис фильтрации](\u002Fdocs\u002Ffiltering)\n- [Batch](\u002Fdocs\u002Fbatch)\n- [Лимиты и оптимизация](\u002Fdocs\u002Foptimization)\n","\n## Поля бронирования\n\n`GET \u002Fv1\u002Fbookings\u002Ffields`\n\nВозвращает описание всех полей бронирования с типами и атрибутами.\n\n## Примеры\n\n### curl — личный ключ\n\n```bash\ncurl \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fbookings\u002Ffields\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\"\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fbookings\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\u002Fbookings\u002Ffields', {\n  headers: { 'X-Api-Key': 'YOUR_API_KEY' },\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\u002Fbookings\u002Ffields', {\n  headers: {\n    'X-Api-Key': 'YOUR_APP_KEY',\n    'Authorization': 'Bearer USER_SESSION_TOKEN',\n  },\n})\nconst { success, data } = await res.json()\n```\n\n## Поля ответа\n\n| Поле | Тип | RO | Описание |\n|------|-----|:--:|---------|\n| `id` | number | да | Идентификатор бронирования |\n| `name` | string | | Название бронирования. Может быть `null` |\n| `description` | string | | Описание бронирования. Может быть `null` |\n| `resourceIds` | array | | Идентификаторы резервируемых ресурсов. Обязательно при создании, массив не может быть пустым |\n| `datePeriod` | object | | Период бронирования. Обязательно при создании: `from` и `to`, у каждого `timestamp` в Unix-секундах и `timezone` в формате IANA |\n\n## Пример ответа\n\n`GET \u002Fv1\u002Fbookings\u002Ffields` возвращает описания полей под ключом `data.fields`, где каждое поле — `{ type, readonly }`. Имена полей в camelCase, как в ответах API. Плюс `data.batch` со списком доступных batch-операций.\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      \"resourceIds\": { \"type\": \"array\", \"readonly\": false },\n      \"datePeriod\": { \"type\": \"object\", \"readonly\": false }\n    },\n    \"batch\": [\"create\", \"update\", \"delete\"]\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 'booking' scope\"\n  }\n}\n```\n\n## Ошибки\n\n| HTTP | Код | Описание |\n|------|-----|---------|\n| 403 | `SCOPE_DENIED` | API-ключ не имеет скоупа `booking` |\n| 401 | `MISSING_API_KEY` | Запрос отправлен без заголовка `X-Api-Key` |\n| 401 | `TOKEN_MISSING` | API-ключ не имеет настроенных токенов |\n\nПолный список общих ошибок API — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Смотрите также\n\n- [Бронирования](\u002Fdocs\u002Fentities\u002Fbookings)\n- [Создать бронирование](\u002Fdocs\u002Fentities\u002Fbookings\u002Fcreate)\n- [Обновить бронирование](\u002Fdocs\u002Fentities\u002Fbookings\u002Fupdate)\n"]