#Создать событие
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 — личный ключ
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-приложение
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 — личный ключ
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-приложение
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 как объект. Запрос:
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.
#Пример ответа
{
"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 — не передано обязательное поле:
{
"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`.