external-api
Avisar que un escalamiento se resolvio
path Parameters
idAvisar que un escalamiento se resolvio › Request Body
resolutionQue se resolvio, en palabras. Queda escrito en la conversacion.
messageSi viene, se le manda al contacto por su canal. Si se omite, la resolucion solo queda registrada.
externalRefEl id del ticket de su lado. Con el, un reintento del mismo aviso no se procesa dos veces.
returnToAgentPor defecto el control vuelve al agente. false lo deja en manos de una persona.
Avisar que un escalamiento se resolvio › Responses
La conversacion, con alreadyResolved en true si ya estaba resuelta. Reintentar es seguro.
idEl id de la conversacion.
controlStatusQuien la tiene despues del aviso. Lo normal es agent: el control vuelve al agente. Queda como estaba (human o escalated) si una persona del equipo la tenia tomada, o si mandaste returnToAgent: false.
messageQueuedtrue si el mensaje al contacto quedo encolado. Encolado, no entregado: el transporte lo despacha despues.
alreadyResolvedtrue si este aviso ya se habia procesado antes. Reintentar es seguro.
Mandar un mensaje a la persona de una conversacion, sin que corra el agente
path Parameters
idMandar un mensaje a la persona de una conversacion, sin que corra el agente › Request Body
messageEl texto que le llega a la persona. No puede ser solo espacios.
externalRefEl id de este envio en su sistema. Un reintento con el mismo valor no manda el mensaje dos veces.
Mandar un mensaje a la persona de una conversacion, sin que corra el agente › Responses
El mensaje quedo guardado y encolado en el canal de la conversacion. Encolado, no entregado. alreadySent en true si esa externalRef ya habia enviado: reintentar es seguro.
idEl id de la conversacion.
messageIdEl id del mensaje que quedo guardado en la conversacion. En un reintento es el del primer envio.
alreadySenttrue si esa externalRef ya habia enviado un mensaje en esta conversacion y esta llamada no mando nada. Reintentar es seguro.
Ver el estado de una conversacion
path Parameters
idVer el estado de una conversacion › Responses
El estado de la conversacion.
idEl id de la conversacion.
nameNombre del contacto.
emailCorreo del contacto.
phoneTelefono del contacto.
statusEl estado del caso en el flujo.
controlStatusQuien la tiene: agent el agente, human una persona del equipo, escalated esperando que alguien la tome.
controlledByEl id de la persona que la tomo, cuando controlStatus es human.
assignedToEl id de la persona duena del caso. null si nadie lo tiene asignado.
escalatedAtescalationReasonPor que se escalo, si se escalo.
pipelineIdEl flujo en el que esta el caso.
pipelineNamecurrentStageIdcurrentStageNamelastMessageAtcreatedAtinboundNumberLabelLa etiqueta del numero de WhatsApp del negocio por el que entro. null si no entro por WhatsApp.
inboundNumberDisplayEse numero, como se muestra. null si no entro por WhatsApp.
Los campos del embudo ACTUAL del caso, en el orden en que se declararon. Un campo sensible no aparece: ni la clave, ni el valor.
Ver las conversaciones anteriores de la misma persona
path Parameters
idVer las conversaciones anteriores de la misma persona › Responses
Las conversaciones anteriores, la mas nueva primero.
conversationIdLa conversacion por la que se pregunto.
Las otras conversaciones de la misma persona en esta organizacion, de la mas nueva a la mas vieja. Hasta 50.
Escribir en el caso los datos que ya tiene tu sistema
path Parameters
idEscribir en el caso los datos que ya tiene tu sistema › Request Body
Las claves y valores a escribir. Las claves son las que declara el embudo, sin importar quien las llena. Los valores son texto; los vacios se rechazan porque borrarian el que ya estaba.
Escribir en el caso los datos que ya tiene tu sistema › Responses
Que claves entraron y cuales no. Que una clave se rechace no es un error: las demas se escribieron.
idEl id del caso.
guardadosLas claves que quedaron escritas en la ficha del contacto. Una clave que ya valia lo mismo vuelve aca igual: la llamada es idempotente y reintentarla no la saca de esta lista.
rechazadosLas claves que no entraron, por su nombre. Una clave cae aca si el embudo no la declara, si el valor venia vacio o no era texto, si no cumple el tipo del campo (un email sin arroba, por ejemplo), o si depende de otro campo que se rechazo en esta misma llamada. El "quien lo llena" NO limita esta puerta: cualquier clave declarada se puede escribir, la llene el equipo, el canal o el agente. No es un error: las demas si se escribieron.
Por que se rechazo cada clave de "rechazados" que no paso el tipo del campo. Solo trae las claves de esa causa: si una se rechazo por no estar declarada en el embudo, no aparece aca.
limpiadosLas claves que esta escritura BORRO de la ficha. Pasa cuando se escribe un campo del que dependen las opciones de otro (dependsOn en GET /pipelines/{id}) y el valor que el otro tenia ya no esta entre las validas para el valor nuevo: ese campo se limpia y hay que volver a pedirlo. No es un error, y las claves de aca no vuelven en "guardados" ni en "rechazados".
Mandar el caso a otro embudo
path Parameters
idMandar el caso a otro embudo › Request Body
pipelineEl embudo destino, por slug o por id.
stageLa etapa destino dentro de ese embudo, por slug o por id. Si se omite, el caso entra por la etapa de entrada del embudo. Una etapa que no sea de ese embudo es un 400: no se corrige sola.
Mandar el caso a otro embudo › Responses
Donde quedo el caso. movido en false si ya estaba ahi: reintentar es seguro.
idEl id del caso.
pipelineIdEl id del embudo en el que quedo.
pipelineSlugSu slug.
stageIdEl id de la etapa en la que quedo.
stageSlugSu slug.
movidofalse si el caso ya estaba en esa etapa, o sea que esta llamada no lo movio. Reintentar es seguro: no se reescribe ni se vuelve a avisar.
Dejar una nota interna en el chat de una conversacion
path Parameters
idDejar una nota interna en el chat de una conversacion › Request Body
textoEl texto de la nota. La ve solo el equipo. No puede ser solo espacios.
externalRefEl id de esta nota en su sistema. Un reintento con el mismo valor no deja la nota dos veces.
Dejar una nota interna en el chat de una conversacion › Responses
La nota quedo en el chat, visible solo para el equipo. Nunca se manda a la persona por ningun canal ni la lee el agente. alreadyCreated en true si esa externalRef ya habia dejado una nota: reintentar es seguro.
idEl id de la conversacion.
messageIdEl id de la nota. Es el mismo con que aparece en GET /conversations/{id}/messages?incluirNotas=true. En un reintento es el de la primera.
createdAtalreadyCreatedtrue si esa externalRef ya habia dejado una nota en esta conversacion y esta llamada no dejo ninguna. Reintentar es seguro.
Abrir una conversacion con un agente
path Parameters
slugAbrir una conversacion con un agente › Request Body
externalIdEl id de esta conversacion en su sistema, unico en la organizacion. Si ya existe, se devuelve esa conversacion.
contactNamecontactEmailcontactPhoneAbrir una conversacion con un agente › Responses
La conversacion, nueva o la que ya existia para ese externalId. Es idempotente por externalId.
conversationIdEl id de la conversacion. Es lo que va en la URL para mandar y leer mensajes.
agentSlugEl agente que la atiende.
createdtrue si se abrio en esta llamada; false si ese externalId ya tenia una conversacion y se devolvio esa. Un reintento la ve en false.
Leer los mensajes de una conversacion
path Parameters
idquery Parameters
incluirNotastrue para recibir tambien las notas internas del chat, con role internal_note y su autor. Sin esto el hilo es solo la conversacion con la persona.
Leer los mensajes de una conversacion › Responses
El hilo de la conversacion.
conversationIdDel mas viejo al mas nuevo.
Mandar un mensaje y recibir la respuesta
path Parameters
idMandar un mensaje y recibir la respuesta › Request Body
messageexternalRefEl id de este mensaje en su sistema. Un reintento con el mismo valor no guarda el mensaje dos veces ni hace contestar al agente otra vez: devuelve lo que paso con el primero. Mandenlo siempre.
Mandar un mensaje y recibir la respuesta › Responses
La respuesta del agente.
conversationIdstatusanswered: el agente contesto y la respuesta viene en response (HTTP 200). pending: se vencio el techo de espera y la respuesta se escribe despues; se lee con GET /conversations/{id}/messages (HTTP 202). human: alguien del equipo tomo la conversacion, el mensaje le llego a esa persona y el agente no contesta (HTTP 200).
responseLo que contesto el agente. Solo viene cuando status es answered.
alreadySenttrue si ese externalRef ya habia llegado en esta conversacion: el mensaje no se guardo otra vez y la respuesta es la del primero. Reintentar es seguro.
Crear o reemplazar un documento de conocimiento
Idempotente por (coleccion, filename): el mismo filename reemplaza el documento y sus chunks.
Crear o reemplazar un documento de conocimiento › Request Body
collectionIdLa colección donde vive el documento. Tiene que ser tuya.
filenameRuta relativa del archivo, p. ej. "docs/pricing.md". Es la identidad: el mismo valor reemplaza el documento anterior.
contentEl contenido del documento, en markdown.
Crear o reemplazar un documento de conocimiento › Responses
Documento creado o reemplazado.
idEl id del documento. Es lo que va en documentId para borrarlo.
collectionIdfilenameLa ruta relativa que se mando. Junto con la coleccion, es la identidad del documento.
statusprocessing recien empujado: los trozos y sus vectores se hacen despues. ready cuando el agente ya lo puede citar. failed si la indexacion fallo; el motivo se lee en error al listar.
Listar las colecciones de conocimiento
query Parameters
limitCuántas filas devolver. Por omisión 50.
offsetCuántas saltear. Por omisión 0.
Listar las colecciones de conocimiento › Responses
Una pagina de colecciones.
limitCuantas filas se pidieron. Es el limit del pedido o 50 si no se mando.
offsetCuantas filas se saltearon. Es el offset del pedido o 0.
hasMoretrue si hay mas filas despues de esta pagina. Para seguir, repetir el pedido con offset + limit.
Crear una coleccion de conocimiento, o recuperar la que ya existe
Idempotente por slug: la segunda llamada con el mismo slug devuelve la misma coleccion, con 200 en vez de 201.
Crear una coleccion de conocimiento, o recuperar la que ya existe › Request Body
slugEl identificador que eliges tú. Es la llave de idempotencia: dos llamadas con el mismo slug devuelven la misma coleccion.
nameComo se llama la coleccion en la pantalla.
descriptionPara que sirve, en una linea. Se ve en la pantalla.
Crear una coleccion de conocimiento, o recuperar la que ya existe › Responses
Ya existia una con ese slug: es la misma, no una copia.
idEl id de la coleccion. Es lo que va en collectionId al empujar documentos y al asignarla a un agente.
slugnamedescriptioncreatedAtListar los documentos de una coleccion
path Parameters
collectionIdquery Parameters
limitCuántas filas devolver. Por omisión 50.
offsetCuántas saltear. Por omisión 0.
Listar los documentos de una coleccion › Responses
Una pagina de documentos.
limitCuantas filas se pidieron. Es el limit del pedido o 50 si no se mando.
offsetCuantas filas se saltearon. Es el offset del pedido o 0.
hasMoretrue si hay mas filas despues de esta pagina. Para seguir, repetir el pedido con offset + limit.
Listar las plantillas de agente disponibles
Las privadas de tu organizacion mas las del catalogo comun. De aca sale el templateId para instanciar.
query Parameters
limitCuántas filas devolver. Por omisión 50.
offsetCuántas saltear. Por omisión 0.
Listar las plantillas de agente disponibles › Responses
Una pagina de plantillas.
limitCuantas filas se pidieron. Es el limit del pedido o 50 si no se mando.
offsetCuantas filas se saltearon. Es el offset del pedido o 0.
hasMoretrue si hay mas filas despues de esta pagina. Para seguir, repetir el pedido con offset + limit.
Crear un agente a partir de una plantilla
Idempotente por slug: reintentar con el mismo slug devuelve el mismo agente, con 200 en vez de 201. El agente queda en draft; se activa aparte.
path Parameters
templateIdCrear un agente a partir de una plantilla › Request Body
slugIdentificador del agente dentro de tu organizacion. Es la llave de idempotencia: reintentar con el mismo slug devuelve el mismo agente, no uno nuevo.
nameComo se llama el agente. Por omision, el nombre de la plantilla.
Crear un agente a partir de una plantilla › Responses
Ese slug ya nombraba un agente: es el mismo, no una copia.
idEl id del agente. Es lo que va en agentId.
slugnamestatusRecien instanciado queda en draft; se activa con POST /agents/{agentId}/activate.
audiencechannelsLos canales por los que atiende. Vacio significa todos.
createdAtSacarle una plantilla a un agente que ya anda
Fotografia su configuracion —prompt, modelo, acciones, canales y las colecciones de conocimiento que tiene asignadas— para poder clonarlo.
path Parameters
agentIdSacarle una plantilla a un agente que ya anda › Request Body
nameComo se llama la plantilla.
categoryEn que parte del catalogo va. Por ejemplo sales o support.
slugIdentificador de la plantilla. Por omision se deriva del nombre.
descriptionPara que sirve esta plantilla.
Sacarle una plantilla a un agente que ya anda › Responses
La plantilla.
idEl id de la plantilla. Es lo que va en templateId.
slugnamedescriptioncategoryPara agrupar en la galeria.
knowledgeCollectionsLos slugs de las colecciones de conocimiento que el agente instanciado va a usar. Conviene tenerlas creadas antes de instanciar; las que falten salen en missing.
Activar un agente
Devuelve readiness con lo que todavia impide que alguien lo alcance: sin flujo, en un flujo pero no en su etapa de entrada, o sin el canal api. Que readiness venga vacio significa que ya lo alcanza cualquiera.
path Parameters
agentIdActivar un agente › Responses
Activo, con su readiness.
idEl id del agente. Es lo que va en agentId.
slugnamestatusRecien instanciado queda en draft; se activa con POST /agents/{agentId}/activate.
audiencechannelsLos canales por los que atiende. Vacio significa todos.
createdAtLo que todavia impide que alguien lo alcance. Vacio significa que ya lo alcanza cualquiera. Activar no falla por esto: informa.
Pausar un agente
Deja de atender. Las conversaciones abiertas quedan; no contesta hasta que se lo active de nuevo.
path Parameters
agentIdPausar un agente › Responses
Pausado.
idEl id del agente. Es lo que va en agentId.
slugnamestatusRecien instanciado queda en draft; se activa con POST /agents/{agentId}/activate.
audiencechannelsLos canales por los que atiende. Vacio significa todos.
createdAtListar los agentes de la organizacion
query Parameters
limitCuántas filas devolver. Por omisión 50.
offsetCuántas saltear. Por omisión 0.
Listar los agentes de la organizacion › Responses
Una pagina de agentes.
limitCuantas filas se pidieron. Es el limit del pedido o 50 si no se mando.
offsetCuantas filas se saltearon. Es el offset del pedido o 0.
hasMoretrue si hay mas filas despues de esta pagina. Para seguir, repetir el pedido con offset + limit.
Leer un agente entero
path Parameters
agentIdLeer un agente entero › Responses
El agente. knowledge viene solo si la credencial ademas tiene knowledge:read.
idEl id del agente. Es lo que va en agentId.
slugEl identificador que se eligio al crearlo. Unico en la organizacion.
nameComo se llama en el panel.
descriptionPara que sirve, si se escribio.
statusdraft recien creado; active atendiendo; paused no contesta; archived retirado.
audienceA quien atiende. Por esta API solo se ven agentes external: los internal se administran desde el panel.
runtimeTypetext o voice.
channelsLos canales por los que atiende. Vacio significa todos. Para atender por esta API tiene que incluir api.
versionSube cuando se modifica el agente (PATCH, activar, pausar, dar de baja). Es lo que va en expectedVersion al escribir. No sube al conceder o quitar una accion ni al editar una accion o un servidor: para eso, updatedAt.
createdAtupdatedAtUltimo cambio del agente, de las acciones que tiene concedidas o de lo que hace una de ellas y a donde sale (editar una accion, un servidor MCP o un conector mueve a todos los agentes que la tienen). No refleja las colecciones de conocimiento asignadas ni si un canal esta conectado.
systemPromptLas instrucciones del agente, enteras. Es el texto que se cambia con PATCH.
maxIterationsCuantas vueltas puede dar el agente en un turno.
maxTokensTecho de tokens por turno.
Las acciones que tiene concedidas hoy. Con actions:read, ademas el origen al que llama cada una; nunca la direccion entera.
Los canales de channels, con su nombre y si estan conectados.
Las colecciones de conocimiento asignadas y habilitadas. Solo viene si la credencial ademas tiene knowledge:read; si no, el campo no esta.
Cambiar la configuracion de un agente
Cambia solo lo que mandes. Si mandas expectedVersion y alguien lo cambio en el medio, la respuesta es 409 y no se escribe nada.
path Parameters
agentIdCambiar la configuracion de un agente › Request Body
nameComo se llama el agente.
descriptionPara que sirve.
systemPromptLas instrucciones del agente. Queda una version en el historial.
llmConfigCon que modelo contesta: { primary: { provider, model }, fallback?: { provider, model } }.
maxTokensCuantos tokens puede gastar el agente en un turno, sumando entrada y salida de todas sus vueltas. Si se pasa, el turno se detiene.
expectedVersionLa version del agente que leiste. Si alguien lo cambio en el medio, la respuesta es 409 y no se escribe nada.
Cambiar la configuracion de un agente › Responses
El agente, con su version nueva.
idslugnamedescriptionstatusversionLa version nueva. Es lo que va en expectedVersion del proximo PATCH para no pisar un cambio ajeno.
updatedAtEl historial de instrucciones del agente
De la mas nueva a la mas vieja, SIN el texto: un prompt puede pesar cientos de KB y esto es para elegir a donde volver.
path Parameters
agentIdEl historial de instrucciones del agente › Responses
Las versiones.
De la mas nueva a la mas vieja. Hasta 50.
Volver a una version anterior del prompt
Escribe el texto viejo como una version NUEVA. No rebobina: nunca se pierde a lo que estabas volviendo.
path Parameters
agentIdversionIdVolver a una version anterior del prompt › Responses
El agente, con el prompt viejo.
idslugnamedescriptionstatusversionLa version nueva. Es lo que va en expectedVersion del proximo PATCH para no pisar un cambio ajeno.
updatedAtDe que version salio el texto. El agente queda con una version NUEVA que lo copia; la vieja sigue en el historial.
El texto de autorizacion que hay que aceptar, y su version
Lo que autorizas al registrar una accion HTTP. La version que devuelve es la que va en autorizacionVersion; si el destino no esta en Chile, ademas hay que confirmar la salida del pais.
El texto de autorizacion que hay que aceptar, y su version › Responses
El texto vigente.
versionLa version vigente. Es lo que va en autorizacionVersion al registrar una accion. Va suelta ademas de dentro de vigente para que no haya que deducir cual de los dos textos manda.
La autorizacion de entrega del art. 15 bis de la Ley 21.719, que se acepta siempre.
La confirmacion extra cuando el destino no esta en Chile. Se acepta con confirmaSalidaDelPais: true.
paisesLos valores que acepta destinationCountry.
Las acciones HTTP de tu organizacion
Las que registraste tú. No incluye las nuestras ni las de un servidor MCP: para ver que alcanza un agente concreto, GET agents/:agentId/actions.
Las acciones HTTP de tu organizacion › Responses
Las acciones.
Las acciones HTTP activas de la organizacion.
Registrar una accion HTTP
Queda para cualquiera de tus agentes hasta que se la concedes a uno (PUT agents/:agentId/actions/:slug); paraClientes la restringe. La autorizacion de destino (purpose, destinationCountry, autorizacionVersion) es opcional como bloque: si mandas uno, van los tres. Reintentar con el mismo slug reescribe la misma accion con lo que mandes (lo que no mandes se conserva), no crea otra.
Registrar una accion HTTP › Request Body
nameComo se llama la accion.
descriptionLo que lee el agente para decidir cuando usarla. Sin esto no la usa nunca.
urlA donde llama. No vuelve en ninguna respuesta: de la direccion solo se devuelve el origen.
methodGET, POST, PUT, PATCH o DELETE.
slugIdentificador de la accion. Es con lo que se le concede a un agente, y es la llave para reintentar sin duplicar.
timeoutMilisegundos de espera.
headersNombre de cabecera a valor. Aca viaja tu credencial: se cifra antes de guardarla y no vuelve nunca en una respuesta.
parametersJSON Schema de los parametros que el agente va a completar.
Campos que llena Lelemon al ejecutar, no el agente: el agente no los ve y no los puede inventar. Van en la query si el metodo es GET y en el cuerpo si no. Si falta el dato (por ejemplo, una conversacion sin caso), el campo no va. El nombre no puede repetirse ni ser el de un parametro. Al volver a registrar la misma accion, omitirlas deja las que tenia; [] o null las saca.
purposePara que es. Parte de la autorizacion de destino (art. 15 bis de la Ley 21.719): si mandas alguno de purpose, destinationCountry o autorizacionVersion, tienen que venir los tres.
destinationCountryDonde esta alojado ese sistema, declarado por ti: chile, fuera_de_chile o desconocido. "No se" cuenta como fuera. Parte de la autorizacion de destino.
autorizacionVersionLa version del texto de autorizacion que aceptas. Se lee en GET /v1/external/actions/authorization. Parte de la autorizacion de destino.
confirmaSalidaDelPaisLa segunda confirmacion, obligatoria cuando el destino no esta en Chile: los datos salen del pais y eso es una transferencia internacional.
paraClientesA que agentes se les puede conceder. Sin mandarlo, a cualquiera: a quien se la das se decide al concederla. true: solo a los que atienden clientes. false: solo a tu asistente interno.
Registrar una accion HTTP › Responses
La accion registrada.
slugEl identificador de la accion. Es lo que va al concederla a un agente y al darla de baja.
namedescriptionLo que lee el agente para decidir cuando usarla.
methodoriginSolo el origen de la direccion registrada (esquema, host y puerto). La direccion completa no vuelve nunca: en muchos webhooks el path es la credencial.
headerNamesLos nombres de las cabeceras configuradas. Los valores no vuelven nunca.
El JSON Schema de los parametros que el agente completa al usarla.
Los campos que Lelemon agrega en cada llamada. Vacia si no tiene.
audienceA que clase de agente se le puede conceder. null significa a cualquiera, y es lo que queda si no mandaste paraClientes al registrarla: a quien se la das se decide al concederla.
statusactive si esta disponible; inactive si se dio de baja.
Que acciones alcanza un agente y cuales tiene prendidas
El catalogo completo que ese agente puede tener, con enabled diciendo cuales estan concedidas hoy. No incluye la direccion a la que llama cada accion; cada entrada trae destinationOrigin: solo el origen.
path Parameters
agentIdQue acciones alcanza un agente y cuales tiene prendidas › Responses
Las acciones.
Reportar un hecho de tu sistema
Reportar un hecho de tu sistema › Request Body
eventoQue paso, con el nombre que uses en tu sistema. Es el mismo nombre que declara el trigger que lo escucha.
externalIdEl identificador del usuario final EN TU SISTEMA. Es el mismo con el que se abre una conversacion, asi que la persona es la misma para las dos rutas.
datosContexto del hecho. Hoy no se guarda ni cambia la decision; se acepta para no romper tu llamada cuando los triggers miren condiciones.
Reportar un hecho de tu sistema › Responses
Todos los triggers que escuchaban ya le habian llegado a esa persona. No se escribio nada.
Una entrada por trigger que escuchaba el hecho. Vacio si ninguno lo escuchaba.
duplicadoVerdadero cuando no se escribio nada nuevo y algo ya le habia llegado a esa persona. Con dos triggers donde uno disparo es falso: hubo mensaje. Sirve para medir reintentos sin mirar el codigo HTTP.
motivoPor que no se escribio nada. Solo viaja cuando no se escribio NI se habia escrito antes: sin trigger que escuche el hecho, la conversacion en manos de tu equipo, o ningun trigger pudo despachar.
Listar los triggers de la organizacion
Listar los triggers de la organizacion › Responses
Los triggers, el mas nuevo primero.
Crear un trigger
Crear un trigger › Request Body
agentIdQue agente escribe. Tiene que ser de tu organizacion, estar activo, y ser de los que la API administra.
eventoEl hecho que despierta este trigger, con el nombre que uses en tu sistema. Es el mismo que mandas a POST /v1/external/events.
textoLo que el agente dice.
abrirPanelSi tu aplicacion deberia traer la conversacion al frente al recibir el aviso. Viaja tal cual en el webhook; la decision es tuya.
activoNace activo. Manda false para crearlo pausado.
Crear un trigger › Responses
El trigger creado, activo.
idagentIdEl agente que escribe.
eventoEl hecho que lo despierta.
textoLo que el agente dice.
abrirPanelSi tu aplicacion deberia traer la conversacion al frente. Viaja tal cual en el aviso saliente.
activoUn trigger pausado no dispara.
createdAtupdatedAtEditar o pausar un trigger
path Parameters
idEditar o pausar un trigger › Request Body
textoabrirPanelactivoUn trigger pausado no dispara. Pausarlo no borra las entregas: al prenderlo, a quien ya le llego no le vuelve a llegar.
Editar o pausar un trigger › Responses
El trigger como quedo.
idagentIdEl agente que escribe.
eventoEl hecho que lo despierta.
textoLo que el agente dice.
abrirPanelSi tu aplicacion deberia traer la conversacion al frente. Viaja tal cual en el aviso saliente.
activoUn trigger pausado no dispara.
createdAtupdatedAtEncargarle un trabajo a un agente
El agente trabaja solo, fuera de este pedido, hasta cerrar el encargo o topar con un limite. La respuesta llega enseguida con la corrida en curso; se sigue con GET /runs/{id}.
Con este permiso el agente corre desatendido cualquier accion que tenga concedida, incluidas las que escriben.
pedidoPor dice a nombre de quien corre, y tiene que venir firmado por tu sistema: firma = HMAC-SHA256 en hex minuscula, con el secreto de servicio que tu sistema comparte con Lelemon como llave, sobre el texto "lelemon-run:v1:
El header Idempotency-Key es opcional: si tu sistema reintenta el mismo POST (mismo agente, misma clave), te devolvemos la corrida que ya se creo la primera vez, con 200, en vez de crear una segunda. Sin el header, cada POST crea una corrida nueva, como siempre.
path Parameters
slugHeaders
idempotency-keyIdempotency-KeyClave del reintento. Repetirla para el mismo agente devuelve la corrida ya creada, sin duplicarla.
Encargarle un trabajo a un agente › Request Body
metaQue tiene que lograr el agente. Se lo trata como texto de un usuario.
A nombre de quien corre, firmado por tu sistema. Sin este campo: 400. Con la firma invalida o vencida: 401.
Encargarle un trabajo a un agente › Responses
Ya existia una corrida con esta Idempotency-Key para este agente: se devuelve esa, sin crear otra.
runIdEl id de la corrida. Es lo que va en la URL para seguirla.
agentSlugestadoen_curso: trabajando o en la cola. esperando_al_humano: pauso para preguntar; pregunta trae la pregunta, respondela con POST /runs/{id}/answer. terminada_sin_verificar: el agente dijo que termino y todavia nadie lo comprobo; no la leas como hecha. terminada: la comprobo un verificador (hoy no ocurre). detenida: se acabo un limite; razon dice cual. fallida: error; resultado.error dice cual, o razon "abandonada" si nadie contesto la pausa en 30 dias. cancelada: la cancelaste.
razonCon estado detenida, que limite la freno. Con estado fallida y razon "abandonada", nadie contesto la pausa en 30 dias.
preguntaCon estado esperando_al_humano: lo que el agente pregunto. Respondelo con POST /runs/{id}/answer.
vueltasVueltas que lleva.
costoUsdLo que lleva gastado, en dolares.
cancelacionPedidatrue si pediste cancelarla. Mientras un worker la corre, se cancela al empezar su vuelta siguiente.
creadaEniniciadaEnterminadaEnVer en que va una corrida
path Parameters
idVer en que va una corrida › Responses
La corrida.
runIdEl id de la corrida. Es lo que va en la URL para seguirla.
agentSlugestadoen_curso: trabajando o en la cola. esperando_al_humano: pauso para preguntar; pregunta trae la pregunta, respondela con POST /runs/{id}/answer. terminada_sin_verificar: el agente dijo que termino y todavia nadie lo comprobo; no la leas como hecha. terminada: la comprobo un verificador (hoy no ocurre). detenida: se acabo un limite; razon dice cual. fallida: error; resultado.error dice cual, o razon "abandonada" si nadie contesto la pausa en 30 dias. cancelada: la cancelaste.
razonCon estado detenida, que limite la freno. Con estado fallida y razon "abandonada", nadie contesto la pausa en 30 dias.
preguntaCon estado esperando_al_humano: lo que el agente pregunto. Respondelo con POST /runs/{id}/answer.
vueltasVueltas que lleva.
costoUsdLo que lleva gastado, en dolares.
cancelacionPedidatrue si pediste cancelarla. Mientras un worker la corre, se cancela al empezar su vuelta siguiente.
creadaEniniciadaEnterminadaEnCancelar una corrida
path Parameters
idCancelar una corrida › Responses
La corrida. Si nadie la estaba corriendo, queda cancelada. Si la esta corriendo un worker, queda con cancelacionPedida y se cancela al empezar su vuelta siguiente: lo que estaba haciendo termina.
runIdEl id de la corrida. Es lo que va en la URL para seguirla.
agentSlugestadoen_curso: trabajando o en la cola. esperando_al_humano: pauso para preguntar; pregunta trae la pregunta, respondela con POST /runs/{id}/answer. terminada_sin_verificar: el agente dijo que termino y todavia nadie lo comprobo; no la leas como hecha. terminada: la comprobo un verificador (hoy no ocurre). detenida: se acabo un limite; razon dice cual. fallida: error; resultado.error dice cual, o razon "abandonada" si nadie contesto la pausa en 30 dias. cancelada: la cancelaste.
razonCon estado detenida, que limite la freno. Con estado fallida y razon "abandonada", nadie contesto la pausa en 30 dias.
preguntaCon estado esperando_al_humano: lo que el agente pregunto. Respondelo con POST /runs/{id}/answer.
vueltasVueltas que lleva.
costoUsdLo que lleva gastado, en dolares.
cancelacionPedidatrue si pediste cancelarla. Mientras un worker la corre, se cancela al empezar su vuelta siguiente.
creadaEniniciadaEnterminadaEnResponderle a una corrida que pregunto algo
La corrida pausada retoma con la respuesta como contexto de la ronda siguiente. respondidoPor sigue el mismo formato firmado que pedidoPor al crear la corrida.
path Parameters
idResponderle a una corrida que pregunto algo › Request Body
respuestaLa respuesta a lo que pregunto el agente.
Quien responde, firmado por tu sistema. Sin este campo: 400. Con la firma invalida o vencida: 401.
Responderle a una corrida que pregunto algo › Responses
La corrida, retomada con la respuesta.
runIdEl id de la corrida. Es lo que va en la URL para seguirla.
agentSlugestadoen_curso: trabajando o en la cola. esperando_al_humano: pauso para preguntar; pregunta trae la pregunta, respondela con POST /runs/{id}/answer. terminada_sin_verificar: el agente dijo que termino y todavia nadie lo comprobo; no la leas como hecha. terminada: la comprobo un verificador (hoy no ocurre). detenida: se acabo un limite; razon dice cual. fallida: error; resultado.error dice cual, o razon "abandonada" si nadie contesto la pausa en 30 dias. cancelada: la cancelaste.
razonCon estado detenida, que limite la freno. Con estado fallida y razon "abandonada", nadie contesto la pausa en 30 dias.
preguntaCon estado esperando_al_humano: lo que el agente pregunto. Respondelo con POST /runs/{id}/answer.
vueltasVueltas que lleva.
costoUsdLo que lleva gastado, en dolares.
cancelacionPedidatrue si pediste cancelarla. Mientras un worker la corre, se cancela al empezar su vuelta siguiente.
creadaEniniciadaEnterminadaEnVer que agendas hay
Ver que agendas hay › Responses
Las agendas activas, con el slug que las otras rutas piden. Una lista vacia significa que la organizacion no configuro ninguna todavia.
Las agendas activas de la organización. Vacío significa que no hay ninguna configurada todavía, no que algo haya fallado.
Ver los horarios libres de una agenda
query Parameters
agendaQué agenda mirar, por su slug. Los slugs salen de GET /v1/external/scheduling/agendas.
daysAheadCuántos días hacia adelante mirar. Por omisión 7. El techo real lo pone la propia agenda, y este número no puede pasarlo.
Ver los horarios libres de una agenda › Responses
Los bloques libres, ordenados de mas cercano a mas lejano. Una lista vacia significa que no hay ninguno en la ventana pedida.
Los bloques libres, ordenados de más cercano a más lejano. Vacío significa que no hay ninguno en la ventana pedida, no que algo haya fallado.
Reservar un horario
Reservar un horario › Request Body
agendaEn qué agenda reservar, por su slug. El mismo con el que pediste los horarios.
slotStartCuándo empieza, en ISO 8601 con zona. Es el id de un bloque devuelto por la disponibilidad.
attendeeEmailCorreo de quien agenda. Ahí le llega la invitación.
attendeeNameNombre de quien agenda, como aparece en la invitación.
attendeePhoneTeléfono de contacto, si lo tienes.
companyNameEmpresa de quien agenda. Va en la descripción del evento.
contextPara qué es la reunión. Va en la descripción del evento, para que quien atienda llegue sabiendo.
Reservar un horario › Responses
La reunion quedo creada. A quien agendo le llega la invitacion con el link de la videollamada.
meetingIdEl id de la reunión. Es lo que se guarda para referirse a ella.
scheduledForCuándo quedó, en ISO 8601 con zona.
durationMinutesCuánto dura, en minutos.
meetLinkEl link de la videollamada. Puede no venir si la agenda está configurada sin videollamada.
Listar los embudos de la organizacion
query Parameters
limitCuántas filas devolver. Por omisión 50.
offsetCuántas saltear. Por omisión 0.
Listar los embudos de la organizacion › Responses
Una pagina de embudos.
limitCuantas filas se pidieron. Es el limit del pedido o 50 si no se mando.
offsetCuantas filas se saltearon. Es el offset del pedido o 0.
hasMoretrue si hay mas filas despues de esta pagina. Para seguir, repetir el pedido con offset + limit.
Leer un embudo entero, con sus etapas y sus campos
path Parameters
idLeer un embudo entero, con sus etapas y sus campos › Responses
El embudo, con sus etapas y la definicion de sus campos. Un campo sensible viene marcado con sensitive: true, sin valor: esto describe el embudo, no un caso.
idEl id del embudo. Es lo que va en pipelineId.
nameComo se llama en el panel.
statusdraft recien creado; active en uso; paused pausado; archived retirado.
createdAtLas etapas vivas, ordenadas.
Los campos que declara el embudo. Son definiciones, sin valores.
Reemplazar las opciones de los campos de lista de un embudo
Reemplaza por completo las opciones de los campos que el cuerpo nombra; los demas quedan como estaban. Repetir el mismo pedido no cambia nada y devuelve changed: false. Padre e hijo de una cascada van en el mismo pedido, porque se validan juntos. Los casos ya guardados conservan su valor aunque la opcion salga del catalogo.
path Parameters
idReemplazar las opciones de los campos de lista de un embudo › Request Body
Los campos que se reemplazan. Los que no se nombran quedan como estaban. Padre e hijo de una cascada se mandan en el mismo pedido: se validan juntos.
Reemplazar las opciones de los campos de lista de un embudo › Responses
Como quedo cada campo nombrado.
idEl embudo que se escribio.
changedfalse cuando lo que llego era igual a lo que ya habia: no se escribio nada. Repetir el mismo pedido devuelve false.
Como quedo cada campo nombrado en el pedido.
Leer las respuestas rapidas de un embudo
Los textos que el equipo inserta en el chat escribiendo / y el atajo. Salen tal como estan guardados, con {agente} y {cliente} sin reemplazar.
path Parameters
idLeer las respuestas rapidas de un embudo › Responses
Las respuestas del embudo. Vacia si no tiene.
idEl embudo.
En el orden en que el panel las muestra. Vacia si el embudo no tiene.
Reemplazar las respuestas rapidas de un embudo
Reemplaza la lista entera: lo que no viene se borra, y una lista vacia deja el embudo sin respuestas. No toca ninguna otra configuracion del embudo. Se validan igual que en el panel: hasta 50 respuestas, atajos unicos de 1 a 30 caracteres en minuscula, textos de hasta 4096. En el texto, {agente} se reemplaza por el nombre de quien la inserta y {cliente} por el nombre del contacto; si falta el dato queda vacio. Repetir el mismo pedido no cambia nada y devuelve changed: false.
path Parameters
idReemplazar las respuestas rapidas de un embudo › Request Body
Las respuestas rapidas que el embudo queda teniendo, hasta 50. Reemplazan por completo a las que tenia. Una lista vacia deja el embudo sin respuestas. Se validan igual que en el panel.
Reemplazar las respuestas rapidas de un embudo › Responses
Como quedaron las respuestas.
idEl embudo.
En el orden en que el panel las muestra. Vacia si el embudo no tiene.
changedfalse cuando lo que llego era igual a lo que ya habia: no se escribio nada. Repetir el mismo pedido devuelve false.
Listar las skills de un agente
Devuelve el indice, no el contenido: lo que el agente ve en su prompt. Para el texto completo de una, GET /v1/external/agents/{agentSlug}/skills/{skillSlug}.
path Parameters
agentSlugquery Parameters
limitCuántas filas devolver. Por omisión 50.
offsetCuántas saltear. Por omisión 0.
Listar las skills de un agente › Responses
Una pagina de skills.
limitCuantas filas se pidieron. Es el limit del pedido o 50 si no se mando.
offsetCuantas filas se saltearon. Es el offset del pedido o 0.
hasMoretrue si hay mas filas despues de esta pagina. Para seguir, repetir el pedido con offset + limit.
Crear una skill y asignarsela a un agente
Una skill es un instructivo que el agente sigue para una tarea. En su prompt viaja solo el indice —el slug y la descripcion de cada una—, y el contenido lo carga cuando va a hacer esa tarea, con la herramienta cargar_skill. Por eso la descripcion dice CUANDO usarla y el contenido dice COMO.
El agente no ve ninguna skill mientras no tenga concedida la accion cargar_skill.
Idempotente por slug: la segunda llamada con el mismo slug y el MISMO cuerpo devuelve la misma skill, con 200 en vez de 201, y se la asigna al agente si todavia no la tenia.
Si el slug ya existe y el cuerpo difiere, contesta 409: crear no reescribe. Descartar lo que mandaste y contestar 200 dejaria a quien re-empuja sus skills en cada deploy creyendo que actualizo, con el agente siguiendo el procedimiento anterior. Para cambiarla, PATCH.
Un agente admite hasta 30 skills. El indice viaja en el prompt en cada mensaje, asi que la que pasa el tope se rechaza con 409 en vez de recortarse en silencio.
path Parameters
agentSlugCrear una skill y asignarsela a un agente › Request Body
slugEl identificador que eliges tú. Es lo que el agente nombra al cargarla, y la llave de idempotencia: dos llamadas con el mismo slug devuelven la misma skill.
nombreComo se llama la skill.
descripcionPara que sirve, en una linea. Es lo unico de la skill que viaja en el prompt del agente, en cada mensaje: por eso es corta y dice CUANDO usarla, no como.
contenidoEl instructivo completo, en texto. No viaja en el prompt: el agente lo carga con cargar_skill cuando va a hacer esa tarea.
requiereSlugs de otras skills del mismo agente que el agente recibe completas, antes que esta, cada vez que la carga. Sirve para una base que varias comparten sin repetirla. Un solo nivel: una skill requerida no puede requerir otra.
Crear una skill y asignarsela a un agente › Responses
Ya existia una con ese slug: es la misma, no una copia.
idEl id de la skill. El agente no lo usa: la nombra por su slug.
slugnombredescripcionLo unico de la skill que viaja en el prompt del agente, en cada mensaje.
Leer una skill, con su contenido
Devuelve el instructivo completo: lo que el agente lee cuando la carga. Es lo que hace auditable que sigue el agente en esa tarea, sin poder reescribirlo. La lista devuelve solo el indice.
path Parameters
agentSlugskillSlugLeer una skill, con su contenido › Responses
La skill con su contenido.
idEl id de la skill. El agente no lo usa: la nombra por su slug.
slugnombredescripcionLo unico de la skill que viaja en el prompt del agente, en cada mensaje.
contenidoEl instructivo completo: lo que el agente lee cuando la carga con cargar_skill. No viaja en su prompt.
requiereLas skills que el agente recibe completas, antes que esta, cada vez que la carga.
Editar una skill
Cambia solo lo que mandes. El slug no se edita: es la identidad con la que el agente la nombra.
Un cuerpo vacio es 400: no hay edicion que aplicar, y contestar 200 invalidaria el runtime cacheado del agente diciendo que se cambio algo.
path Parameters
agentSlugskillSlugEditar una skill › Request Body
nombredescripcioncontenidorequiereSlugs de otras skills del mismo agente que el agente recibe completas, antes que esta, cada vez que la carga. Sirve para una base que varias comparten sin repetirla. Un solo nivel: una skill requerida no puede requerir otra.
Editar una skill › Responses
La skill, con los cambios aplicados.
idEl id de la skill. El agente no lo usa: la nombra por su slug.
slugnombredescripcionLo unico de la skill que viaja en el prompt del agente, en cada mensaje.
Métricas por conversación, de las que cambiaron en un rango
query Parameters
fromDesde cuándo, en ISO 8601. Trae las conversaciones cuyo último cambio fue en el rango.
limitCuántas filas devolver. Por omisión 50.
offsetCuántas saltear. Por omisión 0.
toHasta cuándo, sin incluirlo. Por omisión, ahora. A lo más 31 días después de from.
Métricas por conversación, de las que cambiaron en un rango › Responses
Una fila por conversación con sus tiempos: cuándo entró, se derivó, la tomó una persona y se cerró, quién la cerró, y los segundos con el agente y con una persona.
limitCuantas filas se pidieron. Es el limit del pedido o 50 si no se mando.
offsetCuantas filas se saltearon. Es el offset del pedido o 0.
hasMoretrue si hay mas filas despues de esta pagina. Para seguir, repetir el pedido con offset + limit.
Listar los archivos de una conversacion, con su descarga
Junta lo que el cliente mando por el chat (imagenes, audios y videos) y todo lo adjuntado a la ficha del caso: los documentos que el cliente mando por el chat y los archivos que subio el equipo. subidoPor dice cual es cual. El mas nuevo primero. Cada uno trae una url firmada que vive 10 minutos. No salen los archivos que el equipo manda por el chat, ni la imagen que el filtro de seguridad bloqueo, ni lo borrado.
path Parameters
idquery Parameters
limitCuántas filas devolver. Por omisión 50.
offsetCuántas saltear. Por omisión 0.
Listar los archivos de una conversacion, con su descarga › Responses
Una pagina de adjuntos.
limitCuantas filas se pidieron. Es el limit del pedido o 50 si no se mando.
offsetCuantas filas se saltearon. Es el offset del pedido o 0.
hasMoretrue si hay mas filas despues de esta pagina. Para seguir, repetir el pedido con offset + limit.
Ver si una persona del equipo esta disponible
Busca a la persona por su email entre los miembros activos de tu organizacion. estado es lo que quedo marcado; disponibleParaRepartir dice si el reparto le asignaria un caso ahora, considerando el horario de atencion de la organizacion.
query Parameters
emailEl email de la persona del equipo. No distingue mayusculas. Tiene que ser un miembro activo de tu organizacion.
Ver si una persona del equipo esta disponible › Responses
El estado de la persona.
emailEl email de la persona.
estadoLo que quedo marcado, por la persona o por la API. No considera el horario de la organizacion: eso es disponibleParaRepartir.
disponibleParaRepartirSi el reparto le asignaria un caso nuevo ahora mismo. Es false si esta ausente, y tambien si esta disponible pero la organizacion tiene horario de atencion y ya cerro: el auto-away por horario manda, salvo que la persona haya pedido seguir un rato mas (extendidoHasta en el futuro). Poner disponible fuera de horario no cambia eso.
cambiadoElCuando se cambio el estado por ultima vez. null si nunca.
extendidoHastaHasta cuando pidio la persona seguir recibiendo casos pasado el horario. null si no hay extension.
Poner a una persona del equipo disponible o ausente
Hace lo mismo que cuando la persona cambia su propio estado: el reparto de casos nuevos lo lee de ahi. Ausente la saca del reparto y le quita la extension de horario que haya pedido. Disponible la deja marcada, pero si la organizacion tiene horario de atencion y ya cerro, el auto-away por horario sigue mandando: el reparto la trata como ausente (disponibleParaRepartir en false) hasta que abra el horario, salvo que ella pida seguir un rato mas. Si ya estaba en ese estado no se escribe nada ni se toca su extension, asi que repetir el pedido es seguro.
Poner a una persona del equipo disponible o ausente › Request Body
emailEl email de la persona del equipo. No distingue mayusculas. Tiene que ser un miembro activo de tu organizacion.
estadodisponible: puede recibir casos nuevos. ausente: el reparto la salta.
Poner a una persona del equipo disponible o ausente › Responses
Como quedo la persona.
emailEl email de la persona.
estadoLo que quedo marcado, por la persona o por la API. No considera el horario de la organizacion: eso es disponibleParaRepartir.
disponibleParaRepartirSi el reparto le asignaria un caso nuevo ahora mismo. Es false si esta ausente, y tambien si esta disponible pero la organizacion tiene horario de atencion y ya cerro: el auto-away por horario manda, salvo que la persona haya pedido seguir un rato mas (extendidoHasta en el futuro). Poner disponible fuera de horario no cambia eso.
cambiadoElCuando se cambio el estado por ultima vez. null si nunca.
extendidoHastaHasta cuando pidio la persona seguir recibiendo casos pasado el horario. null si no hay extension.