Helpdesk API
Система тикетов поддержки. Позволяет создавать тикеты от клиентов, отвечать на них и управлять статусами. При обращении в поддержку пользователь автоматически подписывается на уведомления. Включите Helpdesk в настройках проекта.
Управление тикетами через API
Полный CRUD тикетов доступен по REST API с API-ключом проекта (Bearer zn_live_…) — создание, список с фильтрами, переписка, смена статуса/приоритета, назначение и массовые операции. Те же действия можно выполнять в кабинете и через MCP-сервер для AI-агентов.
POST /v1/helpdesk/tickets — создание тикета
Создаёт тикет от имени клиента. Номер тикета генерируется автоматически.
text string обязательныйТекст первого сообщения
subject string Тема обращения (необязательно)
channel string Канал: telegram, max или virtual. По умолчанию virtual
chat_id number Chat ID в мессенджере. Обязателен для telegram/max
first_name string Имя клиента
username string Username клиента
ticket_type_id string UUID типа обращения (из GET /v1/helpdesk/ticket-types). Необязательный.
Ответ
GET /v1/helpdesk/tickets — список тикетов
Возвращает список тикетов проекта. Фильтрация по статусу: ?status=new|in_progress|waiting|closed.
GET /v1/helpdesk/tickets/{id} — детали тикета
Возвращает полную информацию о тикете по ID, включая все сообщения.
POST /v1/helpdesk/tickets/{id}/reply — ответ на тикет
Отправляет ответ агента на тикет. Клиент получит уведомление в мессенджер.
text string обязательныйТекст первого сообщения
internal bool true — внутренняя заметка, не видна клиенту и не списывает кредит
POST /v1/helpdesk/tickets/{id}/customer-reply — ответ виртуального клиента
Отправляет ответ от имени виртуального клиента (channel=virtual). Только для тикетов с каналом virtual. Агенты получат уведомление, а webhook ticket.replied будет отправлен.
text string обязательныйТекст первого сообщения
PATCH /v1/helpdesk/tickets/{id}/status — смена статуса
Изменяет статус тикета. Допустимые значения: new, in_progress, waiting, closed.
status string обязательныйНовый статус: new, in_progress, waiting или closed
PATCH /v1/helpdesk/tickets/{id}/assign — назначить агента
Назначает тикет на агента поддержки.
assigned_to string | null UUID агента; null или пропуск — снять назначение
PATCH /v1/helpdesk/tickets/{id}/priority — приоритет тикета
Изменяет приоритет тикета. Допустимые значения: low, normal, high, urgent.
priority string обязательныйПриоритет: low, normal, high, urgent
GET /v1/helpdesk/ticket-types — типы обращений
Возвращает список активных типов обращений проекта. Каждый тип содержит id, name, description. Используйте ticket_type_id при создании тикета для классификации обращений. Типы настраиваются в дашборде (Settings → Поддержка).
Webhook-события
ticket.created — создан тикет, ticket.replied — ответ на тикет, ticket.status_changed — смена статуса, ticket.assigned — назначен агент, ticket.closed — тикет закрыт, ticket.csat_received — получена CSAT-оценка, ticket.unanswered_24h — тикет без ответа.
SLA-трекинг (6.4.3)
В ответе тикета — first_reply_at, closed_at и вычисляемые time_to_first_response_seconds, time_to_resolve_seconds. SLA-отчёт по проекту (средние времена, число нарушений, средний CSAT) — в кабинете на вкладке Helpdesk.
Массовые операции (6.4.8)
POST /v1/helpdesk/tickets/bulk — действие над списком тикетов (до 100). Поля: ticket_ids[], action (close / set_status / assign / set_priority / add_tag / remove_tag), value. Ответ: {affected}.
CSAT (6.4.5)
При включённом csat_enabled после закрытия тикета клиенту приходит сообщение с кнопками 1-5. Оценка сохраняется в csat_rating, шлётся webhook ticket.csat_received. Включается в кабинете на вкладке Helpdesk.
Автомаршрутизация (6.4.9)
Правила прогоняются при создании тикета, применяется первое подходящее. Условие (channel / subject_contains / text_contains / ticket_type_id) и действие (assign_to / set_priority / add_tag). Настраивается в кабинете.
Webhook ticket.unanswered_24h (6.4.10)
Воркер раз в час ищет тикеты в статусе new/in_progress, где последнее сообщение от клиента старше порога (12/24/48 ч), и шлёт webhook один раз. Порог настраивается в кабинете.
POST /v1/helpdesk/request — тикет для неподписанных
Если пользователь ещё не подписан на проект — используйте этот endpoint. Сервис создаёт deeplink в бот, где пользователь соглашается подписаться и сразу попадает в форму создания тикета.
- Клиент жмёт «Связаться с поддержкой» на вашем сайте → вы дёргаете /v1/helpdesk/request и получаете request_id + deeplinks.
- Открываете клиенту deeplink (Telegram или Max). Бот покажет название проекта, описание и попросит подписаться.
- После согласия подписка создаётся автоматически, сразу открывается меню helpdesk (создание тикета, ticket-types, активные тикеты).
- Polling-ом GET /v1/helpdesk/request/{request_id}/status ждёте status=accepted — вместе с ним приходит subscriber_id.
Создание запроса
channel string Предпочитаемый канал (telegram или max). Если не указан — в ответе оба deeplink'а.
ticket_type_id string (UUID) Опционально: id типа обращения для pre-selected на экране создания тикета.
Ответ
Проверка статуса
Polling каждые 1-2 секунды. Статусы: pending (ждём пользователя), accepted (подписался и открыл меню helpdesk), cancelled (нажал «Отмена»), expired (15 мин TTL).
request_id живёт 15 минут. Если пользователь уже подписан — бот пропускает экран согласия и сразу открывает меню helpdesk. Требует helpdesk_enabled=true и helpdesk_allow_create=true в настройках проекта.
Конфигурация helpdesk через API
Настройки модуля, SLA, типы обращений, готовые ответы и правила маршрутизации можно менять не только в кабинете, но и через REST API по API-ключу проекта (Bearer zn_live_…). Те же операции доступны AI-агентам через MCP-сервер.
PUT /v1/helpdesk/settings — настройки модуля: включение, приветствие, SLA, CSAT, allow_create/allow_view, порог «без ответа»GET /v1/helpdesk/sla — отчёт по соблюдению SLA и текущие порогиGET /v1/helpdesk/ticket-types/config — все типы обращений, включая выключенные (рантайм-список включённых — GET /v1/helpdesk/ticket-types)POST /v1/helpdesk/ticket-types, PUT/DELETE /v1/helpdesk/ticket-types/{type_id} — CRUD типов обращенийGET/POST /v1/helpdesk/canned-responses, PUT/DELETE /v1/helpdesk/canned-responses/{canned_id} — CRUD готовых ответовGET/POST /v1/helpdesk/routing-rules, PUT/DELETE /v1/helpdesk/routing-rules/{rule_id} — CRUD правил маршрутизации тикетовНастройки модуля — PUT /v1/helpdesk/settings
Все поля опциональны — передаются только изменяемые. Поля helpdesk_welcome_message и helpdesk_close_message — объекты вида { ru, en }, а не строки.
helpdesk_enabled bool Включить/выключить модуль helpdesk
helpdesk_welcome_message object {ru,en} Приветственное сообщение, мультиязычный объект
helpdesk_close_message object {ru,en} Сообщение при закрытии тикета, мультиязычный объект
sla_first_reply_hours int | null SLA на первый ответ в часах, null — выключить
sla_resolve_hours int | null SLA на решение в часах, null — выключить
helpdesk_ticket_types_enabled bool Включить выбор типа обращения
helpdesk_allow_create bool Разрешить подписчикам создавать тикеты
helpdesk_allow_view bool Разрешить подписчикам просматривать свои тикеты
csat_enabled bool Включить опрос удовлетворённости (CSAT)
csat_message_template string ≤1024 Текст CSAT-сообщения
helpdesk_unanswered_hours 12 | 24 | 48 | null Порог алерта «без ответа», null — выключить
Тип обращения — POST/PUT /v1/helpdesk/ticket-types
name string обязательныйНазвание типа обращения
description string Описание типа
sort_order int Порядок сортировки в списке
enabled bool Только для PUT — включён ли тип
Готовый ответ — POST /v1/helpdesk/canned-responses
title string обязательныйЗаголовок готового ответа
text string обязательныйТекст ответа
shortcut string Короткая команда для быстрой вставки
Правило маршрутизации — POST /v1/helpdesk/routing-rules
name string обязательныйНазвание правила
condition object обязательныйУсловие срабатывания, непустой объект
action object обязательныйДействие при срабатывании
order_index int Приоритет применения правила