v1.0.0 LIVE
API DOCUMENTATION · v1.0.0

Une API
pensée pour les développeurs.

WA API expose un ensemble complet d'endpoints REST pour piloter votre socket WhatsApp, gérer vos tokens, suivre vos quotas et administrer votre service. Rapide, prévisible, sans SDK obligatoire.

15
Endpoints
23
Commandes
JSON
REST · HTTP
99.9%
Uptime

Bienvenue sur WA API.

WA API est un service HTTP qui reçoit vos requêtes, vérifie votre token, applique vos quotas, puis exécute une commande directement via votre propre socket WhatsApp. Le socket n'est jamais stocké côté serveur : chaque requête est indépendante et auditée.

Ce que vous pouvez faire

  • Générer et gérer des tokens API avec quota journalier.
  • Exécuter 23 commandes WhatsApp (individuelles et groupes) via POST /v1/command.
  • Consulter votre historique et vos statistiques d'utilisation.
  • Administrer les tokens, la maintenance et les logs via l'espace admin.
i
Format universelToutes les réponses sont au format JSON UTF-8. Toutes les requêtes avec un corps doivent envoyer un Content-Type: application/json.

URL de base & versionnement.

Tous les endpoints utilisateur sont préfixés par /v1. Les endpoints administrateurs sont préfixés par /admin. La version 1.0.0 est stable.

Base URL
https://api.web.togehost.online

Trois étapes pour votre première requête.

Générez un token, ouvrez votre socket WhatsApp avec Baileys, puis envoyez votre première commande. Aucun SDK n'est requis : un simple curl ou axios suffit.

1. Générer un token

cURL
curl -X POST https://api.web.togehost.online/v1/token/generate \
  -H "Content-Type: application/json" \
  -d '{"label":"mon-bot","owner_name":"Alice"}'

2. Vérifier votre statut

cURL
curl https://api.web.togehost.online/v1/status \
  -H "x-api-token: VOTRE_TOKEN"

3. Exécuter une commande

cURL
curl -X POST https://api.web.togehost.online/v1/command \
  -H "Content-Type: application/json" \
  -H "x-api-token: VOTRE_TOKEN" \
  -d '{"type":"delay","number":"33612345678","sock": { /* votre socket Baileys */ }}'
Prêt à copier-collerUn client Node.js complet, avec Baileys intégré, est disponible plus bas dans Exemple de client.

Authentification par token.

Deux niveaux d'accès. Le token utilisateur donne accès aux endpoints /v1. Le token administrateur, unique et défini côté serveur, donne accès aux endpoints /admin.

Token utilisateur

Généré à la volée via POST /v1/token/generate. À transmettre dans l'en-tête x-api-token.

x-api-token: 9f31a2b7c4d5...

Token administrateur

Défini via la variable d'environnement ADMIN_TOKEN. Préfixé par ADMIN~. À transmettre dans l'en-tête x-admin-token.

x-admin-token: ADMIN~pEBOFWMh...
!
Ne partagez jamais vos tokensLe token vaut identifiant + mot de passe. Tout appel effectué avec votre token est comptabilisé sur votre quota, imputé à votre journal d'audit et peut déclencher un blocage anti-ban.

Tokens & cycle de vie.

Chaque token est une chaîne aléatoire de 64 caractères hexadécimaux. Il peut porter un label et un owner_name pour l'identifier dans le tableau de bord.

  • Création : instantanée, sans validation email.
  • Validité : illimitée par défaut. Peut être bornée par TOKEN_VALIDITY_DAYS.
  • Désactivation : un admin peut désactiver ou supprimer un token à tout moment.
  • Expiration : renvoie 403 avec error: "Token expiré.".

Quotas journaliers.

Chaque token dispose d'une limite quotidienne (par défaut 50 commandes). Le compteur se réinitialise à minuit UTC. Le quota restant est renvoyé dans chaque réponse de POST /v1/command.

Extrait de réponse
{
  "success": true,
  "command": "delay",
  "target": "33612345678",
  "quota": {
    "used_today": 12,
    "limit": 50,
    "remaining": 38
  }
}
Quota dépasséUne fois la limite atteinte, l'API répond 429 Too Many Requests jusqu'à minuit UTC.

