Integración de API con Kewbot¶
Este documento describe cómo un sistema externo puede enviar mensajes de WhatsApp, recibir respuestas de los clientes y consultar el estado de los mensajes a través de la API de Kewbot.
Generalidades¶
- Base URL:
https://kewbot.solverant.ee/api/ - Autenticación: Token único por empresa, provisto por Kewbot.
- Formato:
application/json - Método:
POST - Respuestas: JSON estructurado.
Ciclo completo de integración¶
La integración con Kewbot sigue tres etapas ordenadas:
| Etapa | Acción | Endpoint | Dirección |
|---|---|---|---|
| 1 | Enviar mensaje | /api/sendTemplate.php |
Sistema externo → Kewbot |
| 2 | Recibir respuesta (clic en botón) | Endpoint del cliente | Kewbot → Sistema externo |
| 3 | Consultar estado del mensaje | /api/checkMessage.php |
Sistema externo → Kewbot |
Paso 1 — Enviar un mensaje con template¶
El sistema externo llama al endpoint POST /api/sendTemplate.php para iniciar una conversación con un cliente enviando un template aprobado por Meta, vinculado a una campaña activa configurada en Kewbot.

Ejemplo de solicitud¶
curl -X POST https://kewbot.solverant.ee/api/sendTemplate.php \
-H "Content-Type: application/json" \
-d '{
"token": "abcdefghilmnopqrstuvz1234567890",
"campaign_name": "demo_api",
"template_name": "aviso_tecnico_A1",
"phone": "5491112345678",
"params": {
"nombre_cliente": "Juan Perez",
"fecha_hora": "25/08/2025 a las 08:00",
"tipo_requerimiento": "Servicio de Internet",
"calle_nro": "San Martín 544",
"telefono_coordinador": "3571545454"
},
"attributes": {
"client_id": "CLI-27544",
"orden_trabajo": "OT-5561",
"segmento": "HOGAR",
"zona": "Almafuerte"
}
}'
Campos de la solicitud¶
| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
token |
string | Sí | Token API asignado a la empresa. |
campaign_name |
string | Sí | Nombre de la campaña en Kewbot. Si no existe una campaña con ese nombre, Kewbot puede crearla automáticamente (ver Autocreación de campaña). |
template_name |
string | No | Nombre del template aprobado por Meta. Solo se usa cuando la campaña indicada en campaign_name no existe: en ese caso Kewbot crea la campaña usando este template. Si la campaña ya existe, este campo se ignora (se usa el template configurado en la campaña). |
phone |
string | Sí | Teléfono del cliente en formato internacional (sin +). |
params |
object | Sí | Variables necesarias para completar el template aprobado por Meta. |
attributes |
object | No | Variables internas del cliente que Kewbot conservará para eventos posteriores. |
Autocreación de campaña¶
Al recibir la solicitud, Kewbot busca una campaña en estado idle cuyo nombre coincida con campaign_name dentro de la empresa:
- Si la campaña existe: el envío continúa normalmente usando el template configurado en esa campaña.
- Si la campaña no existe y se incluyó
template_name: Kewbot resuelve el template por nombre dentro de la empresa (prioriza el template aprobado y disponible más reciente), crea automáticamente una nueva campaña con ese template y continúa el envío. - Si la campaña no existe y no se incluyó
template_name: la solicitud se rechaza con un error indicando que debe incluirsetemplate_namepara crearla automáticamente.
Esto evita tener que acumular todos los contactos en una única campaña preexistente: cada nombre de campaña nuevo (por ejemplo, Octubre-2025) genera su propia campaña, lo que facilita el seguimiento y la segmentación de los envíos.
| Situación | Resultado | Código HTTP |
|---|---|---|
| Campaña existente | Se envía el mensaje con el template de la campaña. | 200 |
Campaña inexistente + template_name válido |
Se crea la campaña y se envía el mensaje. | 200 |
Campaña inexistente sin template_name |
Error: Campaña no encontrada. Para crearla automáticamente incluí template_name en la solicitud. |
404 |
Campaña inexistente + template_name que no existe |
Error: Template no encontrado. | 404 |
Ejemplo de respuesta¶
{
"success": true,
"status": "sent",
"to": "5491112345678",
"template": "demo_aviso_tecnico_01",
"language": "es_AR",
"params": {
"nombre_cliente": "Juan Perez",
"fecha_hora": "25/08/2025 a las 08:00",
"tipo_requerimiento": "Servicio de Internet",
"calle_nro": "San Martín 544",
"telefono_coordinador": "3571545454"
},
"message_id": "KW2025101616382159d76b"
}
Campos de la respuesta¶
| Campo | Descripción |
|---|---|
success |
Indica si el envío fue exitoso. |
status |
Estado inicial del mensaje (generalmente sent). |
message_id |
ID público del mensaje (alias KW...). Debe guardarse para consultas posteriores. |
template |
Nombre del template de WhatsApp utilizado. |
params |
Parámetros efectivamente aplicados al template. |
campaign_id |
ID de la campaña usada o creada automáticamente para el envío. |
Importante: Guardar el
message_iden la base de datos del cliente es fundamental para poder hacer tracking o consultas de estado posteriores.
Paso 2 — Recepción de eventos (Webhook)¶
Cuando el cliente hace clic en un botón del template, Kewbot notifica al endpoint configurado por la empresa integradora.
El sistema externo debe disponer de un endpoint accesible públicamente vía HTTPS, por ejemplo:
https://miempresa.com/api/kewbotReceiver.php

