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