Lera API
v178 operacionesDocumentación de la API de Lera
Para usar la API necesitas una clave secreta (lr_sk_) que se crea desde el panel, en Ajustes → API Keys. La clave completa se enseña una sola vez al crearla: guárdala en ese momento. Se puede rotar conservando su nombre y revocar cuando quieras. Las claves antiguas que empiezan por lera_sk_ siguen funcionando.
La clave va en la cabecera Authorization de cada petición, como Bearer, y es lo que identifica al workspace: no se pasa ningún id de cuenta. No la publiques en el navegador ni en el código de tu web; está pensada para llamadas de servidor a servidor. Si sospechas que se ha filtrado, revócala y crea otra.
Todas las operaciones del catálogo son POST con cuerpo JSON, también las de consulta. Sin parámetros, envía un objeto vacío. Las rutas que no salen del catálogo (el propio catálogo y las de cuentas partner) usan su propio método (GET, POST, PATCH o DELETE), indicado en cada fila.
URL base:
https://leracore.com
Todas las rutas de esta página cuelgan de ahí. La de cada operación se añade tal cual.
Ejemplos de llamada:
curl -H "Authorization: Bearer lr_sk_..." https://leracore.com/api/v1/tools
curl -X POST -H "Authorization: Bearer lr_sk_..." -H "Content-Type: application/json" \
-d '{}' https://leracore.com/api/v1/tools/list_agents
curl -X POST -H "Authorization: Bearer lr_sk_..." -H "Content-Type: application/json" \
-d '{"limit":10,"direction":"inbound"}' https://leracore.com/api/v1/tools/list_callsSi importas el openapi.json en Postman, deja el cuerpo de las consultas en {} o pídele que genere los parámetros a partir de los ejemplos. Generándolos del esquema rellena los filtros con valores inventados, y una consulta filtrada por un valor que no existe devuelve la lista vacía.
Conector MCP: construye y opera tus agentes desde tu propio asistente
https://leracore.com/mcp
Lera tiene un servidor MCP remoto, sin nada que instalar, con las mismas operaciones de esta API y la misma clave secreta en la cabecera Authorization. Sirve para que Claude Code, Cursor, VS Code, Codex o cualquier cliente MCP construya y gestione tus agentes hablando contigo.
Trae además la guía de cómo se construye un agente que funcione (la operación lera_guide, con las recetas probadas en llamadas reales, la especificación de los flujos y el arreglo de cada aviso del linter), los recursos lera://guia/<tema> y los prompts crear_agente, editar_flujo, revisar_agente y mejorar_desde_llamada. El asistente la lee antes de montar nada. Con test_agent_chat prueba el borrador por texto con el mismo motor que la llamada antes de proponer un cambio, y con list_agent_versions y restore_agent_version vuelve el borrador a una versión publicada anterior.
Todo queda en borrador: el servidor no publica un agente si no se lo pides. Cada operación lleva anotaciones (solo lectura, destructiva) para que tu cliente te pida permiso donde toca, y los errores dicen qué corregir.
Cursor admite unas 40 operaciones entre todos sus servidores: con ?toolset=construir en la URL ves solo las de montar agentes; con ?toolset=operar, las de llamadas, números y salientes; sin parámetro, todas. Si tu cuenta es partner, añade la cabecera X-Lera-Client igual que en la API.
Claude Code — Va en terminal.
claude mcp add --transport http lera https://leracore.com/mcp --header "Authorization: Bearer lr_sk_…"
Cursor — Va en ~/.cursor/mcp.json.
{
"mcpServers": {
"lera": {
"url": "https://leracore.com/mcp?toolset=construir",
"headers": { "Authorization": "Bearer lr_sk_…" }
}
}
}VS Code — Va en .vscode/mcp.json.
{
"servers": {
"lera": {
"type": "http",
"url": "https://leracore.com/mcp",
"headers": { "Authorization": "Bearer lr_sk_…" }
}
}
}Codex — Va en ~/.codex/config.toml.
[mcp_servers.lera] url = "https://leracore.com/mcp" bearer_token_env_var = "LERA_API_KEY" tool_timeout_sec = 120 # y en tu entorno: LERA_API_KEY=lr_sk_…
Alcance de la clave:
- read — solo consulta. Las operaciones que modifican responden 403 insufficient_scope.
- manage — consulta y modificación.
- Una cuenta caducada es de solo lectura también por API: las escrituras responden 402 account_read_only.
- Una cuenta suspendida no opera por API: todo responde 403 workspace_suspended.
Límites de uso:
- - 120 peticiones por minuto por clave y origen. Al pasarse se responde 429.
Cuentas partner: una clave para todos tus clientes
- - Si tu cuenta es partner, la cabecera X-Lera-Client hace que la operación se ejecute sobre uno de tus clientes. No necesitas una clave por cliente.
- - X-Lera-Client: <workspace_id> — la operación va sobre ese cliente. El id lo devuelve GET /api/v1/partner/clients.
- - X-Lera-Client: all — solo en consultas. El resultado llega etiquetado por cliente, en clients en vez de en result.
- - La clave tiene que estar emitida desde la cuenta raíz. Un cliente que no cuelga de ella responde 404 client_not_found, y all sobre una operación que modifica responde 400 all_only_for_reads: abrir una escritura sobre toda la cartera en una sola petición no se permite.
Errores
- 401 unauthorized — Falta la clave, está mal formada o se ha revocado.
- 401 api_key_expired — La clave tenía fecha de caducidad y ya pasó.
- 402 account_read_only — La cuenta está caducada: se puede leer, no escribir.
- 403 insufficient_scope — Clave de solo consulta contra una operación que modifica.
- 403 workspace_suspended — La cuenta está suspendida y no opera.
- 404 tool_not_found — Ese nombre de operación no existe.
- 400 all_only_for_reads — X-Lera-Client: all sobre una operación que modifica.
- 403 not_a_partner — X-Lera-Client en una cuenta que no es partner. El acceso de partner se solicita en Ajustes → Empresa y lo activa Lera.
- 403 not_a_partner_root — La clave se creó dentro de un cliente, no en la cuenta raíz.
- 404 client_not_found — Ese cliente no cuelga de tu cuenta.
- 403 subprocessing_agreement_required — Alta de un cliente sin haber aceptado la versión vigente del contrato de sub-encargo (Ajustes → Empresa).
- 429 too_many_requests — Se ha pasado el límite de peticiones.
Términos de usoCentro de confianzaEscríbenos
Referencia
AgentesOperaciones disponibles en AGENTES:CONSULTA /api/v1/tools/get_agentCONSULTA /api/v1/tools/lera_guideCONSULTA /api/v1/tools/list_agent_templatesCONSULTA /api/v1/tools/list_agent_versionsCONSULTA /api/v1/tools/list_agentsCONSULTA /api/v1/tools/test_agent_chatCREA /api/v1/tools/convert_agentCREA /api/v1/tools/create_agentCREA /api/v1/tools/duplicate_agentCREA /api/v1/tools/import_agentACTUALIZA /api/v1/tools/export_agentACTUALIZA /api/v1/tools/publish_agentACTUALIZA /api/v1/tools/restore_agent_versionACTUALIZA /api/v1/tools/set_business_hoursACTUALIZA /api/v1/tools/set_call_recordingACTUALIZA /api/v1/tools/update_agentACTUALIZA /api/v1/tools/write_agent_prompt
CONSULTAPOST /api/v1/tools/get_agentDevuelve la configuración completa de un agente por su id: prompt, voz, funciones y límites.
Parámetros
| Nombre | Descripción |
|---|---|
| agent_id* obligatoriostring(body) | Id del agente. Lo devuelve list_agents. |
Petición
curl -X POST https://leracore.com/api/v1/tools/get_agent \
-H "Authorization: Bearer lr_sk_..." \
-H "Content-Type: application/json" \
-d '{
"agent_id": "cmk1a2b3c..."
}'Respuestas
| Código | Descripción |
|---|---|
| 200 | {
"result": {
"id": "cmk1a2b3c...",
"name": "Recepción",
"description": "Atiende el teléfono principal y coge citas",
"kind": "voice",
"mode": "conversation_flow",
"status": "published",
"language": "es"
}
}application/json; charset=utf-8 |
| 400 | Petición inválida |
| 403 | Prohibido |
CONSULTAPOST /api/v1/tools/lera_guideDevuelve la guía de cómo se construye un agente que funcione: las recetas probadas en llamadas reales (citas, transferencias, recogida de datos, salientes, chat), la especificación de los flujos, cómo montar una base de conocimiento que encuentre y los avisos del linter con su arreglo. Sin tema, el índice.
Parámetros
| Nombre | Descripción |
|---|---|
| temastring(body) | El tema de la guía. Las recetas empiezan por "receta-". Sin él, el índice con todos los temas.Valores: receta-prompt-unico · receta-citas-calcom-flujo · receta-transferencia-prompt-unico · receta-transferencia-flujo · receta-recoger-datos · receta-saliente · receta-chat · trabajo · revisar-llamadas · analisis-post-llamada · crear-agente · flujos · nodos · recoger-datos · repaso · funciones · citas-calcom · transferencias · base-conocimiento · montar-base-conocimiento · comportamiento · modelo-y-latencia · numeros · canal-web · chat · linter · no-duplicar-motor · seguridad |
Petición
curl -X POST https://leracore.com/api/v1/tools/lera_guide \
-H "Authorization: Bearer lr_sk_..." \
-H "Content-Type: application/json" \
-d '{}'Respuestas
| Código | Descripción |
|---|---|
| 200 | {
"result": {
"tema": "receta-citas-calcom-flujo",
"titulo": "Receta: citas con Cal.com en un agente de flujo",
"guia": "# Receta: citas con Cal.com en un agente de flujo\n\nCUANDO: ..."
}
}application/json; charset=utf-8 |
| 400 | Petición inválida |
| 403 | Prohibido |
CONSULTAPOST /api/v1/tools/list_agent_templatesDevuelve las plantillas de agente disponibles por sector, para partir de una en lugar de una hoja en blanco.
Parámetros
Sin parámetros. Envía un objeto vacío.
Petición
curl -X POST https://leracore.com/api/v1/tools/list_agent_templates \
-H "Authorization: Bearer lr_sk_..." \
-H "Content-Type: application/json" \
-d '{}'Respuestas
| Código | Descripción |
|---|---|
| 200 | {
"result": [
{
"key": "clinica",
"name": "Clínica",
"sector": "salud"
}
]
}application/json; charset=utf-8 |
| 400 | Petición inválida |
| 403 | Prohibido |
CONSULTAPOST /api/v1/tools/list_agent_versionsLista las versiones publicadas de un agente, de la más nueva a la más vieja, y marca la que atiende ahora.
Parámetros
| Nombre | Descripción |
|---|---|
| agent_id* obligatoriostring(body) | Id del agente. Lo devuelve list_agents. |
Petición
curl -X POST https://leracore.com/api/v1/tools/list_agent_versions \
-H "Authorization: Bearer lr_sk_..." \
-H "Content-Type: application/json" \
-d '{
"agent_id": "cmk1a2b3c..."
}'Respuestas
| Código | Descripción |
|---|---|
| 200 | {
"result": {
"agent_id": "cmk1a2b3c...",
"status": "published",
"versions": [
{ "id": "cmv4d5e6f...", "version": 4, "createdAt": "2026-10-06T10:12:00.000Z", "active": true },
{ "id": "cmv1a2b3c...", "version": 3, "createdAt": "2026-10-02T17:40:00.000Z", "active": false }
]
}
}application/json; charset=utf-8 |
| 400 | Petición inválida |
| 403 | Prohibido |
CONSULTAPOST /api/v1/tools/list_agentsDevuelve los agentes del workspace con su tipo, modo, estado y plantilla de origen.
Parámetros
Sin parámetros. Envía un objeto vacío.
Petición
curl -X POST https://leracore.com/api/v1/tools/list_agents \
-H "Authorization: Bearer lr_sk_..." \
-H "Content-Type: application/json" \
-d '{}'Respuestas
| Código | Descripción |
|---|---|
| 200 | {
"result": [{
"id": "cmk1a2b3c...",
"name": "Recepción",
"kind": "voice",
"mode": "conversation_flow",
"status": "published",
"templateKey": "clinica",
"updatedAt": "2026-09-01T10:00:00.000Z"
}]
}application/json; charset=utf-8 |
| 400 | Petición inválida |
| 403 | Prohibido |
CONSULTAPOST /api/v1/tools/test_agent_chatPrueba el borrador de un agente por texto con el mismo motor que la llamada: devuelve lo que contestaría, en qué nodo queda el flujo, las variables recogidas y las funciones que habría llamado. Las funciones van en modo prueba y nunca tocan tu sistema. Sin estado: para seguir la conversación se pasan los turnos anteriores y el estado del flujo que devolvió el turno anterior. Tope de 30 mensajes por minuto.
Parámetros
| Nombre | Descripción |
|---|---|
| agent_id* obligatoriostring(body) | Id del agente. Lo devuelve list_agents. |
| message* obligatoriostring(body) | |
| historyarray<object>(body) | |
| flow_stateobject(body) | Solo agentes de flujo: el objeto flow que devolvió el turno anterior, tal cual. Sin él, la prueba empieza en el nodo de inicio. |
Petición
curl -X POST https://leracore.com/api/v1/tools/test_agent_chat \
-H "Authorization: Bearer lr_sk_..." \
-H "Content-Type: application/json" \
-d '{
"agent_id": "cmk1a2b3c...",
"message": "texto de ejemplo"
}'Respuestas
| Código | Descripción |
|---|---|
| 200 | {
"result": {
"agent_id": "cmk1a2b3c...",
"mode": "conversation_flow",
"kind": "voice",
"reply": "Claro, ¿para qué día le viene bien?",
"flow": {
"nodeId": "pedir-dia",
"vars": { "servicio": "corte" },
"visited": ["saludo", "pedir-dia"],
"executedFunctions": []
},
"functionCalls": [],
"ended": false,
"descartes": []
}
}application/json; charset=utf-8 |
| 400 | Petición inválida |
| 403 | Prohibido |
CREAPOST /api/v1/tools/convert_agentConvierte un agente a otro tipo (voz o chat, prompt único o flujo) creando un borrador nuevo con toda su configuración, claves de las funciones incluidas. El original no cambia.
Parámetros
| Nombre | Descripción |
|---|---|
| agent_id* obligatoriostring(body) | Id del agente. Lo devuelve list_agents. |
| to* obligatoriostring(body) | Valores: voice · chat · single_prompt · conversation_flow |
Petición
curl -X POST https://leracore.com/api/v1/tools/convert_agent \
-H "Authorization: Bearer lr_sk_..." \
-H "Content-Type: application/json" \
-d '{
"agent_id": "cmk1a2b3c...",
"to": "voice"
}'Respuestas
| Código | Descripción |
|---|---|
| 200 | {
"result": {
"id": "cmk7c6d5e...",
"name": "Recepción (chat)",
"kind": "chat",
"mode": "single_prompt",
"status": "draft",
"original_id": "cmk1a2b3c...",
"perdidas": [{ "tipo": "herramienta_transferencia", "nombre": "pasar_a_recepcion" }],
"siguiente_paso": "Revisa el prompt y el flujo del agente NUEVO (agent_id cmk7c6d5e...) y adapta lo que hablaba de llamadas..."
}
}application/json; charset=utf-8 |
| 400 | Petición inválida |
| 403 | Prohibido |
CREAPOST /api/v1/tools/create_agentCrea un agente de voz en borrador. Con los datos del negocio, el prompt se genera al nivel de las plantillas.
Parámetros
| Nombre | Descripción |
|---|---|
| name* obligatoriostring(body) | Nombre del agente, para reconocerlo en el panel. |
| kindstring(body) | Si el agente es de voz o de chat.Valores: voice · chat |
| modestring(body) | Cómo se construye el agente: prompt único o flujo por nodos.Valores: single_prompt · conversation_flow |
| template_keystring(body) | Plantilla de sector de la que partir. Las devuelve list_agent_templates. |
| business_namestring(body) | Nombre real del negocio. Se usa en el saludo y en el prompt. |
| summarystring(body) | A qué se dedica el negocio, en una frase. Se usa para generar el prompt. |
| servicesarray<string>(body) | Servicios del negocio. Alimentan el prompt y lo que el agente sabe ofrecer. |
| tonestring(body) | Tono con el que habla el agente (cercano, formal, directo…). |
| transferboolean(body) | Si el agente debe poder pasar la llamada a una persona. |
| promptstring(body) | Instrucciones del agente: qué hace, qué pregunta y cómo responde. |
| markdown_link_allowed_hostsarray<string>(body) | |
| markdown_link_include_wwwboolean(body) | |
| markdown_link_allow_httpboolean(body) |
Petición
curl -X POST https://leracore.com/api/v1/tools/create_agent \
-H "Authorization: Bearer lr_sk_..." \
-H "Content-Type: application/json" \
-d '{
"name": "texto de ejemplo",
"kind": "voice",
"mode": "single_prompt"
}'Respuestas
| Código | Descripción |
|---|---|
| 200 | {
"result": {
"ok": true,
"agentId": "cmk1a2b3c...",
"name": "Recepción",
"status": "draft"
}
}application/json; charset=utf-8 |
| 400 | Petición inválida |
| 403 | Prohibido |
CREAPOST /api/v1/tools/duplicate_agentDuplica un agente existente como un borrador nuevo, sin tocar el original.
Parámetros
| Nombre | Descripción |
|---|---|
| agent_id* obligatoriostring(body) | Id del agente. Lo devuelve list_agents. |
Petición
curl -X POST https://leracore.com/api/v1/tools/duplicate_agent \
-H "Authorization: Bearer lr_sk_..." \
-H "Content-Type: application/json" \
-d '{
"agent_id": "cmk1a2b3c..."
}'Respuestas
| Código | Descripción |
|---|---|
| 200 | {
"result": {
"id": "cmk9z8y7x...",
"name": "Recepción (copia)",
"status": "draft"
}
}application/json; charset=utf-8 |
| 400 | Petición inválida |
| 403 | Prohibido |
CREAPOST /api/v1/tools/import_agentCrea un agente en este workspace desde un JSON exportado. Hay que volver a poner los secretos a mano.
Parámetros
| Nombre | Descripción |
|---|---|
| agent_export* obligatorioobject(body) | El objeto que devolvió export_agent, tal cual. |
Petición
curl -X POST https://leracore.com/api/v1/tools/import_agent \
-H "Authorization: Bearer lr_sk_..." \
-H "Content-Type: application/json" \
-d '{
"agent_export": {}
}'Respuestas
| Código | Descripción |
|---|---|
| 200 | {
"result": {
"id": "cmk9z8y7x...",
"name": "Recepción",
"status": "draft"
}
}application/json; charset=utf-8 |
| 400 | Petición inválida |
| 403 | Prohibido |
ACTUALIZAPOST /api/v1/tools/export_agentExporta un agente a un JSON portable para llevarlo a otro workspace. Los secretos salen redactados.
Parámetros
| Nombre | Descripción |
|---|---|
| agent_id* obligatoriostring(body) | Id del agente. Lo devuelve list_agents. |
Petición
curl -X POST https://leracore.com/api/v1/tools/export_agent \
-H "Authorization: Bearer lr_sk_..." \
-H "Content-Type: application/json" \
-d '{
"agent_id": "cmk1a2b3c..."
}'Respuestas
| Código | Descripción |
|---|---|
| 200 | {
"result": {
"version": 1,
"agent": {
"name": "Recepción",
"kind": "voice",
"mode": "conversation_flow"
},
"config": {
"prompt": "...",
"customTools": [
{
"url": "***"
}
]
}
}
}application/json; charset=utf-8 |
| 400 | Petición inválida |
| 403 | Prohibido |
ACTUALIZAPOST /api/v1/tools/publish_agentPublica el borrador y crea una versión activa. Hasta publicar, las llamadas siguen usando la versión anterior.
Parámetros
| Nombre | Descripción |
|---|---|
| agent_id* obligatoriostring(body) | Id del agente. Lo devuelve list_agents. |
Petición
curl -X POST https://leracore.com/api/v1/tools/publish_agent \
-H "Authorization: Bearer lr_sk_..." \
-H "Content-Type: application/json" \
-d '{
"agent_id": "cmk1a2b3c..."
}'Respuestas
| Código | Descripción |
|---|---|
| 200 | {
"result": {
"id": "cmk1a2b3c...",
"status": "published",
"version": 4
}
}application/json; charset=utf-8 |
| 400 | Petición inválida |
| 403 | Prohibido |
ACTUALIZAPOST /api/v1/tools/restore_agent_versionDeja el borrador igual que una versión publicada anterior. No publica: las llamadas siguen con la versión activa hasta que publiques. El borrador que hubiera sin publicar se pierde.
Parámetros
| Nombre | Descripción |
|---|---|
| agent_id* obligatoriostring(body) | Id del agente. Lo devuelve list_agents. |
| version_id* obligatoriostring(body) |
Petición
curl -X POST https://leracore.com/api/v1/tools/restore_agent_version \
-H "Authorization: Bearer lr_sk_..." \
-H "Content-Type: application/json" \
-d '{
"agent_id": "cmk1a2b3c...",
"version_id": "cmk1a2b3c..."
}'Respuestas
| Código | Descripción |
|---|---|
| 200 | {
"result": {
"id": "cmk1a2b3c...",
"restored_version": 3,
"is_active_version": false,
"nota": "El borrador es ahora esa versión. Lo publicado no cambia hasta publish_agent."
}
}application/json; charset=utf-8 |
| 400 | Petición inválida |
| 403 | Prohibido |
ACTUALIZAPOST /api/v1/tools/set_business_hoursDefine el horario del negocio, su zona horaria y los días especiales. No apaga al agente: le da la información.
Parámetros
| Nombre | Descripción |
|---|---|
| agent_id* obligatoriostring(body) | Id del agente. Lo devuelve list_agents. |
| enabledboolean(body) | Poner o quitar el horario. Quitarlo no apaga al agente. |
| time_zonestring(body) | Zona horaria con la que se decide si está abierto. |
| weeklyarray<array>(body) | Los tramos de cada día, de lunes a domingo. Siete listas, ni una más ni una menos. |
| exceptionsarray<object>(body) | Festivos, puentes y vacaciones. Sustituyen al horario semanal en esas fechas. |
Petición
curl -X POST https://leracore.com/api/v1/tools/set_business_hours \
-H "Authorization: Bearer lr_sk_..." \
-H "Content-Type: application/json" \
-d '{
"agent_id": "cmk1a2b3c...",
"enabled": true,
"time_zone": "texto de ejemplo"
}'Respuestas
| Código | Descripción |
|---|---|
| 200 | {
"result": {
"ok": true,
"agentId": "cmk1a2b3c...",
"days": 5,
"exceptions": 2,
"functions": [
"consultar_pedido"
],
"reminder": "Borrador actualizado: publica el agente para que el cambio entre en producción."
}
}application/json; charset=utf-8 |
| 400 | Petición inválida |
| 403 | Prohibido |
ACTUALIZAPOST /api/v1/tools/set_call_recordingActiva o desactiva la grabación del audio. Al activarla, el agente dice un aviso legal fijo que no se puede quitar.
Parámetros
| Nombre | Descripción |
|---|---|
| agent_id* obligatoriostring(body) | Id del agente. Lo devuelve list_agents. |
| enabled* obligatorioboolean(body) | Enciende o apaga la grabación del audio de las llamadas de este agente. |
| purposestring(body) | Para qué se graba. Queda registrado junto al consentimiento.Valores: calidad · contratacion · incidencias · formacion |
| retention_daysany(body) | Días que se guarda el audio. Solo puede ACORTAR el plazo del workspace. |
Petición
curl -X POST https://leracore.com/api/v1/tools/set_call_recording \
-H "Authorization: Bearer lr_sk_..." \
-H "Content-Type: application/json" \
-d '{
"agent_id": "cmk1a2b3c...",
"enabled": true,
"purpose": "calidad",
"retention_days": "texto de ejemplo"
}'Respuestas
| Código | Descripción |
|---|---|
| 200 | {
"result": {
"ok": true,
"agentId": "cmk1a2b3c...",
"enabled": true,
"functions": [
"consultar_pedido"
],
"reminder": "Borrador actualizado: publica el agente para que el cambio entre en producción."
}
}application/json; charset=utf-8 |
| 400 | Petición inválida |
| 403 | Prohibido |
ACTUALIZAPOST /api/v1/tools/update_agentActualiza el borrador de un agente: nombre, prompt, saludo, voz, modelo, comportamiento y bases de conocimiento.
Parámetros
| Nombre | Descripción |
|---|---|
| agent_id* obligatoriostring(body) | Id del agente. Lo devuelve list_agents. |
| namestring(body) | Nombre del agente, para reconocerlo en el panel. |
| promptstring(body) | Instrucciones del agente: qué hace, qué pregunta y cómo responde. |
| tonestring(body) | Tono con el que habla el agente (cercano, formal, directo…). |
| agent_namestring(body) | Nombre con el que se presenta el agente al descolgar. |
| business_namestring(body) | Nombre real del negocio. Se usa en el saludo y en el prompt. |
| begin_messagestring(body) | Frase fija de saludo. Vacía, la improvisa el modelo en cada llamada. |
| farewell_messagestring(body) | Frase fija de despedida. Vacía, la improvisa el modelo. |
| voice_providerstring(body) | Proveedor de la voz. Determina qué voces se pueden elegir. |
| voice_idstring(body) | Identificador de la voz en su proveedor. Solo voces del propio workspace. |
| modelstring(body) | Modelo de lenguaje del agente. Marca latencia y fiabilidad. |
| greeting_enabledboolean(body) | Si habla primero el agente o espera a que hable quien llama. |
| greeting_interruptibleboolean(body) | Si se le puede cortar el saludo. |
| end_chat_after_silence_msnumber(body) | |
| auto_close_messagestring(body) | |
| markdown_link_allowed_hostsarray<string>(body) | |
| markdown_link_include_wwwboolean(body) | |
| markdown_link_allow_httpboolean(body) | |
| speak_when_silentboolean(body) | Ante silencio, comprueba una vez si la persona sigue ahí antes de colgar. |
| knowledge_base_idsarray<string>(body) | Ids de las bases de conocimiento asignadas al agente. Lista vacía para quitarlas todas. |
| kb_top_knumber(body) | Cuántos fragmentos de la base de conocimiento se recuperan por turno. |
| kb_min_scorenumber(body) | Corte de similitud de la búsqueda. Está calibrado con lenguaje HABLADO: subirlo pierde datos que sí están. |
| kb_instructionstring(body) | Guía para construir la búsqueda en la base de conocimiento. |
| silence_reminder_secnumber(body) | Segundos de silencio antes de que el agente pregunte si sigue ahí. |
| silence_hangup_secnumber(body) | Segundos de silencio tras los que cuelga. |
| end_call_enabledboolean(body) | Si el agente puede colgar él mismo al terminar. |
| max_duration_secnumber(body) | Duración máxima de la llamada. Al llegar, se corta. |
| transfer_modestring(body) | Cómo pasa la llamada a una persona en un agente de prompt único.Valores: none · phone · pending_request · phone_or_pending_request |
| transfer_e164string(body) | Número al que pasa la llamada, en formato E.164. |
| transfer_messagestring(body) | Frase que se dice justo antes de pasar la llamada. |
| transfer_toolsarray<object>(body) | |
| agent_swap_toolsarray<object>(body) | Solo prompt único: herramientas para pasar la conversación a OTRO agente del proyecto. Misma llamada y mismo número; el destino sigue con el historial. Reemplaza la lista entera. |
| cold_transfer_modestring(body) | Cómo se entrega la llamada: se la damos al operador y salimos, o hacemos de puente.Valores: sip_refer · sip_invite |
| responsivenessnumber(body) | Cuánto tarda en contestar tras la última palabra. Alto responde antes. |
| interruption_sensitivitynumber(body) | Facilidad para cortarle. Bajo aguanta ruido de fondo; alto se corta enseguida. |
| enable_backchannelboolean(body) | Si el agente asiente mientras el otro habla ("ajá", "claro"). |
| backchannel_frequencynumber(body) | Cuánto asiente. Alto asiente cada pocas palabras. |
| backchannel_wordsarray<string>(body) | Palabras con las que asiente. |
| post_call_analysisarray<object>(body) | Campos que se extraen solos de cada llamada al terminar, además del resumen. |
| ai_disclosureboolean(body) | Si el saludo dice que es un asistente virtual. Informar es responsabilidad del cliente. |
| pii_categoriesarray<string>(body) | Datos personales que se BORRAN de la transcripción y del resumen al colgar. |
| voicemail_optionobject(body) | Qué hace en un saliente si salta el contestador. Sin esto, le habla como a una persona. |
| voice_modelstring(body) | Modelo de síntesis. Solo se toca para más calidad o menos latencia.Valores: eleven_turbo_v2 · eleven_turbo_v2_5 · eleven_flash_v2_5 · eleven_v4_turbo · eleven_flash_v2 · eleven_multilingual_v2 · eleven_v3 · sonic-3.6 · sonic-3 · sonic-3-latest · sonic-3.5 |
| voice_speednumber(body) | Velocidad del habla. 1 es la normal. |
| enable_expressive_modeboolean(body) | |
| expressive_emotion_tagsarray<string>(body) | |
| expressive_mode_promptany(body) | |
| voice_temperaturenumber(body) | Expresividad de la voz. Bajo suena más estable; alto, más variable. |
| model_priorityboolean(body) | |
| llm_temperaturenumber(body) | Cuánto se aparta el modelo de la respuesta más probable. |
| background_soundstring(body) | Ambiente de fondo para que la llamada no suene aséptica. null, ninguno.Valores: office |
| background_sound_volumenumber(body) | Cuánto se oye ese ambiente. Solo aplica si hay uno puesto. |
| thinking_sound_volumenumber(body) | |
| normalize_for_speechboolean(body) | Convierte cifras y horas a como se dicen en voz alta. Viene encendido. |
| languagestring(body) | Idioma en el que atiende las llamadas (es, en, fr). Es del agente, no del panel. |
| volumenumber(body) | Volumen de la voz del agente. |
| fallback_voice_idsarray<string>(body) | Voces de reserva si su proveedor no da audio. Tienen que ser de OTRO proveedor. |
| enable_dynamic_responsivenessboolean(body) | Ajusta solo la rapidez de respuesta según cómo vaya la conversación. |
| enable_dynamic_voice_speedboolean(body) | Ajusta sola la velocidad del habla durante la llamada. |
| keypadobject(body) | Las teclas del teléfono: recibir las que marque quien llama (encendido de fábrica) y dejar que el agente marque. |
| denoising_modestring(body) | Limpieza del audio que OYE el agente, no del que oye quien llama.Valores: no-denoise · noise-cancellation · noise-and-background-speech-cancellation |
| stt_modestring(body) | Transcripción rápida (fast, por defecto) o precisa (accurate): la precisa espera algo más de silencio y los números dictados llegan enteros, a cambio de algo más de espera en cada turno.Valores: fast · accurate |
| boosted_keywordsarray<string>(body) | Palabras que cuestan de transcribir y conviene reforzar (marcas, apellidos). |
| pronunciation_dictionaryarray<object>(body) | Cómo se pronuncian palabras concretas. |
| behaviorobject(body) | Interruptores de conducta: no inventar datos, repetir para confirmar, pedir deletreo… |
Petición
curl -X POST https://leracore.com/api/v1/tools/update_agent \
-H "Authorization: Bearer lr_sk_..." \
-H "Content-Type: application/json" \
-d '{
"agent_id": "cmk1a2b3c...",
"name": "texto de ejemplo",
"prompt": "texto de ejemplo"
}'Respuestas
| Código | Descripción |
|---|---|
| 200 | {
"result": {
"ok": true,
"agentId": "cmk1a2b3c...",
"functions": [
"consultar_pedido"
],
"reminder": "Borrador actualizado: publica el agente para que el cambio entre en producción."
}
}application/json; charset=utf-8 |
| 400 | Petición inválida |
| 403 | Prohibido |
ACTUALIZAPOST /api/v1/tools/write_agent_promptRegenera el prompt completo de un agente existente a partir de los datos del negocio y lo guarda en el borrador.
Parámetros
| Nombre | Descripción |
|---|---|
| agent_id* obligatoriostring(body) | Id del agente. Lo devuelve list_agents. |
| business_namestring(body) | Nombre real del negocio. Se usa en el saludo y en el prompt. |
| summarystring(body) | A qué se dedica el negocio, en una frase. Se usa para generar el prompt. |
| servicesarray<string>(body) | Servicios del negocio. Alimentan el prompt y lo que el agente sabe ofrecer. |
| transferboolean(body) | Si el agente debe poder pasar la llamada a una persona. |
| template_keystring(body) | Plantilla de sector de la que partir. Las devuelve list_agent_templates. |
Petición
curl -X POST https://leracore.com/api/v1/tools/write_agent_prompt \
-H "Authorization: Bearer lr_sk_..." \
-H "Content-Type: application/json" \
-d '{
"agent_id": "cmk1a2b3c...",
"business_name": "texto de ejemplo",
"summary": "texto de ejemplo"
}'Respuestas
| Código | Descripción |
|---|---|
| 200 | {
"result": {
"ok": true,
"agentId": "cmk1a2b3c...",
"functions": [
"consultar_pedido"
],
"reminder": "Borrador actualizado: publica el agente para que el cambio entre en producción."
}
}application/json; charset=utf-8 |
| 400 | Petición inválida |
| 403 | Prohibido |
Llamadas y analíticaOperaciones disponibles en LLAMADAS Y ANALÍTICA:CONSULTA /api/v1/tools/get_agent_latencyCONSULTA /api/v1/tools/get_analyticsCONSULTA /api/v1/tools/get_callCONSULTA /api/v1/tools/get_chatCONSULTA /api/v1/tools/get_concurrencyCONSULTA /api/v1/tools/list_callsCONSULTA /api/v1/tools/list_chatsCREA /api/v1/tools/start_outbound_callACTUALIZA /api/v1/tools/set_inbound_concurrency_reservationCREA /api/v1/web-callsCREA /api/v1/chatsCREA /api/v1/chats/{id}/messagesCREA /api/v1/chats/{id}/end
CONSULTAPOST /api/v1/tools/get_agent_latencyDesglosa la latencia de las últimas llamadas de un agente, de punta a punta y por componente.
Parámetros
| Nombre | Descripción |
|---|---|
| agent_id* obligatoriostring(body) | Id del agente. Lo devuelve list_agents. |
| callsnumber(body) | Cuántas llamadas recientes se miran para el cálculo. |
Petición
curl -X POST https://leracore.com/api/v1/tools/get_agent_latency \
-H "Authorization: Bearer lr_sk_..." \
-H "Content-Type: application/json" \
-d '{
"agent_id": "cmk1a2b3c..."
}'Respuestas
| Código | Descripción |
|---|---|
| 200 | {
"result": {
"agentId": "cmk1a2b3c...",
"agentName": "Recepción",
"mode": "conversation_flow",
"model": "gpt-4.1-mini",
"callsAnalizadas": 10,
"e2e": {
"p50": 1290,
"p90": 1980
}
}
}application/json; charset=utf-8 |
| 400 | Petición inválida |
| 403 | Prohibido |
CONSULTAPOST /api/v1/tools/get_analyticsDevuelve la analítica del workspace: totales, por estado, por dirección, por hora y duración media.
Parámetros
Sin parámetros. Envía un objeto vacío.
Petición
curl -X POST https://leracore.com/api/v1/tools/get_analytics \
-H "Authorization: Bearer lr_sk_..." \
-H "Content-Type: application/json" \
-d '{}'Respuestas
| Código | Descripción |
|---|---|
| 200 | {
"result": {
"totalCalls": 128,
"byStatus": {
"completed": 119,
"failed": 9
},
"byDirection": {
"inbound": 120,
"outbound": 8
},
"byHour": {
"10": 14,
"11": 21
},
"averageDurationSeconds": 96
}
}application/json; charset=utf-8 |
| 400 | Petición inválida |
| 403 | Prohibido |
CONSULTAPOST /api/v1/tools/get_callDevuelve el detalle de una llamada: resumen, transcripción, eventos y funciones ejecutadas.
Parámetros
| Nombre | Descripción |
|---|---|
| call_id* obligatoriostring(body) | Id de la llamada. Lo devuelve list_calls. |
Petición
curl -X POST https://leracore.com/api/v1/tools/get_call \
-H "Authorization: Bearer lr_sk_..." \
-H "Content-Type: application/json" \
-d '{
"call_id": "cmk1a2b3c..."
}'Respuestas
| Código | Descripción |
|---|---|
| 200 | {
"result": {
"id": "cmk...",
"status": "completed",
"direction": "inbound",
"callerName": "Ana",
"callerPhone": "+34600111222",
"summary": "Pide cita para el jueves",
"transcript": [
{
"role": "agent",
"text": "Empresa Ejemplo, ¿en qué puedo ayudarte?"
}
]
}
}application/json; charset=utf-8 |
| 400 | Petición inválida |
| 403 | Prohibido |
CONSULTAPOST /api/v1/tools/get_chatUna conversación de un agente de chat entera: los mensajes, las funciones que ejecutó el agente, el resumen y el análisis.
Parámetros
| Nombre | Descripción |
|---|---|
| chat_id* obligatoriostring(body) |
Petición
curl -X POST https://leracore.com/api/v1/tools/get_chat \
-H "Authorization: Bearer lr_sk_..." \
-H "Content-Type: application/json" \
-d '{
"chat_id": "cmk1a2b3c..."
}'Respuestas
| Código | Descripción |
|---|---|
| 200 | Devuelve el resultado dentro de result. { "result": ... }application/json; charset=utf-8 |
| 400 | Petición inválida |
| 403 | Prohibido |
CONSULTAPOST /api/v1/tools/get_concurrencyDevuelve cuántas llamadas hay en curso y cuántas líneas quedan libres, para autorregular los disparos.
Parámetros
Sin parámetros. Envía un objeto vacío.
Petición
curl -X POST https://leracore.com/api/v1/tools/get_concurrency \
-H "Authorization: Bearer lr_sk_..." \
-H "Content-Type: application/json" \
-d '{}'Respuestas
| Código | Descripción |
|---|---|
| 200 | {
"result": {
"current_concurrency": 3,
"concurrency_limit": 10,
"available": 7,
"reserved_inbound_concurrency": 2,
"available_for_outbound": 5
}
}application/json; charset=utf-8 |
| 400 | Petición inválida |
| 403 | Prohibido |
CONSULTAPOST /api/v1/tools/list_callsDevuelve las llamadas recientes, filtrables por estado, dirección y teléfono. Hasta 50 por petición.
Parámetros
| Nombre | Descripción |
|---|---|
| statusstring(body) | Filtra por cómo acabó la llamada. |
| directionstring(body) | Si la llamada la recibió el agente o la hizo él.Valores: inbound · outbound |
| phonestring(body) | Fragmento del teléfono de quien llamó, para filtrar. |
| limitnumber(body) | Máximo de resultados que devuelve. |
Petición
curl -X POST https://leracore.com/api/v1/tools/list_calls \
-H "Authorization: Bearer lr_sk_..." \
-H "Content-Type: application/json" \
-d '{}'Respuestas
| Código | Descripción |
|---|---|
| 200 | {
"result": [
{
"id": "cmk...",
"status": "completed",
"direction": "inbound",
"callerName": "Ana",
"callerPhone": "+34600111222",
"summary": "Pide cita para el jueves"
}
]
}application/json; charset=utf-8 |
| 400 | Petición inválida |
| 403 | Prohibido |
CONSULTAPOST /api/v1/tools/list_chatsLista las conversaciones recientes de tus agentes de chat: estado, canal (web o API), mensajes, resumen y sentimiento.
Parámetros
| Nombre | Descripción |
|---|---|
| agent_idstring(body) | Id del agente. Lo devuelve list_agents. |
| statusstring(body) | Valores: ongoing · ended · error |
| limitnumber(body) | Máximo de resultados que devuelve. |
Petición
curl -X POST https://leracore.com/api/v1/tools/list_chats \
-H "Authorization: Bearer lr_sk_..." \
-H "Content-Type: application/json" \
-d '{}'Respuestas
| Código | Descripción |
|---|---|
| 200 | Devuelve el resultado dentro de result. { "result": ... }application/json; charset=utf-8 |
| 400 | Petición inválida |
| 403 | Prohibido |
CREAPOST /api/v1/tools/start_outbound_callLanza una llamada saliente. Las variables llegan por llamada y se interpolan en el prompt y las funciones.
Parámetros
| Nombre | Descripción |
|---|---|
| to_number* obligatoriostring(body) | Número al que llamar, en formato E.164 (+34600111222). |
| agent_idstring(body) | Agente que llama. Si se omite, se usa el agente saliente asignado al número. |
| variablesobject(body) | Valores propios de esta llamada. Se interpolan en el prompt y en las funciones. |
| idempotency_keystring(body) | Clave propia para que reintentar la misma petición no dispare dos llamadas. |
Petición
curl -X POST https://leracore.com/api/v1/tools/start_outbound_call \
-H "Authorization: Bearer lr_sk_..." \
-H "Content-Type: application/json" \
-d '{
"to_number": "+34600111222",
"agent_id": "cmk1a2b3c...",
"variables": {}
}'Respuestas
| Código | Descripción |
|---|---|
| 200 | {
"result": {
"ok": true,
"call_id": "cmk...",
"to_number": "+34600111222",
"duplicate": false
}
}application/json; charset=utf-8 |
| 400 | Petición inválida |
| 403 | Prohibido |
ACTUALIZAPOST /api/v1/tools/set_inbound_concurrency_reservationGuarda N líneas simultáneas para el teléfono entrante: las salientes y el canal web no podrán ocuparlas.
Parámetros
| Nombre | Descripción |
|---|---|
| reserved* obligatorionumber(body) |
Petición
curl -X POST https://leracore.com/api/v1/tools/set_inbound_concurrency_reservation \
-H "Authorization: Bearer lr_sk_..." \
-H "Content-Type: application/json" \
-d '{
"reserved": 10
}'Respuestas
| Código | Descripción |
|---|---|
| 200 | {
"result": {
"ok": true,
"workspace_id": "cmk1a2b3c...",
"workspace_name": "Mi empresa",
"reserved_inbound_concurrency": 2,
"concurrency_limit": 10,
"available_for_outbound": 8,
"clamped": false
}
}application/json; charset=utf-8 |
| 400 | Petición inválida |
| 403 | Prohibido |
CREAPOST /api/v1/web-callsAbre una llamada por navegador desde tu backend y devuelve el token de sala para tu frontend.
Parámetros
| Nombre | Descripción |
|---|---|
| agent_id* obligatoriostring(body) | Agente que atiende la llamada. Tiene que estar publicado. |
| variablesobject(body) | Valores por llamada, solo cadenas. Únicamente se aceptan las variables declaradas en el agente. |
Petición
curl -X POST https://leracore.com/api/v1/web-calls \
-H "Authorization: Bearer lr_sk_..." \
-H "Content-Type: application/json" \
-d '{}'Respuestas
| Código | Descripción |
|---|---|
| 200 | {
"call_id": "cmk...",
"access_token": "eyJhbGciOi...",
"livekit_url": "wss://....livekit.cloud",
"max_duration_sec": 600
}application/json; charset=utf-8 |
| 400 | Petición inválida |
| 403 | Prohibido |
CREAPOST /api/v1/chatsAbre una conversación con un agente de chat. Devuelve el chat y el mensaje de bienvenida, si el agente lo tiene.
Parámetros
| Nombre | Descripción |
|---|---|
| agent_id* obligatoriostring(body) | Agente de chat que atiende. Tiene que estar publicado. |
| variablesobject(body) | Valores para el agente, solo cadenas. Únicamente se aceptan las variables declaradas en el agente. |
| metadataobject(body) | Lo que quieras guardar con la conversación (tu id de cliente, por ejemplo). Vuelve en el webhook. |
Petición
curl -X POST https://leracore.com/api/v1/chats \
-H "Authorization: Bearer lr_sk_..." \
-H "Content-Type: application/json" \
-d '{}'Respuestas
| Código | Descripción |
|---|---|
| 200 | {
"chat": { "id": "cmk...", "agent_id": "cmk...", "channel": "api", "status": "ongoing" },
"messages": [{ "id": "cmk...", "role": "agent", "content": "Hola, soy el asistente virtual...", "created_at": "2026-10-02T09:00:00.000Z" }]
}application/json; charset=utf-8 |
| 400 | Petición inválida |
| 403 | Prohibido |
CREAPOST /api/v1/chats/{id}/messagesManda un mensaje y devuelve solo lo nuevo que contesta el agente. Se cobra por mensaje del agente.
Parámetros
| Nombre | Descripción |
|---|---|
| content* obligatoriostring(body) | Lo que escribe la persona. Hasta 2.000 caracteres. |
Petición
curl -X POST https://leracore.com/api/v1/chats/{id}/messages \
-H "Authorization: Bearer lr_sk_..." \
-H "Content-Type: application/json" \
-d '{}'Respuestas
| Código | Descripción |
|---|---|
| 200 | {
"messages": [{ "id": "cmk...", "role": "agent", "content": "Abrimos de lunes a viernes de 7:00 a 22:00.", "created_at": "2026-10-02T09:00:05.000Z" }],
"chat": { "id": "cmk...", "status": "ongoing", "agent_messages": 1 }
}application/json; charset=utf-8 |
| 400 | Petición inválida |
| 403 | Prohibido |
CREAPOST /api/v1/chats/{id}/endCierra la conversación. Al cerrarse se cobra y se analiza. Si no la cierras, se cierra sola tras el tiempo sin mensajes del agente.
Parámetros
Sin parámetros. Envía un objeto vacío.
Petición
curl -X POST https://leracore.com/api/v1/chats/{id}/end \
-H "Authorization: Bearer lr_sk_..." \
-H "Content-Type: application/json" \
-d '{}'Respuestas
| Código | Descripción |
|---|---|
| 200 | {
"chat": { "id": "cmk...", "status": "ended", "end_reason": "api", "agent_messages": 4 }
}application/json; charset=utf-8 |
| 400 | Petición inválida |
| 403 | Prohibido |
Números de teléfonoOperaciones disponibles en NÚMEROS DE TELÉFONO:CONSULTA /api/v1/tools/get_forwarding_codesCONSULTA /api/v1/tools/list_phone_numbersCREA /api/v1/tools/check_phone_numberCREA /api/v1/tools/import_phone_numberCREA /api/v1/tools/request_inbound_lineACTUALIZA /api/v1/tools/assign_inbound_agentACTUALIZA /api/v1/tools/assign_outbound_agentACTUALIZA /api/v1/tools/reconnect_phone_numberELIMINA /api/v1/tools/release_inbound_line
CONSULTAPOST /api/v1/tools/get_forwarding_codesCódigos para desviar el número del negocio a su línea de entrada de Lera, según operador y tipo de línea, con lo que cobra el operador por el desvío.
Parámetros
| Nombre | Descripción |
|---|---|
| operator* obligatoriostring(body) | Valores: movistar · vodafone · orange · yoigo · masmovil · digi · lowi · pepephone · o2 · jazztel · simyo · finetwork · avatel · euskaltel · adamo · unknown · other |
| line* obligatoriostring(body) | Valores: fixed · mobile |
| modestring(body) | Cómo se construye el agente: prompt único o flujo por nodos.Valores: unanswered · always |
| ring_secondsnumber(body) | |
| phone_number_idstring(body) | Id del número. Lo devuelve list_phone_numbers. |
Petición
curl -X POST https://leracore.com/api/v1/tools/get_forwarding_codes \
-H "Authorization: Bearer lr_sk_..." \
-H "Content-Type: application/json" \
-d '{
"operator": "movistar",
"line": "fixed"
}'Respuestas
| Código | Descripción |
|---|---|
| 200 | {
"result": {
"lera_line": "+34848000000",
"dial_first": { "codes": ["##002#"], "text": "Primero quita tu buzón de voz..." },
"codes": [
{ "type": "noAnswer", "activate": "**61*848000000#", "deactivate": "##61#", "check": "*#61#", "published_by_operator": true },
{ "type": "busy", "activate": "**67*848000000#", "deactivate": "##67#", "check": "*#67#", "published_by_operator": true },
{ "type": "unreachable", "activate": "**62*848000000#", "deactivate": "##62#", "check": "*#62#", "published_by_operator": true }
],
"remove_all_at_once": "##002#",
"voicemail_back": { "codes": ["**61*1222#", "**67*1222#", "**62*1222#"], "text": "Para volver a tener el buzón de voz, tu operador lo activa con:" },
"operator_cost": "Cada llamada desviada es una llamada desde tu teléfono a tu línea de Lera, y se cobra según tu tarifa.",
"source": "https://ayuda.jazztel.com/movil/servicios/1743-desvio-de-llamadas"
}
}application/json; charset=utf-8 |
| 400 | Petición inválida |
| 403 | Prohibido |
CONSULTAPOST /api/v1/tools/list_phone_numbersDevuelve los números del workspace con sus agentes asignados, países permitidos y estado.
Parámetros
Sin parámetros. Envía un objeto vacío.
Petición
curl -X POST https://leracore.com/api/v1/tools/list_phone_numbers \
-H "Authorization: Bearer lr_sk_..." \
-H "Content-Type: application/json" \
-d '{}'Respuestas
| Código | Descripción |
|---|---|
| 200 | {
"result": [
{
"id": "cmk...",
"label": "Centralita",
"e164": "+34600333444",
"provider": "sip",
"status": "active",
"inboundAgentId": "cmk1a2b3c...",
"outboundAgentId": "cmk4d5e6f..."
}
]
}application/json; charset=utf-8 |
| 400 | Petición inválida |
| 403 | Prohibido |
CREAPOST /api/v1/tools/check_phone_numberDiagnostica un número: si está conectado, si tiene agente entrante y si ese agente está publicado.
Parámetros
| Nombre | Descripción |
|---|---|
| phone_number_idstring(body) | Id del número. Lo devuelve list_phone_numbers. |
| e164string(body) | Número en formato E.164, con prefijo de país (+34600111222). |
Petición
curl -X POST https://leracore.com/api/v1/tools/check_phone_number \
-H "Authorization: Bearer lr_sk_..." \
-H "Content-Type: application/json" \
-d '{
"phone_number_id": "cmk1a2b3c...",
"e164": "+34600111222"
}'Respuestas
| Código | Descripción |
|---|---|
| 200 | {
"result": {
"ok": true,
"phone_number": {
"id": "cmk...",
"e164": "+34600333444",
"status": "active"
},
"inbound_agent": {
"id": "cmk1a2b3c...",
"name": "Recepción",
"status": "published"
},
"problems": []
}
}application/json; charset=utf-8 |
| 400 | Petición inválida |
| 403 | Prohibido |
CREAPOST /api/v1/tools/import_phone_numberImporta un número que ya tienes (Twilio, Telnyx o SIP) para que Lera atienda sus llamadas.
Parámetros
| Nombre | Descripción |
|---|---|
| e164* obligatoriostring(body) | Número en formato E.164, con prefijo de país (+34600111222). |
| providerstring(body) | De dónde viene el número: Twilio, Telnyx o una centralita SIP.Valores: twilio · telnyx · sip · custom |
| labelstring(body) | Alias para reconocer el número en el panel. |
Petición
curl -X POST https://leracore.com/api/v1/tools/import_phone_number \
-H "Authorization: Bearer lr_sk_..." \
-H "Content-Type: application/json" \
-d '{
"e164": "+34600111222",
"provider": "twilio",
"label": "texto de ejemplo"
}'Respuestas
| Código | Descripción |
|---|---|
| 200 | {
"result": {
"ok": true,
"phone_number": {
"id": "cmk...",
"e164": "+34600333444",
"status": "active"
},
"next_step": "Asigna el agente que atiende con assign_inbound_agent."
}
}application/json; charset=utf-8 |
| 400 | Petición inválida |
| 403 | Prohibido |
CREAPOST /api/v1/tools/request_inbound_lineDa al workspace una línea de entrada al momento, para desviar a ella el número del negocio. La primera de la cuenta va incluida; cada adicional tiene una cuota mensual, que se descuenta del saldo hoy y después cada mes.
Parámetros
| Nombre | Descripción |
|---|---|
| agent_idstring(body) | Agente de voz publicado que contesta las llamadas de la línea. Obligatorio si hay más de uno publicado. |
| labelstring(body) | Alias de la línea, para reconocerla en el panel. |
| accept_line_feeboolean(body) | Obligatorio en una línea adicional: aceptas su cuota mensual (monthly_fee_eur), que se descuenta de tu saldo desde hoy. Sin él, la respuesta es line_fee_not_accepted con el precio y no se asigna nada, así que repetir la petición no compra dos. |
Petición
curl -X POST https://leracore.com/api/v1/tools/request_inbound_line \
-H "Authorization: Bearer lr_sk_..." \
-H "Content-Type: application/json" \
-d '{
"agent_id": "cmk1a2b3c...",
"label": "texto de ejemplo"
}'Respuestas
| Código | Descripción |
|---|---|
| 200 | {
"result": {
"ok": true,
"lera_line": "+34848000000",
"included": false,
"monthly_fee_eur": 3,
"next_step": "Dale los códigos para desviar su número a esta línea con get_forwarding_codes."
}
}application/json; charset=utf-8 |
| 400 | Petición inválida |
| 403 | Prohibido |
ACTUALIZAPOST /api/v1/tools/assign_inbound_agentAsigna qué agente atiende las llamadas entrantes de un número. Pasa null para dejarlo sin agente.
Parámetros
| Nombre | Descripción |
|---|---|
| phone_number_id* obligatoriostring(body) | Id del número. Lo devuelve list_phone_numbers. |
| agent_idstring(body) | Id del agente. Lo devuelve list_agents. |
Petición
curl -X POST https://leracore.com/api/v1/tools/assign_inbound_agent \
-H "Authorization: Bearer lr_sk_..." \
-H "Content-Type: application/json" \
-d '{
"phone_number_id": "cmk1a2b3c...",
"agent_id": "cmk1a2b3c..."
}'Respuestas
| Código | Descripción |
|---|---|
| 200 | {
"result": {
"ok": true,
"e164": "+34600333444",
"inboundAgentId": "cmk1a2b3c..."
}
}application/json; charset=utf-8 |
| 400 | Petición inválida |
| 403 | Prohibido |
ACTUALIZAPOST /api/v1/tools/assign_outbound_agentAsigna qué agente hace las llamadas salientes desde un número. Pasa null para dejarlo sin agente.
Parámetros
| Nombre | Descripción |
|---|---|
| phone_number_id* obligatoriostring(body) | Id del número. Lo devuelve list_phone_numbers. |
| agent_idstring(body) | Id del agente. Lo devuelve list_agents. |
Petición
curl -X POST https://leracore.com/api/v1/tools/assign_outbound_agent \
-H "Authorization: Bearer lr_sk_..." \
-H "Content-Type: application/json" \
-d '{
"phone_number_id": "cmk1a2b3c...",
"agent_id": "cmk1a2b3c..."
}'Respuestas
| Código | Descripción |
|---|---|
| 200 | {
"result": {
"ok": true,
"e164": "+34600333444",
"outboundAgentId": "cmk1a2b3c..."
}
}application/json; charset=utf-8 |
| 400 | Petición inválida |
| 403 | Prohibido |
ACTUALIZAPOST /api/v1/tools/reconnect_phone_numberReintenta conectar un número a la entrada de llamadas. Úsalo si el diagnóstico dice que no está conectado.
Parámetros
| Nombre | Descripción |
|---|---|
| phone_number_idstring(body) | Id del número. Lo devuelve list_phone_numbers. |
| e164string(body) | Número en formato E.164, con prefijo de país (+34600111222). |
Petición
curl -X POST https://leracore.com/api/v1/tools/reconnect_phone_number \
-H "Authorization: Bearer lr_sk_..." \
-H "Content-Type: application/json" \
-d '{
"phone_number_id": "cmk1a2b3c...",
"e164": "+34600111222"
}'Respuestas
| Código | Descripción |
|---|---|
| 200 | {
"result": {
"ok": true,
"e164": "+34600333444",
"inbound_ready": true
}
}application/json; charset=utf-8 |
| 400 | Petición inválida |
| 403 | Prohibido |
ELIMINAPOST /api/v1/tools/release_inbound_lineSuelta una línea de entrada: deja de recibir llamadas y de cobrarse. Lo pagado del mes no se devuelve. Si había recibido llamadas, se guarda 30 días para la misma cuenta.
Parámetros
| Nombre | Descripción |
|---|---|
| e164string(body) | La línea de entrada, en formato E.164. Opcional si pasas phone_number_id o si el workspace solo tiene una. |
| phone_number_idstring(body) | Id del número. Lo devuelve list_phone_numbers. |
Petición
curl -X POST https://leracore.com/api/v1/tools/release_inbound_line \
-H "Authorization: Bearer lr_sk_..." \
-H "Content-Type: application/json" \
-d '{
"e164": "+34600111222",
"phone_number_id": "cmk1a2b3c..."
}'Respuestas
| Código | Descripción |
|---|---|
| 200 | {
"result": {
"ok": true,
"released": "+34848000000",
"kept_for_you": true
}
}application/json; charset=utf-8 |
| 400 | Petición inválida |
| 403 | Prohibido |
Flujo conversacionalOperaciones disponibles en FLUJO CONVERSACIONAL:CONSULTA /api/v1/tools/check_transfersCONSULTA /api/v1/tools/get_agent_flowCREA /api/v1/tools/attach_function_to_nodeACTUALIZA /api/v1/tools/patch_nodeACTUALIZA /api/v1/tools/patch_transferACTUALIZA /api/v1/tools/update_agent_flowELIMINA /api/v1/tools/detach_function_from_node
CONSULTAPOST /api/v1/tools/check_transfersDiagnostica qué derivaciones puede hacer de verdad esta cuenta. Úsalo antes de prometer una a nadie.
Parámetros
| Nombre | Descripción |
|---|---|
| agent_idstring(body) | Id del agente. Lo devuelve list_agents. |
Petición
curl -X POST https://leracore.com/api/v1/tools/check_transfers \
-H "Authorization: Bearer lr_sk_..." \
-H "Content-Type: application/json" \
-d '{}'Respuestas
| Código | Descripción |
|---|---|
| 200 | {
"result": {
"cuenta": {
"puede_derivar": true,
"linea_de_salida": true
},
"agente": {
"modo": "flujo",
"donde_se_configura": "patch_transfer (cada derivación en su nodo)",
"derivaciones": [
{
"nodeId": "pasar_persona",
"destino": "+34600333444"
}
]
}
}
}application/json; charset=utf-8 |
| 400 | Petición inválida |
| 403 | Prohibido |
CONSULTAPOST /api/v1/tools/get_agent_flowDevuelve el flujo por nodos del borrador junto a las funciones disponibles. Léelo antes de editarlo.
Parámetros
| Nombre | Descripción |
|---|---|
| agent_id* obligatoriostring(body) | Id del agente. Lo devuelve list_agents. |
Petición
curl -X POST https://leracore.com/api/v1/tools/get_agent_flow \
-H "Authorization: Bearer lr_sk_..." \
-H "Content-Type: application/json" \
-d '{
"agent_id": "cmk1a2b3c..."
}'Respuestas
| Código | Descripción |
|---|---|
| 200 | {
"result": {
"id": "cmk1a2b3c...",
"mode": "conversation_flow",
"conversationFlow": {
"startNodeId": "inicio",
"nodes": [
{
"id": "inicio",
"type": "conversation"
}
]
},
"availableCustomTools": [
{
"name": "consultar_pedido",
"description": "Busca el pedido"
}
]
}
}application/json; charset=utf-8 |
| 400 | Petición inválida |
| 403 | Prohibido |
CREAPOST /api/v1/tools/attach_function_to_nodeOfrece una función en una fase concreta del flujo. En un agente de flujo, crear la función no basta.
Parámetros
| Nombre | Descripción |
|---|---|
| agent_id* obligatoriostring(body) | Id del agente. Lo devuelve list_agents. |
| node_id* obligatoriostring(body) | Id del nodo del flujo. Lo devuelve get_agent_flow. |
| function_name* obligatoriostring(body) | Nombre de la función del agente. Lo devuelve list_agent_functions. |
| run_on_enterboolean(body) | Ejecutar la función al ENTRAR en el nodo, sin esperar a que el modelo la pida. |
Petición
curl -X POST https://leracore.com/api/v1/tools/attach_function_to_node \
-H "Authorization: Bearer lr_sk_..." \
-H "Content-Type: application/json" \
-d '{
"agent_id": "cmk1a2b3c...",
"node_id": "cmk1a2b3c...",
"function_name": "texto de ejemplo",
"run_on_enter": true
}'Respuestas
| Código | Descripción |
|---|---|
| 200 | {
"result": {
"ok": true,
"agentId": "cmk1a2b3c...",
"functionName": "consultar_pedido",
"nodeId": "consulta",
"functions": [
"consultar_pedido"
]
}
}application/json; charset=utf-8 |
| 400 | Petición inválida |
| 403 | Prohibido |
ACTUALIZAPOST /api/v1/tools/patch_nodeCambia un solo nodo del flujo sin tocar el resto: su prompt, su tipo, su modelo o sus bases de conocimiento.
Parámetros
| Nombre | Descripción |
|---|---|
| agent_id* obligatoriostring(body) | Id del agente. Lo devuelve list_agents. |
| node_id* obligatoriostring(body) | Id del nodo del flujo. Lo devuelve get_agent_flow. |
| promptstring(body) | Instrucciones del agente: qué hace, qué pregunta y cómo responde. |
| static_textstring(body) | Frase fija que dice el nodo tal cual, sin generar. Es la opción más rápida. |
| instruction_modestring(body) | Si manda la frase fija o el prompt del nodo.Valores: prompt · static |
| typestring(body) | Tipo del nodo. Solo entre diálogo con herramientas y diálogo limpio.Valores: conversation · subagent |
| namestring(body) | Nuevo nombre del nodo. Se inyecta en el prompt, así que escríbelo bien y con tildes. |
| llm_modelstring(body) | Modelo solo para este nodo. Sirve para poner uno más capaz donde de verdad hace falta. |
| is_globalboolean(body) | Hace el nodo alcanzable desde cualquier fase sin necesidad de una flecha. |
| global_conditionstring(body) | Cuándo se salta a ese nodo global, dicho desde lo que dice quien llama. |
| global_cooldownnumber(body) | Fases que tienen que pasar antes de que ese global pueda volver a dispararse. |
| knowledge_base_idsarray<string>(body) | Ids de las bases de conocimiento asignadas al agente. Lista vacía para quitarlas todas. |
| kb_configobject(body) | Ajuste fino de la búsqueda solo en este nodo. Pisa el del agente campo a campo. |
| agent_swapobject(body) | Solo en un nodo agent_swap: a qué agente se pasa la conversación y cómo (versión, nodo de entrada, análisis, voz, idioma, historial, aviso de espera). Se mezcla con lo que ya tiene. |
| thinking_soundboolean(body) |
Petición
curl -X POST https://leracore.com/api/v1/tools/patch_node \
-H "Authorization: Bearer lr_sk_..." \
-H "Content-Type: application/json" \
-d '{
"agent_id": "cmk1a2b3c...",
"node_id": "cmk1a2b3c...",
"prompt": "texto de ejemplo",
"static_text": "texto de ejemplo"
}'Respuestas
| Código | Descripción |
|---|---|
| 200 | {
"result": {
"ok": true,
"agentId": "cmk1a2b3c...",
"nodeId": "cierre",
"fields": [
"prompt"
],
"functions": [
"consultar_pedido"
]
}
}application/json; charset=utf-8 |
| 400 | Petición inválida |
| 403 | Prohibido |
ACTUALIZAPOST /api/v1/tools/patch_transferCambia cómo deriva un agente: destino, extensión, si entrega o presenta el caso, y qué oye quien espera.
Parámetros
| Nombre | Descripción |
|---|---|
| agent_id* obligatoriostring(body) | Id del agente. Lo devuelve list_agents. |
| node_idstring(body) | Id del nodo del flujo. Lo devuelve get_agent_flow. |
| targetstring(body) | A dónde va la llamada: un número E.164 o una dirección SIP de la centralita. |
| destination_promptstring(body) | En vez de un destino fijo, describe a dónde va cada caso y el modelo elige. Excluyente con target. |
| extensionstring(body) | Extensión que se teclea al descolgar. Solo funciona haciendo de puente. |
| extra_targetsarray<object>(body) | Destinos de respaldo si el primero no coge. |
| announce_next_targetboolean(body) | Si avisa a quien llama antes de probar con el siguiente destino. |
| next_target_messagestring(body) | Frase de ese aviso. Vacía, la redacta el agente. |
| transfer_typestring(body) | Si se entrega la llamada o se presenta el caso antes de pasarla.Valores: cold · warm · agentic |
| cold_transfer_modestring(body) | Cómo se entrega la llamada: se la damos al operador y salimos, o hacemos de puente.Valores: sip_refer · sip_invite |
| caller_idstring(body) | Qué número ve quien recibe la llamada transferida.Valores: trunk · caller |
| ring_duration_msnumber(body) | Cuánto suena el destino antes de darlo por fallido. |
| speak_during_executionboolean(body) | Si el agente dice algo mientras la función se ejecuta, para que la espera no suene a silencio. |
| transfer_messagestring(body) | Frase que se dice justo antes de pasar la llamada. |
| human_detectionboolean(body) | Comprobar que ha descolgado una persona antes de presentarle el caso. |
| hold_musicstring(body) | Qué oye quien llama mientras espera la transferencia.Valores: none · hold_music · office_ambience · keyboard_typing |
| handoff_privatestring(body) | Lo que el agente le cuenta a la persona ANTES de pasarle la llamada. |
| handoff_publicstring(body) | Lo que se dice delante de quien llama al hacer el traspaso. |
| allow_unvalidated_targetboolean(body) | Aceptar un destino que no es número ni SIP, como una extensión suelta de su centralita. |
Petición
curl -X POST https://leracore.com/api/v1/tools/patch_transfer \
-H "Authorization: Bearer lr_sk_..." \
-H "Content-Type: application/json" \
-d '{
"agent_id": "cmk1a2b3c...",
"node_id": "cmk1a2b3c...",
"target": "texto de ejemplo"
}'Respuestas
| Código | Descripción |
|---|---|
| 200 | {
"result": {
"ok": true,
"agentId": "cmk1a2b3c...",
"nodeId": "pasar_persona",
"fields": [
"target"
],
"functions": [
"consultar_pedido"
],
"reminder": "Borrador actualizado: publica el agente para que el cambio entre en producción."
}
}application/json; charset=utf-8 |
| 400 | Petición inválida |
| 403 | Prohibido |
ACTUALIZAPOST /api/v1/tools/update_agent_flowReemplaza el grafo completo del borrador y pone el agente en modo flujo. Para un solo nodo, usa patch_node.
Parámetros
| Nombre | Descripción |
|---|---|
| agent_id* obligatoriostring(body) | Id del agente. Lo devuelve list_agents. |
| conversation_flow* obligatorioobject(body) | El grafo completo: nodo inicial y lista de nodos. Reemplaza el flujo anterior. |
Petición
curl -X POST https://leracore.com/api/v1/tools/update_agent_flow \
-H "Authorization: Bearer lr_sk_..." \
-H "Content-Type: application/json" \
-d '{
"agent_id": "cmk1a2b3c...",
"conversation_flow": {}
}'Respuestas
| Código | Descripción |
|---|---|
| 200 | {
"result": {
"ok": true,
"agentId": "cmk1a2b3c...",
"nodes": 6,
"functions": [
"consultar_pedido"
],
"reminder": "Borrador actualizado: publica el agente para que el cambio entre en producción."
}
}application/json; charset=utf-8 |
| 400 | Petición inválida |
| 403 | Prohibido |
ELIMINAPOST /api/v1/tools/detach_function_from_nodeDeja de ofrecer una función en ese nodo. No la borra del agente.
Parámetros
| Nombre | Descripción |
|---|---|
| agent_id* obligatoriostring(body) | Id del agente. Lo devuelve list_agents. |
| node_id* obligatoriostring(body) | Id del nodo del flujo. Lo devuelve get_agent_flow. |
| function_name* obligatoriostring(body) | Nombre de la función del agente. Lo devuelve list_agent_functions. |
Petición
curl -X POST https://leracore.com/api/v1/tools/detach_function_from_node \
-H "Authorization: Bearer lr_sk_..." \
-H "Content-Type: application/json" \
-d '{
"agent_id": "cmk1a2b3c...",
"node_id": "cmk1a2b3c...",
"function_name": "texto de ejemplo"
}'Respuestas
| Código | Descripción |
|---|---|
| 200 | {
"result": {
"ok": true,
"agentId": "cmk1a2b3c...",
"functionName": "consultar_pedido",
"nodeId": "consulta",
"functions": [
"consultar_pedido"
]
}
}application/json; charset=utf-8 |
| 400 | Petición inválida |
| 403 | Prohibido |
Funciones y calendarioOperaciones disponibles en FUNCIONES Y CALENDARIO:CONSULTA /api/v1/tools/list_agent_functionsCONSULTA /api/v1/tools/list_calcom_event_typesCONSULTA /api/v1/tools/list_calendar_functionsCREA /api/v1/tools/add_agent_functionCREA /api/v1/tools/add_agent_messageCREA /api/v1/tools/connect_calendarACTUALIZA /api/v1/tools/set_post_call_actionsACTUALIZA /api/v1/tools/update_agent_functionELIMINA /api/v1/tools/remove_agent_functionELIMINA /api/v1/tools/remove_calendar_functions
CONSULTAPOST /api/v1/tools/list_agent_functionsDevuelve las funciones personalizadas de un agente con su método, su URL y sus parámetros.
Parámetros
| Nombre | Descripción |
|---|---|
| agent_id* obligatoriostring(body) | Id del agente. Lo devuelve list_agents. |
Petición
curl -X POST https://leracore.com/api/v1/tools/list_agent_functions \
-H "Authorization: Bearer lr_sk_..." \
-H "Content-Type: application/json" \
-d '{
"agent_id": "cmk1a2b3c..."
}'Respuestas
| Código | Descripción |
|---|---|
| 200 | {
"result": {
"agentId": "cmk1a2b3c...",
"functions": [
{
"name": "consultar_pedido",
"description": "Busca el pedido por su número",
"method": "POST",
"url": "https://tu-sistema.example.com/pedidos"
}
]
}
}application/json; charset=utf-8 |
| 400 | Petición inválida |
| 403 | Prohibido |
CONSULTAPOST /api/v1/tools/list_calcom_event_typesLista los tipos de evento de una cuenta de Cal.com para elegir cuál usar. Solo lee: no guarda nada.
Parámetros
| Nombre | Descripción |
|---|---|
| api_key* obligatoriostring(body) | Clave de Cal.com del usuario. No se devuelve nunca al consultar. |
Petición
curl -X POST https://leracore.com/api/v1/tools/list_calcom_event_types \
-H "Authorization: Bearer lr_sk_..." \
-H "Content-Type: application/json" \
-d '{
"api_key": "texto de ejemplo"
}'Respuestas
| Código | Descripción |
|---|---|
| 200 | {
"result": {
"eventTypes": [
{
"id": 123456,
"title": "Consulta 30 min",
"length": 30
}
]
}
}application/json; charset=utf-8 |
| 400 | Petición inválida |
| 403 | Prohibido |
CONSULTAPOST /api/v1/tools/list_calendar_functionsDevuelve el conector de calendario de un agente y su tipo de evento. Nunca devuelve la clave de Cal.com.
Parámetros
| Nombre | Descripción |
|---|---|
| agent_id* obligatoriostring(body) | Id del agente. Lo devuelve list_agents. |
Petición
curl -X POST https://leracore.com/api/v1/tools/list_calendar_functions \
-H "Authorization: Bearer lr_sk_..." \
-H "Content-Type: application/json" \
-d '{
"agent_id": "cmk1a2b3c..."
}'Respuestas
| Código | Descripción |
|---|---|
| 200 | {
"result": {
"agentId": "cmk1a2b3c...",
"connected": true,
"functions": [
{
"name": "reservar_cita",
"kind": "book",
"provider": "calcom"
}
]
}
}application/json; charset=utf-8 |
| 400 | Petición inválida |
| 403 | Prohibido |
CREAPOST /api/v1/tools/add_agent_functionAñade una función: durante la llamada el agente hace una petición firmada a tu URL. Máximo 10 por agente.
Parámetros
| Nombre | Descripción |
|---|---|
| agent_id* obligatoriostring(body) | Id del agente. Lo devuelve list_agents. |
| name* obligatoriostring(body) | Identificador de la función: minúsculas, sin espacios. |
| description* obligatoriostring(body) | Cuándo debe usar el agente esta función. |
| url* obligatoriostring(body) | URL de tu sistema. Tiene que ser https y accesible desde fuera. |
| methodstring(body) | Método HTTP con el que se llama a tu URL. Por defecto POST.Valores: GET · POST · PUT · PATCH · DELETE |
| headersarray<object>(body) | Cabeceras propias de la petición. No se admiten content-type ni las que empiezan por x-lera-. |
| parametersarray<object>(body) | Datos que el agente recoge en la llamada y te manda en la petición. |
| speak_during_executionboolean(body) | Si el agente dice algo mientras la función se ejecuta, para que la espera no suene a silencio. |
| wait_messagestring(body) | Frase que dice el agente mientras la función se ejecuta. Vacío usa la del motor. |
| wait_after_msnumber(body) | Milisegundos que debe tardar la función antes de decir la frase de espera. Recomendado 1000. |
| thinking_soundboolean(body) | |
| speak_after_executionboolean(body) | Si el agente habla después de ejecutarla. Con false el turno cierra, salvo que falle. |
| mock_responsestring(body) | Respuesta de prueba para el panel. En una llamada real se llama a tu URL. |
| response_capturesarray<object>(body) | Campos de tu respuesta que se guardan como variables para usarlos después. |
| timeout_msnumber(body) | Tiempo máximo de espera a tu sistema, en milisegundos. |
Petición
curl -X POST https://leracore.com/api/v1/tools/add_agent_function \
-H "Authorization: Bearer lr_sk_..." \
-H "Content-Type: application/json" \
-d '{
"agent_id": "cmk1a2b3c...",
"name": "texto de ejemplo",
"description": "texto de ejemplo",
"url": "https://tu-sistema.example.com/consultar",
"method": "GET",
"headers": []
}'Respuestas
| Código | Descripción |
|---|---|
| 200 | {
"result": {
"ok": true,
"agentId": "cmk1a2b3c...",
"functionName": "consultar_pedido",
"functions": [
"consultar_pedido"
]
}
}application/json; charset=utf-8 |
| 400 | Petición inválida |
| 403 | Prohibido |
CREAPOST /api/v1/tools/add_agent_messageDa al agente la capacidad de mandar un SMS, un correo o un WhatsApp durante la llamada. Hoy solo el correo está disponible, y lo enviamos nosotros. SMS y WhatsApp aún no tienen conector.
Parámetros
| Nombre | Descripción |
|---|---|
| agent_id* obligatoriostring(body) | Id del agente. Lo devuelve list_agents. |
| name* obligatoriostring(body) | |
| channel* obligatoriostring(body) | Valores: sms · email · whatsapp |
| descriptionstring(body) | |
| body_modestring(body) | Valores: static · prompt · template |
| body* obligatoriostring(body) | |
| subjectstring(body) | |
| template_keystring(body) | Plantilla de sector de la que partir. Las devuelve list_agent_templates. |
| tostring(body) | Valores: caller · variable · fixed |
| to_varstring(body) | |
| to_fixedstring(body) |
Petición
curl -X POST https://leracore.com/api/v1/tools/add_agent_message \
-H "Authorization: Bearer lr_sk_..." \
-H "Content-Type: application/json" \
-d '{
"agent_id": "cmk1a2b3c...",
"name": "texto de ejemplo",
"channel": "sms",
"body": "texto de ejemplo",
"description": "texto de ejemplo",
"body_mode": "static"
}'Respuestas
| Código | Descripción |
|---|---|
| 200 | {
"result": {
"ok": true,
"agentId": "cmk1a2b3c...",
"channel": "sms"
}
}application/json; charset=utf-8 |
| 400 | Petición inválida |
| 403 | Prohibido |
CREAPOST /api/v1/tools/connect_calendarConecta Cal.com a un agente para consultar huecos y reservar citas durante la llamada.
Parámetros
| Nombre | Descripción |
|---|---|
| agent_id* obligatoriostring(body) | Id del agente. Lo devuelve list_agents. |
| api_key* obligatoriostring(body) | Clave de Cal.com del usuario. No se devuelve nunca al consultar. |
| event_type_id* obligatoriostring(body) | Tipo de evento de Cal.com que se reserva. Lo devuelve list_calcom_event_types. |
| timezonestring(body) | Zona horaria con la que se leen los huecos y se reservan las citas. |
| availability_wait_messagestring(body) | Frase mientras consulta huecos. Vacía usa la del motor, en el idioma del agente. |
| book_wait_messagestring(body) | Frase mientras reserva. Vacía usa la del motor. |
Petición
curl -X POST https://leracore.com/api/v1/tools/connect_calendar \
-H "Authorization: Bearer lr_sk_..." \
-H "Content-Type: application/json" \
-d '{
"agent_id": "cmk1a2b3c...",
"api_key": "texto de ejemplo",
"event_type_id": "cmk1a2b3c...",
"timezone": "texto de ejemplo",
"availability_wait_message": "texto de ejemplo"
}'Respuestas
| Código | Descripción |
|---|---|
| 200 | {
"result": {
"ok": true,
"agentId": "cmk1a2b3c...",
"eventTypeId": "123456",
"functions": [
"consultar_disponibilidad",
"reservar_cita"
]
}
}application/json; charset=utf-8 |
| 400 | Petición inválida |
| 403 | Prohibido |
ACTUALIZAPOST /api/v1/tools/set_post_call_actionsDefine qué pasa cuando la llamada termina: mandar un mensaje o llamar a una función tuya, con una condición opcional sobre el análisis.
Parámetros
| Nombre | Descripción |
|---|---|
| agent_id* obligatoriostring(body) | Id del agente. Lo devuelve list_agents. |
| actions* obligatorioarray<object>(body) |
Petición
curl -X POST https://leracore.com/api/v1/tools/set_post_call_actions \
-H "Authorization: Bearer lr_sk_..." \
-H "Content-Type: application/json" \
-d '{
"agent_id": "cmk1a2b3c...",
"actions": []
}'Respuestas
| Código | Descripción |
|---|---|
| 200 | {
"result": {
"ok": true,
"agentId": "cmk1a2b3c...",
"count": 2
}
}application/json; charset=utf-8 |
| 400 | Petición inválida |
| 403 | Prohibido |
ACTUALIZAPOST /api/v1/tools/update_agent_functionEdita una función por su nombre. Solo cambia lo que pasas; para renombrarla, bórrala y créala de nuevo.
Parámetros
| Nombre | Descripción |
|---|---|
| agent_id* obligatoriostring(body) | Id del agente. Lo devuelve list_agents. |
| name* obligatoriostring(body) | Nombre de la función a editar. |
| descriptionstring(body) | Cuándo debe usar el agente esta función. |
| urlstring(body) | URL de tu sistema. Tiene que ser https y accesible desde fuera. |
| methodstring(body) | Método HTTP con el que se llama a tu URL. Por defecto POST.Valores: GET · POST · PUT · PATCH · DELETE |
| headersarray<object>(body) | Cabeceras propias de la petición. No se admiten content-type ni las que empiezan por x-lera-. |
| parametersarray<object>(body) | Datos que el agente recoge en la llamada y te manda en la petición. |
| speak_during_executionboolean(body) | Si el agente dice algo mientras la función se ejecuta, para que la espera no suene a silencio. |
| wait_messagestring(body) | Frase que dice el agente mientras la función se ejecuta. Vacío usa la del motor. |
| wait_after_msnumber(body) | Milisegundos que debe tardar la función antes de decir la frase de espera. Recomendado 1000. |
| thinking_soundboolean(body) | |
| speak_after_executionboolean(body) | Si el agente habla después de ejecutarla. Con false el turno cierra, salvo que falle. |
| mock_responsestring(body) | Respuesta de prueba para el panel. En una llamada real se llama a tu URL. |
| response_capturesarray<object>(body) | Campos de tu respuesta que se guardan como variables para usarlos después. |
| timeout_msnumber(body) | Tiempo máximo de espera a tu sistema, en milisegundos. |
Petición
curl -X POST https://leracore.com/api/v1/tools/update_agent_function \
-H "Authorization: Bearer lr_sk_..." \
-H "Content-Type: application/json" \
-d '{
"agent_id": "cmk1a2b3c...",
"name": "texto de ejemplo",
"description": "texto de ejemplo",
"url": "https://tu-sistema.example.com/consultar"
}'Respuestas
| Código | Descripción |
|---|---|
| 200 | {
"result": {
"ok": true,
"agentId": "cmk1a2b3c...",
"functionName": "consultar_pedido",
"functions": [
"consultar_pedido"
]
}
}application/json; charset=utf-8 |
| 400 | Petición inválida |
| 403 | Prohibido |
ELIMINAPOST /api/v1/tools/remove_agent_functionElimina una función del agente y la quita de cualquier fase del flujo que la usara.
Parámetros
| Nombre | Descripción |
|---|---|
| agent_id* obligatoriostring(body) | Id del agente. Lo devuelve list_agents. |
| name* obligatoriostring(body) | Nombre de la función a eliminar. |
Petición
curl -X POST https://leracore.com/api/v1/tools/remove_agent_function \
-H "Authorization: Bearer lr_sk_..." \
-H "Content-Type: application/json" \
-d '{
"agent_id": "cmk1a2b3c...",
"name": "texto de ejemplo"
}'Respuestas
| Código | Descripción |
|---|---|
| 200 | {
"result": {
"ok": true,
"agentId": "cmk1a2b3c...",
"functionName": "consultar_pedido",
"functions": []
}
}application/json; charset=utf-8 |
| 400 | Petición inválida |
| 403 | Prohibido |
ELIMINAPOST /api/v1/tools/remove_calendar_functionsDesconecta el calendario de un agente. Acuérdate de publicar después.
Parámetros
| Nombre | Descripción |
|---|---|
| agent_id* obligatoriostring(body) | Id del agente. Lo devuelve list_agents. |
Petición
curl -X POST https://leracore.com/api/v1/tools/remove_calendar_functions \
-H "Authorization: Bearer lr_sk_..." \
-H "Content-Type: application/json" \
-d '{
"agent_id": "cmk1a2b3c..."
}'Respuestas
| Código | Descripción |
|---|---|
| 200 | {
"result": {
"ok": true,
"agentId": "cmk1a2b3c...",
"functions": [
"consultar_pedido"
]
}
}application/json; charset=utf-8 |
| 400 | Petición inválida |
| 403 | Prohibido |
Base de conocimientoOperaciones disponibles en BASE DE CONOCIMIENTO:CONSULTA /api/v1/tools/discover_siteCONSULTA /api/v1/tools/list_knowledgeCONSULTA /api/v1/tools/list_knowledge_basesCONSULTA /api/v1/tools/test_knowledge_searchCREA /api/v1/tools/add_knowledgeCREA /api/v1/tools/add_knowledge_sourceCREA /api/v1/tools/analyze_websiteCREA /api/v1/tools/create_knowledge_baseACTUALIZA /api/v1/tools/update_knowledgeELIMINA /api/v1/tools/remove_knowledgeELIMINA /api/v1/tools/remove_knowledge_source
CONSULTAPOST /api/v1/tools/discover_siteDescubre las páginas de un sitio por su sitemap para decidir cuáles añadir. Solo lee: no crea nada.
Parámetros
| Nombre | Descripción |
|---|---|
| url* obligatoriostring(body) | URL de tu sistema. Tiene que ser https y accesible desde fuera. |
Petición
curl -X POST https://leracore.com/api/v1/tools/discover_site \
-H "Authorization: Bearer lr_sk_..." \
-H "Content-Type: application/json" \
-d '{
"url": "https://tu-sistema.example.com/consultar"
}'Respuestas
| Código | Descripción |
|---|---|
| 200 | {
"result": {
"pages": [
{
"url": "https://example.com/precios",
"title": "Precios"
}
]
}
}application/json; charset=utf-8 |
| 400 | Petición inválida |
| 403 | Prohibido |
CONSULTAPOST /api/v1/tools/list_knowledgeDevuelve las fichas de conocimiento del proyecto (título y respuesta). Un agente solo las usa en los nodos de flujo que las referencian; lo que consulta en la conversación son sus bases de conocimiento (list_knowledge_bases).
Parámetros
Sin parámetros. Envía un objeto vacío.
Petición
curl -X POST https://leracore.com/api/v1/tools/list_knowledge \
-H "Authorization: Bearer lr_sk_..." \
-H "Content-Type: application/json" \
-d '{}'Respuestas
| Código | Descripción |
|---|---|
| 200 | {
"result": [
{
"id": "cmk...",
"title": "Horario",
"scope": "workspace",
"status": "published",
"keywords": [
"horario"
],
"answer": "De 9 a 18 de lunes a viernes."
}
]
}application/json; charset=utf-8 |
| 400 | Petición inválida |
| 403 | Prohibido |
CONSULTAPOST /api/v1/tools/list_knowledge_basesDevuelve las bases de conocimiento del proyecto con su estado y sus documentos.
Parámetros
Sin parámetros. Envía un objeto vacío.
Petición
curl -X POST https://leracore.com/api/v1/tools/list_knowledge_bases \
-H "Authorization: Bearer lr_sk_..." \
-H "Content-Type: application/json" \
-d '{}'Respuestas
| Código | Descripción |
|---|---|
| 200 | {
"result": [
{
"id": "cmk...",
"name": "Web de la clínica",
"status": "ready",
"documentos": [
{
"id": "cmk...",
"kind": "url",
"title": "Precios",
"status": "ready",
"url": "https://example.com/precios"
}
]
}
]
}application/json; charset=utf-8 |
| 400 | Petición inválida |
| 403 | Prohibido |
CONSULTAPOST /api/v1/tools/test_knowledge_searchPrueba una pregunta contra la base de conocimiento como la buscaría el agente: con qué se busca, qué fragmentos salen con su parecido y cuáles le llegarían al agente o se quedan fuera y por qué. No cambia nada.
Parámetros
| Nombre | Descripción |
|---|---|
| question* obligatoriostring(body) | La pregunta, escrita como la diría la persona. |
| agent_idstring(body) | El agente cuyas bases y ajustes se usan (los de su borrador). |
| node_idstring(body) | Solo agentes de flujo: el nodo cuyas bases se suman a las del agente. |
| knowledge_base_idsarray<string>(body) | Sin agent_id: las bases que se prueban, con los ajustes de fábrica. |
Petición
curl -X POST https://leracore.com/api/v1/tools/test_knowledge_search \
-H "Authorization: Bearer lr_sk_..." \
-H "Content-Type: application/json" \
-d '{
"question": "texto de ejemplo"
}'Respuestas
| Código | Descripción |
|---|---|
| 200 | {
"result": {
"pregunta": "¿Qué horario tenéis el sábado?",
"consulta": "¿Qué horario tenéis el sábado?",
"condensada": false,
"canal": "voz",
"topK": 3,
"minScore": 0.28,
"bases": 1,
"fragmentos": [
{
"documento": "Horario del sábado",
"fuenteId": "cmk...",
"baseId": "cmk...",
"puntuacion": 0.61,
"entra": true,
"texto": "La piscina abre los sábados de 9:00 a 14:00."
},
{
"documento": "Precios",
"fuenteId": "cmk...",
"baseId": "cmk...",
"puntuacion": 0.19,
"entra": false,
"fuera": "parecido_bajo",
"texto": "La entrada cuesta 5 euros."
}
]
}
}application/json; charset=utf-8 |
| 400 | Petición inválida |
| 403 | Prohibido |
CREAPOST /api/v1/tools/add_knowledgeAñade una ficha de conocimiento (título y respuesta). Solo la leen los nodos de flujo que la referencian: para que un agente sepa algo, añade un documento a su base con add_knowledge_source.
Parámetros
| Nombre | Descripción |
|---|---|
| title* obligatoriostring(body) | Título con el que se identifica, y por el que se busca. |
| answer* obligatoriostring(body) | La información que el agente da al responder. |
| keywordsarray<string>(body) | Palabras por las que se encuentra esta entrada. |
Petición
curl -X POST https://leracore.com/api/v1/tools/add_knowledge \
-H "Authorization: Bearer lr_sk_..." \
-H "Content-Type: application/json" \
-d '{
"title": "texto de ejemplo",
"answer": "texto de ejemplo",
"keywords": []
}'Respuestas
| Código | Descripción |
|---|---|
| 200 | {
"result": {
"ok": true,
"entryId": "cmk...",
"title": "Horario",
"action": "add"
}
}application/json; charset=utf-8 |
| 400 | Petición inválida |
| 403 | Prohibido |
CREAPOST /api/v1/tools/add_knowledge_sourceAñade un documento a una base: texto o una página web, que se relee sola cada 12 horas.
Parámetros
| Nombre | Descripción |
|---|---|
| knowledge_base_id* obligatoriostring(body) | Id de la base de conocimiento. Lo devuelve list_knowledge_bases. |
| kind* obligatoriostring(body) | Si el documento es texto pegado o una página web.Valores: text · url |
| titlestring(body) | Título con el que se identifica, y por el que se busca. |
| textstring(body) | El contenido pegado, cuando el documento es texto. |
| urlstring(body) | URL de tu sistema. Tiene que ser https y accesible desde fuera. |
Petición
curl -X POST https://leracore.com/api/v1/tools/add_knowledge_source \
-H "Authorization: Bearer lr_sk_..." \
-H "Content-Type: application/json" \
-d '{
"knowledge_base_id": "cmk1a2b3c...",
"kind": "text",
"title": "texto de ejemplo",
"text": "texto de ejemplo"
}'Respuestas
| Código | Descripción |
|---|---|
| 200 | {
"result": {
"id": "cmk...",
"kind": "text",
"title": "Precios",
"status": "processing"
}
}application/json; charset=utf-8 |
| 400 | Petición inválida |
| 403 | Prohibido |
CREAPOST /api/v1/tools/analyze_websiteLee la web del negocio y extrae nombre, actividad, servicios, preguntas frecuentes, tono y un saludo sugerido.
Parámetros
| Nombre | Descripción |
|---|---|
| url* obligatoriostring(body) | URL de tu sistema. Tiene que ser https y accesible desde fuera. |
Petición
curl -X POST https://leracore.com/api/v1/tools/analyze_website \
-H "Authorization: Bearer lr_sk_..." \
-H "Content-Type: application/json" \
-d '{
"url": "https://tu-sistema.example.com/consultar"
}'Respuestas
| Código | Descripción |
|---|---|
| 200 | {
"result": {
"ok": true,
"url": "https://example.com",
"businessName": "Empresa Ejemplo",
"summary": "Servicio de ejemplo para la documentación",
"services": [
"Limpieza",
"Ortodoncia"
],
"faqs": [
{
"q": "¿Tenéis parking?",
"a": "Sí, gratuito."
}
]
}
}application/json; charset=utf-8 |
| 400 | Petición inválida |
| 403 | Prohibido |
CREAPOST /api/v1/tools/create_knowledge_baseCrea una base de conocimiento vacía. Después se le añaden documentos y se asigna a un agente.
Parámetros
| Nombre | Descripción |
|---|---|
| name* obligatoriostring(body) | Nombre de la base de conocimiento. |
Petición
curl -X POST https://leracore.com/api/v1/tools/create_knowledge_base \
-H "Authorization: Bearer lr_sk_..." \
-H "Content-Type: application/json" \
-d '{
"name": "texto de ejemplo"
}'Respuestas
| Código | Descripción |
|---|---|
| 200 | {
"result": {
"id": "cmk...",
"name": "Web de la clínica",
"status": "empty"
}
}application/json; charset=utf-8 |
| 400 | Petición inválida |
| 403 | Prohibido |
ACTUALIZAPOST /api/v1/tools/update_knowledgeEdita una entrada de conocimiento por su id. Cambia solo los campos que pasas.
Parámetros
| Nombre | Descripción |
|---|---|
| id* obligatoriostring(body) | Id de la entrada de conocimiento. Lo devuelve list_knowledge. |
| titlestring(body) | Título con el que se identifica, y por el que se busca. |
| answerstring(body) | La información que el agente da al responder. |
| keywordsarray<string>(body) | Palabras por las que se encuentra esta entrada. |
| statusstring(body) | Si la entrada está publicada o guardada como borrador.Valores: draft · published |
Petición
curl -X POST https://leracore.com/api/v1/tools/update_knowledge \
-H "Authorization: Bearer lr_sk_..." \
-H "Content-Type: application/json" \
-d '{
"id": "cmk1a2b3c...",
"title": "texto de ejemplo",
"answer": "texto de ejemplo"
}'Respuestas
| Código | Descripción |
|---|---|
| 200 | {
"result": {
"ok": true,
"entryId": "cmk...",
"title": "Horario",
"action": "update"
}
}application/json; charset=utf-8 |
| 400 | Petición inválida |
| 403 | Prohibido |
ELIMINAPOST /api/v1/tools/remove_knowledgeElimina una ficha de conocimiento por su id. Para quitar un documento de una base de conocimiento, remove_knowledge_source.
Parámetros
| Nombre | Descripción |
|---|---|
| id* obligatoriostring(body) | Id de la entrada de conocimiento. Lo devuelve list_knowledge. |
Petición
curl -X POST https://leracore.com/api/v1/tools/remove_knowledge \
-H "Authorization: Bearer lr_sk_..." \
-H "Content-Type: application/json" \
-d '{
"id": "cmk1a2b3c..."
}'Respuestas
| Código | Descripción |
|---|---|
| 200 | {
"result": {
"ok": true,
"entryId": "cmk...",
"action": "remove"
}
}application/json; charset=utf-8 |
| 400 | Petición inválida |
| 403 | Prohibido |
ELIMINAPOST /api/v1/tools/remove_knowledge_sourceQuita un documento de una base y borra sus fragmentos, así que el agente deja de poder responder con él.
Parámetros
| Nombre | Descripción |
|---|---|
| knowledge_base_id* obligatoriostring(body) | Id de la base de conocimiento. Lo devuelve list_knowledge_bases. |
| source_id* obligatoriostring(body) | Id del documento dentro de la base. Lo devuelve list_knowledge_bases. |
Petición
curl -X POST https://leracore.com/api/v1/tools/remove_knowledge_source \
-H "Authorization: Bearer lr_sk_..." \
-H "Content-Type: application/json" \
-d '{
"knowledge_base_id": "cmk1a2b3c...",
"source_id": "cmk1a2b3c..."
}'Respuestas
| Código | Descripción |
|---|---|
| 200 | {
"result": {
"ok": true,
"id": "cmk..."
}
}application/json; charset=utf-8 |
| 400 | Petición inválida |
| 403 | Prohibido |
Variables y webhook de pre-llamadaOperaciones disponibles en VARIABLES Y WEBHOOK DE PRE-LLAMADA:CONSULTA /api/v1/tools/get_pre_call_webhookCREA /api/v1/tools/add_call_variableCREA /api/v1/tools/test_pre_call_webhookACTUALIZA /api/v1/tools/set_pre_call_webhookACTUALIZA /api/v1/tools/update_call_variableELIMINA /api/v1/tools/remove_call_variableELIMINA /api/v1/tools/remove_pre_call_webhook
CONSULTAPOST /api/v1/tools/get_pre_call_webhookDevuelve la configuración del webhook de pre-llamada. De las cabeceras solo devuelve los nombres.
Parámetros
| Nombre | Descripción |
|---|---|
| agent_id* obligatoriostring(body) | Id del agente. Lo devuelve list_agents. |
Petición
curl -X POST https://leracore.com/api/v1/tools/get_pre_call_webhook \
-H "Authorization: Bearer lr_sk_..." \
-H "Content-Type: application/json" \
-d '{
"agent_id": "cmk1a2b3c..."
}'Respuestas
| Código | Descripción |
|---|---|
| 200 | {
"result": {
"agentId": "cmk1a2b3c...",
"configurado": true,
"url": "https://tu-sistema.example.com/quien-llama",
"presupuesto_ms": 2500,
"canales": [
"phone_inbound"
],
"se_le_permite_devolver": [
"variables"
],
"si_falla": "se atiende igual con el agente por defecto"
}
}application/json; charset=utf-8 |
| 400 | Petición inválida |
| 403 | Prohibido |
CREAPOST /api/v1/tools/add_call_variableAñade una variable de llamada, usable como {{nombre}} en el saludo, las instrucciones y las funciones.
Parámetros
| Nombre | Descripción |
|---|---|
| agent_id* obligatoriostring(body) | Id del agente. Lo devuelve list_agents. |
| name* obligatoriostring(body) | Nombre de la variable. Se usa como {{nombre}} en el prompt y las funciones. |
| descriptionstring(body) | Qué contiene la variable, para que el agente sepa usarla. |
| default_valuestring(body) | Valor que toma la variable si la llamada no trae otro. |
Petición
curl -X POST https://leracore.com/api/v1/tools/add_call_variable \
-H "Authorization: Bearer lr_sk_..." \
-H "Content-Type: application/json" \
-d '{
"agent_id": "cmk1a2b3c...",
"name": "texto de ejemplo",
"description": "texto de ejemplo",
"default_value": "texto de ejemplo"
}'Respuestas
| Código | Descripción |
|---|---|
| 200 | {
"result": {
"ok": true,
"agentId": "cmk1a2b3c...",
"variableName": "nombre_cliente",
"functions": [
"consultar_pedido"
]
}
}application/json; charset=utf-8 |
| 400 | Petición inválida |
| 403 | Prohibido |
CREAPOST /api/v1/tools/test_pre_call_webhookDispara el webhook con un número de ejemplo y enseña lo que contesta tu sistema, sin llamar por teléfono.
Parámetros
| Nombre | Descripción |
|---|---|
| agent_id* obligatoriostring(body) | Id del agente. Lo devuelve list_agents. |
| from_numberstring(body) | Número de ejemplo con el que se dispara la prueba. |
Petición
curl -X POST https://leracore.com/api/v1/tools/test_pre_call_webhook \
-H "Authorization: Bearer lr_sk_..." \
-H "Content-Type: application/json" \
-d '{
"agent_id": "cmk1a2b3c...",
"from_number": "+34600111222"
}'Respuestas
| Código | Descripción |
|---|---|
| 200 | {
"result": {
"ok": true,
"respondio": true,
"ms": 412,
"intentos": 1,
"variables_que_devuelve": [
"nombre_cliente",
"ultimo_pedido"
],
"problemas": []
}
}application/json; charset=utf-8 |
| 400 | Petición inválida |
| 403 | Prohibido |
ACTUALIZAPOST /api/v1/tools/set_pre_call_webhookConfigura la URL a la que Lera pregunta quién llama antes de descolgar, para que el saludo ya sepa el nombre.
Parámetros
| Nombre | Descripción |
|---|---|
| agent_id* obligatoriostring(body) | Id del agente. Lo devuelve list_agents. |
| url* obligatoriostring(body) | URL de tu sistema. Tiene que ser https y accesible desde fuera. |
| budget_msnumber(body) | Tope TOTAL de espera. Es silencio en la línea: no lo subas sin motivo. |
| channelsarray<string>(body) | En qué puertas se pregunta: teléfono entrante, widget web o salientes. |
| allowarray<string>(body) | Qué se le permite devolver a tu sistema. Por defecto, solo variables. |
| on_failurestring(body) | Qué pasa si tu endpoint no contesta: atender igual o no atender.Valores: continue · reject |
Petición
curl -X POST https://leracore.com/api/v1/tools/set_pre_call_webhook \
-H "Authorization: Bearer lr_sk_..." \
-H "Content-Type: application/json" \
-d '{
"agent_id": "cmk1a2b3c...",
"url": "https://tu-sistema.example.com/consultar",
"budget_ms": 1000,
"channels": []
}'Respuestas
| Código | Descripción |
|---|---|
| 200 | {
"result": {
"ok": true,
"agentId": "cmk1a2b3c...",
"host": "tu-sistema.example.com",
"functions": [
"consultar_pedido"
],
"siguiente_paso": "Pruébalo con test_pre_call_webhook antes de publicar.",
"reminder": "Borrador actualizado: publica el agente para que el cambio entre en producción."
}
}application/json; charset=utf-8 |
| 400 | Petición inválida |
| 403 | Prohibido |
ACTUALIZAPOST /api/v1/tools/update_call_variableEdita una variable de llamada por su nombre. Solo cambia lo que pasas.
Parámetros
| Nombre | Descripción |
|---|---|
| agent_id* obligatoriostring(body) | Id del agente. Lo devuelve list_agents. |
| name* obligatoriostring(body) | Nombre de la variable a editar. |
| descriptionstring(body) | Qué contiene la variable. |
| default_valuestring(body) | Valor que toma la variable si la llamada no trae otro. |
Petición
curl -X POST https://leracore.com/api/v1/tools/update_call_variable \
-H "Authorization: Bearer lr_sk_..." \
-H "Content-Type: application/json" \
-d '{
"agent_id": "cmk1a2b3c...",
"name": "texto de ejemplo",
"description": "texto de ejemplo",
"default_value": "texto de ejemplo"
}'Respuestas
| Código | Descripción |
|---|---|
| 200 | {
"result": {
"ok": true,
"agentId": "cmk1a2b3c...",
"variableName": "nombre_cliente",
"functions": [
"consultar_pedido"
]
}
}application/json; charset=utf-8 |
| 400 | Petición inválida |
| 403 | Prohibido |
ELIMINAPOST /api/v1/tools/remove_call_variableElimina una variable de llamada de un agente.
Parámetros
| Nombre | Descripción |
|---|---|
| agent_id* obligatoriostring(body) | Id del agente. Lo devuelve list_agents. |
| name* obligatoriostring(body) | Nombre de la variable a eliminar. |
Petición
curl -X POST https://leracore.com/api/v1/tools/remove_call_variable \
-H "Authorization: Bearer lr_sk_..." \
-H "Content-Type: application/json" \
-d '{
"agent_id": "cmk1a2b3c...",
"name": "texto de ejemplo"
}'Respuestas
| Código | Descripción |
|---|---|
| 200 | {
"result": {
"ok": true,
"agentId": "cmk1a2b3c...",
"variableName": "nombre_cliente",
"functions": [
"consultar_pedido"
]
}
}application/json; charset=utf-8 |
| 400 | Petición inválida |
| 403 | Prohibido |
ELIMINAPOST /api/v1/tools/remove_pre_call_webhookQuita el webhook de pre-llamada. El agente deja de saber quién llama antes de descolgar.
Parámetros
| Nombre | Descripción |
|---|---|
| agent_id* obligatoriostring(body) | Id del agente. Lo devuelve list_agents. |
Petición
curl -X POST https://leracore.com/api/v1/tools/remove_pre_call_webhook \
-H "Authorization: Bearer lr_sk_..." \
-H "Content-Type: application/json" \
-d '{
"agent_id": "cmk1a2b3c..."
}'Respuestas
| Código | Descripción |
|---|---|
| 200 | {
"result": {
"ok": true,
"agentId": "cmk1a2b3c...",
"functions": [
"consultar_pedido"
],
"reminder": "Borrador actualizado: publica el agente para que el cambio entre en producción."
}
}application/json; charset=utf-8 |
| 400 | Petición inválida |
| 403 | Prohibido |
Lista de exclusiónOperaciones disponibles en LISTA DE EXCLUSIÓN:CONSULTA /api/v1/tools/list_optout_numbersCREA /api/v1/tools/add_optout_numberELIMINA /api/v1/tools/remove_optout_number
CONSULTAPOST /api/v1/tools/list_optout_numbersDevuelve los números excluidos de llamadas salientes.
Parámetros
Sin parámetros. Envía un objeto vacío.
Petición
curl -X POST https://leracore.com/api/v1/tools/list_optout_numbers \
-H "Authorization: Bearer lr_sk_..." \
-H "Content-Type: application/json" \
-d '{}'Respuestas
| Código | Descripción |
|---|---|
| 200 | {
"result": {
"numbers": [{
"e164": "+34600111222",
"reason": "pidió no recibir más llamadas",
"createdAt": "2026-08-14T09:12:00.000Z"
}]
}
}application/json; charset=utf-8 |
| 400 | Petición inválida |
| 403 | Prohibido |
CREAPOST /api/v1/tools/add_optout_numberExcluye un número de las llamadas salientes: el agente no volverá a llamarle nunca.
Parámetros
| Nombre | Descripción |
|---|---|
| e164* obligatoriostring(body) | Número en formato E.164, con prefijo de país (+34600111222). |
| reasonstring(body) | Por qué se excluye el número. Queda registrado. |
Petición
curl -X POST https://leracore.com/api/v1/tools/add_optout_number \
-H "Authorization: Bearer lr_sk_..." \
-H "Content-Type: application/json" \
-d '{
"e164": "+34600111222",
"reason": "texto de ejemplo"
}'Respuestas
| Código | Descripción |
|---|---|
| 200 | {
"result": {
"ok": true,
"e164": "+34600111222"
}
}application/json; charset=utf-8 |
| 400 | Petición inválida |
| 403 | Prohibido |
ELIMINAPOST /api/v1/tools/remove_optout_numberQuita un número de la lista de exclusión, de forma que vuelve a ser llamable.
Parámetros
| Nombre | Descripción |
|---|---|
| e164* obligatoriostring(body) | Número en formato E.164, con prefijo de país (+34600111222). |
Petición
curl -X POST https://leracore.com/api/v1/tools/remove_optout_number \
-H "Authorization: Bearer lr_sk_..." \
-H "Content-Type: application/json" \
-d '{
"e164": "+34600111222"
}'Respuestas
| Código | Descripción |
|---|---|
| 200 | {
"result": {
"ok": true,
"e164": "+34600111222"
}
}application/json; charset=utf-8 |
| 400 | Petición inválida |
| 403 | Prohibido |
Cuenta y canal webOperaciones disponibles en CUENTA Y CANAL WEB:CONSULTA /api/v1/tools/get_billing_summaryCONSULTA /api/v1/tools/get_web_embed_codeCONSULTA /api/v1/tools/list_integrationsCONSULTA /api/v1/tools/list_widget_keysACTUALIZA /api/v1/tools/set_post_call_webhook
CONSULTAPOST /api/v1/tools/get_billing_summaryDevuelve el consumo del mes, el saldo y los límites del workspace. En un proyecto hijo, el saldo llega vacío.
Parámetros
Sin parámetros. Envía un objeto vacío.
Petición
curl -X POST https://leracore.com/api/v1/tools/get_billing_summary \
-H "Authorization: Bearer lr_sk_..." \
-H "Content-Type: application/json" \
-d '{}'Respuestas
| Código | Descripción |
|---|---|
| 200 | {
"result": {
"isBillingChild": false,
"balanceCents": 4210,
"monthMinutes": 312.5,
"monthCostCents": 3980
}
}application/json; charset=utf-8 |
| 400 | Petición inválida |
| 403 | Prohibido |
CONSULTAPOST /api/v1/tools/get_web_embed_codeDevuelve el código (<script>) para poner un agente en tu web: el de voz o el de chat, según el agente. Lleva un hueco donde va tu clave pública, que copias de la pestaña Public Keys (en Ajustes, apartado API Keys).
Parámetros
| Nombre | Descripción |
|---|---|
| agent_id* obligatoriostring(body) | Id del agente. Lo devuelve list_agents. |
Petición
curl -X POST https://leracore.com/api/v1/tools/get_web_embed_code \
-H "Authorization: Bearer lr_sk_..." \
-H "Content-Type: application/json" \
-d '{
"agent_id": "cmk1a2b3c..."
}'Respuestas
| Código | Descripción |
|---|---|
| 200 | {
"result": {
"agent": { "id": "cmk...", "name": "Chat recepción", "kind": "chat", "published": true },
"snippet": "<script src=\"https://leracore.com/widget/lera-chat.v1.js\" type=\"module\" data-public-key=\"TU_CLAVE_PUBLICA\" data-agent-id=\"cmk...\"></script>",
"where_is_the_key": "Ajustes -> API Keys -> pestaña Public Keys",
"keys": [{ "name": "Web pública", "prefix": "lr_pk_a1b2c3d4", "allowedOrigins": ["https://example.com"] }]
}
}application/json; charset=utf-8 |
| 400 | Petición inválida |
| 403 | Prohibido |
CONSULTAPOST /api/v1/tools/list_integrationsDevuelve las integraciones del proyecto y su estado. Hoy existe el webhook posterior a la llamada.
Parámetros
Sin parámetros. Envía un objeto vacío.
Petición
curl -X POST https://leracore.com/api/v1/tools/list_integrations \
-H "Authorization: Bearer lr_sk_..." \
-H "Content-Type: application/json" \
-d '{}'Respuestas
| Código | Descripción |
|---|---|
| 200 | {
"result": [
{
"id": "cmk...",
"type": "post_call_webhook",
"status": "connected",
"displayName": "Webhook de mi ERP"
}
]
}application/json; charset=utf-8 |
| 400 | Petición inválida |
| 403 | Prohibido |
CONSULTAPOST /api/v1/tools/list_widget_keysDevuelve las claves del canal web con sus webs autorizadas y su último uso. Útil para diagnosticar el widget.
Parámetros
Sin parámetros. Envía un objeto vacío.
Petición
curl -X POST https://leracore.com/api/v1/tools/list_widget_keys \
-H "Authorization: Bearer lr_sk_..." \
-H "Content-Type: application/json" \
-d '{}'Respuestas
| Código | Descripción |
|---|---|
| 200 | {
"result": [
{
"id": "cmk...",
"name": "Web pública",
"prefix": "lr_pk_a1b2c3d4",
"allowedOrigins": [
"https://example.com"
],
"requireCaptcha": false,
"lastUsedAt": "2026-09-05T18:22:00.000Z"
}
]
}application/json; charset=utf-8 |
| 400 | Petición inválida |
| 403 | Prohibido |
ACTUALIZAPOST /api/v1/tools/set_post_call_webhookDefine la URL a la que Lera envía cada llamada al cerrarse, con su resumen, su transcripción y los datos extraídos.
Parámetros
| Nombre | Descripción |
|---|---|
| url* obligatoriostring(body) | URL de tu sistema. Tiene que ser https y accesible desde fuera. |
| enabledboolean(body) | Activar o desactivar el envío sin perder la URL. Por defecto true. |
Petición
curl -X POST https://leracore.com/api/v1/tools/set_post_call_webhook \
-H "Authorization: Bearer lr_sk_..." \
-H "Content-Type: application/json" \
-d '{
"url": "https://tu-sistema.example.com/consultar",
"enabled": true
}'Respuestas
| Código | Descripción |
|---|---|
| 200 | {
"result": {
"ok": true,
"id": "cmk...",
"type": "webhook",
"status": "enabled",
"url": "https://tu-sistema.example.com/llamadas"
}
}application/json; charset=utf-8 |
| 400 | Petición inválida |
| 403 | Prohibido |
Cuentas partnerOperaciones disponibles en CUENTAS PARTNER:CONSULTA /api/v1/partner/clientsCREA /api/v1/partner/clientsCONSULTA /api/v1/partner/clients/{workspace_id}ACTUALIZA /api/v1/partner/clients/{workspace_id}CONSULTA /api/v1/partner/clients/{workspace_id}/minute-packsCREA /api/v1/partner/clients/{workspace_id}/minute-packsCONSULTA /api/v1/partner/clients/{workspace_id}/message-packsCREA /api/v1/partner/clients/{workspace_id}/message-packsCREA /api/v1/partner/clients/{workspace_id}/linesELIMINA /api/v1/partner/clients/{workspace_id}/lines/{e164}CREA /api/v1/partner/clients/{workspace_id}/sessions
CONSULTAGET /api/v1/partner/clientsCada cliente de la cuenta partner con sus minutos y su coste del periodo pedido, o del mes en curso si no pides ninguno, para repercutírselo en su factura. El saldo es único de la cuenta; lo que se desglosa por cliente es el consumo. La clave tiene que estar emitida desde la cuenta raíz: una creada dentro de un cliente responde 403 not_a_partner_root. En el panel, lo mismo está en Ajustes → Clientes.
Parámetros
| Nombre | Descripción |
|---|---|
| fromstring(query) | Inicio del periodo, en ISO 8601. Sin él, el mes en curso. Para facturar un mes cerrado, pásalo. |
| tostring(query) | Fin del periodo, en ISO 8601 y exclusivo. Sin él, ahora mismo. |
Petición
curl "https://leracore.com/api/v1/partner/clients?from=...&to=..." \ -H "Authorization: Bearer lr_sk_..."
Respuestas
| Código | Descripción |
|---|---|
| 200 | {
"partner": { "workspace_id": "cmk...", "name": "Integrador" },
"period": { "from": "2026-09-01T00:00:00.000Z", "to": "2026-09-07T12:00:00.000Z" },
"clients": [{
"workspace_id": "cmk...",
"name": "Empresa Ejemplo",
"slug": "empresa-ejemplo",
"status": "ACTIVE",
"external_id": "erp-4821",
"phone_number": "+34600333444",
"minutes": 128.4,
"cost_cents": 1794,
"white_label": true,
"client_access": "view",
"max_concurrent_calls": 3,
"monthly_cost_limit_cents": 5000,
"monthly_minute_limit": null,
"monthly_message_limit": null,
"monthly_limit_action": "notify"
}]
}application/json; charset=utf-8 |
| 400 | Petición inválida |
| 403 | Prohibido |
CREAPOST /api/v1/partner/clientsDa de alta un cliente en tu cuenta partner desde tu propio sistema, sin pasar por el panel. Mandando external_id la llamada es idempotente, así que puedes reintentar sin crear duplicados: si ese id ya existe, responde 200 con created=false y el cliente que hay. El cliente nace colgando de tu cuenta, comparte tu saldo y aparece en tu consola con su consumo desglosado. La clave tiene que ser de gestión y estar emitida desde la cuenta raíz.
Parámetros
| Nombre | Descripción |
|---|---|
| name* obligatoriostring(body) | Nombre del cliente, tal y como lo verás en tu consola. |
| external_idstring(body) | El id que ese cliente tiene en TU sistema. Si lo mandas, el alta es idempotente: repetir la llamada devuelve el cliente que ya existe en vez de crear otro. |
| contact_emailstring(body) | Correo de contacto del cliente (de la empresa cliente, no el tuyo). |
| contact_first_namestring(body) | Nombre de la persona de contacto del cliente. |
| contact_last_namestring(body) | Apellidos de la persona de contacto del cliente. |
| included_minutesinteger(body) | Su mensualidad en MINUTOS, para la voz. Se renuevan solos cada mes el día de inicio del servicio. Al ponerla, «Al agotarse» pasa a block (Corta). |
| included_messagesinteger(body) | Su mensualidad en MENSAJES, para el chat: un mensaje es una respuesta del agente. Va aparte de los minutos, con el mismo día de inicio. Al ponerla, «Al agotarse» pasa a block (Corta). |
| cycle_startstring(body) | Día de inicio del servicio (ISO 8601). Por defecto, hoy. |
Petición
curl -X POST https://leracore.com/api/v1/partner/clients \
-H "Authorization: Bearer lr_sk_..." \
-H "Content-Type: application/json" \
-d '{}'Respuestas
| Código | Descripción |
|---|---|
| 200 | {
"created": true,
"client": {
"workspace_id": "cmk...",
"name": "Colegio de Medicos",
"slug": "colegio-de-medicos",
"status": "ACTIVE",
"external_id": "erp-4821",
"contact_email": "secretaria@colegio.example",
"contact_first_name": "Ana",
"contact_last_name": "Pérez",
"phone_number": null,
"minutes": 0,
"cost_cents": 0,
"white_label": true,
"client_access": "view",
"max_concurrent_calls": null,
"monthly_cost_limit_cents": null,
"monthly_minute_limit": null,
"monthly_message_limit": null,
"monthly_limit_action": "notify"
}
}application/json; charset=utf-8 |
| 400 | Petición inválida |
| 403 | Prohibido |
CONSULTAGET /api/v1/partner/clients/{workspace_id}Un cliente concreto con todo lo que tiene puesto (sus topes, qué hace al agotarse, su mensualidad y sus bolsas de minutos y de mensajes, marca blanca, identificador y correo) y su actividad además de su gasto: llamadas totales, de los últimos 7 días y la última. Es lo que dice si un piloto está vivo, que no se ve en el coste. Un workspace que no cuelga de tu raíz responde 404.
Parámetros
| Nombre | Descripción |
|---|---|
| fromstring(query) | Inicio del periodo, en ISO 8601. Sin él, el mes en curso. |
| tostring(query) | Fin del periodo, en ISO 8601 y exclusivo. Sin él, ahora mismo. |
Petición
curl "https://leracore.com/api/v1/partner/clients/{workspace_id}?from=...&to=..." \
-H "Authorization: Bearer lr_sk_..."Respuestas
| Código | Descripción |
|---|---|
| 200 | {
"workspace_id": "cmk...",
"name": "Empresa Ejemplo",
"slug": "empresa-ejemplo",
"status": "ACTIVE",
"external_id": "erp-4821",
"contact_email": "secretaria@empresa.example",
"phone_number": "+34600333444",
"minutes": 128.4,
"cost_cents": 1794,
"white_label": true,
"client_access": "view",
"max_concurrent_calls": null,
"monthly_cost_limit_cents": 5000,
"monthly_minute_limit": 500,
"monthly_message_limit": 1000,
"monthly_limit_action": "block",
"paused": false,
"minutes_plan": {
"included_minutes": 500,
"cycle_start": "2026-09-15T00:00:00.000Z",
"cycle": { "from": "2026-09-15T00:00:00.000Z", "to": "2026-10-15T00:00:00.000Z" },
"used_this_cycle": 312.5,
"plan_left": 187.5,
"pack_left": 200,
"overage": 0,
"remaining": 387.5,
"percent_used": 44.6,
"exhausted": false,
"on_exhausted": "block"
},
"messages_plan": {
"included_messages": 1000,
"cycle_start": "2026-09-15T00:00:00.000Z",
"cycle": { "from": "2026-09-15T00:00:00.000Z", "to": "2026-10-15T00:00:00.000Z" },
"used_this_cycle": 418,
"plan_left": 582,
"pack_left": 0,
"overage": 0,
"remaining": 582,
"percent_used": 41.8,
"exhausted": false,
"on_exhausted": "block"
},
"period": { "from": "2026-09-01T00:00:00.000Z", "to": "2026-09-07T12:00:00.000Z" },
"calls_total": 214,
"calls_last_7_days": 31,
"last_call_at": "2026-09-07T11:42:00.000Z"
}application/json; charset=utf-8 |
| 400 | Petición inválida |
| 403 | Prohibido |
ACTUALIZAPATCH /api/v1/partner/clients/{workspace_id}Cambia lo que tiene puesto un cliente: su mensualidad en minutos y en mensajes, su tope de gasto en euros, qué hace al agotarse (Corta o Sigue y avisa), la pausa, la marca blanca, sus líneas y sus datos. Solo cambia lo que mandas. Devuelve el cliente como GET.
Parámetros
| Nombre | Descripción |
|---|---|
| included_minutesinteger | null(body) | Su mensualidad en MINUTOS por ciclo, para la voz. null la quita. |
| included_messagesinteger | null(body) | Su mensualidad en MENSAJES por ciclo, para el chat. null la quita: sin mensajes al mes ni bolsa de mensajes, su chat no tiene tope propio. |
| cycle_startstring | null(body) | Día de inicio del servicio (ISO 8601): sus minutos y sus mensajes se renuevan ese día de cada mes. null vuelve al mes natural. |
| monthly_cost_limit_centsinteger | null(body) | Tope de GASTO en céntimos de euro por mes natural, voz y chat juntos: lo máximo que ese cliente te puede costar en Lera. Es otra cosa que included_minutes e included_messages. null lo quita. |
| on_exhaustedstring(body) | Qué hace al agotar sus minutos o sus mensajes (mensualidad + bolsa) o su tope de gasto: block (Corta) deja de atender; notify (Sigue y avisa) sigue y te avisa por correo. Vale para los tres. En el chat, block no abre conversaciones nuevas y deja terminar las que ya estaban abiertas.Valores: block · notify |
| pausedboolean(body) | true lo pone en pausa (si no te paga): su agente deja de atender hasta que lo reactives. |
| white_labelboolean(body) | Con true (de fábrica) ese cliente no ve nuestra marca en su panel. Importes y €/min no los ve nunca; sus minutos, sí. |
| client_accessstring(body) | Lo que puede hacer su gente en el panel. view (de fábrica): ve sus agentes, llamadas, chats y minutos. adjust: además cambia los textos de sus agentes y sus bases de conocimiento, prueba y publica; nunca el modelo, la voz, las funciones ni la telefonía.Valores: view · adjust |
| max_concurrent_callsinteger | null(body) | Cuántas llamadas a la vez puede atender como mucho. null: sin tope propio. |
| external_idstring | null(body) | Su id en tu sistema. Único entre tus clientes: si ya lo tiene otro, 409 external_id_taken. |
| contact_emailstring | null(body) | Correo de contacto del cliente. |
| contact_first_namestring(body) | Nombre de la persona de contacto del cliente. |
| contact_last_namestring(body) | Apellidos de la persona de contacto del cliente. |
| namestring(body) | Nombre del cliente. |
Petición
curl -X POST https://leracore.com/api/v1/partner/clients/{workspace_id} \
-H "Authorization: Bearer lr_sk_..." \
-H "Content-Type: application/json" \
-d '{}'Respuestas
| Código | Descripción |
|---|---|
| 200 | {
"workspace_id": "cmk...",
"monthly_cost_limit_cents": 5000,
"monthly_minute_limit": 500,
"monthly_message_limit": 1000,
"monthly_limit_action": "block",
"paused": false,
"minutes_plan": { "included_minutes": 500, "remaining": 387.5, "on_exhausted": "block" },
"messages_plan": { "included_messages": 1000, "remaining": 582, "on_exhausted": "block" }
}application/json; charset=utf-8 |
| 400 | Petición inválida |
| 403 | Prohibido |
CONSULTAGET /api/v1/partner/clients/{workspace_id}/minute-packsEl estado de sus minutos y el historial de su bolsa de minutos: compras (pack), correcciones (adjustment) y lo que han gastado sus llamadas (consumption; minutes es lo que salió de la bolsa y call_minutes lo que duró). Los chats van en la bolsa de mensajes (message-packs). Las 100 últimas.
Parámetros
Sin parámetros.
Petición
curl "https://leracore.com/api/v1/partner/clients/{workspace_id}/minute-packs" \
-H "Authorization: Bearer lr_sk_..."Respuestas
| Código | Descripción |
|---|---|
| 200 | {
"minutes_plan": { "included_minutes": 500, "pack_left": 200, "remaining": 387.5, "on_exhausted": "block" },
"movements": [
{ "id": "cmk...", "kind": "pack", "minutes": 200, "call_minutes": null, "overage_minutes": null, "reference": "factura-77", "note": null, "created_at": "2026-10-01T09:00:00.000Z" }
]
}application/json; charset=utf-8 |
| 400 | Petición inválida |
| 403 | Prohibido |
CREAPOST /api/v1/partner/clients/{workspace_id}/minute-packsEl cliente te ha pagado un bono de minutos: se gasta después de su mensualidad y no caduca. Comprar una bolsa rearma los avisos del 80 % y de agotado.
Parámetros
| Nombre | Descripción |
|---|---|
| minutes* obligatoriointeger(body) | Minutos de la bolsa (positivos). Para quitar, negativos con kind adjustment. |
| referencestring(body) | El id del cobro en tu sistema. Hace la operación idempotente: repetirla responde 200 con duplicate=true y no suma dos veces. |
| kindstring(body) | pack (por defecto) o adjustment para corregir.Valores: pack · adjustment |
| notestring(body) | Una nota tuya. Su cliente no la ve. |
Petición
curl -X POST https://leracore.com/api/v1/partner/clients/{workspace_id}/minute-packs \
-H "Authorization: Bearer lr_sk_..." \
-H "Content-Type: application/json" \
-d '{}'Respuestas
| Código | Descripción |
|---|---|
| 200 | {
"duplicate": false,
"minutes_plan": { "included_minutes": 500, "pack_left": 400, "remaining": 587.5, "on_exhausted": "block" }
}application/json; charset=utf-8 |
| 400 | Petición inválida |
| 403 | Prohibido |
CONSULTAGET /api/v1/partner/clients/{workspace_id}/message-packsEl estado de sus mensajes de chat y el historial de su bolsa de mensajes: compras (pack), correcciones (adjustment) y lo que han gastado sus chats (consumption; messages es lo que salió de la bolsa y chat_messages lo que contestó el agente). Un mensaje es una respuesta del agente: el saludo fijo no cuenta. Las 100 últimas.
Parámetros
Sin parámetros.
Petición
curl "https://leracore.com/api/v1/partner/clients/{workspace_id}/message-packs" \
-H "Authorization: Bearer lr_sk_..."Respuestas
| Código | Descripción |
|---|---|
| 200 | {
"messages_plan": { "included_messages": 1000, "pack_left": 1000, "remaining": 1582, "on_exhausted": "block" },
"movements": [
{ "id": "cmk...", "kind": "pack", "messages": 1000, "chat_messages": null, "overage_messages": null, "reference": "cobro-123", "note": null, "created_at": "2026-10-01T09:00:00.000Z" }
]
}application/json; charset=utf-8 |
| 400 | Petición inválida |
| 403 | Prohibido |
CREAPOST /api/v1/partner/clients/{workspace_id}/message-packsEl cliente te ha pagado un bono de mensajes para su chat: se gasta después de sus mensajes del mes y no caduca. Va aparte de los minutos. Comprar una bolsa rearma los avisos de mensajes del 80 % y de agotado.
Parámetros
| Nombre | Descripción |
|---|---|
| messages* obligatoriointeger(body) | Mensajes de la bolsa (positivos). Para quitar, negativos con kind adjustment. |
| referencestring(body) | El id del cobro en tu sistema. Hace la operación idempotente dentro de los mensajes: si un mismo cobro trae minutos y mensajes, manda las dos bolsas con la misma reference. |
| kindstring(body) | pack (por defecto) o adjustment para corregir.Valores: pack · adjustment |
| notestring(body) | Una nota tuya. Su cliente no la ve. |
Petición
curl -X POST https://leracore.com/api/v1/partner/clients/{workspace_id}/message-packs \
-H "Authorization: Bearer lr_sk_..." \
-H "Content-Type: application/json" \
-d '{}'Respuestas
| Código | Descripción |
|---|---|
| 200 | {
"duplicate": false,
"messages_plan": { "included_messages": 1000, "pack_left": 1000, "remaining": 1582, "on_exhausted": "block" }
}application/json; charset=utf-8 |
| 400 | Petición inválida |
| 403 | Prohibido |
CREAPOST /api/v1/partner/clients/{workspace_id}/linesDa a tu cliente su línea de entrada, a la que desvía su número de siempre. La telefonía de tus clientes la gestionas tú: ellos ven su línea y cómo desviar, nada más. Va incluida una línea por cuenta y las demás tienen cuota mensual, que pagas tú. Los códigos del desvío, según su operador, con get_forwarding_codes y la cabecera X-Lera-Client. En workspace_id vale también su external_id.
Parámetros
| Nombre | Descripción |
|---|---|
| agent_idstring(body) | El agente de voz publicado que contesta. Si el cliente solo tiene uno, no hace falta. |
| labelstring(body) | Un nombre para la línea (por ejemplo, la sede). |
| accept_line_feeboolean(body) | Obligatorio en una línea adicional: aceptas su cuota mensual (line_fee_cents), que se descuenta de tu saldo desde hoy. Sin él, 400 line_fee_not_accepted, así que repetir la petición no compra dos. |
Petición
curl -X POST https://leracore.com/api/v1/partner/clients/{workspace_id}/lines \
-H "Authorization: Bearer lr_sk_..." \
-H "Content-Type: application/json" \
-d '{}'Respuestas
| Código | Descripción |
|---|---|
| 200 | {
"assigned": "+34848000000",
"line_fee_cents": 300,
"next_line_is_extra": true,
"next_line_blocked_reason": null,
"lines": [
{ "e164": "+34848000000", "label": null, "agent_id": "agt_...", "included": false, "release_at": null, "release_reason": null }
]
}application/json; charset=utf-8 |
| 400 | Petición inválida |
| 403 | Prohibido |
ELIMINADELETE /api/v1/partner/clients/{workspace_id}/lines/{e164}Suelta una línea de tu cliente. Si nunca recibió una llamada vuelve libre al momento; si recibió alguna, pasa 30 días sin reasignarse por si quedó un desvío apuntando a ella. Que tu cliente quite su desvío.
Parámetros
Sin parámetros. Envía un objeto vacío.
Petición
curl -X POST https://leracore.com/api/v1/partner/clients/{workspace_id}/lines/{e164} \
-H "Authorization: Bearer lr_sk_..." \
-H "Content-Type: application/json" \
-d '{}'Respuestas
| Código | Descripción |
|---|---|
| 200 | {
"released": "+34848000000",
"line_fee_cents": 300,
"next_line_is_extra": true,
"next_line_blocked_reason": null,
"lines": []
}application/json; charset=utf-8 |
| 400 | Petición inválida |
| 403 | Prohibido |
CREAPOST /api/v1/partner/clients/{workspace_id}/sessionsAbre el panel a tu cliente sin que tenga que registrarse. Pídelo desde tu servidor (nunca desde el navegador: lleva tu clave) y redirige a la persona a url. El enlace sirve UNA vez y caduca a los 5 minutos. En workspace_id vale también su external_id.
Parámetros
| Nombre | Descripción |
|---|---|
| email* obligatoriostring(body) | El correo de la persona que entra. Si no tiene usuario, se crea solo dentro de ese cliente. Si ya tiene acceso a otra cuenta de Lera, 409 email_in_use. |
| namestring(body) | Su nombre, si se crea el usuario. |
| rolestring(body) | member (por defecto): solo lectura. admin: además lo que abra el client_access del cliente (con adjust, los textos de sus agentes y sus bases) y sus datos de cliente. El equipo y las claves los gestionas tú. Ninguno ve a tus otros clientes ni tu consola.Valores: member · admin |
Petición
curl -X POST https://leracore.com/api/v1/partner/clients/{workspace_id}/sessions \
-H "Authorization: Bearer lr_sk_..." \
-H "Content-Type: application/json" \
-d '{}'Respuestas
| Código | Descripción |
|---|---|
| 200 | {
"url": "https://leracore.com/app/enter?token=...",
"expires_at": "2026-10-03T10:05:00.000Z",
"user_created": true,
"role": "member"
}application/json; charset=utf-8 |
| 400 | Petición inválida |
| 403 | Prohibido |
Catálogo de operacionesOperaciones disponibles en CATÁLOGO DE OPERACIONES:CONSULTA /api/v1/tools
CONSULTAGET /api/v1/toolsDevuelve el catálogo de operaciones con su esquema de entrada, para descubrirlas desde código.
Parámetros
Sin parámetros.
Petición
curl "https://leracore.com/api/v1/tools" \ -H "Authorization: Bearer lr_sk_..."
Respuestas
| Código | Descripción |
|---|---|
| 200 | {
"tools": [{
"name": "list_agents",
"description": "...",
"input_schema": { "type": "object", "properties": {} }
}]
}application/json; charset=utf-8 |
| 400 | Petición inválida |
| 403 | Prohibido |