Эндпоинт развёрнут на стадии. Примеры верифицируются после деплоя в продакшен.

#Список секций

GET /v1/calendar-sections

Возвращает все секции календаря для пары type + ownerId. У одного сотрудника может быть несколько секций — например, «Работа», «Личное», «Командные встречи».

#Параметры

Параметр Тип Обяз. По умолч. Описание
type (query) string да Тип календаря: user (личный), group (групповой), company_calendar (компании), location (переговорная)
ownerId (query) number да Идентификатор владельца календаря: сотрудник (GET /v1/users), рабочая группа или 0 для type=location
limit (query) number нет 50 Количество записей (до 5000). При limit > 50 API Вайбкода автоматически запрашивает несколько страниц у Битрикс24
offset (query) number нет 0 Пропустить N записей

На стороне Битрикс24 метод calendar.section.get не поддерживает фильтрацию через filter[...]. Любая попытка передать filter[name]=... или другой ключ возвращает 400 UNSUPPORTED_FILTER — без вызова Битрикс24.

#Примеры

#curl — личный ключ

Terminal
curl "https://vibecode.bitrix24.tech/v1/calendar-sections?type=user&ownerId=1" \
  -H "X-Api-Key: YOUR_API_KEY"

#curl — OAuth-приложение

Terminal
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 — личный ключ

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-приложение

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_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 да Идентификатор секции
name string нет Название
description string нет Описание
type string нет Тип календаря: user, group, company_calendar, location
ownerId number нет Идентификатор владельца календаря
color string нет Цвет секции (#RRGGBB)
textColor string нет Цвет текста (#RRGGBB)
export object нет Параметры экспорта в формате iCal: { "ALLOW": boolean, "SET": "all" | "3_9" | "6_12" }. Ключи внутри объекта — в верхнем регистре, формат сохраняется на запись и чтение без преобразований
access object да Карта прав доступа: ключ — идентификатор права доступа, значение — числовой идентификатор разрешения
perm object да Карта разрешений текущего сотрудника: view_time, view_title, view_full, add, edit, edit_section, access
isCollab boolean да Принадлежность к коллабе
createdBy number да Идентификатор создателя секции
dateCreate datetime да Дата создания
updatedAt datetime да Дата последнего изменения

«RO» (read-only) — поле доступно только на чтение, передавать в POST / PATCH нельзя (Вайбкод вернёт 400 READONLY_FIELD).

#Пример ответа

JSON
{
  "success": true,
  "data": [
    {
      "id": 42,
      "name": "Работа",
      "description": "Основной рабочий календарь",
      "type": "user",
      "ownerId": 1,
      "color": "#9cbeee",
      "textColor": "#283000",
      "export": {
        "ALLOW": true,
        "SET": "3_9"
      },
      "access": {
        "U1": "calendar_owner",
        "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-15T09:34:33+03:00",
      "updatedAt": "2026-05-15T09:34:33+03:00"
    }
  ],
  "meta": {
    "total": 1,
    "hasMore": false
  }
}

#Пример ответа при ошибке

400 — не переданы обязательные type и (или) ownerId:

JSON
{
  "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 Код Описание
400 MISSING_REQUIRED_PARAMS Не переданы type и (или) ownerId
400 UNSUPPORTED_FILTER Передан ключ filter[...] — метод calendar.section.get не поддерживает фильтрацию. Допустимы только type, ownerId, limit, offset
403 SCOPE_DENIED API-ключ не имеет скоупа calendar
401 TOKEN_MISSING У API-ключа нет настроенных токенов
502 BITRIX_UNAVAILABLE Битрикс24 временно недоступен — повторите запрос позже

Полный список общих ошибок API — Ошибки.

#Известные особенности

limit и offset принимаются, но фильтрации на стороне Битрикс24 нет. Метод calendar.section.get всегда возвращает все секции для указанной пары type + ownerId. API Вайбкода применяет limit / offset к полученному массиву уже после ответа Битрикс24.

Поле export сохраняет регистр Битрикс24. Ключи внутри export остаются ALLOW и SET в верхнем регистре — не преобразуются к camelCase. То же при отправке через `POST /v1/calendar-sections`: передавайте именно { "ALLOW": true, "SET": "3_9" }.

Получить секцию по одному id через API нельзя. Эндпоинт GET /v1/calendar-sections/:id не реализован, потому что у Битрикс24 нет соответствующего метода. Чтобы найти одну секцию по id — получите список и отфильтруйте на стороне клиента: data.find(s => s.id === 42).

#Смотрите также