Lelemon API
  • Guías
  • Referencia de la API
Information
external-api
    Avisar que un escalamiento se resolviopostMandar un mensaje a la persona de una conversacion, sin que corra el agentepostVer el estado de una conversaciongetVer las conversaciones anteriores de la misma personagetEscribir en el caso los datos que ya tiene tu sistemaputMandar el caso a otro embudopostDejar una nota interna en el chat de una conversacionpostAbrir una conversacion con un agentepostLeer los mensajes de una conversaciongetMandar un mensaje y recibir la respuestapostCrear o reemplazar un documento de conocimientoputListar las colecciones de conocimientogetCrear una coleccion de conocimiento, o recuperar la que ya existepostListar los documentos de una colecciongetBorrar un documento y sacarlo del indicedeleteAsignarle una coleccion a un agenteputQuitarle una coleccion a un agentedeleteListar las plantillas de agente disponiblesgetCrear un agente a partir de una plantillapostSacarle una plantilla a un agente que ya andapostActivar un agentepostPausar un agentepostListar los agentes de la organizaciongetLeer un agente enterogetCambiar la configuracion de un agentepatchEl historial de instrucciones del agentegetVolver a una version anterior del promptpostEl texto de autorizacion que hay que aceptar, y su versiongetLas acciones HTTP de tu organizaciongetRegistrar una accion HTTPpostDar de baja una accion HTTPdeleteQue acciones alcanza un agente y cuales tiene prendidasgetConcederle una accion a un agenteputQuitarle una accion a un agentedeleteReportar un hecho de tu sistemapostListar los triggers de la organizaciongetCrear un triggerpostEditar o pausar un triggerpatchEncargarle un trabajo a un agentepostVer en que va una corridagetCancelar una corridapostResponderle a una corrida que pregunto algopostVer que agendas haygetVer los horarios libres de una agendagetReservar un horariopostListar los embudos de la organizaciongetLeer un embudo entero, con sus etapas y sus camposgetReemplazar las opciones de los campos de lista de un embudoputLeer las respuestas rapidas de un embudogetReemplazar las respuestas rapidas de un embudoputListar las skills de un agentegetCrear una skill y asignarsela a un agentepostLeer una skill, con su contenidogetBorrar una skilldeleteEditar una skillpatchMétricas por conversación, de las que cambiaron en un rangogetListar los archivos de una conversacion, con su descargagetVer si una persona del equipo esta disponiblegetPoner a una persona del equipo disponible o ausenteput
Schemas
powered by Zudoku
Lelemon API
Lelemon API

external-api


Avisar que un escalamiento se resolvio

POST
/v1/external/conversations/{id}/resolve

Avisar que un escalamiento se resolvio › path Parameters

id
​string · required

Avisar que un escalamiento se resolvio › Request Body

ResolveConversationDto
resolution
​string · maxLength: 2000

Que se resolvio, en palabras. Queda escrito en la conversacion.

message
​string · maxLength: 4000

Si viene, se le manda al contacto por su canal. Si se omite, la resolucion solo queda registrada.

externalRef
​string · maxLength: 120

El id del ticket de su lado. Con el, un reintento del mismo aviso no se procesa dos veces.

returnToAgent
​boolean

Por defecto el control vuelve al agente. false lo deja en manos de una persona.

Default: true

Avisar que un escalamiento se resolvio › Responses

La conversacion, con alreadyResolved en true si ya estaba resuelta. Reintentar es seguro.

EscalamientoResueltoDto
id
​string · required

El id de la conversacion.

controlStatus
​string · enum · required

Quien 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.

Enum values:
agent
human
escalated
messageQueued
​boolean · required

true si el mensaje al contacto quedo encolado. Encolado, no entregado: el transporte lo despacha despues.

alreadyResolved
​boolean · required

true si este aviso ya se habia procesado antes. Reintentar es seguro.

POST/v1/external/conversations/{id}/resolve
curl /v1/external/conversations/:id/resolve \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer <token>' \
  --data '{
  "resolution": "resolution",
  "message": "message",
  "externalRef": "externalRef",
  "returnToAgent": true
}'
Example Request Body
{
  "resolution": "resolution",
  "message": "message",
  "externalRef": "externalRef",
  "returnToAgent": true
}
Example Responses
{
  "id": "id",
  "controlStatus": "agent",
  "messageQueued": true,
  "alreadyResolved": true
}
application/json

Mandar un mensaje a la persona de una conversacion, sin que corra el agente

POST
/v1/external/conversations/{id}/send

Mandar un mensaje a la persona de una conversacion, sin que corra el agente › path Parameters

id
​string · required

Mandar un mensaje a la persona de una conversacion, sin que corra el agente › Request Body

EnviarMensajeDto
message
​string · maxLength: 4000 · required

El texto que le llega a la persona. No puede ser solo espacios.

externalRef
​string · maxLength: 120 · required

El 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.

MensajeEnviadoDto
id
​string · required

El id de la conversacion.

messageId
​string · required

El id del mensaje que quedo guardado en la conversacion. En un reintento es el del primer envio.

alreadySent
​boolean · required

true si esa externalRef ya habia enviado un mensaje en esta conversacion y esta llamada no mando nada. Reintentar es seguro.

POST/v1/external/conversations/{id}/send
curl /v1/external/conversations/:id/send \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer <token>' \
  --data '{
  "message": "message",
  "externalRef": "externalRef"
}'
Example Request Body
{
  "message": "message",
  "externalRef": "externalRef"
}
Example Responses
{
  "id": "id",
  "messageId": "messageId",
  "alreadySent": true
}
application/json

Ver el estado de una conversacion

GET
/v1/external/conversations/{id}

Ver el estado de una conversacion › path Parameters

id
​string · required

Ver el estado de una conversacion › Responses

El estado de la conversacion.

EstadoDeConversacionDto
id
​string · required

El id de la conversacion.

name
​string | null · required

Nombre del contacto.

email
​string | null · required

Correo del contacto.

phone
​string | null · required

Telefono del contacto.

status
​string · enum · required

El estado del caso en el flujo.

Enum values:
pending
active
waiting
completed
failed
abandoned
expired
controlStatus
​string · enum · required

Quien la tiene: agent el agente, human una persona del equipo, escalated esperando que alguien la tome.

Enum values:
agent
human
escalated
controlledBy
​string | null · required

El id de la persona que la tomo, cuando controlStatus es human.

assignedTo
​string | null · required

El id de la persona duena del caso. null si nadie lo tiene asignado.

escalatedAt
​string | null · date-time · required
escalationReason
​string | null · required

Por que se escalo, si se escalo.

pipelineId
​string · required

El flujo en el que esta el caso.

pipelineName
​string · required
currentStageId
​string | null · required
currentStageName
​string | null · required
lastMessageAt
​string | null · date-time · required
createdAt
​string · date-time · required
inboundNumberLabel
​string | null · required

La etiqueta del numero de WhatsApp del negocio por el que entro. null si no entro por WhatsApp.

inboundNumberDisplay
​string | null · required

Ese numero, como se muestra. null si no entro por WhatsApp.

​CampoDelCasoDto[] · required

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.

GET/v1/external/conversations/{id}
curl /v1/external/conversations/:id \
  --header 'Authorization: Bearer <token>'
Example Responses
{ "id": "id", "name": "name", "email": "email", "phone": "phone", "status": "pending", "controlStatus": "agent", "controlledBy": "controlledBy", "assignedTo": "assignedTo", "escalatedAt": "2024-08-25T15:00:00Z", "escalationReason": "escalationReason", "pipelineId": "pipelineId", "pipelineName": "pipelineName", "currentStageId": "currentStageId", "currentStageName": "currentStageName", "lastMessageAt": "2024-08-25T15:00:00Z", "createdAt": "2024-08-25T15:00:00Z", "inboundNumberLabel": "inboundNumberLabel", "inboundNumberDisplay": "inboundNumberDisplay", "fields": [ { "key": "key", "label": "label", "type": "type", "value": "value" } ] }
application/json

Ver las conversaciones anteriores de la misma persona

GET
/v1/external/conversations/{id}/historial

Ver las conversaciones anteriores de la misma persona › path Parameters

id
​string · required

Ver las conversaciones anteriores de la misma persona › Responses

Las conversaciones anteriores, la mas nueva primero.

HistorialDelClienteDto
conversationId
​string · required

La conversacion por la que se pregunto.

​ConversacionAnteriorDto[] · required

Las otras conversaciones de la misma persona en esta organizacion, de la mas nueva a la mas vieja. Hasta 50.

GET/v1/external/conversations/{id}/historial
curl /v1/external/conversations/:id/historial \
  --header 'Authorization: Bearer <token>'
Example Responses
{ "conversationId": "conversationId", "conversations": [ { "conversationId": "conversationId", "pipelineId": "pipelineId", "pipelineName": "SAC Webhosting", "status": "pending", "outcome": "outcome", "summary": "summary", "firstMessage": "firstMessage", "messageCount": 0, "createdAt": "2024-08-25T15:00:00Z", "lastMessageAt": "2024-08-25T15:00:00Z" } ] }
application/json

Escribir en el caso los datos que ya tiene tu sistema

PUT
/v1/external/conversations/{id}/campos

Escribir en el caso los datos que ya tiene tu sistema › path Parameters

id
​string · required

Escribir en el caso los datos que ya tiene tu sistema › Request Body

EscribirCamposDelCasoDto
​object · required

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.

Example: {"rut":"76543210-K","plan":"Hosting Pro","sucursal":"Talca"}

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.

CamposDelCasoEscritosDto
id
​string · required

El id del caso.

guardados
​string[] · required

Las 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.

Example: ["rut","plan"]
rechazados
​string[] · required

Las 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.

Example: ["motivo"]
​object · required

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.

Example: {"correo":"no parece un correo: falta el @ o el dominio"}
limpiados
​string[] · required

Las 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".

Example: ["comuna"]
PUT/v1/external/conversations/{id}/campos
curl /v1/external/conversations/:id/campos \
  --request PUT \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer <token>' \
  --data '{
  "datos": {
    "rut": "76543210-K",
    "plan": "Hosting Pro",
    "sucursal": "Talca"
  }
}'
Example Request Body
{
  "datos": {
    "rut": "76543210-K",
    "plan": "Hosting Pro",
    "sucursal": "Talca"
  }
}
Example Responses
{ "id": "id", "guardados": [ "rut", "plan" ], "rechazados": [ "motivo" ], "motivos": { "correo": "no parece un correo: falta el @ o el dominio" }, "limpiados": [ "comuna" ] }
application/json

Mandar el caso a otro embudo

POST
/v1/external/conversations/{id}/derivar

Mandar el caso a otro embudo › path Parameters

id
​string · required

Mandar el caso a otro embudo › Request Body

DerivarCasoDto
pipeline
​string · required

El embudo destino, por slug o por id.

Example: soporte-hosting
stage
​string

