Webhooks
L’API vous donne un contrôle direct ; les webhooks vous permettent de profiter des workflows (délais, conditions, tags, séquences, IA) en envoyant simplement vos données.
Webhook entrant : déclencher un workflow
L’identifiant wh_… est généré quand vous enregistrez un workflow avec un déclencheur Webhook API, Shopify, WooCommerce, Chariow ou Maketou. Copiez l’URL complète dans l’éditeur du workflow (tutoriel pas à pas).
| Propriété | Valeur |
|---|---|
| Authentification | Aucun en-tête : l’identifiant secret de l’URL suffit. Ne pas utiliser la clé API ici. |
| Corps | N’importe quel objet JSON (ou formulaire URL-encodé), 1 Mo maximum. |
| Exécution | Asynchrone : la réponse est immédiate, le workflow s’exécute ensuite (délais compris). |
| Limite | 120 requêtes / minute par adresse IP. |
curl -X POST https://api.whatixo.com/api/webhook/wh_9b2e4f71c3a8d605 \
-H "Content-Type: application/json" \
-d '{"event":"inscription","client":{"prenom":"Aline","telephone":"243812345601"},"formation":"Marketing WhatsApp"}'await fetch(process.env.WHATIXO_WEBHOOK_URL, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
event: 'inscription',
client: { prenom: 'Aline', telephone: '243812345601' },
formation: 'Marketing WhatsApp',
}),
});$ch = curl_init(getenv('WHATIXO_WEBHOOK_URL'));
curl_setopt_array($ch, [
CURLOPT_POST => true, CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 10,
CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
CURLOPT_POSTFIELDS => json_encode([
'event' => 'inscription',
'client' => ['prenom' => 'Aline', 'telephone' => '243812345601'],
'formation' => 'Marketing WhatsApp',
]),
]);
curl_exec($ch);
curl_close($ch);import os, requests
requests.post(os.environ["WHATIXO_WEBHOOK_URL"], json={
"event": "inscription",
"client": {"prenom": "Aline", "telephone": "243812345601"},
"formation": "Marketing WhatsApp",
}, timeout=10)Dans le workflow, ces données s’utilisent avec {{client.prenom}}, {{client.telephone}}, {{formation}}.
Réponses
| Code | Corps | Signification |
|---|---|---|
| 200 | {"success":true,"message":"Webhook reçu et en cours de traitement."} | Reçu, workflow lancé. |
| 200 | {"message":"Webhook inactif."} | Reçu, mais le workflow est désactivé (les variables sont tout de même détectées). |
| 402 | {"error":"Compte suspendu. Exécution bloquée."} | Abonnement expiré. |
| 404 | {"error":"Webhook introuvable."} | Identifiant inconnu ou workflow supprimé. |
| 429 | {"error":"Trop d'appels sur ce webhook."} | Plus de 120 requêtes par minute. |
Syntaxe des variables
- Objets imbriqués :
{{client.adresse.ville}} - Éléments de liste (index à partir de 0) :
{{items.0.nom}} - Réponse d’une étape IA :
{{ia_response}} - Une variable absente est laissée telle quelle dans le texte : testez avec des données réelles.
Webhooks sortants : recevoir des données de Whatixo
Whatixo peut à son tour appeler votre serveur :
| Source | Configuration | Contenu envoyé |
|---|---|---|
| Action de workflow Tirer un webhook | URL + corps JSON personnalisé (avec variables) | Ce que vous définissez dans le corps |
| Action de workflow Requête API | Méthode, URL, en-têtes (ex. votre jeton), corps | Idem ; la réponse JSON est réutilisable dans les étapes suivantes |
| Webhook de conversion de l’agent IA | Réglages experts de l’agent | Chaque lead/commande : téléphone, type, données collectées |
{
"source": "whatixo",
"telephone": "{{phone}}",
"nom": "{{name}}",
"message": "{{message}}"
}
Votre URL de réception doit être en https:// et publique (les adresses internes ou locales sont refusées par Whatixo). Ajoutez un jeton secret dans l’URL ou dans un en-tête (action Requête API) et vérifiez-le côté serveur avant de traiter les données.
Exemple de réception (Node.js / Express)
import express from 'express';
const app = express();
app.use(express.json());
app.post('/hooks/whatixo', (req, res) => {
if (req.get('x-hook-token') !== process.env.HOOK_TOKEN) return res.sendStatus(401);
const { telephone, nom, message } = req.body;
console.log('Nouveau message WhatsApp de', nom, telephone, ':', message);
// … enregistrer dans votre CRM
res.json({ ok: true }); // répondez vite (moins de 10 s)
});
app.listen(3000);