Système anti-ban.

Pour protéger les comptes WhatsApp, l'API limite à ANTI_BAN_MAX commandes par ANTI_BAN_WIN millisecondes (par défaut : 3 commandes / heure glissante). Au-delà, le token est temporairement bloqué.

Réponse en cas de blocage
{
  "error": "Trop de commandes récentes. Réessayez plus tard.",
  "code": "ANTI_BAN",
  "unblockAt": "2026-07-01T14:32:11.000Z",
  "retryAfterMinutes": 42
}

Mode maintenance.

Lorsqu'un admin active le mode maintenance, toutes les routes hors /admin répondent avec un 503 et un message personnalisable. Utile pour les migrations ou les correctifs urgents.

Votre socket WhatsApp.

Contrairement à d'autres services, WA API n'héberge pas votre session WhatsApp. Vous ouvrez le socket avec @whiskeysockets/baileys et le passez dans chaque requête via le champ sock. Le socket doit exposer relayMessage ou sendMessage.

i
Pourquoi ce choix ?Aucune session sensible n'est stockée côté serveur. Vous gardez le contrôle total de vos identifiants WhatsApp.

Endpoints publics.

Ces endpoints ne nécessitent aucun token. Ils exposent les informations générales et permettent la génération d'un token utilisateur.

GET /health État du service et flag maintenance PUBLIC +
Description

Renvoie l'état du service, sa version et l'état du mode maintenance. Utilisez cet endpoint pour vos sondes de disponibilité (uptime checks).

Paramètres

Aucun.

Réponse — 200
statusToujours "ok".
versionVersion de l'API.
timestampHorodatage ISO 8601.
maintenanceBooléen — true si la maintenance est active.
Requête
cURL
curl https://api.web.togehost.online/health
Réponse
JSON · 200
{
  "status": "ok",
  "version": "1.0.0",
  "timestamp": "2026-07-01T12:34:56.000Z",
  "maintenance": false
}
POST /v1/token/generate Créer un nouveau token utilisateur PUBLIC +
Description

Génère un token API aléatoire. Le token est renvoyé une seule fois — conservez-le précieusement.

Corps de la requête
labelOPTLibellé humain, ex. "mon-bot".string
owner_nameOPTNom du propriétaire.string
Réponse — 201
tokenLe token API généré.string (64 hex)
daily_limitQuota quotidien attribué.integer
expires_atDate d'expiration ou null.string | null
usageRappel des endpoints à utiliser.object
Requête
cURL
curl -X POST https://api.web.togehost.online/v1/token/generate \
  -H "Content-Type: application/json" \
  -d '{"label":"mon-bot","owner_name":"Alice"}'
Réponse
JSON · 201
{
  "success": true,
  "token": "9f31a2b7c4d5e6f7a8b9c0d1e2f3...",
  "daily_limit": 50,
  "expires_at": null,
  "message": "✅ Token créé. Gardez-le secret. Limite : 50 commandes/jour."
}
GET /v1/commands Catalogue de toutes les commandes disponibles PUBLIC +
Description

Renvoie la liste exhaustive des commandes exécutables, leur description et leurs paramètres attendus. Idéal pour construire dynamiquement une aide dans votre client.

Réponse — 200
commandsTableau d'objets { name, params, description }.array
noteRappels sur les valeurs par défaut.string
socket_requiredRappel sur l'obligation du sock.string
Requête
cURL
curl https://api.web.togehost.online/v1/commands
Réponse (extrait)
JSON · 200
{
  "success": true,
  "commands": [
    { "name": "delay",  "params": ["number"], "description": "Delay – ..." },
    { "name": "freeze", "params": ["number"], "description": "Freeze – ..." }
  ],
  "note": "repeat max: 100 (défaut: 30). number = code_pays + numéro (sans +)."
}

Endpoints utilisateur.

Nécessitent l'en-tête x-api-token. Ils permettent d'exécuter des commandes, de consulter votre statut et votre historique.

GET /v1/status Détails du token, quota et anti-ban AUTH +
Description

Retourne les informations complètes de votre token, votre utilisation du jour et l'état de votre fenêtre anti-ban.

