Обзор Management API
Management API предназначен для внутренних задач бэк-офиса, не связанных с отправкой сообщений в чат:
- программное создание бота с помощью
POST /v1/management/bots - чтение данных определенного бота, принадлежащего вам, с помощью
GET /v1/management/bots/{bot_id} - обновление определенного бота с помощью
PATCH /v1/management/bots/{bot_id} - получение данных об использовании подписки с помощью
GET /v1/usage
Ключи Management привязаны к вашему аккаунту, а не к какому-то конкретному боту. Они намеренно отделены от ключей Bot Talk, чтобы в случае компрометации ключа чата злоумышленник не мог изменить конфигурацию ботов или просмотреть биллинговые данные.
Базовый URL
https://api.chatlab.com/aichat
Все эндпоинты в этой статье указаны относительно этого базового URL.
Начало работы
- Откройте панель управления и перейдите в раздел Account Settings > Management API (Настройки аккаунта > Management API).
- Нажмите Create Management Key (Создать ключ Management), укажите его имя, при необходимости настройте белый список IP-адресов и ограничение частоты запросов, затем подтвердите создание.
- Выберите только те права, которые требуются вашей интеграции, и скопируйте полный ключ из модального окна с подтверждением. Ключ в открытом виде отображается только один раз.
- Сохраните его на своем сервере, а не в коде для браузера или публичном репозитории. Выполните запрос только на чтение, например
GET /v1/usageс правомusage, чтобы проверить доступ. - Отзывайте неиспользуемые или скомпрометированные ключи на странице Management API.
Ключ выглядит следующим образом: mk_abcdefghijklmnopqrstuvwxyz012345. Префикс mk_ отличает его от ключей Bot Talk (ck_).
Аутентификация
Authorization: Bearer mk_abcdefghijklmnopqrstuvwxyz012345
При отправке ключа mk_ на эндпоинт /v1/chat (или любой другой эндпоинт Bot Talk) возвращается ошибка 403 key_type_not_allowed. При отправке ключа ck_ на /v1/management/* возвращается аналогичная ошибка.
Лимиты
- Не более 5 активных ключей Management API на одного пользователя
- Не более 10 запросов в минуту на один ключ (алгоритм token bucket: емкость 10, плавное пополнение со скоростью ~1 токен каждые 6 секунд). Лимит можно уменьшить при создании: задайте меньшее значение
rateLimitPerMinute, при этом снизится как верхний порог, так и скорость пополнения.
Права доступа
Каждый ключ Management содержит определенный набор из трех прав, перечисленных ниже. При создании ключа необходимо выбрать хотя бы одно из них, иначе запрос будет отклонен с ошибкой 400 invalid_request_error. Вызов эндпоинта с ключом, в котором отсутствует требуемое право, возвращает 403 insufficient_permissions.
bot_read- требуется дляGET /v1/management/bots/{bot_id}bot_management- требуется дляPOST /v1/management/botsиPATCH /v1/management/bots/{bot_id}usage- требуется дляGET /v1/usage
Структура тела запроса: вложенные разделы, повторяющие вкладки панели управления
Методы POST и PATCH принимают тело в формате JSON, разделенное на 13 секций. Каждая секция соответствует подвкладке в боковом меню настроек бота в панели управления, поэтому ключи JSON точно совпадают с видимыми вкладками: если вы измените consent.humanSupportRequirePolicyAccept через API, то увидите, как этот же переключатель изменит положение на вкладке Consent & Privacy (Согласие и конфиденциальность) в панели управления.
role- персона бота, исходный промпт, длина ответа, язык, контекст сайта / компании (вкладка Role & Behavior (Роль и поведение))conversation- приветственное сообщение, уточнение запросов, непрерывность диалога, переключатель оценки + подсказки, контент рекомендуемых вопросов + динамические уточнения (вкладка Chat Conversation (Диалог в чате))chatMemory- переключатель памяти чата, промпты для создания саммари, распределение контекста (вкладка Summaries & Memory (Сводки и память))appearance- цвета, тексты, размеры, пользовательский CSS, экран приветствия, оформление рекомендуемых вопросов, автооткрытие, имитация набора текста человеком, markdown в футере (вкладка Appearance (Внешний вид))humanSupport- форма связи с человеком (вкладка Human Contact Form (Форма связи с человеком))leadCollection- форма сбора лидов (вкладка Lead Collection (Сбор лидов))liveChat- перевод на Live Chat (вкладка Live Chat)consent- все четыре переключателя согласия с политикой конфиденциальности, а также текст экрана согласия (вкладка Consent & Privacy)whiteLabel- скрытие логотипа, ссылка для пользовательского логотипа, размещение на собственном домене (вкладка Whitelabel)security- разрешенные домены, спам-фильтр, лимиты частоты сообщений (вкладка Security (Безопасность))voice- голосовой ввод и голосовые диалоги: модель, голос, языки, промпт, ограничение длительности (вкладка Voice Conversation (Голосовой диалог))multilingual- мультиязычный режим, основной язык, доступные языки, обработка языка базы знаний (вкладка Languages (Языки))advanced- модель LLM, температура, размер контекста, лимит сообщений бота, внутренний языковой стандарт (locale), Offer Cards (вкладка Model & Advanced (Модель и расширенные настройки))
Среди доступных для записи настроек только name находится на верхнем уровне, поскольку этот параметр идентифицирует самого бота, а не относится к какой-то конкретной вкладке.
Боковое меню настроек бота сейчас содержит 16 подвкладок, 13 из которых соответствуют описанным выше секциям. Три подвкладки, у которых нет соответствующей секции: Flow, Actions и Forms - все три описаны ниже в разделе "Вне рамок API". 13 сопоставленных вкладок: Appearance, Chat Conversation, Role & Behavior, Human Contact Form, Lead Collection, Live Chat, Whitelabel, Consent & Privacy, Security, Model & Advanced, Summaries & Memory, Voice Conversation и Languages.
Тело запроса и тело ответа имеют одинаковую структуру. В ответе добавляются два дополнительных поля:
meta- только для чтения: идентификатор бота и временные метки. Удалите это поле, чтобы превратить ответ GET в валидное тело для запроса POST.apiKey- присутствует только при создании - только что сгенерированный ключ Bot Talk API для нового бота.
Два поля в общей структуре доступны только для чтения: они возвращаются в ответе, но игнорируются при попытке отправить их в POST/PATCH:
appearance.avatarUrl- полный публичный URL изображения аватара бота (например,https://api.chatlab.com/aichat/content/avatar_xyz.png). Выполните прямой GET-запрос по нему, чтобы скачать файл. Чтобы изменить аватар, загрузите новый файл через частьavatarв multipart-запросе (см. раздел PATCH).whiteLabel.whitelabelLogoUrl- полный публичный URL логотипа для шапки в режиме White Label. Работает аналогичноavatarUrl. Чтобы изменить его, загрузите новый файл через частьwhitelabel_logoв multipart-запросе (см. раздел PATCH).
Оба URL используют схему, хост и контекстный путь текущего запроса, поэтому при работе на собственном домене White Label они будут возвращаться с корнем этого домена (например, https://api.acme.com/aichat/content/...).
Передайте null вместо секции, чтобы пропустить ее при выполнении PATCH; передайте null для конкретного поля внутри секции, чтобы пропустить только это поле. Значение null на уровне поля никогда не очищает сохраненные данные - оно означает только "не изменять".
Формирование роли и промпта
Системный промпт, который непосредственно передается в LLM, формируется одним из двух способов в зависимости от значения role.role. Понимание того, какая ветка используется, позволяет определить, какие поля учитываются, а какие сохраняются, но игнорируются.
Ветка A - role.role имеет значение CUSTOMER_SUPPORT, SALES или LEAD_COLLECTION_AGENT (на основе шаблона)
Бэкенд собирает промпт из встроенного шаблона и полностью игнорирует role.rawPrompt (значение сохраняется в параметрах бота, но не используется). Шаблон включает в себя:
role.role- название роли (например, "Customer Support") и автоматически добавляемые инструкции для этой ролиname- имя бота, подставляемое в первое предложениеrole.language- значение"Auto Detect"переключает бота на язык пользователя; любое другое значение (например,"English","Polish") превращается в инструкцию "Output in {language}, unless user uses another language"role.responseLength- сопоставляется с целевым объемом слов:Concise≈ 50 слов,Normal≈ 100,Detailed≈ 200role.websiteAddress- необязательное поле; если оно заполнено, в конец добавляется фраза "for the users of the website {url}"role.companyDescription- необязательное поле; если оно заполнено, текст добавляется отдельным абзацем перед инструкциями роли
Это рекомендуемый вариант для большинства ботов: вы сразу получаете оптимизированное под конкретную роль поведение и встроенные правила безопасности.
Ветка B - role.role имеет значение CUSTOM (промпт задается пользователем)
Бэкенд использует role.rawPrompt в качестве промпта роли и добавляет к нему фиксированные платформенные указания по длине ответа. Это работает отдельно от role.responseLength: необязательная настройка Concise/Normal/Detailed не подставляется для роли CUSTOM. Точно так же параметры language, websiteAddress и companyDescription сохраняются, но не вставляются в этот промпт роли. Все нужные требования к языку, целевой длине ответов или контексту компании необходимо прописать внутри rawPrompt самостоятельно. В рантайме также могут передаваться дополнительные инструкции и контекст из базы знаний, поэтому rawPrompt не является единственным входом модели. Тональные инструкции предопределенных ролей не добавляются, однако выбор CUSTOM не убирает абсолютно все платформенные инструкции.
Используйте CUSTOM только тогда, когда шаблонный промпт не подходит под ваши задачи (например, требуется узкоспециализированная персона для конкретной отрасли, собственные ограничения безопасности или нестандартный формат вывода).
Поля типа Enum и поля с фиксированным набором значений
Поля-перечисления и поля с ограниченным набором значений отклоняют некорректные данные с ошибкой 400 invalid_parameter. Другие поля представляют собой обычные строки, даже если в интерфейсе предлагается фиксированный список. Используйте документированное написание и валидируйте отправляемые данные, не рассчитывая на то, что любая неподдерживаемая строка будет гарантированно отклонена.
role.role-CUSTOMER_SUPPORT,SALES,LEAD_COLLECTION_AGENT,CUSTOMrole.responseLength-Concise,Normal,Detailedrole.language- полное название языка на английском языке из выпадающего списка в панели управления, например:Auto Detect,English,Polish,Spanish,German,French,Italian,Portuguese,Dutch,Russian,Chinese (Simplified),Japanese,Arabic,Hindiи еще около 80 других. Значение сохраняется буквально и подставляется в шаблон промпта, поэтому двухбуквенные коды ISO (en,pl) и другие непредусмотренные значения не отклоняются API, но приводят к некорректным инструкциям вида "Output in en, unless...". Если поле опущено при создании, по умолчанию устанавливаетсяAuto Detect.advanced.model- см. подраздел "Текстовые модели ИИ" ниже. Это поле является строкой, а не валидируемым enum в схеме запроса; используйте только поддерживаемые значения, а не произвольные названия моделей.advanced.chatContextSize- используйте8000,16000или32000в соответствии с интерфейсом. Значения выше максимального лимита аккаунта автоматически и незаметно снижаются до допустимого максимума; DTO не ограничивает выбор строго этими тремя значениями.chatMemory.clientSummaryPromptType-DEFAULT,CUSTOMchatMemory.conversationSummaryPromptType-DEFAULT,CUSTOMappearance.chatAlignment-left,rightappearance.minimizedDisplayMode-icon,minified,pillappearance.chatMessageLinkTarget-_blank,_selfleadCollection.requireBeforeNewConversation- булев переключатель. Значениеtrueобязывает пользователя заполнить форму лида перед началом диалога;falseпозволяет ИИ самостоятельно решать, когда показать форму (по умолчанию).
Структурированные поля и диапазоны значений
Поля, которые выглядят как простые строки или числа, но имеют определенную структуру, диапазоны или особенности работы в интерфейсе панели управления.
-
advanced.temperature- допустимый диапазон от0.0до1.0, что соответствует ползунку в интерфейсе. Значения вне этого диапазона отклоняются с ошибкой400 invalid_parameter. -
chatMemory.summariesToKnowledgeRatio- целое число в процентах, от10до90; в интерфейсе шаг равен10, но API принимает любые целые числа из диапазона. По умолчанию50. Если память включена и размер контекста превышает 8k, этот параметр делит бюджет между базой знаний и памятью после резервирования места под промпт и недавнюю переписку, а не от всего контекста модели. При значении 8k бюджет под саммари с помощью этой настройки не выделяется. -
liveChat.schedule- JSON, закодированный в виде строки, а не вложенный JSON-объект в передаваемом запросе. Сервер сохраняет эту строку буквально как есть; интерфейс панели управления парсит ее на стороне клиента при открытии редактора расписания. После парсинга строка представляет собой структуру с одной записью для каждого дня недели плюс ключtimezone:- ключ каждого дня недели (
monday-sunday) содержит{enabled: boolean, from: "H:MM", to: "H:MM"}в 24-часовом формате timezone- название часового пояса по классификации IANA (например,"Europe/Warsaw","America/New_York")
Пример значения (обратите внимание на внешние кавычки и экранированные внутренние кавычки - это одно строковое поле, а не вложенный объект):
"{\"monday\":{\"enabled\":true,\"from\":\"9:00\",\"to\":\"17:00\"},\"tuesday\":{\"enabled\":true,\"from\":\"9:00\",\"to\":\"17:00\"},\"wednesday\":{\"enabled\":true,\"from\":\"9:00\",\"to\":\"17:00\"},\"thursday\":{\"enabled\":true,\"from\":\"9:00\",\"to\":\"17:00\"},\"friday\":{\"enabled\":true,\"from\":\"9:00\",\"to\":\"17:00\"},\"saturday\":{\"enabled\":false,\"from\":\"9:00\",\"to\":\"17:00\"},\"sunday\":{\"enabled\":false,\"from\":\"9:00\",\"to\":\"17:00\"},\"timezone\":\"Europe/Warsaw\"}"В нерабочие часы посетителю отображается сообщение из
liveChat.outOfHoursMessage, а возможность перевода на оператора отключается. Валидация внутренней структуры выполняется только на клиенте в панели управления - некорректный JSON или неизвестные ключи будут приняты API как обычная строка, но приведут к ошибке рендеринга, когда оператор позже откроет настройки бота в панели управления. Валидируйте структуру на своей стороне перед отправкой. - ключ каждого дня недели (
-
conversation.positiveRatingTooltip/conversation.negativeRatingTooltip- короткие подписи к кнопкам оценки диалога 👍 / 👎 при включенном параметреconversation.conversationRatingEnabled=true. Стандартный текст: "I like the response" / "I don't like the response". Отображаются конечным пользователям. -
whiteLabel.hideRoboAssistLogo- функция White Label, зависящая от ограничений вашего тарифа. Скрывает строку "Powered by ChatLab" в футере. Если ваш тариф не включает White Label, значение будет сохранено, но проигнорировано, и футер продолжит отображаться. -
whiteLabel.whitelabelLogoLink- функция White Label, зависящая от ограничений вашего тарифа. URL для перехода при клике на пользовательский логотип, еслиhideRoboAssistLogo=trueи файл логотипа загружен через multipart-частьwhitelabel_logo. -
appearance.simulateHumanTypingDelay- время в секундах (не в миллисекундах), целое число от0до200. Пауза между последовательными сообщениями бота при значенииsimulateHumanTyping=true. По умолчанию5. -
appearance.autoOpenChatDelaySeconds- время в секундах, целое число. Задержка перед автоматическим открытием виджета, если активны параметрыautoOpenChat=trueиautoOpenChatDelay=true. -
advanced.internalLocale- код языка и региона по стандарту IETF в форматеll_CC(с нижним подчеркиванием, А НЕll-CCчерез дефис). Допустимые значения выбираются из фиксированного списка, содержащего около 95 языковых стандартов:en_US,pl_PL,de_DE,fr_FR,es_ES,it_IT,pt_PT,nl_NL,ru_RU,zh_CN,zh_TW,ja_JP,ko_KR,ar_SA,hi_IN,tr_TR,cs_CZ,da_DK,fi_FI,sv_SE,no_NO,el_GR,he_ILи многих других. Передача только двухбуквенного кода ("en") или формата BCP-47 ("en-US") не поддерживается. По умолчаниюen_US. Этот языковой стандарт используется для форматирования дат и чисел в интерфейсе виджета и не зависит отrole.language(языка ответов бота в диалоге). -
security.talkMessagesRateLimit/security.talkMessagesRateLimitDurationSeconds- целые числа (передавайте как JSON-числа, например30, а не"30"). Установите лимит сообщений на0, чтобы отключить это ограничение в рамках сессии. При включении укажите положительную длительность. Бэкенд ограничивает количество сообщений N на сессию за указанное количество секунд, после чего посетителю выводится сообщениеsecurity.talkMessagesRateLimitHitMessage. -
advanced.botMessagesLimit- целое число (число в формате JSON, например1000). Значение0означает отсутствие дополнительного лимита на конкретного бота (при этом общий баланс кредитов аккаунта продолжает действовать); в остальных случаях значение должно быть кратно 1000 (1000,2000,10000...). Значения вроде100или1500отклоняются с ошибкой400 invalid_parameter. Это ежемесячный лимит кредитов бота, а не количество сообщений на один диалог. Маппер не ограничивает это значение рамками тарифа аккаунта, но фактический объем использования всегда ограничен общим бюджетом аккаунта.
Текстовые модели ИИ (advanced.model)
Используйте точный идентификатор модели, возвращаемый в поле advanced.model при чтении настроек бота, сконфигурированного с нужной моделью в разделе Settings > Model & Advanced (Настройки > Модель и расширенные настройки). По умолчанию при создании сейчас используется 5.6-LUNA. Идентификаторы чувствительны к регистру и отличаются от названий в интерфейсе: например, 5.6-LUNA отображается как GPT 5.6-luna.
Каталог моделей со временем обновляется. Не предполагайте, что произвольная строка или публичный идентификатор модели провайдера поддерживаются только потому, что схема запроса принимает строковый тип. Проверяйте сохраненную конфигурацию повторным чтением и тестируйте созданного чатбота перед развертыванием.
Справочник полей (полная схема запроса)
Поддерживаемые разделы и поля с указанием их типов и ключевых ограничений. Семантика PATCH: любое пропущенное поле (или переданное со значением null) оставляет сохраненное значение без изменений. Такая же структура используется и в ответе (за вычетом составного бинарного содержимого; плюс блок meta, доступный только для чтения во всех ответах, и apiKey, присутствующий только в ответе на создание).
Верхний уровень
| Поле | Тип | Ограничение | Описание |
|---|---|---|---|
name |
string | макс. 150, обязательно при создании | Отображаемое имя бота |
role |
object | См. § role | |
conversation |
object | См. § conversation | |
chatMemory |
object | См. § chatMemory | |
appearance |
object | См. § appearance | |
humanSupport |
object | См. § humanSupport | |
leadCollection |
object | См. § leadCollection | |
liveChat |
object | См. § liveChat | |
consent |
object | См. § consent | |
whiteLabel |
object | См. § whiteLabel | |
security |
object | См. § security | |
advanced |
object | См. § advanced |
Дополнения только для ответов:
meta: { id, createdAt, updatedAt }- доступно только для чтения.apiKey- string, присутствует только в ответеPOST /v1/management/bots- только что сгенерированный ключ Bot Talk для нового бота, возвращается ровно один раз.
§ role
| Поле | Тип | Ограничение | Описание |
|---|---|---|---|
role |
string (enum) | CUSTOMER_SUPPORT, SALES, LEAD_COLLECTION_AGENT, CUSTOM |
Предустановка персонажа; выбирает шаблон промпта (см. "Роль и построение промпта") |
language |
string | полное название языка на английском (English, Polish, ...) или Auto Detect |
Основной язык, передаваемый в шаблон промпта |
responseLength |
string | ∈ {Concise, Normal, Detailed} |
Желаемая подробность ответов ИИ |
websiteAddress |
string | Веб-сайт, используемый для контекста промпта | |
companyDescription |
string | Описание компании, используемое для контекста промпта | |
rawPrompt |
string | Пользовательский системный промпт - используется буквально только при role=CUSTOM |
§ conversation
| Поле | Тип | Ограничение | Описание |
|---|---|---|---|
welcomeMessage |
string | Первое сообщение, показываемое посетителю при открытии | |
queryRefinementEnabled |
boolean | Если true, уточнять вопрос посетителя перед поиском RAG | |
conversationContinuityEnabled |
boolean | Если true, вернувшиеся посетители продолжают свой последний разговор | |
conversationRatingEnabled |
boolean | Если true, отображать элементы оценки разговора (палец вверх/вниз) | |
positiveRatingTooltip |
string | Подсказка на кнопке положительной оценки | |
negativeRatingTooltip |
string | Подсказка на кнопке отрицательной оценки | |
suggestedQuestions |
string | Предлагаемые вопросы / фразы для начала диалога, разделенные переносом строки | |
dynamicSuggestedFollowups |
boolean | Если true, ИИ предлагает варианты продолжения диалога после каждого ответа | |
positiveRatingMessage |
string | Сообщение, отображаемое после положительного отзыва | |
negativeRatingMessage |
string | Сообщение, отображаемое после отрицательного отзыва | |
hideSuggestedQuestionsAfterFirstUse |
boolean | Скрывать статические подсказки после использования | |
dynamicFollowupsAutoIcons |
boolean | Если true, ИИ автоматически подбирает иконки эмодзи для динамических подсказок |
§ chatMemory
| Поле | Тип | Ограничение | Описание |
|---|---|---|---|
enabled |
boolean | Главный переключатель для функции памяти чата | |
summaryConversationsEnabled |
boolean | Сохранять сводки по каждому отдельному разговору | |
conversationSummaryPrompt |
string | Пользовательский промпт, используемый для составления сводки каждого разговора | |
conversationSummaryPromptType |
string (enum) | ∈ {DEFAULT, CUSTOM} |
Использовать ли стандартный или пользовательский промпт сводки |
clientSummaryPrompt |
string | Пользовательский промпт для составления общей сводки о клиенте по всем разговорам | |
clientSummaryPromptType |
string (enum) | ∈ {DEFAULT, CUSTOM} |
Стандартный или пользовательский промпт профиля клиента |
summariesToKnowledgeRatio |
int | 10-90 (шаг в UI 10) |
% доступного объема базы знаний/памяти, выделяемый на сводки при контексте более 8k |
§ appearance
| Поле | Тип | Ограничение | Описание |
|---|---|---|---|
launcherLabelLine1 |
string | макс. 60 | Первая строка текста лаунчера |
launcherLabelLine2 |
string | макс. 60 | Вторая строка текста лаунчера |
launcherTextColor |
string | Цвет текста лаунчера | |
launcherDismissEnabled |
boolean | Разрешить закрытие лаунчера | |
widgetFontFamily |
string | inter, system, nunito, lato, montserrat, poppins, source-serif, jetbrains-mono |
Семейство шрифтов виджета |
chatDrawerEnabled |
boolean | Включить отображение в виде боковой панели (drawer) | |
launcherColor |
string (hex) | Цвет фона лаунчера (иконки чата) | |
headerColor |
string (hex) | Цвет фона шапки чата | |
titleColor |
string (hex) | Цвет заголовка в шапке чата | |
subtitleColor |
string (hex) | Цвет подзаголовка в шапке чата | |
clientMessageBubbleColor |
string (hex) | Цвет облачка сообщения посетителя | |
clientMessageTextColor |
string (hex) | Цвет текста сообщения посетителя | |
responseMessageBubbleColor |
string (hex) | Цвет облачка ответа бота | |
responseMessageTextColor |
string (hex) | Цвет текста ответа бота | |
chatSubheader |
string | Подзаголовок, отображаемый под названием чата | |
senderPlaceholder |
string | Текст плейсхолдера в поле ввода сообщения | |
resetConversationTooltip |
string | Подсказка на кнопке "сбросить разговор" | |
chatAlignment |
string (enum) | ∈ {left, right} |
К какой стороне экрана привязан чат |
launcherBottomMargin |
int | 0-500 |
Отступ лаунчера от нижнего края (px) |
launcherSideMargin |
int | 0-500 |
Отступ лаунчера от бокового края (px) |
displayShadow |
boolean | Тень под виджетом | |
customCss |
string | Пользовательский CSS, внедряемый в iframe виджета | |
chatMessageLinkTarget |
string (enum) | ∈ {_blank, _self} |
Способ открытия ссылок внутри сообщений бота |
minimizedDisplayMode |
string (enum) | ∈ {icon, minified, pill} |
Свернутое состояние: иконка лаунчера, компактная панель ввода или таблетка |
chatDesktopWidthPx |
int | Ширина десктопного виджета | |
chatDesktopHeightPx |
int | Высота десктопного виджета | |
chatMobileSizePercent |
int | Размер мобильного виджета в % от области просмотра | |
messageFontSize |
int | Размер шрифта текста сообщений (px) | |
showChatbotBubblesDesktop |
boolean | Показывать всплывающие подсказки-тизеры на десктопе | |
showChatbotBubblesMobile |
boolean | Показывать всплывающие подсказки-тизеры на мобильных устройствах | |
chatbotBubblesDelaySeconds |
int | Задержка перед появлением подсказок-тизеров (в секундах) | |
launcherIconFullSize |
boolean | Отрисовывать пользовательскую иконку лаунчера от края до края без отступов | |
welcomeScreenEnabled |
boolean | Показывать Welcome Screen (экран приветствия) вместо немедленного перехода к чату | |
welcomeScreenQuestionsLabel |
string | Надпись над предлагаемыми вопросами на экране приветствия | |
welcomeScreenHideHumanContactForm |
boolean | Скрывать кнопку формы связи с оператором в шапке, пока отображается Welcome Screen. Она появляется снова после первого сообщения посетителя. Для ботов, созданных до 2026-09-02, по умолчанию true |
|
welcomeScreenHideLiveChat |
boolean | Скрывать кнопку чата с оператором в шапке, пока отображается Welcome Screen. Она появляется снова после первого сообщения посетителя. Для ботов, созданных до 2026-09-02, по умолчанию true |
|
headerActionsLayout |
string | ICONS или DROPDOWN |
Способ отображения Live Chat и формы связи с человеком в шапке чата: ICONS (отдельная иконка для каждого) или DROPDOWN (сгруппированы в меню шапки). Для ботов, созданных до 2026-09-02, по умолчанию ICONS |
stackSuggestedQuestions |
boolean | Располагать предлагаемые вопросы вертикально (вместо горизонтального ряда) | |
suggestedQuestionsFontSize |
int | Размер шрифта кнопок предлагаемых вопросов (px) | |
suggestedQuestionsTextColor |
string (hex) | Цвет текста кнопок предлагаемых вопросов | |
suggestedQuestionsBackgroundColor |
string (hex) | Цвет фона кнопок предлагаемых вопросов | |
autoOpenChat |
boolean | Автоматически открывать чат на десктопе | |
autoOpenChatOnMobiles |
boolean | Автоматически открывать чат на мобильных устройствах | |
autoOpenChatDelay |
boolean | Использовать задержку перед автоматическим открытием | |
autoOpenChatDelaySeconds |
int | Задержка автоматического открытия (в секундах) | |
simulateHumanTyping |
boolean | Разбивать ответ бота на несколько сообщений с анимацией набора текста | |
simulateHumanTypingDelay |
int | 0-200 |
Задержка между отправкой отдельных сообщений (в секундах) |
footerMarkdown |
string | макс. 255 | Пользовательский текст markdown в футере под чатом |
avatarUrl |
string | только для чтения | Полный публичный URL аватара; чтобы изменить его, выполните загрузку через multipart-поле avatar |
Составные части (multipart) в POST/PATCH: avatar (файловая часть). Тела ответов и запросов GET не содержат сам файл - передается только URL.
§ humanSupport
| Поле | Тип | Ограничение | Описание |
|---|---|---|---|
enabled |
boolean | Переключатель сценария связи с человеком (Human Support) | |
email |
string | обязательно (строго при создании), если enabled=true |
Адрес для получения писем поддержки |
dialogMessage |
string | Текст над формой, побуждающий к действию | |
thankYouMessage |
string | Подтверждение, отображаемое после отправки | |
emailMessageSubjectTemplate |
string | Шаблон темы письма, отправляемого оператору | |
emailMessageContentTemplate |
string | Шаблон тела письма, отправляемого оператору | |
emailPlaceholder |
string | Плейсхолдер в поле ввода email | |
messagePlaceholder |
string | Плейсхолдер в текстовом поле сообщения | |
emailWithConversationContent |
boolean | Если true, включать стенограмму разговора в тело письма | |
customFormId |
long | id существующей настраиваемой формы | Заменить встроенную контактную форму на собственную. При создании отсутствие поля использует стандартную форму; при PATCH значение null оставляет текущий выбор без изменений |
customFormMapping |
string | строка в формате JSON | Сопоставляет поля настраиваемой формы с полями письма оператору |
Параметр requirePolicyAccept находится в consent.humanSupportRequirePolicyAccept, а не здесь.
§ leadCollection
| Поле | Тип | Ограничение | Описание |
|---|---|---|---|
enabled |
boolean | Переключатель формы сбора лидов | |
nameEnabled |
boolean | Запрашивать имя | |
nameLabel |
string | Надпись поля ввода имени | |
emailEnabled |
boolean | Запрашивать email | |
emailLabel |
string | обязательно (строго при создании), если enabled=true И emailEnabled=true |
Надпись поля ввода email |
phoneEnabled |
boolean | Запрашивать телефон | |
phoneLabel |
string | обязательно (строго при создании), если enabled=true И phoneEnabled=true |
Надпись поля ввода телефона |
leaveDetailsMessage |
string | обязательно (строго при создании), если enabled=true |
Сообщение, предлагающее посетителю оставить свои контактные данные |
thankYouMessage |
string | обязательно (строго при создании), если enabled=true |
Подтверждение, отображаемое после отправки |
requireBeforeNewConversation |
boolean | Если true, форму необходимо заполнить до начала чата; если false, ИИ сам решает, когда показать форму |
|
emailNotificationEnabled |
boolean | Отправлять email владельцу каждый раз при сборе лида | |
emailNotificationAddress |
string | Получатель уведомлений (по умолчанию email учетной записи) | |
emailWithConversationContent |
boolean | Если true, включать стенограмму разговора в уведомление |
| customFormId | long | id существующей настраиваемой формы | Заменить встроенную форму сбора лидов на собственную. При создании отсутствие поля использует встроенную форму; при PATCH значение null оставляет текущий выбор без изменений |
| customFormMapping | string | строка в формате JSON | Сопоставляет поля настраиваемой формы с именем, email и телефоном |
Перекрестное правило строгой валидации при создании: при enabled=true требуется включить хотя бы одно из полей - emailEnabled или phoneEnabled. Параметр requirePolicyAccept находится в consent.leadCollectionRequirePolicyAccept, а не здесь.
§ liveChat
| Поле | Тип | Ограничение | Описание |
|---|---|---|---|
enabled |
boolean | Переключатель функции Live Chat | |
infoMessage |
string | Пояснительное сообщение перед передачей диалога | |
startMessage |
string | Сообщение, отображаемое в начале сеанса с оператором | |
endMessage |
string | Сообщение, отображаемое после завершения сеанса с оператором | |
nameLabel |
string | Надпись поля ввода имени в предварительной форме чата с оператором | |
emailLabel |
string | Надпись поля ввода email в предварительной форме чата с оператором | |
schedule |
string | строка в формате JSON (переключатели дней недели + from/to + timezone) |
График работы чата с оператором - точный формат см. в разделе "Структурированные поля и диапазоны" |
outOfHoursMessage |
string | Сообщение, отображаемое в нерабочее по графику время | |
closeModalMessage |
string | Заголовок модального окна "закрыть Live Chat?" | |
closeModalConfirmLabel |
string | Текст кнопки подтверждения в модальном окне закрытия | |
closeModalCancelLabel |
string | Текст кнопки отмены в модальном окне закрытия | |
closeModalTooltipText |
string | Подсказка на элементе закрытия чата | |
operatorHasJoinedLabel |
string | Текст, отображаемый при подключении оператора | |
operatorDidNotJoinInTimeLabel |
string | Текст, отображаемый, если оператор не подключился вовремя | |
waitingForOperatorToJoinLabel |
string | Текст, отображаемый во время ожидания оператора | |
waitingForOperatorSeconds |
int | Время ожидания ответа оператора (в секундах) | |
redirectToHumanSupportForm |
boolean | Если true, перенаправлять на форму Human Support, если оператор не ответил | |
requireAdminOnline |
boolean | Требовать присутствия доступного оператора согласно настройкам статуса | |
presenceMode |
string | Режим присутствия; используйте значение бота, настроенного в интерфейсе | |
hideHumanSupportWhenLiveChatAvailable |
boolean | Скрывать контактную форму, когда доступен чат с оператором | |
missedEmailEnabled |
boolean | по умолчанию true |
Отправлять владельцу бота email при пропущенном запросе в Live Chat. В старых ботах поле не задано, что трактуется как включенное |
Параметр requirePolicyAccept находится в consent.liveChatRequirePolicyAccept, а не здесь.
§ consent
| Поле | Тип | Ограничение | Описание |
|---|---|---|---|
newConversationRequirePolicyAccept |
boolean | Требовать согласия с политикой конфиденциальности перед началом нового разговора | |
humanSupportRequirePolicyAccept |
boolean | Требовать согласия с политикой конфиденциальности перед отправкой формы поддержки | |
leadCollectionRequirePolicyAccept |
boolean | Требовать согласия с политикой конфиденциальности перед отправкой формы сбора лидов | |
liveChatRequirePolicyAccept |
boolean | Требовать согласия с политикой конфиденциальности перед началом сеанса чата с оператором | |
newConversationConsentDescription |
string | Вводный текст на экране согласия в начале разговора | |
privacyPolicyConsentCheckboxLabel |
string | Надпись рядом с чекбоксом согласия (обычно содержит ссылку на политику конфиденциальности) |
§ whiteLabel
| Поле | Тип | Ограничение | Описание |
|---|---|---|---|
hideRoboAssistLogo |
boolean | функция White Label; зависит от лимитов аккаунта | Скрыть стандартный логотип ChatLab в футере |
whitelabelLogoLink |
string | функция White Label; зависит от лимитов аккаунта | URL, на который ведет пользовательский логотип в футере |
assignToCustomDomain |
boolean | регулируется функцией CUSTOM_DOMAIN |
Размещать чат на настроенном собственном домене |
whitelabelLogoUrl |
string | только для чтения | Полный публичный URL логотипа White Label; чтобы изменить его, выполните загрузку через multipart-поле whitelabel_logo |
Составные части (multipart) в POST/PATCH: whitelabel_logo (файловая часть). Тела ответов и запросов GET не содержат сам файл - передается только URL.
§ security
| Поле | Тип | Ограничение | Описание |
|---|---|---|---|
allowedDomains |
string | Список разрешенных доменов для встраивания виджета через запятую (пусто = белый список отключен) | |
spamFilterEnabled |
boolean | Включить спам-фильтр для входящих сообщений конкретного бота | |
countryFilterMode |
string | BLACKLIST или WHITELIST |
Принцип обработки списков стран. Сами списки доступны только администраторам |
talkMessagesRateLimit |
int | >= 0; 0 отключает |
Максимальное количество сообщений пользователя за период ограничения |
talkMessagesRateLimitDurationSeconds |
int | >= 0 |
Длительность окна ограничения частоты запросов (в секундах) |
talkMessagesRateLimitHitMessage |
string | Сообщение, показываемое посетителю при превышении лимита сообщений |
§ voice
| Поле | Тип | Ограничение | Описание |
|---|---|---|---|
inputEnabled |
boolean | Разрешить посетителю надиктовывать сообщения (преобразование речи в текст) | |
conversationEnabled |
boolean | требует наличия голосовых функций в тарифном плане | Включить полноценные голосовые диалоги |
voiceId |
string | идентификатор голоса конкретного провайдера (например, alloy) |
Какой синтетический голос используется |
model |
string | например, GPT-REALTIME-MINI, GEMINI-LIVE, ELEVENLABS-* |
Голосовая модель. Тарифицируется поминутно, стоимость зависит от модели |
turnDetection |
string | зависит от провайдера | Режим определения очередности реплик |
audioPrompt |
string | Дополнительный системный промпт, используемый только при голосовом взаимодействии | |
welcomeMessage |
string | Голосовая приветственная фраза | |
language |
string | код языка | Основной язык голоса |
additionalLanguages |
string | коды языков через запятую | Дополнительные языки, поддерживаемые голосовым агентом |
maxDurationSeconds |
int | Жесткое ограничение на длительность одного голосового разговора | |
maxDurationMessage |
string | Сообщение, отображаемое при достижении лимита по времени |
§ multilingual
| Поле | Тип | Ограничение | Описание |
|---|---|---|---|
enabled |
boolean | Переключатель многоязычного режима | |
mode |
string | AUTODETECT или FIXED_LIST |
Принцип выбора языка ответа ботом |
baseLanguage |
string | код языка | Язык, на котором составлены исходные тексты бота |
languages |
string | коды языков через запятую | Языки, предлагаемые посетителю |
knowledgeLanguageMode |
string | NONE, MAIN или DYNAMIC |
Принцип обработки базы знаний на других языках |
knowledgeLanguageFallback |
string | код языка | Язык, используемый в случае отсутствия совпадений |
§ advanced
| Поле | Тип | Ограничение | Описание |
|---|---|---|---|
model |
string | зависит от лимитов аккаунта; см. раздел "Текстовые модели ИИ" выше | Идентификатор LLM (например, 5.6-LUNA) |
temperature |
decimal | 0.0-1.0 |
Температура сэмплирования (соответствует ползунку в интерфейсе) |
chatContextSize |
int | ∈ {8000, 16000, 32000}; автоматически ограничивается лимитом вашего аккаунта |
Настроенный объем контекста, включая инструкции, историю и базу знаний |
botMessagesLimit |
long | 0 или кратно 1000 (например, 1000, 2000, 10000) |
Ежемесячный лимит сообщений для бота (0 = без отдельного лимита для бота; действует общий лимит аккаунта) |
internalLocale |
string | код локали в формате ll_CC |
Локаль для стандартных системных надписей виджета (отличается от role.language) |
productsViewEnabled |
boolean | Если true, отображать карточки товаров (Offer Cards) электронной коммерции прямо в чате | |
includeProductsInKnowledgeBase |
boolean | Если true, индексировать каталог товаров в составе базы знаний |
Не входит в область действия API
Интерфейс панели управления содержит ряд разделов, которые намеренно не включены в текущую версию Management API:
- Обучение и удаление - данные эндпоинты не позволяют получать список всех ботов, управлять наборами данных для обучения или удалять ботов. Для этих задач используйте панель управления.
- Вкладка Flow (Сценарии) - визуальный редактор сценариев диалога Conversation Flow (этапы и переходы). Недоступен через Management API.
- Вкладка Actions (Действия) - готовые интеграции для электронной коммерции и бронирования, функция AI Search и пользовательские функции API. Вызов инструментов никогда не являлся частью Management API.
- Сам конструктор настраиваемых форм - создание и редактирование настраиваемых форм не поддерживаются через API. Однако вы можете привязать уже существующую форму к боту через
leadCollection.customFormIdиhumanSupport.customFormId. - Пользовательские иконки открытия и закрытия чата -
customLauncherIconVisible,openChatIcon,closeChatIcon. Через API доступны только основные multipart-частиavatarиwhitelabel_logo. - Списки IP и стран - сами записи доступны только администраторам платформы. Через API настраивается только режим применения с помощью
security.countryFilterMode.
Эндпоинты
POST /v1/management/bots
Создать нового бота. Поддерживаются два эквивалентных типа Content-Type; выберите тот, который вам удобнее.
Режим A - обычный JSON (рекомендуется, если вам не нужно загружать аватар или логотип в том же запросе):
Content-Type: application/json- Тело запроса представляет собой JSON-конфигурацию бота (без обертки
data) - Файлы (аватар / логотип) можно загрузить позже через повторный запрос
PATCHв режиме B
Режим B - multipart/form-data (используйте при загрузке файлов в том же запросе):
Content-Type: multipart/form-data; boundary=...- JSON-часть
data(обязательно,Content-Type: application/json) - конфигурация бота во вложенном формате, описанном выше - Файловая часть
avatar(необязательно) - изображение аватара бота - Файловая часть
whitelabel_logo(необязательно) - логотип White Label (применяется, только если ваш тариф включает white-label)
В JSON обязательно только поле name; для всех остальных полей используются те же значения по умолчанию, которые установил бы мастер настройки в панели администратора.
Пример тела запроса
Ниже приведен максимальный JSON data со всеми заполненными разделами. Отправляйте только те разделы, которые вам необходимы; для всего остального будут использованы значения по умолчанию.
{
"name": "Helpdesk Bot",
"role": {
"rawPrompt": "You are a friendly support assistant for Acme Inc.",
"role": "CUSTOMER_SUPPORT",
"language": "English",
"responseLength": "Normal",
"websiteAddress": "https://acme.com",
"companyDescription": "Acme sells industrial widgets."
},
"conversation": {
"welcomeMessage": "Hi! How can I help today?",
"queryRefinementEnabled": true,
"conversationContinuityEnabled": true,
"conversationRatingEnabled": true,
"positiveRatingTooltip": "Helpful",
"negativeRatingTooltip": "Not helpful",
"suggestedQuestions": "What are your hours?\nHow do I cancel?\nWhere is my order?",
"dynamicSuggestedFollowups": true,
"dynamicFollowupsAutoIcons": true
},
"chatMemory": {
"enabled": true,
"summaryConversationsEnabled": true,
"conversationSummaryPrompt": "Summarize this conversation in 3 sentences.",
"clientSummaryPrompt": "Summarize what we know about this customer.",
"clientSummaryPromptType": "DEFAULT",
"conversationSummaryPromptType": "DEFAULT",
"summariesToKnowledgeRatio": 50
},
"appearance": {
"launcherColor": "#1A73E8",
"headerColor": "#1A73E8",
"titleColor": "#FFFFFF",
"subtitleColor": "#FFFFFF",
"clientMessageBubbleColor": "#000000",
"clientMessageTextColor": "#FFFFFF",
"responseMessageBubbleColor": "#F4F4F4",
"responseMessageTextColor": "#000000",
"chatSubheader": "AI support assistant",
"senderPlaceholder": "Type a message...",
"resetConversationTooltip": "Restart conversation",
"chatAlignment": "right",
"launcherBottomMargin": 20,
"launcherSideMargin": 20,
"displayShadow": true,
"customCss": ".rcw-conversation-container { border-radius: 16px; }",
"chatMessageLinkTarget": "_blank",
"minimizedDisplayMode": "icon",
"chatDesktopWidthPx": 400,
"chatDesktopHeightPx": 600,
"chatMobileSizePercent": 100,
"messageFontSize": 14,
"showChatbotBubblesDesktop": true,
"showChatbotBubblesMobile": false,
"chatbotBubblesDelaySeconds": 5,
"welcomeScreenEnabled": false,
"welcomeScreenQuestionsLabel": "Quick start",
"welcomeScreenHideHumanContactForm": false,
"welcomeScreenHideLiveChat": false,
"headerActionsLayout": "DROPDOWN",
"stackSuggestedQuestions": false,
"suggestedQuestionsFontSize": 14,
"suggestedQuestionsTextColor": "#000000",
"suggestedQuestionsBackgroundColor": "#F4F4F4",
"autoOpenChat": false,
"autoOpenChatOnMobiles": false,
"autoOpenChatDelay": false,
"autoOpenChatDelaySeconds": 5,
"simulateHumanTyping": true,
"simulateHumanTypingDelay": 5,
"footerMarkdown": "Powered by Acme"
},
"humanSupport": {
"enabled": true,
"email": "support@acme.com",
"dialogMessage": "Leave us a message and we will get back to you.",
"thankYouMessage": "Thanks - we received your message.",
"emailMessageSubjectTemplate": "[Acme support] New message from {customerName}",
"emailMessageContentTemplate": "{message}\n\n - \n{conversationTranscript}",
"emailPlaceholder": "your@email.com",
"messagePlaceholder": "How can we help?",
"emailWithConversationContent": true
},
"leadCollection": {
"enabled": true,
"nameEnabled": true,
"nameLabel": "Your name",
"emailEnabled": true,
"emailLabel": "Email",
"phoneEnabled": false,
"phoneLabel": "Phone",
"leaveDetailsMessage": "Please leave your details and we will get in touch.",
"thankYouMessage": "Thanks - we will be in touch shortly.",
"requireBeforeNewConversation": false,
"emailNotificationEnabled": true,
"emailNotificationAddress": "leads@acme.com",
"emailWithConversationContent": true
},
"liveChat": {
"enabled": false,
"infoMessage": "Connecting you with a human agent...",
"startMessage": "You are now chatting with our team.",
"endMessage": "Live chat has ended.",
"nameLabel": "Your name",
"emailLabel": "Email",
"schedule": "{\"monday\":{\"enabled\":true,\"from\":\"9:00\",\"to\":\"17:00\"},\"tuesday\":{\"enabled\":true,\"from\":\"9:00\",\"to\":\"17:00\"},\"wednesday\":{\"enabled\":true,\"from\":\"9:00\",\"to\":\"17:00\"},\"thursday\":{\"enabled\":true,\"from\":\"9:00\",\"to\":\"17:00\"},\"friday\":{\"enabled\":true,\"from\":\"9:00\",\"to\":\"17:00\"},\"saturday\":{\"enabled\":false,\"from\":\"9:00\",\"to\":\"17:00\"},\"sunday\":{\"enabled\":false,\"from\":\"9:00\",\"to\":\"17:00\"},\"timezone\":\"Europe/Warsaw\"}",
"outOfHoursMessage": "We are currently offline.",
"closeModalMessage": "End the live chat session?",
"closeModalConfirmLabel": "Yes, end",
"closeModalCancelLabel": "Cancel",
"closeModalTooltipText": "End live chat",
"operatorHasJoinedLabel": "An agent has joined.",
"operatorDidNotJoinInTimeLabel": "No agent available right now.",
"waitingForOperatorToJoinLabel": "Waiting for an agent...",
"waitingForOperatorSeconds": 60,
"redirectToHumanSupportForm": true
},
"consent": {
"newConversationRequirePolicyAccept": false,
"humanSupportRequirePolicyAccept": false,
"leadCollectionRequirePolicyAccept": true,
"liveChatRequirePolicyAccept": false,
"newConversationConsentDescription": "By starting a conversation you agree to our terms.",
"privacyPolicyConsentCheckboxLabel": "I have read and accepted the privacy policy."
},
"whiteLabel": {
"hideRoboAssistLogo": false,
"whitelabelLogoLink": "https://acme.com",
"assignToCustomDomain": false
},
"security": {
"allowedDomains": "acme.com,support.acme.com",
"spamFilterEnabled": true,
"talkMessagesRateLimit": 30,
"talkMessagesRateLimitDurationSeconds": 60,
"talkMessagesRateLimitHitMessage": "Please slow down."
},
"advanced": {
"model": "5.6-LUNA",
"temperature": 0.4,
"chatContextSize": 16000,
"botMessagesLimit": 1000,
"internalLocale": "en_US",
"productsViewEnabled": false
}
}
Правила валидации с соответствующими сообщениями об ошибках:
name- обязательно, не более 150 символовadvanced.temperature- от0.0до1.0chatMemory.summariesToKnowledgeRatio- целое число от10до90(проценты, шаг10)appearance.launcherBottomMargin,appearance.launcherSideMargin- от0до500appearance.footerMarkdown- не более 255 символов- Если указано
humanSupport.enabled=true, полеhumanSupport.emailдолжно быть заполнено - Если указано
leadCollection.enabled=true, хотя бы одно из полейleadCollection.emailEnabledилиleadCollection.phoneEnabledдолжно быть равноtrue; для каждого включенного канала связи обязательно наличие метки (label), а также полейleaveDetailsMessageиthankYouMessage - Параметр
advanced.chatContextSizeавтоматически ограничивается максимальным размером контекста, доступным для вашего аккаунта. Не считайте, что другие числовые поля ограничиваются автоматически.
Поля со значением null на сервере опускаются в теле JSON - при передаче отправляются только поля со значениями, отличными от null.
Пример тела ответа (201)
Формат совпадает с телом запроса, но дополнительно включает блок meta (только для чтения) и одноразовый ключ apiKey на верхнем уровне. URL-адреса файлов только для чтения (appearance.avatarUrl, whiteLabel.whitelabelLogoUrl) заполняются сервером, если соответствующие части multipart были переданы.
{
"name": "Helpdesk Bot",
"role": {
"rawPrompt": "You are a friendly support assistant for Acme Inc.",
"role": "CUSTOMER_SUPPORT",
"language": "English",
"responseLength": "Normal",
"websiteAddress": "https://acme.com",
"companyDescription": "Acme sells industrial widgets."
},
"conversation": {
"welcomeMessage": "Hi! How can I help today?",
"queryRefinementEnabled": true,
"conversationContinuityEnabled": true,
"conversationRatingEnabled": true,
"positiveRatingTooltip": "Helpful",
"negativeRatingTooltip": "Not helpful",
"suggestedQuestions": "What are your hours?\nHow do I cancel?\nWhere is my order?",
"dynamicSuggestedFollowups": true,
"dynamicFollowupsAutoIcons": true
},
"chatMemory": {
"enabled": true,
"summaryConversationsEnabled": true,
"conversationSummaryPrompt": "Summarize this conversation in 3 sentences.",
"clientSummaryPrompt": "Summarize what we know about this customer.",
"clientSummaryPromptType": "DEFAULT",
"conversationSummaryPromptType": "DEFAULT",
"summariesToKnowledgeRatio": 50
},
"appearance": {
"launcherColor": "#1A73E8",
"headerColor": "#1A73E8",
"titleColor": "#FFFFFF",
"subtitleColor": "#FFFFFF",
"clientMessageBubbleColor": "#000000",
"clientMessageTextColor": "#FFFFFF",
"responseMessageBubbleColor": "#F4F4F4",
"responseMessageTextColor": "#000000",
"chatSubheader": "AI support assistant",
"senderPlaceholder": "Type a message...",
"resetConversationTooltip": "Restart conversation",
"chatAlignment": "right",
"launcherBottomMargin": 20,
"launcherSideMargin": 20,
"displayShadow": true,
"customCss": ".rcw-conversation-container { border-radius: 16px; }",
"chatMessageLinkTarget": "_blank",
"minimizedDisplayMode": "icon",
"chatDesktopWidthPx": 400,
"chatDesktopHeightPx": 600,
"chatMobileSizePercent": 100,
"messageFontSize": 14,
"showChatbotBubblesDesktop": true,
"showChatbotBubblesMobile": false,
"chatbotBubblesDelaySeconds": 5,
"welcomeScreenEnabled": false,
"welcomeScreenQuestionsLabel": "Quick start",
"welcomeScreenHideHumanContactForm": false,
"welcomeScreenHideLiveChat": false,
"headerActionsLayout": "DROPDOWN",
"stackSuggestedQuestions": false,
"suggestedQuestionsFontSize": 14,
"suggestedQuestionsTextColor": "#000000",
"suggestedQuestionsBackgroundColor": "#F4F4F4",
"autoOpenChat": false,
"autoOpenChatOnMobiles": false,
"autoOpenChatDelay": false,
"autoOpenChatDelaySeconds": 5,
"simulateHumanTyping": true,
"simulateHumanTypingDelay": 5,
"footerMarkdown": "Powered by Acme",
"avatarUrl": "https://api.chatlab.com/aichat/content/avatar_a8f3b2c1_2026060110.png"
},
"humanSupport": {
"enabled": true,
"email": "support@acme.com",
"dialogMessage": "Leave us a message and we will get back to you.",
"thankYouMessage": "Thanks - we received your message.",
"emailMessageSubjectTemplate": "[Acme support] New message from {customerName}",
"emailMessageContentTemplate": "{message}\n\n - \n{conversationTranscript}",
"emailPlaceholder": "your@email.com",
"messagePlaceholder": "How can we help?",
"emailWithConversationContent": true
},
"leadCollection": {
"enabled": true,
"nameEnabled": true,
"nameLabel": "Your name",
"emailEnabled": true,
"emailLabel": "Email",
"phoneEnabled": false,
"phoneLabel": "Phone",
"leaveDetailsMessage": "Please leave your details and we will get in touch.",
"thankYouMessage": "Thanks - we will be in touch shortly.",
"requireBeforeNewConversation": false,
"emailNotificationEnabled": true,
"emailNotificationAddress": "leads@acme.com",
"emailWithConversationContent": true
},
"liveChat": {
"enabled": false,
"infoMessage": "Connecting you with a human agent...",
"startMessage": "You are now chatting with our team.",
"endMessage": "Live chat has ended.",
"nameLabel": "Your name",
"emailLabel": "Email",
"schedule": "{\"monday\":{\"enabled\":true,\"from\":\"9:00\",\"to\":\"17:00\"},\"tuesday\":{\"enabled\":true,\"from\":\"9:00\",\"to\":\"17:00\"},\"wednesday\":{\"enabled\":true,\"from\":\"9:00\",\"to\":\"17:00\"},\"thursday\":{\"enabled\":true,\"from\":\"9:00\",\"to\":\"17:00\"},\"friday\":{\"enabled\":true,\"from\":\"9:00\",\"to\":\"17:00\"},\"saturday\":{\"enabled\":false,\"from\":\"9:00\",\"to\":\"17:00\"},\"sunday\":{\"enabled\":false,\"from\":\"9:00\",\"to\":\"17:00\"},\"timezone\":\"Europe/Warsaw\"}",
"outOfHoursMessage": "We are currently offline.",
"closeModalMessage": "End the live chat session?",
"closeModalConfirmLabel": "Yes, end",
"closeModalCancelLabel": "Cancel",
"closeModalTooltipText": "End live chat",
"operatorHasJoinedLabel": "An agent has joined.",
"operatorDidNotJoinInTimeLabel": "No agent available right now.",
"waitingForOperatorToJoinLabel": "Waiting for an agent...",
"waitingForOperatorSeconds": 60,
"redirectToHumanSupportForm": true
},
"consent": {
"newConversationRequirePolicyAccept": false,
"humanSupportRequirePolicyAccept": false,
"leadCollectionRequirePolicyAccept": true,
"liveChatRequirePolicyAccept": false,
"newConversationConsentDescription": "By starting a conversation you agree to our terms.",
"privacyPolicyConsentCheckboxLabel": "I have read and accepted the privacy policy."
},
"whiteLabel": {
"hideRoboAssistLogo": false,
"whitelabelLogoLink": "https://acme.com",
"assignToCustomDomain": false,
"whitelabelLogoUrl": "https://api.chatlab.com/aichat/content/custom_logo_4287_2026060110.png"
},
"security": {
"allowedDomains": "acme.com,support.acme.com",
"spamFilterEnabled": true,
"talkMessagesRateLimit": 30,
"talkMessagesRateLimitDurationSeconds": 60,
"talkMessagesRateLimitHitMessage": "Please slow down."
},
"advanced": {
"model": "5.6-LUNA",
"temperature": 0.4,
"chatContextSize": 16000,
"botMessagesLimit": 1000,
"internalLocale": "en_US",
"productsViewEnabled": false
},
"meta": {
"id": 4287,
"createdAt": "2026-06-01T10:11:02Z",
"updatedAt": "2026-06-01T10:11:02Z"
},
"apiKey": "ck_freshly_minted_bot_talk_key_here"
}
Поле apiKey возвращается только при создании - это только что сгенерированный ключ Bot Talk API, привязанный к новому боту. Значение в виде открытого текста отображается один раз и не может быть получено через API повторно; сразу же сохраните его на своей стороне.
Заголовок ответа Location содержит URL нового бота (/v1/management/bots/{id}).
Примеры cURL
Режим A - обычный JSON (наиболее простой):
curl -X POST https://api.chatlab.com/aichat/v1/management/bots \
-H "Authorization: Bearer mk_..." \
-H "Content-Type: application/json" \
-d '{"name":"Helpdesk Bot","conversation":{"welcomeMessage":"Hi!"}}'
Режим B - multipart с аватаром:
curl -X POST https://api.chatlab.com/aichat/v1/management/bots \
-H "Authorization: Bearer mk_..." \
-F 'data={"name":"Helpdesk Bot","conversation":{"welcomeMessage":"Hi!"}};type=application/json' \
-F 'avatar=@./avatar.png'
GET /v1/management/bots/{bot_id}
Возвращает текущую конфигурацию принадлежащего вам бота.
Пример cURL
curl https://api.chatlab.com/aichat/v1/management/bots/4287 \
-H "Authorization: Bearer mk_..."
Пример тела ответа (200)
Формат аналогичен ответу POST, за исключением одноразового ключа apiKey. Блок meta включен. Возвращает 404 not_found_error, если бот не существует или не принадлежит вашему аккаунту.
Текущий аватар и логотип White Label отображаются в виде полных URL только для чтения (appearance.avatarUrl, whiteLabel.whitelabelLogoUrl) с тем же протоколом, хостом и контекстным путем, которые обрабатывали данный запрос. Файлы можно загрузить, выполнив прямой GET-запрос по этим URL-адресам; чтобы заменить любой из файлов, загрузите новый через multipart-часть avatar / whitelabel_logo при запросе PATCH. При передаче этих полей URL в теле запроса они игнорируются.
{
"name": "Helpdesk Bot",
"role": {
"rawPrompt": "You are a friendly support assistant for Acme Inc.",
"role": "CUSTOMER_SUPPORT",
"language": "English",
"responseLength": "Normal",
"websiteAddress": "https://acme.com",
"companyDescription": "Acme sells industrial widgets."
},
"conversation": {
"welcomeMessage": "Hi! How can I help today?",
"queryRefinementEnabled": true,
"conversationContinuityEnabled": true,
"conversationRatingEnabled": true,
"positiveRatingTooltip": "Helpful",
"negativeRatingTooltip": "Not helpful",
"suggestedQuestions": "What are your hours?\nHow do I cancel?\nWhere is my order?",
"dynamicSuggestedFollowups": true,
"dynamicFollowupsAutoIcons": true
},
"chatMemory": {
"enabled": true,
"summaryConversationsEnabled": true,
"conversationSummaryPrompt": "Summarize this conversation in 3 sentences.",
"clientSummaryPrompt": "Summarize what we know about this customer.",
"clientSummaryPromptType": "DEFAULT",
"conversationSummaryPromptType": "DEFAULT",
"summariesToKnowledgeRatio": 50
},
"appearance": {
"launcherColor": "#1A73E8",
"headerColor": "#1A73E8",
"titleColor": "#FFFFFF",
"subtitleColor": "#FFFFFF",
"clientMessageBubbleColor": "#000000",
"clientMessageTextColor": "#FFFFFF",
"responseMessageBubbleColor": "#F4F4F4",
"responseMessageTextColor": "#000000",
"chatSubheader": "AI support assistant",
"senderPlaceholder": "Type a message...",
"resetConversationTooltip": "Restart conversation",
"chatAlignment": "right",
"launcherBottomMargin": 20,
"launcherSideMargin": 20,
"displayShadow": true,
"customCss": ".rcw-conversation-container { border-radius: 16px; }",
"chatMessageLinkTarget": "_blank",
"minimizedDisplayMode": "icon",
"chatDesktopWidthPx": 400,
"chatDesktopHeightPx": 600,
"chatMobileSizePercent": 100,
"messageFontSize": 14,
"showChatbotBubblesDesktop": true,
"showChatbotBubblesMobile": false,
"chatbotBubblesDelaySeconds": 5,
"welcomeScreenEnabled": false,
"welcomeScreenQuestionsLabel": "Quick start",
"welcomeScreenHideHumanContactForm": false,
"welcomeScreenHideLiveChat": false,
"headerActionsLayout": "DROPDOWN",
"stackSuggestedQuestions": false,
"suggestedQuestionsFontSize": 14,
"suggestedQuestionsTextColor": "#000000",
"suggestedQuestionsBackgroundColor": "#F4F4F4",
"autoOpenChat": false,
"autoOpenChatOnMobiles": false,
"autoOpenChatDelay": false,
"autoOpenChatDelaySeconds": 5,
"simulateHumanTyping": true,
"simulateHumanTypingDelay": 5,
"footerMarkdown": "Powered by Acme",
"avatarUrl": "https://api.chatlab.com/aichat/content/avatar_a8f3b2c1_2026060110.png"
},
"humanSupport": {
"enabled": true,
"email": "support@acme.com",
"dialogMessage": "Leave us a message and we will get back to you.",
"thankYouMessage": "Thanks - we received your message.",
"emailMessageSubjectTemplate": "[Acme support] New message from {customerName}",
"emailMessageContentTemplate": "{message}\n\n - \n{conversationTranscript}",
"emailPlaceholder": "your@email.com",
"messagePlaceholder": "How can we help?",
"emailWithConversationContent": true
},
"leadCollection": {
"enabled": true,
"nameEnabled": true,
"nameLabel": "Your name",
"emailEnabled": true,
"emailLabel": "Email",
"phoneEnabled": false,
"phoneLabel": "Phone",
"leaveDetailsMessage": "Please leave your details and we will get in touch.",
"thankYouMessage": "Thanks - we will be in touch shortly.",
"requireBeforeNewConversation": false,
"emailNotificationEnabled": true,
"emailNotificationAddress": "leads@acme.com",
"emailWithConversationContent": true
},
"liveChat": {
"enabled": false,
"infoMessage": "Connecting you with a human agent...",
"startMessage": "You are now chatting with our team.",
"endMessage": "Live chat has ended.",
"nameLabel": "Your name",
"emailLabel": "Email",
"schedule": "{\"monday\":{\"enabled\":true,\"from\":\"9:00\",\"to\":\"17:00\"},\"tuesday\":{\"enabled\":true,\"from\":\"9:00\",\"to\":\"17:00\"},\"wednesday\":{\"enabled\":true,\"from\":\"9:00\",\"to\":\"17:00\"},\"thursday\":{\"enabled\":true,\"from\":\"9:00\",\"to\":\"17:00\"},\"friday\":{\"enabled\":true,\"from\":\"9:00\",\"to\":\"17:00\"},\"saturday\":{\"enabled\":false,\"from\":\"9:00\",\"to\":\"17:00\"},\"sunday\":{\"enabled\":false,\"from\":\"9:00\",\"to\":\"17:00\"},\"timezone\":\"Europe/Warsaw\"}",
"outOfHoursMessage": "We are currently offline.",
"closeModalMessage": "End the live chat session?",
"closeModalConfirmLabel": "Yes, end",
"closeModalCancelLabel": "Cancel",
"closeModalTooltipText": "End live chat",
"operatorHasJoinedLabel": "An agent has joined.",
"operatorDidNotJoinInTimeLabel": "No agent available right now.",
"waitingForOperatorToJoinLabel": "Waiting for an agent...",
"waitingForOperatorSeconds": 60,
"redirectToHumanSupportForm": true
},
"consent": {
"newConversationRequirePolicyAccept": false,
"humanSupportRequirePolicyAccept": false,
"leadCollectionRequirePolicyAccept": true,
"liveChatRequirePolicyAccept": false,
"newConversationConsentDescription": "By starting a conversation you agree to our terms.",
"privacyPolicyConsentCheckboxLabel": "I have read and accepted the privacy policy."
},
"whiteLabel": {
"hideRoboAssistLogo": false,
"whitelabelLogoLink": "https://acme.com",
"assignToCustomDomain": false,
"whitelabelLogoUrl": "https://api.chatlab.com/aichat/content/custom_logo_4287_2026060110.png"
},
"security": {
"allowedDomains": "acme.com,support.acme.com",
"spamFilterEnabled": true,
"talkMessagesRateLimit": 30,
"talkMessagesRateLimitDurationSeconds": 60,
"talkMessagesRateLimitHitMessage": "Please slow down."
},
"advanced": {
"model": "5.6-LUNA",
"temperature": 0.4,
"chatContextSize": 16000,
"botMessagesLimit": 1000,
"internalLocale": "en_US",
"productsViewEnabled": false
},
"meta": {
"id": 4287,
"createdAt": "2026-06-01T10:11:02Z",
"updatedAt": "2026-06-01T11:02:19Z"
}
}
Клонирование бота
Тело запроса POST /v1/management/bots и тело ответа GET /v1/management/bots/{bot_id} имеют одинаковую структуру, поэтому процесс клонирования состоит из трех шагов: выполнить GET-запрос к исходному боту, удалить поля идентификации, управляемые сервером, и отправить результат через POST-запрос.
1. Выполните GET-запрос к исходному боту.
curl https://api.chatlab.com/aichat/v1/management/bots/4287 \
-H "Authorization: Bearer mk_..." \
-o source-bot.json
2. Удалите блок верхнего уровня meta. Объект meta (id, createdAt, updatedAt) управляется сервером и доступен только для чтения - если оставить его в теле POST-запроса, ничего страшного не произойдет (сервер его проигнорирует), но его удаление явно указывает намерения и сохраняет полезную нагрузку чистой. При желании измените name, чтобы клон можно было отличить от оригинала.
jq 'del(.meta) | .name = "Helpdesk Bot (clone)"' source-bot.json > clone-body.json
3. Отправьте очищенное тело через POST-запрос, чтобы создать клон. Полную структуру тела и правила валидации см. выше в описании POST /v1/management/bots.
curl -X POST https://api.chatlab.com/aichat/v1/management/bots \
-H "Authorization: Bearer mk_..." \
-H "Content-Type: application/json" \
-d @clone-body.json
Ответ содержит meta.id нового бота, а также только что сгенерированный apiKey (ключ Bot Talk для клона). Открытый текст apiKey возвращается только в этом ответе на создание - скопируйте его перед тем, как закрыть или удалить тело ответа; позже получить его будет невозможно.
При этом копируются поддерживаемые настройки, а не полностью обученный чат-бот. Обучающие материалы, история разговоров, интеграции/действия, Flow и определения форм данными эндпоинтами не клонируются. Настройте их отдельно в приложении.
Дополнительные нюансы:
- Файлы не клонируются. Поля
appearance.avatarUrlиwhiteLabel.whitelabelLogoUrlдоступны только для чтения и указывают на файлы исходного бота. Если вам нужен тот же аватар или логотип White Label на клоне, скачайте байты по исходным URL-адресам и загрузите их как части multipart-запросаavatar/whitelabel_logo- либо при создании через POST (режим B), либо последующим PATCH-запросом. - Ключи Bot Talk не клонируются. У каждого бота есть собственный пул ключей Bot Talk. Единственный ключ
apiKey, возвращаемый при создании через POST, генерируется автоматически; при необходимости создайте дополнительные ключи на вкладке API (API) бота.
PATCH /v1/management/bots/{bot_id}
Обновление одного или нескольких полей принадлежащего вам бота. Изменяются только те разделы и поля, которые присутствуют в JSON; все пропущенное (или переданное со значением null) остается без изменений. Для каждого поля внутри отправленного раздела действуют правила частичного обновления.
Поддерживаются два эквивалентных типа Content-Type (как и для POST):
Режим A - обычный JSON (рекомендуется, если обновляются только настройки):
Content-Type: application/json- Тело запроса представляет собой JSON обновления (без обертки
data)
Режим B - multipart/form-data (используется при загрузке файлов):
- JSON-часть
data(необязательно) - данные обновления. Отправляйте только в том случае, если нужно изменить поля. Полностью опустите, если требуется только загрузить аватар или логотип. - Файловая часть
avatar(необязательно) - замена аватара - Файловая часть
whitelabel_logo(необязательно) - замена логотипа White Label (применяется только в том случае, если ваш аккаунт включает White Label)
Все три части являются необязательными в PATCH-запросе, но хотя бы одна из них должна присутствовать, чтобы вызов имел смысл.
Пример тела запроса (несколько разделов)
Здесь можно передавать любое поле, принимаемое POST /v1/management/bots. Приведенный ниже пример демонстрирует несколько разделов, а не все поддерживаемые поля; на практике вы отправляете только те ключи, которые хотите изменить (см. раздел «Минимальное частичное обновление» ниже) - каждый пропущенный ключ (или переданный со значением null) оставляет сохраненное значение нетронутым.
{
"name": "Helpdesk Bot",
"role": {
"rawPrompt": "You are a friendly support assistant for Acme Inc. Be concise.",
"role": "CUSTOMER_SUPPORT",
"language": "English",
"responseLength": "Concise",
"websiteAddress": "https://acme.com",
"companyDescription": "Acme sells industrial widgets."
},
"conversation": {
"welcomeMessage": "Hello there!",
"queryRefinementEnabled": true,
"conversationContinuityEnabled": true,
"conversationRatingEnabled": true,
"positiveRatingTooltip": "Helpful",
"negativeRatingTooltip": "Not helpful",
"suggestedQuestions": "Pricing\nShipping times\nReturns policy",
"dynamicSuggestedFollowups": true,
"dynamicFollowupsAutoIcons": true
},
"chatMemory": {
"enabled": true,
"summaryConversationsEnabled": true,
"conversationSummaryPrompt": "Summarize the conversation in 3 sentences.",
"clientSummaryPrompt": "Summarize what we know about the customer.",
"clientSummaryPromptType": "DEFAULT",
"conversationSummaryPromptType": "DEFAULT",
"summariesToKnowledgeRatio": 50
},
"appearance": {
"launcherColor": "#abcdef",
"headerColor": "#abcdef",
"titleColor": "#FFFFFF",
"subtitleColor": "#FFFFFF",
"clientMessageBubbleColor": "#000000",
"clientMessageTextColor": "#FFFFFF",
"responseMessageBubbleColor": "#F4F4F4",
"responseMessageTextColor": "#000000",
"chatSubheader": "AI assistant",
"senderPlaceholder": "Type a message",
"resetConversationTooltip": "Restart conversation",
"chatAlignment": "right",
"launcherBottomMargin": 20,
"launcherSideMargin": 20,
"displayShadow": true,
"customCss": ".rcw-conversation-container { border-radius: 16px; }",
"chatMessageLinkTarget": "_blank",
"minimizedDisplayMode": "icon",
"chatDesktopWidthPx": 400,
"chatDesktopHeightPx": 600,
"chatMobileSizePercent": 100,
"messageFontSize": 14,
"showChatbotBubblesDesktop": true,
"showChatbotBubblesMobile": false,
"chatbotBubblesDelaySeconds": 5,
"welcomeScreenEnabled": false,
"welcomeScreenQuestionsLabel": "Quick start",
"welcomeScreenHideHumanContactForm": false,
"welcomeScreenHideLiveChat": false,
"headerActionsLayout": "DROPDOWN",
"stackSuggestedQuestions": false,
"suggestedQuestionsFontSize": 14,
"suggestedQuestionsTextColor": "#000000",
"suggestedQuestionsBackgroundColor": "#F4F4F4",
"autoOpenChat": false,
"autoOpenChatOnMobiles": false,
"autoOpenChatDelay": false,
"autoOpenChatDelaySeconds": 5,
"simulateHumanTyping": true,
"simulateHumanTypingDelay": 5,
"footerMarkdown": "Powered by Acme"
},
"humanSupport": {
"enabled": true,
"email": "support@acme.com",
"dialogMessage": "Leave us a message and we'll get back to you.",
"thankYouMessage": "Thanks!",
"emailMessageSubjectTemplate": "[Acme support] New message from {customerName}",
"emailMessageContentTemplate": "{message}\n\n - \n{conversationTranscript}",
"emailPlaceholder": "your@email.com",
"messagePlaceholder": "How can we help?",
"emailWithConversationContent": true
},
"leadCollection": {
"enabled": true,
"nameEnabled": true,
"nameLabel": "Your name",
"emailEnabled": true,
"emailLabel": "Email",
"phoneEnabled": false,
"phoneLabel": "Phone",
"leaveDetailsMessage": "Please leave your details.",
"thankYouMessage": "Thanks!",
"requireBeforeNewConversation": true,
"emailNotificationEnabled": true,
"emailNotificationAddress": "leads@acme.com",
"emailWithConversationContent": true
},
"liveChat": {
"enabled": false,
"infoMessage": "Connecting you with a human agent...",
"startMessage": "You are now chatting with our team.",
"endMessage": "Live chat has ended.",
"nameLabel": "Your name",
"emailLabel": "Email",
"schedule": "{\"monday\":{\"enabled\":true,\"from\":\"9:00\",\"to\":\"17:00\"},\"tuesday\":{\"enabled\":true,\"from\":\"9:00\",\"to\":\"17:00\"},\"wednesday\":{\"enabled\":true,\"from\":\"9:00\",\"to\":\"17:00\"},\"thursday\":{\"enabled\":true,\"from\":\"9:00\",\"to\":\"17:00\"},\"friday\":{\"enabled\":true,\"from\":\"9:00\",\"to\":\"17:00\"},\"saturday\":{\"enabled\":false,\"from\":\"9:00\",\"to\":\"17:00\"},\"sunday\":{\"enabled\":false,\"from\":\"9:00\",\"to\":\"17:00\"},\"timezone\":\"Europe/Warsaw\"}",
"outOfHoursMessage": "We are currently offline.",
"closeModalMessage": "End the live chat session?",
"closeModalConfirmLabel": "Yes, end",
"closeModalCancelLabel": "Cancel",
"closeModalTooltipText": "End live chat",
"operatorHasJoinedLabel": "An agent has joined.",
"operatorDidNotJoinInTimeLabel": "No agent available right now.",
"waitingForOperatorToJoinLabel": "Waiting for an agent...",
"waitingForOperatorSeconds": 60,
"redirectToHumanSupportForm": true
},
"consent": {
"newConversationRequirePolicyAccept": false,
"humanSupportRequirePolicyAccept": false,
"leadCollectionRequirePolicyAccept": true,
"liveChatRequirePolicyAccept": false,
"newConversationConsentDescription": "By starting a conversation you agree to our terms.",
"privacyPolicyConsentCheckboxLabel": "I have read and accepted the privacy policy."
},
"whiteLabel": {
"hideRoboAssistLogo": false,
"whitelabelLogoLink": "https://acme.com",
"assignToCustomDomain": false
},
"security": {
"allowedDomains": "acme.com,support.acme.com",
"spamFilterEnabled": true,
"talkMessagesRateLimit": 30,
"talkMessagesRateLimitDurationSeconds": 60,
"talkMessagesRateLimitHitMessage": "Please slow down."
},
"advanced": {
"model": "5",
"temperature": 0.2,
"chatContextSize": 32000,
"botMessagesLimit": 2000,
"internalLocale": "en_US",
"productsViewEnabled": false
}
}
Минимальное частичное обновление
Отправьте PATCH-запрос для одного поля, передав ровно те ключи, которые нужно изменить, - все остальное будет сохранено.
{
"appearance": {
"launcherColor": "#abcdef"
}
}
Примеры cURL
Режим A - обычный JSON (наиболее простой способ):
curl -X PATCH https://api.chatlab.com/aichat/v1/management/bots/4287 \
-H "Authorization: Bearer mk_..." \
-H "Content-Type: application/json" \
-d '{"appearance":{"launcherColor":"#abcdef"}}'
Режим B - multipart (при замене аватара или логотипа):
curl -X PATCH https://api.chatlab.com/aichat/v1/management/bots/4287 \
-H "Authorization: Bearer mk_..." \
-F 'data={"appearance":{"launcherColor":"#abcdef"}};type=application/json' \
-F 'avatar=@./new-avatar.png'
Режим B - замена только аватара (без изменения полей):
curl -X PATCH https://api.chatlab.com/aichat/v1/management/bots/4287 \
-H "Authorization: Bearer mk_..." \
-F 'avatar=@./new-avatar.png'
Тело ответа (200)
Та же структура, что и в GET /v1/management/bots/{bot_id} - полная конфигурация бота после применения обновления, включая блок meta. Поле apiKey отсутствует. Возвращает 404 not_found_error, если бот не существует или не принадлежит вашему аккаунту.
В примере ниже показан ответ после применения обновления из раздела Полное тело запроса (несколько разделов) выше к боту из примера с GET: измененные поля отражают новые значения, нетронутые поля сохранены, а значение meta.updatedAt обновляется.
{
"name": "Helpdesk Bot",
"role": {
"rawPrompt": "You are a friendly support assistant for Acme Inc. Be concise.",
"role": "CUSTOMER_SUPPORT",
"language": "English",
"responseLength": "Concise",
"websiteAddress": "https://acme.com",
"companyDescription": "Acme sells industrial widgets."
},
"conversation": {
"welcomeMessage": "Hello there!",
"queryRefinementEnabled": true,
"conversationContinuityEnabled": true,
"conversationRatingEnabled": true,
"positiveRatingTooltip": "Helpful",
"negativeRatingTooltip": "Not helpful",
"suggestedQuestions": "Pricing\nShipping times\nReturns policy",
"dynamicSuggestedFollowups": true,
"dynamicFollowupsAutoIcons": true
},
"chatMemory": {
"enabled": true,
"summaryConversationsEnabled": true,
"conversationSummaryPrompt": "Summarize the conversation in 3 sentences.",
"clientSummaryPrompt": "Summarize what we know about the customer.",
"clientSummaryPromptType": "DEFAULT",
"conversationSummaryPromptType": "DEFAULT",
"summariesToKnowledgeRatio": 50
},
"appearance": {
"launcherColor": "#abcdef",
"headerColor": "#abcdef",
"titleColor": "#FFFFFF",
"subtitleColor": "#FFFFFF",
"clientMessageBubbleColor": "#000000",
"clientMessageTextColor": "#FFFFFF",
"responseMessageBubbleColor": "#F4F4F4",
"responseMessageTextColor": "#000000",
"chatSubheader": "AI assistant",
"senderPlaceholder": "Type a message",
"resetConversationTooltip": "Restart conversation",
"chatAlignment": "right",
"launcherBottomMargin": 20,
"launcherSideMargin": 20,
"displayShadow": true,
"customCss": ".rcw-conversation-container { border-radius: 16px; }",
"chatMessageLinkTarget": "_blank",
"minimizedDisplayMode": "icon",
"chatDesktopWidthPx": 400,
"chatDesktopHeightPx": 600,
"chatMobileSizePercent": 100,
"messageFontSize": 14,
"showChatbotBubblesDesktop": true,
"showChatbotBubblesMobile": false,
"chatbotBubblesDelaySeconds": 5,
"welcomeScreenEnabled": false,
"welcomeScreenQuestionsLabel": "Quick start",
"welcomeScreenHideHumanContactForm": false,
"welcomeScreenHideLiveChat": false,
"headerActionsLayout": "DROPDOWN",
"stackSuggestedQuestions": false,
"suggestedQuestionsFontSize": 14,
"suggestedQuestionsTextColor": "#000000",
"suggestedQuestionsBackgroundColor": "#F4F4F4",
"autoOpenChat": false,
"autoOpenChatOnMobiles": false,
"autoOpenChatDelay": false,
"autoOpenChatDelaySeconds": 5,
"simulateHumanTyping": true,
"simulateHumanTypingDelay": 5,
"footerMarkdown": "Powered by Acme",
"avatarUrl": "https://api.chatlab.com/aichat/content/avatar_a8f3b2c1_2026060110.png"
},
"humanSupport": {
"enabled": true,
"email": "support@acme.com",
"dialogMessage": "Leave us a message and we'll get back to you.",
"thankYouMessage": "Thanks!",
"emailMessageSubjectTemplate": "[Acme support] New message from {customerName}",
"emailMessageContentTemplate": "{message}\n\n - \n{conversationTranscript}",
"emailPlaceholder": "your@email.com",
"messagePlaceholder": "How can we help?",
"emailWithConversationContent": true
},
"leadCollection": {
"enabled": true,
"nameEnabled": true,
"nameLabel": "Your name",
"emailEnabled": true,
"emailLabel": "Email",
"phoneEnabled": false,
"phoneLabel": "Phone",
"leaveDetailsMessage": "Please leave your details.",
"thankYouMessage": "Thanks!",
"requireBeforeNewConversation": true,
"emailNotificationEnabled": true,
"emailNotificationAddress": "leads@acme.com",
"emailWithConversationContent": true
},
"liveChat": {
"enabled": false,
"infoMessage": "Connecting you with a human agent...",
"startMessage": "You are now chatting with our team.",
"endMessage": "Live chat has ended.",
"nameLabel": "Your name",
"emailLabel": "Email",
"schedule": "{\"monday\":{\"enabled\":true,\"from\":\"9:00\",\"to\":\"17:00\"},\"tuesday\":{\"enabled\":true,\"from\":\"9:00\",\"to\":\"17:00\"},\"wednesday\":{\"enabled\":true,\"from\":\"9:00\",\"to\":\"17:00\"},\"thursday\":{\"enabled\":true,\"from\":\"9:00\",\"to\":\"17:00\"},\"friday\":{\"enabled\":true,\"from\":\"9:00\",\"to\":\"17:00\"},\"saturday\":{\"enabled\":false,\"from\":\"9:00\",\"to\":\"17:00\"},\"sunday\":{\"enabled\":false,\"from\":\"9:00\",\"to\":\"17:00\"},\"timezone\":\"Europe/Warsaw\"}",
"outOfHoursMessage": "We are currently offline.",
"closeModalMessage": "End the live chat session?",
"closeModalConfirmLabel": "Yes, end",
"closeModalCancelLabel": "Cancel",
"closeModalTooltipText": "End live chat",
"operatorHasJoinedLabel": "An agent has joined.",
"operatorDidNotJoinInTimeLabel": "No agent available right now.",
"waitingForOperatorToJoinLabel": "Waiting for an agent...",
"waitingForOperatorSeconds": 60,
"redirectToHumanSupportForm": true
},
"consent": {
"newConversationRequirePolicyAccept": false,
"humanSupportRequirePolicyAccept": false,
"leadCollectionRequirePolicyAccept": true,
"liveChatRequirePolicyAccept": false,
"newConversationConsentDescription": "By starting a conversation you agree to our terms.",
"privacyPolicyConsentCheckboxLabel": "I have read and accepted the privacy policy."
},
"whiteLabel": {
"hideRoboAssistLogo": false,
"whitelabelLogoLink": "https://acme.com",
"assignToCustomDomain": false,
"whitelabelLogoUrl": "https://api.chatlab.com/aichat/content/custom_logo_4287_2026060110.png"
},
"security": {
"allowedDomains": "acme.com,support.acme.com",
"spamFilterEnabled": true,
"talkMessagesRateLimit": 30,
"talkMessagesRateLimitDurationSeconds": 60,
"talkMessagesRateLimitHitMessage": "Please slow down."
},
"advanced": {
"model": "5",
"temperature": 0.2,
"chatContextSize": 32000,
"botMessagesLimit": 2000,
"internalLocale": "en_US",
"productsViewEnabled": false
},
"meta": {
"id": 4287,
"createdAt": "2026-06-01T10:11:02Z",
"updatedAt": "2026-06-01T12:45:08Z"
}
}
GET /v1/usage
Получение текущей информации об использовании подписки для аккаунта, которому принадлежит ключ Management.
Тело ответа (200)
{
"subscriptionType": "your-plan-id",
"messages": {"used": 4123, "limit": 11000, "remaining": 6877},
"bots": {"used": 3, "limit": 5, "remaining": 2}
}
subscriptionType- идентификатор текущего плана аккаунта в нижнем регистре (your-plan-idприведен в качестве примера). Планы формируются из динамического каталога, поэтому точный набор идентификаторов со временем может меняться по мере переименования или добавления планов - обрабатывайте это значение как произвольную строку, а не как фиксированное перечисление.messages.used/limit/remaining- кредиты сообщений за текущий календарный месяц, которые сбрасываются в первый день месяца, а не в день продления подписки. Они рассчитываются с учетом веса кредитов, а не просто по количеству ответов.bots.used/limit/remaining- количество принадлежащих вам ботов, включая ботов на паузе, учитываемых в общем лимите ботов для вашего аккаунта.
Заголовки rate limit
Ответы, дошедшие до этапа проверки лимитов (то есть после успешного прохождения аутентификации и проверки белого списка IP), содержат следующие заголовки:
X-RateLimit-Limit: 10
X-RateLimit-Remaining: 7
X-RateLimit-Reset: 1715430000
X-RateLimit-Limit- лимит для конкретного ключа, примененный к данному вызову (по умолчанию 10 или настроенное вами значениеrateLimitPerMinute, если оно ниже).X-RateLimit-Remaining- количество оставшихся токенов в корзине сразу после этого вызова.X-RateLimit-Reset- время в формате Unix epoch (в секундах), когда станет доступен следующий токен (это не полный сброс корзины; корзина пополняется непрерывно). Когда корзина заполнена, здесь указывается текущее время.
В ответах 429 rate_limit_exceeded также передается заголовок Retry-After, где указано целое число секунд до освобождения хотя бы одного токена.
Ошибки на этапе до аутентификации (401 missing_api_key, 401 invalid_api_key, 403 ip_blocked) и 403 ip_not_whitelisted не содержат заголовков X-RateLimit-* - модуль ограничения частоты запросов опрашивается только после успешного завершения аутентификации и проверки IP.
Формат ошибок
Используется та же структура, что и в Bot Talk API:
{
"error": {
"type": "permission_error",
"code": "key_type_not_allowed",
"message": "This endpoint requires a MANAGEMENT API key.",
"param": null
}
}
Ошибки валидации используют code: "invalid_parameter" и добавляют путь к ошибочному полю в начало сообщения, чтобы проблемный участок было легко обнаружить:
{
"error": {
"type": "invalid_request_error",
"code": "invalid_parameter",
"message": "humanSupport.email Human support email is required when humanSupport.enabled=true"
}
}
Некорректные значения для перечислений и полей с фиксированным набором значений (например, chatMemory.clientSummaryPromptType = "BOGUS") содержат путь к полю, отклоненное значение и список допустимых вариантов:
{
"error": {
"type": "invalid_request_error",
"code": "invalid_parameter",
"message": "chatMemory.clientSummaryPromptType 'BOGUS' is not a valid value. Allowed: CUSTOM, DEFAULT"
}
}
Материалы по теме
Информацию о конечных точках для диалогов и потоковой передаче SSE см. в разделе Bot Talk API.