Lera API

v178 operaciones
https://leracore.com/openapi.json

Documentació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_calls

Si 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

Agentes
CONSULTAPOST /api/v1/tools/get_agentDevuelve la configuración completa de un agente por su id: prompt, voz, funciones y límites.

Parámetros

NombreDescripció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ódigoDescripció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

400Petición inválida
403Prohibido
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

NombreDescripció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ódigoDescripció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

400Petición inválida
403Prohibido
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ódigoDescripción
200
{
  "result": [
    {
      "key": "clinica",
      "name": "Clínica",
      "sector": "salud"
    }
  ]
}

application/json; charset=utf-8

400Petición inválida
403Prohibido
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

NombreDescripció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ódigoDescripció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

400Petición inválida
403Prohibido
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ódigoDescripció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

400Petición inválida
403Prohibido
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

NombreDescripció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ódigoDescripció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

400Petición inválida
403Prohibido
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

NombreDescripció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ódigoDescripció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

400Petición inválida
403Prohibido
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

NombreDescripció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ódigoDescripción
200
{
  "result": {
    "ok": true,
    "agentId": "cmk1a2b3c...",
    "name": "Recepción",
    "status": "draft"
  }
}

application/json; charset=utf-8

400Petición inválida
403Prohibido
CREAPOST /api/v1/tools/duplicate_agentDuplica un agente existente como un borrador nuevo, sin tocar el original.

Parámetros

NombreDescripció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ódigoDescripción
200
{
  "result": {
    "id": "cmk9z8y7x...",
    "name": "Recepción (copia)",
    "status": "draft"
  }
}

application/json; charset=utf-8

400Petición inválida
403Prohibido
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

NombreDescripció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ódigoDescripción
200
{
  "result": {
    "id": "cmk9z8y7x...",
    "name": "Recepción",
    "status": "draft"
  }
}

application/json; charset=utf-8

400Petición inválida
403Prohibido
ACTUALIZAPOST /api/v1/tools/export_agentExporta un agente a un JSON portable para llevarlo a otro workspace. Los secretos salen redactados.

Parámetros

NombreDescripció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ódigoDescripción
200
{
  "result": {
    "version": 1,
    "agent": {
      "name": "Recepción",
      "kind": "voice",
      "mode": "conversation_flow"
    },
    "config": {
      "prompt": "...",
      "customTools": [
        {
          "url": "***"
        }
      ]
    }
  }
}

application/json; charset=utf-8

400Petición inválida
403Prohibido
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

NombreDescripció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ódigoDescripción
200
{
  "result": {
    "id": "cmk1a2b3c...",
    "status": "published",
    "version": 4
  }
}

application/json; charset=utf-8

400Petición inválida
403Prohibido
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

NombreDescripció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ódigoDescripció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

400Petición inválida
403Prohibido
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

NombreDescripció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ódigoDescripció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

400Petición inválida
403Prohibido
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

NombreDescripció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ódigoDescripció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

400Petición inválida
403Prohibido
ACTUALIZAPOST /api/v1/tools/update_agentActualiza el borrador de un agente: nombre, prompt, saludo, voz, modelo, comportamiento y bases de conocimiento.

Parámetros

NombreDescripció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ódigoDescripció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

400Petición inválida
403Prohibido
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

NombreDescripció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ódigoDescripció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

400Petición inválida
403Prohibido
Llamadas y analítica
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

NombreDescripció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ódigoDescripció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

400Petición inválida
403Prohibido
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ódigoDescripció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

400Petición inválida
403Prohibido
CONSULTAPOST /api/v1/tools/get_callDevuelve el detalle de una llamada: resumen, transcripción, eventos y funciones ejecutadas.

Parámetros

NombreDescripció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ódigoDescripció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

400Petición inválida
403Prohibido
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

NombreDescripció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ódigoDescripción
200

Devuelve el resultado dentro de result.

{ "result": ... }

application/json; charset=utf-8

400Petición inválida
403Prohibido
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ódigoDescripción
200
{
  "result": {
    "current_concurrency": 3,
    "concurrency_limit": 10,
    "available": 7,
    "reserved_inbound_concurrency": 2,
    "available_for_outbound": 5
  }
}