La 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.

Example: ticket-nuevo

Mandar el caso a otro embudo › Responses

Donde quedo el caso. movido en false si ya estaba ahi: reintentar es seguro.

CasoDerivadoDto
id
​string · required

El id del caso.

pipelineId
​string · required

El id del embudo en el que quedo.

pipelineSlug
​string · required

Su slug.

Example: soporte-hosting
stageId
​string · required

El id de la etapa en la que quedo.

stageSlug
​string · required

Su slug.

Example: ticket-nuevo
movido
​boolean · required

false 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.

POST/v1/external/conversations/{id}/derivar
curl /v1/external/conversations/:id/derivar \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer <token>' \
  --data '{
  "pipeline": "soporte-hosting",
  "stage": "ticket-nuevo"
}'
Example Request Body
{
  "pipeline": "soporte-hosting",
  "stage": "ticket-nuevo"
}
Example Responses
{
  "id": "id",
  "pipelineId": "pipelineId",
  "pipelineSlug": "soporte-hosting",
  "stageId": "stageId",
  "stageSlug": "ticket-nuevo",
  "movido": true
}
application/json

Dejar una nota interna en el chat de una conversacion

POST
/v1/external/conversations/{id}/notas

Dejar una nota interna en el chat de una conversacion › path Parameters

id
​string · required

Dejar una nota interna en el chat de una conversacion › Request Body

CrearNotaInternaDto
texto
​string · maxLength: 4000 · required

El texto de la nota. La ve solo el equipo. No puede ser solo espacios.

externalRef
​string · maxLength: 120

El 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.

NotaInternaCreadaDto
id
​string · required

El id de la conversacion.

messageId
​string · required

El 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.

createdAt
​string · date-time · required
alreadyCreated
​boolean · required

true si esa externalRef ya habia dejado una nota en esta conversacion y esta llamada no dejo ninguna. Reintentar es seguro.

POST/v1/external/conversations/{id}/notas
curl /v1/external/conversations/:id/notas \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer <token>' \
  --data '{
  "texto": "texto",
  "externalRef": "externalRef"
}'
Example Request Body
{
  "texto": "texto",
  "externalRef": "externalRef"
}
Example Responses
{
  "id": "id",
  "messageId": "messageId",
  "createdAt": "2024-08-25T15:00:00Z",
  "alreadyCreated": true
}
application/json

Abrir una conversacion con un agente

POST
/v1/external/agents/{slug}/conversations

Abrir una conversacion con un agente › path Parameters

slug
​string · required

Abrir una conversacion con un agente › Request Body

OpenAgentConversationDto
externalId
​string · maxLength: 120 · required

El id de esta conversacion en su sistema, unico en la organizacion. Si ya existe, se devuelve esa conversacion.

contactName
​string · maxLength: 255
contactEmail
​string · email · maxLength: 255
contactPhone
​string · maxLength: 50

Abrir una conversacion con un agente › Responses

La conversacion, nueva o la que ya existia para ese externalId. Es idempotente por externalId.

ConversacionAbiertaDto
conversationId
​string · required

El id de la conversacion. Es lo que va en la URL para mandar y leer mensajes.

agentSlug
​string · required

El agente que la atiende.

Example: ventas
created
​boolean · required

true si se abrio en esta llamada; false si ese externalId ya tenia una conversacion y se devolvio esa. Un reintento la ve en false.

POST/v1/external/agents/{slug}/conversations
curl /v1/external/agents/:slug/conversations \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer <token>' \
  --data '{
  "externalId": "externalId",
  "contactName": "contactName",
  "contactEmail": "[email protected]",
  "contactPhone": "contactPhone"
}'
Example Request Body
{
  "externalId": "externalId",
  "contactName": "contactName",
  "contactEmail": "[email protected]",
  "contactPhone": "contactPhone"
}
Example Responses
{
  "conversationId": "conversationId",
  "agentSlug": "ventas",
  "created": true
}
application/json

Leer los mensajes de una conversacion

GET
/v1/external/conversations/{id}/messages

Leer los mensajes de una conversacion › path Parameters

id
​string · required

Leer los mensajes de una conversacion › query Parameters

incluirNotas
​boolean

true 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.

HiloDeConversacionDto
conversationId
​string · required
​MensajeDto[] · required

Del mas viejo al mas nuevo.

GET/v1/external/conversations/{id}/messages
curl /v1/external/conversations/:id/messages \
  --header 'Authorization: Bearer <token>'
Example Responses
{
  "conversationId": "conversationId",
  "messages": [
    {
      "role": "user",
      "content": "content",
      "createdAt": "2024-08-25T15:00:00Z",
      "author": "author"
    }
  ]
}
application/json

Mandar un mensaje y recibir la respuesta

POST
/v1/external/conversations/{id}/messages

Mandar un mensaje y recibir la respuesta › path Parameters

id
​string · required

Mandar un mensaje y recibir la respuesta › Request Body

SendAgentMessageDto
message
​string · maxLength: 4000 · required
externalRef
​string · maxLength: 120

El 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.

RespuestaDelAgenteDto
conversationId
​string · required
status
​string · enum · required

answered: 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).

Enum values:
answered
pending
human
response
​string

Lo que contesto el agente. Solo viene cuando status es answered.

alreadySent
​boolean

true 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.

POST/v1/external/conversations/{id}/messages
curl /v1/external/conversations/:id/messages \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer <token>' \
  --data '{
  "message": "message",
  "externalRef": "externalRef"
}'
Example Request Body
{
  "message": "message",
  "externalRef": "externalRef"
}
Example Responses
{
  "conversationId": "conversationId",
  "status": "answered",
  "response": "response",
  "alreadySent": true
}
application/json

Crear o reemplazar un documento de conocimiento

PUT
/v1/external/knowledge/documents

Idempotente por (coleccion, filename): el mismo filename reemplaza el documento y sus chunks.

Crear o reemplazar un documento de conocimiento › Request Body

PushKnowledgeDocumentDto
collectionId
​string · required

La colección donde vive el documento. Tiene que ser tuya.

filename
​string · maxLength: 500 · required

Ruta relativa del archivo, p. ej. "docs/pricing.md". Es la identidad: el mismo valor reemplaza el documento anterior.

content
​string · required

El contenido del documento, en markdown.

Crear o reemplazar un documento de conocimiento › Responses

Documento creado o reemplazado.

DocumentoEmpujadoDto
id
​string · required

El id del documento. Es lo que va en documentId para borrarlo.

collectionId
​string · required
filename
​string · required

La ruta relativa que se mando. Junto con la coleccion, es la identidad del documento.

Example: guias/precios-2026.md
status
​string · enum · required

processing 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.

Enum values:
processing
ready
failed
PUT/v1/external/knowledge/documents
curl /v1/external/knowledge/documents \
  --request PUT \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer <token>' \
  --data '{
  "collectionId": "collectionId",
  "filename": "filename",
  "content": "content"
}'
Example Request Body
{
  "collectionId": "collectionId",
  "filename": "filename",
  "content": "content"
}
Example Responses
{
  "id": "id",
  "collectionId": "collectionId",
  "filename": "guias/precios-2026.md",
  "status": "processing"
}
application/json

Listar las colecciones de conocimiento

GET
/v1/external/knowledge/collections

Listar las colecciones de conocimiento › query Parameters

limit
​number · min: 1 · max: 500

Cuántas filas devolver. Por omisión 50.

Default: 50
offset
​number · min: 0

Cuántas saltear. Por omisión 0.

Default: 0

Listar las colecciones de conocimiento › Responses

Una pagina de colecciones.

PaginaDeColeccionesDto
limit
​number · required

Cuantas filas se pidieron. Es el limit del pedido o 50 si no se mando.

Example: 50
offset
​number · required

Cuantas filas se saltearon. Es el offset del pedido o 0.

Example: 0
hasMore
​boolean · required

true si hay mas filas despues de esta pagina. Para seguir, repetir el pedido con offset + limit.

​ColeccionDto[] · required
GET/v1/external/knowledge/collections
curl /v1/external/knowledge/collections \
  --header 'Authorization: Bearer <token>'
Example Responses
{ "limit": 50, "offset": 0, "hasMore": true, "data": [ { "id": "id", "slug": "guias-precios", "name": "name", "description": "description", "createdAt": "2024-08-25T15:00:00Z", "documentCount": 12 } ] }
application/json

Crear una coleccion de conocimiento, o recuperar la que ya existe

POST
/v1/external/knowledge/collections

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

CrearColeccionDto
slug
​string · maxLength: 100 · required

El identificador que eliges tú. Es la llave de idempotencia: dos llamadas con el mismo slug devuelven la misma coleccion.

Example: guias-precios
name
​string · maxLength: 255 · required

Como se llama la coleccion en la pantalla.

Example: Guías de precios
description
​string · maxLength: 1000

Para 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.

ColeccionCreadaDto
id
​string · required

El id de la coleccion. Es lo que va en collectionId al empujar documentos y al asignarla a un agente.

slug
​string · required
name
​string · required
description
​string | null · required
createdAt
​string · date-time · required
POST/v1/external/knowledge/collections
curl /v1/external/knowledge/collections \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer <token>' \
  --data '{
  "slug": "guias-precios",
  "name": "Guías de precios",
  "description": "description"
}'
Example Request Body
{
  "slug": "guias-precios",
  "name": "Guías de precios",
  "description": "description"
}
Example Responses
{
  "id": "id",
  "slug": "guias-precios",
  "name": "name",
  "description": "description",
  "createdAt": "2024-08-25T15:00:00Z"
}
application/json

Listar los documentos de una coleccion

GET
/v1/external/knowledge/collections/{collectionId}/documents

Listar los documentos de una coleccion › path Parameters

collectionId
​string · required

Listar los documentos de una coleccion › query Parameters

limit
​number · min: 1 · max: 500

Cuántas filas devolver. Por omisión 50.

Default: 50
offset
​number · min: 0

Cuántas saltear. Por omisión 0.

Default: 0

Listar los documentos de una coleccion › Responses

Una pagina de documentos.

PaginaDeDocumentosDto
limit
​number · required

Cuantas filas se pidieron. Es el limit del pedido o 50 si no se mando.

Example: 50
offset
​number · required

Cuantas filas se saltearon. Es el offset del pedido o 0.

Example: 0
hasMore
​boolean · required

true si hay mas filas despues de esta pagina. Para seguir, repetir el pedido con offset + limit.

​DocumentoDto[] · required
GET/v1/external/knowledge/collections/{collectionId}/documents
curl /v1/external/knowledge/collections/:collectionId/documents \
  --header 'Authorization: Bearer <token>'
Example Responses
{ "limit": 50, "offset": 0, "hasMore": true, "data": [ { "id": "id", "collectionId": "collectionId", "filename": "guias/precios-2026.md", "status": "processing", "sizeBytes": 18432, "chunkCount": 0, "error": "error", "createdAt": "2024-08-25T15:00:00Z", "updatedAt": "2024-08-25T15:00:00Z" } ] }
application/json

