#Создать событие

POST /v1/calendar-events

Создаёт новое событие в указанном календаре.

#Поля запроса (body)

Поле Тип Обяз. Описание
type string да Тип календаря: user, group, company_calendar
ownerId number да ID владельца календаря: сотрудник (GET /v1/users) или рабочая группа
name string да Название события
from datetime да Начало события в ISO 8601. Принимается строка с явным смещением (2026-06-10T10:00:00+03:00), в UTC (2026-06-10T07:00:00Z) или без зоны (2026-06-10T10:00:00)
to datetime да Окончание события в ISO 8601. Принимается строка с явным смещением (2026-06-10T11:00:00+03:00), в UTC (2026-06-10T08:00:00Z) или без зоны (2026-06-10T11:00:00)
timezoneFrom string нет Часовой пояс начала события (IANA-имя: Europe/Moscow, Asia/Almaty, UTC). Без него используется часовой пояс сотрудника-владельца API-ключа
timezoneTo string нет Часовой пояс окончания события (IANA-имя)
description string нет Описание
sectionId number нет ID секции календаря. Если поле не передано — при каждом вызове создаётся новая секция. Чтобы события писались в одну секцию, передавайте sectionId существующей секции. ID существующей секции возвращает `GET /v1/calendar-events` в поле sectionId любого ранее созданного события
skipTime boolean нет Событие на весь день. При true время в from/to игнорируется, длительность фиксируется в 24 часа
importance string нет high, normal, low
accessibility string нет Занятость: busy, quest (под вопросом), free, absent
location string нет Место проведения
color string нет Цвет события (HEX, #RRGGBB)
attendees number[] нет Массив ID приглашённых сотрудников. Список: GET /v1/users. Только для записи — в ответе участники возвращаются в полях attendeeList, attendeesCodes, attendeesEntityList. См. Поля события
remind array нет Настройки напоминаний. Каждый элемент: {type: 'min' | 'hour' | 'day', count: <число>}
rrule object нет Расписание повторения регулярного события. Структура полей и пример — секция Регулярное событие ниже
isPrivate boolean нет Приватное событие — детали скрыты от других пользователей
isMeeting boolean нет Событие-встреча с приглашениями

Полный список полей: `GET /v1/calendar-events/fields`.

#Примеры

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

Terminal
curl -X POST "https://vibecode.bitrix24.tech/v1/calendar-events" \
  -H "X-Api-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "type": "user",
    "ownerId": 1,
    "name": "Созвон с командой",
    "from": "2026-06-10T10:00:00",
    "to": "2026-06-10T11:00:00",
    "timezoneFrom": "Europe/Moscow",
    "timezoneTo": "Europe/Moscow",
    "description": "Еженедельная синхронизация",
    "accessibility": "busy",
    "sectionId": 3
  }'

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

Terminal
curl -X POST "https://vibecode.bitrix24.tech/v1/calendar-events" \
  -H "X-Api-Key: YOUR_APP_KEY" \
  -H "Authorization: Bearer USER_SESSION_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "type": "user",
    "ownerId": 1,
    "name": "Созвон с командой",
    "from": "2026-06-10T10:00:00",
    "to": "2026-06-10T11:00:00",
    "timezoneFrom": "Europe/Moscow",
    "timezoneTo": "Europe/Moscow",
    "description": "Еженедельная синхронизация",
    "accessibility": "busy",
    "sectionId": 3
  }'

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

javascript
const res = await fetch('https://vibecode.bitrix24.tech/v1/calendar-events', {
  method: 'POST',
  headers: {
    'X-Api-Key': 'YOUR_API_KEY',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    type: 'user',
    ownerId: 1,
    name: 'Созвон с командой',
    from: '2026-06-10T10:00:00',
    to: '2026-06-10T11:00:00',
    timezoneFrom: 'Europe/Moscow',
    timezoneTo: 'Europe/Moscow',
    description: 'Еженедельная синхронизация',
    accessibility: 'busy',
    sectionId: 3,
  }),
})

const { success, data } = await res.json()
console.log('ID события:', data.id)

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

javascript
const res = await fetch('https://vibecode.bitrix24.tech/v1/calendar-events', {
  method: 'POST',
  headers: {
    'X-Api-Key': 'YOUR_APP_KEY',
    'Authorization': 'Bearer USER_SESSION_TOKEN',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    type: 'user',
    ownerId: 1,
    name: 'Созвон с командой',
    from: '2026-06-10T10:00:00',
    to: '2026-06-10T11:00:00',
    timezoneFrom: 'Europe/Moscow',
    timezoneTo: 'Europe/Moscow',
    description: 'Еженедельная синхронизация',
    accessibility: 'busy',
    sectionId: 3,
  }),
})

