Документация

API

Формат запросов, ответов и справочник полей для интеграций.

Записи

Запись — клиентский визит, связанный с событием календаря. Через API записей можно читать данные визита и сохранять его кастомные поля; создать запись или изменить время, клиента, услуги, персонал и ресурсы нужно через событие календаря.

Получение записи и кастомные поля

Список содержит неудалённые записи текущей организации и сортируется по времени начала, затем по id. Участник без права Events видит только записи, где он назначен сотрудником. Параметр custom_fields_full=true возвращает в списке все определения кастомных полей вместо полей с признаком показа в карточке.

МетодURLОписание
GET/api/?mod=data&data=bookingПолучить список клиентских записей вместе с определениями кастомных полей.
GET/api/?mod=data&data=booking&id=IDПолучить одну запись по id. Если запись недоступна, data будет пустым объектом.
POST/api/?mod=save_data&data=bookingСохранить custom_fields существующей записи. id обязателен; обычные поля записи этот endpoint не изменяет.

Поля записи

Каждое поле типа datetime дополнительно возвращается с суффиксами _iso_string и _timezone. Время приводится к часовому поясу организации. Те же три значения добавляются для booking_snapshot.start и booking_snapshot.end.

Верхнеуровневый custom_fields содержит определения полей, а data[].customFields или data.customFields — значения по uid. Публичный UID формы отзыва в этом API не возвращается.

ПолеТипОписание
idnumberВнутренний идентификатор материализованной записи.
uidstringПубличный UID записи. Это не UID формы обратной связи.
event_idnumberИдентификатор связанного события календаря или правила серии.
client_idnumberИдентификатор клиента в справочнике текущей организации.
titlestringНазвание записи, синхронизированное со связанным событием.
dt_startdatetimeНачало конкретного визита.
dt_enddatetimeОкончание конкретного визита.
client_commentstring|nullНеизменяемый снимок комментария клиента при самостоятельной записи. Внутренняя заметка события сюда не попадает.
cancellation_commentstring|nullПричина отмены, если она была передана.
availabilitynumberРежим доступности, скопированный из события.
target_typenumberТип связанного события календаря.
statusstringТекущий бизнес-статус записи. Отмена устанавливает cancelled; состоявшийся визит определяется отдельно по visit_completed_at.
series_sync_statusstringТехническое состояние записи относительно синхронизации регулярной серии.
new_booking_notice_sent_atdatetime|nullВремя фиксации уведомления о создании записи.
client_confirmed_atdatetime|nullВремя явного подтверждения записи клиентом.
visit_completed_atdatetime|nullВремя необратимой отметки «Визит состоялся».
visit_completed_by_user_idnumberИдентификатор пользователя кабинета, отметившего визит; до завершения равен 0.
cancelled_atdatetime|nullДата и время отмены.
cancelled_by_typestringТип инициатора отмены: user или client; до отмены — пустая строка.
cancelled_by_idnumberИдентификатор пользователя кабинета или глобального клиента в зависимости от cancelled_by_type; до отмены равен 0.
services_idsarrayМассив id основных услуг визита.
additional_services_idsarrayМассив id дополнительных услуг.
resource_requirementsarrayСнимок требований к ресурсам в JSON.
staff_idsarrayМассив id назначенных сотрудников.
booking_snapshotobject|nullВитринный снимок организации, клиента, услуг, сотрудников, ресурсов, цены и локального времени на момент синхронизации записи.
feedback_eligiblebooleanПризнак существования состояния обратной связи для этой записи.
feedbackobjectВозвращается только при feedback_eligible=true. Безопасный объект содержит id, rating, comment, кабинетный срок account_expires_at, время submitted_at и boolean submitted. До отправки rating равен 0.
customFieldsobjectЗначения кастомных полей записи по uid.
deletedDataobjectНеобязательные витринные данные удалённых связанных справочников и тегов, если они нужны для отображения старой записи.
Пример ответа одной записи
GET /api/?mod=data&data=booking&id=42