Borrar un documento y sacarlo del indice

DELETE
/v1/external/knowledge/documents/{documentId}

Borra sus trozos y saca el documento de circulacion. El agente deja de poder citarlo.

Borrar un documento y sacarlo del indice › path Parameters

documentId
​string · required

Borrar un documento y sacarlo del indice › Responses

Borrado.

No data returned
DELETE/v1/external/knowledge/documents/{documentId}
curl /v1/external/knowledge/documents/:documentId \
  --request DELETE \
  --header 'Authorization: Bearer <token>'
Example Responses
No example specified for this content type

Asignarle una coleccion a un agente

PUT
/v1/external/agents/{agentId}/knowledge/{collectionId}

Idempotente: asignar la misma dos veces no la duplica ni falla. Sin esto, el documento esta indexado y no lo alcanza nadie.

Asignarle una coleccion a un agente › path Parameters

agentId
​string · required
collectionId
​string · required

Asignarle una coleccion a un agente › Responses

Asignada.

No data returned
PUT/v1/external/agents/{agentId}/knowledge/{collectionId}
curl /v1/external/agents/:agentId/knowledge/:collectionId \
  --request PUT \
  --header 'Authorization: Bearer <token>'
Example Responses
No example specified for this content type

Quitarle una coleccion a un agente

DELETE
/v1/external/agents/{agentId}/knowledge/{collectionId}

La coleccion no se borra: deja de estar asignada a ese agente. Quitar algo que no estaba no es un error.

Quitarle una coleccion a un agente › path Parameters

agentId
​string · required
collectionId
​string · required

Quitarle una coleccion a un agente › Responses

Quitada.

No data returned
DELETE/v1/external/agents/{agentId}/knowledge/{collectionId}
curl /v1/external/agents/:agentId/knowledge/:collectionId \
  --request DELETE \
  --header 'Authorization: Bearer <token>'
Example Responses
No example specified for this content type

Listar las plantillas de agente disponibles

GET
/v1/external/agent-templates

Las privadas de tu organizacion mas las del catalogo comun. De aca sale el templateId para instanciar.

Listar las plantillas de agente disponibles › query Parameters

limit
​number · min: 1 · max: 500

Cuántas filas devolver. Por omisión 50.

Default: 50
offset
​number · min: 0

Cuántas saltear. Por omisión 0.

Default: 0

Listar las plantillas de agente disponibles › Responses

Una pagina de plantillas.

PaginaDePlantillasDto
limit
​number · required

Cuantas filas se pidieron. Es el limit del pedido o 50 si no se mando.

Example: 50
offset
​number · required

Cuantas filas se saltearon. Es el offset del pedido o 0.

Example: 0
hasMore
​boolean · required

true si hay mas filas despues de esta pagina. Para seguir, repetir el pedido con offset + limit.

​PlantillaDto[] · required
GET/v1/external/agent-templates
curl /v1/external/agent-templates \
  --header 'Authorization: Bearer <token>'
Example Responses
{ "limit": 50, "offset": 0, "hasMore": true, "data": [ { "id": "id", "slug": "ventas-inmobiliaria", "name": "name", "description": "description", "category": "ventas", "knowledgeCollections": [ "precios", "preguntas-frecuentes" ] } ] }
application/json

Crear un agente a partir de una plantilla

POST
/v1/external/agent-templates/{templateId}/instantiate

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.

Crear un agente a partir de una plantilla › path Parameters

templateId
​string · required

Crear un agente a partir de una plantilla › Request Body

InstanciarPlantillaDto
slug
​string · required

Identificador del agente dentro de tu organizacion. Es la llave de idempotencia: reintentar con el mismo slug devuelve el mismo agente, no uno nuevo.

Example: ventas
name
​string

Como 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.

AgenteInstanciadoDto
id
​string · required

El id del agente. Es lo que va en agentId.

slug
​string · required
name
​string · required
status
​string · enum · required

Recien instanciado queda en draft; se activa con POST /agents/{agentId}/activate.

Enum values:
draft
active
paused
archived
audience
​string · enum · required
Enum values:
external
internal
channels
​string[] · required

Los canales por los que atiende. Vacio significa todos.

createdAt
​string · date-time · required
​ConocimientoInstanciadoDto · required
POST/v1/external/agent-templates/{templateId}/instantiate
curl /v1/external/agent-templates/:templateId/instantiate \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer <token>' \
  --data '{
  "slug": "ventas",
  "name": "name"
}'
Example Request Body
{
  "slug": "ventas",
  "name": "name"
}
Example Responses
{ "id": "id", "slug": "ventas", "name": "name", "status": "draft", "audience": "external", "channels": [ "string" ], "createdAt": "2024-08-25T15:00:00Z", "knowledge": { "assigned": [ "string" ], "missing": [ "string" ] } }
application/json

Sacarle una plantilla a un agente que ya anda

POST
/v1/external/agents/{agentId}/template

Fotografia su configuracion —prompt, modelo, acciones, canales y las colecciones de conocimiento que tiene asignadas— para poder clonarlo.

Sacarle una plantilla a un agente que ya anda › path Parameters

agentId
​string · required

Sacarle una plantilla a un agente que ya anda › Request Body

SacarPlantillaDto
name
​string · required

Como se llama la plantilla.

category
​string · required

En que parte del catalogo va. Por ejemplo sales o support.

slug
​string

Identificador de la plantilla. Por omision se deriva del nombre.

description
​string

Para que sirve esta plantilla.

Sacarle una plantilla a un agente que ya anda › Responses

La plantilla.

PlantillaDto
id
​string · required

El id de la plantilla. Es lo que va en templateId.

slug
​string · required
name
​string · required
description
​string | null · required
category
​string · required

Para agrupar en la galeria.

Example: ventas
knowledgeCollections
​string[] · required

Los 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.

Example: ["precios","preguntas-frecuentes"]
POST/v1/external/agents/{agentId}/template
curl /v1/external/agents/:agentId/template \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer <token>' \
  --data '{
  "name": "name",
  "category": "category",
  "slug": "slug",
  "description": "description"
}'
Example Request Body
{
  "name": "name",
  "category": "category",
  "slug": "slug",
  "description": "description"
}
Example Responses
{
  "id": "id",
  "slug": "ventas-inmobiliaria",
  "name": "name",
  "description": "description",
  "category": "ventas",
  "knowledgeCollections": [
    "precios",
    "preguntas-frecuentes"
  ]
}
application/json

Activar un agente

POST
/v1/external/agents/{agentId}/activate

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.

Activar un agente › path Parameters

agentId
​string · required

Activar un agente › Responses

Activo, con su readiness.

AgenteActivadoDto
id
​string · required

El id del agente. Es lo que va en agentId.

slug
​string · required
name
​string · required
status
​string · enum · required

Recien instanciado queda en draft; se activa con POST /agents/{agentId}/activate.

Enum values:
draft
active
paused
archived
audience
​string · enum · required
Enum values:
external
internal
channels
​string[] · required

Los canales por los que atiende. Vacio significa todos.

createdAt
​string · date-time · required
​FaltaParaAlcanzarDto[] · required

Lo que todavia impide que alguien lo alcance. Vacio significa que ya lo alcanza cualquiera. Activar no falla por esto: informa.

POST/v1/external/agents/{agentId}/activate
curl /v1/external/agents/:agentId/activate \
  --request POST \
  --header 'Authorization: Bearer <token>'
Example Responses
{ "id": "id", "slug": "ventas", "name": "name", "status": "draft", "audience": "external", "channels": [ "string" ], "createdAt": "2024-08-25T15:00:00Z", "readiness": [ { "codigo": "sin_flujo", "mensaje": "mensaje" } ] }
application/json

Pausar un agente

POST
/v1/external/agents/{agentId}/pause

Deja de atender. Las conversaciones abiertas quedan; no contesta hasta que se lo active de nuevo.

Pausar un agente › path Parameters

agentId
​string · required

Pausar un agente › Responses

Pausado.

AgenteAprovisionadoDto
id
​string · required

El id del agente. Es lo que va en agentId.

slug
​string · required
name
​string · required
status
​string · enum · required

Recien instanciado queda en draft; se activa con POST /agents/{agentId}/activate.

Enum values:
draft
active
paused
archived
audience
​string · enum · required
Enum values:
external
internal
channels
​string[] · required

Los canales por los que atiende. Vacio significa todos.

createdAt
​string · date-time · required
POST/v1/external/agents/{agentId}/pause
curl /v1/external/agents/:agentId/pause \
  --request POST \
  --header 'Authorization: Bearer <token>'
Example Responses
{
  "id": "id",
  "slug": "ventas",
  "name": "name",
  "status": "draft",
  "audience": "external",
  "channels": [
    "string"
  ],
  "createdAt": "2024-08-25T15:00:00Z"
}
application/json

Listar los agentes de la organizacion

GET
/v1/external/agents

Listar los agentes de la organizacion › query Parameters

limit
​number · min: 1 · max: 500

Cuántas filas devolver. Por omisión 50.

Default: 50
offset
​number · min: 0

Cuántas saltear. Por omisión 0.

Default: 0

Listar los agentes de la organizacion › Responses

Una pagina de agentes.

PaginaDeAgentesDto
limit
​number · required

Cuantas filas se pidieron. Es el limit del pedido o 50 si no se mando.

Example: 50
offset
​number · required

Cuantas filas se saltearon. Es el offset del pedido o 0.

Example: 0
hasMore
​boolean · required

true si hay mas filas despues de esta pagina. Para seguir, repetir el pedido con offset + limit.

​AgenteResumenDto[] · required
GET/v1/external/agents
curl /v1/external/agents \
  --header 'Authorization: Bearer <token>'
Example Responses
{ "limit": 50, "offset": 0, "hasMore": true, "data": [ { "id": "id", "slug": "ventas", "name": "name", "description": "description", "status": "draft", "audience": "external", "runtimeType": "text", "channels": [ "whatsapp", "api" ], "version": 3, "createdAt": "2024-08-25T15:00:00Z", "updatedAt": "2024-08-25T15:00:00Z" } ] }
application/json

Leer un agente entero

GET
/v1/external/agents/{agentId}

Leer un agente entero › path Parameters

agentId
​string · required

Leer un agente entero › Responses

El agente. knowledge viene solo si la credencial ademas tiene knowledge:read.

AgenteDto
id
​string · required

El id del agente. Es lo que va en agentId.

slug
​string · required

El identificador que se eligio al crearlo. Unico en la organizacion.

Example: ventas
name
​string · required

Como se llama en el panel.

description
​string | null · required

Para que sirve, si se escribio.

status
​string · enum · required

draft recien creado; active atendiendo; paused no contesta; archived retirado.

Enum values:
draft
active
paused
archived
audience
​string · enum · required