application/json; charset=utf-8

400Petición inválida
403Prohibido
CONSULTAPOST /api/v1/tools/list_callsDevuelve las llamadas recientes, filtrables por estado, dirección y teléfono. Hasta 50 por petición.

Parámetros

NombreDescripció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ódigoDescripción
200
{
  "result": [
    {
      "id": "cmk...",
      "status": "completed",
      "direction": "inbound",
      "callerName": "Ana",
      "callerPhone": "+34600111222",
      "summary": "Pide cita para el jueves"
    }
  ]
}

application/json; charset=utf-8

400Petición inválida
403Prohibido
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

NombreDescripció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ódigoDescripción
200

Devuelve el resultado dentro de result.

{ "result": ... }

application/json; charset=utf-8

400Petición inválida
403Prohibido
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

NombreDescripció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ódigoDescripción
200
{
  "result": {
    "ok": true,
    "call_id": "cmk...",
    "to_number": "+34600111222",
    "duplicate": false
  }
}

application/json; charset=utf-8

400Petición inválida
403Prohibido
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

NombreDescripció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ódigoDescripció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

400Petición inválida
403Prohibido
CREAPOST /api/v1/web-callsAbre una llamada por navegador desde tu backend y devuelve el token de sala para tu frontend.

Parámetros

NombreDescripció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ódigoDescripción
200
{
  "call_id": "cmk...",
  "access_token": "eyJhbGciOi...",
  "livekit_url": "wss://....livekit.cloud",
  "max_duration_sec": 600
}

application/json; charset=utf-8

400Petición inválida
403Prohibido
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

NombreDescripció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ódigoDescripció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

400Petición inválida
403Prohibido
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

NombreDescripció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ódigoDescripció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

400Petición inválida
403Prohibido
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ódigoDescripción
200
{
  "chat": { "id": "cmk...", "status": "ended", "end_reason": "api", "agent_messages": 4 }
}

application/json; charset=utf-8

400Petición inválida
403Prohibido
Números de teléfono
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

NombreDescripció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ódigoDescripció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

400Petición inválida
403Prohibido
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ódigoDescripción
200
{
  "result": [
    {
      "id": "cmk...",
      "label": "Centralita",
      "e164": "+34600333444",
      "provider": "sip",
      "status": "active",
      "inboundAgentId": "cmk1a2b3c...",
      "outboundAgentId": "cmk4d5e6f..."
    }
  ]
}

application/json; charset=utf-8

400Petición inválida
403Prohibido
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

NombreDescripció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ódigoDescripció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

400Petición inválida
403Prohibido
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

NombreDescripció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ódigoDescripció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

400Petición inválida
403Prohibido
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

NombreDescripció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ódigoDescripció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

400Petición inválida
403Prohibido
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

NombreDescripció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ódigoDescripción
200
{
  "result": {
    "ok": true,
    "e164": "+34600333444",
    "inboundAgentId": "cmk1a2b3c..."
  }
}

application/json; charset=utf-8

400Petición inválida
403Prohibido
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

NombreDescripció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ódigoDescripción
200
{
  "result": {
    "ok": true,
    "e164": "+34600333444",
    "outboundAgentId": "cmk1a2b3c..."
  }
}

application/json; charset=utf-8

400Petición inválida
403Prohibido
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

NombreDescripció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ódigoDescripción
200
{
  "result": {
    "ok": true,
    "e164": "+34600333444",
    "inbound_ready": true
  }
}

application/json; charset=utf-8

400Petición inválida
403Prohibido
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

NombreDescripció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ódigoDescripción
200
{
  "result": {
    "ok": true,
    "released": "+34848000000",
    "kept_for_you": true
  }
}

application/json; charset=utf-8

400Petición inválida
403Prohibido
Flujo conversacional
CONSULTAPOST /api/v1/tools/check_transfersDiagnostica qué derivaciones puede hacer de verdad esta cuenta. Úsalo antes de prometer una a nadie.

Parámetros

NombreDescripció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ódigoDescripció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

