Центр помощи
Chat API

Management API

Последнее обновление:

Обзор 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.

Начало работы

  1. Откройте панель администратора и перейдите в раздел Account Settings > Management API (Настройки аккаунта > Management API).
  2. Нажмите Create Management Key (Создать ключ Management), укажите имя, при необходимости задайте белый список IP-адресов и лимит запросов (rate limit), затем подтвердите создание.
  3. Скопируйте полный ключ из модального окна об успешном создании. В открытом виде он отображается только один раз.

Ключ выглядит как 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 ≈ 200
  • role.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, CUSTOM
  • role.responseLength - Concise, Normal, Detailed
  • role.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_parameter
  • advanced.chatContextSize - 8000, 16000, 32000. Зависит от лимитов учетной записи; более высокие значения автоматически урезаются до допустимого максимума
  • chatMemory.clientSummaryPromptType - DEFAULT, CUSTOM
  • chatMemory.conversationSummaryPromptType - DEFAULT, CUSTOM
  • appearance.chatAlignment - left, right
  • appearance.minimizedDisplayMode - icon, minified
  • appearance.chatMessageLinkTarget - _blank, _self
  • leadCollection.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.0
  • chatMemory.summariesToKnowledgeRatio - целое число от 10 до 90 (в процентах, шаг 10)
  • appearance.launcherBottomMargin, appearance.launcherSideMargin - от 0 до 500
  • appearance.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.