{
	"ok": true,
	"data": {
		"id": 42,
		"uid": "d8fd3975f8df4e849290606cd48b6f68",
		"event_id": 18,
		"client_id": 31,
		"title": "Стрижка",
		"dt_start": "2026-09-21 14:00:00",
		"dt_start_iso_string": "2026-09-21T14:00:00+03:00",
		"dt_start_timezone": "Europe/Moscow",
		"dt_end": "2026-09-21 15:00:00",
		"dt_end_iso_string": "2026-09-21T15:00:00+03:00",
		"dt_end_timezone": "Europe/Moscow",
		"status": "active",
		"visit_completed_at": "2026-09-21 15:05:00",
		"visit_completed_at_iso_string": "2026-09-21T15:05:00+03:00",
		"visit_completed_at_timezone": "Europe/Moscow",
		"feedback_eligible": true,
		"feedback": {
			"id": 9,
			"rating": 5,
			"comment": "Всё понравилось",
			"account_expires_at": "2026-12-21 15:00:00",
			"account_expires_at_iso_string": "2026-12-21T15:00:00+03:00",
			"account_expires_at_timezone": "Europe/Moscow",
			"submitted_at": "2026-09-21 16:12:00",
			"submitted_at_iso_string": "2026-09-21T16:12:00+03:00",
			"submitted_at_timezone": "Europe/Moscow",
			"submitted": true
		},
		"customFields": {
			"result": "Повторный визит через месяц"
		}
	},
	"custom_fields": [
		{
			"id": 5,
			"uid": "result",
			"target": "bookings",
			"name": "Результат визита",
			"type": "textarea",
			"required": false,
			"show_in_card": true,
			"show_to_clients": false
		}
	]
}
Пример сохранения кастомных полей
POST /api/?mod=save_data&data=booking

{
	"id": 42,
	"custom_fields": {
		"result": "Повторный визит через месяц"
	}
}

Действия с записью

Все действия выполняются методом POST. Параметр id можно передать в строке запроса или JSON-теле.

МетодURLОписание
POST/api/?mod=bookings&action=cancel&id=IDОтменить запись, сохранить её в истории и убрать связанное событие или вхождение из календаря.
POST/api/?mod=bookings&action=complete&id=IDНеобратимо отметить визит состоявшимся. При включённой обратной связи создаётся состояние будущего отзыва.
POST/api/?mod=bookings&action=delete&id=IDФизически удалить запись и её кастомные поля. Запись исчезнет из раздела записей и календаря.

Параметры действий

Для JSON-запроса передавайте параметры в теле. Значение cancellation_comment не используется действиями complete и delete.

ПолеТипОбязательноеДействияОписание
idnumberДаcancel, complete, deleteИдентификатор конкретной записи, включая конкретное материализованное вхождение регулярной серии.
cancellation_commentstringНетcancelНеобязательный комментарий к отмене. Пробелы и переводы строк по краям удаляются, максимальная длина — 1000 символов.

Права и поведение действий

Доступ. Владелец, администратор и пользователь с правом Events могут выполнять все действия в своей организации. Участник без этого права может отменить или удалить только созданное им событие, но не может выполнить complete. Назначение мастером само по себе не даёт права отметить визит.

Состоявшийся визит. complete доступен начиная с трёх часов до dt_start и не имеет верхнего ограничения по времени. Отменённую запись завершить нельзя. Завершение хранится в visit_completed_at; поле status при этом не обязано меняться на completed.

Повторные запросы. Повторные cancel и complete возвращают уже сохранённый результат без второго уведомления, отзыва или веб-хука. Повторный delete вернёт ошибку недоступной записи.

Обратная связь. Если organizations.collect_feedback=true в момент первого complete, создаётся единственный объект отзыва. До dt_end + 1 час сообщение планируется ровно на этот момент; при более поздней отметке в пределах 24 часов — сразу. После 24 часов автоматическая доставка и публичная ссылка не создаются, но отзыв остаётся доступен клиенту в кабинете до трёх календарных месяцев после окончания визита. Публичный токен никогда не возвращается.

Отмена и удаление. cancel переводит запись в cancelled и сохраняет метаданные отмены. delete физически удаляет запись и её кастомные поля; разовое событие получает dt_delete. После complete отмена запрещена. Восстановление отдельным действием модуля bookings не предусмотрено.

Регулярная серия. cancel и delete относятся только к записи с переданным id. Дата вхождения добавляется в recurrence_exdates родительского события; серия и соседние даты не меняются. complete изменяет только выбранную запись и не исключает дату из серии.

Побочные эффекты. Действия синхронно меняют связанную запись и событие, публикуют booking-веб-хук с причиной cancel, complete или delete. Отмена запускает стандартное уведомление сотрудникам, а завершение будит очередь клиентской обратной связи.

Поля успешных ответов действий

Для datetime-полей также возвращаются варианты _iso_string и _timezone. Необязательные объекты и поля добавляются только когда они существуют: например, cancellation_comment — только для непустого комментария, feedback — только при feedback_eligible=true.