A quien atiende. Por esta API solo se ven agentes external: los internal se administran desde el panel.

Enum values:
external
internal
runtimeType
​string · enum · required

text o voice.

Enum values:
text
voice
channels
​string[] · required

Los canales por los que atiende. Vacio significa todos. Para atender por esta API tiene que incluir api.

Example: ["whatsapp","api"]
version
​number · required

Sube 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.

Example: 3
createdAt
​string · date-time · required
updatedAt
​string · date-time · required

Ultimo 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.

systemPrompt
​string · required

Las instrucciones del agente, enteras. Es el texto que se cambia con PATCH.

​ModeloDelAgenteDto · required
maxIterations
​number · required

Cuantas vueltas puede dar el agente en un turno.

Example: 10
maxTokens
​number · required

Techo de tokens por turno.

Example: 100000
​AccionDelAgenteDto[] · required

Las acciones que tiene concedidas hoy. Con actions:read, ademas el origen al que llama cada una; nunca la direccion entera.

​CanalDelAgenteDto[] · required

Los canales de channels, con su nombre y si estan conectados.

​ColeccionAsignadaDto[]

Las colecciones de conocimiento asignadas y habilitadas. Solo viene si la credencial ademas tiene knowledge:read; si no, el campo no esta.

GET/v1/external/agents/{agentId}
curl /v1/external/agents/:agentId \
  --header 'Authorization: Bearer <token>'
Example Responses
{ "id": "id", "slug": "ventas", "name": "name", "description": "description", "status": "draft", "audience": "external", "runtimeType": "text", "channels": [ "whatsapp", "api" ], "version": 3, "createdAt": "2024-08-25T15:00:00Z", "updatedAt": "2024-08-25T15:00:00Z", "systemPrompt": "systemPrompt", "model": { "provider": "bedrock", "model": "model", "maxOutputTokens": 0, "effort": "medium", "alwaysLoadedTools": [ "string" ] }, "maxIterations": 10, "maxTokens": 100000, "actions": [ { "slug": "slug", "name": "name", "description": "description", "destinationOrigin": "https://n8n.tuempresa.cl" } ], "channelDetails": [ { "slug": "slug", "name": "name", "connected": true } ], "knowledge": [ { "id": "id", "name": "name" } ] }
application/json

Cambiar la configuracion de un agente

PATCH
/v1/external/agents/{agentId}

Cambia solo lo que mandes. Si mandas expectedVersion y alguien lo cambio en el medio, la respuesta es 409 y no se escribe nada.

Cambiar la configuracion de un agente › path Parameters

agentId
​string · required

Cambiar la configuracion de un agente › Request Body

ActualizarAgenteDto
name
​string

Como se llama el agente.

description
​string

Para que sirve.

systemPrompt
​string

Las instrucciones del agente. Queda una version en el historial.

llmConfig
​object

Con que modelo contesta: { primary: { provider, model }, fallback?: { provider, model } }.

maxTokens
​number · min: 1000 · max: 5000000

Cuantos tokens puede gastar el agente en un turno, sumando entrada y salida de todas sus vueltas. Si se pasa, el turno se detiene.

expectedVersion
​number

La 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.

AgenteGestionadoDto
id
​string · required
slug
​string · required
name
​string · required
description
​string | null · required
status
​string · enum · required
Enum values:
draft
active
paused
archived
version
​number · required

La version nueva. Es lo que va en expectedVersion del proximo PATCH para no pisar un cambio ajeno.

Example: 4
updatedAt
​string · date-time · required
PATCH/v1/external/agents/{agentId}
curl /v1/external/agents/:agentId \
  --request PATCH \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer <token>' \
  --data '{
  "name": "name",
  "description": "description",
  "systemPrompt": "systemPrompt",
  "llmConfig": {},
  "maxTokens": 1000,
  "expectedVersion": 0
}'
Example Request Body
{
  "name": "name",
  "description": "description",
  "systemPrompt": "systemPrompt",
  "llmConfig": {},
  "maxTokens": 1000,
  "expectedVersion": 0
}
Example Responses
{
  "id": "id",
  "slug": "slug",
  "name": "name",
  "description": "description",
  "status": "draft",
  "version": 4,
  "updatedAt": "2024-08-25T15:00:00Z"
}
application/json

El historial de instrucciones del agente

GET
/v1/external/agents/{agentId}/prompt-versions

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.

El historial de instrucciones del agente › path Parameters

agentId
​string · required

El historial de instrucciones del agente › Responses

Las versiones.

HistorialDePromptsDto
​VersionDePromptDto[] · required

De la mas nueva a la mas vieja. Hasta 50.

GET/v1/external/agents/{agentId}/prompt-versions
curl /v1/external/agents/:agentId/prompt-versions \
  --header 'Authorization: Bearer <token>'
Example Responses
{
  "data": [
    {
      "id": "id",
      "version": 2,
      "chars": 4821,
      "createdAt": "2024-08-25T15:00:00Z"
    }
  ]
}
application/json

Volver a una version anterior del prompt

POST
/v1/external/agents/{agentId}/prompt-versions/{versionId}/restore

Escribe el texto viejo como una version NUEVA. No rebobina: nunca se pierde a lo que estabas volviendo.

Volver a una version anterior del prompt › path Parameters

agentId
​string · required
versionId
​string · required

Volver a una version anterior del prompt › Responses

El agente, con el prompt viejo.

AgenteRestauradoDto
id
​string · required
slug
​string · required
name
​string · required
description
​string | null · required
status
​string · enum · required
Enum values:
draft
active
paused
archived
version
​number · required

La version nueva. Es lo que va en expectedVersion del proximo PATCH para no pisar un cambio ajeno.

Example: 4
updatedAt
​string · date-time · required
​object · required

De que version salio el texto. El agente queda con una version NUEVA que lo copia; la vieja sigue en el historial.

POST/v1/external/agents/{agentId}/prompt-versions/{versionId}/restore
curl /v1/external/agents/:agentId/prompt-versions/:versionId/restore \
  --request POST \
  --header 'Authorization: Bearer <token>'
Example Responses
{
  "id": "id",
  "slug": "slug",
  "name": "name",
  "description": "description",
  "status": "draft",
  "version": 4,
  "updatedAt": "2024-08-25T15:00:00Z",
  "restoredFrom": {
    "id": "id",
    "version": 2
  }
}
application/json

El texto de autorizacion que hay que aceptar, y su version

GET
/v1/external/actions/authorization

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.

AutorizacionVigenteDto
version
​string · required

La 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.

Example: 2026-09-1
​object · required

La autorizacion de entrega del art. 15 bis de la Ley 21.719, que se acepta siempre.

​object · required

La confirmacion extra cuando el destino no esta en Chile. Se acepta con confirmaSalidaDelPais: true.

paises
​string[] · required

Los valores que acepta destinationCountry.

Enum values:
chile
fuera_de_chile
desconocido
GET/v1/external/actions/authorization
curl /v1/external/actions/authorization \
  --header 'Authorization: Bearer <token>'
Example Responses
{ "version": "2026-09-1", "vigente": { "version": "2026-09-1", "texto": "texto", "detalle": "detalle" }, "fueraDeChile": { "version": "2026-09-1", "texto": "texto", "detalle": "detalle" }, "paises": [ "chile" ] }
application/json

Las acciones HTTP de tu organizacion

GET
/v1/external/actions

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.

ListaDeAccionesDto
​AccionDto[] · required

Las acciones HTTP activas de la organizacion.

GET/v1/external/actions
curl /v1/external/actions \
  --header 'Authorization: Bearer <token>'
Example Responses
{ "data": [ { "slug": "crear_ticket", "name": "name", "description": "description", "method": "GET", "origin": "https://api.tusistema.cl", "headerNames": [ "Authorization" ], "parameters": {}, "variables": [ { "nombre": "sesion_id", "variable": "conversacion.id", "origen": "campo_del_caso", "campo": "rut_comprador", "opcional": false } ], "audience": "external", "status": "active" } ] }
application/json

Registrar una accion HTTP

POST
/v1/external/actions

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

CrearAccionHttpDto
name
​string · required

Como se llama la accion.

description
​string · required

Lo que lee el agente para decidir cuando usarla. Sin esto no la usa nunca.

url
​string · required

A donde llama. No vuelve en ninguna respuesta: de la direccion solo se devuelve el origen.

Example: https://api.tusistema.cl/tickets
method
​string · required

GET, POST, PUT, PATCH o DELETE.

slug
​string · required

Identificador de la accion. Es con lo que se le concede a un agente, y es la llave para reintentar sin duplicar.

Example: crear_ticket
timeout
​number

Milisegundos de espera.

headers
​object

Nombre de cabecera a valor. Aca viaja tu credencial: se cifra antes de guardarla y no vuelve nunca en una respuesta.

parameters
​object

JSON Schema de los parametros que el agente va a completar.

​VariableDeAccionDto[]

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.

Example: [{"nombre":"sesion_id","variable":"conversacion.id"}]
purpose
​string

Para 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.

Example: Abrir tickets de soporte con lo que cuenta el cliente.
destinationCountry
​string · enum

Donde esta alojado ese sistema, declarado por ti: chile, fuera_de_chile o desconocido. "No se" cuenta como fuera. Parte de la autorizacion de destino.

Enum values:
chile
fuera_de_chile
desconocido
autorizacionVersion
​string

La version del texto de autorizacion que aceptas. Se lee en GET /v1/external/actions/authorization. Parte de la autorizacion de destino.

Example: 2026-09-1
confirmaSalidaDelPais
​boolean

La segunda confirmacion, obligatoria cuando el destino no esta en Chile: los datos salen del pais y eso es una transferencia internacional.

paraClientes
​boolean

A 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.

AccionDto
slug
​string · required

El identificador de la accion. Es lo que va al concederla a un agente y al darla de baja.

Example: crear_ticket
name
​string · required
description
​string · required

Lo que lee el agente para decidir cuando usarla.

method
​string · enum · required
Enum values:
GET
POST
PUT
PATCH
DELETE
origin
​string · required

Solo el origen de la direccion registrada (esquema, host y puerto). La direccion completa no vuelve nunca: en muchos webhooks el path es la credencial.

Example: https://api.tusistema.cl
headerNames
​string[] · required

Los nombres de las cabeceras configuradas. Los valores no vuelven nunca.

Example: ["Authorization"]
​object · required

El JSON Schema de los parametros que el agente completa al usarla.

​VariableGuardadaDto[] · required

Los campos que Lelemon agrega en cada llamada. Vacia si no tiene.

audience
​string | null · enum · required

A 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.

Enum values:
external
internal
status
​string · required

active si esta disponible; inactive si se dio de baja.