400Petición inválida
403Prohibido
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

NombreDescripció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ódigoDescripció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

400Petición inválida
403Prohibido
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

NombreDescripció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ódigoDescripción
200
{
  "result": {
    "ok": true,
    "agentId": "cmk1a2b3c...",
    "functionName": "consultar_pedido",
    "nodeId": "consulta",
    "functions": [
      "consultar_pedido"
    ]
  }
}

application/json; charset=utf-8

400Petición inválida
403Prohibido
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

NombreDescripció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ódigoDescripción
200
{
  "result": {
    "ok": true,
    "agentId": "cmk1a2b3c...",
    "nodeId": "cierre",
    "fields": [
      "prompt"
    ],
    "functions": [
      "consultar_pedido"
    ]
  }
}

application/json; charset=utf-8

400Petición inválida
403Prohibido
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

NombreDescripció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ódigoDescripció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

400Petición inválida
403Prohibido
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

NombreDescripció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ódigoDescripció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

400Petición inválida
403Prohibido
ELIMINAPOST /api/v1/tools/detach_function_from_nodeDeja de ofrecer una función en ese nodo. No la borra del agente.

Parámetros

NombreDescripció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ódigoDescripción
200
{
  "result": {
    "ok": true,
    "agentId": "cmk1a2b3c...",
    "functionName": "consultar_pedido",
    "nodeId": "consulta",
    "functions": [
      "consultar_pedido"
    ]
  }
}

application/json; charset=utf-8

400Petición inválida
403Prohibido
Funciones y calendario
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

NombreDescripció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ódigoDescripció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

400Petición inválida
403Prohibido
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

NombreDescripció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ódigoDescripción
200
{
  "result": {
    "eventTypes": [
      {
        "id": 123456,
        "title": "Consulta 30 min",
        "length": 30
      }
    ]
  }
}

application/json; charset=utf-8

400Petición inválida
403Prohibido
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

NombreDescripció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ódigoDescripción
200
{
  "result": {
    "agentId": "cmk1a2b3c...",
    "connected": true,
    "functions": [
      {
        "name": "reservar_cita",
        "kind": "book",
        "provider": "calcom"
      }
    ]
  }
}

application/json; charset=utf-8

400Petición inválida
403Prohibido
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

NombreDescripció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ódigoDescripción
200
{
  "result": {
    "ok": true,
    "agentId": "cmk1a2b3c...",
    "functionName": "consultar_pedido",
    "functions": [
      "consultar_pedido"
    ]
  }
}

application/json; charset=utf-8

400Petición inválida
403Prohibido
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

NombreDescripció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ódigoDescripción
200
{
  "result": {
    "ok": true,
    "agentId": "cmk1a2b3c...",
    "channel": "sms"
  }
}

application/json; charset=utf-8

400Petición inválida
403Prohibido
CREAPOST /api/v1/tools/connect_calendarConecta Cal.com a un agente para consultar huecos y reservar citas durante la llamada.

Parámetros

NombreDescripció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ódigoDescripción
200
{
  "result": {
    "ok": true,
    "agentId": "cmk1a2b3c...",
    "eventTypeId": "123456",
    "functions": [
      "consultar_disponibilidad",
      "reservar_cita"
    ]
  }
}

application/json; charset=utf-8

400Petición inválida
403Prohibido
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

NombreDescripció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ódigoDescripción
200
{
  "result": {
    "ok": true,
    "agentId": "cmk1a2b3c...",
    "count": 2
  }
}

application/json; charset=utf-8

400Petición inválida
403Prohibido
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

NombreDescripció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ódigoDescripción
200
{
  "result": {
    "ok": true,
    "agentId": "cmk1a2b3c...",
    "functionName": "consultar_pedido",
    "functions": [
      "consultar_pedido"
    ]
  }
}

application/json; charset=utf-8

400Petición inválida
403Prohibido
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

NombreDescripció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ódigoDescripción
200
{
  "result": {
    "ok": true,
    "agentId": "cmk1a2b3c...",
    "functionName": "consultar_pedido",
    "functions": []
  }
}

application/json; charset=utf-8