ПолеТипДействияОписание
idnumbercancel, complete, deleteИдентификатор обработанной записи.
event_idnumbercancel, complete, deleteИдентификатор связанного календарного события.
statusstringcancel, completeАктуальный статус записи после действия.
cancelled_atdatetimecancelВремя отмены с ISO-строкой и часовым поясом.
cancelled_by_typestringcancelТип инициатора отмены. В модуле кабинета это user.
cancelled_by_idnumbercancelИдентификатор инициатора отмены.
cancellation_commentstringcancelНормализованный непустой комментарий к отмене.
visit_completed_atdatetimecompleteВремя первой отметки визита с ISO-строкой и часовым поясом.
visit_completed_by_user_idnumbercompleteПользователь, первым отметивший визит.
feedback_eligiblebooleancompleteСоздано ли состояние обратной связи.
feedbackobjectcompleteСостояние отзыва с id, оценкой, комментарием, сроками сообщения, публичной формы и кабинета и временем отправки. Публичный UID не возвращается.
recurringbooleancancel, deleteОтносилась ли запись к регулярному событию.
occurrence_startdatetimecancel, deleteДата и время обработанного вхождения с ISO-строкой и часовым поясом.
occurrence_keystringcancel, deleteСтабильный ключ обработанного вхождения серии.
deletedbooleandeleteВсегда true после успешного физического удаления.
Пример ответа при отметке визита
POST /api/?mod=bookings&action=complete&id=42

{
	"ok": true,
	"data": {
		"id": 42,
		"event_id": 18,
		"status": "active",
		"visit_completed_at": "2026-09-21 15:05:00",
		"visit_completed_at_iso_string": "2026-09-21T15:05:00+03:00",
		"visit_completed_at_timezone": "Europe/Moscow",
		"visit_completed_by_user_id": 7,
		"feedback_eligible": true,
		"feedback": {
			"id": 9,
			"rating": 0,
			"comment": null,
			"message_due_at": "2026-09-21 16:00:00",
			"message_due_at_iso_string": "2026-09-21T16:00:00+03:00",
			"message_due_at_timezone": "Europe/Moscow",
			"public_expires_at": "2026-09-28 16:00:00",
			"public_expires_at_iso_string": "2026-09-28T16:00:00+03:00",
			"public_expires_at_timezone": "Europe/Moscow",
			"account_expires_at": "2026-12-21 15:00:00",
			"account_expires_at_iso_string": "2026-12-21T15:00:00+03:00",
			"account_expires_at_timezone": "Europe/Moscow",
			"submitted_at": null,
			"submitted_at_iso_string": null,
			"submitted_at_timezone": "Europe/Moscow"
		}
	}
}
Пример запроса и ответа при отмене
POST /api/?mod=bookings&action=cancel&id=42

{
	"cancellation_comment": "Клиент попросил перенести визит"
}

{
	"ok": true,
	"data": {
		"id": 42,
		"event_id": 18,
		"status": "cancelled",
		"cancelled_at": "2026-09-21 12:30:00",
		"cancelled_at_iso_string": "2026-09-21T12:30:00+03:00",
		"cancelled_at_timezone": "Europe/Moscow",
		"cancelled_by_type": "user",
		"cancelled_by_id": 7,
		"cancellation_comment": "Клиент попросил перенести визит",
		"recurring": true,
		"occurrence_start": "2026-09-21 14:00:00",
		"occurrence_start_iso_string": "2026-09-21T14:00:00+03:00",
		"occurrence_start_timezone": "Europe/Moscow",
		"occurrence_key": "20260921140000"
	}
}

Ответы с ошибками

Data-endpoints используют общие коды сохранения, а действия — диапазон 551–557. Ошибка доступа к конкретной записи в действии намеренно не отличима от отсутствующей записи.

КодКогда возникаетОтвет
11-14Нет сессии, организации, прав чтения или права сохранить кастомные поля записи.Один из общих кодов 11–14 с локализованным message.
16-17Не заполнено обязательное кастомное поле или значение кастомного поля невалидно.required для кода 16 либо errors для кода 17.
18Попытка удалить запись через общий delete_data вместо mod=bookings&action=delete.message о невозможности удаления.
551Передано неизвестное действие с клиентской записью.message с описанием неизвестного действия.
552Запись не найдена, удалена, недоступна или относится к другой организации.message о недоступной записи.
553Связанное календарное событие не найдено.message об отсутствующем событии.
554Вхождение не подтверждено правилами регулярной серии.message о недоступном вхождении серии.
555Запись отменена, визит уже завершён для несовместимого действия или текущее состояние иначе запрещает действие.message о недопустимом состоянии.
556Комментарий к отмене после trim длиннее 1000 символов.message о максимальной длине комментария.
557Визит отмечают состоявшимся раньше чем за три часа до начала.message о допустимом времени действия.