Documentation
wadadaAPI expose une API REST au-dessus de WhatsApp Web. Toutes les requêtes et réponses sont en JSON. Base URL :
https://api.wadadaapi.com
Chaque réponse a la forme { "success": true, "data": ... } ou, en cas d'erreur, { "success": false, "message": "..." }.
Authentification
wadadaAPI utilise deux types d'identifiants distincts :
- Token de compte (JWT)
Obtenu via
/auth/login. Utilisé pour gérer ton compte : sessions, clés API, facturation. Envoyé en headerAuthorization: Bearer <token>. - Clé API
Générée depuis le dashboard, scopée à une session précise. Utilisée pour les endpoints de messagerie. Même header :
Authorization: Bearer wda_....
Comptes
/auth/registerCréer un compte
| Paramètre | Type | Description |
|---|---|---|
| email* | string | Adresse email |
| password* | string | 8 caractères minimum |
| name | string | Optionnel |
curl -X POST https://api.wadadaapi.com/auth/register \
-H "Content-Type: application/json" \
-d '{"email":"toi@exemple.com","password":"motdepasse123","name":"Toi"}'
# → { "success": true, "data": { "token": "eyJ...", "account": { "id": "...", "email": "toi@exemple.com" } } }/auth/loginSe connecter
| Paramètre | Type | Description |
|---|---|---|
| email* | string | Adresse email |
| password* | string | Mot de passe |
curl -X POST https://api.wadadaapi.com/auth/login \
-H "Content-Type: application/json" \
-d '{"email":"toi@exemple.com","password":"motdepasse123"}'Sessions
Une session = un numéro WhatsApp connecté. Tous les endpoints ci-dessous demandent le token de compte. Créer une session requiert un plan actif.
/api/sessionsCréer une session
| Paramètre | Type | Description |
|---|---|---|
| name* | string | Nom de la session |
| phoneNumber | string | Indicatif pays + numéro, chiffres uniquement (ex: 15551234567). Fourni → renvoie un code de jumelage au lieu d'un QR |
| webhookUrl | string | URL qui recevra les events |
| webhookSecret | string | Pour signer les webhooks (HMAC) |
| webhookEvents | string[] | Défaut: session.status, message.received — voir Webhooks |
| accountProtection | boolean | Défaut: true |
| messageLogging | boolean | Défaut: true |
| ignoreGroups | boolean | Défaut: false |
| ignoreBroadcasts | boolean | Défaut: false |
| ignoreChannels | boolean | Défaut: false |
curl -X POST https://api.wadadaapi.com/api/sessions \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{"name":"support-client"}'
# → { "success": true, "data": { "id": "...", "status": "QR_PENDING" } }/api/sessionsLister les sessions
curl https://api.wadadaapi.com/api/sessions \ -H "Authorization: Bearer <token>"
/api/sessions/:id/statusStatut d'une session
Retourne le QR code (base64) ou le code de jumelage tant que le statut est QR_PENDING, selon la méthode choisie à la création.
curl https://api.wadadaapi.com/api/sessions/<id>/status \
-H "Authorization: Bearer <token>"
# → { "success": true, "data": { "status": "CONNECTED", "phoneNumber": "225...", "qr": null, "pairingCode": null, ... } }/api/sessions/:idModifier une session
| Paramètre | Type | Description |
|---|---|---|
| name | string | Nouveau nom |
| webhookUrl | string | null | null pour désactiver |
| webhookSecret | string | null | Omis = inchangé |
| webhookEvents | string[] | Remplace la liste complète |
| accountProtection | boolean | |
| messageLogging | boolean | |
| ignoreGroups | boolean | |
| ignoreBroadcasts | boolean | |
| ignoreChannels | boolean |
/api/sessions/:idSupprimer une session
Déconnecte le numéro et supprime toutes ses données.
/api/sessions/activityActivité récente
Les 20 derniers événements, toutes sessions confondues.
/api/sessions/:id/test-sendEnvoyer un message de test
Envoie un vrai message depuis cette session, sans avoir besoin d'une clé API séparée.
| Paramètre | Type | Description |
|---|---|---|
| to* | string | |
| text* | string |
/api/sessions/:id/webhook-testSimuler un webhook
Déclenche un événement webhook.testsynthétique vers l'URL configurée, pour vérifier ton endpoint sans attendre un vrai message.
Clés API
/api/api-keysGénérer une clé
| Paramètre | Type | Description |
|---|---|---|
| sessionId* | string | Session Ă scoper |
| label | string | Optionnel |
La clé en clair (apiKey) n'est retournée qu'une seule fois, à la création.
/api/api-keysLister les clés
/api/api-keys/:idRévoquer une clé
Messagerie
Authentifié par clé API. La session doit être CONNECTED (sinon 409).
/api/statusStatut de la session liée à la clé
/api/send-messageEnvoyer un texte
| Paramètre | Type | Description |
|---|---|---|
| to* | string | Numéro, avec indicatif pays |
| text* | string | Contenu du message |
curl -X POST https://api.wadadaapi.com/api/send-message \
-H "Authorization: Bearer wda_..." \
-H "Content-Type: application/json" \
-d '{"to":"22501020304","text":"Bienvenue !"}'
# → { "success": true, "data": { "messageId": "3EB0..." } }/api/send-mediaEnvoyer un média
| Paramètre | Type | Description |
|---|---|---|
| to* | string | |
| mediaUrl* | string | URL publique du fichier |
| mediaType* | image | video | audio | document | |
| caption | string | |
| filename | string | Pour mediaType=document |
/api/send-imageEnvoyer une image (raccourci)
| Paramètre | Type | Description |
|---|---|---|
| to* | string | |
| imageUrl* | string | |
| caption | string |
/api/send-fileEnvoyer un fichier (raccourci)
| Paramètre | Type | Description |
|---|---|---|
| to* | string | |
| fileUrl* | string | |
| filename | string | |
| caption | string |
/api/send-typingIndicateur de frappe
| Paramètre | Type | Description |
|---|---|---|
| to* | string | |
| state | composing | paused | Défaut: composing |
/api/messages/:id/readMarquer comme lu
| Paramètre | Type | Description |
|---|---|---|
| remoteJid* | string | JID de la conversation |
| fromMe | boolean | Défaut: false |
/api/decrypt-mediaDéchiffrer un média reçu
Prend l'objet message brut reçu via webhook et retourne le fichier en base64.
| Paramètre | Type | Description |
|---|---|---|
| message* | object | Message brut reçu via webhook |
Webhooks
Si webhookUrl est configuré sur une session, wadadaAPI y envoie un POST pour chaque événement auquel la session est abonnée (webhookEvents). Par défaut : session.status et message.received.
| Événement | Description |
|---|---|
| session.status | Changement de statut : QR_PENDING, CONNECTED, DISCONNECTED, LOGGED_OUT |
| message.received | Nouveau message entrant |
| message.sent | Message envoyé (API ou dashboard) |
| qrcode.updated | Nouveau QR code disponible |
| messages.update | Statut d'un message existant modifié |
| messages.delete | Message supprimé |
| message-receipt.update | Accusé de réception (livré/lu) |
| messages.reaction | Réaction (emoji) sur un message |
| chats.upsert | Conversation créée |
| chats.update | Conversation mise Ă jour |
| chats.delete | Conversation supprimée |
| groups.upsert | Groupe créé |
| groups.update | Métadonnées de groupe mises à jour |
| group-participants.update | Participants d'un groupe modifiés |
| contacts.upsert | Contact ajouté |
| contacts.update | Contact mis Ă jour |
| call | Appel entrant ou sortant |
ignoreGroups, ignoreBroadcasts et ignoreChannels permettent d'exclure ces conversations de la livraison des webhooks (et du journal d'activité) sans changer les abonnements.
Chaque requête est signée avec ton webhookSecret — vérifie le header x-wadada-signature :
const crypto = require("crypto");
function isValid(rawBody, signatureHeader, secret) {
const expected = crypto.createHmac("sha256", secret).update(rawBody).digest("hex");
return expected === signatureHeader;
}// Exemple de payload reçu
{
"event": "message.received",
"sessionId": "cms...",
"data": {
"messages": {
"key": { "remoteJid": "225...@s.whatsapp.net", "fromMe": false, "id": "..." },
"message": { "conversation": "Bonjour !" }
}
}
}Facturation
Authentifié par token de compte.
/api/billing/statusStatut de l'abonnement
# → { "success": true, "data": {
# "plan": "PRO", "subscriptionStatus": "TRIALING",
# "trialEndsAt": "...", "sessionLimit": 3, "sessionsUsed": 1
# } }/api/billing/checkoutDémarrer un abonnement
| Paramètre | Type | Description |
|---|---|---|
| plan* | BASIC | PRO | PLUS | BUSINESS |
Retourne une URL Stripe Checkout (essai gratuit de 7 jours inclus).
/api/billing/portalGérer l'abonnement
Retourne une URL vers le Stripe Customer Portal.