Ejemplo de notificación recibida¶
{
"telefono": "5491112345678",
"opcion": "SI, estaré.",
"client_id": "CLI-27544",
"orden_trabajo": "OT-5561",
"segmento": "HOGAR",
"zona": "Almafuerte",
"mensaje": "Confirmación de visita técnica",
"message_alias_id": "KW20251016174212941092"
}
Campos recibidos¶
| Campo | Descripción |
|---|---|
telefono |
Número del cliente que hizo clic. |
opcion |
Texto o payload del botón presionado. |
client_id, orden_trabajo, segmento, zona |
Atributos enviados por el sistema en el Paso 1. |
mensaje |
Texto del mensaje al que correspondía el botón. |
message_alias_id |
ID público del mensaje enviado (formato KW...). |
Ejemplo de endpoint receptor (PHP)¶
<?php
header('Content-Type: application/json; charset=utf-8');
$raw = file_get_contents('php://input');
$data = json_decode($raw, true);
// Registrar log local
file_put_contents(
'/var/log/kewbot_receiver.log',
date('Y-m-d H:i:s') . ' | ' . $raw . PHP_EOL,
FILE_APPEND
);
// Confirmar recepción a Kewbot
echo json_encode([
'status' => 'OK',
'received_at' => date('Y-m-d H:i:s'),
]);
El endpoint receptor debe responder siempre con
{"status": "OK"}para confirmar la recepción del evento.
Paso 3 — Consultar estado de un mensaje¶
Para verificar en qué estado se encuentra un mensaje específico, el sistema externo puede hacer polling al endpoint POST /api/checkMessage.php.
Ejemplo de solicitud¶
curl -X POST https://kewbot.solverant.ee/api/checkMessage.php \
-H "Content-Type: application/json" \
-d '{
"token": "abcdefghilmnopqrstuvz1234567890",
"campaign_name": "demo_api",
"message_id": "KW2025101616382159d76b"
}'
Ejemplo de respuesta¶
{
"success": true,
"campaign_name": "demo_api",
"message_alias_id": "KW2025101616382159d76b",
"phone": "5491112345678",
"current_status": "read",
"timestamps": {
"created_at": "2025-10-16 16:38:24",
"sent_at": "2025-10-16 16:38:24"
},
"events": [
{ "status": "sent", "timestamp": "2025-10-16 16:38:26" },
{ "status": "delivered", "timestamp": "2025-10-16 16:38:26" },
{ "status": "read", "timestamp": "2025-10-16 16:39:27" }
]
}
Campos de la respuesta¶
| Campo | Descripción |
|---|---|
current_status |
Último estado registrado del mensaje. |
events |
Historial completo de estados (sent, delivered, read, failed). |
timestamps |
Momentos registrados en Kewbot al crear y enviar el mensaje. |
message_alias_id |
El mismo ID recibido al enviar el mensaje en el Paso 1. |
Buenas prácticas¶
- Guardar el
message_iden la base de datos del cliente al momento del envío. - Configurar el endpoint receptor con SSL válido y acceso HTTPS público.
- Responder siempre a Kewbot con
{"status": "OK"}para confirmar la recepción del evento. - Evitar polling masivo; usar
checkMessagesolo cuando se requiera verificar el estado puntual de un envío.