Example: active
POST/v1/external/actions
curl /v1/external/actions \ --request POST \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer <token>' \ --data '{ "name": "name", "description": "description", "url": "https://api.tusistema.cl/tickets", "method": "method", "slug": "crear_ticket", "timeout": 0, "headers": {}, "parameters": {}, "variables": [ { "nombre": "sesion_id", "variable": "conversacion.id" } ], "purpose": "Abrir tickets de soporte con lo que cuenta el cliente.", "destinationCountry": "chile", "autorizacionVersion": "2026-09-1", "confirmaSalidaDelPais": true, "paraClientes": true }'
Example Request Body
{ "name": "name", "description": "description", "url": "https://api.tusistema.cl/tickets", "method": "method", "slug": "crear_ticket", "timeout": 0, "headers": {}, "parameters": {}, "variables": [ { "nombre": "sesion_id", "variable": "conversacion.id" } ], "purpose": "Abrir tickets de soporte con lo que cuenta el cliente.", "destinationCountry": "chile", "autorizacionVersion": "2026-09-1", "confirmaSalidaDelPais": true, "paraClientes": true }
Example Responses
{ "slug": "crear_ticket", "name": "name", "description": "description", "method": "GET", "origin": "https://api.tusistema.cl", "headerNames": [ "Authorization" ], "parameters": {}, "variables": [ { "nombre": "sesion_id", "variable": "conversacion.id", "origen": "campo_del_caso", "campo": "rut_comprador", "opcional": false } ], "audience": "external", "status": "active" }
application/json

Dar de baja una accion HTTP

DELETE
/v1/external/actions/{slug}

Deja de estar disponible y se retira de todos los agentes. El slug queda ocupado: volver a registrarlo reescribe esta misma accion.

Dar de baja una accion HTTP › path Parameters

slug
​string · required

Dar de baja una accion HTTP › Responses

Dada de baja.

No data returned
DELETE/v1/external/actions/{slug}
curl /v1/external/actions/:slug \
  --request DELETE \
  --header 'Authorization: Bearer <token>'
Example Responses
No example specified for this content type

Que acciones alcanza un agente y cuales tiene prendidas

GET
/v1/external/agents/{agentId}/actions

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.

Que acciones alcanza un agente y cuales tiene prendidas › path Parameters

agentId
​string · required

Que acciones alcanza un agente y cuales tiene prendidas › Responses

Las acciones.

CatalogoDeAccionesDelAgenteDto
​AccionDelCatalogoDto[] · required
GET/v1/external/agents/{agentId}/actions
curl /v1/external/agents/:agentId/actions \
  --header 'Authorization: Bearer <token>'
Example Responses
{
  "data": [
    {
      "slug": "slug",
      "name": "name",
      "description": "description",
      "source": "Tus sistemas",
      "enabled": true,
      "destinationOrigin": "https://n8n.tuempresa.cl"
    }
  ]
}
application/json

Concederle una accion a un agente

PUT
/v1/external/agents/{agentId}/actions/{slug}

Idempotente: concederla dos veces no la duplica ni falla. Se concede de a una, nunca mandando la lista entera.

Concederle una accion a un agente › path Parameters

agentId
​string · required
slug
​string · required

Concederle una accion a un agente › Responses

Concedida.

No data returned
PUT/v1/external/agents/{agentId}/actions/{slug}
curl /v1/external/agents/:agentId/actions/:slug \
  --request PUT \
  --header 'Authorization: Bearer <token>'
Example Responses
No example specified for this content type

Quitarle una accion a un agente

DELETE
/v1/external/agents/{agentId}/actions/{slug}

Quitar algo que no estaba no es un error. La accion no se borra: deja de estar concedida a ese agente.

Quitarle una accion a un agente › path Parameters

agentId
​string · required
slug
​string · required

Quitarle una accion a un agente › Responses

Quitada.

No data returned
DELETE/v1/external/agents/{agentId}/actions/{slug}
curl /v1/external/agents/:agentId/actions/:slug \
  --request DELETE \
  --header 'Authorization: Bearer <token>'
Example Responses
No example specified for this content type

Reportar un hecho de tu sistema

POST
/v1/external/events

Reportar un hecho de tu sistema › Request Body

ReportarHechoDto
evento
​string · required

Que paso, con el nombre que uses en tu sistema. Es el mismo nombre que declara el trigger que lo escucha.

Example: primera_empresa_conectada
externalId
​string · required

El 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.

Example: usuario-1234
datos
​object

Contexto 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.

HechoReportadoDto
​ResultadoDeTriggerDto[] · required

Una entrada por trigger que escuchaba el hecho. Vacio si ninguno lo escuchaba.

duplicado
​boolean · required

Verdadero 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.

motivo
​string · enum

Por 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.

Enum values:
sin trigger
control humano
error
POST/v1/external/events
curl /v1/external/events \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer <token>' \
  --data '{
  "evento": "primera_empresa_conectada",
  "externalId": "usuario-1234",
  "datos": {}
}'
Example Request Body
{
  "evento": "primera_empresa_conectada",
  "externalId": "usuario-1234",
  "datos": {}
}
Example Responses
{
  "triggers": [
    {
      "triggerId": "triggerId",
      "estado": "disparo"
    }
  ],
  "duplicado": true,
  "motivo": "sin trigger"
}
application/json

Listar los triggers de la organizacion

GET
/v1/external/triggers

Listar los triggers de la organizacion › Responses

Los triggers, el mas nuevo primero.

TriggersDto
​TriggerDto[] · required
GET/v1/external/triggers
curl /v1/external/triggers \
  --header 'Authorization: Bearer <token>'
Example Responses
{ "triggers": [ { "id": "id", "agentId": "agentId", "evento": "primera_empresa_conectada", "texto": "texto", "abrirPanel": true, "activo": true, "createdAt": "2024-08-25T15:00:00Z", "updatedAt": "2024-08-25T15:00:00Z" } ] }
application/json

Crear un trigger

POST
/v1/external/triggers

Crear un trigger › Request Body

CrearTriggerDto
agentId
​string · required

Que agente escribe. Tiene que ser de tu organizacion, estar activo, y ser de los que la API administra.

evento
​string · required

El hecho que despierta este trigger, con el nombre que uses en tu sistema. Es el mismo que mandas a POST /v1/external/events.

Example: primera_empresa_conectada
texto
​string · required

Lo que el agente dice.

abrirPanel
​boolean

Si tu aplicacion deberia traer la conversacion al frente al recibir el aviso. Viaja tal cual en el webhook; la decision es tuya.

Default: false
activo
​boolean

Nace activo. Manda false para crearlo pausado.

Default: true

Crear un trigger › Responses

El trigger creado, activo.

TriggerDto
id
​string · required
agentId
​string · required

El agente que escribe.

evento
​string · required

El hecho que lo despierta.

Example: primera_empresa_conectada
texto
​string · required

Lo que el agente dice.

abrirPanel
​boolean · required

Si tu aplicacion deberia traer la conversacion al frente. Viaja tal cual en el aviso saliente.

activo
​boolean · required

Un trigger pausado no dispara.

createdAt
​string · date-time · required
updatedAt
​string · date-time · required
POST/v1/external/triggers
curl /v1/external/triggers \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer <token>' \
  --data '{
  "agentId": "agentId",
  "evento": "primera_empresa_conectada",
  "texto": "texto",
  "abrirPanel": false,
  "activo": true
}'
Example Request Body
{
  "agentId": "agentId",
  "evento": "primera_empresa_conectada",
  "texto": "texto",
  "abrirPanel": false,
  "activo": true
}
Example Responses
{
  "id": "id",
  "agentId": "agentId",
  "evento": "primera_empresa_conectada",
  "texto": "texto",
  "abrirPanel": true,
  "activo": true,
  "createdAt": "2024-08-25T15:00:00Z",
  "updatedAt": "2024-08-25T15:00:00Z"
}
application/json

Editar o pausar un trigger

PATCH
/v1/external/triggers/{id}

Editar o pausar un trigger › path Parameters

id
​string · required

Editar o pausar un trigger › Request Body

EditarTriggerDto
texto
​string
abrirPanel
​boolean
activo
​boolean

Un 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.

TriggerDto
id
​string · required
agentId
​string · required

El agente que escribe.

evento
​string · required

El hecho que lo despierta.

Example: primera_empresa_conectada
texto
​string · required

Lo que el agente dice.

abrirPanel
​boolean · required

Si tu aplicacion deberia traer la conversacion al frente. Viaja tal cual en el aviso saliente.

activo
​boolean · required

Un trigger pausado no dispara.

createdAt
​string · date-time · required
updatedAt
​string · date-time · required
PATCH/v1/external/triggers/{id}
curl /v1/external/triggers/:id \
  --request PATCH \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer <token>' \
  --data '{
  "texto": "texto",
  "abrirPanel": true,
  "activo": true
}'
Example Request Body
{
  "texto": "texto",
  "abrirPanel": true,
  "activo": true
}
Example Responses
{
  "id": "id",
  "agentId": "agentId",
  "evento": "primera_empresa_conectada",
  "texto": "texto",
  "abrirPanel": true,
  "activo": true,
  "createdAt": "2024-08-25T15:00:00Z",
  "updatedAt": "2024-08-25T15:00:00Z"
}
application/json

Encargarle un trabajo a un agente

POST
/v1/external/agents/{slug}/runs

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::". vence son segundos Unix (UTC), en el futuro y a no mas de 300 segundos. Sin firma valida y vigente responde 401 y no crea nada.

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.

Encargarle un trabajo a un agente › path Parameters

slug
​string · required

Encargarle un trabajo a un agente › Headers

idempotency-key
​string · required
Idempotency-Key
​string

Clave del reintento. Repetirla para el mismo agente devuelve la corrida ya creada, sin duplicarla.

Encargarle un trabajo a un agente › Request Body

CrearCorridaDto
meta
​string · maxLength: 8000 · required

Que tiene que lograr el agente. Se lo trata como texto de un usuario.

Example: Concilia la cartola de agosto de la empresa 76.123.456-7 y dime que quedo pendiente.
​object · required

A nombre de quien corre, firmado por tu sistema. Sin este campo: 400. Con la firma invalida o vencida: 401.

​TopesPedidosDto

Encargarle un trabajo a un agente › Responses

Ya existia una corrida con esta Idempotency-Key para este agente: se devuelve esa, sin crear otra.

CorridaDto
runId
​string · required

El id de la corrida. Es lo que va en la URL para seguirla.

agentSlug
​string · required
estado
​string · enum · required

en_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.

Enum values:
en_curso
esperando_al_humano
terminada_sin_verificar
terminada
detenida
fallida
cancelada
razon
​string | null · enum · required

Con estado detenida, que limite la freno. Con estado fallida y razon "abandonada", nadie contesto la pausa en 30 dias.

Enum values:
vueltas
costo
tiempo
no_supo_terminar
ciclo
abandonada
pregunta
​string | null · required

Con estado esperando_al_humano: lo que el agente pregunto. Respondelo con POST /runs/{id}/answer.

vueltas
​number · required

Vueltas que lleva.

