Przegląd Management API
Management API służy do prac administracyjnych (back-office), które nie obejmują wysyłania wiadomości na czacie:
- programowe tworzenie bota za pomocą
POST /v1/management/bots - odczyt konkretnego bota, którego jesteś właścicielem, za pomocą
GET /v1/management/bots/{bot_id} - aktualizacja konkretnego bota za pomocą
PATCH /v1/management/bots/{bot_id} - odczyt wykorzystania subskrypcji za pomocą
GET /v1/usage
Klucze Management są powiązane z Twoim kontem, a nie z żadnym konkretnym botem. Są one celowo odseparowane od kluczy Bot Talk, dzięki czemu przejęty klucz czatu nie może modyfikować Twoich botów ani odczytywać danych rozliczeniowych.
Podstawowy adres URL (Base URL)
https://api.chatlab.com/aichat
Wszystkie punkty końcowe w tym artykule są względne wobec tego podstawowego adresu URL.
Pierwsze kroki
- Otwórz panel administracyjny i przejdź do Account Settings > Management API (Ustawienia konta > Management API).
- Kliknij Create Management Key (Utwórz klucz Management), nadaj mu nazwę, opcjonalnie ustaw białą listę IP oraz limit zapytań (rate limit), a następnie zatwierdź.
- Wybierz tylko te uprawnienia, których potrzebuje Twoja integracja, i skopiuj pełny klucz z okna z potwierdzeniem. Klucz w postaci jawnego tekstu jest wyświetlany tylko raz.
- Zapisz go na swoim serwerze, a nie w kodzie przeglądarki ani w publicznym repozytorium. Wykonaj zapytanie tylko do odczytu, takie jak
GET /v1/usagez uprawnieniemusage, aby zweryfikować dostęp. - Unieważnij nieużywane lub naruszone klucze na stronie Management API.
Klucz wygląda następująco: mk_abcdefghijklmnopqrstuvwxyz012345. Prefiks mk_ odróżnia go od kluczy Bot Talk (ck_).
Uwierzytelnianie
Authorization: Bearer mk_abcdefghijklmnopqrstuvwxyz012345
Wysłanie klucza mk_ do /v1/chat (lub dowolnego innego punktu końcowego Bot Talk) zwraca błąd 403 key_type_not_allowed. Wysłanie klucza ck_ do /v1/management/* zwraca ten sam błąd.
Limity
- Maksymalnie 5 aktywnych kluczy Management API na użytkownika
- Maksymalnie 10 żądań na minutę na klucz (algorytm token bucket, pojemność 10, płynne uzupełnianie w tempie ~1 token co 6 sekund). Możliwość zmniejszenia limitu w momencie tworzenia - ustaw niższą wartość
rateLimitPerMinute, a limit spadnie, a tempo uzupełniania odpowiednio się przeskaluje.
Uprawnienia
Każdy klucz Management posiada dowolny podzbiór trzech poniższych uprawnień. Co najmniej jedno musi zostać wybrane podczas tworzenia; w przeciwnym razie żądanie zostanie odrzucone z błędem 400 invalid_request_error. Wywołanie punktu końcowego z kluczem, który nie posiada wymaganego uprawnienia, zwraca 403 insufficient_permissions.
bot_read- wymagane dlaGET /v1/management/bots/{bot_id}bot_management- wymagane dlaPOST /v1/management/botsorazPATCH /v1/management/bots/{bot_id}usage- wymagane dlaGET /v1/usage
Struktura treści: zagnieżdżone sekcje odzwierciedlające zakładki interfejsu administracyjnego
POST i PATCH przyjmują treść JSON podzieloną na 13 sekcji. Każda sekcja odpowiada podzakładce w pasku bocznym Bot Settings (Ustawienia bota) w panelu administracyjnym, dzięki czemu klucze JSON pokrywają się z widocznymi zakładkami: jeśli zmienisz consent.humanSupportRequirePolicyAccept przez API, zobaczysz przełączenie tego samego przełącznika w zakładce Consent & Privacy (Zgoda i prywatność) w panelu administracyjnym.
role- persona bota, surowy prompt, długość odpowiedzi, język, kontekst strony / firmy (zakładka Role & Behavior)conversation- wiadomość powitalna, doprecyzowywanie zapytań, ciągłość rozmowy, przełącznik oceniania + podpowiedzi, treść sugerowanych pytań + dynamiczne pytania uzupełniające (zakładka Chat Conversation)chatMemory- przełącznik pamięci czatu, prompty podsumowań, alokacja kontekstu (zakładka Summaries & Memory)appearance- kolory, teksty, wymiary, własny CSS, ekran powitalny, styl sugerowanych pytań, zachowanie automatycznego otwierania, symulacja pisania przez człowieka, stopka w markdownie (zakładka Appearance)humanSupport- formularz kontaktu z człowiekiem (zakładka Human Contact Form)leadCollection- formularz pozyskiwania leadów (zakładka Lead Collection)liveChat- przekazywanie do Live Chat (zakładka Live Chat)consent- wszystkie cztery przełączniki zgody na politykę prywatności oraz treść ekranu zgody (zakładka Consent & Privacy)whiteLabel- ukrywanie logo, własny link do logo, hosting we własnej domenie (zakładka Whitelabel)security- dozwolone domeny, filtr antyspamowy, limity częstotliwości rozmów (zakładka Security)voice- wprowadzanie głosowe i rozmowy głosowe: model, głos, języki, prompt, limit czasu trwania (zakładka Voice Conversation)multilingual- tryb wielojęzyczny, język podstawowy, oferowane języki, obsługa języka bazy wiedzy (zakładka Languages)advanced- model LLM, temperatura, rozmiar kontekstu, limit wiadomości bota, wewnętrzne ustawienia regionalne, Offer Cards (zakładka Model & Advanced)
Wśród zapisywalnych ustawień tylko name znajduje się na najwyższym poziomie, ponieważ identyfikuje bota, zamiast należeć do konkretnej zakładki.
Pasek boczny Bot Settings ma obecnie 16 podzakładek, a 13 z nich odpowiada powyższym sekcjom. Trzy podzakładki bez odpowiadającej im sekcji to Flow, Actions oraz Forms - wszystkie trzy omówiono w sekcji "Poza zakresem API" poniżej. 13 zakładek, które mają swoje odpowiedniki, to Appearance, Chat Conversation, Role & Behavior, Human Contact Form, Lead Collection, Live Chat, Whitelabel, Consent & Privacy, Security, Model & Advanced, Summaries & Memory, Voice Conversation oraz Languages.
Treść żądania i treść odpowiedzi mają tę samą strukturę. Odpowiedź zawiera dwa dodatkowe elementy:
meta- tylko do odczytu: identyfikator bota i znaczniki czasu. Usuń go, aby przekształcić odpowiedź GET w prawidłową treść POST.apiKey- obecny tylko podczas tworzenia - nowo wygenerowany klucz Bot Talk API dla nowego bota.
Dwa pola w ramach wspólnej struktury są tylko do odczytu - zwracane w odpowiedzi, ignorowane przy próbie wysłania ich w POST/PATCH:
appearance.avatarUrl- w pełni kwalifikowany publiczny adres URL obrazu awatara bota (np.https://api.chatlab.com/aichat/content/avatar_xyz.png). Pobierz go bezpośrednio metodą GET, aby zapisać plik. Aby go zmienić, prześlij nowy plik za pomocą części wieloczęściowejavatar(zobacz PATCH).whiteLabel.whitelabelLogoUrl- w pełni kwalifikowany publiczny adres URL logo nagłówka White Label. Taki sam schemat jak wavatarUrl. Aby go zmienić, prześlij nowy plik za pomocą części wieloczęściowejwhitelabel_logo(zobacz PATCH).
Oba adresy URL używają schematu + hosta + ścieżki kontekstu bieżącego żądania, więc w przypadku domeny niestandardowej White Label są zwracane z tą domeną jako adresem bazowym (np. https://api.acme.com/aichat/content/...).
Wyślij null dla sekcji, aby pominąć ją przy PATCH; wyślij null dla pola wewnątrz sekcji, aby pominąć tylko to pojedyncze pole. Wartość null na poziomie pola nigdy nie czyści zapisanej wartości - oznacza jedynie "nie modyfikuj".
Konstrukcja roli i promptu
Prompt systemowy, który ostatecznie otrzymuje LLM, jest budowany na jeden z dwóch sposobów w zależności od role.role. Świadomość wybranej ścieżki pozwala określić, które pola mają znaczenie, a które są zapisywane, ale ignorowane.
Ścieżka A - role.role to CUSTOMER_SUPPORT, SALES lub LEAD_COLLECTION_AGENT (oparta na szablonie)
Backend składa prompt z wbudowanego szablonu i całkowicie ignoruje role.rawPrompt (wartość ta jest nadal zapisana przy bocie, lecz nieużywana). Szablon uwzględnia:
role.role- etykietę roli (np. "Customer Support") oraz instrukcje specyficzne dla roli dołączane automatyczniename- nazwę bota, wstawianą do zdania początkowegorole.language-"Auto Detect"przestawia bota na podążanie za językiem użytkownika; każda inna wartość (np."English","Polish") staje się instrukcją "Output in {language}, unless user uses another language"role.responseLength- mapowane na docelową liczbę słów:Concise≈ 50 słów,Normal≈ 100,Detailed≈ 200role.websiteAddress- opcjonalne; jeśli nie jest puste, dodawane jako "for the users of the website {url}"role.companyDescription- opcjonalne; jeśli nie jest puste, dołączane na początku jako dodatkowy akapit przed instrukcjami roli
Jest to ścieżka zalecana dla większości botów - bez dodatkowej pracy otrzymujesz zachowanie dopasowane do roli oraz mechanizmy bezpieczeństwa.
Ścieżka B - role.role to CUSTOM (prompt dostarczony przez wywołującego)
Backend używa role.rawPrompt jako promptu roli i dołącza stałe wytyczne platformy dotyczące długości odpowiedzi. Działa to niezależnie od role.responseLength: opcjonalne ustawienie Concise/Normal/Detailed nie jest wstrzykiwane dla roli CUSTOM. Podobnie language, websiteAddress oraz companyDescription są zapisywane, ale nie trafiają do tego promptu roli. Wszelkie wymagania dotyczące języka, docelowej długości odpowiedzi czy kontekstu firmy należy umieścić bezpośrednio w rawPrompt. Dodatkowe instrukcje wykonawcze i pobrany kontekst również mogą zostać dostarczone, więc rawPrompt nie stanowi całego wejścia modelu. Instrukcje tonu predefiniowanej roli nie są dodawane, ale wybranie CUSTOM nie usuwa wszystkich instrukcji platformy.
Używaj CUSTOM tylko wtedy, gdy prompt oparty na szablonie nie pasuje do Twojego przypadku użycia (np. potrzebujesz wysoce specyficznej persony branżowej, własnych ograniczeń bezpieczeństwa lub niestandardowego formatu danych wyjściowych).
Pola wyliczeniowe / o ograniczonym zbiorze wartości
Pola wyliczeniowe i ograniczone odrzucają nieprawidłowe wartości kodem 400 invalid_parameter. Inne pola to zwykłe ciągi znaków, nawet jeśli interfejs oferuje stałą listę. Używaj udokumentowanej pisowni i waliduj przesyłane dane zamiast zakładać, że każdy nieobsługiwany ciąg zostanie odrzucony.
role.role-CUSTOMER_SUPPORT,SALES,LEAD_COLLECTION_AGENT,CUSTOMrole.responseLength-Concise,Normal,Detailedrole.language- pełna angielska nazwa języka z listy rozwijanej w panelu administracyjnym, np.Auto Detect,English,Polish,Spanish,German,French,Italian,Portuguese,Dutch,Russian,Chinese (Simplified),Japanese,Arabic,Hindioraz około 80 innych. Wartość jest zapisywana dosłownie i wstawiana do szablonu promptu, więc dwuliterowe kody ISO (en,pl) i inne wartości spoza listy nie są odrzucane przez API, ale powodują wygenerowanie zniekształconej instrukcji, takiej jak "Output in en, unless...". DomyślnieAuto Detect, jeśli zostanie pominięte podczas tworzenia.advanced.model- zobacz "Modele tekstowe AI" poniżej. Jest to ciąg znaków, a nie zweryfikowany enum w schemacie żądania; użyj obsługiwanej wartości, a nie dowolnej nazwy modelu.advanced.chatContextSize- użyj8000,16000lub32000, zgodnie z interfejsem. Wartości powyżej limitu konta są po cichu przycinane; obiekt DTO nie wymusza tego trzyelementowego zestawu.chatMemory.clientSummaryPromptType-DEFAULT,CUSTOMchatMemory.conversationSummaryPromptType-DEFAULT,CUSTOMappearance.chatAlignment-left,rightappearance.minimizedDisplayMode-icon,minified,pillappearance.chatMessageLinkTarget-_blank,_selfleadCollection.requireBeforeNewConversation- przełącznik logiczny.truezmusza użytkownika do wypełnienia formularza leada przed rozpoczęciem rozmowy;falsepozwala sztucznej inteligencji zdecydować, kiedy wyświetlić formularz (domyślnie).
Pola ustrukturyzowane i zakresy
Pola, które wyglądają jak zwykłe ciągi znaków lub liczby, ale w rzeczywistości mają specyficzne formaty, zakresy lub specyfikę interfejsu administracyjnego, o których warto wiedzieć.
-
advanced.temperature- dopuszczalny zakres to od0.0do1.0, zgodnie z suwakiem w panelu administracyjnym. Wartości spoza tego zakresu są odrzucane kodem400 invalid_parameter. -
chatMemory.summariesToKnowledgeRatio- wartość całkowita w procentach,10-90; interfejs używa kroków co10, ale API akceptuje liczby całkowite z całego zakresu. Domyślnie50. Przy włączonej pamięci i kontekście większym niż 8k dzieli budżet wiedzy i pamięci po zarezerwowaniu miejsca na prompt i ostatnią rozmowę, a nie cały kontekst modelu. Przy 8k to ustawienie nie przydziela żadnego budżetu na podsumowania. -
liveChat.schedule- JSON zakodowany jako ciąg znaków, a nie zagnieżdżony obiekt JSON w przesyłanych danych. Serwer przechowuje surowy ciąg dosłownie; interfejs administracyjny analizuje go po stronie klienta podczas renderowania edytora harmonogramu. Po przetworzeniu ciąg ma postać jednego wpisu na każdy dzień tygodnia oraz kluczatimezone:- każdy klucz dnia tygodnia (
monday-sunday) mapuje na{enabled: boolean, from: "H:MM", to: "H:MM"}w formacie 24-godzinnym timezoneto nazwa strefy IANA (np."Europe/Warsaw","America/New_York")
Przykładowa wartość (zwróć uwagę na cudzysłowy zewnętrzne i ucieczki cudzysłowów wewnętrznych - jest to jedno pole tekstowe, a nie obiekt zagnieżdżony):
"{\"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\"}"Poza wymienionymi godzinami odwiedzającemu wyświetla się
liveChat.outOfHoursMessage, a przekazanie do czatu na żywo zostaje wstrzymane. Weryfikacja wewnętrznej struktury odbywa się wyłącznie po stronie klienta w panelu administracyjnym - nieprawidłowy format JSON lub nierozpoznane klucze zostaną zaakceptowane przez API jako zwykły ciąg tekstowy i ujawnią się jako błąd renderowania, gdy ktoś otworzy bota w panelu. Zweryfikuj strukturę po swojej stronie przed wysłaniem. - każdy klucz dnia tygodnia (
-
conversation.positiveRatingTooltip/conversation.negativeRatingTooltip- krótkie etykiety widoczne przy elementach oceniania rozmowy 👍 / 👎, gdyconversation.conversationRatingEnabled=true. Domyślny tekst to "I like the response" / "I don't like the response". Widoczne dla użytkowników końcowych. -
whiteLabel.hideRoboAssistLogo- funkcja White Label, zależna od limitów Twojego konta. Ukrywa napis "Powered by ChatLab" w stopce. Jeśli Twoje konto nie obejmuje White Label, wartość jest zapisywana, ale ignorowana, a stopka renderuje się zawsze. -
whiteLabel.whitelabelLogoLink- funkcja White Label, zależna od limitów Twojego konta. Docelowy adres URL kliknięcia dla własnego logo, gdyhideRoboAssistLogo=truei przesłano plik własnego logo za pomocą części wieloczęściowejwhitelabel_logo. -
appearance.simulateHumanTypingDelay- sekundy (nie milisekundy), liczba całkowita0-200. Przerwa między kolejnymi dymkami bota, gdysimulateHumanTyping=true. Domyślnie5. -
appearance.autoOpenChatDelaySeconds- sekundy, liczba całkowita. Opóźnienie przed automatycznym otwarciem widgetu, gdyautoOpenChat=trueiautoOpenChatDelay=true. -
advanced.internalLocale- kod języka i regionu IETF w formaciell_CC(ze znakiem podkreślenia, a NIEll-CCz myślnikiem). Akceptowane wartości pochodzą ze stałej listy około 95 ustawień regionalnych: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_ILi wielu innych. Wysłanie samego dwuliterowego kodu ("en") lub formatu BCP-47 ("en-US") nie znajduje się na liście dozwolonych wartości. Domyślnieen_US. Są to ustawienia regionalne używane do formatowania dat i liczb w interfejsie widgetu, odrębne odrole.language(języka wypowiedzi bota w rozmowie). -
security.talkMessagesRateLimit/security.talkMessagesRateLimitDurationSeconds- liczby całkowite (wysyłane jako liczby w formacie JSON, np.30, a nie"30"). Ustaw limit wiadomości na0, aby wyłączyć ten limit oparty na sesji. Przy włączaniu podaj dodatnią wartość czasu trwania. Backend egzekwuje N wiadomości na sesję w podanym czasie w sekundach przed wyświetleniem odwiedzającemusecurity.talkMessagesRateLimitHitMessage. -
advanced.botMessagesLimit- liczba całkowita (liczba w formacie JSON, np.1000).0oznacza brak dodatkowego limitu na bota, przy czym nadal obowiązuje limit kredytów konta; w przeciwnym razie musi to być wielokrotność 1000 (1000,2000,10000, ...). Wartości takie jak100lub1500są odrzucane kodem400 invalid_parameter. Jest to miesięczny limit kredytów bota, a nie liczba wiadomości na rozmowę. Mechanizm mapujący nie przycina tej wartości do limitu konta; budżet konta nadal ogranicza rzeczywiste zużycie.
Modele tekstowe AI (advanced.model)
Użyj dokładnego identyfikatora modelu zwróconego w advanced.model podczas odczytu bota skonfigurowanego z wybranym modelem w sekcji Settings > Model & Advanced (Ustawienia > Model i zaawansowane). Bieżącą wartością domyślną przy tworzeniu jest 5.6-LUNA. W identyfikatorach wielkość liter ma znaczenie i różnią się one od nazw wyświetlanych; na przykład 5.6-LUNA jest wyświetlany jako GPT 5.6-luna.
Katalog modeli zmienia się z czasem. Nie zakładaj, że dowolny ciąg znaków lub publiczny identyfikator modelu dostawcy jest obsługiwany tylko dlatego, że schemat żądania przyjmuje ciąg znaków. Odczytaj zapisaną konfigurację i przetestuj utworzonego chatbota przed wdrożeniem go na środowisko produkcyjne.
Opis pól (pełny schemat żądania)
Obsługiwane sekcje i pola wraz z ich typami oraz istotnymi ograniczeniami. Semantyka PATCH: każde pominięte pole (lub przesłane jako null) pozostawia zapisaną wartość bez zmian. Taka sama struktura jest używana w odpowiedzi (z wyłączeniem binarnej zawartości multipart; z dodatkiem bloku meta tylko do odczytu w każdej odpowiedzi oraz apiKey wyłącznie w odpowiedzi na utworzenie).
Poziom główny
| Pole | Typ | Ograniczenie | Opis |
|---|---|---|---|
name |
string | maks. 150, wymagane przy tworzeniu | Wyświetlana nazwa bota |
role |
object | Zobacz § role | |
conversation |
object | Zobacz § conversation | |
chatMemory |
object | Zobacz § chatMemory | |
appearance |
object | Zobacz § appearance | |
humanSupport |
object | Zobacz § humanSupport | |
leadCollection |
object | Zobacz § leadCollection | |
liveChat |
object | Zobacz § liveChat | |
consent |
object | Zobacz § consent | |
whiteLabel |
object | Zobacz § whiteLabel | |
security |
object | Zobacz § security | |
advanced |
object | Zobacz § advanced |
Elementy występujące tylko w odpowiedzi:
meta: { id, createdAt, updatedAt }- tylko do odczytu.apiKey- string, obecny wyłącznie w odpowiedziPOST /v1/management/bots- nowo wygenerowany klucz Bot Talk dla nowego bota, zwracany dokładnie raz.
§ role
| Pole | Typ | Ograniczenie | Opis |
|---|---|---|---|
role |
string (enum) | CUSTOMER_SUPPORT, SALES, LEAD_COLLECTION_AGENT, CUSTOM |
Szablon persony; wybiera szablon promptu (zobacz "Konstrukcja roli i promptu") |
language |
string | pełna angielska nazwa języka (English, Polish, ...) lub Auto Detect |
Główny język przekazywany do szablonu promptu |
responseLength |
string | ∈ {Concise, Normal, Detailed} |
Pożądana szczegółowość odpowiedzi AI |
websiteAddress |
string | Strona internetowa używana jako kontekst promptu | |
companyDescription |
string | Opis firmy używany jako kontekst promptu | |
rawPrompt |
string | Własny prompt systemowy - używany dosłownie tylko wtedy, gdy role=CUSTOM |
§ conversation
| Pole | Typ | Ograniczenie | Opis |
|---|---|---|---|
welcomeMessage |
string | Pierwsza wiadomość pokazywana odwiedzającemu po otwarciu | |
queryRefinementEnabled |
boolean | Jeśli true, doprecyzuj pytanie odwiedzającego przed pobraniem danych RAG | |
conversationContinuityEnabled |
boolean | Jeśli true, powracający odwiedzający wznawiają swoją ostatnią rozmowę | |
conversationRatingEnabled |
boolean | Jeśli true, wyświetlaj przyciski oceny rozmowy (kciuk w górę/w dół) | |
positiveRatingTooltip |
string | Podpowiedź (tooltip) na przycisku pozytywnej oceny | |
negativeRatingTooltip |
string | Podpowiedź (tooltip) na przycisku negatywnej oceny | |
suggestedQuestions |
string | Sugerowane pytania / zagajenia rozmowy rozdzielone nową linią | |
dynamicSuggestedFollowups |
boolean | Jeśli true, AI proponuje dalsze pytania po każdej odpowiedzi | |
positiveRatingMessage |
string | Wiadomość wyświetlana po pozytywnej ocenie | |
negativeRatingMessage |
string | Wiadomość wyświetlana po negatywnej ocenie | |
hideSuggestedQuestionsAfterFirstUse |
boolean | Ukrywaj statyczne sugestie po ich użyciu | |
dynamicFollowupsAutoIcons |
boolean | Jeśli true, AI automatycznie dobiera ikony emoji dla dynamicznych sugestii |
§ chatMemory
| Pole | Typ | Ograniczenie | Opis |
|---|---|---|---|
enabled |
boolean | Główny przełącznik funkcji pamięci czatu | |
summaryConversationsEnabled |
boolean | Zapisuj podsumowania poszczególnych rozmów | |
conversationSummaryPrompt |
string | Własny prompt używany do podsumowywania każdej rozmowy | |
conversationSummaryPromptType |
string (enum) | ∈ {DEFAULT, CUSTOM} |
Czy używać domyślnego, czy własnego promptu podsumowania |
clientSummaryPrompt |
string | Własny prompt używany do podsumowywania profilu klienta w kolejnych rozmowach | |
clientSummaryPromptType |
string (enum) | ∈ {DEFAULT, CUSTOM} |
Domyślny kontra własny prompt profilu klienta |
summariesToKnowledgeRatio |
int | 10-90 (krok w interfejsie 10) |
% dostępnego budżetu wiedzy/pamięci przydzielony na podsumowania przy kontekstach powyżej 8k |
§ appearance
| Pole | Typ | Ograniczenie | Opis |
|---|---|---|---|
launcherLabelLine1 |
string | maks. 60 | Pierwsza linia tekstu przycisku uruchamiającego (launcher) |
launcherLabelLine2 |
string | maks. 60 | Druga linia tekstu przycisku uruchamiającego (launcher) |
launcherTextColor |
string | Kolor tekstu przycisku uruchamiającego | |
launcherDismissEnabled |
boolean | Zezwalaj na ukrywanie przycisku uruchamiającego | |
widgetFontFamily |
string | inter, system, nunito, lato, montserrat, poppins, source-serif, jetbrains-mono |
Krój pisma widgetu |
chatDrawerEnabled |
boolean | Włącz prezentację w formie wysuwanego panelu (drawer) | |
launcherColor |
string (hex) | Kolor tła przycisku uruchamiającego (ikony czatu) | |
headerColor |
string (hex) | Kolor tła nagłówka czatu | |
titleColor |
string (hex) | Kolor tytułu w nagłówku czatu | |
subtitleColor |
string (hex) | Kolor podtytułu w nagłówku czatu | |
clientMessageBubbleColor |
string (hex) | Kolor dymku wiadomości odwiedzającego | |
clientMessageTextColor |
string (hex) | Kolor tekstu wiadomości odwiedzającego | |
responseMessageBubbleColor |
string (hex) | Kolor dymku odpowiedzi bota | |
responseMessageTextColor |
string (hex) | Kolor tekstu odpowiedzi bota | |
chatSubheader |
string | Krótki opis (tagline) wyświetlany pod tytułem czatu | |
senderPlaceholder |
string | Tekst zastępczy (placeholder) w polu wprowadzania wiadomości | |
resetConversationTooltip |
string | Podpowiedź (tooltip) na przycisku resetowania rozmowy | |
chatAlignment |
string (enum) | ∈ {left, right} |
Strona ekranu, do której jest zakotwiczony czat |
launcherBottomMargin |
int | 0-500 |
Odległość przycisku uruchamiającego od dolnej krawędzi (px) |
launcherSideMargin |
int | 0-500 |
Odległość przycisku uruchamiającego od bocznej krawędzi (px) |
displayShadow |
boolean | Cień pod widgetem | |
customCss |
string | Kod CSS wstrzykiwany bezpośrednio do ramki iframe widgetu | |
chatMessageLinkTarget |
string (enum) | ∈ {_blank, _self} |
Sposób otwierania linków w wiadomościach bota |
minimizedDisplayMode |
string (enum) | ∈ {icon, minified, pill} |
Stan zminimalizowany: ikona launchera, kompaktowy pasek wprowadzania lub pigułka (pill) |
chatDesktopWidthPx |
int | Szerokość widgetu na komputerach | |
chatDesktopHeightPx |
int | Wysokość widgetu na komputerach | |
chatMobileSizePercent |
int | Rozmiar widgetu na urządzeniach mobilnych jako % widoku (viewport) | |
messageFontSize |
int | Rozmiar czcionki tekstu wiadomości (px) | |
showChatbotBubblesDesktop |
boolean | Pokazuj pływające dymki zachęcające na komputerach | |
showChatbotBubblesMobile |
boolean | Pokazuj pływające dymki zachęcające na urządzeniach mobilnych | |
chatbotBubblesDelaySeconds |
int | Opóźnienie przed pojawieniem się dymków zachęcających (sekundy) | |
launcherIconFullSize |
boolean | Renderuj własną ikonę launchera od krawędzi do krawędzi (bez marginesu wewnętrznego) | |
welcomeScreenEnabled |
boolean | Pokazuj ekran powitalny (Welcome Screen) zamiast od razu przechodzić do czatu | |
welcomeScreenQuestionsLabel |
string | Etykieta nad sugerowanymi pytaniami na ekranie powitalnym | |
welcomeScreenHideHumanContactForm |
boolean | Ukryj formularz kontaktu z człowiekiem w nagłówku, dopóki wyświetlany jest ekran powitalny. Pojawia się ponownie po pierwszej wiadomości odwiedzającego. Boty utworzone przed 2026-09-02 domyślnie przyjmują wartość true |
|
welcomeScreenHideLiveChat |
boolean | Ukryj opcję czatu na żywo w nagłówku, dopóki wyświetlany jest ekran powitalny. Pojawia się ponownie po pierwszej wiadomości odwiedzającego. Boty utworzone przed 2026-09-02 domyślnie przyjmują wartość true |
|
headerActionsLayout |
string | ICONS lub DROPDOWN |
Sposób udostępniania opcji Live Chat i formularza kontaktu w nagłówku czatu: ICONS (osobna ikona dla każdego) lub DROPDOWN (zgrupowane w menu nagłówka). Boty utworzone przed 2026-09-02 domyślnie przyjmują wartość ICONS |
stackSuggestedQuestions |
boolean | Układaj sugerowane pytania pionowo (zamiast obok siebie) | |
suggestedQuestionsFontSize |
int | Rozmiar czcionki przycisków sugerowanych pytań (px) | |
suggestedQuestionsTextColor |
string (hex) | Kolor tekstu przycisków sugerowanych pytań | |
suggestedQuestionsBackgroundColor |
string (hex) | Kolor tła przycisków sugerowanych pytań | |
autoOpenChat |
boolean | Automatycznie otwieraj czat na komputerach | |
autoOpenChatOnMobiles |
boolean | Automatycznie otwieraj czat na urządzeniach mobilnych | |
autoOpenChatDelay |
boolean | Stosuj opóźnienie przed automatycznym otwarciem | |
autoOpenChatDelaySeconds |
int | Czas opóźnienia automatycznego otwarcia (sekundy) | |
simulateHumanTyping |
boolean | Dziel odpowiedź bota na dymki z animacją pisania | |
simulateHumanTypingDelay |
int | 0-200 |
Odstęp czasowy między dymkami wiadomości (sekundy) |
footerMarkdown |
string | maks. 255 | Niestandardowy tekst Markdown w stopce pod czatem |
avatarUrl |
string | tylko do odczytu | Pełny publiczny adres URL awatara; aby go zmienić, prześlij plik przez część multipart avatar |
Multipart przy POST/PATCH: avatar (część pliku). Ciała odpowiedzi GET pomijają zawartość pliku - przesyłany jest tylko adres URL.
§ humanSupport
| Pole | Typ | Ograniczenie | Opis |
|---|---|---|---|
enabled |
boolean | Przełącznik ścieżki wsparcia przez człowieka | |
email |
string | wymagane (create-strict), gdy enabled=true |
Adres odbierający wiadomości e-mail wsparcia przez człowieka |
dialogMessage |
string | Wiadomość zachęcająca wyświetlana nad formularzem | |
thankYouMessage |
string | Potwierdzenie wyświetlane po przesłaniu formularza | |
emailMessageSubjectTemplate |
string | Szablon tematu wiadomości e-mail wysyłanej do konsultanta | |
emailMessageContentTemplate |
string | Szablon treści wiadomości e-mail wysyłanej do konsultanta | |
emailPlaceholder |
string | Tekst zastępczy w polu e-mail | |
messagePlaceholder |
string | Tekst zastępczy w polu wiadomości | |
emailWithConversationContent |
boolean | Jeśli true, dołącz zapis rozmowy do treści wiadomości e-mail | |
customFormId |
long | ID istniejącego formularza niestandardowego | Zastąp wbudowany formularz kontaktowy formularzem niestandardowym. Przy tworzeniu pominięcie powoduje użycie formularza wbudowanego; przy PATCH wartość null pozostawia bieżący wybór bez zmian |
customFormMapping |
string | JSON zakodowany jako ciąg znaków | Mapuje pola niestandardowego formularza na pola wiadomości e-mail wsparcia |
requirePolicyAccept znajduje się w sekcji consent.humanSupportRequirePolicyAccept, a nie tutaj.
§ leadCollection
| Pole | Typ | Ograniczenie | Opis |
|---|---|---|---|
enabled |
boolean | Przełącznik formularza leadów | |
nameEnabled |
boolean | Zbieraj imię i nazwisko | |
nameLabel |
string | Etykieta w polu imienia i nazwiska | |
emailEnabled |
boolean | Zbieraj adres e-mail | |
emailLabel |
string | wymagane (create-strict), gdy enabled=true ORAZ emailEnabled=true |
Etykieta w polu adresu e-mail |
phoneEnabled |
boolean | Zbieraj numer telefonu | |
phoneLabel |
string | wymagane (create-strict), gdy enabled=true ORAZ phoneEnabled=true |
Etykieta w polu numeru telefonu |
leaveDetailsMessage |
string | wymagane (create-strict), gdy enabled=true |
Wiadomość zachęcająca odwiedzającego do pozostawienia danych |
thankYouMessage |
string | wymagane (create-strict), gdy enabled=true |
Potwierdzenie wyświetlane po przesłaniu formularza |
requireBeforeNewConversation |
boolean | Jeśli true, formularz musi zostać przesłany przed rozpoczęciem czatu; jeśli false, AI decyduje, kiedy wyświetlić formularz |
|
emailNotificationEnabled |
boolean | Wysyłaj e-mail do właściciela po każdym zebranym leadzie | |
emailNotificationAddress |
string | Odbiorca powiadomień (domyślnie adres e-mail konta) | |
emailWithConversationContent |
boolean | Jeśli true, dołącz zapis rozmowy do powiadomienia |
| customFormId | long | ID istniejącego formularza niestandardowego | Zastąp wbudowany formularz leada formularzem niestandardowym. Przy tworzeniu pominięcie powoduje użycie formularza wbudowanego; przy PATCH wartość null pozostawia bieżący wybór bez zmian |
| customFormMapping | string | JSON zakodowany jako ciąg znaków | Mapuje pola niestandardowego formularza na imię i nazwisko / e-mail / telefon |
Reguła create-strict między polami: enabled=true wymaga przynajmniej jednego z pól emailEnabled lub phoneEnabled. requirePolicyAccept znajduje się w sekcji consent.leadCollectionRequirePolicyAccept, a nie tutaj.
§ liveChat
| Pole | Typ | Ograniczenie | Opis |
|---|---|---|---|
enabled |
boolean | Przełącznik funkcji Live Chat | |
infoMessage |
string | Wiadomość wyjaśniająca przed przekazaniem rozmowy | |
startMessage |
string | Wiadomość wyświetlana po rozpoczęciu sesji na żywo | |
endMessage |
string | Wiadomość wyświetlana po zakończeniu sesji na żywo | |
nameLabel |
string | Etykieta w polu imienia w formularzu wstępnym Live Chat | |
emailLabel |
string | Etykieta w polu e-mail w formularzu wstępnym Live Chat | |
schedule |
string | JSON zakodowany jako ciąg znaków (przełączniki dni tygodnia + from/to + timezone) |
Harmonogram działania czatu na żywo - dokładną strukturę znajdziesz w sekcji "Pola ustrukturyzowane i zakresy" |
outOfHoursMessage |
string | Wiadomość wyświetlana, gdy harmonogram wskazuje, że zespół jest niedostępny | |
closeModalMessage |
string | Tytuł okna modalnego "Zamknąć czat na żywo?" | |
closeModalConfirmLabel |
string | Etykieta przycisku potwierdzenia w oknie zamykania | |
closeModalCancelLabel |
string | Etykieta przycisku anulowania w oknie zamykania | |
closeModalTooltipText |
string | Podpowiedź (tooltip) przycisku zamykania czatu | |
operatorHasJoinedLabel |
string | Etykieta wyświetlana po dołączeniu operatora | |
operatorDidNotJoinInTimeLabel |
string | Etykieta wyświetlana, gdy żaden operator nie dołączy przed upływem limitu czasu | |
waitingForOperatorToJoinLabel |
string | Etykieta wyświetlana podczas oczekiwania na operatora | |
waitingForOperatorSeconds |
int | Limit czasu na odebranie rozmowy przez operatora (sekundy) | |
redirectToHumanSupportForm |
boolean | Jeśli true, przekieruj do formularza wsparcia przez człowieka, gdy żaden operator nie odbierze rozmowy | |
requireAdminOnline |
boolean | Wymagaj obecności dostępnego operatora zgodnie z ustawieniami statusu dostępności | |
presenceMode |
string | Tryb dostępności; użyj wartości pobranej z bota skonfigurowanego w interfejsie | |
hideHumanSupportWhenLiveChatAvailable |
boolean | Ukrywaj formularz kontaktowy, gdy czat na żywo jest dostępny | |
missedEmailEnabled |
boolean | domyślnie true |
Wyślij e-mail do właściciela bota, gdy prośba o czat na żywo pozostała bez odpowiedzi. Niezdefiniowane w starszych botach, co oznacza stan włączony |
requirePolicyAccept znajduje się w sekcji consent.liveChatRequirePolicyAccept, a nie tutaj.
§ consent
| Pole | Typ | Ograniczenie | Opis |
|---|---|---|---|
newConversationRequirePolicyAccept |
boolean | Wymagaj zgody na politykę prywatności przed rozpoczęciem nowej rozmowy | |
humanSupportRequirePolicyAccept |
boolean | Wymagaj zgody na politykę prywatności przed przesłaniem formularza wsparcia przez człowieka | |
leadCollectionRequirePolicyAccept |
boolean | Wymagaj zgody na politykę prywatności przed przesłaniem formularza zbierania leadów | |
liveChatRequirePolicyAccept |
boolean | Wymagaj zgody na politykę prywatności przed rozpoczęciem sesji czatu na żywo | |
newConversationConsentDescription |
string | Tekst wstępu na ekranie zgody przy rozpoczęciu rozmowy | |
privacyPolicyConsentCheckboxLabel |
string | Etykieta obok pola wyboru zgody (zwykle zawiera link do polityki prywatności) |
§ whiteLabel
| Pole | Typ | Ograniczenie | Opis |
|---|---|---|---|
hideRoboAssistLogo |
boolean | funkcja White Label; zależna od limitów konta | Ukryj domyślne logo ChatLab w stopce |
whitelabelLogoLink |
string | funkcja White Label; zależna od limitów konta | Adres URL, do którego prowadzi własne logo w stopce |
assignToCustomDomain |
boolean | wymaga funkcji CUSTOM_DOMAIN |
Udostępniaj czat we własnej skonfigurowanej domenie |
whitelabelLogoUrl |
string | tylko do odczytu | Pełny publiczny adres URL logo White Label; aby je zmienić, prześlij plik przez część multipart whitelabel_logo |
Multipart przy POST/PATCH: whitelabel_logo (część pliku). Ciała odpowiedzi GET pomijają zawartość pliku - przesyłany jest tylko adres URL.
§ security
| Pole | Typ | Ograniczenie | Opis |
|---|---|---|---|
allowedDomains |
string | Rozdzielona przecinkami lista domen uprawnionych do osadzenia widgetu (puste = brak białej listy) | |
spamFilterEnabled |
boolean | Włącz filtr antyspamowy dla wiadomości przychodzących tego bota | |
countryFilterMode |
string | BLACKLIST lub WHITELIST |
Sposób interpretacji list krajów. Same listy pozostają dostępne tylko dla administratorów |
talkMessagesRateLimit |
int | >= 0; 0 wyłącza |
Maksymalna liczba wiadomości użytkownika dozwolona w oknie limitu zapytań (rate limit) |
talkMessagesRateLimitDurationSeconds |
int | >= 0 |
Długość okna limitu zapytań (sekundy) |
talkMessagesRateLimitHitMessage |
string | Wiadomość wyświetlana odwiedzającemu po osiągnięciu limitu zapytań |
§ voice
| Pole | Typ | Ograniczenie | Opis |
|---|---|---|---|
inputEnabled |
boolean | Pozwól odwiedzającemu dyktować wiadomości (mowa na tekst) | |
conversationEnabled |
boolean | wymaga funkcji głosowych w planie | Włącz pełne rozmowy głosowe |
voiceId |
string | identyfikator głosu u dostawcy (np. alloy) |
Wybór syntetycznego głosu |
model |
string | np. GPT-REALTIME-MINI, GEMINI-LIVE, ELEVENLABS-* |
Model głosu. Rozliczany za minutę, stawki różnią się w zależności od modelu |
turnDetection |
string | zależne od dostawcy | Tryb naprzemienności wypowiedzi (turn-taking) |
audioPrompt |
string | Dodatkowy prompt systemowy używany tylko podczas wypowiedzi głosowych | |
welcomeMessage |
string | Odtwarzana kwestia powitalna | |
language |
string | kod języka | Główny język głosu |
additionalLanguages |
string | rozdzielone przecinkami kody języków | Dodatkowe języki akceptowane przez agenta głosowego |
maxDurationSeconds |
int | Sztywny limit czasu trwania pojedynczej rozmowy głosowej | |
maxDurationMessage |
string | Wiadomość wyświetlana po osiągnięciu limitu czasu |
§ multilingual
| Pole | Typ | Ograniczenie | Opis |
|---|---|---|---|
enabled |
boolean | Przełącznik trybu wielojęzycznego | |
mode |
string | AUTODETECT lub FIXED_LIST |
Sposób wyboru języka odpowiedzi przez bota |
baseLanguage |
string | kod języka | Język, w którym przygotowano treści własne bota |
languages |
string | rozdzielone przecinkami kody języków | Języki oferowane odwiedzającemu |
knowledgeLanguageMode |
string | NONE, MAIN lub DYNAMIC |
Sposób traktowania bazy wiedzy w innych językach |
knowledgeLanguageFallback |
string | kod języka | Język używany w przypadku braku dopasowania |
§ advanced
| Pole | Typ | Ograniczenie | Opis |
|---|---|---|---|
model |
string | zależne od limitów konta; zobacz wyżej "Modele tekstowe AI" | Identyfikator LLM (np. 5.6-LUNA) |
temperature |
decimal | 0.0-1.0 |
Temperatura próbkowania (odpowiada suwakowi w interfejsie) |
chatContextSize |
int | ∈ {8000, 16000, 32000}; automatycznie ograniczane do limitu konta |
Skonfigurowany budżet kontekstu, obejmujący instrukcje, historię i bazę wiedzy |
botMessagesLimit |
long | 0 lub wielokrotność 1000 (np. 1000, 2000, 10000) |
Miesięczny limit kredytów wiadomości bota (0 = brak dodatkowego limitu bota; nadal obowiązuje budżet konta) |
internalLocale |
string | kod ustawień regionalnych w formacie ll_CC |
Ustawienia regionalne (locale) dla etykiet interfejsu widgetu (odrębne od role.language) |
productsViewEnabled |
boolean | Jeśli true, wyświetlaj karty ofert e-commerce (Offer Cards) wewnątrz czatu | |
includeProductsInKnowledgeBase |
boolean | Jeśli true, indeksuj katalog produktów jako część bazy wiedzy |
Poza zakresem API
Panel administracyjny udostępnia kilka obszarów, które celowo nie zostały udostępnione w tej wersji Management API:
- Trenowanie i usuwanie - te punkty końcowe nie pozwalają wyświetlać listy wszystkich botów, zarządzać zbiorami danych do trenowania ani usuwać botów. Do tych działań należy używać aplikacji.
- Zakładka Flow (Ścieżki) - wizualny edytor ścieżek rozmowy (Flow Editor - etapy i przejścia). Niedostępny przez Management API.
- Zakładka Actions (Akcje) - zarządzane integracje e-commerce / rezerwacji, funkcja AI Search oraz własne funkcje API. Wywoływanie narzędzi (tool calling) nigdy nie było częścią Management API.
- Sam kreator niestandardowych formularzy - tworzenie i edytowanie formularzy niestandardowych nie jest dostępne przez API. Możesz jednak przypisać istniejący formularz do bota za pomocą
leadCollection.customFormIdihumanSupport.customFormId. - Własne ikony otwierania/zamykania czatu -
customLauncherIconVisible,openChatIcon,closeChatIcon. API udostępnia wyłącznie główne części multipartavatarorazwhitelabel_logo. - Listy adresów IP i krajów - same wpisy są dostępne wyłącznie dla administratorów. Udostępniony jest jedynie tryb interpretacji za pomocą
security.countryFilterMode.
Punkty końcowe
POST /v1/management/bots
Utwórz nowego bota. Akceptowane są dwa równorzędne nagłówki Content-Type; wybierz ten, który jest dla Ciebie wygodniejszy.
Tryb A - zwykły JSON (zalecany, gdy nie musisz przesyłać awatara / logo w tym samym żądaniu):
Content-Type: application/json- Treść żądania jest konfiguracją bota w formacie JSON (bez opakowania
data) - Pliki (awatar / logo) można przesłać później za pomocą drugiego żądania
PATCHw trybie B
Tryb B - multipart/form-data (użyj, gdy przesyłasz pliki w tym samym żądaniu):
Content-Type: multipart/form-data; boundary=...- Część JSON
data(wymagana,Content-Type: application/json) - konfiguracja bota w zagnieżdżonej strukturze opisanej powyżej - Część plikowa
avatar(opcjonalna) - obraz awatara bota - Część plikowa
whitelabel_logo(opcjonalna) - logo White Label (dotyczy tylko sytuacji, gdy Twoje konto obejmuje funkcję White Label)
W formacie JSON wymagane jest wyłącznie pole name; każde inne pole przyjmuje tę samą wartość domyślną, jaką ustawiłby kreator w panelu administracyjnym.
Przykładowa treść żądania
Oto maksymalny JSON data - z wypełnioną każdą sekcją. Wyślij tylko te sekcje, na których Ci zależy; wszystkie pozostałe przyjmą wartości domyślne.
{
"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
}
}
Reguły walidacji z własnymi komunikatami błędów:
name- wymagane, maks. 150 znakówadvanced.temperature- od0.0do1.0chatMemory.summariesToKnowledgeRatio- liczba całkowita od10do90(procent, krok10)appearance.launcherBottomMargin,appearance.launcherSideMargin- od0do500appearance.footerMarkdown- maks. 255 znakówhumanSupport.enabled=truewymaga ustawieniahumanSupport.emailleadCollection.enabled=truewymaga, aby przynajmniej jedno z pólleadCollection.emailEnabledlubleadCollection.phoneEnabledmiało wartość true; niezależnie od tego, który kanał jest włączony, wymaga on również swojej etykiety orazleaveDetailsMessageithankYouMessageadvanced.chatContextSizejest ograniczane do maksymalnego rozmiaru kontekstu obsługiwanego przez Twoje konto. Nie zakładaj, że inne pola numeryczne są automatycznie przycinane.
Pola, których wartość na serwerze wynosi null, są pomijane w treści JSON - przez sieć przesyłane są wyłącznie pola z wartościami innymi niż null.
Przykładowa treść odpowiedzi (201)
Struktura jest taka sama jak w żądaniu, z dodatkiem bloku meta tylko do odczytu oraz jednorazowego pola apiKey na najwyższym poziomie. Adresy URL plików tylko do odczytu (appearance.avatarUrl, whiteLabel.whitelabelLogoUrl) są uzupełniane przez serwer, gdy przesłano odpowiednie części 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"
}
Pole apiKey pojawia się tylko podczas tworzenia - jest to nowo wygenerowany klucz Bot Talk powiązany z nowym botem. Czysty tekst jest pokazywany tylko raz i nie można go później pobrać z API; zapisz go natychmiast po swojej stronie.
Nagłówek odpowiedzi Location zawiera adres URL nowego bota (/v1/management/bots/{id}).
Przykłady cURL
Tryb A - zwykły JSON (najprostszy):
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!"}}'
Tryb B - multipart z awatarem:
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}
Pobierz bieżącą konfigurację bota, którego jesteś właścicielem.
Przykład cURL
curl https://api.chatlab.com/aichat/v1/management/bots/4287 \
-H "Authorization: Bearer mk_..."
Przykładowa treść odpowiedzi (200)
Struktura jest taka sama jak w odpowiedzi POST, bez jednorazowego pola apiKey. Blok meta jest dołączony. Zwraca błąd 404 not_found_error, jeśli bot nie istnieje lub nie należy do Twojego konta.
Bieżący awatar i logo White Label są udostępniane jako w pełni kwalifikowane adresy URL tylko do odczytu (appearance.avatarUrl, whiteLabel.whitelabelLogoUrl) - oparte na tym samym schemacie, hoście i ścieżce kontekstu, które obsłużyły to żądanie. Pobierz pliki, wykonując żądanie GET bezpośrednio na te adresy URL; aby zastąpić dowolny z plików, prześlij nowy plik za pomocą części multipart avatar / whitelabel_logo w żądaniu PATCH. Te pola URL są ignorowane, jeśli zostaną wysłane w treści żądania.
{
"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"
}
}
Klonowanie bota
Ciało żądania POST /v1/management/bots i ciało odpowiedzi GET /v1/management/bots/{bot_id} mają taką samą strukturę, więc klonowanie to trzyetapowy proces: pobierz (GET) źródło, usuń pola tożsamości zarządzane przez serwer, wyślij (POST) wynik.
1. Pobierz (GET) bota źródłowego.
curl https://api.chatlab.com/aichat/v1/management/bots/4287 \
-H "Authorization: Bearer mk_..." \
-o source-bot.json
2. Usuń blok najwyższego poziomu meta. Obiekt meta (id, createdAt, updatedAt) jest zarządzany przez serwer i służy tylko do odczytu - pozostawienie go w ciele POST nie zaszkodzi (serwer go zignoruje), ale usunięcie go jasno wyraża intencję i usuwa zbędne dane z treści żądania. Opcjonalnie zmodyfikuj name, aby odróżnić klona od źródła.
jq 'del(.meta) | .name = "Helpdesk Bot (clone)"' source-bot.json > clone-body.json
3. Wyślij (POST) oczyszczone ciało, aby utworzyć klona. Zobacz dokumentację POST /v1/management/bots powyżej, aby poznać pełną strukturę ciała i reguły walidacji.
curl -X POST https://api.chatlab.com/aichat/v1/management/bots \
-H "Authorization: Bearer mk_..." \
-H "Content-Type: application/json" \
-d @clone-body.json
Odpowiedź zawiera meta.id nowego bota oraz nowo wygenerowany apiKey (klucz Bot Talk dla klona). Jawny tekst apiKey jest zwracany wyłącznie w tej odpowiedzi utworzenia - skopiuj go przed odrzuceniem ciała odpowiedzi; nie można go później odzyskać.
Kopiuje to obsługiwane ustawienia, a nie w pełni wytrenowanego chatbota. Treści do trenowania, historia rozmów, integracje/akcje, Flow oraz definicje formularzy nie są klonowane przez te punkty końcowe. Skonfiguruj je oddzielnie w aplikacji.
Dodatkowe uwagi:
- Pliki nie są klonowane. Pola
appearance.avatarUrliwhiteLabel.whitelabelLogoUrlsą tylko do odczytu i wskazują na pliki bota źródłowego. Jeśli potrzebujesz tego samego awatara lub logo White Label na klonie, pobierz pliki ze źródłowych adresów URL i prześlij je jako części multipartavatar/whitelabel_logo- w wywołaniu POST tworzącym bota (Tryb B) lub w kolejnym PATCH. - Klucze Bot Talk nie są klonowane. Każdy bot ma własną pulę kluczy Bot Talk. Pojedynczy klucz
apiKeyzwrócony przez żądanie POST tworzące bota jest jedynym generowanym automatycznie; w razie potrzeby utwórz dodatkowe klucze w zakładce API bota.
PATCH /v1/management/bots/{bot_id}
Zaktualizuj jedno lub więcej pól posiadanego bota. Zmodyfikowane zostaną tylko sekcje / pola obecne w JSON; wszystko pominięte (lub przesłane jako null) pozostaje nienaruszone. Semantyka częściowej aktualizacji ma zastosowanie dla każdego pola w obrębie przesłanej sekcji.
Akceptowane są dwa równoważne nagłówki Content-Type (tak samo jak w POST):
Tryb A - zwykły JSON (zalecany, gdy aktualizujesz tylko ustawienia):
Content-Type: application/json- Ciało żądania jest kodem JSON modyfikacji (bez wrappera
data)
Tryb B - multipart/form-data (używaj przy przesyłaniu plików):
- Część JSON
data(opcjonalna) - modyfikacja. Przesyłaj tylko wtedy, gdy chcesz zmienić pola. Pomiń całkowicie, jeśli chcesz jedynie przesłać awatar lub logo. - Część plikowa
avatar(opcjonalna) - zastąpienie awatara - Część plikowa
whitelabel_logo(opcjonalna) - zastąpienie logo White Label (dotyczy tylko sytuacji, gdy Twoje konto obejmuje funkcję White Label)
Wszystkie trzy części są opcjonalne w PATCH, ale przynajmniej jedna musi być obecna, aby wywołanie miało sens.
Przykładowe ciało żądania (wiele sekcji)
Można tu przesłać dowolne pole akceptowane przez POST /v1/management/bots. Poniższy przykład ilustruje kilka sekcji, a nie każde obsługiwane pole; w praktyce przesyłasz tylko te klucze, które chcesz zmienić (zobacz "Minimalna częściowa aktualizacja" poniżej) - każdy pominięty klucz (lub przesłany jako null) pozostawia zapisaną wartość bez zmian.
{
"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
}
}
Minimalna częściowa aktualizacja
Zaktualizuj pojedyncze pole za pomocą PATCH, wysyłając dokładnie te klucze, które chcesz zmienić - cała reszta zostanie zachowana.
{
"appearance": {
"launcherColor": "#abcdef"
}
}
Przykłady curl
Tryb A - zwykły JSON (najprostszy):
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"}}'
Tryb B - multipart (przy wymianie awatara / logo):
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'
Tryb B - wymiana samego awatara (brak zmian w polach):
curl -X PATCH https://api.chatlab.com/aichat/v1/management/bots/4287 \
-H "Authorization: Bearer mk_..." \
-F 'avatar=@./new-avatar.png'
Ciało odpowiedzi (200)
Taka sama struktura jak w GET /v1/management/bots/{bot_id} - pełna konfiguracja bota po zastosowaniu modyfikacji, w tym blok meta. Brak pola apiKey. Zwraca 404 not_found_error, jeśli bot nie istnieje lub nie należy do Twojego konta.
Poniższy przykład przedstawia odpowiedź po zastosowaniu powyższej modyfikacji Pełne ciało żądania (wiele sekcji) na bocie z przykładu GET - zmienione pola odzwierciedlają nowe wartości, nietknięte pola zostają zachowane, a wartość meta.updatedAt rośnie.
{
"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
Odczytaj bieżące wykorzystanie subskrypcji dla konta, do którego należy klucz Management.
Ciało odpowiedzi (200)
{
"subscriptionType": "your-plan-id",
"messages": {"used": 4123, "limit": 11000, "remaining": 6877},
"bots": {"used": 3, "limit": 5, "remaining": 2}
}
subscriptionTypeto pisany małymi literami identyfikator bieżącego planu konta (your-plan-idto przykładowy placeholder). Plany pochodzą z dynamicznego katalogu, więc dokładny zestaw identyfikatorów może się z czasem zmieniać w miarę dodawania lub zmiany nazw planów - traktuj to jako nieprzejrzysty ciąg znaków, a nie stały enum.messages.used/limit/remainingto kredyty wiadomości na bieżący miesiąc kalendarzowy, resetowane pierwszego dnia miesiąca, a nie w dniu odnowienia subskrypcji. Są to wartości ważone kredytami, a nie surowa liczba odpowiedzi.bots.used/limit/remainingzliczają posiadane boty, w tym boty wstrzymane, w ramach całkowitego limitu botów na Twoim koncie.
Nagłówki limitu zapytań (rate limit)
Odpowiedzi, które docierają do etapu sprawdzania limitu zapytań (czyli przeszły uwierzytelnianie i białą listę IP), zawierają:
X-RateLimit-Limit: 10
X-RateLimit-Remaining: 7
X-RateLimit-Reset: 1715430000
X-RateLimit-Limit- limit przypadający na klucz, rzeczywiście zastosowany do tego wywołania (domyślnie 10 lub Twoja skonfigurowana wartośćrateLimitPerMinute, jeśli jest niższa).X-RateLimit-Remaining- liczba tokenów pozostałych w puli bezpośrednio po tym wywołaniu.X-RateLimit-Reset- czas w sekundach uniksowych (Unix epoch), w którym dostępny będzie następny token (nie jest to pełne zresetowanie puli; pula uzupełnia się w sposób ciągły). Gdy pula jest pełna, wartość ta oznacza bieżący czas.
W odpowiedziach 429 rate_limit_exceeded ustawiany jest także nagłówek Retry-After, wyrażony w pełnych sekundach do momentu zwolnienia przynajmniej jednego tokena.
Błędy poprzedzające uwierzytelnienie (401 missing_api_key, 401 invalid_api_key, 403 ip_blocked) oraz 403 ip_not_whitelisted nie zawierają nagłówków X-RateLimit-* - mechanizm limitowania jest odpytywany dopiero po pomyślnym zakończeniu uwierzytelniania i weryfikacji IP.
Format błędów
Taka sama struktura odpowiedzi (envelope) jak w Bot Talk API:
{
"error": {
"type": "permission_error",
"code": "key_type_not_allowed",
"message": "This endpoint requires a MANAGEMENT API key.",
"param": null
}
}
Błędy walidacji używają code: "invalid_parameter" i dodają ścieżkę do niepoprawnego pola na początku komunikatu, dzięki czemu sekcję powodującą błąd można łatwo zlokalizować:
{
"error": {
"type": "invalid_request_error",
"code": "invalid_parameter",
"message": "humanSupport.email Human support email is required when humanSupport.enabled=true"
}
}
Nieprawidłowe wartości dla pól typu enum / o zamkniętym zbiorze wartości (np. chatMemory.clientSummaryPromptType = "BOGUS") zawierają ścieżkę do pola, odrzuconą wartość oraz listę dozwolonych wartości:
{
"error": {
"type": "invalid_request_error",
"code": "invalid_parameter",
"message": "chatMemory.clientSummaryPromptType 'BOGUS' is not a valid value. Allowed: CUSTOM, DEFAULT"
}
}
Powiązane materiały
Informacje o endpointach do obsługi konwersacji i strumieniowaniu SSE znajdziesz w dokumentacji Bot Talk API.