Для AI-агентов: markdown этой страницы — /docs-content/entities/calendar-sections.md индекс документации — /llms.txt
Секции календаря
Управление секциями календаря Битрикс24: личными, групповыми и календарями переговорных. Секция — это сам календарь, в котором живут события. У одного сотрудника может быть несколько секций, например «Работа» и «Личное», у группы — один или несколько групповых календарей.
Битрикс24 API: calendar.section.*
Скоуп: calendar
Список секций
GET /v1/calendar-sections
Возвращает все секции календаря для пары type + ownerId. У одного сотрудника может быть несколько секций — например, «Работа», «Личное», «Командные встречи».
Параметры
| Параметр | Тип | Обяз. | По умолч. | Описание |
|---|---|---|---|---|
Параметрtype (query) |
Типstring | Обяз.да | По умолч.— | ОписаниеТип календаря: user — личный, group — групповой, company_calendar — календарь компании, location — переговорная |
ПараметрownerId (query) |
Типnumber | Обяз.да | По умолч.— | ОписаниеИдентификатор владельца календаря. Для сотрудника — из GET /v1/users, для рабочей группы — её id, для type=location — 0 |
Параметрlimit (query) |
Типnumber | Обяз.нет | По умолч.50 |
ОписаниеКоличество записей, до 5000. При limit > 50 включается автопагинация |
Параметрoffset (query) |
Типnumber | Обяз.нет | По умолч.0 |
ОписаниеПринимается, но не влияет на выборку — список возвращает все секции пары type + ownerId |
Параметрselect (query) |
Типstring | Обяз.нет | По умолч.— | ОписаниеПоля в ответе через запятую: ?select=id,name,color |
Параметрfilter (query) |
Типobject | Обяз.нет | По умолч.— | ОписаниеДругая форма передачи type и ownerId. Других ключей список не принимает: например, filter[name]=... возвращает 400 UNSUPPORTED_FILTER ещё до обращения к Битрикс24.Синтаксис фильтрации. Пример: ?filter[type]=user&filter[ownerId]=1 |
Параметрsort (query) |
Типstring | Обяз.нет | По умолч.— | ОписаниеПринимается, но не влияет на порядок секций в ответе |
Параметрorder (query) |
Типobject | string | Обяз.нет | По умолч.— | ОписаниеОбе формы — ?order[id]=desc и ?order=desc — принимаются, но, как и sort, не влияют на порядок секций в ответе. Направление в форме order[поле] вне asc, desc, ASC, DESC возвращает 400 INVALID_SORT_DIRECTION |
ПараметрwithTotal (query) |
Типstring | Обяз.нет | По умолч.— | ОписаниеРаспознаются значения true и false. Для секций параметр на ответ не влияет: meta.total приходит и при withTotal=false |
Примеры
curl — личный ключ
curl "https://vibecode.bitrix24.tech/v1/calendar-sections?type=user&ownerId=1" \
-H "X-Api-Key: YOUR_API_KEY"
curl — OAuth-приложение
curl "https://vibecode.bitrix24.tech/v1/calendar-sections?type=user&ownerId=1" \
-H "X-Api-Key: YOUR_APP_KEY" \
-H "Authorization: Bearer USER_SESSION_TOKEN"
JavaScript — личный ключ
const params = new URLSearchParams({ type: 'user', ownerId: '1' })
const res = await fetch(`https://vibecode.bitrix24.tech/v1/calendar-sections?${params}`, {
headers: {
'X-Api-Key': 'YOUR_API_KEY',
},
})
const { success, data, meta } = await res.json()
console.log(`Найдено ${meta.total} секций`)
JavaScript — OAuth-приложение
const params = new URLSearchParams({ type: 'user', ownerId: '1' })
const res = await fetch(`https://vibecode.bitrix24.tech/v1/calendar-sections?${params}`, {
headers: {
'X-Api-Key': 'YOUR_APP_KEY',
'Authorization': 'Bearer USER_SESSION_TOKEN',
},
})
const { success, data, meta } = await res.json()
Поля ответа
| Поле | Тип | Описание |
|---|---|---|
Полеsuccess |
Типboolean | ОписаниеВсегда true при успехе |
Полеdata |
Типarray | ОписаниеМассив секций |
Полеmeta.total |
Типnumber | ОписаниеОбщее количество секций в выборке |
Полеmeta.hasMore |
Типboolean | ОписаниеЕсть ли ещё записи за пределами limit |
Поля одной секции в массиве data:
| Поле | Тип | RO | Описание |
|---|---|---|---|
Полеid |
Типnumber | ROда | ОписаниеИдентификатор секции |
Полеname |
Типstring | ROнет | ОписаниеНазвание |
Полеdescription |
Типstring | ROнет | ОписаниеОписание |
Полеtype |
Типstring | ROнет | ОписаниеТип календаря: user, group, company_calendar, location |
ПолеownerId |
Типnumber | ROнет | ОписаниеИдентификатор владельца календаря. Для сотрудника — из GET /v1/users |
Полеcolor |
Типstring | ROнет | ОписаниеЦвет секции в формате #RRGGBB |
ПолеtextColor |
Типstring | ROнет | ОписаниеЦвет текста в формате #RRGGBB |
Полеexport |
Типobject | ROнет | ОписаниеПараметры экспорта в формате iCal. Набор ключей зависит от направления: на чтение приходят ALLOW, PATH и LINK, на запись принимаются ALLOW и SET — см. Создать секцию. Ключи в верхнем регистре и не преобразуются к camelCase |
Полеaccess |
Типobject | ROда | ОписаниеКарта прав доступа: ключ — идентификатор права доступа, значение — числовой идентификатор разрешения |
Полеperm |
Типobject | ROда | ОписаниеКарта разрешений текущего сотрудника: view_time, view_title, view_full, add, edit, edit_section, access |
ПолеisCollab |
Типboolean | ROда | ОписаниеПринадлежность к коллабе |
ПолеcreatedBy |
Типnumber | ROда | ОписаниеИдентификатор сотрудника, создавшего секцию. Список сотрудников — GET /v1/users |
ПолеdateCreate |
Типdatetime | ROда | ОписаниеДата создания |
ПолеupdatedAt |
Типdatetime | ROда | ОписаниеДата последнего изменения |
«RO» — поле доступно только на чтение, передавать в POST / PATCH нельзя, иначе Вайбкод вернёт 400 READONLY_FIELD.
Пример ответа
{
"success": true,
"data": [
{
"id": 42,
"name": "Работа",
"description": "Основной рабочий календарь",
"type": "user",
"ownerId": 1,
"color": "#9cbeee",
"textColor": "#283000",
"export": {
"ALLOW": true,
"PATH": "https://example.bitrix24.ru/company/personal/user/1/calendar/",
"LINK": "&type=user&owner=1&ncc=1&user=1&sec_id=42&sign=704a559a691722ae080fa420dcb9d7f8"
},
"access": {
"U1": 39,
"G2": 13
},
"perm": {
"view_time": true,
"view_title": true,
"view_full": true,
"add": true,
"edit": true,
"edit_section": true,
"access": true
},
"isCollab": false,
"createdBy": 1,
"dateCreate": "2026-05-15 09:34:33",
"updatedAt": "2026-05-15 09:34:33"
}
],
"meta": {
"total": 1,
"hasMore": false
}
}
Пример ответа при ошибке
400 — не переданы обязательные type или ownerId:
{
"success": false,
"error": {
"code": "MISSING_REQUIRED_PARAMS",
"message": "GET /v1/calendar-sections requires query parameters: type, ownerId. Example: GET /v1/calendar-sections?type=...&ownerId=..."
}
}
Ошибки
| HTTP | Код | Описание |
|---|---|---|
| HTTP400 | КодMISSING_REQUIRED_PARAMS |
ОписаниеНе переданы type или ownerId |
| HTTP400 | КодUNSUPPORTED_FILTER |
ОписаниеПередан ключ filter[...], отличный от filter[type] и filter[ownerId] |
| HTTP400 | КодINVALID_SORT_DIRECTION |
ОписаниеНаправление в order[поле] вне asc, desc, ASC, DESC |
| HTTP403 | КодSCOPE_DENIED |
ОписаниеAPI-ключ не имеет скоупа calendar |
| HTTP401 | КодTOKEN_MISSING |
ОписаниеУ API-ключа нет настроенных токенов |
| HTTP502 | КодBITRIX_UNAVAILABLE |
ОписаниеБитрикс24 временно недоступен — повторите запрос позже |
| HTTP429 | КодRATE_LIMITED |
ОписаниеПревышен лимит запросов: 300 в минуту на портал, все API-ключи портала делят один лимит. Действующее значение — в заголовке x-ratelimit-limit. Повторите после срока из заголовка Retry-After |
Полный список общих ошибок API — Ошибки.
Известные особенности
limit обрезает выдачу на стороне API Вайбкод, offset не действует. Список всегда возвращает все секции указанной пары type + ownerId. limit обрезает полученный массив до N записей, а offset принимается, но игнорируется — пропустить записи через него нельзя.
Набор ключей export различается на чтение и на запись. В ответе приходят ALLOW, PATH и LINK: PATH — адрес календаря на портале, LINK — подписанный хвост ссылки на выгрузку iCal. Период выгрузки задаётся ключом SET при отправке через POST /v1/calendar-sections, но обратно в ответе он не появляется — сохраните значение у себя, если оно нужно для отображения. Регистр ключей Битрикс24 сохраняется в обе стороны: они остаются в верхнем регистре и не преобразуются к camelCase.
Даты приходят в часовом поясе портала без указания смещения. Формат dateCreate и updatedAt — ГГГГ-ММ-ДД ЧЧ:ММ:СС. Чтобы разобрать их как момент времени, добавьте смещение портала самостоятельно: new Date(s.replace(' ', 'T') + '+03:00').
Получить секцию по одному id через API нельзя. Эндпоинт GET /v1/calendar-sections/:id не поддерживается. Чтобы найти одну секцию по id — получите список и отфильтруйте на стороне клиента: data.find(s => s.id === 42).