Übersicht über die Management API
Die Management API ist für Back-Office-Aufgaben gedacht, bei denen keine Chat-Nachrichten gesendet werden:
- Bot programmatisch erstellen mit
POST /v1/management/bots - Einen bestimmten eigenen Bot abrufen mit
GET /v1/management/bots/{bot_id} - Einen bestimmten Bot aktualisieren mit
PATCH /v1/management/bots/{bot_id} - Abonnement-Nutzung abrufen mit
GET /v1/usage
Management-Schlüssel sind an Ihr Konto gebunden, nicht an einen bestimmten Bot. Sie werden bewusst getrennt von Bot Talk-Schlüsseln gehalten, damit ein kompromittierter Chat-Schlüssel Ihre Bots nicht verändern oder Ihre Abrechnungsdaten einsehen kann.
Basis-URL
https://api.chatlab.com/aichat
Alle Endpunkte in diesem Artikel beziehen sich auf diese Basis-URL.
Erste Schritte
- Öffnen Sie die Admin-App und gehen Sie zu Account Settings (Kontoeinstellungen) > Management API.
- Klicken Sie auf Create Management Key (Management-Schlüssel erstellen), vergeben Sie einen Namen, legen Sie optional eine IP-Whitelist und ein Rate-Limit fest und senden Sie das Formular ab.
- Kopieren Sie den vollständigen Schlüssel aus dem Erfolgs-Modal. Der Klartext wird nur ein einziges Mal angezeigt.
Ein Schlüssel sieht aus wie mk_abcdefghijklmnopqrstuvwxyz012345. Das Präfix mk_ unterscheidet ihn von Bot Talk-Schlüsseln (ck_).
Authentifizierung
Authorization: Bearer mk_abcdefghijklmnopqrstuvwxyz012345
Das Senden eines mk_-Schlüssels an /v1/chat (oder einen beliebigen anderen Bot Talk-Endpunkt) gibt 403 key_type_not_allowed zurück. Das Senden eines ck_-Schlüssels an /v1/management/* gibt denselben Fehler zurück.
Limits
- Maximal 5 aktive Management API-Schlüssel pro Benutzer
- Maximal 10 Anfragen pro Minute pro Schlüssel (Token-Bucket-Verfahren, Kapazität 10, gleichmäßiges Nachfüllen von ~1 Token alle 6 Sekunden). Beim Erstellen nach unten konfigurierbar - setzen Sie ein niedrigeres
rateLimitPerMinute, sinkt die Obergrenze und die Nachfüllrate skaliert entsprechend mit.
Berechtigungen
Jeder Management-Schlüssel verfügt über eine beliebige Teilmenge der folgenden drei Berechtigungen. Mindestens eine muss beim Erstellen ausgewählt werden; andernfalls wird die Anfrage mit 400 invalid_request_error abgelehnt. Der Aufruf eines Endpunkts mit einem Schlüssel, dem die erforderliche Berechtigung fehlt, gibt 403 insufficient_permissions zurück.
bot_read- erforderlich fürGET /v1/management/bots/{bot_id}bot_management- erforderlich fürPOST /v1/management/botsundPATCH /v1/management/bots/{bot_id}usage- erforderlich fürGET /v1/usage
Struktur des Request-Bodys: verschachtelte Abschnitte spiegeln die Admin-UI-Tabs wider
POST und PATCH akzeptieren einen JSON-Body, der in 13 Abschnitte unterteilt ist. Jeder Abschnitt entspricht einem Unter-Tab in der Seitenleiste "Bot Settings" der Admin-App, sodass die JSON-Schlüssel und die sichtbaren Tabs übereinstimmen: Wenn Sie consent.humanSupportRequirePolicyAccept über die API ändern, wird derselbe Umschalter auf dem Tab Consent & Privacy (Einwilligung & Datenschutz) in der Admin-App umgelegt.
role- Bot-Persona, Raw-Prompt, Antwortlänge, Sprache, Kontext der Website / des Unternehmens (Tab "Role & Behavior" / Rolle & Verhalten)conversation- Begrüßungsnachricht, Anfrageverfeinerung, Konversationskontinuität, Bewertungs-Umschalter + Tooltips, vorgeschlagene Fragen + dynamische Nachfragen (Tab "Chat Conversation" / Chat-Konversation)chatMemory- Chat-Gedächtnis-Umschalter, Zusammenfassungs-Prompts, Kontextzuweisung (Tab "Summaries & Memory" / Zusammenfassungen & Gedächtnis)appearance- Farben, Texte, Abmessungen, benutzerdefiniertes CSS, Begrüßungsbildschirm, Styling für vorgeschlagene Fragen, Verhalten beim automatischen Öffnen, Simulation menschlichen Tippens, Footer-Markdown (Tab "Appearance" / Erscheinungsbild)humanSupport- menschliches Kontaktformular (Tab "Human Contact Form" / Menschliches Kontaktformular)leadCollection- Lead-Erfassungsformular (Tab "Lead Collection" / Lead-Erfassung)liveChat- Übergabe an den Live Chat (Tab "Live Chat")consent- alle vier Datenschutzrichtlinien-Einwilligungsschalter sowie der Text des Einwilligungsbildschirms (Tab "Consent & Privacy" / Einwilligung & Datenschutz)whiteLabel- Logo ausblenden, benutzerdefinierter Logo-Link, Hosting auf eigener Domain (Tab "Whitelabel")security- zulässige Domains, Spamfilter, Talk-Rate-Limits (Tab "Security" / Sicherheit)voice- Spracheingabe und Sprachunterhaltungen: Modell, Stimme, Sprachen, Prompt, maximale Dauer (Tab "Voice Conversation" / Sprachunterhaltung)multilingual- mehrsprachiger Modus, Basissprache, angebotene Sprachen, Handhabung der Wissenssprachen (Tab "Languages" / Sprachen)advanced- LLM-Modell, Temperatur, Kontextgröße, Limit für Bot-Nachrichten, internes Locale, Offer Cards (Tab "Model & Advanced" / Modell & Erweitert)
Nur name befindet sich auf oberster Ebene, da es den Bot identifiziert und nicht zu einem einzelnen Tab gehört.
Die Seitenleiste "Bot Settings" verfügt derzeit über 15 Unter-Tabs, von denen 13 den oben genannten Abschnitten entsprechen. Die beiden Unter-Tabs ohne entsprechenden Abschnitt sind Flow und Actions - beide werden unten unter "Außerhalb des API-Umfangs" behandelt. Die 13 Tabs mit Entsprechung sind Appearance, Chat Conversation, Role & Behavior, Human Contact Form, Lead Collection, Live Chat, Whitelabel, Consent & Privacy, Security, Model & Advanced, Summaries & Memory, Voice Conversation und Languages.
Request-Body und Response-Body teilen sich dieselbe Struktur. Die Antwort enthält zwei zusätzliche Angaben:
meta- schreibgeschützt: Bot-ID und Zeitstempel. Entfernen Sie diesen Abschnitt, um eine GET-Antwort in einen gültigen POST-Body zu verwandeln.apiKey- nur beim Erstellen vorhanden - der neu generierte Bot Talk API-Schlüssel für den neuen Bot.
Zwei Felder innerhalb der gemeinsamen Struktur sind schreibgeschützt - sie werden in der Antwort zurückgegeben und ignoriert, wenn Sie versuchen, sie per POST/PATCH zu senden:
appearance.avatarUrl- vollständig qualifizierte öffentliche URL des Bot-Avatar-Bildes (z. B.https://api.chatlab.com/aichat/content/avatar_xyz.png). Führen Sie einen direkten GET-Aufruf aus, um die Rohdaten herunterzuladen. Um sie zu ändern, laden Sie eine neue Datei über den Multipart-Teilavatarhoch (siehe PATCH).whiteLabel.whitelabelLogoUrl- vollständig qualifizierte öffentliche URL des White-Label-Header-Logos. Gleiches Muster wie beiavatarUrl. Um sie zu ändern, laden Sie eine neue Datei über den Multipart-Teilwhitelabel_logohoch (siehe PATCH).
Beide URLs verwenden Schema + Host + Kontextpfad der aktuellen Anfrage; bei einer benutzerdefinierten White-Label-Domain verweisen sie daher direkt auf diese Domain (z. B. https://api.acme.com/aichat/content/...).
Senden Sie null für einen Abschnitt, um ihn bei PATCH zu überspringen; senden Sie null für ein Feld innerhalb eines Abschnitts, um dieses einzelne Feld zu überspringen. Ein null auf Feldebene löscht niemals einen gespeicherten Wert - es bedeutet lediglich "nicht ändern".
Rolle und Prompt-Erstellung
Der System-Prompt, den das LLM tatsächlich erhält, wird abhängig von role.role auf eine von zwei Arten erstellt. Zu wissen, welcher Zweig aktiv ist, zeigt Ihnen, welche Felder relevant sind und welche zwar gespeichert, aber ignoriert werden.
Zweig A - role.role ist CUSTOMER_SUPPORT, SALES oder LEAD_COLLECTION_AGENT (vorlagenbasiert)
Das Backend setzt den Prompt aus einer integrierten Vorlage zusammen und ignoriert role.rawPrompt vollständig (der Wert wird dennoch beim Bot gespeichert, nur nicht verwendet). Die Vorlage berücksichtigt:
role.role- Rollenbezeichnung (z. B. "Customer Support") und rollenspezifische Anweisungen werden automatisch angehängtname- Bot-Name, der in den einleitenden Satz eingefügt wirdrole.language-"Auto Detect"stellt den Bot so ein, dass er der Sprache des Nutzers folgt; jeder andere Wert (z. B."English","Polish") wird zu "Output in {language}, unless user uses another language"role.responseLength- wird auf eine Ziel-Wortanzahl abgebildet:Concise≈ 50 Wörter,Normal≈ 100,Detailed≈ 200role.websiteAddress- optional; wenn ausgefüllt, angehängt als "for the users of the website {url}"role.companyDescription- optional; wenn ausgefüllt, als zusätzlicher Absatz vor den Rollenanweisungen vorangestellt
Dies ist der empfohlene Zweig für die meisten Bots - Sie erhalten automatisch auf die Rolle abgestimmtes Verhalten und Sicherheitsleitplanken.
Zweig B - role.role ist CUSTOM (vom Aufrufer bereitgestellter Prompt)
Das Backend verwendet role.rawPrompt wortwörtlich als gesamten System-Prompt. responseLength, language, websiteAddress und companyDescription werden gespeichert, aber nicht in den Prompt eingefügt - wenn Sie möchten, dass sich eines dieser Felder im Verhalten des Bots widerspiegelt, müssen Sie es selbst in Ihren rawPrompt-Text aufnehmen. Rollenspezifische Sicherheitsleitplanken und Tonfall-Anweisungen werden ebenfalls nicht hinzugefügt; Sie steuern den gesamten Prompt selbst.
Verwenden Sie CUSTOM nur, wenn der vorlagenbasierte Prompt nicht zu Ihrem Anwendungsfall passt (z. B. wenn Sie eine sehr domänenspezifische Persona, eigene Sicherheitsvorgaben oder ein nicht standardmäßiges Ausgabeformat benötigen).
Enum- / Wertebereich-Felder
Mehrere Felder akzeptieren nur eine feste Auswahl an String-Werten. Das Senden eines Werts außerhalb der Liste wird mit 400 validation_failed und dem Feldpfad in error.param abgewiesen. Bei den Werten wird zwischen Groß- und Kleinschreibung unterschieden.
role.role-CUSTOMER_SUPPORT,SALES,LEAD_COLLECTION_AGENT,CUSTOMrole.responseLength-Concise,Normal,Detailedrole.language- vollständiger englischer Sprachname aus dem Admin-Dropdown, z. B.Auto Detect,English,Polish,Spanish,German,French,Italian,Portuguese,Dutch,Russian,Chinese (Simplified),Japanese,Arabic,Hindiund rund 80 weitere. Der Wert wird wörtlich gespeichert und in die Prompt-Vorlage eingesetzt; zweistellige ISO-Codes (en,pl) und andere Werte außerhalb der Liste werden von der API zwar nicht abgelehnt, führen aber zu einer fehlerhaften Anweisung wie "Output in en, unless...". StandardmäßigAuto Detect, wenn beim Erstellen weggelassen.advanced.model- siehe "KI-Textmodelle" unten; die auswählbare Menge unterliegt Ihren Kontolimits, und jeder Wert, den Ihr Konto nicht nutzen kann, gibt400 invalid_parameterzurückadvanced.chatContextSize-8000,16000,32000. Unterliegt Ihren Kontolimits; höhere Werte werden stillschweigend nach unten korrigiertchatMemory.clientSummaryPromptType-DEFAULT,CUSTOMchatMemory.conversationSummaryPromptType-DEFAULT,CUSTOMappearance.chatAlignment-left,rightappearance.minimizedDisplayMode-icon,minifiedappearance.chatMessageLinkTarget-_blank,_selfleadCollection.requireBeforeNewConversation- boolescher Umschalter.truezwingt den Nutzer dazu, das Lead-Formular auszufüllen, bevor ein Gespräch begonnen werden kann;falseüberlässt es der KI zu entscheiden, wann das Formular angezeigt wird (Standard).
Strukturierte Felder und Wertebereiche
Felder, die wie einfache Strings oder Zahlen aussehen, aber spezifische Formate, Bereiche oder Besonderheiten in der Admin-UI aufweisen, die man kennen sollte.
-
advanced.temperature- zulässiger Bereich ist0.0bis1.0, passend zum Schieberegler in der Admin-UI. Werte außerhalb dieses Bereichs werden mit400 validation_failedabgewiesen. -
chatMemory.summariesToKnowledgeRatio- ganzzahliger Prozentwert,10-90in 10er-Schritten (step 10). Steuert, wie viel des Chat-Kontexts für historische Zusammenfassungen des Clients im Vergleich zum Rest (Wissensdatenbank, aktuelle Konversation, Anweisungen) reserviert ist. Standard ist50. Werte außerhalb von10-90werden mit400 validation_failedabgewiesen. Gilt nur, wennchatMemory.enabled=trueUNDchatMemory.summaryConversationsEnabled=true. -
liveChat.schedule- als String codiertes JSON, kein verschachteltes JSON-Objekt bei der Übertragung. Der Server speichert den Roh-String unverändert; die Admin-UI parst ihn clientseitig beim Rendern des Zeitplan-Editors. Nach dem Parsen enthält der String einen Eintrag pro Wochentag sowie einentimezone-Schlüssel:- jeder Wochentags-Schlüssel (
monday-sunday) verweist auf{enabled: boolean, from: "H:MM", to: "H:MM"}im 24-Stunden-Format timezoneist ein IANA-Zonenname (z. B."Europe/Warsaw","America/New_York")
Beispielwert (beachten Sie die äußeren Anführungszeichen und die maskierten inneren Anführungszeichen - es handelt sich um ein einzelnes String-Feld, kein verschachteltes Objekt):
"{\"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\"}"Außerhalb der angegebenen Zeiten wird dem Besucher
liveChat.outOfHoursMessageangezeigt und die Übergabe an den Live Chat unterbunden. Die Validierung der inneren Struktur findet nur clientseitig in der Admin-UI statt - fehlerhaftes JSON oder unbekannte Schlüssel werden von der API einfach als String akzeptiert und führen später zu einem Darstellungsfehler, wenn ein Benutzer den Bot im Admin-Bereich öffnet. Validieren Sie die Struktur vor dem Absenden auf Ihrer Seite. - jeder Wochentags-Schlüssel (
-
conversation.positiveRatingTooltip/conversation.negativeRatingTooltip- kurze Beschriftungen auf den Schaltflächen 👍 / 👎 neben jeder KI-Antwort, wennconversation.conversationRatingEnabled=true. Standardtext ist "I like the response" / "I don't like the response". Für Endnutzer sichtbar. -
whiteLabel.hideRoboAssistLogo- White-Label-Funktion, abhängig von Ihren Kontolimits. Blendet die Footer-Zeile "Powered by ChatLab" aus. Wenn Ihr Konto kein White-Labelling umfasst, wird der Wert zwar gespeichert, aber ignoriert, und der Footer wird immer dargestellt. -
whiteLabel.whitelabelLogoLink- White-Label-Funktion, abhängig von Ihren Kontolimits. Klick-Ziel-URL für das benutzerdefinierte Logo, wennhideRoboAssistLogo=trueund eine benutzerdefinierte Logo-Datei über den Multipart-Teilwhitelabel_logohochgeladen wurde. -
appearance.simulateHumanTypingDelay- Sekunden (nicht Millisekunden), ganze Zahl0-200. Pause zwischen aufeinanderfolgenden Bot-Nachrichtenblasen, wennsimulateHumanTyping=true. Standard ist5. -
appearance.autoOpenChatDelaySeconds- Sekunden, ganze Zahl. Verzögerung, bevor sich das Widget automatisch öffnet, wennautoOpenChat=trueundautoOpenChatDelay=true. -
advanced.internalLocale- IETF-Locale-Regionscode im Formatll_CC(Unterstrich, NICHTll-CCmit Bindestrich). Akzeptierte Werte stammen aus einer festen Liste von rund 95 Locales: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_ILund vielen weiteren. Das Senden eines reinen zweistelligen Codes ("en") oder BCP-47 ("en-US") ist nicht in der Liste der erlaubten Werte enthalten. Standard isten_US. Dies ist das Locale, das für die Datums-/Zahlenformatierung in der Widget-Benutzeroberfläche verwendet wird, unabhängig vonrole.language(der Konversations-Ausgabesprache des Bots). -
security.talkMessagesRateLimit/security.talkMessagesRateLimitDurationSeconds- ganze Zahlen (als JSON-Zahlen senden, z. B.30, nicht"30").0deaktiviert das Rate-Limit pro IP. Wenn ungleich null, erzwingt das Widget N Nachrichten pro Zeitspanne in Sekunden, bevor dem Besuchersecurity.talkMessagesRateLimitHitMessageangezeigt wird. -
advanced.botMessagesLimit- ganze Zahl (JSON-Zahl, z. B.1000).0bedeutet "kein Limit"; andernfalls muss es ein Vielfaches von 1.000 sein (1000,2000,10000, ...). Werte wie100oder1500werden mit400 validation_failedabgewiesen. Anschließend wird der Wert stillschweigend auf Ihr Kontolimit begrenzt.
KI-Textmodelle (advanced.model)
Senden Sie den exakten API-Wert (linke Spalte im Code-Format). Der Anzeigename in der Admin-UI steht in Klammern. Ihre Kontolimits bestimmen, welche Teilmenge auswählbar ist; das Senden eines Modells, das Ihr Konto nicht verwenden darf, gibt 400 invalid_parameter zurück. Der Standardwert für neue Bots ist 5-MINI.
4-O-MINI(GPT 4-o mini)4-O(GPT 4-o)4.1-MINI(GPT 4.1-mini)4.1(GPT 4.1)5-MINI(GPT 5-mini)5(GPT 5)5.1(GPT 5.1)5.4-MINI(GPT 5.4-mini)5.4(GPT 5.4)5.5(GPT 5.5)GEMINI 2.5 PRO(Gemini 2.5 Pro)GEMINI 3 Flash(Gemini 3 Flash)GEMINI 3.5 Flash(Gemini 3.5 Flash)GEMINI 3.7 Flash(Gemini 3.7 Flash)GEMINI 3.8 Flash(Gemini 3.8 Flash)GEMINI 3.1 Flash-Lite(Gemini 3.1 Flash-Lite)GEMINI 3 PRO(Gemini 3 Pro)
Feldreferenz (vollständiges Anfrage-Schema)
Jedes Feld bei der Übertragung, mit Typ, Einschränkung und einzeiliger Beschreibung. PATCH-Semantik: Jedes weggelassene (oder als null gesendete) Feld belässt den gespeicherten Wert unverändert. Dieselbe Struktur wird für die Antwort verwendet (abzüglich mehrteiliger Binärinhalte; zuzüglich des schreibgeschützten meta-Blocks bei jeder Antwort und apiKey ausschließlich bei der Antwort auf die Erstellung).
Oberste Ebene
| Feld | Typ | Einschränkung | Beschreibung |
|---|---|---|---|
name |
string | max. 150, erforderlich bei Erstellung | Anzeigename des Bots |
role |
object | Siehe § role | |
conversation |
object | Siehe § conversation | |
chatMemory |
object | Siehe § chatMemory | |
appearance |
object | Siehe § appearance | |
humanSupport |
object | Siehe § humanSupport | |
leadCollection |
object | Siehe § leadCollection | |
liveChat |
object | Siehe § liveChat | |
consent |
object | Siehe § consent | |
whiteLabel |
object | Siehe § whiteLabel | |
security |
object | Siehe § security | |
advanced |
object | Siehe § advanced |
Ausschließliche Zusätze in Antworten:
meta: { id, createdAt, updatedAt }- schreibgeschützt.apiKey- String, nur in der Antwort aufPOST /v1/management/botsvorhanden - der neu erstellte Bot-Talk-Schlüssel für den neuen Bot, der genau einmal zurückgegeben wird.
§ role
| Feld | Typ | Einschränkung | Beschreibung |
|---|---|---|---|
role |
string (enum) | CUSTOMER_SUPPORT, SALES, LEAD_COLLECTION_AGENT, CUSTOM |
Persona-Voreinstellung; wählt die Prompt-Vorlage aus (siehe "Rollen- und Prompt-Erstellung") |
language |
string | vollständiger englischer Sprachname (English, Polish, ...) oder Auto Detect |
Primärsprache, die an die Prompt-Vorlage übergeben wird |
responseLength |
string | ∈ {Concise, Normal, Detailed} |
Gewünschte Ausführlichkeit der KI-Antwort |
websiteAddress |
string | Website, die für den Prompt-Kontext verwendet wird | |
companyDescription |
string | Unternehmensbeschreibung, die für den Prompt-Kontext verwendet wird | |
rawPrompt |
string | Benutzerdefinierter System-Prompt - wird nur bei role=CUSTOM wortwörtlich verwendet |
§ conversation
| Feld | Typ | Einschränkung | Beschreibung |
|---|---|---|---|
welcomeMessage |
string | Erste Nachricht, die dem Besucher beim Öffnen angezeigt wird | |
queryRefinementEnabled |
boolean | Wenn true, wird die Frage des Besuchers vor dem RAG-Abruf präzisiert | |
conversationContinuityEnabled |
boolean | Wenn true, setzen wiederkehrende Besucher ihre letzte Unterhaltung fort | |
conversationRatingEnabled |
boolean | Wenn true, wird eine Bewertung mit Daumen nach oben/unten bei Bot-Nachrichten angezeigt | |
positiveRatingTooltip |
string | Tooltip auf der Schaltfläche für positive Bewertungen | |
negativeRatingTooltip |
string | Tooltip auf der Schaltfläche für negative Bewertungen | |
suggestedQuestions |
string | Durch Zeilenumbrüche getrennte Fragevorschläge / Gesprächseinstiege | |
dynamicSuggestedFollowups |
boolean | Wenn true, schlägt die KI nach jeder Antwort dynamische Folgefragen vor | |
dynamicFollowupsAutoIcons |
boolean | Wenn true, wählt die KI automatisch Emoji-Symbole für die dynamischen Folgefragen aus |
§ chatMemory
| Feld | Typ | Einschränkung | Beschreibung |
|---|---|---|---|
enabled |
boolean | Hauptschalter für die Chat-Memory-Funktion | |
summaryConversationsEnabled |
boolean | Zusammenfassungen pro Unterhaltung dauerhaft speichern | |
conversationSummaryPrompt |
string | Benutzerdefinierter Prompt zur Zusammenfassung jeder Unterhaltung | |
conversationSummaryPromptType |
string (enum) | ∈ {DEFAULT, CUSTOM} |
Bestimmt, ob der standardmäßige oder der benutzerdefinierte Zusammenfassungs-Prompt verwendet wird |
clientSummaryPrompt |
string | Benutzerdefinierter Prompt zur Zusammenfassung des Kunden über mehrere Unterhaltungen hinweg | |
clientSummaryPromptType |
string (enum) | ∈ {DEFAULT, CUSTOM} |
Standard- vs. benutzerdefinierter Kundenprofil-Prompt |
summariesToKnowledgeRatio |
int | 10-90, Schritt 10 |
Prozentualer Anteil des Chat-Kontextfensters, der für Zusammenfassungen im Vergleich zum RAG-Wissen reserviert ist |
§ appearance
| Feld | Typ | Einschränkung | Beschreibung |
|---|---|---|---|
launcherColor |
string (hex) | Hintergrundfarbe des Launchers (Chat-Symbol) | |
headerColor |
string (hex) | Hintergrundfarbe der Chat-Kopfzeile | |
titleColor |
string (hex) | Titelfarbe der Chat-Kopfzeile | |
subtitleColor |
string (hex) | Untertitelfarbe der Chat-Kopfzeile | |
clientMessageBubbleColor |
string (hex) | Sprechblasenfarbe von Besuchernachrichten | |
clientMessageTextColor |
string (hex) | Textfarbe von Besuchernachrichten | |
responseMessageBubbleColor |
string (hex) | Sprechblasenfarbe von Bot-Antworten | |
responseMessageTextColor |
string (hex) | Textfarbe von Bot-Antworten | |
chatSubheader |
string | Unterzeile, die unter dem Chat-Titel angezeigt wird | |
senderPlaceholder |
string | Platzhaltertext im Eingabefeld für Nachrichten | |
resetConversationTooltip |
string | Tooltip auf der Schaltfläche "Unterhaltung zurücksetzen" | |
chatAlignment |
string (enum) | ∈ {left, right} |
An welcher Bildschirmseite der Chat verankert wird |
launcherBottomMargin |
int | 0-500 |
Abstand des Launchers vom unteren Rand (px) |
launcherSideMargin |
int | 0-500 |
Abstand des Launchers vom Seitenrand (px) |
displayShadow |
boolean | Schlagschatten unter dem Widget | |
customCss |
string | Reines CSS, das in das Widget-Iframe eingefügt wird | |
chatMessageLinkTarget |
string (enum) | ∈ {_blank, _self} |
Wie Links innerhalb von Bot-Nachrichten geöffnet werden |
minimizedDisplayMode |
string (enum) | ∈ {icon, minified} |
Minimierter Zustand: Launcher-Symbol oder kompakte Absenderleiste |
chatDesktopWidthPx |
int | Widget-Breite auf dem Desktop | |
chatDesktopHeightPx |
int | Widget-Höhe auf dem Desktop | |
chatMobileSizePercent |
int | Widget-Größe auf Mobilgeräten in % des Viewports | |
messageFontSize |
int | Schriftgröße des Nachrichtentexts (px) | |
showChatbotBubblesDesktop |
boolean | Schwebende Teaser-Blasen auf dem Desktop anzeigen | |
showChatbotBubblesMobile |
boolean | Schwebende Teaser-Blasen auf Mobilgeräten anzeigen | |
chatbotBubblesDelaySeconds |
int | Verzögerung vor dem Erscheinen der Teaser-Blasen (Sekunden) | |
launcherIconFullSize |
boolean | Benutzerdefiniertes Launcher-Symbol randlos statt eingerückt darstellen | |
welcomeScreenEnabled |
boolean | Welcome Screen (Begrüßungsbildschirm) anzeigen, anstatt direkt zum Chat zu wechseln | |
welcomeScreenQuestionsLabel |
string | Beschriftung über den Fragenvorschlägen auf dem Begrüßungsbildschirm | |
welcomeScreenHideHumanContactForm |
boolean | Aktion für das Formular zur Kontaktaufnahme mit Menschen in der Kopfzeile ausblenden, während der Begrüßungsbildschirm angezeigt wird. Sie erscheint nach der ersten Nachricht des Besuchers wieder. Bei Bots, die vor dem 2026-09-02 erstellt wurden, ist der Standardwert true |
|
welcomeScreenHideLiveChat |
boolean | Live-Chat-Aktion in der Kopfzeile ausblenden, während der Begrüßungsbildschirm angezeigt wird. Sie erscheint nach der ersten Nachricht des Besuchers wieder. Bei Bots, die vor dem 2026-09-02 erstellt wurden, ist der Standardwert true |
|
headerActionsLayout |
string | DROPDOWN |
Wie Live Chat und das Formular zur Kontaktaufnahme mit Menschen in der Chat-Kopfzeile angeboten werden: ICONS (jeweils ein separates Symbol) oder DROPDOWN (im Kopfzeilenmenü gruppiert). Bei Bots, die vor dem 2026-09-02 erstellt wurden, ist der Standardwert ICONS |
stackSuggestedQuestions |
boolean | Fragenvorschläge vertikal anordnen (statt nebeneinander) | |
suggestedQuestionsFontSize |
int | Schriftgröße der Chips für Fragenvorschläge (px) | |
suggestedQuestionsTextColor |
string (hex) | Textfarbe der Chips für Fragenvorschläge | |
suggestedQuestionsBackgroundColor |
string (hex) | Hintergrundfarbe der Chips für Fragenvorschläge | |
autoOpenChat |
boolean | Chat auf dem Desktop automatisch öffnen | |
autoOpenChatOnMobiles |
boolean | Chat auf Mobilgeräten automatisch öffnen | |
autoOpenChatDelay |
boolean | Verzögerung vor dem automatischen Öffnen anwenden | |
autoOpenChatDelaySeconds |
int | Verzögerung für das automatische Öffnen (Sekunden) | |
simulateHumanTyping |
boolean | Bot-Antwort in mehrere Sprechblasen mit Tipp-Animation aufteilen | |
simulateHumanTypingDelay |
int | 0-200 |
Verzögerung zwischen den Sprechblasen-Nachrichten (Sekunden) |
footerMarkdown |
string | max. 255 | Benutzerdefiniertes Footer-Markdown, das unter dem Chat angezeigt wird |
avatarUrl |
string | schreibgeschützt | Vollqualifizierte öffentliche URL des Avatars; zum Ändern über den Multipart-Abschnitt avatar hochladen |
Multipart bei POST/PATCH: avatar (Datei-Abschnitt). GET- / Antwort-Bodies lassen den Dateiinhalt weg - übertragen wird nur die URL.
§ humanSupport
| Feld | Typ | Einschränkung | Beschreibung |
|---|---|---|---|
enabled |
boolean | Umschalter für den Flow für menschlichen Support | |
email |
string | erforderlich (streng bei Erstellung), wenn enabled=true |
Adresse, die Support-E-Mails von Menschen empfängt |
dialogMessage |
string | Aufforderungsnachricht, die über dem Formular angezeigt wird | |
thankYouMessage |
string | Bestätigung, die nach dem Absenden angezeigt wird | |
emailMessageSubjectTemplate |
string | Betreffvorlage für die an den Agenten gesendete E-Mail | |
emailMessageContentTemplate |
string | Textkörpervorlage für die an den Agenten gesendete E-Mail | |
emailPlaceholder |
string | Platzhalter im E-Mail-Eingabefeld | |
messagePlaceholder |
string | Platzhalter im Textbereich für Nachrichten | |
emailWithConversationContent |
boolean | Wenn true, wird das Transkript der Unterhaltung in den Textkörper der E-Mail eingefügt | |
customFormId |
long | ID eines bestehenden benutzerdefinierten Formulars | Ersetzt das integrierte Kontaktformular durch ein benutzerdefiniertes Formular. null behält das integrierte Formular bei |
customFormMapping |
string | JSON-kodierter String | Ordnet Felder des benutzerdefinierten Formulars den E-Mail-Feldern des menschlichen Supports zu |
requirePolicyAccept befindet sich unter consent.humanSupportRequirePolicyAccept, nicht hier.
§ leadCollection
| Feld | Typ | Einschränkung | Beschreibung |
|---|---|---|---|
enabled |
boolean | Umschalter für das Lead-Formular | |
nameEnabled |
boolean | Name erfassen | |
nameLabel |
string | Beschriftung des Namens-Eingabefelds | |
emailEnabled |
boolean | E-Mail erfassen | |
emailLabel |
string | erforderlich (streng bei Erstellung), wenn enabled=true UND emailEnabled=true |
Beschriftung des E-Mail-Eingabefelds |
phoneEnabled |
boolean | Telefonnummer erfassen | |
phoneLabel |
string | erforderlich (streng bei Erstellung), wenn enabled=true UND phoneEnabled=true |
Beschriftung des Telefon-Eingabefelds |
leaveDetailsMessage |
string | erforderlich (streng bei Erstellung), wenn enabled=true |
Nachricht, die den Besucher dazu animiert, Kontaktdaten zu hinterlassen |
thankYouMessage |
string | erforderlich (streng bei Erstellung), wenn enabled=true |
Bestätigung, die nach dem Absenden angezeigt wird |
requireBeforeNewConversation |
boolean | Wenn true, muss das Formular vor Beginn des Chats abgesendet werden; wenn false, entscheidet die KI, wann das Formular eingeblendet wird |
|
emailNotificationEnabled |
boolean | Den Inhaber jedes Mal per E-Mail benachrichtigen, wenn ein Lead erfasst wird | |
emailNotificationAddress |
string | Benachrichtigungsempfänger (standardmäßig die Konto-E-Mail) | |
emailWithConversationContent |
boolean | Wenn true, wird das Transkript der Unterhaltung in die Benachrichtigung eingefügt |
Feldübergreifende Regel (streng bei Erstellung): enabled=true erfordert mindestens eine der Optionen emailEnabled oder phoneEnabled. requirePolicyAccept befindet sich unter consent.leadCollectionRequirePolicyAccept, nicht hier.
| customFormId | long | ID eines bestehenden benutzerdefinierten Formulars | Ersetzt das integrierte Lead-Formular durch ein benutzerdefiniertes Formular. null behält das integrierte Formular bei |
| customFormMapping | string | JSON-kodierter String | Ordnet Felder des benutzerdefinierten Formulars Name / E-Mail / Telefonnummer zu |
§ liveChat
| Feld | Typ | Einschränkung | Beschreibung |
|---|---|---|---|
enabled |
boolean | Umschalter für die Funktion Live Chat | |
infoMessage |
string | Erklärende Nachricht vor der Übergabe | |
startMessage |
string | Nachricht, die beim Start der Live-Sitzung angezeigt wird | |
endMessage |
string | Nachricht, die beim Beenden der Live-Sitzung angezeigt wird | |
nameLabel |
string | Beschriftung des Namens-Eingabefelds im Vorab-Formular für Live Chat | |
emailLabel |
string | Beschriftung des E-Mail-Eingabefelds im Vorab-Formular für Live Chat | |
schedule |
string | JSON-kodierter String (Wochentagsschalter + from/to + timezone) |
Betriebszeiten für Live Chat - die genaue Struktur finden Sie unter "Strukturierte Felder und Bereiche" |
outOfHoursMessage |
string | Nachricht, die angezeigt wird, wenn der Zeitplan außerhalb der Betriebszeiten liegt | |
closeModalMessage |
string | Titel des Modals "Live-Chat schließen?" | |
closeModalConfirmLabel |
string | Beschriftung der Bestätigungsschaltfläche im Schließen-Modal | |
closeModalCancelLabel |
string | Beschriftung der Abbrechen-Schaltfläche im Schließen-Modal | |
closeModalTooltipText |
string | Tooltip am Bedienelement zum Schließen des Chats | |
operatorHasJoinedLabel |
string | Text, der angezeigt wird, wenn ein Operator beitritt | |
operatorDidNotJoinInTimeLabel |
string | Text, der angezeigt wird, wenn innerhalb des Timeouts kein Operator beitritt | |
waitingForOperatorToJoinLabel |
string | Text, der angezeigt wird, während auf einen Operator gewartet wird | |
waitingForOperatorSeconds |
int | Timeout für die Annahme durch einen Operator (Sekunden) | |
redirectToHumanSupportForm |
boolean | Wenn true, wird auf das Formular für menschlichen Support zurückgegriffen, falls kein Operator annimmt | |
missedEmailEnabled |
boolean | Standard: true |
Sendet eine E-Mail an den Bot-Inhaber, wenn eine Live-Chat-Anfrage unbeantwortet blieb. Bei älteren Bots nicht gesetzt, was als aktiviert interpretiert wird |
requirePolicyAccept befindet sich unter consent.liveChatRequirePolicyAccept, nicht hier.
§ consent
| Feld | Typ | Einschränkung | Beschreibung |
|---|---|---|---|
newConversationRequirePolicyAccept |
boolean | Zustimmung zur Datenschutzerklärung vor Beginn einer neuen Unterhaltung verlangen | |
humanSupportRequirePolicyAccept |
boolean | Zustimmung zur Datenschutzerklärung vor dem Absenden des Formulars für menschlichen Support verlangen | |
leadCollectionRequirePolicyAccept |
boolean | Zustimmung zur Datenschutzerklärung vor dem Absenden des Lead-Erfassungsformulars verlangen | |
liveChatRequirePolicyAccept |
boolean | Zustimmung zur Datenschutzerklärung vor Beginn einer Live-Chat-Sitzung verlangen | |
newConversationConsentDescription |
string | Einleitungstext für den Zustimmungsbildschirm zu Beginn der Unterhaltung | |
privacyPolicyConsentCheckboxLabel |
string | Beschriftung neben dem Zustimmungs-Kontrollkästchen (enthält üblicherweise einen Link zur Datenschutzerklärung) |
§ whiteLabel
| Feld | Typ | Einschränkung | Beschreibung |
|---|---|---|---|
hideRoboAssistLogo |
boolean | White-Label-Funktion; unterliegt den Kontolimits | Standardmäßiges ChatLab-Logo in der Fußzeile ausblenden |
whitelabelLogoLink |
string | White-Label-Funktion; unterliegt den Kontolimits | URL, auf die das benutzerdefinierte Fußzeilenlogo verlinkt |
assignToCustomDomain |
boolean | abhängig von der Funktion CUSTOM_DOMAIN |
Den Chat auf der konfigurierten benutzerdefinierten Domain hosten |
whitelabelLogoUrl |
string | schreibgeschützt | Vollqualifizierte öffentliche URL des White-Label-Logos; zum Ändern über den Multipart-Abschnitt whitelabel_logo hochladen |
Multipart bei POST/PATCH: whitelabel_logo (Datei-Abschnitt). GET- / Antwort-Bodies lassen den Dateiinhalt weg - übertragen wird nur die URL.
§ security
| Feld | Typ | Einschränkung | Beschreibung |
|---|---|---|---|
allowedDomains |
string | Kommagetrennte Liste von Domains, die das Widget einbinden dürfen (leer = keine Whitelist) | |
spamFilterEnabled |
boolean | Bot-spezifischen Spam-Filter für eingehende Nachrichten aktivieren | |
countryFilterMode |
string | BLACKLIST oder WHITELIST |
Wie die Länderlisten interpretiert werden. Die Listen selbst bleiben Administratoren vorbehalten |
talkMessagesRateLimit |
int | >= 0; 0 deaktiviert |
Maximale Anzahl an Benutzernachrichten innerhalb des Zeitfensters für das Rate-Limit |
talkMessagesRateLimitDurationSeconds |
int | >= 0 |
Dauer des Zeitfensters für das Rate-Limit (Sekunden) |
talkMessagesRateLimitHitMessage |
string | Nachricht, die dem Besucher angezeigt wird, wenn das Rate-Limit erreicht wurde |
§ voice
| Feld | Typ | Einschränkung | Beschreibung |
|---|---|---|---|
inputEnabled |
boolean | Dem Besucher erlauben, Nachrichten zu diktieren (Speech-to-Text) | |
conversationEnabled |
boolean | erfordert die Sprachfunktion im Plan | Vollständige Sprachunterhaltungen aktivieren |
voiceId |
string | anbieterspezifische Sprach-ID (z. B. alloy) |
Welche synthetische Stimme spricht |
model |
string | z. B. GPT-REALTIME-MINI, GEMINI-LIVE, ELEVENLABS-* |
Sprachmodell. Wird minutengenau abgerechnet, Tarife variieren je nach Modell |
turnDetection |
string | anbieterspezifisch | Modus für den Sprecherwechsel |
audioPrompt |
string | Zusätzlicher System-Prompt, der ausschließlich für Sprachbeiträge verwendet wird | |
welcomeMessage |
string | Gesprochene Begrüßungszeile | |
language |
string | Sprachcode | Primäre Sprache der Sprachausgabe |
additionalLanguages |
string | kommagetrennte Sprachcodes | Zusätzliche Sprachen, die der Sprach-Agent akzeptiert |
maxDurationSeconds |
int | Feste Obergrenze für eine einzelne Sprachunterhaltung | |
maxDurationMessage |
string | Nachricht, die angezeigt wird, wenn die Obergrenze erreicht ist |
§ multilingual
| Feld | Typ | Einschränkung | Beschreibung |
|---|---|---|---|
enabled |
boolean | Umschalter für den mehrsprachigen Modus | |
mode |
string | AUTODETECT oder ein Modus mit fester Liste |
Wie der Bot die Antwortsprache auswählt |
baseLanguage |
string | Sprachcode | Sprache, in der die Texte des Bots selbst verfasst sind |
languages |
string | kommagetrennte Sprachcodes | Dem Besucher angebotene Sprachen |
knowledgeLanguageMode |
string | Wie Wissen in anderen Sprachen behandelt wird | |
knowledgeLanguageFallback |
string | Sprachcode | Ersatzsprache, wenn kein Treffer gefunden wird |
§ advanced
| Feld | Typ | Einschränkung | Beschreibung |
|---|---|---|---|
model |
string | unterliegt Kontolimits; siehe "KI-Textmodelle" oben | LLM-Bezeichner (z. B. 5-MINI) |
temperature |
decimal | 0.0-1.0 |
Sampling-Temperatur (entspricht dem Schieberegler in der UI) |
chatContextSize |
int | ∈ {8000, 16000, 32000}; wird stillschweigend auf Ihr Kontolimit begrenzt |
Token-Fenster für den Chat-Verlauf |
botMessagesLimit |
long | 0 oder ein Vielfaches von 1000 (z. B. 1000, 2000, 10000) |
Maximale Bot-Antworten pro Unterhaltung (0 = unbegrenzt) |
internalLocale |
string | Locale-Code im Format ll_CC |
Locale für Oberflächenbeschriftungen des Widgets (unterscheidet sich von role.language) |
productsViewEnabled |
boolean | Wenn true, werden die Offer Cards (Angebotskarten) für den E-Commerce im Chat angezeigt | |
includeProductsInKnowledgeBase |
boolean | Wenn true, wird der Produktkatalog als Teil der Wissensdatenbank indexiert |
Außerhalb des API-Umfangs
Die Administrationsoberfläche stellt einige Bereiche bereit, die in dieser Version der Management API absichtlich nicht freigegeben sind:
- Flow-Tab (Flow) - der visuelle Flow Editor (Unterhaltungsablauf-Editor für Phasen und Übergänge). Nicht über die Management API zugänglich.
- Actions-Tab (Aktionen) - verwaltete E-Commerce- / Buchungsintegrationen, AI Search und benutzerdefinierte API-Funktionen. Das Aufrufen von Tools war nie Teil der Management API.
- Der Builder für benutzerdefinierte Formulare selbst - das Erstellen und Bearbeiten benutzerdefinierter Formulare ist nicht zugänglich. Sie können jedoch über
leadCollection.customFormIdundhumanSupport.customFormIdein bestehendes Formular an einen Bot anhängen. - Benutzerdefinierte Symbole zum Öffnen / Schließen des Chats -
customLauncherIconVisible,openChatIcon,closeChatIcon. Die API stellt nur die primären Multipart-Abschnitteavatarundwhitelabel_logobereit. - IP- und Länderlisten - die Einträge selbst bleiben Administratoren vorbehalten. Über
security.countryFilterModeist lediglich der Interpretationsmodus zugänglich.
Endpunkte
POST /v1/management/bots
Erstellt einen neuen Bot. Zwei gleichwertige Content-Types werden akzeptiert; wählen Sie den für Sie praktischeren.
Modus A - einfaches JSON (empfohlen, wenn Sie im selben Request keinen Avatar / kein Logo hochladen müssen):
Content-Type: application/json- Request-Body ist das Bot-Konfigurations-JSON (kein
data-Wrapper) - Dateien (Avatar / Logo) können später über einen zweiten
PATCH-Aufruf mit Modus B hochgeladen werden
Modus B - multipart/form-data (verwenden Sie diesen Modus, wenn Dateien im selben Request hochgeladen werden):
Content-Type: multipart/form-data; boundary=...data-JSON-Teil (erforderlich,Content-Type: application/json) - Bot-Konfiguration in der oben beschriebenen verschachtelten Strukturavatar-Dateiteil (optional) - Avatar-Bild des Botswhitelabel_logo-Dateiteil (optional) - White-Label-Logo (gilt nur, wenn Ihr Konto White-Labeling enthält)
Im JSON ist lediglich name erforderlich; alle anderen Felder fallen auf denselben Standardwert zurück, den auch der Einrichtungsassistent der Admin-Benutzeroberfläche festlegen würde.
Vollständiger Request-Body
Dies ist das maximale data-JSON - alle Abschnitte sind ausgefüllt. Senden Sie nur die Abschnitte, die für Sie relevant sind; für alles andere werden die Standardwerte übernommen.
{
"name": "Helpdesk Bot",
"role": {
"rawPrompt": "You are a friendly support assistant for Acme Inc.",
"role": "CUSTOMER_SUPPORT",
"language": "English",
"responseLength": "Normal",
"websiteAddress": "https://acme.com",
"companyDescription": "Acme sells industrial widgets."
},
"conversation": {
"welcomeMessage": "Hi! How can I help today?",
"queryRefinementEnabled": true,
"conversationContinuityEnabled": true,
"conversationRatingEnabled": true,
"positiveRatingTooltip": "Helpful",
"negativeRatingTooltip": "Not helpful",
"suggestedQuestions": "What are your hours?\nHow do I cancel?\nWhere is my order?",
"dynamicSuggestedFollowups": true,
"dynamicFollowupsAutoIcons": true
},
"chatMemory": {
"enabled": true,
"summaryConversationsEnabled": true,
"conversationSummaryPrompt": "Summarize this conversation in 3 sentences.",
"clientSummaryPrompt": "Summarize what we know about this customer.",
"clientSummaryPromptType": "DEFAULT",
"conversationSummaryPromptType": "DEFAULT",
"summariesToKnowledgeRatio": 50
},
"appearance": {
"launcherColor": "#1A73E8",
"headerColor": "#1A73E8",
"titleColor": "#FFFFFF",
"subtitleColor": "#FFFFFF",
"clientMessageBubbleColor": "#000000",
"clientMessageTextColor": "#FFFFFF",
"responseMessageBubbleColor": "#F4F4F4",
"responseMessageTextColor": "#000000",
"chatSubheader": "AI support assistant",
"senderPlaceholder": "Type a message...",
"resetConversationTooltip": "Restart conversation",
"chatAlignment": "right",
"launcherBottomMargin": 20,
"launcherSideMargin": 20,
"displayShadow": true,
"customCss": ".rcw-conversation-container { border-radius: 16px; }",
"chatMessageLinkTarget": "_blank",
"minimizedDisplayMode": "icon",
"chatDesktopWidthPx": 400,
"chatDesktopHeightPx": 600,
"chatMobileSizePercent": 100,
"messageFontSize": 14,
"showChatbotBubblesDesktop": true,
"showChatbotBubblesMobile": false,
"chatbotBubblesDelaySeconds": 5,
"welcomeScreenEnabled": false,
"welcomeScreenQuestionsLabel": "Quick start",
"welcomeScreenHideHumanContactForm": false,
"welcomeScreenHideLiveChat": false,
"headerActionsLayout": "DROPDOWN",
"stackSuggestedQuestions": false,
"suggestedQuestionsFontSize": 14,
"suggestedQuestionsTextColor": "#000000",
"suggestedQuestionsBackgroundColor": "#F4F4F4",
"autoOpenChat": false,
"autoOpenChatOnMobiles": false,
"autoOpenChatDelay": false,
"autoOpenChatDelaySeconds": 5,
"simulateHumanTyping": true,
"simulateHumanTypingDelay": 5,
"footerMarkdown": "Powered by Acme"
},
"humanSupport": {
"enabled": true,
"email": "support@acme.com",
"dialogMessage": "Leave us a message and we will get back to you.",
"thankYouMessage": "Thanks - we received your message.",
"emailMessageSubjectTemplate": "[Acme support] New message from {customerName}",
"emailMessageContentTemplate": "{message}\n\n - \n{conversationTranscript}",
"emailPlaceholder": "your@email.com",
"messagePlaceholder": "How can we help?",
"emailWithConversationContent": true
},
"leadCollection": {
"enabled": true,
"nameEnabled": true,
"nameLabel": "Your name",
"emailEnabled": true,
"emailLabel": "Email",
"phoneEnabled": false,
"phoneLabel": "Phone",
"leaveDetailsMessage": "Please leave your details and we will get in touch.",
"thankYouMessage": "Thanks - we will be in touch shortly.",
"requireBeforeNewConversation": false,
"emailNotificationEnabled": true,
"emailNotificationAddress": "leads@acme.com",
"emailWithConversationContent": true
},
"liveChat": {
"enabled": false,
"infoMessage": "Connecting you with a human agent...",
"startMessage": "You are now chatting with our team.",
"endMessage": "Live chat has ended.",
"nameLabel": "Your name",
"emailLabel": "Email",
"schedule": "{\"monday\":{\"enabled\":true,\"from\":\"9:00\",\"to\":\"17:00\"},\"tuesday\":{\"enabled\":true,\"from\":\"9:00\",\"to\":\"17:00\"},\"wednesday\":{\"enabled\":true,\"from\":\"9:00\",\"to\":\"17:00\"},\"thursday\":{\"enabled\":true,\"from\":\"9:00\",\"to\":\"17:00\"},\"friday\":{\"enabled\":true,\"from\":\"9:00\",\"to\":\"17:00\"},\"saturday\":{\"enabled\":false,\"from\":\"9:00\",\"to\":\"17:00\"},\"sunday\":{\"enabled\":false,\"from\":\"9:00\",\"to\":\"17:00\"},\"timezone\":\"Europe/Warsaw\"}",
"outOfHoursMessage": "We are currently offline.",
"closeModalMessage": "End the live chat session?",
"closeModalConfirmLabel": "Yes, end",
"closeModalCancelLabel": "Cancel",
"closeModalTooltipText": "End live chat",
"operatorHasJoinedLabel": "An agent has joined.",
"operatorDidNotJoinInTimeLabel": "No agent available right now.",
"waitingForOperatorToJoinLabel": "Waiting for an agent...",
"waitingForOperatorSeconds": 60,
"redirectToHumanSupportForm": true
},
"consent": {
"newConversationRequirePolicyAccept": false,
"humanSupportRequirePolicyAccept": false,
"leadCollectionRequirePolicyAccept": true,
"liveChatRequirePolicyAccept": false,
"newConversationConsentDescription": "By starting a conversation you agree to our terms.",
"privacyPolicyConsentCheckboxLabel": "I have read and accepted the privacy policy."
},
"whiteLabel": {
"hideRoboAssistLogo": false,
"whitelabelLogoLink": "https://acme.com",
"assignToCustomDomain": false
},
"security": {
"allowedDomains": "acme.com,support.acme.com",
"spamFilterEnabled": true,
"talkMessagesRateLimit": 30,
"talkMessagesRateLimitDurationSeconds": 60,
"talkMessagesRateLimitHitMessage": "Please slow down."
},
"advanced": {
"model": "5-MINI",
"temperature": 0.4,
"chatContextSize": 16000,
"botMessagesLimit": 1000,
"internalLocale": "en_US",
"productsViewEnabled": false
}
}
Validierungsregeln mit eigenen Fehlermeldungen:
name- erforderlich, maximal 150 Zeichenadvanced.temperature- zwischen0.0und1.0chatMemory.summariesToKnowledgeRatio- Ganzzahl zwischen10und90(Prozent, Schrittweite10)appearance.launcherBottomMargin,appearance.launcherSideMargin- zwischen0und500appearance.footerMarkdown- maximal 255 ZeichenhumanSupport.enabled=trueerfordert, dasshumanSupport.emailgesetzt istleadCollection.enabled=trueerfordert, dass mindestensleadCollection.emailEnabledoderleadCollection.phoneEnabledauftruegesetzt ist; der jeweils aktive Kanal erfordert zudem seine Beschriftung sowieleaveDetailsMessageundthankYouMessage- Gedeckelte Felder (
advanced.chatContextSize,advanced.botMessagesLimitusw.) werden stillschweigend auf Ihre Kontolimits begrenzt
Felder, deren Wert auf dem Server null ist, werden im JSON-Body weggelassen - übertragen werden nur Felder mit Nicht-Null-Werten.
Vollständiger Response-Body (201)
Gleiche Struktur wie der Request, zuzüglich des schreibgeschützten meta-Blocks und des einmaligen apiKey auf oberster Ebene. Schreibgeschützte Datei-URLs (appearance.avatarUrl, whiteLabel.whitelabelLogoUrl) werden vom Server befüllt, wenn die entsprechenden Multipart-Teile hochgeladen wurden.
{
"name": "Helpdesk Bot",
"role": {
"rawPrompt": "You are a friendly support assistant for Acme Inc.",
"role": "CUSTOMER_SUPPORT",
"language": "English",
"responseLength": "Normal",
"websiteAddress": "https://acme.com",
"companyDescription": "Acme sells industrial widgets."
},
"conversation": {
"welcomeMessage": "Hi! How can I help today?",
"queryRefinementEnabled": true,
"conversationContinuityEnabled": true,
"conversationRatingEnabled": true,
"positiveRatingTooltip": "Helpful",
"negativeRatingTooltip": "Not helpful",
"suggestedQuestions": "What are your hours?\nHow do I cancel?\nWhere is my order?",
"dynamicSuggestedFollowups": true,
"dynamicFollowupsAutoIcons": true
},
"chatMemory": {
"enabled": true,
"summaryConversationsEnabled": true,
"conversationSummaryPrompt": "Summarize this conversation in 3 sentences.",
"clientSummaryPrompt": "Summarize what we know about this customer.",
"clientSummaryPromptType": "DEFAULT",
"conversationSummaryPromptType": "DEFAULT",
"summariesToKnowledgeRatio": 50
},
"appearance": {
"launcherColor": "#1A73E8",
"headerColor": "#1A73E8",
"titleColor": "#FFFFFF",
"subtitleColor": "#FFFFFF",
"clientMessageBubbleColor": "#000000",
"clientMessageTextColor": "#FFFFFF",
"responseMessageBubbleColor": "#F4F4F4",
"responseMessageTextColor": "#000000",
"chatSubheader": "AI support assistant",
"senderPlaceholder": "Type a message...",
"resetConversationTooltip": "Restart conversation",
"chatAlignment": "right",
"launcherBottomMargin": 20,
"launcherSideMargin": 20,
"displayShadow": true,
"customCss": ".rcw-conversation-container { border-radius: 16px; }",
"chatMessageLinkTarget": "_blank",
"minimizedDisplayMode": "icon",
"chatDesktopWidthPx": 400,
"chatDesktopHeightPx": 600,
"chatMobileSizePercent": 100,
"messageFontSize": 14,
"showChatbotBubblesDesktop": true,
"showChatbotBubblesMobile": false,
"chatbotBubblesDelaySeconds": 5,
"welcomeScreenEnabled": false,
"welcomeScreenQuestionsLabel": "Quick start",
"welcomeScreenHideHumanContactForm": false,
"welcomeScreenHideLiveChat": false,
"headerActionsLayout": "DROPDOWN",
"stackSuggestedQuestions": false,
"suggestedQuestionsFontSize": 14,
"suggestedQuestionsTextColor": "#000000",
"suggestedQuestionsBackgroundColor": "#F4F4F4",
"autoOpenChat": false,
"autoOpenChatOnMobiles": false,
"autoOpenChatDelay": false,
"autoOpenChatDelaySeconds": 5,
"simulateHumanTyping": true,
"simulateHumanTypingDelay": 5,
"footerMarkdown": "Powered by Acme",
"avatarUrl": "https://api.chatlab.com/aichat/content/avatar_a8f3b2c1_2026060110.png"
},
"humanSupport": {
"enabled": true,
"email": "support@acme.com",
"dialogMessage": "Leave us a message and we will get back to you.",
"thankYouMessage": "Thanks - we received your message.",
"emailMessageSubjectTemplate": "[Acme support] New message from {customerName}",
"emailMessageContentTemplate": "{message}\n\n - \n{conversationTranscript}",
"emailPlaceholder": "your@email.com",
"messagePlaceholder": "How can we help?",
"emailWithConversationContent": true
},
"leadCollection": {
"enabled": true,
"nameEnabled": true,
"nameLabel": "Your name",
"emailEnabled": true,
"emailLabel": "Email",
"phoneEnabled": false,
"phoneLabel": "Phone",
"leaveDetailsMessage": "Please leave your details and we will get in touch.",
"thankYouMessage": "Thanks - we will be in touch shortly.",
"requireBeforeNewConversation": false,
"emailNotificationEnabled": true,
"emailNotificationAddress": "leads@acme.com",
"emailWithConversationContent": true
},
"liveChat": {
"enabled": false,
"infoMessage": "Connecting you with a human agent...",
"startMessage": "You are now chatting with our team.",
"endMessage": "Live chat has ended.",
"nameLabel": "Your name",
"emailLabel": "Email",
"schedule": "{\"monday\":{\"enabled\":true,\"from\":\"9:00\",\"to\":\"17:00\"},\"tuesday\":{\"enabled\":true,\"from\":\"9:00\",\"to\":\"17:00\"},\"wednesday\":{\"enabled\":true,\"from\":\"9:00\",\"to\":\"17:00\"},\"thursday\":{\"enabled\":true,\"from\":\"9:00\",\"to\":\"17:00\"},\"friday\":{\"enabled\":true,\"from\":\"9:00\",\"to\":\"17:00\"},\"saturday\":{\"enabled\":false,\"from\":\"9:00\",\"to\":\"17:00\"},\"sunday\":{\"enabled\":false,\"from\":\"9:00\",\"to\":\"17:00\"},\"timezone\":\"Europe/Warsaw\"}",
"outOfHoursMessage": "We are currently offline.",
"closeModalMessage": "End the live chat session?",
"closeModalConfirmLabel": "Yes, end",
"closeModalCancelLabel": "Cancel",
"closeModalTooltipText": "End live chat",
"operatorHasJoinedLabel": "An agent has joined.",
"operatorDidNotJoinInTimeLabel": "No agent available right now.",
"waitingForOperatorToJoinLabel": "Waiting for an agent...",
"waitingForOperatorSeconds": 60,
"redirectToHumanSupportForm": true
},
"consent": {
"newConversationRequirePolicyAccept": false,
"humanSupportRequirePolicyAccept": false,
"leadCollectionRequirePolicyAccept": true,
"liveChatRequirePolicyAccept": false,
"newConversationConsentDescription": "By starting a conversation you agree to our terms.",
"privacyPolicyConsentCheckboxLabel": "I have read and accepted the privacy policy."
},
"whiteLabel": {
"hideRoboAssistLogo": false,
"whitelabelLogoLink": "https://acme.com",
"assignToCustomDomain": false,
"whitelabelLogoUrl": "https://api.chatlab.com/aichat/content/custom_logo_4287_2026060110.png"
},
"security": {
"allowedDomains": "acme.com,support.acme.com",
"spamFilterEnabled": true,
"talkMessagesRateLimit": 30,
"talkMessagesRateLimitDurationSeconds": 60,
"talkMessagesRateLimitHitMessage": "Please slow down."
},
"advanced": {
"model": "5-MINI",
"temperature": 0.4,
"chatContextSize": 16000,
"botMessagesLimit": 1000,
"internalLocale": "en_US",
"productsViewEnabled": false
},
"meta": {
"id": 4287,
"createdAt": "2026-06-01T10:11:02Z",
"updatedAt": "2026-06-01T10:11:02Z"
},
"apiKey": "ck_freshly_minted_bot_talk_key_here"
}
Das Feld apiKey erscheint nur bei der Erstellung - es ist der neu generierte Bot Talk-Schlüssel, der an den neuen Bot gebunden ist. Der Klartext wird nur einmal angezeigt und kann später nicht mehr über die API abgerufen werden; speichern Sie ihn umgehend auf Ihrer Seite.
Der Location-Response-Header enthält die URL des neuen Bots (/v1/management/bots/{id}).
Curl-Beispiele
Modus A - einfaches JSON (am einfachsten):
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!"}}'
Modus B - multipart mit Avatar:
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}
Gibt die aktuelle Konfiguration eines Bots zurück, der Ihnen gehört.
Curl-Beispiel
curl https://api.chatlab.com/aichat/v1/management/bots/4287 \
-H "Authorization: Bearer mk_..."
Vollständiger Response-Body (200)
Gleiche Struktur wie die POST-Antwort, abzüglich des einmaligen apiKey. Der meta-Block ist enthalten. Gibt 404 not_found_error zurück, wenn der Bot nicht existiert oder nicht zu Ihrem Konto gehört.
Der aktuelle Avatar und das White-Label-Logo werden als vollqualifizierte, schreibgeschützte URLs bereitgestellt (appearance.avatarUrl, whiteLabel.whitelabelLogoUrl) - ausgehend von demselben Schema + Host + Kontextpfad, über den diese Anfrage bedient wurde. Rufen Sie die Bytes ab, indem Sie diese URLs direkt per GET anfragen; um eine der beiden Dateien zu ersetzen, laden Sie über den multipart-Teil avatar / whitelabel_logo bei einem PATCH-Aufruf eine neue Datei hoch. Diese URL-Felder werden ignoriert, wenn sie in einem Request-Body übermittelt werden.
{
"name": "Helpdesk Bot",
"role": {
"rawPrompt": "You are a friendly support assistant for Acme Inc.",
"role": "CUSTOMER_SUPPORT",
"language": "English",
"responseLength": "Normal",
"websiteAddress": "https://acme.com",
"companyDescription": "Acme sells industrial widgets."
},
"conversation": {
"welcomeMessage": "Hi! How can I help today?",
"queryRefinementEnabled": true,
"conversationContinuityEnabled": true,
"conversationRatingEnabled": true,
"positiveRatingTooltip": "Helpful",
"negativeRatingTooltip": "Not helpful",
"suggestedQuestions": "What are your hours?\nHow do I cancel?\nWhere is my order?",
"dynamicSuggestedFollowups": true,
"dynamicFollowupsAutoIcons": true
},
"chatMemory": {
"enabled": true,
"summaryConversationsEnabled": true,
"conversationSummaryPrompt": "Summarize this conversation in 3 sentences.",
"clientSummaryPrompt": "Summarize what we know about this customer.",
"clientSummaryPromptType": "DEFAULT",
"conversationSummaryPromptType": "DEFAULT",
"summariesToKnowledgeRatio": 50
},
"appearance": {
"launcherColor": "#1A73E8",
"headerColor": "#1A73E8",
"titleColor": "#FFFFFF",
"subtitleColor": "#FFFFFF",
"clientMessageBubbleColor": "#000000",
"clientMessageTextColor": "#FFFFFF",
"responseMessageBubbleColor": "#F4F4F4",
"responseMessageTextColor": "#000000",
"chatSubheader": "AI support assistant",
"senderPlaceholder": "Type a message...",
"resetConversationTooltip": "Restart conversation",
"chatAlignment": "right",
"launcherBottomMargin": 20,
"launcherSideMargin": 20,
"displayShadow": true,
"customCss": ".rcw-conversation-container { border-radius: 16px; }",
"chatMessageLinkTarget": "_blank",
"minimizedDisplayMode": "icon",
"chatDesktopWidthPx": 400,
"chatDesktopHeightPx": 600,
"chatMobileSizePercent": 100,
"messageFontSize": 14,
"showChatbotBubblesDesktop": true,
"showChatbotBubblesMobile": false,
"chatbotBubblesDelaySeconds": 5,
"welcomeScreenEnabled": false,
"welcomeScreenQuestionsLabel": "Quick start",
"welcomeScreenHideHumanContactForm": false,
"welcomeScreenHideLiveChat": false,
"headerActionsLayout": "DROPDOWN",
"stackSuggestedQuestions": false,
"suggestedQuestionsFontSize": 14,
"suggestedQuestionsTextColor": "#000000",
"suggestedQuestionsBackgroundColor": "#F4F4F4",
"autoOpenChat": false,
"autoOpenChatOnMobiles": false,
"autoOpenChatDelay": false,
"autoOpenChatDelaySeconds": 5,
"simulateHumanTyping": true,
"simulateHumanTypingDelay": 5,
"footerMarkdown": "Powered by Acme",
"avatarUrl": "https://api.chatlab.com/aichat/content/avatar_a8f3b2c1_2026060110.png"
},
"humanSupport": {
"enabled": true,
"email": "support@acme.com",
"dialogMessage": "Leave us a message and we will get back to you.",
"thankYouMessage": "Thanks - we received your message.",
"emailMessageSubjectTemplate": "[Acme support] New message from {customerName}",
"emailMessageContentTemplate": "{message}\n\n - \n{conversationTranscript}",
"emailPlaceholder": "your@email.com",
"messagePlaceholder": "How can we help?",
"emailWithConversationContent": true
},
"leadCollection": {
"enabled": true,
"nameEnabled": true,
"nameLabel": "Your name",
"emailEnabled": true,
"emailLabel": "Email",
"phoneEnabled": false,
"phoneLabel": "Phone",
"leaveDetailsMessage": "Please leave your details and we will get in touch.",
"thankYouMessage": "Thanks - we will be in touch shortly.",
"requireBeforeNewConversation": false,
"emailNotificationEnabled": true,
"emailNotificationAddress": "leads@acme.com",
"emailWithConversationContent": true
},
"liveChat": {
"enabled": false,
"infoMessage": "Connecting you with a human agent...",
"startMessage": "You are now chatting with our team.",
"endMessage": "Live chat has ended.",
"nameLabel": "Your name",
"emailLabel": "Email",
"schedule": "{\"monday\":{\"enabled\":true,\"from\":\"9:00\",\"to\":\"17:00\"},\"tuesday\":{\"enabled\":true,\"from\":\"9:00\",\"to\":\"17:00\"},\"wednesday\":{\"enabled\":true,\"from\":\"9:00\",\"to\":\"17:00\"},\"thursday\":{\"enabled\":true,\"from\":\"9:00\",\"to\":\"17:00\"},\"friday\":{\"enabled\":true,\"from\":\"9:00\",\"to\":\"17:00\"},\"saturday\":{\"enabled\":false,\"from\":\"9:00\",\"to\":\"17:00\"},\"sunday\":{\"enabled\":false,\"from\":\"9:00\",\"to\":\"17:00\"},\"timezone\":\"Europe/Warsaw\"}",
"outOfHoursMessage": "We are currently offline.",
"closeModalMessage": "End the live chat session?",
"closeModalConfirmLabel": "Yes, end",
"closeModalCancelLabel": "Cancel",
"closeModalTooltipText": "End live chat",
"operatorHasJoinedLabel": "An agent has joined.",
"operatorDidNotJoinInTimeLabel": "No agent available right now.",
"waitingForOperatorToJoinLabel": "Waiting for an agent...",
"waitingForOperatorSeconds": 60,
"redirectToHumanSupportForm": true
},
"consent": {
"newConversationRequirePolicyAccept": false,
"humanSupportRequirePolicyAccept": false,
"leadCollectionRequirePolicyAccept": true,
"liveChatRequirePolicyAccept": false,
"newConversationConsentDescription": "By starting a conversation you agree to our terms.",
"privacyPolicyConsentCheckboxLabel": "I have read and accepted the privacy policy."
},
"whiteLabel": {
"hideRoboAssistLogo": false,
"whitelabelLogoLink": "https://acme.com",
"assignToCustomDomain": false,
"whitelabelLogoUrl": "https://api.chatlab.com/aichat/content/custom_logo_4287_2026060110.png"
},
"security": {
"allowedDomains": "acme.com,support.acme.com",
"spamFilterEnabled": true,
"talkMessagesRateLimit": 30,
"talkMessagesRateLimitDurationSeconds": 60,
"talkMessagesRateLimitHitMessage": "Please slow down."
},
"advanced": {
"model": "5-MINI",
"temperature": 0.4,
"chatContextSize": 16000,
"botMessagesLimit": 1000,
"internalLocale": "en_US",
"productsViewEnabled": false
},
"meta": {
"id": 4287,
"createdAt": "2026-06-01T10:11:02Z",
"updatedAt": "2026-06-01T11:02:19Z"
}
}
Einen Bot klonen
Der Request-Body von POST /v1/management/bots und der Response-Body von GET /v1/management/bots/{bot_id} haben dieselbe Struktur. Das Klonen ist daher ein dreistufiger Prozess: Den Quell-Bot per GET abrufen, serververwaltete Identitätsfelder entfernen und das Ergebnis per POST senden.
1. Den Quell-Bot per GET abrufen.
curl https://api.chatlab.com/aichat/v1/management/bots/4287 \
-H "Authorization: Bearer mk_..." \
-o source-bot.json
2. Den übergeordneten meta-Block entfernen. Das meta-Objekt (id, createdAt, updatedAt) wird vom Server verwaltet und ist schreibgeschützt - es im POST-Body zu belassen schadet nicht (der Server ignoriert es), aber das Entfernen stellt die Absicht klar heraus und hält die Payload sauber. Optional können Sie name bearbeiten, damit sich der Klon vom Quell-Bot unterscheidet.
jq 'del(.meta) | .name = "Helpdesk Bot (clone)"' source-bot.json > clone-body.json
3. Den bereinigten Body per POST senden, um den Klon zu erstellen. Die vollständige Struktur des Bodys und die Validierungsregeln finden Sie oben in der Referenz zu 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
Die Antwort enthält die meta.id des neuen Bots sowie einen neu generierten apiKey (den Bot Talk-Schlüssel für den Klon). Der Klartext des apiKey wird nur bei dieser Erstellungsantwort zurückgegeben - kopieren Sie ihn, bevor Sie den Response-Body verwerfen; er kann später nicht mehr abgerufen werden.
Zwei wichtige Hinweise:
- Dateien werden nicht geklont.
appearance.avatarUrlundwhiteLabel.whitelabelLogoUrlsind schreibgeschützt und verweisen auf die Dateien des Quell-Bots. Wenn Sie denselben Avatar oder dasselbe White Label-Logo für den Klon benötigen, laden Sie die Bytes von den Quell-URLs herunter und laden Sie sie als mehrteiligeavatar- /whitelabel_logo-Parts hoch - entweder beim Erstellungs-POST (Modus B) oder über einen nachfolgenden PATCH. - Bot Talk-Schlüssel werden nicht geklont. Jeder Bot verfügt über seinen eigenen Pool an Bot Talk-Schlüsseln. Der einzelne
apiKey, der vom Erstellungs-POST zurückgegeben wird, ist der einzige, der automatisch generiert wird; erstellen Sie bei Bedarf zusätzliche Schlüssel im API-Tab des Bots.
PATCH /v1/management/bots/{bot_id}
Aktualisieren Sie ein oder mehrere Felder eines Bots, der Ihnen gehört. Es werden nur Abschnitte / Felder geändert, die im JSON vorhanden sind; alles Ausgelassene (oder als null Gesendete) bleibt unberührt. Innerhalb eines gesendeten Abschnitts gelten die Regeln für partielle Aktualisierungen pro Feld.
Es werden zwei gleichwertige Content-Types akzeptiert (wie bei POST):
Modus A - einfaches JSON (empfohlen, wenn nur Einstellungen aktualisiert werden):
Content-Type: application/json- Request-Body ist das Patch-JSON (kein
data-Wrapper)
Modus B - multipart/form-data (verwenden Sie dies beim Hochladen von Dateien):
data-JSON-Part (optional) - der Patch. Nur senden, wenn Sie Felder ändern möchten. Ganz weglassen, wenn Sie nur einen Avatar oder ein Logo hochladen möchten.avatar-Datei-Part (optional) - ersetzt den Avatarwhitelabel_logo-Datei-Part (optional) - ersetzt das White Label-Logo (gilt nur, wenn Ihr Konto White Labeling umfasst)
Alle drei Parts sind bei PATCH optional, aber mindestens einer muss vorhanden sein, damit der Aufruf sinnvoll ist.
Vollständiger Request-Body (maximale Struktur)
Jedes von POST /v1/management/bots akzeptierte Feld kann auch hier gesendet werden. Das folgende Beispiel zeigt die vollständige Struktur; in der Praxis senden Sie nur die Schlüssel, die Sie ändern möchten (siehe "Minimales partielles Update" weiter unten) - jeder ausgelassene (oder als null gesendete) Schlüssel lässt den gespeicherten Wert unberührt.
{
"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
}
}
Minimales partielles Update
Aktualisieren Sie ein einzelnes Feld per PATCH, indem Sie genau die Schlüssel senden, die Sie ändern möchten - alles andere bleibt erhalten.
{
"appearance": {
"launcherColor": "#abcdef"
}
}
Curl-Beispiele
Modus A - einfaches JSON (am einfachsten):
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"}}'
Modus B - Multipart (beim Ersetzen von Avatar / 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'
Modus B - nur den Avatar ersetzen (keine Feldänderungen):
curl -X PATCH https://api.chatlab.com/aichat/v1/management/bots/4287 \
-H "Authorization: Bearer mk_..." \
-F 'avatar=@./new-avatar.png'
Response-Body (200)
Gleiche Struktur wie bei GET /v1/management/bots/{bot_id} - die vollständige Konfiguration des Bots nach Anwendung des Patches, einschließlich des meta-Blocks. Kein apiKey-Feld. Gibt 404 not_found_error zurück, wenn der Bot nicht existiert oder nicht zu Ihrem Konto gehört.
Das folgende Beispiel zeigt die Antwort nach Anwendung des obigen Patches Vollständiger Request-Body (maximale Struktur) auf den Bot aus dem GET-Beispiel - geänderte Felder spiegeln die neuen Werte wider, unberührte Felder bleiben erhalten und meta.updatedAt wird aktualisiert.
{
"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
Liest die aktuelle Abonnement-Nutzung für das Konto aus, dem der Management-Schlüssel gehört.
Response-Body (200)
{
"subscriptionType": "standard",
"messages": {"used": 4123, "limit": 11000, "remaining": 6877},
"bots": {"used": 3, "limit": 5, "remaining": 2}
}
subscriptionTypeist eine in Kleinbuchstaben gehaltene Kennung des aktuellen Plans des Kontos (z. B.standardim Beispiel). Tarife stammen aus einem dynamischen Katalog, sodass sich die genaue Gruppe von Kennungen im Laufe der Zeit ändern kann, wenn Tarife umbenannt oder hinzugefügt werden - behandeln Sie dies als intransparenten String und nicht als festes Enum.messages.used/limit/remainingsind die Nachrichten-Credits des aktuellen Abrechnungszeitraums.bots.used/limit/remainingzählen aktive Bots im Verhältnis zum Bot-Limit Ihres Kontos.
Rate-Limit-Header
Antworten, die die Rate-Limit-Stufe erreichen (d. h. Authentifizierung und IP-Whitelist wurden erfolgreich durchlaufen), enthalten Folgendes:
X-RateLimit-Limit: 10
X-RateLimit-Remaining: 7
X-RateLimit-Reset: 1715430000
X-RateLimit-Limit- das für diesen Aufruf tatsächlich angewendete Limit pro Schlüssel (standardmäßig 10 oder Ihr konfigurierter Wert fürrateLimitPerMinute, falls dieser niedriger ist).X-RateLimit-Remaining- verbleibende Token im Bucket direkt nach diesem Aufruf.X-RateLimit-Reset- Unix-Epochensekunden, zu denen das nächste Token verfügbar wird (kein vollständiger Bucket-Reset; der Bucket füllt sich kontinuierlich wieder auf). Wenn der Bucket voll ist, entspricht dies der aktuellen Zeit.
Bei 429 rate_limit_exceeded-Antworten wird zusätzlich Retry-After gesetzt, angegeben in ganzen Sekunden, bis mindestens ein Token wieder frei wird.
Fehler vor der Authentifizierung (401 missing_api_key, 401 invalid_api_key, 403 ip_blocked) und 403 ip_not_whitelisted enthalten keine X-RateLimit-*-Header - der Limiter wird erst konsultiert, nachdem die Authentifizierung und die IP-Prüfungen erfolgreich abgeschlossen wurden.
Fehlerformat
Dieselbe Hülle wie bei der Bot Talk API:
{
"error": {
"type": "permission_error",
"code": "key_type_not_allowed",
"message": "This endpoint requires a MANAGEMENT API key.",
"param": null
}
}
Validierungsfehler verwenden code: "invalid_parameter" und stellen den fehlerhaften Feldpfad vor die Nachricht, damit der betroffene Abschnitt leicht zu erkennen ist:
{
"error": {
"type": "invalid_request_error",
"code": "invalid_parameter",
"message": "humanSupport.email Human support email is required when humanSupport.enabled=true"
}
}
Ungültige Werte für Enum- / geschlossene Wertebereichs-Felder (z. B. chatMemory.clientSummaryPromptType = "BOGUS") enthalten den Feldpfad, den abgelehnten Wert und die Liste der zulässigen Werte:
{
"error": {
"type": "invalid_request_error",
"code": "invalid_parameter",
"message": "chatMemory.clientSummaryPromptType 'BOGUS' is not a valid value. Allowed: CUSTOM, DEFAULT"
}
}
Verwandte Themen
Informationen zu Konversations-Endpunkten und SSE-Streaming finden Sie unter Bot Talk API.