const { success, data } = await res.json()

#Регулярное событие

Чтобы создать повторяющееся событие, передайте поле rrule как объект. Запрос:

Terminal
curl -X POST "https://vibecode.bitrix24.tech/v1/calendar-events" \
  -H "X-Api-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "type": "user",
    "ownerId": 1,
    "name": "Созвон команды",
    "from": "2026-07-13T10:00:00",
    "to": "2026-07-13T11:00:00",
    "timezoneFrom": "Europe/Moscow",
    "timezoneTo": "Europe/Moscow",
    "rrule": {
      "FREQ": "WEEKLY",
      "INTERVAL": 1,
      "BYDAY": ["MO", "WE"],
      "UNTIL": "2026-09-30"
    }
  }'

Создаётся одно событие с одним id — список (GET /v1/calendar-events) вернёт по элементу на каждое вхождение серии, все они будут иметь общий parentId. Удаление события (DELETE /v1/calendar-events/:id) убирает всю серию.

Поля rrule:

Поле Тип Описание
FREQ string Периодичность: DAILY, WEEKLY, MONTHLY, YEARLY
INTERVAL number Интервал. 1 — каждый цикл, 2 — через один и т. д.
BYDAY string[] Дни недели для WEEKLY: SU, MO, TU, WE, TH, FR, SA
UNTIL date Дата окончания серии в формате YYYY-MM-DD. Альтернатива — COUNT
COUNT number Количество повторений. Альтернатива — UNTIL

#Поля ответа

Объект созданного события со всеми полями — см. Поля события.

URL карточки события в Битрикс24 зависит от типа календаря:

type URL
user https://<portal>.bitrix24.ru/company/personal/user/<ownerId>/calendar/?EVENT_ID=<id>&EVENT_DATE=<dd.mm.yyyy>
group https://<portal>.bitrix24.ru/workgroups/group/<ownerId>/calendar/?EVENT_ID=<id>&EVENT_DATE=<dd.mm.yyyy>
company_calendar https://<portal>.bitrix24.ru/calendar/?EVENT_ID=<id>&EVENT_DATE=<dd.mm.yyyy>

<dd.mm.yyyy> — дата начала события (поле from) в формате «день.месяц.год» через точку. <portal> — домен вашего портала. Доступ ограничен правами сотрудника в Битрикс24.

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

JSON
{
  "success": true,
  "data": {
    "id": 7773,
    "parentId": 7773,
    "deleted": false,
    "type": "user",
    "ownerId": 1,
    "name": "Созвон с командой",
    "from": "2026-06-10T10:00:00+03:00",
    "to": "2026-06-10T11:00:00+03:00",
    "skipTime": false,
    "durationSeconds": 3600,
    "createdBy": 1,
    "dateCreate": "06/05/2026 09:12:00 am",
    "updatedAt": "06/05/2026 09:12:00 am",
    "description": "Еженедельная синхронизация",
    "accessibility": "busy",
    "importance": "normal",
    "isMeeting": false,
    "meetingStatus": "H",
    "meetingHost": 1,
    "sectionId": 3,
    "attendeeList": [
      { "id": 1, "entryId": "7773", "status": "H" }
    ]
  }
}

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

422 — не передано обязательное поле:

JSON
{
  "success": false,
  "error": {
    "code": "BITRIX_ERROR",
    "message": "Не задан обязательный параметр \"name\" для метода \"calendar.event.add\""
  }
}

#Ошибки

HTTP Код Описание
422 BITRIX_ERROR Не передано обязательное поле (type, ownerId, name, from, to)
400 READONLY_FIELD В теле запроса передано read-only поле (id, createdBy, dateCreate, updatedAt)
403 SCOPE_DENIED API-ключ не имеет скоупа calendar
401 TOKEN_MISSING API-ключ не имеет настроенных токенов

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

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

Накопление секций при создании без sectionId. Если поле sectionId не передано, при каждом вызове создаётся новая секция календаря. На серии вызовов без sectionId в календаре сотрудника копятся пустые секции, видимые в веб-интерфейсе Битрикс24. Чтобы все события писались в одну секцию, передавайте sectionId существующей секции — её ID можно взять из ответа `GET /v1/calendar-events`.

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