Información general sobre la Management API
La Management API está diseñada para tareas de gestión interna que no implican el envío de mensajes de chat:
- crear un bot de forma programática con
POST /v1/management/bots - consultar un bot específico de tu propiedad con
GET /v1/management/bots/{bot_id} - actualizar un bot específico con
PATCH /v1/management/bots/{bot_id} - consultar el uso de la suscripción con
GET /v1/usage
Las claves de gestión están vinculadas a tu cuenta, no a un bot en particular. Se mantienen deliberadamente separadas de las claves de Bot Talk para que una clave de chat comprometida no pueda modificar tus bots ni leer tus datos de facturación.
URL base
https://api.chatlab.com/aichat
Todos los endpoints de este artículo son relativos a esta URL base.
Primeros pasos
- Abre el panel de administración y ve a Account Settings > Management API (Configuración de la cuenta > Management API).
- Haz clic en Create Management Key (Crear clave de gestión), asígnale un nombre, define opcionalmente una lista blanca de IP y un límite de tasa (rate limit), y luego envía el formulario.
- Copia la clave completa desde la ventana modal de confirmación. El texto sin formato solo se muestra una vez.
Una clave tiene el formato mk_abcdefghijklmnopqrstuvwxyz012345. El prefijo mk_ la distingue de las claves de Bot Talk (ck_).
Autenticación
Authorization: Bearer mk_abcdefghijklmnopqrstuvwxyz012345
Si envías una clave mk_ a /v1/chat (o a cualquier otro endpoint de Bot Talk), recibirás un error 403 key_type_not_allowed. Si envías una clave ck_ a /v1/management/*, recibirás el mismo error.
Límites
- Máximo de 5 claves activas de la Management API por usuario
- Máximo de 10 solicitudes por minuto por clave (cubo de tokens, capacidad de 10, reposición gradual de ~1 token cada 6 segundos). Se puede configurar a un nivel inferior al momento de la creación: define un valor de
rateLimitPerMinutemás bajo y el tope disminuirá, escalando la tasa de reposición proporcionalmente.
Permisos
Cada clave de gestión admite cualquier subconjunto de los tres permisos siguientes. Se debe seleccionar al menos uno al momento de crearla; de lo contrario, la solicitud se rechazará con el error 400 invalid_request_error. Llamar a un endpoint con una clave que carezca del permiso requerido devuelve un error 403 insufficient_permissions.
bot_read: necesario paraGET /v1/management/bots/{bot_id}bot_management: necesario paraPOST /v1/management/botsyPATCH /v1/management/bots/{bot_id}usage: necesario paraGET /v1/usage
Estructura del cuerpo: secciones anidadas que reflejan las pestañas del panel de administración
POST y PATCH aceptan un cuerpo JSON organizado en 13 secciones. Cada sección corresponde a una subpestaña de la barra lateral de configuración del bot en el panel de administración, de modo que las claves JSON coinciden con las pestañas visibles: si modificas consent.humanSupportRequirePolicyAccept a través de la API, verás cambiar el mismo interruptor en la pestaña Consent & Privacy (Consentimiento y privacidad) en el panel de administración.
role: perfil del bot, prompt sin procesar, longitud de respuesta, idioma, contexto del sitio web/empresa (pestaña Role & Behavior)conversation: mensaje de bienvenida, refinamiento de consultas, continuidad de la conversación, interruptor de valoración + mensajes emergentes (tooltips), contenido de preguntas sugeridas + seguimiento dinámico (pestaña Chat Conversation)chatMemory: interruptor de memoria del chat, prompts de resumen, asignación de contexto (pestaña Summaries & Memory)appearance: colores, textos, dimensiones, CSS personalizado, pantalla de bienvenida, estilo de preguntas sugeridas, comportamiento de apertura automática, simulación de escritura humana, markdown del pie de página (pestaña Appearance)humanSupport: formulario de contacto humano (pestaña Human Contact Form)leadCollection: formulario de captación de clientes potenciales (pestaña Lead Collection)liveChat: transferencia a chat en vivo (pestaña Live Chat)consent: los cuatro interruptores de consentimiento de la política de privacidad junto con los textos de la pantalla de consentimiento (pestaña Consent & Privacy)whiteLabel: ocultar logotipo, enlace personalizado del logotipo, alojamiento en dominio personalizado (pestaña Whitelabel)security: dominios permitidos, filtro de spam, límites de tasa de conversación (pestaña Security)voice: entrada de voz y conversaciones por voz: modelo, voz, idiomas, prompt, límite de duración (pestaña Voice Conversation)multilingual: modo multilingüe, idioma base, idiomas ofrecidos, gestión del idioma del contenido (pestaña Languages)advanced: modelo LLM, temperatura, tamaño de contexto, límite de mensajes del bot, configuración regional interna, Offer Cards (pestaña Model & Advanced)
Solo name se sitúa en el nivel superior, ya que identifica al bot en lugar de pertenecer a una pestaña en particular.
La barra lateral de configuración del bot incluye actualmente 15 subpestañas, y 13 de ellas corresponden a las secciones indicadas arriba. Las dos subpestañas que no cuentan con una sección equivalente son Flow y Actions, ambas descritas más adelante en la sección "Fuera del alcance de la API". Las 13 que sí tienen correspondencia son Appearance, Chat Conversation, Role & Behavior, Human Contact Form, Lead Collection, Live Chat, Whitelabel, Consent & Privacy, Security, Model & Advanced, Summaries & Memory, Voice Conversation y Languages.
El cuerpo de la solicitud y el de la respuesta comparten la misma estructura. La respuesta añade dos elementos adicionales:
meta: de solo lectura: ID del bot y marcas de tiempo. Elimínalo para transformar una respuesta GET en un cuerpo POST válido.apiKey: presente únicamente en la creación: la clave de la Bot Talk API recién generada para el nuevo bot.
Dos campos dentro de la estructura compartida son de solo lectura: se devuelven en la respuesta y se ignoran si intentas enviarlos mediante POST/PATCH:
appearance.avatarUrl: URL pública completa de la imagen de avatar del bot (por ejemplo,https://api.chatlab.com/aichat/content/avatar_xyz.png). Realiza una solicitud GET directa para descargar los bytes. Para modificarla, sube un nuevo archivo a través de la parte multiparteavatar(consulta PATCH).whiteLabel.whitelabelLogoUrl: URL pública completa del logotipo de encabezado de marca blanca. Sigue el mismo patrón queavatarUrl. Para modificarla, sube un nuevo archivo a través de la parte multipartewhitelabel_logo(consulta PATCH).
Ambas URL utilizan el esquema, host y ruta de contexto de la solicitud actual; por lo tanto, en un dominio personalizado de marca blanca se devolverán vinculadas a la raíz de dicho dominio (por ejemplo, https://api.acme.com/aichat/content/...).
Envía null en una sección para omitirla en un PATCH; envía null en un campo específico dentro de una sección para omitir únicamente ese campo. Un valor null a nivel de campo nunca borra un valor almacenado; solo indica "no modificar".
Configuración del rol y construcción del prompt
El prompt del sistema que realmente recibe el LLM se construye de dos maneras distintas según el valor de role.role. Saber en qué caso te encuentras te indicará qué campos se aplican y cuáles se almacenan pero se ignoran.
Caso A: role.role es CUSTOMER_SUPPORT, SALES o LEAD_COLLECTION_AGENT (basado en plantilla)
El backend genera el prompt a partir de una plantilla integrada e ignora por completo role.rawPrompt (el valor sigue guardado en el bot, pero no se utiliza). La plantilla incorpora:
role.role: etiqueta de rol (por ejemplo, "Customer Support") e instrucciones específicas del rol añadidas de forma automáticaname: nombre del bot, insertado en la frase inicialrole.language:"Auto Detect"configura el bot para que siga el idioma del usuario; cualquier otro valor (por ejemplo,"English","Polish") se convierte en "Output in {language}, unless user uses another language"role.responseLength: vinculado a un objetivo de palabras aproximado:Concise≈ 50 palabras,Normal≈ 100,Detailed≈ 200role.websiteAddress: opcional; cuando no está en blanco, se añade como "for the users of the website {url}"role.companyDescription: opcional; cuando no está en blanco, se añade como un párrafo introductorio adicional antes de las instrucciones del rol
Este es el método recomendado para la mayoría de los bots: obtienes un comportamiento ajustado al rol y medidas de seguridad integradas sin esfuerzo adicional.
Caso B: role.role es CUSTOM (prompt proporcionado por el usuario)
El backend utiliza role.rawPrompt de forma literal como prompt completo del sistema. Los campos responseLength, language, websiteAddress y companyDescription se guardan pero no se insertan en el prompt; si deseas que alguno influya en el comportamiento del bot, debes incluirlo manualmente dentro del texto de tu rawPrompt. Tampoco se añaden instrucciones de tono ni restricciones de seguridad automáticas del rol; tú defines el prompt por completo.
Utiliza CUSTOM únicamente si el prompt generado mediante plantilla no se adapta a tu caso de uso (por ejemplo, si requieres una personalidad muy específica de un sector, tus propias medidas de seguridad o un formato de salida no estándar).
Campos de enumeración o conjunto cerrado
Diversos campos admiten únicamente un conjunto fijo de valores de cadena. Enviar un valor fuera de esta lista provocará el rechazo con un error 400 validation_failed y la ruta del campo en error.param. Los valores distinguen entre mayúsculas y minúsculas.
role.role:CUSTOMER_SUPPORT,SALES,LEAD_COLLECTION_AGENT,CUSTOMrole.responseLength:Concise,Normal,Detailedrole.language: nombre completo del idioma en inglés tal como aparece en el menú desplegable del panel de administración; por ejemplo,Auto Detect,English,Polish,Spanish,German,French,Italian,Portuguese,Dutch,Russian,Chinese (Simplified),Japanese,Arabic,Hindi, entre otros ~80. El valor se guarda de forma literal y se inserta en la plantilla del prompt, por lo que los códigos ISO de dos letras (en,pl) y otros valores fuera de la lista no son rechazados por la API, pero generan una instrucción errónea como "Output in en, unless...". El valor por defecto al crear el bot esAuto Detectsi se omite.advanced.model: consulta la sección "Modelos de texto de IA" más abajo; el conjunto disponible depende de los límites de tu cuenta, y cualquier valor no admitido devolverá un error400 invalid_parameteradvanced.chatContextSize:8000,16000,32000. Sujeto a los límites de tu cuenta; los valores que los superen se reducirán automáticamente al máximo permitidochatMemory.clientSummaryPromptType:DEFAULT,CUSTOMchatMemory.conversationSummaryPromptType:DEFAULT,CUSTOMappearance.chatAlignment:left,rightappearance.minimizedDisplayMode:icon,minifiedappearance.chatMessageLinkTarget:_blank,_selfleadCollection.requireBeforeNewConversation: selector booleano.trueobliga al usuario a completar el formulario de captación antes de iniciar una conversación;falsepermite que la IA determine el momento adecuado para mostrar el formulario (por defecto).
Campos estructurados y rangos
Campos que parecen cadenas o números simples, pero que en realidad presentan formatos particulares, rangos o particularidades del panel de administración que conviene conocer.
-
advanced.temperature: el rango permitido es de0.0a1.0, coincidiendo con el control deslizante del panel de administración. Los valores fuera de este rango se rechazan con400 validation_failed. -
chatMemory.summariesToKnowledgeRatio: porcentaje entero de10-90en pasos de10. Determina qué proporción del contexto del chat se reserva para los resúmenes históricos del usuario frente al resto (base de conocimientos, conversación en curso, instrucciones). Valor por defecto:50. Los valores fuera del rango10-90se rechazan con400 validation_failed. Solo se aplica sichatMemory.enabled=trueYchatMemory.summaryConversationsEnabled=true. -
liveChat.schedule: JSON codificado como una cadena de texto, no un objeto JSON anidado en el envío. El servidor guarda la cadena tal cual; el panel de administración la analiza en el cliente al procesar el editor de horarios. Una vez interpretada, la cadena consta de una entrada por cada día de la semana más una clavetimezone:- cada clave de día (
monday-sunday) se asigna a{enabled: boolean, from: "H:MM", to: "H:MM"}en formato de 24 horas timezonees un nombre de zona horaria de IANA (por ejemplo,"Europe/Warsaw","America/New_York")
Ejemplo de valor (observa las comillas exteriores y las comillas interiores escapadas; se trata de un único campo de texto, no de un objeto anidado):
"{\"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\"}"Fuera del horario especificado, se muestra
liveChat.outOfHoursMessageal visitante y se desactiva la transferencia al chat en vivo. La validación interna de este formato solo se realiza en el panel de administración del lado del cliente: la API aceptará como simple texto cualquier JSON con errores o claves desconocidas, lo que generará un fallo visual cuando un usuario acceda más tarde al bot en el panel. Comprueba la estructura por tu cuenta antes de enviarla. - cada clave de día (
-
conversation.positiveRatingTooltip/conversation.negativeRatingTooltip: etiquetas breves mostradas en los botones de 👍 / 👎 junto a cada respuesta de la IA cuandoconversation.conversationRatingEnabled=true. El texto por defecto es "I like the response" / "I don't like the response". Visibles para los usuarios finales. -
whiteLabel.hideRoboAssistLogo: función de White Label, sujeta a los límites de tu cuenta. Oculta el texto "Powered by ChatLab" del pie de página. Si tu cuenta no incluye la opción de marca blanca, el valor se almacena pero se ignora, mostrando siempre el pie de página. -
whiteLabel.whitelabelLogoLink: función de White Label, sujeta a los límites de tu cuenta. URL de destino al hacer clic en el logotipo personalizado cuandohideRoboAssistLogo=truey se ha subido un logotipo personalizado mediante la sección multipartewhitelabel_logo. -
appearance.simulateHumanTypingDelay: en segundos (no en milisegundos), número entero de0-200. Pausa entre mensajes sucesivos del bot cuandosimulateHumanTyping=true. Valor por defecto:5. -
appearance.autoOpenChatDelaySeconds: en segundos, número entero. Tiempo de espera antes de que el widget se abra de forma automática cuandoautoOpenChat=trueyautoOpenChatDelay=true. -
advanced.internalLocale: código de región e idioma según el formato IETFll_CC(con guion bajo, NOll-CCcon guion). Los valores válidos corresponden a una lista cerrada de ~95 configuraciones regionales:en_US,pl_PL,de_DE,fr_FR,es_ES,it_IT,pt_PT,nl_NL,ru_RU,zh_CN,zh_TW,ja_JP,ko_KR,ar_SA,hi_IN,tr_TR,cs_CZ,da_DK,fi_FI,sv_SE,no_NO,el_GR,he_IL, entre muchas otras. Enviar únicamente un código de dos letras ("en") o en formato BCP-47 ("en-US") no está admitido. Valor por defecto:en_US. Esta configuración regional determina el formato de fechas y números en la interfaz del widget, independientemente derole.language(el idioma en el que responde el bot). -
security.talkMessagesRateLimit/security.talkMessagesRateLimitDurationSeconds: números enteros (enviar como números JSON, por ejemplo30, no"30").0desactiva el límite de tasa por dirección IP. Cuando es distinto de cero, el widget restringe el número de mensajes permitidos dentro del intervalo en segundos antes de mostrar al visitante el mensaje configurado ensecurity.talkMessagesRateLimitHitMessage. -
advanced.botMessagesLimit: número entero (número JSON, por ejemplo1000).0equivale a "sin límite"; en cualquier otro caso debe ser un múltiplo de 1000 (1000,2000,10000, ...). Valores como100o1500se rechazan con400 validation_failed. Además, el valor se ajustará automáticamente si excede el límite asignado a tu cuenta.
Modelos de texto de IA (advanced.model)
Envía el valor exacto de la API (columna izquierda entre comillas invertidas). El nombre mostrado en el panel de administración se indica entre paréntesis. Los límites de tu cuenta determinan cuáles están disponibles; si envías un modelo no habilitado para tu cuenta, recibirás un error 400 invalid_parameter. El modelo predeterminado para bots nuevos es 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)
Referencia de campos (esquema completo de la solicitud)
Cada campo enviado en la red, con su tipo, restricción y descripción en una línea. Semántica de PATCH: cualquier campo omitido (o enviado como null) deja intacto el valor guardado. Se utiliza la misma estructura para la respuesta (menos el contenido binario multipart; más el bloque meta de solo lectura en cada respuesta y apiKey únicamente en la respuesta de creación).
Nivel superior
| Field | Type | Constraint | Description |
|---|---|---|---|
name |
string | max 150, required on create | Nombre visible del bot |
role |
object | Consulta § role | |
conversation |
object | Consulta § conversation | |
chatMemory |
object | Consulta § chatMemory | |
appearance |
object | Consulta § appearance | |
humanSupport |
object | Consulta § humanSupport | |
leadCollection |
object | Consulta § leadCollection | |
liveChat |
object | Consulta § liveChat | |
consent |
object | Consulta § consent | |
whiteLabel |
object | Consulta § whiteLabel | |
security |
object | Consulta § security | |
advanced |
object | Consulta § advanced |
Adiciones solo en la respuesta:
meta: { id, createdAt, updatedAt }- solo lectura.apiKey- string, presente únicamente en la respuesta dePOST /v1/management/bots- la clave Bot Talk recién generada para el nuevo bot, devuelta exactamente una vez.
§ role
| Field | Type | Constraint | Description |
|---|---|---|---|
role |
string (enum) | CUSTOMER_SUPPORT, SALES, LEAD_COLLECTION_AGENT, CUSTOM |
Ajuste predefinido del rol; selecciona la plantilla de prompt (consulta "Role and prompt construction") |
language |
string | full English language name (English, Polish, ...) or Auto Detect |
Idioma principal introducido en la plantilla de prompt |
responseLength |
string | ∈ {Concise, Normal, Detailed} |
Nivel de detalle deseado en la respuesta de la IA |
websiteAddress |
string | Sitio web utilizado para el contexto del prompt | |
companyDescription |
string | Descripción de la empresa utilizada para el contexto del prompt | |
rawPrompt |
string | Prompt del sistema personalizado - se utiliza literalmente solo cuando role=CUSTOM |
§ conversation
| Field | Type | Constraint | Description |
|---|---|---|---|
welcomeMessage |
string | Primer mensaje mostrado al visitante al abrir el chat | |
queryRefinementEnabled |
boolean | Si es true, perfecciona la pregunta del visitante antes de la recuperación RAG | |
conversationContinuityEnabled |
boolean | Si es true, los visitantes que regresan reanudan su última conversación | |
conversationRatingEnabled |
boolean | Si es true, muestra la calificación con pulgares arriba/abajo en los mensajes del bot | |
positiveRatingTooltip |
string | Información sobre herramientas en el botón de calificación positiva | |
negativeRatingTooltip |
string | Información sobre herramientas en el botón de calificación negativa | |
suggestedQuestions |
string | Preguntas sugeridas separadas por saltos de línea / iniciadores de conversación | |
dynamicSuggestedFollowups |
boolean | Si es true, la IA propone sugerencias de seguimiento después de cada respuesta | |
dynamicFollowupsAutoIcons |
boolean | Si es true, la IA selecciona automáticamente iconos de emoji para los seguimientos dinámicos |
§ chatMemory
| Field | Type | Constraint | Description |
|---|---|---|---|
enabled |
boolean | Interruptor principal para la función de memoria de chat | |
summaryConversationsEnabled |
boolean | Guardar resúmenes por conversación | |
conversationSummaryPrompt |
string | Prompt personalizado utilizado para resumir cada conversación | |
conversationSummaryPromptType |
string (enum) | ∈ {DEFAULT, CUSTOM} |
Indica si se debe utilizar el prompt de resumen predeterminado o personalizado |
clientSummaryPrompt |
string | Prompt personalizado utilizado para resumir al cliente a lo largo de las conversaciones | |
clientSummaryPromptType |
string (enum) | ∈ {DEFAULT, CUSTOM} |
Prompt de perfil de cliente predeterminado frente a personalizado |
summariesToKnowledgeRatio |
int | 10-90, step 10 |
% de la ventana de contexto del chat asignado a resúmenes frente al conocimiento RAG |
§ appearance
| Field | Type | Constraint | Description |
|---|---|---|---|
launcherColor |
string (hex) | Color de fondo del lanzador (icono de chat) | |
headerColor |
string (hex) | Color de fondo del encabezado del chat | |
titleColor |
string (hex) | Color del título del encabezado del chat | |
subtitleColor |
string (hex) | Color del subtítulo del encabezado del chat | |
clientMessageBubbleColor |
string (hex) | Color de la burbuja del mensaje del visitante | |
clientMessageTextColor |
string (hex) | Color del texto del mensaje del visitante | |
responseMessageBubbleColor |
string (hex) | Color de la burbuja de respuesta del bot | |
responseMessageTextColor |
string (hex) | Color del texto de respuesta del bot | |
chatSubheader |
string | Lema mostrado debajo del título del chat | |
senderPlaceholder |
string | Texto de marcador de posición en el campo de entrada del mensaje | |
resetConversationTooltip |
string | Información sobre herramientas en el botón "reset conversation" (reiniciar conversación) | |
chatAlignment |
string (enum) | ∈ {left, right} |
En qué lado de la pantalla se ancla el chat |
launcherBottomMargin |
int | 0-500 |
Distancia del lanzador desde el borde inferior (px) |
launcherSideMargin |
int | 0-500 |
Distancia del lanzador desde el borde lateral (px) |
displayShadow |
boolean | Sombra paralela debajo del widget | |
customCss |
string | CSS en bruto inyectado en el iframe del widget | |
chatMessageLinkTarget |
string (enum) | ∈ {_blank, _self} |
Cómo se abren los enlaces dentro de los mensajes del bot |
minimizedDisplayMode |
string (enum) | ∈ {icon, minified} |
Estado minimizado: icono de lanzador o barra de envío compacta |
chatDesktopWidthPx |
int | Ancho del widget en escritorio | |
chatDesktopHeightPx |
int | Altura del widget en escritorio | |
chatMobileSizePercent |
int | Tamaño del widget en móviles como % de la ventana gráfica | |
messageFontSize |
int | Tamaño de fuente del texto del mensaje (px) | |
showChatbotBubblesDesktop |
boolean | Mostrar las burbujas flotantes de llamada de atención en escritorio | |
showChatbotBubblesMobile |
boolean | Mostrar las burbujas flotantes de llamada de atención en móviles | |
chatbotBubblesDelaySeconds |
int | Retraso antes de que aparezcan las burbujas flotantes (segundos) | |
launcherIconFullSize |
boolean | Renderizar el icono del lanzador personalizado de borde a borde en lugar de insertado | |
welcomeScreenEnabled |
boolean | Mostrar la pantalla de bienvenida en lugar de ir directamente al chat | |
welcomeScreenQuestionsLabel |
string | Etiqueta sobre las preguntas sugeridas en la pantalla de bienvenida | |
welcomeScreenHideHumanContactForm |
boolean | Ocultar la acción del formulario de contacto humano en el encabezado mientras se muestra la pantalla de bienvenida. Reaparece después del primer mensaje del visitante. Los bots creados antes del 2026-09-02 tienen el valor predeterminado true |
|
welcomeScreenHideLiveChat |
boolean | Ocultar la acción de Live Chat en el encabezado mientras se muestra la pantalla de bienvenida. Reaparece después del primer mensaje del visitante. Los bots creados antes del 2026-09-02 tienen el valor predeterminado true |
|
headerActionsLayout |
string | DROPDOWN |
Cómo se ofrecen el chat en vivo y el formulario de contacto humano en el encabezado del chat: ICONS (un icono separado para cada uno) o DROPDOWN (agrupados en el menú del encabezado). Los bots creados antes del 2026-09-02 tienen el valor predeterminado ICONS |
stackSuggestedQuestions |
boolean | Apilar las preguntas sugeridas verticalmente (frente a lado a lado) | |
suggestedQuestionsFontSize |
int | Tamaño de fuente de las etiquetas de preguntas sugeridas (px) | |
suggestedQuestionsTextColor |
string (hex) | Color del texto de las etiquetas de preguntas sugeridas | |
suggestedQuestionsBackgroundColor |
string (hex) | Color de fondo de las etiquetas de preguntas sugeridas | |
autoOpenChat |
boolean | Abrir automáticamente el chat en escritorio | |
autoOpenChatOnMobiles |
boolean | Abrir automáticamente el chat en móviles | |
autoOpenChatDelay |
boolean | Usar un retraso antes de la apertura automática | |
autoOpenChatDelaySeconds |
int | Retraso de la apertura automática (segundos) | |
simulateHumanTyping |
boolean | Dividir la respuesta del bot en burbujas con animación de escritura | |
simulateHumanTypingDelay |
int | 0-200 |
Retraso entre los mensajes en burbuja (segundos) |
footerMarkdown |
string | max 255 | Markdown personalizado en el pie de página que se muestra debajo del chat |
avatarUrl |
string | read-only | URL pública completa del avatar; para cambiarla, súbela a través de la parte multipart avatar |
Multipart en POST/PATCH: avatar (parte de archivo). Los cuerpos de respuesta GET omiten el contenido del archivo; solo la URL se envía por la red.
§ humanSupport
| Field | Type | Constraint | Description |
|---|---|---|---|
enabled |
boolean | Interruptor del flujo de asistencia humana | |
email |
string | required (create-strict) when enabled=true |
Dirección que recibe los correos de asistencia humana |
dialogMessage |
string | Mensaje motivador mostrado sobre el formulario | |
thankYouMessage |
string | Confirmación mostrada después del envío | |
emailMessageSubjectTemplate |
string | Plantilla de asunto para el correo electrónico enviado al agente | |
emailMessageContentTemplate |
string | Plantilla de cuerpo para el correo electrónico enviado al agente | |
emailPlaceholder |
string | Marcador de posición en el campo de correo electrónico | |
messagePlaceholder |
string | Marcador de posición en el área de texto del mensaje | |
emailWithConversationContent |
boolean | Si es true, incluye la transcripción de la conversación en el cuerpo del correo | |
customFormId |
long | id of an existing custom form | Reemplaza el formulario de contacto integrado por un formulario personalizado. null conserva el formulario integrado |
customFormMapping |
string | JSON-encoded string | Asigna los campos del formulario personalizado a los campos de correo de asistencia humana |
requirePolicyAccept se encuentra en consent.humanSupportRequirePolicyAccept, no aquí.
§ leadCollection
| Field | Type | Constraint | Description |
|---|---|---|---|
enabled |
boolean | Interruptor del formulario de clientes potenciales | |
nameEnabled |
boolean | Recopilar nombre | |
nameLabel |
string | Etiqueta en el campo del nombre | |
emailEnabled |
boolean | Recopilar correo electrónico | |
emailLabel |
string | required (create-strict) when enabled=true AND emailEnabled=true |
Etiqueta en el campo del correo electrónico |
phoneEnabled |
boolean | Recopilar teléfono | |
phoneLabel |
string | required (create-strict) when enabled=true AND phoneEnabled=true |
Etiqueta en el campo del teléfono |
leaveDetailsMessage |
string | required (create-strict) when enabled=true |
Mensaje que anima al visitante a dejar sus datos |
thankYouMessage |
string | required (create-strict) when enabled=true |
Confirmación mostrada después del envío |
requireBeforeNewConversation |
boolean | Si es true, el formulario debe enviarse antes de iniciar el chat; si es false, la IA decide cuándo mostrar el formulario |
|
emailNotificationEnabled |
boolean | Enviar un correo al propietario cada vez que se recopila un cliente potencial | |
emailNotificationAddress |
string | Destinatario de la notificación (por defecto es el correo de la cuenta) | |
emailWithConversationContent |
boolean | Si es true, incluye la transcripción de la conversación en la notificación |
Regla estricta de creación entre campos: enabled=true requiere al menos uno de emailEnabled o phoneEnabled. requirePolicyAccept se encuentra en consent.leadCollectionRequirePolicyAccept, no aquí.
| customFormId | long | id of an existing custom form | Reemplaza el formulario de captación de clientes potenciales integrado por un formulario personalizado. null conserva el formulario integrado |
| customFormMapping | string | JSON-encoded string | Asigna los campos del formulario personalizado a nombre / correo electrónico / teléfono |
§ liveChat
| Field | Type | Constraint | Description |
|---|---|---|---|
enabled |
boolean | Interruptor de la función Live Chat | |
infoMessage |
string | Mensaje explicativo antes de la transferencia | |
startMessage |
string | Mensaje mostrado cuando comienza la sesión en vivo | |
endMessage |
string | Mensaje mostrado cuando finaliza la sesión en vivo | |
nameLabel |
string | Etiqueta en el campo del nombre en el formulario previo a Live Chat | |
emailLabel |
string | Etiqueta en el campo del correo electrónico en el formulario previo a Live Chat | |
schedule |
string | JSON-encoded string (weekday toggles + from/to + timezone) |
Horario de atención del chat en vivo - consulta "Structured fields and ranges" para conocer el formato exacto |
outOfHoursMessage |
string | Mensaje mostrado cuando el horario indica que estamos fuera de servicio | |
closeModalMessage |
string | Título del modal "¿cerrar chat en vivo?" | |
closeModalConfirmLabel |
string | Etiqueta del botón de confirmación en el modal de cierre | |
closeModalCancelLabel |
string | Etiqueta del botón de cancelación en el modal de cierre | |
closeModalTooltipText |
string | Información sobre herramientas en el elemento para cerrar el chat | |
operatorHasJoinedLabel |
string | Etiqueta mostrada cuando un operador se une | |
operatorDidNotJoinInTimeLabel |
string | Etiqueta mostrada cuando ningún operador se une dentro del tiempo de espera | |
waitingForOperatorToJoinLabel |
string | Etiqueta mostrada mientras se espera a un operador | |
waitingForOperatorSeconds |
int | Tiempo de espera para que un operador responda (segundos) | |
redirectToHumanSupportForm |
boolean | Si es true, redirige al formulario de asistencia humana cuando ningún operador responde | |
missedEmailEnabled |
boolean | default true |
Envía un correo al propietario del bot cuando una solicitud de chat en vivo no fue atendida. No se define en bots antiguos, lo cual se interpreta como habilitado |
requirePolicyAccept se encuentra en consent.liveChatRequirePolicyAccept, no aquí.
§ consent
| Field | Type | Constraint | Description |
|---|---|---|---|
newConversationRequirePolicyAccept |
boolean | Requerir el consentimiento de la política de privacidad antes de iniciar una nueva conversación | |
humanSupportRequirePolicyAccept |
boolean | Requerir el consentimiento de la política de privacidad antes de enviar el formulario de asistencia humana | |
leadCollectionRequirePolicyAccept |
boolean | Requerir el consentimiento de la política de privacidad antes de enviar el formulario de captación de clientes potenciales | |
liveChatRequirePolicyAccept |
boolean | Requerir el consentimiento de la política de privacidad antes de iniciar una sesión de chat en vivo | |
newConversationConsentDescription |
string | Texto introductorio para la pantalla de consentimiento al inicio de la conversación | |
privacyPolicyConsentCheckboxLabel |
string | Etiqueta junto a la casilla de consentimiento (normalmente contiene un enlace a la política de privacidad) |
§ whiteLabel
| Field | Type | Constraint | Description |
|---|---|---|---|
hideRoboAssistLogo |
boolean | white-label capability; subject to account limits | Ocultar el logotipo predeterminado de ChatLab en el pie de página |
whitelabelLogoLink |
string | white-label capability; subject to account limits | URL a la que enlaza el logotipo personalizado del pie de página |
assignToCustomDomain |
boolean | gated by CUSTOM_DOMAIN feature |
Alojar el chat en el dominio personalizado configurado |
whitelabelLogoUrl |
string | read-only | URL pública completa del logotipo de White Label; para cambiarlo, súbelo a través de la parte multipart whitelabel_logo |
Multipart en POST/PATCH: whitelabel_logo (parte de archivo). Los cuerpos de respuesta GET omiten el contenido del archivo; solo la URL se envía por la red.
§ security
| Field | Type | Constraint | Description |
|---|---|---|---|
allowedDomains |
string | Lista separada por comas de dominios autorizados para insertar el widget (vacío = sin lista blanca) | |
spamFilterEnabled |
boolean | Habilitar el filtro de spam por bot en los mensajes entrantes | |
countryFilterMode |
string | BLACKLIST or WHITELIST |
Cómo se interpretan las listas de países. Las listas en sí quedan restringidas solo para administradores |
talkMessagesRateLimit |
int | >= 0; 0 disables |
Cantidad máxima de mensajes de usuario permitidos en la ventana de límite de frecuencia |
talkMessagesRateLimitDurationSeconds |
int | >= 0 |
Duración de la ventana de límite de frecuencia (segundos) |
talkMessagesRateLimitHitMessage |
string | Mensaje mostrado al visitante cuando se alcanza el límite de frecuencia |
§ voice
| Field | Type | Constraint | Description |
|---|---|---|---|
inputEnabled |
boolean | Permitir al visitante dictar mensajes (voz a texto) | |
conversationEnabled |
boolean | requires the voice feature on the plan | Habilitar conversaciones completas por voz |
voiceId |
string | provider-specific voice id (e.g. alloy) |
Qué voz sintética habla |
model |
string | e.g. GPT-REALTIME-MINI, GEMINI-LIVE, ELEVENLABS-* |
Modelo de voz. Se factura por minuto, las tarifas varían según el modelo |
turnDetection |
string | provider-specific | Modo de alternancia de turnos |
audioPrompt |
string | Prompt del sistema adicional utilizado únicamente para los turnos de voz | |
welcomeMessage |
string | Frase de apertura hablada | |
language |
string | language code | Idioma de voz principal |
additionalLanguages |
string | comma-separated language codes | Idiomas adicionales que admite el agente de voz |
maxDurationSeconds |
int | Límite máximo para una sola conversación de voz | |
maxDurationMessage |
string | Mensaje mostrado cuando se alcanza el límite |
§ multilingual
| Field | Type | Constraint | Description |
|---|---|---|---|
enabled |
boolean | Interruptor del modo multilingüe | |
mode |
string | AUTODETECT or a fixed-list mode |
Cómo elige el bot el idioma de respuesta |
baseLanguage |
string | language code | Idioma en el que está redactado el texto propio del bot |
languages |
string | comma-separated language codes | Idiomas ofrecidos al visitante |
knowledgeLanguageMode |
string | Cómo se trata el conocimiento en otros idiomas | |
knowledgeLanguageFallback |
string | language code | Idioma utilizado cuando no se encuentra ninguna coincidencia |
§ advanced
| Field | Type | Constraint | Description |
|---|---|---|---|
model |
string | subject to account limits; see "AI text models" above | Identificador de LLM (por ejemplo, 5-MINI) |
temperature |
decimal | 0.0-1.0 |
Temperatura de muestreo (coincide con el control deslizante de la interfaz) |
chatContextSize |
int | ∈ {8000, 16000, 32000}; silently clamped to your account limit |
Ventana de tokens para el historial de chat |
botMessagesLimit |
long | 0 or multiple of 1000 (e.g. 1000, 2000, 10000) |
Respuestas máximas del bot por conversación (0 = sin límite) |
internalLocale |
string | locale code in ll_CC form |
Configuración regional para las etiquetas de la interfaz del widget (diferente de role.language) |
productsViewEnabled |
boolean | Si es true, muestra las Offer Cards de e-commerce dentro del chat | |
includeProductsInKnowledgeBase |
boolean | Si es true, indexa el catálogo de productos como parte de la base de conocimiento |
Fuera del alcance de la API
La interfaz de usuario del panel de administración muestra algunas áreas que intencionadamente no están expuestas en esta versión de la Management API:
- Pestaña Flow (Flujo) - el editor visual Conversation Flow (etapas y transiciones). No está expuesto a través de la Management API.
- Pestaña Actions (Acciones) - integraciones gestionadas de e-commerce / reservas, AI Search y funciones de API personalizadas. La llamada a herramientas nunca ha formado parte de la Management API.
- El creador de formularios personalizados en sí - la creación y edición de formularios personalizados no está expuesta. Sin embargo, puedes vincular un formulario existente a un bot a través de
leadCollection.customFormIdyhumanSupport.customFormId. - Iconos personalizados para abrir / cerrar el chat -
customLauncherIconVisible,openChatIcon,closeChatIcon. La API solo expone las partes multipart principalesavatarywhitelabel_logo. - Listas de IP y países - las entradas en sí son exclusivas para administradores. Solo se expone el modo de interpretación, a través de
security.countryFilterMode.
Endpoints
POST /v1/management/bots
Crea un nuevo bot. Se aceptan dos Content-Types equivalentes; elige el que te resulte más práctico.
Modo A - JSON simple (recomendado cuando no necesitas subir un avatar o logotipo en la misma solicitud):
Content-Type: application/json- El cuerpo de la solicitud es el JSON de configuración del bot (sin el contenedor
data) - Los archivos (avatar o logotipo) se pueden subir más adelante mediante un segundo
PATCHusando el modo B
Modo B - multipart/form-data (utilízalo cuando subas archivos en la misma solicitud):
Content-Type: multipart/form-data; boundary=...- Parte JSON
data(obligatoria,Content-Type: application/json) - configuración del bot en la estructura anidada descrita anteriormente - Parte de archivo
avatar(opcional) - imagen de avatar del bot - Parte de archivo
whitelabel_logo(opcional) - logotipo de White Label (se aplica solo si tu cuenta incluye White Label)
En el JSON solo es obligatorio el campo name; el resto de campos adoptan el mismo valor predeterminado que establecería el asistente de la interfaz de administración.
Cuerpo completo de la solicitud
Este es el JSON maximal de data, con todas las secciones completadas. Envía solo las secciones que te interesen; todo lo demás tomará los valores predeterminados.
{
"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
}
}
Reglas de validación con sus propios mensajes de error:
name- obligatorio, máximo 150 caracteresadvanced.temperature- entre0.0y1.0chatMemory.summariesToKnowledgeRatio- entero entre10y90(porcentaje, intervalos de10)appearance.launcherBottomMargin,appearance.launcherSideMargin- entre0y500appearance.footerMarkdown- máximo 255 caractereshumanSupport.enabled=truerequiere quehumanSupport.emailesté definidoleadCollection.enabled=truerequiere que al menos uno de los camposleadCollection.emailEnabledoleadCollection.phoneEnabledsea true; el canal activado requiere también su etiqueta correspondiente, además deleaveDetailsMessageythankYouMessage- Los campos con límite (
advanced.chatContextSize,advanced.botMessagesLimit, etc.) se ajustan automáticamente a los límites de tu cuenta
Los campos cuyo valor sea null en el servidor se omiten del cuerpo JSON; la transmisión solo incluye campos con valores distintos de null.
Cuerpo completo de la respuesta (201)
Misma estructura que la solicitud, más el bloque de solo lectura meta y la clave de un solo uso apiKey en el nivel superior. El servidor completa las URL de archivo de solo lectura (appearance.avatarUrl, whiteLabel.whitelabelLogoUrl) cuando se han subido las partes multipart correspondientes.
{
"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"
}
El campo apiKey aparece solo al crear el bot; es la clave de Bot Talk recién generada y vinculada al nuevo bot. El texto sin formato se muestra una sola vez y no se puede recuperar más tarde desde la API; guárdalo de inmediato por tu cuenta.
El encabezado de respuesta Location contiene la URL del nuevo bot (/v1/management/bots/{id}).
Ejemplos de Curl
Modo A - JSON simple (el más sencillo):
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!"}}'
Modo 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}
Devuelve la configuración actual de un bot de tu propiedad.
Ejemplo de Curl
curl https://api.chatlab.com/aichat/v1/management/bots/4287 \
-H "Authorization: Bearer mk_..."
Cuerpo completo de la respuesta (200)
Misma estructura que la respuesta de POST, sin el campo de un solo uso apiKey. Incluye el bloque meta. Devuelve 404 not_found_error si el bot no existe o no pertenece a tu cuenta.
El avatar actual y el logotipo de White Label se devuelven como URL de solo lectura completas (appearance.avatarUrl, whiteLabel.whitelabelLogoUrl), basadas en el mismo esquema + host + ruta de contexto que atendió esta solicitud. Obtén los bytes realizando una solicitud GET directa a esas URL; para sustituir cualquiera de los dos archivos, sube uno nuevo mediante la parte multipart avatar / whitelabel_logo en PATCH. Estos campos de URL se ignoran si se envían en el cuerpo de una solicitud.
{
"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"
}
}
Clonar un bot
El cuerpo de la solicitud de POST /v1/management/bots y el cuerpo de la respuesta de GET /v1/management/bots/{bot_id} comparten la misma estructura, por lo que la clonación es un proceso de tres pasos: obtener con GET el bot de origen, eliminar los campos de identidad gestionados por el servidor y enviar con POST el resultado.
1. GET del bot de origen.
curl https://api.chatlab.com/aichat/v1/management/bots/4287 \
-H "Authorization: Bearer mk_..." \
-o source-bot.json
2. Eliminar el bloque de nivel superior meta. El objeto meta (id, createdAt, updatedAt) es gestionado por el servidor y de solo lectura; dejarlo en el cuerpo del POST no causa ningún problema (el servidor lo ignora), pero eliminarlo hace que la intención sea explícita y mantiene limpia la carga útil. Si lo deseas, puedes editar name para distinguir el clon del origen.
jq 'del(.meta) | .name = "Helpdesk Bot (clone)"' source-bot.json > clone-body.json
3. POST del cuerpo limpio para crear el clon. Consulta la referencia de POST /v1/management/bots más arriba para conocer la estructura completa del cuerpo y las reglas de validación.
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 respuesta contiene el meta.id del nuevo bot junto con una apiKey recién generada (la clave de Bot Talk para el clon). El texto en claro de apiKey se devuelve solo en esta respuesta de creación; cópialo antes de descartar el cuerpo de la respuesta, ya que no se puede recuperar más tarde.
Dos advertencias:
- Los archivos no se clonan.
appearance.avatarUrlywhiteLabel.whitelabelLogoUrlson de solo lectura y apuntan a los archivos del bot de origen. Si necesitas el mismo avatar o logotipo de marca blanca en el clon, descarga los bytes desde las URL de origen y súbelos como partes multipartavatar/whitelabel_logo, ya sea en el POST de creación (Modo B) o en un PATCH posterior. - Las claves de Bot Talk no se clonan. Cada bot tiene su propio conjunto de claves de Bot Talk. La única
apiKeydevuelta por el POST de creación es la única que se genera automáticamente; crea claves adicionales desde la pestaña API del bot si las necesitas.
PATCH /v1/management/bots/{bot_id}
Actualiza uno o más campos de un bot que te pertenezca. Solo se modifican las secciones o campos presentes en el JSON; todo lo omitido (o enviado como null) se deja intacto. La semántica de actualización parcial se aplica por campo dentro de una sección enviada.
Se aceptan dos Content-Types equivalentes (igual que en POST):
Modo A - JSON simple (recomendado cuando solo se actualizan ajustes):
Content-Type: application/json- El cuerpo de la solicitud es el JSON de modificación (sin contenedor
data)
Modo B - multipart/form-data (utilízalo al subir archivos):
- Parte JSON
data(opcional) - la modificación. Envíala solo si deseas cambiar campos. Omítela por completo si solo quieres subir un avatar o un logotipo. - Parte de archivo
avatar(opcional) - reemplaza el avatar - Parte de archivo
whitelabel_logo(opcional) - reemplaza el logotipo de marca blanca (aplica solo si tu cuenta incluye White Label)
Las tres partes son opcionales en PATCH, pero al menos una debe estar presente para que la llamada tenga sentido.
Cuerpo de solicitud completo (superficie máxima)
Cualquier campo aceptado por POST /v1/management/bots también puede enviarse aquí. El ejemplo a continuación muestra la superficie completa; en la práctica, solo envías las claves que deseas cambiar (consulta "Actualización parcial mínima" más abajo); cada clave omitida (o enviada como null) deja el valor guardado intacto.
{
"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
}
}
Actualización parcial mínima
Modifica mediante PATCH un solo campo enviando exactamente las claves que deseas cambiar; todo lo demás se conserva.
{
"appearance": {
"launcherColor": "#abcdef"
}
}
Ejemplos de curl
Modo A - JSON simple (el más sencillo):
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"}}'
Modo B - multipart (al reemplazar avatar o logotipo):
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'
Modo B - reemplazar solo el avatar (sin cambios en los campos):
curl -X PATCH https://api.chatlab.com/aichat/v1/management/bots/4287 \
-H "Authorization: Bearer mk_..." \
-F 'avatar=@./new-avatar.png'
Cuerpo de la respuesta (200)
Misma estructura que GET /v1/management/bots/{bot_id}: la configuración completa del bot después de aplicar la modificación, incluido el bloque meta. Sin campo apiKey. Devuelve 404 not_found_error si el bot no existe o no pertenece a tu cuenta.
El siguiente ejemplo muestra la respuesta tras aplicar la modificación del Cuerpo de solicitud completo (superficie máxima) anterior al bot del ejemplo GET: los campos modificados reflejan los nuevos valores, los campos no modificados se conservan y meta.updatedAt se actualiza.
{
"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
Consulta el uso actual de la suscripción de la cuenta propietaria de la clave de Management.
Cuerpo de la respuesta (200)
{
"subscriptionType": "standard",
"messages": {"used": 4123, "limit": 11000, "remaining": 6877},
"bots": {"used": 3, "limit": 5, "remaining": 2}
}
subscriptionTypees un identificador en minúsculas del plan actual de la cuenta (por ejemplo,standarden el ejemplo). Los planes provienen de un catálogo dinámico, por lo que el conjunto exacto de identificadores puede variar con el tiempo a medida que se cambian de nombre o se añaden nuevos planes; trátalo como una cadena opaca, no como un enum fijo.messages.used/limit/remainingcorresponden a los créditos de mensajes del periodo de facturación actual.bots.used/limit/remainingcuantifican los bots activos respecto al límite de bots de tu cuenta.
Encabezados de límite de frecuencia
Las respuestas que llegan a la etapa de límite de frecuencia (es decir, cuando se superan la autenticación y la lista blanca de IP) incluyen:
X-RateLimit-Limit: 10
X-RateLimit-Remaining: 7
X-RateLimit-Reset: 1715430000
X-RateLimit-Limit- el límite por clave aplicado a esta llamada (10 por defecto, o turateLimitPerMinuteconfigurado si es menor).X-RateLimit-Remaining- tokens restantes en el depósito justo después de esta llamada.X-RateLimit-Reset- segundos en tiempo Unix epoch en los que el siguiente token estará disponible (no es un restablecimiento completo del depósito; el depósito se recarga de forma continua). Cuando el depósito está lleno, corresponde a la hora actual.
En las respuestas 429 rate_limit_exceeded, también se incluye Retry-After, expresado en segundos enteros hasta que se libere al menos un token.
Los errores previos a la autenticación (401 missing_api_key, 401 invalid_api_key, 403 ip_blocked) y 403 ip_not_whitelisted no incluyen los encabezados X-RateLimit-* - el limitador solo se consulta después de que la autenticación y las comprobaciones de IP se completan con éxito.
Formato de error
Misma estructura que Bot Talk API:
{
"error": {
"type": "permission_error",
"code": "key_type_not_allowed",
"message": "This endpoint requires a MANAGEMENT API key.",
"param": null
}
}
Los errores de validación usan code: "invalid_parameter" y anteponen la ruta del campo fallido al mensaje para que la sección con el error sea fácil de identificar:
{
"error": {
"type": "invalid_request_error",
"code": "invalid_parameter",
"message": "humanSupport.email Human support email is required when humanSupport.enabled=true"
}
}
Los valores no válidos para campos de enumeración o conjunto cerrado (por ejemplo, chatMemory.clientSummaryPromptType = "BOGUS") incluyen la ruta del campo, el valor rechazado y la lista de valores permitidos:
{
"error": {
"type": "invalid_request_error",
"code": "invalid_parameter",
"message": "chatMemory.clientSummaryPromptType 'BOGUS' is not a valid value. Allowed: CUSTOM, DEFAULT"
}
}
Relacionado
Para consultar los endpoints de conversación y la transmisión SSE, consulta la Bot Talk API.