costoUsd
​number · required

Lo que lleva gastado, en dolares.

​TopesDeLaCorridaDto · required
​object · required
cancelacionPedida
​boolean · required

true si pediste cancelarla. Mientras un worker la corre, se cancela al empezar su vuelta siguiente.

creadaEn
​string · date-time · required
iniciadaEn
​string | null · date-time · required
terminadaEn
​string | null · date-time · required
POST/v1/external/agents/{slug}/runs
curl /v1/external/agents/:slug/runs \ --request POST \ --header 'Content-Type: application/json' \ --header 'idempotency-key: <string>' \ --header 'Authorization: Bearer <token>' \ --data '{ "meta": "Concilia la cartola de agosto de la empresa 76.123.456-7 y dime que quedo pendiente.", "pedidoPor": { "id": "pc-user-42", "vence": 1789132000, "firma": "3b1f0c4e8d2a7f6b5c9e0a1d4f7b2c8e6a3d9f0b1c5e7a2d4f6b8c0e2a4d6f81" }, "topes": { "maxVueltas": 0, "maxCostoUsd": 0, "maxMinutos": 0 } }'
Example Request Body
{
  "meta": "Concilia la cartola de agosto de la empresa 76.123.456-7 y dime que quedo pendiente.",
  "pedidoPor": {
    "id": "pc-user-42",
    "vence": 1789132000,
    "firma": "3b1f0c4e8d2a7f6b5c9e0a1d4f7b2c8e6a3d9f0b1c5e7a2d4f6b8c0e2a4d6f81"
  },
  "topes": {
    "maxVueltas": 0,
    "maxCostoUsd": 0,
    "maxMinutos": 0
  }
}
Example Responses
{ "runId": "runId", "agentSlug": "soporte", "estado": "en_curso", "razon": "vueltas", "pregunta": "pregunta", "vueltas": 0, "costoUsd": 0, "topes": { "maxVueltas": 0, "maxCostoUsd": 0, "maxMinutos": 0 }, "resultado": { "resumen": "resumen", "comprobaciones": [ "string" ], "parcial": "parcial", "error": "error" }, "cancelacionPedida": true, "creadaEn": "2024-08-25T15:00:00Z", "iniciadaEn": "2024-08-25T15:00:00Z", "terminadaEn": "2024-08-25T15:00:00Z" }
application/json

Ver en que va una corrida

GET
/v1/external/runs/{id}

Ver en que va una corrida › path Parameters

id
​string · required

Ver en que va una corrida › Responses

La corrida.

CorridaDto
runId
​string · required

El id de la corrida. Es lo que va en la URL para seguirla.

agentSlug
​string · required
estado
​string · enum · required

en_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.

Enum values:
en_curso
esperando_al_humano
terminada_sin_verificar
terminada
detenida
fallida
cancelada
razon
​string | null · enum · required

Con estado detenida, que limite la freno. Con estado fallida y razon "abandonada", nadie contesto la pausa en 30 dias.

Enum values:
vueltas
costo
tiempo
no_supo_terminar
ciclo
abandonada
pregunta
​string | null · required

Con estado esperando_al_humano: lo que el agente pregunto. Respondelo con POST /runs/{id}/answer.

vueltas
​number · required

Vueltas que lleva.

costoUsd
​number · required

Lo que lleva gastado, en dolares.

​TopesDeLaCorridaDto · required
​object · required
cancelacionPedida
​boolean · required

true si pediste cancelarla. Mientras un worker la corre, se cancela al empezar su vuelta siguiente.

creadaEn
​string · date-time · required
iniciadaEn
​string | null · date-time · required
terminadaEn
​string | null · date-time · required
GET/v1/external/runs/{id}
curl /v1/external/runs/:id \
  --header 'Authorization: Bearer <token>'
Example Responses
{ "runId": "runId", "agentSlug": "soporte", "estado": "en_curso", "razon": "vueltas", "pregunta": "pregunta", "vueltas": 0, "costoUsd": 0, "topes": { "maxVueltas": 0, "maxCostoUsd": 0, "maxMinutos": 0 }, "resultado": { "resumen": "resumen", "comprobaciones": [ "string" ], "parcial": "parcial", "error": "error" }, "cancelacionPedida": true, "creadaEn": "2024-08-25T15:00:00Z", "iniciadaEn": "2024-08-25T15:00:00Z", "terminadaEn": "2024-08-25T15:00:00Z" }
application/json

Cancelar una corrida

POST
/v1/external/runs/{id}/cancel

Cancelar una corrida › path Parameters

id
​string · required

Cancelar 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.

CorridaDto
runId
​string · required

El id de la corrida. Es lo que va en la URL para seguirla.

agentSlug
​string · required
estado
​string · enum · required

en_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.

Enum values:
en_curso
esperando_al_humano
terminada_sin_verificar
terminada
detenida
fallida
cancelada
razon
​string | null · enum · required

Con estado detenida, que limite la freno. Con estado fallida y razon "abandonada", nadie contesto la pausa en 30 dias.

Enum values:
vueltas
costo
tiempo
no_supo_terminar
ciclo
abandonada
pregunta
​string | null · required

Con estado esperando_al_humano: lo que el agente pregunto. Respondelo con POST /runs/{id}/answer.

vueltas
​number · required

Vueltas que lleva.

costoUsd
​number · required

Lo que lleva gastado, en dolares.

​TopesDeLaCorridaDto · required
​object · required
cancelacionPedida
​boolean · required

true si pediste cancelarla. Mientras un worker la corre, se cancela al empezar su vuelta siguiente.

creadaEn
​string · date-time · required
iniciadaEn
​string | null · date-time · required
terminadaEn
​string | null · date-time · required
POST/v1/external/runs/{id}/cancel
curl /v1/external/runs/:id/cancel \
  --request POST \
  --header 'Authorization: Bearer <token>'
Example Responses
{ "runId": "runId", "agentSlug": "soporte", "estado": "en_curso", "razon": "vueltas", "pregunta": "pregunta", "vueltas": 0, "costoUsd": 0, "topes": { "maxVueltas": 0, "maxCostoUsd": 0, "maxMinutos": 0 }, "resultado": { "resumen": "resumen", "comprobaciones": [ "string" ], "parcial": "parcial", "error": "error" }, "cancelacionPedida": true, "creadaEn": "2024-08-25T15:00:00Z", "iniciadaEn": "2024-08-25T15:00:00Z", "terminadaEn": "2024-08-25T15:00:00Z" }
application/json

Responderle a una corrida que pregunto algo

POST
/v1/external/runs/{id}/answer

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.

Responderle a una corrida que pregunto algo › path Parameters

id
​string · required

Responderle a una corrida que pregunto algo › Request Body

ResponderCorridaDto
respuesta
​string · maxLength: 4000 · required

La respuesta a lo que pregunto el agente.

​object · required

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.

CorridaDto
runId
​string · required

El id de la corrida. Es lo que va en la URL para seguirla.

agentSlug
​string · required
estado
​string · enum · required

en_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.

Enum values:
en_curso
esperando_al_humano
terminada_sin_verificar
terminada
detenida
fallida
cancelada
razon
​string | null · enum · required

Con estado detenida, que limite la freno. Con estado fallida y razon "abandonada", nadie contesto la pausa en 30 dias.

Enum values:
vueltas
costo
tiempo
no_supo_terminar
ciclo
abandonada
pregunta
​string | null · required

Con estado esperando_al_humano: lo que el agente pregunto. Respondelo con POST /runs/{id}/answer.

vueltas
​number · required

Vueltas que lleva.

costoUsd
​number · required

Lo que lleva gastado, en dolares.

​TopesDeLaCorridaDto · required
​object · required
cancelacionPedida
​boolean · required

true si pediste cancelarla. Mientras un worker la corre, se cancela al empezar su vuelta siguiente.

creadaEn
​string · date-time · required
iniciadaEn
​string | null · date-time · required
terminadaEn
​string | null · date-time · required
POST/v1/external/runs/{id}/answer
curl /v1/external/runs/:id/answer \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer <token>' \
  --data '{
  "respuesta": "respuesta",
  "respondidoPor": {
    "id": "pc-user-42",
    "vence": 1789132000,
    "firma": "3b1f0c4e8d2a7f6b5c9e0a1d4f7b2c8e6a3d9f0b1c5e7a2d4f6b8c0e2a4d6f81"
  }
}'
Example Request Body
{
  "respuesta": "respuesta",
  "respondidoPor": {
    "id": "pc-user-42",
    "vence": 1789132000,
    "firma": "3b1f0c4e8d2a7f6b5c9e0a1d4f7b2c8e6a3d9f0b1c5e7a2d4f6b8c0e2a4d6f81"
  }
}
Example Responses
{ "runId": "runId", "agentSlug": "soporte", "estado": "en_curso", "razon": "vueltas", "pregunta": "pregunta", "vueltas": 0, "costoUsd": 0, "topes": { "maxVueltas": 0, "maxCostoUsd": 0, "maxMinutos": 0 }, "resultado": { "resumen": "resumen", "comprobaciones": [ "string" ], "parcial": "parcial", "error": "error" }, "cancelacionPedida": true, "creadaEn": "2024-08-25T15:00:00Z", "iniciadaEn": "2024-08-25T15:00:00Z", "terminadaEn": "2024-08-25T15:00:00Z" }
application/json

Ver que agendas hay

GET
/v1/external/scheduling/agendas

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.

AgendasDto
​AgendaDto[] · required

Las agendas activas de la organización. Vacío significa que no hay ninguna configurada todavía, no que algo haya fallado.

GET/v1/external/scheduling/agendas
curl /v1/external/scheduling/agendas \
  --header 'Authorization: Bearer <token>'
Example Responses
{
  "agendas": [
    {
      "slug": "fundador",
      "name": "Con el fundador",
      "timezone": "America/Santiago",
      "slotDurationMinutes": 20
    }
  ]
}
application/json

Ver los horarios libres de una agenda

GET
/v1/external/scheduling/availability

Ver los horarios libres de una agenda › query Parameters

agenda
​string · required

Qué agenda mirar, por su slug. Los slugs salen de GET /v1/external/scheduling/agendas.

Example: fundador
daysAhead
​number · min: 1 · max: 60

Cuá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.

Default: 7

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.

DisponibilidadDto
​BloqueLibreDto[] · required

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.

GET/v1/external/scheduling/availability
curl '/v1/external/scheduling/availability?agenda=<string>' \
  --header 'Authorization: Bearer <token>'
Example Responses
{
  "slots": [
    {
      "id": "2026-09-17T14:00:00.000Z",
      "start": "2026-09-17T14:00:00.000Z",
      "end": "2026-09-17T14:20:00.000Z"
    }
  ]
}
application/json

Reservar un horario

POST
/v1/external/scheduling/meetings

Reservar un horario › Request Body

ReservarBloqueDto
agenda
​string · required