En-têtes
x-api-tokenREQVotre token utilisateur.string
Réponse — 200
tokenMétadonnées { label, owner, active, created_at, expires_at }.
usage{ today, limit, remaining, reset_at }.
anti_ban{ blocked, unblockAt?, retryAfterMinutes? }.
Requête
cURL
curl https://api.web.togehost.online/v1/status \
  -H "x-api-token: VOTRE_TOKEN"
Réponse
JSON · 200
{
  "success": true,
  "token": {
    "label": "mon-bot",
    "owner": "Alice",
    "active": true,
    "created_at": "2026-06-30T09:12:00.000Z",
    "expires_at": null
  },
  "usage": { "today": 12, "limit": 50, "remaining": 38, "reset_at": "Minuit (UTC)" },
  "anti_ban": { "blocked": false }
}
POST /v1/command Exécuter une commande via votre socket AUTH +
Description

Endpoint principal. Exécute une commande WhatsApp (bug, freeze, crash, etc.) en utilisant votre socket Baileys transmis dans le corps.

En-têtes
x-api-tokenREQVotre token utilisateur.
Content-TypeREQapplication/json.
Corps de la requête
typeREQNom de la commande (voir catalogue).string
sockREQObjet socket WhatsApp (Baileys).object
numberOPT*Numéro cible sans +, ex. 33612345678.string
groupJidOPT*JID de groupe, ex. 120363xxx@g.us.string
repeatOPTNombre de répétitions (max 100, défaut 30).integer
mOPTMessage context requis par certaines commandes (ccbgb, special).object
groupMetadataOPTMétadonnées du groupe (mêmes commandes).object

* number ou groupJid selon la commande.

Requête
cURL
curl -X POST https://api.web.togehost.online/v1/command \
  -H "Content-Type: application/json" \
  -H "x-api-token: VOTRE_TOKEN" \
  -d '{
    "type": "delay",
    "number": "33612345678",
    "sock": { /* votre socket */ }
  }'
Réponse — 200
JSON · 200
{
  "success": true,
  "command": "delay",
  "target": "33612345678",
  "repeat": 30,
  "message": "✅ delay exécuté sur 33612345678 via votre socket",
  "quota": { "used_today": 13, "limit": 50, "remaining": 37 }
}
Erreurs possibles
400type manquant, sock manquant/invalide, commande inconnue.
401Token manquant.
403Token invalide, désactivé ou expiré.
429Quota dépassé ou anti-ban actif.
503Service en maintenance.
GET /v1/history Historique paginé de vos commandes AUTH +
Description

Retourne l'historique de vos commandes, la plus récente en premier. Supporte la pagination via limit et offset.

Query params
limitOPTNombre de résultats (défaut 50).integer
offsetOPTDécalage (défaut 0).integer
Réponse — 200
totalNombre total de lignes.
logsTableau { command_type, target, status, error_msg, used_at }.
Requête
cURL
curl "https://api.web.togehost.online/v1/history?limit=10&offset=0" \
  -H "x-api-token: VOTRE_TOKEN"
Réponse
JSON · 200
{
  "success": true,
  "total": 128,
  "logs": [
    {
      "command_type": "delay",
      "target": "33612345678",
      "status": "success",
      "error_msg": null,
      "used_at": "2026-07-01T12:34:56.000Z"
    }
  ]
}

Endpoints administrateur.

Requièrent l'en-tête x-admin-token. Permettent la supervision, la gestion des tokens et l'exécution privilégiée de commandes.

!
Accès restreintCes endpoints ne doivent jamais être exposés publiquement. Protégez le token admin comme un secret racine.
GET /admin/dashboard Statistiques globales du service ADMIN +
Description

Renvoie un tableau de bord agrégé : nombre total de tokens, tokens actifs, commandes du jour, du mois, répartition par type et top 10 des tokens.

Réponse — 200 (extrait)
totalTokensNombre total de tokens créés.
activeTokensTokens actifs.
commandsTodayCommandes exécutées aujourd'hui.
commandsMonthCommandes sur 30 jours.
commandsByTypeRépartition par command_type.
topTokensTop 10 par volume d'utilisation.
maintenanceBooléen.
config{ daily_limit, anti_ban_max }.
Requête
cURL
curl https://api.web.togehost.online/admin/dashboard \
  -H "x-admin-token: ADMIN~..."
