Обзор 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-адресов и лимит запросов (rate limit), затем подтвердите создание.
- Скопируйте полный ключ из модального окна об успешном создании. В открытом виде он отображается только один раз.
Ключ выглядит как 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 находится на верхнем уровне, так как оно идентифицирует бота, а не относится к какой-то конкретной вкладке.
В боковом меню настроек бота сейчас 15 подвкладок, и 13 из них соответствуют разделам выше. Две подвкладки, не имеющие соответствующего раздела, - это Flow (Сценарий) и Actions (Действия); обе описаны ниже в разделе "Вне рамок 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- только для чтения: id бота и временные метки. Удалите это поле, чтобы превратить ответ GET в валидное тело для POST.apiKey- присутствует только при создании - только что сгенерированный API-ключ Bot Talk для нового бота.
Два поля внутри общей структуры предназначены только для чтения - они возвращаются в ответе, но игнорируются при передаче в POST/PATCH:
appearance.avatarUrl- полный публичный URL изображения аватара бота (например,https://api.chatlab.com/aichat/content/avatar_xyz.png). Выполните к нему прямой GET-запрос, чтобы скачать файл. Чтобы изменить его, загрузите новый файл через multipart-параметрavatar(см. описание PATCH).whiteLabel.whitelabelLogoUrl- полный публичный URL логотипа в шапке для White Label. Работает аналогичноavatarUrl. Чтобы изменить его, загрузите новый файл через multipart-параметрwhitelabel_logo(см. описание 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 без изменений в качестве полного системного промпта. Поля responseLength, language, websiteAddress, companyDescription сохраняются, но не вставляются в промпт: если вы хотите, чтобы они влияли на поведение бота, вам необходимо прописать их в тексте rawPrompt самостоятельно. Ограничения безопасности и инструкции по тону общения для конкретных ролей также не добавляются - вы полностью контролируете весь промпт.
Используйте вариант CUSTOM только тогда, когда шаблонный промпт не подходит под вашу задачу (например, вам требуется узкоспециализированная персона, собственные правила безопасности или нестандартный формат вывода).
Поля с перечислениями (enum / фиксированный набор значений)
Некоторые поля принимают только строго определенный набор строковых значений. Передача любого другого значения отклоняется с ошибкой 400 validation_failed, а путь к полю указывается в error.param. Значения чувствительны к регистру.
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- см. подраздел "Текстовые модели AI" ниже; список доступных моделей зависит от лимитов вашей учетной записи, и отправка значения, недоступного для вашего аккаунта, вернет400 invalid_parameteradvanced.chatContextSize-8000,16000,32000. Зависит от лимитов учетной записи; более высокие значения автоматически урезаются до допустимого максимумаchatMemory.clientSummaryPromptType-DEFAULT,CUSTOMchatMemory.conversationSummaryPromptType-DEFAULT,CUSTOMappearance.chatAlignment-left,rightappearance.minimizedDisplayMode-icon,minifiedappearance.chatMessageLinkTarget-_blank,_selfleadCollection.requireBeforeNewConversation- логический тумблер. Значениеtrueобязывает пользователя заполнить форму сбора лидов до начала диалога;falseпозволяет AI самостоятельно решать, когда показать форму (по умолчанию).
Структурированные поля и диапазоны
Поля, которые выглядят как простые строки или числа, но имеют определенную структуру, диапазоны или особенности отображения в панели администратора, о которых важно знать.
-
advanced.temperature- допустимый диапазон от0.0до1.0, аналогично ползунку в панели управления. Значения вне этого диапазона отклоняются с ошибкой400 validation_failed. -
chatMemory.summariesToKnowledgeRatio- целое число в процентах от10до90с шагом10. Определяет, какая часть контекста чата отводится под историю сводок клиента по сравнению с остальными данными (база знаний, текущий диалог, инструкции). По умолчанию50. Значения вне диапазона10-90отклоняются с ошибкой400 validation_failed. Применяется только приchatMemory.enabled=trueИchatMemory.summaryConversationsEnabled=true. -
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- короткие подсказки, отображаемые при наведении на кнопки 👍 / 👎 рядом с каждым ответом AI, когда включен параметр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отключает лимит сообщений по IP. Если указано ненулевое значение, виджет ограничивает отправку до N сообщений за указанный период в секундах, после чего посетителю выводится сообщениеsecurity.talkMessagesRateLimitHitMessage. -
advanced.botMessagesLimit- целое число (число в JSON, например1000). Значение0означает "без ограничений"; в противном случае число должно быть кратно 1000 (1000,2000,10000и т. д.). Значения вида100или1500отклоняются с ошибкой400 validation_failed. Кроме того, значение автоматически урезается до максимального лимита вашего тарифного плана.
Текстовые модели AI (advanced.model)
Передавайте точное значение API (колонка слева, выделенная кодом). В скобках указано отображаемое имя в панели администратора. Доступный список моделей определяется ограничениями вашей учетной записи; отправка модели, недоступной для вашего аккаунта, вернет 400 invalid_parameter. Значение по умолчанию для новых ботов - 5-MINI.
4-O-MINI(GPT 4-o mini)4-O(GPT 4-o)4.1-MINI(GPT 4.1-mini)4.1(GPT 4.1)5-MINI(GPT 5-mini)5(GPT 5)5.1(GPT 5.1)5.4-MINI(GPT 5.4-mini)5.4(GPT 5.4)5.5(GPT 5.5)GEMINI 2.5 PRO(Gemini 2.5 Pro)GEMINI 3 Flash(Gemini 3 Flash)GEMINI 3.5 Flash(Gemini 3.5 Flash)GEMINI 3.7 Flash(Gemini 3.7 Flash)GEMINI 3.8 Flash(Gemini 3.8 Flash)GEMINI 3.1 Flash-Lite(Gemini 3.1 Flash-Lite)GEMINI 3 PRO(Gemini 3 Pro)
Справочник полей (полная схема запроса)
Каждое поле в передаваемых данных с указанием его типа, ограничений и однострочного описания. Семантика 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 API для нового бота, возвращается ровно один раз.
§ 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, ИИ предлагает варианты дальнейших вопросов после каждого ответа | |
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, шаг 10 |
% контекстного окна чата, выделенный под краткие содержания относительно базы знаний RAG |
§ appearance
| Поле | Тип | Ограничение | Описание |
|---|---|---|---|
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} |
Свернутое состояние: иконка запуска или компактная панель ввода |
chatDesktopWidthPx |
int | Ширина виджета на десктопе | |
chatDesktopHeightPx |
int | Высота виджета на десктопе | |
chatMobileSizePercent |
int | Размер мобильного виджета в % от области просмотра | |
messageFontSize |
int | Размер шрифта текста сообщений (px) | |
showChatbotBubblesDesktop |
boolean | Показывать всплывающие подсказки-тизеры на десктопе | |
showChatbotBubblesMobile |
boolean | Показывать всплывающие подсказки-тизеры на мобильных | |
chatbotBubblesDelaySeconds |
int | Задержка перед появлением тизеров (секунды) | |
launcherIconFullSize |
boolean | Отображать пользовательскую иконку запуска на всю площадь кнопки без отступов | |
welcomeScreenEnabled |
boolean | Показывать экран приветствия вместо прямого перехода в чат | |
welcomeScreenQuestionsLabel |
string | Подпись над предлагаемыми вопросами на экране приветствия | |
welcomeScreenHideHumanContactForm |
boolean | Скрывать кнопку формы связи с человеком в шапке при открытом экране приветствия. Она снова появится после первого сообщения посетителя. Для ботов, созданных до 2026-09-02, по умолчанию true |
|
welcomeScreenHideLiveChat |
boolean | Скрывать кнопку Live Chat в шапке при открытом экране приветствия. Она снова появится после первого сообщения посетителя. Для ботов, созданных до 2026-09-02, по умолчанию true |
|
headerActionsLayout |
string | 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 | обязательно (create-strict), если enabled=true |
Адрес, на который приходят письма поддержки |
dialogMessage |
string | Приветственное сообщение, отображаемое над формой | |
thankYouMessage |
string | Сообщение с благодарностью, показываемое после отправки | |
emailMessageSubjectTemplate |
string | Шаблон темы письма, отправляемого оператору | |
emailMessageContentTemplate |
string | Шаблон тела письма, отправляемого оператору | |
emailPlaceholder |
string | Текст-заполнитель в поле ввода email | |
messagePlaceholder |
string | Текст-заполнитель в поле ввода сообщения | |
emailWithConversationContent |
boolean | Если true, включать историю диалога в тело письма | |
customFormId |
long | идентификатор существующей настраиваемой формы | Заменить встроенную контактную форму на настраиваемую. Значение null оставляет встроенную форму |
customFormMapping |
string | JSON-строка | Сопоставляет поля настраиваемой формы с полями письма поддержки |
Параметр requirePolicyAccept находится в consent.humanSupportRequirePolicyAccept, а не здесь.
§ leadCollection
| Поле | Тип | Ограничение | Описание |
|---|---|---|---|
enabled |
boolean | Переключатель формы сбора лидов | |
nameEnabled |
boolean | Запрашивать имя | |
nameLabel |
string | Подпись поля ввода имени | |
emailEnabled |
boolean | Запрашивать email | |
emailLabel |
string | обязательно (create-strict), если enabled=true И emailEnabled=true |
Подпись поля ввода email |
phoneEnabled |
boolean | Запрашивать телефон | |
phoneLabel |
string | обязательно (create-strict), если enabled=true И phoneEnabled=true |
Подпись поля ввода телефона |
leaveDetailsMessage |
string | обязательно (create-strict), если enabled=true |
Сообщение с просьбой оставить контактные данные |
thankYouMessage |
string | обязательно (create-strict), если enabled=true |
Сообщение с благодарностью, показываемое после отправки |
requireBeforeNewConversation |
boolean | Если true, форма должна быть отправлена до начала диалога; если false, ИИ сам решает, когда показать форму |
|
emailNotificationEnabled |
boolean | Отправлять email владельцу при каждом сборе лида | |
emailNotificationAddress |
string | Получатель уведомлений (по умолчанию email аккаунта) | |
emailWithConversationContent |
boolean | Если true, включать историю диалога в уведомление |
Межполевое правило create-strict: при enabled=true требуется хотя бы одно включенное поле из emailEnabled или phoneEnabled. Параметр requirePolicyAccept находится в consent.leadCollectionRequirePolicyAccept, а не здесь.
| customFormId | long | идентификатор существующей настраиваемой формы | Заменить встроенную форму лидов на настраиваемую. Значение null оставляет встроенную форму |
| customFormMapping | string | JSON-строка | Сопоставляет поля настраиваемой формы с полями имени / email / телефона |
§ liveChat
| Поле | Тип | Ограничение | Описание |
|---|---|---|---|
enabled |
boolean | Переключатель функции Live Chat | |
infoMessage |
string | Пояснительное сообщение перед передачей диалога | |
startMessage |
string | Сообщение в начале сеанса с оператором | |
endMessage |
string | Сообщение при завершении сеанса с оператором | |
nameLabel |
string | Подпись поля ввода имени в предварительной форме Live Chat | |
emailLabel |
string | Подпись поля ввода email в предварительной форме Live Chat | |
schedule |
string | JSON-строка (переключатели дней недели + from/to + timezone) |
График работы Live Chat - точный формат см. в разделе «Структурированные поля и диапазоны» |
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, если оператор не ответил | |
missedEmailEnabled |
boolean | по умолчанию true |
Отправлять email владельцу бота, если запрос в Live Chat остался без ответа. В старых ботах не задано, что расценивается как включено |
Параметр requirePolicyAccept находится в consent.liveChatRequirePolicyAccept, а не здесь.
§ consent
| Поле | Тип | Ограничение | Описание |
|---|---|---|---|
newConversationRequirePolicyAccept |
boolean | Требовать согласия с политикой конфиденциальности перед началом нового диалога | |
humanSupportRequirePolicyAccept |
boolean | Требовать согласия с политикой конфиденциальности перед отправкой формы связи с человеком | |
leadCollectionRequirePolicyAccept |
boolean | Требовать согласия с политикой конфиденциальности перед отправкой формы сбора лидов | |
liveChatRequirePolicyAccept |
boolean | Требовать согласия с политикой конфиденциальности перед началом сеанса Live Chat | |
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 или режим фиксированного списка |
Способ выбора языка ответа ботом |
baseLanguage |
string | код языка | Язык, на котором написаны исходные тексты бота |
languages |
string | коды языков через запятую | Языки, предлагаемые посетителю |
knowledgeLanguageMode |
string | Правило обработки базы знаний на других языках | |
knowledgeLanguageFallback |
string | код языка | Резервный язык, если совпадение не найдено |
§ advanced
| Поле | Тип | Ограничение | Описание |
|---|---|---|---|
model |
string | зависит от лимитов аккаунта; см. «Модели ИИ для текста» выше | Идентификатор LLM (например, 5-MINI) |
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 (карточки предложений) для e-commerce внутри чата | |
includeProductsInKnowledgeBase |
boolean | Если true, индексировать каталог товаров в составе базы знаний |
Вне рамок API
В панели администратора есть несколько разделов, которые намеренно не представлены в этой версии Management API:
- Вкладка Flow (Сценарии) - визуальный Flow Editor (редактор сценариев диалога: этапы и переходы). Недоступен через Management API.
- Вкладка Actions (Действия) - готовые интеграции для e-commerce / бронирования, AI Search и пользовательские функции API. Вызов инструментов (tool calling) никогда не входил в Management API.
- Сам конструктор настраиваемых форм - создание и редактирование форм не поддерживается через API. Однако вы можете привязать существующую форму к боту через
leadCollection.customFormIdиhumanSupport.customFormId. - Пользовательские иконки открытия / закрытия чата -
customLauncherIconVisible,openChatIcon,closeChatIcon. Через API передаются только основные составные части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 (применяется, только если ваш тариф включает Whitelabel)
В 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-MINI",
"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,advanced.botMessagesLimitи т. д.) автоматически усекаются до лимитов вашего тарифа
Поля со значением null на сервере опускаются в теле JSON - при передаче по сети отправляются только поля с ненулевыми значениями.
Полное тело ответа (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-MINI",
"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 повторно; сразу же сохраните его на своей стороне.
В заголовке ответа Location передается URL нового бота (/v1/management/bots/{id}).
Примеры c 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}
Возвращает текущую конфигурацию принадлежащего вам бота.
Пример c 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-MINI",
"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 возвращается только в этом ответе на создание - скопируйте его перед тем, как закрыть тело ответа; позже получить его будет невозможно.
Два важных нюанса:
- Файлы не клонируются. Поля
appearance.avatarUrlиwhiteLabel.whitelabelLogoUrlдоступны только для чтения и ссылаются на файлы исходного бота. Если вам нужен тот же аватар или логотип White Label на клоне, скачайте байты по исходным URL и загрузите их как multipart-частиavatar/whitelabel_logo- либо при выполнении POST на создание (режим Mode B), либо последующим запросом PATCH. - Ключи Bot Talk не клонируются. У каждого бота свой пул ключей Bot Talk. Единственный ключ
apiKey, возвращаемый запросом POST на создание, генерируется автоматически; при необходимости создайте дополнительные ключи на вкладке API (API) бота.
PATCH /v1/management/bots/{bot_id}
Обновление одного или нескольких полей принадлежащего вам бота. Изменяются только те разделы и поля, которые присутствуют в JSON; все пропущенное (или переданное как null) остается без изменений. Внутри переданного раздела действует семантика частичного обновления для каждого отдельного поля.
Поддерживаются два эквивалентных типа Content-Type (как и в POST):
Mode B - обычный JSON (рекомендуется, если обновляются только настройки):
Content-Type: application/json- Тело запроса представляет собой сам JSON патча (без обертки
data)
Mode 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
Mode 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"}}'
Mode 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'
Mode 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": "standard",
"messages": {"used": 4123, "limit": 11000, "remaining": 6877},
"bots": {"used": 3, "limit": 5, "remaining": 2}
}
subscriptionType- идентификатор текущего тарифного плана аккаунта в нижнем регистре (например,standardв примере). Планы берутся из динамического каталога, поэтому точный набор идентификаторов может меняться со временем по мере переименования или добавления планов - воспринимайте это значение как произвольную строку, а не фиксированное перечисление.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.