Panoramica della Management API
La Management API serve per le operazioni di back-office che non comportano l'invio di messaggi di chat:
- creare un bot a livello di programmazione con
POST /v1/management/bots - leggere un bot specifico di tua proprietà con
GET /v1/management/bots/{bot_id} - aggiornare un bot specifico con
PATCH /v1/management/bots/{bot_id} - leggere l'utilizzo dell'abbonamento con
GET /v1/usage
Le chiavi di gestione sono associate al tuo account, non a un bot specifico. Vengono tenute deliberatamente separate dalle chiavi Bot Talk, in modo che una chiave di chat compromessa non possa modificare i tuoi bot né leggere i tuoi dati di fatturazione.
URL di base
https://api.chatlab.com/aichat
Tutti gli endpoint presentati in questo articolo sono relativi a questo URL di base.
Primi passi
- Apri l'app di amministrazione e vai su Account Settings > Management API (Impostazioni account > Management API).
- Fai clic su Create Management Key (Crea chiave di gestione), assegna un nome, imposta facoltativamente la whitelist degli IP e il limite di frequenza, quindi conferma.
- Seleziona solo le autorizzazioni necessarie per la tua integrazione e copia la chiave completa dalla finestra modale di conferma. Il testo in chiaro viene mostrato una sola volta.
- Salvala sul tuo server, non nel codice del browser o in un repository pubblico. Effettua una richiesta di sola lettura come
GET /v1/usagecon l'autorizzazioneusageper verificare l'accesso. - Revoca le chiavi inutilizzate o compromesse dalla pagina Management API.
Una chiave si presenta nel formato mk_abcdefghijklmnopqrstuvwxyz012345. Il prefisso mk_ la distingue dalle chiavi Bot Talk (ck_).
Autenticazione
Authorization: Bearer mk_abcdefghijklmnopqrstuvwxyz012345
L'invio di una chiave mk_ a /v1/chat (o a qualsiasi altro endpoint di Bot Talk) restituisce 403 key_type_not_allowed. L'invio di una chiave ck_ a /v1/management/* restituisce lo stesso errore.
Limiti
- Massimo 5 chiavi Management API attive per utente
- Massimo 10 richieste al minuto per chiave (token bucket, capacità 10, ricarica progressiva di circa 1 token ogni 6 secondi). Configurabile al ribasso al momento della creazione: impostando un valore
rateLimitPerMinuteinferiore, il limite massimo diminuisce e la frequenza di ricarica si adatta di conseguenza.
Autorizzazioni
Ogni chiave di gestione include un sottoinsieme delle tre autorizzazioni seguenti. Al momento della creazione è necessario selezionarne almeno una; in caso contrario, la richiesta viene rifiutata con 400 invalid_request_error. La chiamata a un endpoint con una chiave priva dell'autorizzazione richiesta restituisce 403 insufficient_permissions.
bot_read- richiesta perGET /v1/management/bots/{bot_id}bot_management- richiesta perPOST /v1/management/botsePATCH /v1/management/bots/{bot_id}usage- richiesta perGET /v1/usage
Struttura del body: sezioni nidificate che riflettono le schede dell'interfaccia di amministrazione
POST e PATCH accettano un body JSON suddiviso in 13 sezioni. Ciascuna sezione corrisponde a una scheda secondaria nella barra laterale Bot Settings dell'app di amministrazione, in modo che le chiavi JSON e le schede visibili coincidano: modificando consent.humanSupportRequirePolicyAccept tramite l'API, vedrai attivarsi lo stesso interruttore nella scheda Consent & Privacy (Consenso e privacy) dell'app di amministrazione.
role- persona del bot, prompt non elaborato, lunghezza della risposta, lingua, contesto del sito web / dell'azienda (scheda Role & Behavior [Ruolo e comportamento])conversation- messaggio di benvenuto, perfezionamento delle query, continuità della conversazione, selettore di valutazione + tooltip, contenuto delle domande suggerite + follow-up dinamici (scheda Chat Conversation [Conversazione in chat])chatMemory- selettore della memoria della chat, prompt di riepilogo, allocazione del contesto (scheda Summaries & Memory [Riepiloghi e memoria])appearance- colori, testi, dimensioni, CSS personalizzato, schermata di benvenuto, stile delle domande suggerite, comportamento di apertura automatica, simulazione della digitazione umana, markdown del piè di pagina (scheda Appearance [Aspetto])humanSupport- modulo di contatto umano (scheda Human Contact Form [Modulo di contatto umano])leadCollection- modulo di acquisizione lead (scheda Lead Collection [Raccolta lead])liveChat- passaggio alla chat dal vivo (scheda Live Chat)consent- tutti e quattro i selettori di consenso dell'informativa sulla privacy oltre al testo della schermata di consenso (scheda Consent & Privacy)whiteLabel- opzione per nascondere il logo, link al logo personalizzato, hosting su dominio personalizzato (scheda Whitelabel [White Label])security- domini consentiti, filtro antispam, limiti di frequenza per le conversazioni (scheda Security [Sicurezza])voice- input vocale e conversazioni vocali: modello, voce, lingue, prompt, durata massima (scheda Voice Conversation [Conversazione vocale])multilingual- modalità multilingue, lingua di base, lingue offerte, gestione della lingua della conoscenza (scheda Languages [Lingue])advanced- modello LLM, temperatura, dimensione del contesto, limite dei messaggi del bot, impostazioni internazionali interne, Offer Cards (scheda Model & Advanced [Modello e avanzate])
Tra le impostazioni modificabili, solo name si trova al livello principale, poiché identifica il bot anziché appartenere a una singola scheda.
La barra laterale Bot Settings include attualmente 16 schede secondarie, e 13 di queste corrispondono alle sezioni indicate sopra. Le tre schede secondarie senza una sezione corrispondente sono Flow, Actions e Forms, tutte e tre trattate nella sezione "Fuori dall'ambito dell'API" più avanti. Le 13 associate sono Appearance, Chat Conversation, Role & Behavior, Human Contact Form, Lead Collection, Live Chat, Whitelabel, Consent & Privacy, Security, Model & Advanced, Summaries & Memory, Voice Conversation e Languages.
Il body della richiesta e il body della risposta condividono la stessa struttura. La risposta aggiunge due elementi supplementari:
meta- di sola lettura: ID del bot e timestamp. Rimuovilo per trasformare una risposta GET in un body POST valido.apiKey- presente solo al momento della creazione: la nuova chiave Bot Talk API generata per il nuovo bot.
Due campi all'interno della struttura condivisa sono di sola lettura: vengono restituiti nella risposta ma vengono ignorati se si tenta di inviarli con POST/PATCH:
appearance.avatarUrl- URL pubblico completo dell'immagine dell'avatar del bot (ad es.https://api.chatlab.com/aichat/content/avatar_xyz.png). Effettua una richiesta GET diretta per scaricare i byte. Per modificarlo, carica un nuovo file tramite la parte multipartavatar(vedi PATCH).whiteLabel.whitelabelLogoUrl- URL pubblico completo del logo di intestazione in white-label. Segue lo stesso schema diavatarUrl. Per modificarlo, carica un nuovo file tramite la parte multipartwhitelabel_logo(vedi PATCH).
Entrambi gli URL utilizzano lo schema + host + percorso di contesto della richiesta corrente; pertanto, su un dominio personalizzato white-label, vengono restituiti con la radice su quel dominio (ad es. https://api.acme.com/aichat/content/...).
Invia null per una sezione per saltarla in PATCH; invia null per un campo all'interno di una sezione per saltare quel singolo campo. Il valore null a livello di campo non cancella mai un valore memorizzato: significa solo "non modificare".
Ruolo e costruzione del prompt
Il prompt di sistema effettivamente ricevuto dall'LLM viene creato in uno di due modi a seconda di role.role. Sapere quale ramo stai utilizzando ti permette di capire quali campi sono rilevanti e quali vengono salvati ma ignorati.
Ramo A - role.role è CUSTOMER_SUPPORT, SALES o LEAD_COLLECTION_AGENT (guidato da modelli)
Il backend assembla il prompt a partire da un modello integrato e ignora del tutto role.rawPrompt (il valore viene comunque salvato sul bot, semplicemente non viene utilizzato). Il modello include:
role.role- etichetta del ruolo (ad es. "Customer Support") e istruzioni specifiche del ruolo aggiunte automaticamentename- nome del bot, inserito nella frase inizialerole.language-"Auto Detect"imposta il bot per seguire la lingua dell'utente; qualsiasi altro valore (ad es."English","Polish") diventa "Output in {language}, unless user uses another language"role.responseLength- associato a un conteggio parole indicativo:Concise≈ 50 parole,Normal≈ 100,Detailed≈ 200role.websiteAddress- facoltativo; quando non è vuoto, viene aggiunto come "for the users of the website {url}"role.companyDescription- facoltativo; quando non è vuoto, viene inserito come paragrafo aggiuntivo prima delle istruzioni del ruolo
Questo è il ramo consigliato per la maggior parte dei bot: offre un comportamento ottimizzato per il ruolo e linee guida di sicurezza già pronte.
Ramo B - role.role è CUSTOM (prompt fornito dal chiamante)
Il backend utilizza role.rawPrompt come prompt del ruolo e aggiunge le indicazioni fisse della piattaforma sulla lunghezza della risposta. Questa impostazione è separata da role.responseLength: l'opzione Concise/Normal/Detailed non viene inserita per un ruolo CUSTOM. Allo stesso modo, language, websiteAddress e companyDescription vengono memorizzati ma non inseriti nel prompt di questo ruolo. Includi tu stesso in rawPrompt la lingua desiderata, l'obiettivo di lunghezza della risposta o il contesto aziendale. È anche possibile fornire istruzioni aggiuntive a runtime e contesto recuperato, perciò rawPrompt non costituisce l'intero input per il modello. Le istruzioni sul tono del ruolo predefinito non vengono aggiunte, ma la scelta di CUSTOM non rimuove tutte le istruzioni della piattaforma.
Usa CUSTOM solo quando il prompt basato su modelli non si adatta al tuo caso d'uso (ad es. se hai bisogno di una persona molto specifica per un determinato settore, di vincoli di sicurezza personalizzati o di un formato di output non standard).
Campi enum / a valori definiti
I campi enum e con vincoli rifiutano i valori non validi con 400 invalid_parameter. Gli altri campi sono stringhe semplici, anche nei casi in cui l'interfaccia utente propone un elenco predefinito. Usa la grafia documentata e convalida il tuo payload invece di dare per scontato che ogni stringa non supportata venga rifiutata.
role.role-CUSTOMER_SUPPORT,SALES,LEAD_COLLECTION_AGENT,CUSTOMrole.responseLength-Concise,Normal,Detailedrole.language- nome completo della lingua in inglese dal menu a discesa dell'amministratore, ad es.Auto Detect,English,Polish,Spanish,German,French,Italian,Portuguese,Dutch,Russian,Chinese (Simplified),Japanese,Arabic,Hindie circa altre 80. Il valore viene memorizzato esattamente come indicato e inserito nel modello di prompt, perciò i codici ISO a due lettere (en,pl) e altri valori non presenti nell'elenco non vengono rifiutati dall'API, ma generano un'istruzione poco chiara come "Output in en, unless...". Il valore predefinito èAuto Detectse omesso in fase di creazione.advanced.model- vedi "Modelli di testo AI" di seguito. Si tratta di una stringa, non di un enum convalidato nello schema della richiesta; usa un valore supportato, non il nome arbitrario di un modello.advanced.chatContextSize- usa8000,16000o32000, come nell'interfaccia utente. I valori superiori al massimo dell'account vengono limitati automaticamente; il DTO non impone questo insieme di tre valori.chatMemory.clientSummaryPromptType-DEFAULT,CUSTOMchatMemory.conversationSummaryPromptType-DEFAULT,CUSTOMappearance.chatAlignment-left,rightappearance.minimizedDisplayMode-icon,minified,pillappearance.chatMessageLinkTarget-_blank,_selfleadCollection.requireBeforeNewConversation- selettore booleano.trueobbliga l'utente a compilare il modulo per i lead prima di avviare una conversazione;falselascia che l'IA decida quando mostrare il modulo (impostazione predefinita).
Campi strutturati e intervalli
Campi che sembrano semplici stringhe o numeri, ma che presentano formati specifici, intervalli o particolarità dell'interfaccia utente di amministrazione da conoscere.
-
advanced.temperature- l'intervallo accettato va da0.0a1.0, corrispondente al cursore nell'interfaccia utente di amministrazione. I valori al di fuori di questo intervallo vengono rifiutati con400 invalid_parameter. -
chatMemory.summariesToKnowledgeRatio- percentuale intera,10-90; l'interfaccia utente usa intervalli di10, ma l'API accetta qualsiasi numero intero all'interno dell'intervallo. Valore predefinito:50. Con la memoria abilitata e un contesto superiore a 8k, suddivide il budget tra conoscenza e memoria dopo aver riservato lo spazio per il prompt e la conversazione recente, senza considerare l'intero contesto del modello. A 8k questa impostazione non assegna alcun budget per i riepiloghi. -
liveChat.schedule- JSON codificato come stringa, non un oggetto JSON nidificato nella trasmissione di rete. Il server memorizza la stringa non elaborata esattamente così com'è; l'interfaccia utente di amministrazione ne esegue il parsing lato client durante il rendering dell'editor degli orari. Una volta analizzata, la stringa si presenta con una voce per ogni giorno della settimana più una chiavetimezone:- ogni chiave del giorno della settimana (
monday-sunday) punta a{enabled: boolean, from: "H:MM", to: "H:MM"}in formato 24 ore timezoneè il nome di una zona IANA (ad es."Europe/Warsaw","America/New_York")
Esempio di valore (nota le virgolette esterne e le virgolette interne con caratteri di escape: è un singolo campo stringa, non un oggetto nidificato):
"{\"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\"}"Al di fuori degli orari indicati, al visitatore viene mostrato
liveChat.outOfHoursMessagee il passaggio alla chat dal vivo viene bloccato. La convalida della struttura interna avviene solo lato client nell'interfaccia di amministrazione: un JSON non valido o chiavi non riconosciute vengono accettati dall'API come semplice stringa e causeranno un errore di rendering quando un operatore aprirà successivamente il bot nel pannello di amministrazione. Convalida la struttura da parte tua prima dell'invio. - ogni chiave del giorno della settimana (
-
conversation.positiveRatingTooltip/conversation.negativeRatingTooltip- brevi etichette mostrate sui controlli di valutazione della conversazione 👍 / 👎 quandoconversation.conversationRatingEnabled=true. Il testo predefinito è "Mi piace la risposta" / "Non mi piace la risposta". Visibili agli utenti finali. -
whiteLabel.hideRoboAssistLogo- funzionalità White Label, soggetta ai limiti del tuo account. Nasconde la dicitura a piè di pagina "Powered by ChatLab". Se il tuo account non include l'opzione White Label, il valore viene memorizzato ma ignorato e il piè di pagina viene sempre visualizzato. -
whiteLabel.whitelabelLogoLink- funzionalità White Label, soggetta ai limiti del tuo account. URL di destinazione del clic per il logo personalizzato quandohideRoboAssistLogo=trueed è stato caricato un file di logo personalizzato tramite la parte multipartwhitelabel_logo. -
appearance.simulateHumanTypingDelay- secondi (non millisecondi), numero intero0-200. Pausa tra i successivi messaggi del bot quandosimulateHumanTyping=true. Valore predefinito:5. -
appearance.autoOpenChatDelaySeconds- secondi, numero intero. Ritardo prima dell'apertura automatica del widget quandoautoOpenChat=trueeautoOpenChatDelay=true. -
advanced.internalLocale- codice IETF per lingua e regione nel formatoll_CC(con trattino basso, NONll-CCcon il trattino). I valori accettati provengono da un elenco fisso di circa 95 impostazioni internazionali: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_ILe molte altre. L'invio di un solo codice a due lettere ("en") o nel formato BCP-47 ("en-US") non è consentito. Valore predefinito:en_US. Questa è la configurazione internazionale usata per la formattazione di date e numeri nell'interfaccia del widget, distinta darole.language(la lingua con cui il bot risponde nelle conversazioni). -
security.talkMessagesRateLimit/security.talkMessagesRateLimitDurationSeconds- numeri interi (da inviare come numeri JSON, ad es.30, non"30"). Imposta il limite dei messaggi su0per disattivare questo limite basato sulla sessione. Se lo abiliti, specifica una durata positiva. Il backend applica un limite di N messaggi per sessione nell'arco della durata espressa in secondi prima di mostraresecurity.talkMessagesRateLimitHitMessageal visitatore. -
advanced.botMessagesLimit- numero intero (numero JSON, ad es.1000).0indica che non è presente alcun limite aggiuntivo per il singolo bot, ferma restando l'applicazione del limite di crediti dell'account; in caso contrario, deve essere un multiplo di 1000 (1000,2000,10000, ...). Valori come100o1500vengono rifiutati con400 invalid_parameter. Si tratta di un limite mensile di crediti per il bot, non di un conteggio di messaggi per conversazione. Il mapper non adatta questo valore al budget dell'account; l'utilizzo effettivo resta comunque vincolato dal budget totale dell'account.
Modelli di testo AI (advanced.model)
Usa l'identificatore esatto del modello restituito in advanced.model quando leggi un bot configurato con il modello desiderato in Settings > Model & Advanced (Impostazioni > Modello e avanzate). Il valore predefinito attuale in fase di creazione è 5.6-LUNA. Gli identificatori fanno distinzione tra maiuscole e minuscole e differiscono dai nomi visualizzati; ad esempio, 5.6-LUNA viene visualizzato come GPT 5.6-luna.
Il catalogo dei modelli cambia nel tempo. Non presumere che una stringa arbitraria o l'ID pubblico del modello di un fornitore sia supportato solo perché lo schema della richiesta accetta una stringa. Rileggi la configurazione salvata ed esegui i test sul chatbot ottenuto prima di pubblicarlo.
Riferimento dei campi (schema completo della richiesta)
Le sezioni e i campi supportati, con i relativi tipi e vincoli importanti. Semantica PATCH: qualsiasi campo omesso (o inviato come null) lascia inalterato il valore memorizzato. La stessa struttura viene utilizzata per la risposta (al netto dei contenuti binari multipart; con in più il blocco di sola lettura meta in ogni risposta e apiKey unicamente nella risposta di creazione).
Livello principale
| Campo | Tipo | Vincolo | Descrizione |
|---|---|---|---|
name |
string | max 150, obbligatorio in creazione | Nome visualizzato del bot |
role |
object | Vedi § role | |
conversation |
object | Vedi § conversation | |
chatMemory |
object | Vedi § chatMemory | |
appearance |
object | Vedi § appearance | |
humanSupport |
object | Vedi § humanSupport | |
leadCollection |
object | Vedi § leadCollection | |
liveChat |
object | Vedi § liveChat | |
consent |
object | Vedi § consent | |
whiteLabel |
object | Vedi § whiteLabel | |
security |
object | Vedi § security | |
advanced |
object | Vedi § advanced |
Aggiunte presenti solo nella risposta:
meta: { id, createdAt, updatedAt }- sola lettura.apiKey- stringa, presente solo nella risposta aPOST /v1/management/bots- la chiave Bot Talk appena generata per il nuovo bot, restituita una sola volta.
§ role
| Campo | Tipo | Vincolo | Descrizione |
|---|---|---|---|
role |
string (enum) | CUSTOMER_SUPPORT, SALES, LEAD_COLLECTION_AGENT, CUSTOM |
Preset del personaggio; seleziona il modello di prompt (vedi "Role and prompt construction") |
language |
string | nome completo della lingua in inglese (English, Polish, ...) o Auto Detect |
Lingua principale inserita nel modello di prompt |
responseLength |
string | ∈ {Concise, Normal, Detailed} |
Lunghezza desiderata della risposta dell'IA |
websiteAddress |
string | Sito web utilizzato per il contesto del prompt | |
companyDescription |
string | Descrizione dell'azienda utilizzata per il contesto del prompt | |
rawPrompt |
string | Prompt di sistema personalizzato - usato letteralmente solo quando role=CUSTOM |
§ conversation
| Campo | Tipo | Vincolo | Descrizione |
|---|---|---|---|
welcomeMessage |
string | Primo messaggio mostrato al visitatore all'apertura | |
queryRefinementEnabled |
boolean | Se true, perfeziona la domanda del visitatore prima del recupero RAG | |
conversationContinuityEnabled |
boolean | Se true, i visitatori che ritornano riprendono l'ultima conversazione | |
conversationRatingEnabled |
boolean | Se true, mostra i comandi pollice su/giù per valutare la conversazione | |
positiveRatingTooltip |
string | Descrizione comando (tooltip) sul pulsante di valutazione positiva | |
negativeRatingTooltip |
string | Descrizione comando sul pulsante di valutazione negativa | |
suggestedQuestions |
string | Domande suggerite / spunti di conversazione separati da a capo | |
dynamicSuggestedFollowups |
boolean | Se true, l'IA suggerisce domande di approfondimento dopo ogni risposta | |
positiveRatingMessage |
string | Messaggio mostrato dopo un feedback positivo | |
negativeRatingMessage |
string | Messaggio mostrato dopo un feedback negativo | |
hideSuggestedQuestionsAfterFirstUse |
boolean | Nascondi i suggerimenti statici dopo il loro utilizzo | |
dynamicFollowupsAutoIcons |
boolean | Se true, l'IA assegna automaticamente icone emoji ai follow-up dinamici |
§ chatMemory
| Campo | Tipo | Vincolo | Descrizione |
|---|---|---|---|
enabled |
boolean | Interruttore generale per la funzione di memoria chat | |
summaryConversationsEnabled |
boolean | Memorizza i riepiloghi per singola conversazione | |
conversationSummaryPrompt |
string | Prompt personalizzato utilizzato per riepilogare ciascuna conversazione | |
conversationSummaryPromptType |
string (enum) | ∈ {DEFAULT, CUSTOM} |
Specifica se utilizzare il prompt di riepilogo predefinito o personalizzato |
clientSummaryPrompt |
string | Prompt personalizzato utilizzato per creare il profilo del cliente tra le varie conversazioni | |
clientSummaryPromptType |
string (enum) | ∈ {DEFAULT, CUSTOM} |
Prompt del profilo cliente predefinito vs personalizzato |
summariesToKnowledgeRatio |
int | 10-90 (passo UI 10) |
% del budget di conoscenza/memoria disponibile allocata ai riepiloghi per contesti superiori a 8k |
§ appearance
| Campo | Tipo | Vincolo | Descrizione |
|---|---|---|---|
launcherLabelLine1 |
string | max 60 | Prima riga di testo del launcher |
launcherLabelLine2 |
string | max 60 | Seconda riga di testo del launcher |
launcherTextColor |
string | Colore del testo del launcher | |
launcherDismissEnabled |
boolean | Consenti la chiusura del launcher | |
widgetFontFamily |
string | inter, system, nunito, lato, montserrat, poppins, source-serif, jetbrains-mono |
Famiglia di caratteri del widget |
chatDrawerEnabled |
boolean | Abilita la presentazione a cassetto (drawer) | |
launcherColor |
string (hex) | Colore di sfondo del launcher (icona chat) | |
headerColor |
string (hex) | Colore di sfondo dell'intestazione della chat | |
titleColor |
string (hex) | Colore del titolo nell'intestazione della chat | |
subtitleColor |
string (hex) | Colore del sottotitolo nell'intestazione della chat | |
clientMessageBubbleColor |
string (hex) | Colore del fumetto dei messaggi del visitatore | |
clientMessageTextColor |
string (hex) | Colore del testo dei messaggi del visitatore | |
responseMessageBubbleColor |
string (hex) | Colore del fumetto delle risposte del bot | |
responseMessageTextColor |
string (hex) | Colore del testo delle risposte del bot | |
chatSubheader |
string | Slogan mostrato sotto il titolo della chat | |
senderPlaceholder |
string | Testo segnaposto nel campo di inserimento del messaggio | |
resetConversationTooltip |
string | Descrizione comando sul pulsante "reset conversation" (reimposta conversazione) | |
chatAlignment |
string (enum) | ∈ {left, right} |
Lato dello schermo a cui si ancora la chat |
launcherBottomMargin |
int | 0-500 |
Distanza del launcher dal bordo inferiore (px) |
launcherSideMargin |
int | 0-500 |
Distanza del launcher dal bordo laterale (px) |
displayShadow |
boolean | Ombreggiatura sotto il widget | |
customCss |
string | CSS non elaborato iniettato nell'iframe del widget | |
chatMessageLinkTarget |
string (enum) | ∈ {_blank, _self} |
Modalità di apertura dei link all'interno dei messaggi del bot |
minimizedDisplayMode |
string (enum) | ∈ {icon, minified, pill} |
Stato ridotto a icona: icona del launcher, barra di invio compatta o pillola |
chatDesktopWidthPx |
int | Larghezza del widget su desktop | |
chatDesktopHeightPx |
int | Altezza del widget su desktop | |
chatMobileSizePercent |
int | Dimensione del widget su dispositivi mobili come % della viewport | |
messageFontSize |
int | Dimensione del carattere del testo dei messaggi (px) | |
showChatbotBubblesDesktop |
boolean | Mostra i fumetti fluttuanti di anteprima su desktop | |
showChatbotBubblesMobile |
boolean | Mostra i fumetti fluttuanti di anteprima su dispositivi mobili | |
chatbotBubblesDelaySeconds |
int | Ritardo prima della comparsa dei fumetti di anteprima (secondi) | |
launcherIconFullSize |
boolean | Renderizza l'icona personalizzata del launcher a tutto campo anziché rientrata | |
welcomeScreenEnabled |
boolean | Mostra la Welcome Screen (schermata di benvenuto) invece di entrare direttamente nella chat | |
welcomeScreenQuestionsLabel |
string | Etichetta sopra le domande suggerite nella schermata di benvenuto | |
welcomeScreenHideHumanContactForm |
boolean | Nascondi l'azione per il modulo di contatto umano nell'intestazione durante la visualizzazione della Welcome Screen. Riappare dopo il primo messaggio del visitatore. Per i bot creati prima del 2026-09-02 il valore predefinito è true |
|
welcomeScreenHideLiveChat |
boolean | Nascondi l'azione Live Chat nell'intestazione durante la visualizzazione della Welcome Screen. Riappare dopo il primo messaggio del visitatore. Per i bot creati prima del 2026-09-02 il valore predefinito è true |
|
headerActionsLayout |
string | ICONS o DROPDOWN |
Modalità di presentazione di Live Chat e del modulo di contatto umano nell'intestazione della chat: ICONS (un'icona separata per ciascuno) o DROPDOWN (raggruppati nel menu dell'intestazione). Per i bot creati prima del 2026-09-02 il valore predefinito è ICONS |
stackSuggestedQuestions |
boolean | Disponi le domande suggerite in verticale (anziché affiancate) | |
suggestedQuestionsFontSize |
int | Dimensione del carattere dei chip delle domande suggerite (px) | |
suggestedQuestionsTextColor |
string (hex) | Colore del testo dei chip delle domande suggerite | |
suggestedQuestionsBackgroundColor |
string (hex) | Colore di sfondo dei chip delle domande suggerite | |
autoOpenChat |
boolean | Apri automaticamente la chat su desktop | |
autoOpenChatOnMobiles |
boolean | Apri automaticamente la chat su dispositivi mobili | |
autoOpenChatDelay |
boolean | Applica un ritardo prima dell'apertura automatica | |
autoOpenChatDelaySeconds |
int | Ritardo di apertura automatica (secondi) | |
simulateHumanTyping |
boolean | Suddividi la risposta del bot in più fumetti con animazione di digitazione | |
simulateHumanTypingDelay |
int | 0-200 |
Ritardo tra i messaggi a fumetto (secondi) |
footerMarkdown |
string | max 255 | Markdown personalizzato per il piè di pagina visualizzato sotto la chat |
avatarUrl |
string | sola lettura | URL pubblico completo dell'avatar; per modificarlo, caricalo tramite la parte multipart avatar |
Multipart in POST/PATCH: avatar (parte file). I corpi delle risposte / richieste GET omettono il contenuto del file - viene trasmesso solo l'URL.
§ humanSupport
| Campo | Tipo | Vincolo | Descrizione |
|---|---|---|---|
enabled |
boolean | Interruttore del flusso Human Support | |
email |
string | obbligatorio (in creazione rigorosa) quando enabled=true |
Indirizzo che riceve le email di assistenza umana |
dialogMessage |
string | Messaggio di incoraggiamento mostrato sopra il modulo | |
thankYouMessage |
string | Messaggio di ringraziamento mostrato dopo l'invio | |
emailMessageSubjectTemplate |
string | Modello per l'oggetto dell'email inviata all'agente | |
emailMessageContentTemplate |
string | Modello per il corpo dell'email inviata all'agente | |
emailPlaceholder |
string | Testo segnaposto nel campo email | |
messagePlaceholder |
string | Testo segnaposto nell'area di testo del messaggio | |
emailWithConversationContent |
boolean | Se true, include la trascrizione della conversazione nel corpo dell'email | |
customFormId |
long | id di un modulo personalizzato esistente | Sostituisce il modulo di contatto integrato con un modulo personalizzato. In fase di creazione, se omesso viene usato il modulo integrato; su PATCH, null mantiene inalterata la selezione attuale |
customFormMapping |
string | stringa codificata in JSON | Mappa i campi del modulo personalizzato sui campi email dell'assistenza umana |
requirePolicyAccept si trova in consent.humanSupportRequirePolicyAccept, non qui.
§ leadCollection
| Campo | Tipo | Vincolo | Descrizione |
|---|---|---|---|
enabled |
boolean | Interruttore del modulo di acquisizione contatti | |
nameEnabled |
boolean | Raccogli il nome | |
nameLabel |
string | Etichetta nel campo del nome | |
emailEnabled |
boolean | Raccogli l'email | |
emailLabel |
string | obbligatorio (in creazione rigorosa) quando enabled=true E emailEnabled=true |
Etichetta nel campo dell'email |
phoneEnabled |
boolean | Raccogli il telefono | |
phoneLabel |
string | obbligatorio (in creazione rigorosa) quando enabled=true E phoneEnabled=true |
Etichetta nel campo del telefono |
leaveDetailsMessage |
string | obbligatorio (in creazione rigorosa) quando enabled=true |
Messaggio che invita il visitatore a lasciare i propri recapiti |
thankYouMessage |
string | obbligatorio (in creazione rigorosa) quando enabled=true |
Messaggio di ringraziamento mostrato dopo l'invio |
requireBeforeNewConversation |
boolean | Se true, il modulo deve essere inviato prima di iniziare la chat; se false, l'IA decide quando proporre il modulo |
|
emailNotificationEnabled |
boolean | Invia un'email al proprietario ogni volta che viene acquisito un lead | |
emailNotificationAddress |
string | Destinatario delle notifiche (il valore predefinito è l'email dell'account) | |
emailWithConversationContent |
boolean | Se true, include la trascrizione della conversazione nella notifica |
| customFormId | long | id di un modulo personalizzato esistente | Sostituisce il modulo lead integrato con un modulo personalizzato. In fase di creazione, se omesso viene usato il modulo integrato; su PATCH, null mantiene inalterata la selezione attuale |
| customFormMapping | string | stringa codificata in JSON | Mappa i campi del modulo personalizzato su nome / email / telefono |
Regola di creazione rigorosa tra campi: enabled=true richiede almeno uno tra emailEnabled o phoneEnabled. requirePolicyAccept si trova in consent.leadCollectionRequirePolicyAccept, non qui.
§ liveChat
| Campo | Tipo | Vincolo | Descrizione |
|---|---|---|---|
enabled |
boolean | Interruttore della funzione Live Chat | |
infoMessage |
string | Messaggio informativo visualizzato prima del passaggio a un operatore | |
startMessage |
string | Messaggio mostrato all'avvio della sessione live | |
endMessage |
string | Messaggio mostrato al termine della sessione live | |
nameLabel |
string | Etichetta nel campo del nome nel modulo preliminare di Live Chat | |
emailLabel |
string | Etichetta nel campo dell'email nel modulo preliminare di Live Chat | |
schedule |
string | stringa codificata in JSON (giorni abilitati + from/to + timezone) |
Orari operativi di Live Chat - vedi "Structured fields and ranges" per la struttura esatta |
outOfHoursMessage |
string | Messaggio mostrato al di fuori degli orari previsti | |
closeModalMessage |
string | Titolo della finestra modale per la chiusura della chat | |
closeModalConfirmLabel |
string | Etichetta del pulsante di conferma nella modale di chiusura | |
closeModalCancelLabel |
string | Etichetta del pulsante di annullamento nella modale di chiusura | |
closeModalTooltipText |
string | Descrizione comando sul controllo di chiusura della chat | |
operatorHasJoinedLabel |
string | Etichetta mostrata quando un operatore entra nella chat | |
operatorDidNotJoinInTimeLabel |
string | Etichetta mostrata quando nessun operatore risponde entro il tempo limite | |
waitingForOperatorToJoinLabel |
string | Etichetta mostrata durante l'attesa di un operatore | |
waitingForOperatorSeconds |
int | Tempo massimo di attesa per la presa in carico da parte di un operatore (secondi) | |
redirectToHumanSupportForm |
boolean | Se true, reindirizza al modulo Human Support se nessun operatore risponde | |
requireAdminOnline |
boolean | Richiedi che un operatore sia disponibile in base alle impostazioni di presenza | |
presenceMode |
string | Modalità di presenza; usa il valore di un bot configurato nell'interfaccia utente | |
hideHumanSupportWhenLiveChatAvailable |
boolean | Nascondi il modulo di contatto quando la chat dal vivo è disponibile | |
missedEmailEnabled |
boolean | predefinito true |
Invia un'email al proprietario del bot quando una richiesta di live chat non riceve risposta. Lasciato non impostato sui bot legacy, viene interpretato come abilitato |
requirePolicyAccept si trova in consent.liveChatRequirePolicyAccept, non qui.
§ consent
| Campo | Tipo | Vincolo | Descrizione |
|---|---|---|---|
newConversationRequirePolicyAccept |
boolean | Richiedi il consenso all'informativa sulla privacy prima di iniziare una nuova conversazione | |
humanSupportRequirePolicyAccept |
boolean | Richiedi il consenso all'informativa sulla privacy prima di inviare il modulo di assistenza umana | |
leadCollectionRequirePolicyAccept |
boolean | Richiedi il consenso all'informativa sulla privacy prima di inviare il modulo per l'acquisizione di contatti | |
liveChatRequirePolicyAccept |
boolean | Richiedi il consenso all'informativa sulla privacy prima di avviare una sessione di live chat | |
newConversationConsentDescription |
string | Testo introduttivo per la schermata di consenso all'inizio della conversazione | |
privacyPolicyConsentCheckboxLabel |
string | Etichetta accanto alla casella di spunta per il consenso (di solito contiene un link all'informativa sulla privacy) |
§ whiteLabel
| Campo | Tipo | Vincolo | Descrizione |
|---|---|---|---|
hideRoboAssistLogo |
boolean | funzionalità White Label; soggetta ai limiti dell'account | Nascondi il logo ChatLab predefinito nel piè di pagina |
whitelabelLogoLink |
string | funzionalità White Label; soggetta ai limiti dell'account | URL a cui reindirizza il logo personalizzato nel piè di pagina |
assignToCustomDomain |
boolean | vincolato dalla funzionalità CUSTOM_DOMAIN |
Ospita la chat sul dominio personalizzato configurato |
whitelabelLogoUrl |
string | sola lettura | URL pubblico completo del logo white-label; per modificarlo, caricalo tramite la parte multipart whitelabel_logo |
Multipart in POST/PATCH: whitelabel_logo (parte file). I corpi delle risposte / richieste GET omettono il contenuto del file - viene trasmesso solo l'URL.
§ security
| Campo | Tipo | Vincolo | Descrizione |
|---|---|---|---|
allowedDomains |
string | Elenco separato da virgole dei domini autorizzati a incorporare il widget (vuoto = nessuna whitelist) | |
spamFilterEnabled |
boolean | Abilita il filtro antispam per singolo bot sui messaggi in arrivo | |
countryFilterMode |
string | BLACKLIST o WHITELIST |
Modalità di interpretazione degli elenchi dei paesi. Gli elenchi veri e propri restano accessibili solo agli amministratori |
talkMessagesRateLimit |
int | >= 0; 0 disabilita |
Numero massimo di messaggi utente consentiti nella finestra del limite di frequenza |
talkMessagesRateLimitDurationSeconds |
int | >= 0 |
Durata della finestra del limite di frequenza (secondi) |
talkMessagesRateLimitHitMessage |
string | Messaggio mostrato al visitatore quando viene raggiunto il limite di frequenza |
§ voice
| Campo | Tipo | Vincolo | Descrizione |
|---|---|---|---|
inputEnabled |
boolean | Consenti al visitatore di dettare i messaggi (da voce a testo) | |
conversationEnabled |
boolean | richiede la funzionalità vocale attiva sul piano | Abilita conversazioni vocali complete |
voiceId |
string | id voce specifico del provider (es. alloy) |
Voce sintetica utilizzata per la riproduzione |
model |
string | es. GPT-REALTIME-MINI, GEMINI-LIVE, ELEVENLABS-* |
Modello vocale. Fatturato al minuto, le tariffe variano a seconda del modello |
turnDetection |
string | specifico del provider | Modalità di alternanza dei turni di conversazione |
audioPrompt |
string | Prompt di sistema aggiuntivo utilizzato esclusivamente per i turni vocali | |
welcomeMessage |
string | Frase iniziale pronunciata dal bot | |
language |
string | codice lingua | Lingua vocale principale |
additionalLanguages |
string | codici lingua separati da virgole | Ulteriori lingue accettate dall'agente vocale |
maxDurationSeconds |
int | Limite massimo per una singola conversazione vocale | |
maxDurationMessage |
string | Messaggio mostrato al raggiungimento del limite massimo |
§ multilingual
| Campo | Tipo | Vincolo | Descrizione |
|---|---|---|---|
enabled |
boolean | Interruttore della modalità multilingue | |
mode |
string | AUTODETECT o FIXED_LIST |
Criterio con cui il bot sceglie la lingua di risposta |
baseLanguage |
string | codice lingua | Lingua con cui sono stati redatti i testi del bot |
languages |
string | codici lingua separati da virgole | Lingue proposte al visitatore |
knowledgeLanguageMode |
string | NONE, MAIN, o DYNAMIC |
Criterio di gestione della knowledge base redatta in altre lingue |
knowledgeLanguageFallback |
string | codice lingua | Lingua utilizzata come fallback quando non viene trovata alcuna corrispondenza |
§ advanced
| Campo | Tipo | Vincolo | Descrizione |
|---|---|---|---|
model |
string | soggetto ai limiti dell'account; vedi "AI text models" sopra | Identificatore LLM (es. 5.6-LUNA) |
temperature |
decimal | 0.0-1.0 |
Temperatura di campionamento (corrisponde al cursore nell'interfaccia) |
chatContextSize |
int | ∈ {8000, 16000, 32000}; limitato automaticamente alla soglia dell'account |
Budget di contesto configurato, inclusi istruzioni, cronologia e conoscenza |
botMessagesLimit |
long | 0 o multiplo di 1000 (es. 1000, 2000, 10000) |
Tetto mensile di crediti messaggio del bot (0 = nessun tetto specifico per il bot; si applica il budget dell'account) |
internalLocale |
string | codice locale nel formato ll_CC |
Locale per le etichette dell'interfaccia del widget (distinto da role.language) |
productsViewEnabled |
boolean | Se true, mostra le Offer Cards di e-commerce all'interno della chat | |
includeProductsInKnowledgeBase |
boolean | Se true, indicizza il catalogo prodotti come parte della knowledge base |
Funzionalità non coperte dalle API
L'interfaccia di amministrazione include alcune aree che sono intenzionalmente escluse da questa versione della Management API:
- Training ed eliminazione - questi endpoint non consentono di elencare tutti i bot, gestire i dataset di training o eliminare bot. Per questi flussi di lavoro usa l'applicazione.
- Scheda Flow - l'editor visuale per il flusso di conversazione (stadi e transizioni). Non esposto tramite la Management API.
- Scheda Actions - integrazioni gestite per e-commerce / prenotazioni, AI Search e funzioni API personalizzate. Il tool calling non ha mai fatto parte della Management API.
- Il generatore di moduli personalizzati - la creazione e la modifica di moduli personalizzati non sono esposte. Tuttavia, puoi collegare un modulo esistente a un bot tramite
leadCollection.customFormIdehumanSupport.customFormId. - Icone personalizzate di apertura / chiusura chat -
customLauncherIconVisible,openChatIcon,closeChatIcon. L'API espone solo le parti multipart principaliavatarewhitelabel_logo. - Elenchi di indirizzi IP e paesi - le singole voci sono riservate agli amministratori. Viene esposta unicamente la modalità di interpretazione, tramite
security.countryFilterMode.
Endpoints
POST /v1/management/bots
Crea un nuovo bot. Vengono accettati due Content-Type equivalenti; scegli quello più comodo.
Modalità A - JSON normale (consigliata quando non devi caricare un avatar / logo nella stessa richiesta):
Content-Type: application/json- Il corpo della richiesta è il JSON di configurazione del bot (senza il wrapper
data) - I file (avatar / logo) possono essere caricati in seguito tramite una seconda richiesta
PATCHutilizzando la modalità B
Modalità B - multipart/form-data (da usare quando carichi file nella stessa richiesta):
Content-Type: multipart/form-data; boundary=...- Parte JSON
data(obbligatoria,Content-Type: application/json) - configurazione del bot nella struttura nidificata descritta sopra - Parte file
avatar(facoltativa) - immagine dell'avatar del bot - Parte file
whitelabel_logo(facoltativa) - logo white-label (applicabile solo se il tuo account include la funzionalità White Label)
Solo name è obbligatorio nel JSON; ogni altro campo assume lo stesso valore predefinito impostato dalla procedura guidata dell'interfaccia di amministrazione.
Esempio di corpo della richiesta
Questo è il JSON data massimale - con ogni sezione compilata. Invia solo le sezioni di tuo interesse; tutto il resto assume i valori predefiniti.
{
"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
}
}
Regole di validazione con i rispettivi messaggi di errore:
name- obbligatorio, max 150 caratteriadvanced.temperature- tra0.0e1.0chatMemory.summariesToKnowledgeRatio- intero tra10e90(percentuale, incremento di10)appearance.launcherBottomMargin,appearance.launcherSideMargin- tra0e500appearance.footerMarkdown- max 255 caratterihumanSupport.enabled=truerichiede l'impostazione dihumanSupport.emailleadCollection.enabled=truerichiede che almeno uno traleadCollection.emailEnabledoleadCollection.phoneEnabledsia true; qualsiasi canale sia attivo richiede anche la relativa etichetta, oltre aleaveDetailsMessageethankYouMessageadvanced.chatContextSizeviene limitato alla dimensione massima del contesto supportata dall'account. Non dare per scontato che gli altri campi numerici vengano limitati automaticamente.
I campi il cui valore è null sul server vengono omessi dal corpo JSON: la richiesta trasmette solo i campi con valori non nulli.
Esempio di corpo della risposta (201)
Stessa struttura della richiesta, più il blocco di sola lettura meta e l'apiKey monouso al livello principale. Gli URL dei file di sola lettura (appearance.avatarUrl, whiteLabel.whitelabelLogoUrl) vengono popolati dal server quando le corrispondenti parti multipart sono state caricate.
{
"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"
}
Il campo apiKey compare solo al momento della creazione: è la chiave Bot Talk appena generata e associata al nuovo bot. Il testo in chiaro viene mostrato una sola volta e non può essere recuperato successivamente dall'API; salvalo subito sul tuo lato.
L'header di risposta Location contiene l'URL del nuovo bot (/v1/management/bots/{id}).
Esempi Curl
Modalità A - JSON normale (la più semplice):
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!"}}'
Modalità B - multipart con 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}
Restituisce la configurazione attuale di un bot di tua proprietà.
Esempio Curl
curl https://api.chatlab.com/aichat/v1/management/bots/4287 \
-H "Authorization: Bearer mk_..."
Esempio di corpo della risposta (200)
Stessa struttura della risposta POST, tranne per l'apiKey monouso. Il blocco meta è incluso. Restituisce 404 not_found_error se il bot non esiste o non appartiene al tuo account.
L'avatar e il logo white-label attuali vengono esposti come URL completi di sola lettura (appearance.avatarUrl, whiteLabel.whitelabelLogoUrl), basati sullo stesso schema + host + context path che ha gestito questa richiesta. Recupera i byte effettuando una richiesta GET direttamente a questi URL; per sostituire uno dei file, caricane uno nuovo tramite la parte multipart avatar / whitelabel_logo su PATCH. Questi campi URL vengono ignorati se inviati nel corpo di una richiesta.
{
"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"
}
}
Clonare un bot
Il corpo della richiesta di POST /v1/management/bots e il corpo della risposta di GET /v1/management/bots/{bot_id} condividono la stessa struttura, quindi la clonazione è una procedura in tre passaggi: recupera l'origine con GET, rimuovi i campi di identità gestiti dal server, invia il risultato con POST.
1. Esegui la GET del bot di origine.
curl https://api.chatlab.com/aichat/v1/management/bots/4287 \
-H "Authorization: Bearer mk_..." \
-o source-bot.json
2. Rimuovi il blocco di primo livello meta. L'oggetto meta (id, createdAt, updatedAt) è gestito dal server ed è di sola lettura - lasciarlo nel corpo della richiesta POST non causa problemi (il server lo ignora), ma rimuoverlo rende l'intento esplicito e mantiene pulito il payload. Facoltativamente, modifica name in modo da distinguere il clone dall'origine.
jq 'del(.meta) | .name = "Helpdesk Bot (clone)"' source-bot.json > clone-body.json
3. Invia con POST il corpo ripulito per creare il clone. Consulta la documentazione di POST /v1/management/bots sopra per la struttura completa del payload e le regole di validazione.
curl -X POST https://api.chatlab.com/aichat/v1/management/bots \
-H "Authorization: Bearer mk_..." \
-H "Content-Type: application/json" \
-d @clone-body.json
La risposta contiene il campo meta.id del nuovo bot e una chiave apiKey appena generata (la chiave Bot Talk per il clone). Il valore in testo non cifrato di apiKey viene restituito solo nella risposta a questa creazione - copialo prima di eliminare il corpo della risposta; non potrà essere recuperato in seguito.
Questa operazione copia le impostazioni supportate, non un chatbot completamente addestrato. I contenuti di addestramento, la cronologia delle conversazioni, le integrazioni/azioni, il Flow e le definizioni dei moduli non vengono clonati da questi endpoint. Configurali separatamente nell'app.
Ulteriori avvertenze:
- I file non vengono clonati.
appearance.avatarUrlewhiteLabel.whitelabelLogoUrlsono di sola lettura e puntano ai file del bot di origine. Se hai bisogno dello stesso avatar o logo White Label sul clone, scarica i byte dagli URL di origine e caricali come parti multipartavatar/whitelabel_logo- durante la POST di creazione (Modalità B) oppure con una successiva richiesta PATCH. - Le chiavi Bot Talk non vengono clonate. Ogni bot ha il proprio set di chiavi Bot Talk. La singola
apiKeyrestituita dalla POST di creazione è l'unica generata automaticamente; crea chiavi aggiuntive dalla scheda API (API tab) del bot, se necessario.
PATCH /v1/management/bots/{bot_id}
Aggiorna uno o più campi di un bot di tua proprietà. Vengono modificate solo le sezioni / i campi presenti nel JSON; tutto ciò che viene omesso (o inviato come null) rimane invariato. All'interno di una sezione inviata si applica la logica di aggiornamento parziale per singolo campo.
Sono accettati due Content-Type equivalenti (come per POST):
Modalità A - plain JSON (consigliata per l'aggiornamento delle sole impostazioni):
Content-Type: application/json- Il corpo della richiesta è il JSON di patch (senza wrapper
data)
Modalità B - multipart/form-data (da usare per caricare file):
- parte JSON
data(facoltativa) - la patch. Inviala solo se desideri modificare dei campi. Omettila del tutto se vuoi caricare solo un avatar o un logo. - parte file
avatar(facoltativa) - sostituisce l'avatar - parte file
whitelabel_logo(facoltativa) - sostituisce il logo White Label (valido solo se il tuo account include la funzionalità White Label)
Tutte e tre le parti sono facoltative nella richiesta PATCH, ma almeno una deve essere presente affinché la chiamata abbia effetto.
Esempio di corpo della richiesta (più sezioni)
È possibile inviare qualsiasi campo accettato da POST /v1/management/bots. L'esempio seguente illustra diverse sezioni, non tutti i campi supportati; in pratica invii solo le chiavi che desideri modificare (vedi "Aggiornamento parziale minimo" più sotto) - ogni chiave omessa (o inviata come null) lascia invariato il valore memorizzato.
{
"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
}
}
Aggiornamento parziale minimo
Esegui la richiesta PATCH su un singolo campo inviando esattamente le chiavi che desideri modificare - tutto il resto viene mantenuto.
{
"appearance": {
"launcherColor": "#abcdef"
}
}
Esempi con curl
Modalità A - plain JSON (più semplice):
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"}}'
Modalità B - multipart (quando sostituisci l'avatar / il 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'
Modalità B - sostituisci solo l'avatar (nessuna modifica ai campi):
curl -X PATCH https://api.chatlab.com/aichat/v1/management/bots/4287 \
-H "Authorization: Bearer mk_..." \
-F 'avatar=@./new-avatar.png'
Corpo della risposta (200)
Stessa struttura di GET /v1/management/bots/{bot_id} - l'intera configurazione del bot dopo l'applicazione della patch, compreso il blocco meta. Nessun campo apiKey. Restituisce 404 not_found_error se il bot non esiste o non appartiene al tuo account.
L'esempio seguente mostra la risposta dopo aver applicato la patch del Corpo completo della richiesta (più sezioni) sopra al bot dell'esempio GET: i campi modificati riflettono i nuovi valori, i campi non toccati vengono preservati e meta.updatedAt viene aggiornato.
{
"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
Legge l'utilizzo attuale dell'abbonamento per l'account proprietario della chiave Management.
Corpo della risposta (200)
{
"subscriptionType": "your-plan-id",
"messages": {"used": 4123, "limit": 11000, "remaining": 6877},
"bots": {"used": 3, "limit": 5, "remaining": 2}
}
subscriptionTypeè l'identificatore in lettere minuscole del piano attuale dell'account (your-plan-idè un segnaposto a scopo illustrativo). I piani provengono da un catalogo dinamico, pertanto l'insieme esatto degli identificatori può cambiare nel tempo man mano che i piani vengono rinominati o aggiunti - trattalo come una stringa opaca, non come un enum fisso.messages.used/limit/remainingrappresentano i crediti messaggio del mese solare corrente, che si azzerano il primo giorno del mese e non il giorno di rinnovo dell'abbonamento. Sono conteggiati in base ai crediti e non come semplice conteggio delle risposte.bots.used/limit/remainingconteggiano i bot posseduti, inclusi quelli in pausa, rispetto al limite totale di bot del tuo account.
Intestazioni di rate limit
Le risposte che raggiungono la fase di rate limit (ovvero dopo aver superato l'autenticazione e la whitelist IP) includono:
X-RateLimit-Limit: 10
X-RateLimit-Remaining: 7
X-RateLimit-Reset: 1715430000
X-RateLimit-Limit- il limite per chiave effettivamente applicato a questa chiamata (10 per impostazione predefinita, oppure il valore configurato inrateLimitPerMinutese inferiore).X-RateLimit-Remaining- token rimasti nel bucket subito dopo questa chiamata.X-RateLimit-Reset- secondi Unix epoch in cui diventa disponibile il token successivo (non un ripristino completo del bucket; il bucket si riempie continuamente). Quando il bucket è pieno, corrisponde all'ora corrente.
Nelle risposte 429 rate_limit_exceeded, viene impostata anche l'intestazione Retry-After, espressa in secondi interi fino a quando non si libera almeno un token.
Gli errori precedenti all'autenticazione (401 missing_api_key, 401 invalid_api_key, 403 ip_blocked) e 403 ip_not_whitelisted non contengono le intestazioni X-RateLimit-* - il limitatore viene consultato solo dopo il superamento dell'autenticazione e dei controlli IP.
Formato degli errori
Stesso contenitore di Bot Talk API:
{
"error": {
"type": "permission_error",
"code": "key_type_not_allowed",
"message": "This endpoint requires a MANAGEMENT API key.",
"param": null
}
}
Gli errori di convalida utilizzano code: "invalid_parameter" e antepongono il percorso del campo non valido al messaggio, in modo da individuare facilmente la sezione interessata:
{
"error": {
"type": "invalid_request_error",
"code": "invalid_parameter",
"message": "humanSupport.email Human support email is required when humanSupport.enabled=true"
}
}
I valori non validi per i campi enum / con set chiuso di valori (ad es. chatMemory.clientSummaryPromptType = "BOGUS") includono il percorso del campo, il valore rifiutato e l'elenco dei valori consentiti:
{
"error": {
"type": "invalid_request_error",
"code": "invalid_parameter",
"message": "chatMemory.clientSummaryPromptType 'BOGUS' is not a valid value. Allowed: CUSTOM, DEFAULT"
}
}
Contenuti correlati
Per gli endpoint di conversazione e lo streaming SSE, consulta Bot Talk API.