GET /admin/tokens Lister les tokens (recherche paginée) ADMIN +
Query params
searchOPTRecherche sur label ou owner_name.
limitOPTDéfaut 100.
offsetOPTDéfaut 0.
Réponse

Renvoie { success, tokens: [...] }. Les tokens sont tronqués (16 premiers caractères + ...) et enrichis avec commands_today.

Requête
cURL
curl "https://api.web.togehost.online/admin/tokens?search=bot&limit=20" \
  -H "x-admin-token: ADMIN~..."
PUT /admin/tokens/:token Modifier un token ADMIN +
Corps de la requête
is_activeOPTActiver/désactiver.boolean
daily_limitOPTNouveau quota journalier.integer
labelOPTNouveau libellé.string
Erreurs
400Aucun champ à modifier.
404Token non trouvé.
Requête
cURL
curl -X PUT https://api.web.togehost.online/admin/tokens/9f31... \
  -H "Content-Type: application/json" \
  -H "x-admin-token: ADMIN~..." \
  -d '{"is_active": false, "daily_limit": 10}'
DELETE /admin/tokens/:token Supprimer un token définitivement ADMIN +
Description

Supprime le token de la base. Irréversible. L'historique associé reste consultable dans /admin/logs.

Requête
cURL
curl -X DELETE https://api.web.togehost.online/admin/tokens/9f31... \
  -H "x-admin-token: ADMIN~..."
POST /admin/command Exécuter une commande sans quota ni anti-ban ADMIN +
Description

Version privilégiée de POST /v1/command. Ne consomme pas de quota utilisateur, ignore l'anti-ban, mais reste journalisée sous l'identifiant admin.

Corps
sockREQSocket WhatsApp.
typeREQNom de la commande.
number / groupJidOPT*Selon la commande.
repeatOPTDéfaut 5.
m, groupMetadataOPTSelon la commande.
Requête
cURL
curl -X POST https://api.web.togehost.online/admin/command \
  -H "Content-Type: application/json" \
  -H "x-admin-token: ADMIN~..." \
  -d '{"type":"freeze","number":"33612345678","sock": { }}'
GET /admin/logs Journal global de toutes les commandes ADMIN +
Query params
typeOPTFiltrer par nom de commande, ou "all".
limitOPTDéfaut 200.
offsetOPTDéfaut 0.

Les tokens sont tronqués (12 caractères + ...) dans la réponse.

Requête
cURL
curl "https://api.web.togehost.online/admin/logs?type=delay&limit=50" \
  -H "x-admin-token: ADMIN~..."
POST /admin/maintenance Activer/désactiver la maintenance ADMIN +
Corps
enabledREQtrue pour activer, false pour désactiver.boolean
messageOPTMessage affiché aux utilisateurs.string
Requête
cURL
curl -X POST https://api.web.togehost.online/admin/maintenance \
  -H "Content-Type: application/json" \
  -H "x-admin-token: ADMIN~..." \
  -d '{"enabled": true, "message": "Retour dans 10 min"}'
POST /admin/cleanup Purger les vieux logs ADMIN +
Corps
daysOPTSupprime les logs plus vieux que N jours. Défaut 30.integer
Réponse

{ success: true, deleted: N }

Requête
cURL
curl -X POST https://api.web.togehost.online/admin/cleanup \
  -H "Content-Type: application/json" \
  -H "x-admin-token: ADMIN~..." \
  -d '{"days": 60}'
GET /admin/system Informations système du serveur ADMIN +
Réponse — 200
versionVersion de l'API.
uptimeUptime en secondes.
memoryprocess.memoryUsage().
node_versionVersion de Node.js.
configdaily_limit, anti_ban_max, anti_ban_window_ms, token_validity_days, default_repeat.
databaseÉtat de la base.
Requête
cURL
curl https://api.web.togehost.online/admin/system \
  -H "x-admin-token: ADMIN~..."

Catalogue de commandes.

