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 header Authorization: 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

POST/auth/register

Créer un compte

ParamètreTypeDescription
email*stringAdresse email
password*string8 caractères minimum
namestringOptionnel
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" } } }
POST/auth/login

Se connecter

ParamètreTypeDescription
email*stringAdresse email
password*stringMot 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.

POST/api/sessions

Créer une session

ParamètreTypeDescription
name*stringNom de la session
phoneNumberstringIndicatif pays + numéro, chiffres uniquement (ex: 15551234567). Fourni → renvoie un code de jumelage au lieu d'un QR
webhookUrlstringURL qui recevra les events
webhookSecretstringPour signer les webhooks (HMAC)
webhookEventsstring[]Défaut: session.status, message.received — voir Webhooks
accountProtectionbooleanDéfaut: true
messageLoggingbooleanDéfaut: true
ignoreGroupsbooleanDéfaut: false
ignoreBroadcastsbooleanDéfaut: false
ignoreChannelsbooleanDé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" } }
GET/api/sessions

Lister les sessions

curl https://api.wadadaapi.com/api/sessions \
  -H "Authorization: Bearer <token>"
GET/api/sessions/:id/status

Statut 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, ... } }
PATCH/api/sessions/:id

Modifier une session

ParamètreTypeDescription
namestringNouveau nom
webhookUrlstring | nullnull pour désactiver
webhookSecretstring | nullOmis = inchangé
webhookEventsstring[]Remplace la liste complète
accountProtectionboolean
messageLoggingboolean
ignoreGroupsboolean
ignoreBroadcastsboolean
ignoreChannelsboolean
DELETE/api/sessions/:id

Supprimer une session

Déconnecte le numéro et supprime toutes ses données.

GET/api/sessions/activity

Activité récente

Les 20 derniers événements, toutes sessions confondues.

POST/api/sessions/:id/test-send

Envoyer un message de test

Envoie un vrai message depuis cette session, sans avoir besoin d'une clé API séparée.

ParamètreTypeDescription
to*string
text*string
POST/api/sessions/:id/webhook-test

Simuler 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

POST/api/api-keys

Générer une clé

ParamètreTypeDescription
sessionId*stringSession Ă  scoper
labelstringOptionnel

La clé en clair (apiKey) n'est retournée qu'une seule fois, à la création.

GET/api/api-keys

Lister les clés

DELETE/api/api-keys/:id

Révoquer une clé

Messagerie

Authentifié par clé API. La session doit être CONNECTED (sinon 409).

GET/api/status

Statut de la session liée à la clé

POST/api/send-message

Envoyer un texte

ParamètreTypeDescription
to*stringNuméro, avec indicatif pays
text*stringContenu 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..." } }
POST/api/send-media

Envoyer un média

ParamètreTypeDescription
to*string
mediaUrl*stringURL publique du fichier
mediaType*image | video | audio | document
captionstring
filenamestringPour mediaType=document
POST/api/send-image

Envoyer une image (raccourci)

ParamètreTypeDescription
to*string
imageUrl*string
captionstring
POST/api/send-file

Envoyer un fichier (raccourci)

ParamètreTypeDescription
to*string
fileUrl*string
filenamestring
captionstring
POST/api/send-typing

Indicateur de frappe

ParamètreTypeDescription
to*string
statecomposing | pausedDéfaut: composing
POST/api/messages/:id/read

Marquer comme lu

ParamètreTypeDescription
remoteJid*stringJID de la conversation
fromMebooleanDéfaut: false
POST/api/decrypt-media

Déchiffrer un média reçu

Prend l'objet message brut reçu via webhook et retourne le fichier en base64.

ParamètreTypeDescription
message*objectMessage 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énementDescription
session.statusChangement de statut : QR_PENDING, CONNECTED, DISCONNECTED, LOGGED_OUT
message.receivedNouveau message entrant
message.sentMessage envoyé (API ou dashboard)
qrcode.updatedNouveau QR code disponible
messages.updateStatut d'un message existant modifié
messages.deleteMessage supprimé
message-receipt.updateAccusé de réception (livré/lu)
messages.reactionRéaction (emoji) sur un message
chats.upsertConversation créée
chats.updateConversation mise Ă  jour
chats.deleteConversation supprimée
groups.upsertGroupe créé
groups.updateMétadonnées de groupe mises à jour
group-participants.updateParticipants d'un groupe modifiés
contacts.upsertContact ajouté
contacts.updateContact mis Ă  jour
callAppel 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.

GET/api/billing/status

Statut de l'abonnement

# → { "success": true, "data": {
#   "plan": "PRO", "subscriptionStatus": "TRIALING",
#   "trialEndsAt": "...", "sessionLimit": 3, "sessionsUsed": 1
# } }
POST/api/billing/checkout

Démarrer un abonnement

ParamètreTypeDescription
plan*BASIC | PRO | PLUS | BUSINESS

Retourne une URL Stripe Checkout (essai gratuit de 7 jours inclus).

POST/api/billing/portal

Gérer l'abonnement

Retourne une URL vers le Stripe Customer Portal.