Resumen
La API de Integración de cshub es el camino externo para enviar mensajes de WhatsApp desde tu backend o herramientas de automatización. Utiliza una Clave API Local por negocio para la autenticación (coincidiendo con el comportamiento de Laravel de whatscrmhub). Este endpoint es separado de los endpoints internos utilizados por el panel de cshub + la app móvil.
Base URL
https://api.cshub.id/api/v1
Content-Type
application/json
Autenticación
La autenticación utiliza una Clave API Local dentro del cuerpo de la solicitud (campo `api_key`), no en un encabezado HTTP. Cada negocio tiene una Clave API Local (UUID) que se genera automáticamente cuando se crea el negocio.
Sin JWT, sin encabezados de token
A diferencia de los endpoints internos del panel, solo pones `api_key` en el cuerpo y el servidor resuelve el negocio desde allí. Trata tu Clave API Local como una contraseña: nunca la commits en repos públicos ni la expongas en código del frontend.
Cómo obtener la Clave API Local
- Inicia sesión en el panel de cshub en /app.
- Abre Configuración → Clave API (o Perfil → Integración).
- Copia la Clave API Local. Puedes regenerarla en cualquier momento: la clave antigua se vuelve inválida de inmediato.
Endpoint
Un solo endpoint cubre cada envío de WhatsApp No Oficial (whatsmeow). Elige method = text para mensajes de formato libre, o method = template para enviar una plantilla que ya configuraste en el panel.
https://api.cshub.id/api/v1/integration/whatsapp/send-message
Autenticación
Clave API Local en el cuerpo (`api_key`)
Límite de tasa
Por dispositivo (sigue el límite de envío diario del dispositivo)
Campos del cuerpo
El cuerpo es JSON. Los campos a continuación son paridad con whatscrmhub Laravel: al migrar desde la versión anterior, la forma de la solicitud es idéntica.
| Field | Type | Required | Descripción |
|---|---|---|---|
| api_key | string | ✅ | Clave API Local por negocio (UUID). Obténla de Configuración en el panel de cshub. |
| phone | string | ✅ | Teléfono del destinatario en formato internacional sin "+" (por ejemplo, 6281234567890), o un JID de grupo cuando `is_group` es verdadero. |
| method | string | ✅ | text, template |
| text | string | method=text | Cuerpo del mensaje. Requerido cuando method = text. |
| template | string | method=template | ID de Plantilla de Mensaje creada en el panel de cshub. Requerido cuando method = template. |
| variables | object | — | Objeto literal `{placeholder: value}` para sustitución de plantilla. Ejemplo: `{"$name":"Budi"}` reemplaza cada `$name` en el mensaje de plantilla con "Budi". |
| device_key | string | depende * | UUID del dispositivo de WhatsApp desde el cual enviar. |
| is_group | boolean | — | Establecer en verdadero si `phone` es un JID de grupo (por ejemplo, 120363...@g.us). |
Ejemplos de solicitud
1. Enviar un mensaje de texto simple
curl -X POST "https://api.cshub.id/api/v1/integration/whatsapp/send-message" \
-H "Content-Type: application/json" \
-d '{
"api_key": "<LOCAL_API_KEY>",
"device_key": "<DEVICE_ID>",
"phone": "6281234567890",
"method": "text",
"text": "Halo, makasih udah order ya!"
}'
2. Enviar una plantilla con sustitución de variables
curl -X POST "https://api.cshub.id/api/v1/integration/whatsapp/send-message" \
-H "Content-Type: application/json" \
-d '{
"api_key": "<LOCAL_API_KEY>",
"device_key": "<DEVICE_ID>",
"phone": "6281234567890",
"method": "template",
"template": "<TEMPLATE_ID>",
"variables": {
"$name": "Pak Budi",
"$order_id": "INV-20260602-001"
}
}'
3. Enviar a un grupo (usar JID de grupo)
curl -X POST "https://api.cshub.id/api/v1/integration/whatsapp/send-message" \
-H "Content-Type: application/json" \
-d '{
"api_key": "<LOCAL_API_KEY>",
"device_key": "<DEVICE_ID>",
"phone": "120363012345678901@g.us",
"method": "text",
"text": "Pengumuman: order minggu ini ditutup pukul 17:00.",
"is_group": true
}'
Respuesta de éxito (200 OK)
{
"status": true,
"message": "berhasil mengirim pesan"
}
Códigos de error y soluciones
| Status | Causa | Solución |
|---|---|---|
| 401 | Api Key Cannot be recognized | Verifica que la api_key sea correcta (copia nuevamente desde el panel) y que el negocio no esté suspendido. |
| 401 | Device tidak di temukan | Verifica que device_key sea válido y que el dispositivo esté activo. Reparea el dispositivo a través de QR/código de emparejamiento en el panel si es necesario. |
| 401 | Template tidak dikenali | Verifica que el ID de plantilla sea correcto y pertenezca a tu negocio (la lista de plantillas está en panel → Datos Maestros → Plantillas). |
| 422 | Daily send limit habis | Espera el reinicio diario (00:00 WIB) o cambia a otro dispositivo. Aumenta el limit_per_day en el dispositivo si es necesario. |
| 422 | Validation gagal (phone/method/text) | Asegúrate de que el teléfono esté en formato internacional sin "+" y que el método sea uno de text/template. |
| 502 | WhatsApp service unavailable | El servicio de WhatsApp está caído. Intenta de nuevo en unos minutos o verifica el estado del dispositivo en el panel. |
Notas y límites
- Hay un límite de daily_send por dispositivo. Evita enviar más de ~10 mensajes/segundo desde un solo dispositivo para evitar prohibiciones de WhatsApp.
- Si tu negocio tiene `api_device_use = required`, el campo `device_key` es obligatorio. Con él opcional, el servidor elige un dispositivo activo basado en la configuración de `whatsapp_sender_notif` (`sequence` / `spin` / `random`).
- La sustitución de variables utiliza `str_replace` literal: los marcadores de posición pueden ser cualquier cadena (por ejemplo, `$name`, `{name}`, `[NAME]`). Solo necesita coincidir exactamente con el texto dentro del mensaje de plantilla.
- Siempre formatea sin "+" y sin espacios/guiones. Ejemplo: 6281234567890 (Indonesia), 60123456789 (Malasia). Para grupos, usa el JID completo con el sufijo `@g.us`.
- Iteración MVP: la carga de archivos binarios a través de multipart/form-data aún no es compatible. Para enviar medios, usa method=template con una plantilla que ya tenga una imagen configurada en el panel.
API de Integración vs API de Panel Interno
cshub mantiene deliberadamente dos caminos para enviar mensajes. La API de Integración es para desarrolladores de terceros y automatización; la API Interna alimenta el panel web de cshub y la app móvil. Diferente audiencia, diferente autenticación, diferente forma de respuesta.
| Integration API | API de Panel Interno | |
|---|---|---|
| Audiencia | Desarrolladores de backend, Zapier, n8n, integraciones personalizadas | panel web cshub-fe, app móvil cshub |
| URL | /integration/whatsapp/send-message | /app/device/{id}/chats/send |
| Autenticación | api_key di body | JWT Bearer + X-Business-ID + CSRF |
| Forma de respuesta | {status, message} | {success, message, data} |
¿Listo para integrar?
Inicia sesión en el panel de cshub, obtén tu Clave API Local de Configuración y comienza a enviar WhatsApp desde tu sistema.