API de Integración · WhatsApp Unofficial

Enviar WhatsApp a través de la API de Integración

Un punto final sin estado para enviar mensajes de WhatsApp desde tu aplicación o sistema usando una Clave API Local — sin JWT, sin flujo de inicio de sesión. Diseñado para integraciones de backend, herramientas de automatización (Zapier/n8n) o webhooks personalizados.

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

  1. Inicia sesión en el panel de cshub en /app.
  2. Abre Configuración → Clave API (o Perfil → Integración).
  3. 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.

POST 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_keystring✅Clave API Local por negocio (UUID). Obténla de Configuración en el panel de cshub.
phonestring✅Teléfono del destinatario en formato internacional sin "+" (por ejemplo, 6281234567890), o un JID de grupo cuando `is_group` es verdadero.
methodstring✅text, template
textstringmethod=textCuerpo del mensaje. Requerido cuando method = text.
templatestringmethod=templateID de Plantilla de Mensaje creada en el panel de cshub. Requerido cuando method = template.
variablesobject—Objeto literal `{placeholder: value}` para sustitución de plantilla. Ejemplo: `{"$name":"Budi"}` reemplaza cada `$name` en el mensaje de plantilla con "Budi".
device_keystringdepende *UUID del dispositivo de WhatsApp desde el cual enviar.
is_groupboolean—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
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
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
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)

200 OK
{
  "status": true,
  "message": "berhasil mengirim pesan"
}

Códigos de error y soluciones

Status Causa Solución
401Api Key Cannot be recognizedVerifica que la api_key sea correcta (copia nuevamente desde el panel) y que el negocio no esté suspendido.
401Device tidak di temukanVerifica 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.
401Template tidak dikenaliVerifica que el ID de plantilla sea correcto y pertenezca a tu negocio (la lista de plantillas está en panel → Datos Maestros → Plantillas).
422Daily send limit habisEspera el reinicio diario (00:00 WIB) o cambia a otro dispositivo. Aumenta el limit_per_day en el dispositivo si es necesario.
422Validation 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.
502WhatsApp service unavailableEl 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
AudienciaDesarrolladores de backend, Zapier, n8n, integraciones personalizadaspanel web cshub-fe, app móvil cshub
URL/integration/whatsapp/send-message/app/device/{id}/chats/send
Autenticaciónapi_key di bodyJWT 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.