Skip to main content
El segundo argumento del handler (ctx) te proporciona metadata de la petición y acceso a la plataforma.
handler: async (input, ctx) => {
  ctx.log("Procesando", { company: ctx.company.id });
  const apiKey = ctx.env.get("API_KEY");
}

Información de la función

CampoTipoEjemplo
functionSlugstring"consultar-cliente"

Organización

CampoTipoEjemplo
company.idnumber42
company.namestring"Acme Corp"

Bot

CampoTipoEjemplo
bot.idstring"bot-abc123"
bot.namestring"Bot de Soporte"
bot.channelstring"whatsapp"

Usuario

CampoTipoEjemplo
user.idnumber123
user.namesstring | undefined"María García"
user.roomIdstring | undefined"room-456"

Conversación y operador

CampoTipoEjemplo
conversation{ id?: string; ... }{ id: "conv-789" }
operator{ id?: string; ... }{ id: "op-321" }

Petición

CampoTipoEjemplo
methodstring"POST"
pathstring"/clientes/42"
requestIdstring"550e8400-e29b-41d4-a716-446655440000"
skillIdstring | null"skill-abc"
executionIdstring | null"exec-789"

Parámetros de ruta y query

CampoTipoEjemplo
paramsRecord<string, string>{ id: "42" }
queryRecord<string, string>{ estado: "activo" }
// config: { path: "/clientes/:id" }
// Request: GET /clientes/42?estado=activo
ctx.params.id    // "42"
ctx.query.estado // "activo"

Detección de trigger

CampoTipoDescripción
trigger.typestring"http", "cron" o "event"
trigger.cronstring?Expresión cron (cuando type: "cron")
trigger.eventstring?Nombre del evento (cuando type: "event")
isCronbooleantrue cuando lo dispara un cron
isEventbooleantrue cuando lo dispara un evento
isHttpbooleantrue cuando lo dispara una petición HTTP
if (ctx.isCron) {
  ctx.log("Tarea cron ejecutándose", { cron: ctx.trigger.cron });
}

Autenticación (ctx.auth)

Resultado de la verificación Bearer token. Solo presente si la función tiene auth configurado.
CampoTipoDescripción
ctx.authAuthResult | nullnull si auth no está activo o es opcional sin token
ctx.auth.authenticatedbooleantrue si el token fue verificado exitosamente
if (ctx.auth?.authenticated) {
  ctx.log("Petición autenticada");
}

Guía de Autenticación

Configuración, rotación de llaves, auth opcional y patrones con app().

Mensajería (ctx.jelou)

Cliente auto-configurado para enviar mensajes y plantillas de WhatsApp a través de la API de Jelou.
Campo / MétodoTipoDescripción
ctx.jelou.availablebooleantrue si las credenciales del company están configuradas
ctx.jelou.send(options)Promise<MessageResponse>Envía un mensaje (texto, imagen, ubicación, botones, etc.)
ctx.jelou.sendTemplate(options)Promise<TemplateResponse[]>Envía una plantilla HSM de WhatsApp
if (ctx.jelou.available) {
  await ctx.jelou.send({
    type: "text",
    to: "+593987654321",
    text: "Pedido confirmado",
  });
}

Referencia de Mensajería

Tipos de mensaje, plantillas, JelouApiError y mocks para testing.

Memoria de sesión (ctx.memory)

Almacenamiento key-value por sesión respaldado por Redis.
Campo / MétodoTipoDescripción
ctx.memory.availablebooleantrue si socketId y API key están configurados
ctx.memory.get(key, default)Promise<string | number | boolean>Lee un valor primitivo
ctx.memory.getJson<T>(key, default)Promise<T>Lee un valor JSON tipado
ctx.memory.set(key, value, ttl?)Promise<void>Guarda un valor primitivo
ctx.memory.setJson(key, value, ttl)Promise<void>Guarda un objeto JSON (TTL requerido)
ctx.memory.delete(key)Promise<void>Elimina una clave
if (ctx.memory.available) {
  const paso = await ctx.memory.get("paso", "inicio");
  await ctx.memory.set("paso", "confirmacion", 3600);
}

Referencia de Memoria

Métodos, TTL, límites, MemoryApiError y mocks para testing.

Variables de entorno (ctx.env)

MétodoRetornaDescripción
ctx.env.get("KEY")string | undefinedObtiene el valor de un secret
ctx.env.has("KEY")booleanVerifica si un secret existe
ctx.env.toObject()Record<string, string>Obtiene todos los secrets como objeto
Las variables internas con prefijo __FN_ están bloqueadas y retornan undefined.

Logging (ctx.log)

ctx.log("Pago procesado", { orderId: "ORD-123", monto: 99.99 });
Genera JSON estructurado:
{
  "requestId": "550e8400-...",
  "function": "procesar-pago",
  "company": "42",
  "timestamp": "2026-02-17T10:30:00.000Z",
  "args": ["Pago procesado", { "orderId": "ORD-123", "monto": 99.99 }]
}