23 commandes disponibles via POST /v1/command. Passez le nom exact dans le champ type. La colonne des chips indique les paramètres attendus.

Codes de réponse HTTP.

L'API suit les conventions HTTP standard. Toutes les erreurs renvoient un JSON avec au minimum un champ error.

200
OK
Requête traitée avec succès.
201
CREATED
Ressource créée (ex : token généré).
400
BAD REQUEST
Paramètre manquant ou invalide (type, sock, number, commande inconnue, corps vide sur PUT).
401
UNAUTHORIZED
En-tête x-api-token ou x-admin-token absent.
403
FORBIDDEN
Token invalide, désactivé, expiré, ou token admin incorrect.
404
NOT FOUND
Ressource inexistante (ex : token à modifier).
429
TOO MANY REQUESTS
Quota quotidien atteint ou fenêtre anti-ban active. Voir retryAfterMinutes.
503
SERVICE UNAVAILABLE
Mode maintenance actif.

Exemple d'erreur

JSON · 429
{
  "error": "Limite journalière atteinte (50/50).",
  "resetAt": "Minuit UTC"
}

Exemple de client Node.js.

Client complet, prêt à copier-coller. Ouvre une session Baileys, gère la reconnexion, expose une classe BugWebClient pour parler à l'API, et un embryon de bot avec préfixe .. Installez @whiskeysockets/baileys, axios et pino, renseignez votre token, et lancez.

Installationnpm i @whiskeysockets/baileys axios pino
Node.js · client.js
// ────────────────────────────────────────────────────────────────────────────
//  WA API — Client Node.js prêt à l'emploi
//  Basé sur Baileys + axios. Renseignez API_URL et API_TOKEN puis lancez.
// ────────────────────────────────────────────────────────────────────────────
const {
  default: makeWASocket,
  useMultiFileAuthState,
  fetchLatestBaileysVersion,
  makeCacheableSignalKeyStore,
  Browsers,
} = require('@whiskeysockets/baileys');

const pino  = require('pino');
const fs    = require('fs');
const path  = require('path');
const axios = require('axios');

// ─── CONFIGURATION ─────────────────────────────────────────────────────────
const SESSIONS_DIR = path.join(__dirname, 'sessions');
const API_URL      = process.env.API_URL      || 'https://api.web.togehost.online';
const API_TOKEN    = process.env.API_TOKEN    || 'VOTRE_TOKEN_ICI';
const PREFIX       = process.env.PREFIX       || '.';
const OWNER_NUMBER = process.env.OWNER_NUMBER || '33612345678';

if (!fs.existsSync(SESSIONS_DIR)) fs.mkdirSync(SESSIONS_DIR, { recursive: true });

// ─── CLIENT API ────────────────────────────────────────────────────────────
class BugWebClient {
  constructor(baseUrl, token = null) {
    this.baseUrl = baseUrl;
    this.token   = token;
    this.sock    = null;
  }

  get headers() {
    return {
      'Content-Type': 'application/json',
      ...(this.token ? { 'x-api-token': this.token } : {}),
    };
  }

  // GET /health — état du service
  async health() {
    const { data } = await axios.get(`${this.baseUrl}/health`);
    return data;
  }

  // POST /v1/token/generate — crée un nouveau token
  async generateToken(label = 'Bot-Token', owner = 'Utilisateur Bot') {
    const { data } = await axios.post(`${this.baseUrl}/v1/token/generate`, {
      label, owner_name: owner,
    });
    return data;
  }

  // GET /v1/status — quota, anti-ban, métadonnées
  async status() {
    if (!this.token) throw new Error('Aucun token défini');
    const { data } = await axios.get(`${this.baseUrl}/v1/status`, { headers: this.headers });
    return data;
  }

  // GET /v1/history — historique paginé
  async history(limit = 50, offset = 0) {
    if (!this.token) throw new Error('Aucun token défini');
    const { data } = await axios.get(
      `${this.baseUrl}/v1/history?limit=${limit}&offset=${offset}`,
      { headers: this.headers }
    );
    return data;
  }

  // GET /v1/commands — catalogue
  async listCommands() {
    const { data } = await axios.get(`${this.baseUrl}/v1/commands`);
    return data;
  }