En qué agenda reservar, por su slug. El mismo con el que pediste los horarios.

Example: fundador
slotStart
​string · required

Cuándo empieza, en ISO 8601 con zona. Es el id de un bloque devuelto por la disponibilidad.

Example: 2026-09-17T14:00:00.000Z
attendeeEmail
​string · required

Correo de quien agenda. Ahí le llega la invitación.

Example: [email protected]
attendeeName
​string · required

Nombre de quien agenda, como aparece en la invitación.

Example: Ana Pérez
attendeePhone
​string

Teléfono de contacto, si lo tienes.

companyName
​string

Empresa de quien agenda. Va en la descripción del evento.

context
​string

Para 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.

ReunionAgendadaDto
meetingId
​string · required

El id de la reunión. Es lo que se guarda para referirse a ella.

scheduledFor
​string · required

Cuándo quedó, en ISO 8601 con zona.

Example: 2026-09-17T14:00:00.000Z
durationMinutes
​number · required

Cuánto dura, en minutos.

Example: 20
meetLink
​string

El link de la videollamada. Puede no venir si la agenda está configurada sin videollamada.

Example: https://meet.google.com/abc-defg-hij
POST/v1/external/scheduling/meetings
curl /v1/external/scheduling/meetings \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer <token>' \
  --data '{
  "agenda": "fundador",
  "slotStart": "2026-09-17T14:00:00.000Z",
  "attendeeEmail": "[email protected]",
  "attendeeName": "Ana Pérez",
  "attendeePhone": "attendeePhone",
  "companyName": "companyName",
  "context": "context"
}'
Example Request Body
{
  "agenda": "fundador",
  "slotStart": "2026-09-17T14:00:00.000Z",
  "attendeeEmail": "[email protected]",
  "attendeeName": "Ana Pérez",
  "attendeePhone": "attendeePhone",
  "companyName": "companyName",
  "context": "context"
}
Example Responses
{
  "meetingId": "meetingId",
  "scheduledFor": "2026-09-17T14:00:00.000Z",
  "durationMinutes": 20,
  "meetLink": "https://meet.google.com/abc-defg-hij"
}
application/json

Listar los embudos de la organizacion

GET
/v1/external/pipelines

Listar los embudos de la organizacion › query Parameters

limit
​number · min: 1 · max: 500

Cuántas filas devolver. Por omisión 50.

Default: 50
offset
​number · min: 0

Cuántas saltear. Por omisión 0.

Default: 0

Listar los embudos de la organizacion › Responses

Una pagina de embudos.

PaginaDeEmbudosDto
limit
​number · required

Cuantas filas se pidieron. Es el limit del pedido o 50 si no se mando.

Example: 50
offset
​number · required

Cuantas filas se saltearon. Es el offset del pedido o 0.

Example: 0
hasMore
​boolean · required

true si hay mas filas despues de esta pagina. Para seguir, repetir el pedido con offset + limit.

​EmbudoResumenDto[] · required
GET/v1/external/pipelines
curl /v1/external/pipelines \
  --header 'Authorization: Bearer <token>'
Example Responses
{
  "limit": 50,
  "offset": 0,
  "hasMore": true,
  "data": [
    {
      "id": "id",
      "name": "name",
      "status": "draft",
      "createdAt": "2024-08-25T15:00:00Z"
    }
  ]
}
application/json

Leer un embudo entero, con sus etapas y sus campos

GET
/v1/external/pipelines/{id}

Leer un embudo entero, con sus etapas y sus campos › path Parameters

id
​string · required

Leer 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.

EmbudoDto
id
​string · required

El id del embudo. Es lo que va en pipelineId.

name
​string · required

Como se llama en el panel.

status
​string · enum · required

draft recien creado; active en uso; paused pausado; archived retirado.

Enum values:
draft
active
paused
archived
createdAt
​string · date-time · required
​EtapaDelEmbudoDto[] · required

Las etapas vivas, ordenadas.

​CampoDelEmbudoDto[] · required

Los campos que declara el embudo. Son definiciones, sin valores.

GET/v1/external/pipelines/{id}
curl /v1/external/pipelines/:id \
  --header 'Authorization: Bearer <token>'
Example Responses
{ "id": "id", "name": "name", "status": "draft", "createdAt": "2024-08-25T15:00:00Z", "stages": [ { "id": "id", "name": "name", "orderIndex": 0, "isEntry": true, "isTerminal": true, "statusType": "todo", "camposObligatorios": [ "rut", "email" ] } ], "fields": [ { "key": "key", "label": "label", "type": "text", "required": true, "options": [ { "value": "value", "label": "label", "whenParent": [ "metropolitana" ] } ], "dependsOn": "region", "sensitive": true } ] }
application/json

Reemplazar las opciones de los campos de lista de un embudo

PUT
/v1/external/pipelines/{id}/fields/options

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.

Reemplazar las opciones de los campos de lista de un embudo › path Parameters

id
​string · required

Reemplazar las opciones de los campos de lista de un embudo › Request Body

ReemplazarOpcionesDto
​CampoConOpcionesDto[] · required

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.

OpcionesReemplazadasDto
id
​string · required

El embudo que se escribio.

changed
​boolean · required

false cuando lo que llego era igual a lo que ya habia: no se escribio nada. Repetir el mismo pedido devuelve false.

​CampoReemplazadoDto[] · required

Como quedo cada campo nombrado en el pedido.

PUT/v1/external/pipelines/{id}/fields/options
curl /v1/external/pipelines/:id/fields/options \ --request PUT \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer <token>' \ --data '{ "fields": [ { "key": "key", "options": [ { "value": "value", "label": "label", "whenParent": [ "string" ] } ] } ] }'
Example Request Body
{ "fields": [ { "key": "key", "options": [ { "value": "value", "label": "label", "whenParent": [ "string" ] } ] } ] }
Example Responses
{
  "id": "id",
  "changed": true,
  "fields": [
    {
      "key": "key",
      "options": 0
    }
  ]
}
application/json

Leer las respuestas rapidas de un embudo

GET
/v1/external/pipelines/{id}/respuestas-rapidas

Los textos que el equipo inserta en el chat escribiendo / y el atajo. Salen tal como estan guardados, con {agente} y {cliente} sin reemplazar.

Leer las respuestas rapidas de un embudo › path Parameters

id
​string · required

Leer las respuestas rapidas de un embudo › Responses

Las respuestas del embudo. Vacia si no tiene.

RespuestasRapidasDto
id
​string · required

El embudo.

​RespuestaRapidaGuardadaDto[] · required

En el orden en que el panel las muestra. Vacia si el embudo no tiene.

GET/v1/external/pipelines/{id}/respuestas-rapidas
curl /v1/external/pipelines/:id/respuestas-rapidas \
  --header 'Authorization: Bearer <token>'
Example Responses
{
  "id": "id",
  "respuestas": [
    {
      "atajo": "saludo",
      "texto": "texto"
    }
  ]
}
application/json

Reemplazar las respuestas rapidas de un embudo

PUT
/v1/external/pipelines/{id}/respuestas-rapidas

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.

Reemplazar las respuestas rapidas de un embudo › path Parameters

id
​string · required

Reemplazar las respuestas rapidas de un embudo › Request Body

ReemplazarRespuestasRapidasDto
​RespuestaRapidaDto[] · required

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.

RespuestasRapidasReemplazadasDto
id
​string · required

El embudo.

​RespuestaRapidaGuardadaDto[] · required

En el orden en que el panel las muestra. Vacia si el embudo no tiene.

changed
​boolean · required

false cuando lo que llego era igual a lo que ya habia: no se escribio nada. Repetir el mismo pedido devuelve false.

PUT/v1/external/pipelines/{id}/respuestas-rapidas
curl /v1/external/pipelines/:id/respuestas-rapidas \
  --request PUT \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer <token>' \
  --data '{
  "respuestas": [
    {
      "atajo": "saludo",
      "texto": "Hola {cliente}, soy {agente}. En que te ayudo?"
    }
  ]
}'
Example Request Body
{
  "respuestas": [
    {
      "atajo": "saludo",
      "texto": "Hola {cliente}, soy {agente}. En que te ayudo?"
    }
  ]
}
Example Responses
{
  "id": "id",
  "respuestas": [
    {
      "atajo": "saludo",
      "texto": "texto"
    }
  ],
  "changed": true
}
application/json

Listar las skills de un agente

GET
/v1/external/agents/{agentSlug}/skills

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}.

Listar las skills de un agente › path Parameters

agentSlug
​string · required

Listar las skills de un agente › query Parameters

limit
​number · min: 1 · max: 500

Cuántas filas devolver. Por omisión 50.

Default: 50
offset
​number · min: 0

Cuántas saltear. Por omisión 0.

Default: 0

Listar las skills de un agente › Responses

Una pagina de skills.

PaginaDeSkillsDto
limit
​number · required

Cuantas filas se pidieron. Es el limit del pedido o 50 si no se mando.

Example: 50
offset
​number · required

Cuantas filas se saltearon. Es el offset del pedido o 0.

Example: 0
hasMore
​boolean · required

true si hay mas filas despues de esta pagina. Para seguir, repetir el pedido con offset + limit.

​SkillDto[] · required
GET/v1/external/agents/{agentSlug}/skills
curl /v1/external/agents/:agentSlug/skills \
  --header 'Authorization: Bearer <token>'
Example Responses
{
  "limit": 50,
  "offset": 0,
  "hasMore": true,
  "data": [
    {
      "id": "id",
      "slug": "cerrar-el-mes",
      "nombre": "Cerrar el mes",
      "descripcion": "Los pasos del cierre mensual de una empresa."
    }
  ]
}
application/json

Crear una skill y asignarsela a un agente

POST
/v1/external/agents/{agentSlug}/skills

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.

Crear una skill y asignarsela a un agente › path Parameters

agentSlug
​string · required

Crear una skill y asignarsela a un agente › Request Body

CrearSkillDto
slug
​string · maxLength: 100 · required

El 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.

Example: cerrar-el-mes
nombre
​string · maxLength: 255 · required

Como se llama la skill.

Example: Cerrar el mes
descripcion
​string · maxLength: 500 · required

Para 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.

Example: Los pasos del cierre mensual de una empresa.
contenido
​string · maxLength: 20000 · required

El instructivo completo, en texto. No viaja en el prompt: el agente lo carga con cargar_skill cuando va a hacer esa tarea.

requiere
​string[]

Slugs 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.

Example: ["contabilidad-estandar"]

Crear una skill y asignarsela a un agente › Responses

Ya existia una con ese slug: es la misma, no una copia.

SkillDto
id
​string · required

El id de la skill. El agente no lo usa: la nombra por su slug.

slug
​string · required
nombre
​string · required
descripcion
​string · required

Lo unico de la skill que viaja en el prompt del agente, en cada mensaje.

