Objetivo
Envía un mensaje de texto de WhatsApp desde un programa en TypeScript con Bun y Kapso.
Esta es la prueba de integración más pequeña que resulta útil. Demuestra que tu proyecto de Kapso, el remitente de WhatsApp, la clave de API, el SDK y el destinatario de prueba pueden funcionar juntos antes de que agregues un servidor web o un modelo de IA.
Requisitos previos
- Bun instalado
- Una cuenta de Kapso
- Un número de WhatsApp conectado o una sesión activa del sandbox de Kapso
- Un destinatario de prueba que haya dado su consentimiento
- Una ventana de atención al cliente de WhatsApp abierta o una plantilla aprobada
Comprueba el remitente en Kapso
Abre WhatsApp > Phone numbers en Kapso. Hay dos valores con nombres parecidos, pero cumplen funciones diferentes:
| Valor | Significado |
|---|---|
| Phone number | El número visible de WhatsApp al que una persona envía mensajes |
| Phone Number ID | El identificador técnico de Meta para el remitente empresarial |
Envía un mensaje desde tu teléfono de prueba autorizado al número conectado y luego abre el Inbox de Kapso. Ver esa conversación confirma que el número está activo.
Si usas el sandbox, envía mensajes únicamente al teléfono registrado para la sesión activa del sandbox.
Crea el proyecto con Bun
bun init receptionist-ai
cd receptionist-ai
bun run index.ts
bun add @kapso/whatsapp-cloud-apiLa primera ejecución muestra el mensaje inicial de Bun. Reemplaza ese código inicial después de instalar el SDK.
Mantén la configuración fuera del código fuente
Crea una clave de Kapso en Integrations > API keys. Agrega tus propios valores a .env:
KAPSO_API_KEY=replace-with-your-api-key
KAPSO_PHONE_NUMBER_ID=replace-with-your-sender-id
WHATSAPP_TEST_RECIPIENT=replace-with-your-test-recipientAsegúrate de que Git ignore el archivo:
.envBun carga .env automáticamente. No necesitas importar dotenv en este proyecto.
Envía el mensaje
Reemplaza el contenido inicial de index.ts con este cambio específico:
-console.log("Hello via Bun!");
+import { WhatsAppClient } from "@kapso/whatsapp-cloud-api";
+
+const kapsoApiKey = process.env.KAPSO_API_KEY;
+const phoneNumberId = process.env.KAPSO_PHONE_NUMBER_ID;
+const recipient = process.env.WHATSAPP_TEST_RECIPIENT;
+
+if (!kapsoApiKey || !phoneNumberId || !recipient) {
+ throw new Error("Missing Kapso or WhatsApp configuration");
+}
+
+const kapso = new WhatsAppClient({
+ baseUrl: "https://api.kapso.ai/meta/whatsapp",
+ kapsoApiKey,
+});
+
+const response = await kapso.messages.sendText({
+ phoneNumberId,
+ to: recipient,
+ body: "Hello from Bun!",
+});
+
+console.log("Message accepted:", response.messages[0]?.id);Ejecútalo una vez:
bun run index.tsCada ejecución envía otro mensaje, así que no ejecutes este script de un solo uso en modo watch.
Entiende sendText
sendText necesita tres campos del mensaje:
phoneNumberIdselecciona el remitente empresarial de WhatsApp.toselecciona al destinatario que dio su consentimiento, en formato internacional.bodyes el texto que se entrega a WhatsApp.
El baseUrl del cliente dirige la solicitud mediante Kapso. kapsoApiKey autentica tu proyecto de Kapso.
Verifica el resultado
Comprueba los tres puntos:
- El script termina sin lanzar una excepción y muestra un ID de mensaje.
- El mensaje llega al teléfono de prueba autorizado.
- La conversación aparece en el Inbox de Kapso.
Una solicitud aceptada por la API no equivale a una entrega. Una aplicación de producción también debe procesar los eventos de estado sent, delivered, read y failed.
Errores comunes
| Síntoma | Causa probable | Solución |
|---|---|---|
401 o 403 |
La clave de API falta, no es válida o fue revocada | Crea una clave de proyecto válida y reinicia el proceso |
| Remitente incorrecto o no encontrado | Se usó el número visible en lugar del Phone Number ID | Copia el ID técnico desde Kapso |
| Se rechaza el envío desde el sandbox | El destinatario no está activo en el sandbox | Vuelve a activar el mismo teléfono de prueba |
| Se rechaza el mensaje de formato libre | La ventana de atención de 24 horas está cerrada | Usa una plantilla aprobada para reabrir la conversación |
| El script finaliza correctamente, pero no muestra nada | La versión del video no registra la respuesta | Agrega el registro del ID de mensaje que se muestra arriba |
Nunca incluyas .env en un commit, escribas directamente un destinatario real en el código ni publiques una credencial en una captura de pantalla o grabación. Revoca cualquier clave que haya quedado expuesta.
Del script a la aplicación
El repositorio final usa el mismo WhatsAppClient y la misma llamada a sendText. En lugar de escribir directamente un destinatario de prueba en el código, obtiene el destino de la respuesta a partir de un webhook entrante. Las siguientes lecciones construyen ese ciclo de recepción y respuesta.