400Petición inválida
403Prohibido
ELIMINAPOST /api/v1/tools/remove_calendar_functionsDesconecta el calendario de un agente. Acuérdate de publicar después.

Parámetros

NombreDescripció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ódigoDescripción
200
{
  "result": {
    "ok": true,
    "agentId": "cmk1a2b3c...",
    "functions": [
      "consultar_pedido"
    ]
  }
}

application/json; charset=utf-8

400Petición inválida
403Prohibido
Base de conocimiento
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

NombreDescripció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ódigoDescripción
200
{
  "result": {
    "pages": [
      {
        "url": "https://example.com/precios",
        "title": "Precios"
      }
    ]
  }
}

application/json; charset=utf-8

400Petición inválida
403Prohibido
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ódigoDescripció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

400Petición inválida
403Prohibido
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ódigoDescripció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

400Petición inválida
403Prohibido
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

NombreDescripció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ódigoDescripció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

400Petición inválida
403Prohibido
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

NombreDescripció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ódigoDescripción
200
{
  "result": {
    "ok": true,
    "entryId": "cmk...",
    "title": "Horario",
    "action": "add"
  }
}

application/json; charset=utf-8

400Petición inválida
403Prohibido
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

NombreDescripció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ódigoDescripción
200
{
  "result": {
    "id": "cmk...",
    "kind": "text",
    "title": "Precios",
    "status": "processing"
  }
}

application/json; charset=utf-8

400Petición inválida
403Prohibido
CREAPOST /api/v1/tools/analyze_websiteLee la web del negocio y extrae nombre, actividad, servicios, preguntas frecuentes, tono y un saludo sugerido.

Parámetros

NombreDescripció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ódigoDescripció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

400Petición inválida
403Prohibido
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

NombreDescripció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ódigoDescripción
200
{
  "result": {
    "id": "cmk...",
    "name": "Web de la clínica",
    "status": "empty"
  }
}

application/json; charset=utf-8

400Petición inválida
403Prohibido
ACTUALIZAPOST /api/v1/tools/update_knowledgeEdita una entrada de conocimiento por su id. Cambia solo los campos que pasas.

Parámetros

NombreDescripció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ódigoDescripción
200
{
  "result": {
    "ok": true,
    "entryId": "cmk...",
    "title": "Horario",
    "action": "update"
  }
}

application/json; charset=utf-8

400Petición inválida
403Prohibido
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

NombreDescripció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ódigoDescripción
200
{
  "result": {
    "ok": true,
    "entryId": "cmk...",
    "action": "remove"
  }
}

application/json; charset=utf-8

400Petición inválida
403Prohibido
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

NombreDescripció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ódigoDescripción
200
{
  "result": {
    "ok": true,
    "id": "cmk..."
  }
}

application/json; charset=utf-8

400Petición inválida
403Prohibido
Variables y webhook de pre-llamada
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

NombreDescripció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ódigoDescripció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

400Petición inválida
403Prohibido
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

NombreDescripció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ódigoDescripción
200
{
  "result": {
    "ok": true,
    "agentId": "cmk1a2b3c...",
    "variableName": "nombre_cliente",
    "functions": [
      "consultar_pedido"
    ]
  }
}

application/json; charset=utf-8

400Petición inválida
403Prohibido
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

NombreDescripció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ódigoDescripción
200
{
  "result": {
    "ok": true,
    "respondio": true,
    "ms": 412,
    "intentos": 1,
    "variables_que_devuelve": [
      "nombre_cliente",
      "ultimo_pedido"
    ],
    "problemas": []
  }
}

application/json; charset=utf-8

400Petición inválida
403Prohibido
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

NombreDescripció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ódigoDescripció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

400Petición inválida
403Prohibido
ACTUALIZAPOST /api/v1/tools/update_call_variableEdita una variable de llamada por su nombre. Solo cambia lo que pasas.

Parámetros

NombreDescripció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ódigoDescripción
200
{
  "result": {
    "ok": true,
    "agentId": "cmk1a2b3c...",
    "variableName": "nombre_cliente",
    "functions": [
      "consultar_pedido"
    ]
  }
}

