API d'Intégration · WhatsApp Unofficial

Envoyer WhatsApp via l'API d'Intégration

Un point de terminaison sans état pour envoyer des messages WhatsApp depuis ton application ou système en utilisant une clé API locale — pas de JWT, pas de flux de connexion. Conçu pour les intégrations backend, outils d'automatisation (Zapier/n8n), ou webhooks personnalisés.

Aperçu

L'API d'intégration cshub est le chemin externe pour envoyer des messages WhatsApp depuis ton backend ou tes outils d'automatisation. Elle utilise une clé API locale par entreprise pour l'authentification (correspondant au comportement Laravel de whatscrmhub). Ce point de terminaison est séparé des points de terminaison internes utilisés par le panneau cshub + l'application mobile.

Base URL

https://api.cshub.id/api/v1

Content-Type

application/json

Authentification

L'auth utilise une clé API locale dans le corps de la requête (`api_key`), pas dans un en-tête HTTP. Chaque entreprise a une clé API locale (UUID) qui est générée automatiquement lors de la création de l'entreprise.

Pas de JWT, pas d'en-têtes de token

Contrairement aux points de terminaison internes du panneau, tu mets simplement `api_key` dans le corps et le serveur résout l'entreprise à partir de là. Traite ta clé API locale comme un mot de passe — ne la commets jamais dans des dépôts publics ou ne l'expose pas dans le code frontend.

Comment obtenir la clé API locale

  1. Connecte-toi au panneau cshub à /app.
  2. Ouvre Paramètres → Clé API (ou Profil → Intégration).
  3. Copie la clé API locale. Tu peux la régénérer à tout moment — l'ancienne clé devient immédiatement invalide.

Point de terminaison

Un seul point de terminaison couvre chaque envoi WhatsApp non officiel (whatsmeow). Choisis method = text pour des messages libres, ou method = template pour envoyer un modèle que tu as déjà configuré dans le panneau.

POST https://api.cshub.id/api/v1/integration/whatsapp/send-message

Auth

Clé API locale dans le corps (`api_key`)

Limite de taux

Par appareil (suit la limite daily_send de l'appareil)

Champs du corps

Le corps est en JSON. Les champs ci-dessous sont en parité avec whatscrmhub Laravel — en migrant de l'ancienne version, la forme de la requête est identique.

Field Type Required Description
api_keystring✅Clé API locale par entreprise (UUID). Prends-la dans Paramètres dans le panneau cshub.
phonestring✅Numéro de téléphone du destinataire au format international sans "+" (par exemple 6281234567890), ou un JID de groupe lorsque `is_group` est vrai.
methodstring✅text, template
textstringmethod=textCorps du message. Requis lorsque method = text.
templatestringmethod=templateID de modèle de message créé dans le panneau cshub. Requis lorsque method = template.
variablesobject—Objet littéral `{placeholder: value}` pour la substitution de modèle. Exemple : `{"$name":"Budi"}` remplace chaque `$name` dans le message modèle par "Budi".
device_keystringdépend *UUID de l'appareil WhatsApp à partir duquel envoyer.
is_groupboolean—Mettre vrai si `phone` est un JID de groupe (par exemple 120363...@g.us).

Exemples de requêtes

1. Envoyer un simple message texte

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. Envoyer un modèle avec substitution de variable

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. Envoyer à un groupe (utiliser le JID de groupe)

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
  }'

Réponse de succès (200 OK)

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

Codes d'erreur & corrections

Status Cause Correction
401Api Key Cannot be recognizedVérifie que la api_key est correcte (copie à nouveau depuis le panneau) et que l'entreprise n'est pas suspendue.
401Device tidak di temukanVérifie que device_key est valide et que l'appareil est actif. Réassocie l'appareil via QR/code de couplage dans le panneau si nécessaire.
401Template tidak dikenaliVérifie que l'ID de modèle est correct et appartient à ton entreprise (la liste des modèles se trouve dans le panneau → Données maîtres → Modèles).
422Daily send limit habisAttends la réinitialisation quotidienne (00:00 WIB) ou passe à un autre appareil. Augmente la limit_per_day sur l'appareil si nécessaire.
422Validation gagal (phone/method/text)Assure-toi que le téléphone est au format international sans "+" et que la méthode est l'une des text/template.
502WhatsApp service unavailableLe service WhatsApp est en panne. Réessaie dans quelques minutes ou vérifie l'état de l'appareil dans le panneau.

Notes & limites

  • Il y a une limite daily_send par appareil. Évite d'envoyer plus de ~10 messages/seconde depuis un seul appareil pour éviter les interdictions de WhatsApp.
  • Si ton entreprise a `api_device_use = required`, le champ `device_key` est obligatoire. Avec cela en option, le serveur choisit un appareil actif basé sur le paramètre `whatsapp_sender_notif` (`sequence` / `spin` / `random`).
  • La substitution de variable utilise `str_replace` littéral — les espaces réservés peuvent être n'importe quelle chaîne (par exemple, `$name`, `{name}`, `[NAME]`). Il doit juste correspondre exactement au texte à l'intérieur du message modèle.
  • Toujours formater sans "+" et sans espaces/tracés. Exemple : 6281234567890 (Indonésie), 60123456789 (Malaisie). Pour les groupes, utilise le JID complet avec le suffixe `@g.us`.
  • Itération MVP : le téléchargement de fichiers binaires via multipart/form-data n'est pas encore pris en charge. Pour envoyer des médias, utilise method=template avec un modèle qui a déjà une image configurée dans le panneau.

API d'intégration vs API du panneau interne

cshub garde délibérément deux chemins d'envoi de messages. L'API d'intégration est destinée aux développeurs tiers et à l'automatisation ; l'API interne alimente le panneau web cshub et l'application mobile. Public différent, auth différent, forme de réponse différente.

Integration API API du panneau interne
PublicDéveloppeurs backend, Zapier, n8n, intégrations personnaliséesPanneau web cshub-fe, application mobile cshub
URL/integration/whatsapp/send-message/app/device/{id}/chats/send
Authapi_key di bodyJWT Bearer + X-Business-ID + CSRF
Forme de réponse{status, message}{success, message, data}

Prêt à intégrer ?

Connecte-toi au panneau cshub, prends ta clé API locale dans Paramètres, et commence à envoyer des WhatsApp depuis ton système.