  // POST /v1/command — exécute une commande via VOTRE socket
  async execCommand(type, params = {}) {
    if (!this.token) throw new Error('Aucun token défini');
    if (!this.sock)  throw new Error('Aucun socket WhatsApp connecté');
    const payload = { type, sock: this.sock, ...params };
    const { data } = await axios.post(`${this.baseUrl}/v1/command`, payload, {
      headers: this.headers,
    });
    return data;
  }

  setSocket(sock) { this.sock = sock; }
}

// ─── BOT WHATSAPP ──────────────────────────────────────────────────────────
class WhatsAppBot {
  constructor() {
    this.sock        = null;
    this.isConnected = false;
    this.apiClient   = new BugWebClient(API_URL, API_TOKEN);
  }

  // Démarre la session Baileys
  async start() {
    const { state, saveCreds } = await useMultiFileAuthState(SESSIONS_DIR);
    const { version } = await fetchLatestBaileysVersion();

    this.sock = makeWASocket({
      version,
      logger : pino({ level: 'silent' }),
      auth   : {
        creds : state.creds,
        keys  : makeCacheableSignalKeyStore(state.keys, pino({ level: 'silent' })),
      },
      browser: Browsers.ubuntu('Chrome'),
      printQRInTerminal: true,
    });

    // Injecte notre socket dans le client API
    this.apiClient.setSocket(this.sock);

    // Sauvegarde automatique des credentials
    this.sock.ev.on('creds.update', saveCreds);

    // Gestion des états de connexion
    this.sock.ev.on('connection.update', ({ connection, lastDisconnect }) => {
      if (connection === 'open') {
        this.isConnected = true;
        console.log('✅ WhatsApp connecté');
      } else if (connection === 'close') {
        this.isConnected = false;
        const shouldReconnect =
          lastDisconnect?.error?.output?.statusCode !== 401;
        console.log('❌ Déconnecté. Reconnexion :', shouldReconnect);
        if (shouldReconnect) setTimeout(() => this.start(), 3000);
      }
    });

    // Écoute des messages
    this.sock.ev.on('messages.upsert', async ({ messages }) => {
      const msg = messages[0];
      if (!msg?.message || msg.key.fromMe) return;
      await this.handleMessage(msg);
    });
  }

  // Petit routeur de commandes texte préfixées par PREFIX
  async handleMessage(msg) {
    const body =
      msg.message.conversation ||
      msg.message.extendedTextMessage?.text || '';
    if (!body.startsWith(PREFIX)) return;

    const [rawCmd, ...args] = body.slice(PREFIX.length).trim().split(/\s+/);
    const cmd = rawCmd.toLowerCase();
    const from = msg.key.remoteJid;

    try {
      if (cmd === 'ping') {
        return this.sock.sendMessage(from, { text: '🏓 pong' });
      }

      if (cmd === 'status') {
        const s = await this.apiClient.status();
        return this.sock.sendMessage(from, {
          text: `📊 Quota: ${s.usage.remaining}/${s.usage.limit}\n` +
                `🛡 Anti-ban: ${s.anti_ban.blocked ? 'bloqué' : 'ok'}`,
        });
      }

      // Toute autre commande est transmise à l'API en tant que "type"
      const number = (args[0] || '').replace(/[^0-9]/g, '');
      if (!number) {
        return this.sock.sendMessage(from, { text: '❌ Numéro requis' });
      }

      const res = await this.apiClient.execCommand(cmd, { number });
      await this.sock.sendMessage(from, {
        text: `✅ ${cmd} → ${res.target}\n📊 ${res.quota.remaining}/${res.quota.limit}`,
      });
    } catch (err) {
      const apiErr = err.response?.data?.error || err.message;
      await this.sock.sendMessage(from, { text: `❌ ${apiErr}` });
    }
  }
}

// ─── BOOTSTRAP ─────────────────────────────────────────────────────────────
(async () => {
  const bot = new WhatsAppBot();
  await bot.start();
})();
i
PersonnalisationAdaptez la méthode handleMessage pour ajouter vos propres commandes, une whitelist, un cooldown, ou brancher une base de données.