application/json; charset=utf-8

400Petición inválida
403Prohibido
ELIMINAPOST /api/v1/tools/remove_call_variableElimina una variable de llamada de un agente.

Parámetros

NombreDescripció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ódigoDescripción
200
{
  "result": {
    "ok": true,
    "agentId": "cmk1a2b3c...",
    "variableName": "nombre_cliente",
    "functions": [
      "consultar_pedido"
    ]
  }
}

application/json; charset=utf-8

400Petición inválida
403Prohibido
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

NombreDescripció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ódigoDescripció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

400Petición inválida
403Prohibido
Lista de exclusión
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ódigoDescripció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

400Petición inválida
403Prohibido
CREAPOST /api/v1/tools/add_optout_numberExcluye un número de las llamadas salientes: el agente no volverá a llamarle nunca.

Parámetros

NombreDescripció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ódigoDescripción
200
{
  "result": {
    "ok": true,
    "e164": "+34600111222"
  }
}

application/json; charset=utf-8

400Petición inválida
403Prohibido
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

NombreDescripció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ódigoDescripción
200
{
  "result": {
    "ok": true,
    "e164": "+34600111222"
  }
}

application/json; charset=utf-8

400Petición inválida
403Prohibido
Cuenta y canal web
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ódigoDescripción
200
{
  "result": {
    "isBillingChild": false,
    "balanceCents": 4210,
    "monthMinutes": 312.5,
    "monthCostCents": 3980
  }
}

application/json; charset=utf-8

400Petición inválida
403Prohibido
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

NombreDescripció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ódigoDescripció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

400Petición inválida
403Prohibido
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ódigoDescripción
200
{
  "result": [
    {
      "id": "cmk...",
      "type": "post_call_webhook",
      "status": "connected",
      "displayName": "Webhook de mi ERP"
    }
  ]
}

application/json; charset=utf-8

400Petición inválida
403Prohibido
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ódigoDescripció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

400Petición inválida
403Prohibido
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

NombreDescripció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ódigoDescripción
200
{
  "result": {
    "ok": true,
    "id": "cmk...",
    "type": "webhook",
    "status": "enabled",
    "url": "https://tu-sistema.example.com/llamadas"
  }
}

application/json; charset=utf-8

400Petición inválida
403Prohibido
Cuentas partner
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

NombreDescripció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ódigoDescripció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

400Petición inválida
403Prohibido
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

NombreDescripció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ódigoDescripció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

400Petición inválida
403Prohibido
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

NombreDescripció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ódigoDescripció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

400Petición inválida
403Prohibido
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

NombreDescripció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ódigoDescripció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

400Petición inválida
403Prohibido
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ódigoDescripció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

400Petición inválida
403Prohibido
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

NombreDescripció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ódigoDescripción
200
{
  "duplicate": false,
  "minutes_plan": { "included_minutes": 500, "pack_left": 400, "remaining": 587.5, "on_exhausted": "block" }
}

application/json; charset=utf-8

400Petición inválida
403Prohibido
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ódigoDescripció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

400Petición inválida
403Prohibido
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

NombreDescripció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ódigoDescripción
200
{
  "duplicate": false,
  "messages_plan": { "included_messages": 1000, "pack_left": 1000, "remaining": 1582, "on_exhausted": "block" }
}

application/json; charset=utf-8

400Petición inválida
403Prohibido
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

NombreDescripció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ódigoDescripció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

400Petición inválida
403Prohibido
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ódigoDescripción
200
{
  "released": "+34848000000",
  "line_fee_cents": 300,
  "next_line_is_extra": true,
  "next_line_blocked_reason": null,
  "lines": []
}

application/json; charset=utf-8

400Petición inválida
403Prohibido
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

NombreDescripció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ódigoDescripció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

400Petición inválida
403Prohibido
Catálogo de operaciones
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ódigoDescripción
200
{
  "tools": [{
    "name": "list_agents",
    "description": "...",
    "input_schema": { "type": "object", "properties": {} }
  }]
}

application/json; charset=utf-8

400Petición inválida
403Prohibido