Example: Los pasos del cierre mensual de una empresa.
POST/v1/external/agents/{agentSlug}/skills
curl /v1/external/agents/:agentSlug/skills \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer <token>' \
  --data '{
  "slug": "cerrar-el-mes",
  "nombre": "Cerrar el mes",
  "descripcion": "Los pasos del cierre mensual de una empresa.",
  "contenido": "contenido",
  "requiere": [
    "contabilidad-estandar"
  ]
}'
Example Request Body
{
  "slug": "cerrar-el-mes",
  "nombre": "Cerrar el mes",
  "descripcion": "Los pasos del cierre mensual de una empresa.",
  "contenido": "contenido",
  "requiere": [
    "contabilidad-estandar"
  ]
}
Example Responses
{
  "id": "id",
  "slug": "cerrar-el-mes",
  "nombre": "Cerrar el mes",
  "descripcion": "Los pasos del cierre mensual de una empresa."
}
application/json

Leer una skill, con su contenido

GET
/v1/external/agents/{agentSlug}/skills/{skillSlug}

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.

Leer una skill, con su contenido › path Parameters

agentSlug
​string · required
skillSlug
​string · required

Leer una skill, con su contenido › Responses

La skill con su contenido.

SkillConContenidoDto
id
​string · required

El id de la skill. El agente no lo usa: la nombra por su slug.

slug
​string · required
nombre
​string · required
descripcion
​string · required

Lo unico de la skill que viaja en el prompt del agente, en cada mensaje.

Example: Los pasos del cierre mensual de una empresa.
contenido
​string · required

El instructivo completo: lo que el agente lee cuando la carga con cargar_skill. No viaja en su prompt.

Example: # Cerrar el mes 1. Revisar los movimientos.
requiere
​string[] · required

Las skills que el agente recibe completas, antes que esta, cada vez que la carga.

Example: ["contabilidad-estandar"]
GET/v1/external/agents/{agentSlug}/skills/{skillSlug}
curl /v1/external/agents/:agentSlug/skills/:skillSlug \
  --header 'Authorization: Bearer <token>'
Example Responses
{
  "id": "id",
  "slug": "cerrar-el-mes",
  "nombre": "Cerrar el mes",
  "descripcion": "Los pasos del cierre mensual de una empresa.",
  "contenido": "# Cerrar el mes\n1. Revisar los movimientos.",
  "requiere": [
    "contabilidad-estandar"
  ]
}
application/json

Borrar una skill

DELETE
/v1/external/agents/{agentSlug}/skills/{skillSlug}

Borra la skill de tu organizacion y la saca de TODOS los agentes que la tuvieran, no solo del que nombra la ruta. Borrarla dos veces contesta 404 la segunda.

Borrar una skill › path Parameters

agentSlug
​string · required
skillSlug
​string · required

Borrar una skill › Responses

Borrada.

No data returned
DELETE/v1/external/agents/{agentSlug}/skills/{skillSlug}
curl /v1/external/agents/:agentSlug/skills/:skillSlug \
  --request DELETE \
  --header 'Authorization: Bearer <token>'
Example Responses
No example specified for this content type

Editar una skill

PATCH
/v1/external/agents/{agentSlug}/skills/{skillSlug}

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.

Editar una skill › path Parameters

agentSlug
​string · required
skillSlug
​string · required

Editar una skill › Request Body

ActualizarSkillDto
nombre
​string · maxLength: 255
descripcion
​string · maxLength: 500
contenido
​string · maxLength: 20000
requiere
​string[]

Slugs 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.

SkillDto
id
​string · required

El id de la skill. El agente no lo usa: la nombra por su slug.

slug
​string · required
nombre
​string · required
descripcion
​string · required

Lo unico de la skill que viaja en el prompt del agente, en cada mensaje.

Example: Los pasos del cierre mensual de una empresa.
PATCH/v1/external/agents/{agentSlug}/skills/{skillSlug}
curl /v1/external/agents/:agentSlug/skills/:skillSlug \
  --request PATCH \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer <token>' \
  --data '{
  "nombre": "nombre",
  "descripcion": "descripcion",
  "contenido": "contenido",
  "requiere": [
    "string"
  ]
}'
Example Request Body
{
  "nombre": "nombre",
  "descripcion": "descripcion",
  "contenido": "contenido",
  "requiere": [
    "string"
  ]
}
Example Responses
{
  "id": "id",
  "slug": "cerrar-el-mes",
  "nombre": "Cerrar el mes",
  "descripcion": "Los pasos del cierre mensual de una empresa."
}
application/json

Métricas por conversación, de las que cambiaron en un rango

GET
/v1/external/metrics/conversations

Métricas por conversación, de las que cambiaron en un rango › query Parameters

from
​string · required

Desde cuándo, en ISO 8601. Trae las conversaciones cuyo último cambio fue en el rango.

Example: 2026-10-19T13:00:00Z
limit
​number · min: 1 · max: 500

Cuántas filas devolver. Por omisión 50.

Default: 50
offset
​number · min: 0

Cuántas saltear. Por omisión 0.

Default: 0
to
​string

Hasta cuándo, sin incluirlo. Por omisión, ahora. A lo más 31 días después de from.

Example: 2026-10-19T14:00:00Z

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.

PaginaDeMetricasDto
limit
​number · required

Cuantas filas se pidieron. Es el limit del pedido o 50 si no se mando.

Example: 50
offset
​number · required

Cuantas filas se saltearon. Es el offset del pedido o 0.

Example: 0
hasMore
​boolean · required

true si hay mas filas despues de esta pagina. Para seguir, repetir el pedido con offset + limit.

​MetricasDeConversacionDto[] · required
GET/v1/external/metrics/conversations
curl '/v1/external/metrics/conversations?from=<string>' \
  --header 'Authorization: Bearer <token>'
Example Responses
{ "limit": 50, "offset": 0, "hasMore": true, "data": [ { "conversationId": "conversationId", "pipelineId": "pipelineId", "pipelineName": "pipelineName", "status": "status", "controlStatus": "controlStatus", "outcome": "outcome", "createdAt": "2024-08-25T15:00:00Z", "escalatedAt": "2024-08-25T15:00:00Z", "takenAt": "2024-08-25T15:00:00Z", "takenBy": "takenBy", "closedAt": "2024-08-25T15:00:00Z", "closedBy": "ai", "resolvedByAi": true, "waitSeconds": 0, "aiSeconds": 0, "humanSeconds": 0, "updatedAt": "2024-08-25T15:00:00Z" } ] }
application/json

Listar los archivos de una conversacion, con su descarga

GET
/v1/external/conversations/{id}/adjuntos

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.

Listar los archivos de una conversacion, con su descarga › path Parameters

id
​string · required

Listar los archivos de una conversacion, con su descarga › query Parameters

limit
​number · min: 1 · max: 500

Cuántas filas devolver. Por omisión 50.

Default: 50
offset
​number · min: 0

Cuántas saltear. Por omisión 0.

Default: 0

Listar los archivos de una conversacion, con su descarga › Responses

Una pagina de adjuntos.

PaginaDeAdjuntosDto
limit
​number · required

Cuantas filas se pidieron. Es el limit del pedido o 50 si no se mando.

Example: 50
offset
​number · required

Cuantas filas se saltearon. Es el offset del pedido o 0.

Example: 0
hasMore
​boolean · required

true si hay mas filas despues de esta pagina. Para seguir, repetir el pedido con offset + limit.

​AdjuntoDto[] · required
GET/v1/external/conversations/{id}/adjuntos
curl /v1/external/conversations/:id/adjuntos \
  --header 'Authorization: Bearer <token>'
Example Responses
{ "limit": 50, "offset": 0, "hasMore": true, "data": [ { "id": "id", "nombre": "Contrato firmado.pdf", "mime": "application/pdf", "tamano": 0, "fecha": "2024-08-25T15:00:00Z", "origen": "chat", "subidoPor": "cliente", "url": "url", "venceEn": "2024-08-25T15:00:00Z" } ] }
application/json

Ver si una persona del equipo esta disponible

GET
/v1/external/miembros/disponibilidad

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.

Ver si una persona del equipo esta disponible › query Parameters

email
​string · required

El email de la persona del equipo. No distingue mayusculas. Tiene que ser un miembro activo de tu organizacion.

Example: [email protected]

Ver si una persona del equipo esta disponible › Responses

El estado de la persona.

DisponibilidadDelMiembroDto
email
​string · required

El email de la persona.

estado
​string · enum · required

Lo que quedo marcado, por la persona o por la API. No considera el horario de la organizacion: eso es disponibleParaRepartir.

Enum values:
disponible
ausente
disponibleParaRepartir
​boolean · required

Si 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.

cambiadoEl
​string | null · date-time · required

Cuando se cambio el estado por ultima vez. null si nunca.

extendidoHasta
​string | null · date-time · required

Hasta cuando pidio la persona seguir recibiendo casos pasado el horario. null si no hay extension.

GET/v1/external/miembros/disponibilidad
curl '/v1/external/miembros/disponibilidad?email=<string>' \
  --header 'Authorization: Bearer <token>'
Example Responses
{
  "email": "email",
  "estado": "disponible",
  "disponibleParaRepartir": true,
  "cambiadoEl": "2024-08-25T15:00:00Z",
  "extendidoHasta": "2024-08-25T15:00:00Z"
}
application/json

Poner a una persona del equipo disponible o ausente

PUT
/v1/external/miembros/disponibilidad

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

CambiarDisponibilidadDto
email
​string · required

El email de la persona del equipo. No distingue mayusculas. Tiene que ser un miembro activo de tu organizacion.

Example: [email protected]
estado
​string · enum · required

disponible: puede recibir casos nuevos. ausente: el reparto la salta.

Enum values:
disponible
ausente

Poner a una persona del equipo disponible o ausente › Responses

Como quedo la persona.

DisponibilidadDelMiembroDto
email
​string · required

El email de la persona.

estado
​string · enum · required

Lo que quedo marcado, por la persona o por la API. No considera el horario de la organizacion: eso es disponibleParaRepartir.

Enum values:
disponible
ausente
disponibleParaRepartir
​boolean · required

Si 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.

cambiadoEl
​string | null · date-time · required

Cuando se cambio el estado por ultima vez. null si nunca.

extendidoHasta
​string | null · date-time · required

Hasta cuando pidio la persona seguir recibiendo casos pasado el horario. null si no hay extension.

PUT/v1/external/miembros/disponibilidad
curl /v1/external/miembros/disponibilidad \
  --request PUT \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer <token>' \
  --data '{
  "email": "[email protected]",
  "estado": "disponible"
}'
Example Request Body
{
  "email": "[email protected]",
  "estado": "disponible"
}
Example Responses
{
  "email": "email",
  "estado": "disponible",
  "disponibleParaRepartir": true,
  "cambiadoEl": "2024-08-25T15:00:00Z",
  "extendidoHasta": "2024-08-25T15:00:00Z"
}
application/json