Envoyer vos messages WhatsApp depuis votre site
Quand un client commande sur votre boutique, votre site peut lui envoyer tout seul un message WhatsApp — confirmation, colis expédié, panier abandonné — depuis le numéro WhatsApp de votre boutique, avec un de vos modèles validés par Meta. Un seul appel, trois informations : votre clé, le nom de la campagne, le numéro du client.
Démarrer en 3 étapes
confirmation_commande, et choisissez le modèle. Votre clé API est créée au même moment.La requête
Le corps est en JSON (Content-Type: application/json). La clé peut être envoyée de trois façons, au choix :
- dans le corps :
"apiKey": "aic_…"; - dans l'en-tête
Authorization: Bearer aic_…; - dans l'en-tête
X-Api-Key: aic_….
{
"apiKey": "aic_VOTRE_CLE",
"campaignName": "confirmation_commande",
"destination": "0612345678",
"userName": "Salma",
"templateParams": ["Salma", "CMD-1042"]
}
Les champs
| Champ | Ce qu'il contient | |
|---|---|---|
apiKey | obligatoire | Votre clé API (aic_…), sauf si elle est dans l'en-tête Authorization ou X-Api-Key. |
campaignName | obligatoire | Le nom exact de la campagne API, tel que vous l'avez créé. C'est lui qui décide quel modèle part. |
destination | obligatoire | Le numéro du client. Toutes ces écritures sont acceptées : 0612345678, 212612345678, +212 6 12 34 56 78. Un numéro étranger s'écrit avec l'indicatif, sans le 0 du début. |
userName | facultatif | Le nom du client. Il s'affiche dans vos Conversations et vos Contacts. Il ne remplit pas le message : pour mettre le prénom dans le texte, passez-le dans templateParams. |
templateParams | selon le modèle | Les valeurs des variables du modèle, dans l'ordre : la première remplace {{1}}, la deuxième {{2}}… Il en faut exactement autant que de variables, et aucune ne peut être vide. Textes ou nombres, 900 caractères maximum chacun. Modèle sans variable : liste vide ou champ absent. |
media.url | selon le modèle | Seulement si le modèle commence par une image : le lien https d'une image JPG ou PNG (la photo du produit commandé, par exemple). Sans lui, l'image par défaut de la campagne est utilisée si vous en avez posé une. |
Exemples de code
Remplacez aic_VOTRE_CLE et confirmation_commande par votre clé et le nom de votre campagne.
curl -X POST https://aicommerce.ma/api/v1/campaign/send \
-H "Content-Type: application/json" \
-d '{
"apiKey": "aic_VOTRE_CLE",
"campaignName": "confirmation_commande",
"destination": "0612345678",
"userName": "Salma",
"templateParams": ["Salma", "CMD-1042"]
}'
<?php
// À appeler juste après l'enregistrement de la commande
$payload = [
'apiKey' => 'aic_VOTRE_CLE',
'campaignName' => 'confirmation_commande',
'destination' => $order['phone'],
'userName' => $order['name'],
'templateParams' => [$order['first_name'], $order['reference']],
];
$ch = curl_init('https://aicommerce.ma/api/v1/campaign/send');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
CURLOPT_POSTFIELDS => json_encode($payload),
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 20,
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
if (empty($response['success'])) {
error_log('WhatsApp non envoyé : ' . ($response['message'] ?? 'erreur inconnue'));
}
// Node.js 18+ (côté serveur : ne mettez jamais la clé dans le code d'une page web)
const res = await fetch('https://aicommerce.ma/api/v1/campaign/send', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
Authorization: 'Bearer ' + process.env.AICOMMERCE_API_KEY,
},
body: JSON.stringify({
campaignName: 'confirmation_commande',
destination: order.phone,
userName: order.name,
templateParams: [order.firstName, order.reference],
}),
});
const data = await res.json();
if (!data.success) console.error('WhatsApp non envoyé :', data.message);
import requests
r = requests.post(
"https://aicommerce.ma/api/v1/campaign/send",
json={
"apiKey": "aic_VOTRE_CLE",
"campaignName": "confirmation_commande",
"destination": order["phone"],
"userName": order["name"],
"templateParams": [order["first_name"], order["reference"]],
},
timeout=20,
)
data = r.json()
if not data.get("success"):
print("WhatsApp non envoyé :", data.get("message"))
// Google Sheets › Extensions › Apps Script. Colonnes : A = nom, B = téléphone, C = référence, D = statut d'envoi.
// Sélectionnez les lignes puis lancez « envoyerWhatsApp ».
function envoyerWhatsApp() {
const sheet = SpreadsheetApp.getActiveSheet();
const range = sheet.getActiveRange();
const rows = range.getValues();
rows.forEach(function (row, i) {
const nom = row[0], telephone = String(row[1]), reference = row[2];
const res = UrlFetchApp.fetch('https://aicommerce.ma/api/v1/campaign/send', {
method: 'post',
contentType: 'application/json',
muteHttpExceptions: true,
payload: JSON.stringify({
apiKey: 'aic_VOTRE_CLE',
campaignName: 'confirmation_commande',
destination: telephone,
userName: nom,
templateParams: [String(nom).split(' ')[0], String(reference)],
}),
});
const data = JSON.parse(res.getContentText());
sheet.getRange(range.getRow() + i, 4).setValue(data.success ? 'Envoyé' : data.message);
Utilities.sleep(1000); // un message par seconde : votre numéro reste en sécurité
});
}
Shopify, YouCan, WooCommerce, Zapier, Make
Tout outil capable d'envoyer une requête HTTP POST avec un corps JSON peut appeler l'API. Le principe est toujours le même : au bon événement (nouvelle commande, commande expédiée…), envoyer la requête de la section « La requête » en remplaçant le numéro et les variables par les champs de la commande.
Zapier
- Déclencheur : « New Order » de votre boutique (Shopify, WooCommerce, YouCan via webhook, Google Sheets…).
- Action : Webhooks by Zapier › Custom Request, méthode
POST, URL :https://aicommerce.ma/api/v1/campaign/send, en-têteContent-Type: application/json. - Data : collez le JSON de la section « La requête » et remplacez le numéro et les valeurs de
templateParamspar les champs de la commande que Zapier vous propose. Le JSON complet gardetemplateParamssous forme de liste, dans l'ordre des variables.
Make (Integromat)
- Module HTTP › Make a request, méthode
POST, Body typeRaw, Content typeJSON (application/json). - Collez le JSON de l'exemple et remplacez les valeurs par les champs de votre commande.
Shopify
- Avec Shopify Flow : déclencheur « Order created », action « Send HTTP request » (POST, en-tête
Content-Type: application/json, corps JSON). - Sans Flow : passez par Zapier ou Make ci-dessus.
WooCommerce
- Le code PHP ci-dessus dans le hook
woocommerce_thankyououwoocommerce_order_status_processingde votre thème ou d'une petite extension, ou Zapier / Make.
Réponses et erreurs
La réponse est en JSON, avec success à true ou false. En cas d'erreur, message dit pourquoi, en français, et rien n'est envoyé ni compté. Seule exception : un appel refusé pour excès de débit (429) ne porte que message.
// 200 : Meta a accepté le message
{
"success": true,
"message_id": 18342,
"wamid": "wamid.HBgMMjEyNjEyMzQ1Njc4FQIAERgSM0...",
"status": "accepted",
"campaign": "confirmation_commande",
"destination": "212612345678"
}
// 422 : le message n'est pas parti
{
"success": false,
"message": "Le modèle « confirmation_cmd » attend 2 variable(s) non vide(s) dans templateParams, 1 reçue(s)."
}
| Code | Signification | Que faire |
|---|---|---|
| 200 | Message accepté par Meta. Il est dans Conversations ; sa livraison et sa lecture s'affichent dans WhatsApp › Statistiques. | Rien. |
| 401 | Clé API absente ou invalide (une clé remplacée par « Nouvelle clé » cesse de marcher tout de suite). | Copiez la clé actuelle depuis AICommerce. |
| 404 | Aucune campagne API de ce nom pour cette clé. | Vérifiez l'orthographe exacte de campaignName. |
| 409 | La campagne est en pause. | Réactivez-la dans AICommerce. |
| 422 | Le message ne peut pas partir : nombre de variables incorrect ou variable vide, numéro invalide, image manquante pour un modèle image, client désinscrit (STOP), quota du mois atteint, numéro WhatsApp de la boutique restreint, ou refus de Meta. | Lisez message : il dit exactement quoi corriger. |
| 429 | Trop d'appels en une minute. | Attendez une minute, espacez les envois. |
Modèle qui commence par une image
Un modèle validé avec une image en haut (la photo du produit, par exemple) demande l'image à chaque envoi :
{
"apiKey": "aic_VOTRE_CLE",
"campaignName": "nouveaute_produit",
"destination": "0612345678",
"templateParams": ["Salma", "Sandales cuir tressé"],
"media": { "url": "https://votre-boutique.ma/images/sandales.jpg" }
}
Le lien doit être public, en https, vers une image JPG ou PNG (5 Mo maximum côté WhatsApp). Si vous posez une « image par défaut » sur la campagne, media devient facultatif.
Règles et limites
- Plans payants. L'API et les campagnes sont ouvertes à partir du plan Pro.
- Quota mensuel. Chaque message accepté compte dans « Messages de campagne WhatsApp par mois » de votre plan, avec vos envois groupés. Quota atteint : l'API répond 422 jusqu'au mois suivant ou au changement de plan.
- 300 appels par minute au maximum. Pour un gros volume, préférez un envoi groupé depuis WhatsApp › Campagnes : il est cadencé pour protéger votre numéro.
- STOP. Un client qui répond « STOP » est désinscrit : l'API refuse ensuite de lui écrire, même si votre site le demande.
- Modèle validé uniquement. WhatsApp refuse un texte libre à un client qui ne vous a pas écrit dans les dernières 24 h. L'API n'envoie donc que le modèle de la campagne.
- Clé secrète. Elle envoie des messages en votre nom : gardez-la côté serveur, jamais dans le code d'une page web visible par les visiteurs. En cas de fuite, « Nouvelle clé » la remplace immédiatement.
Questions fréquentes
Où voir les messages envoyés par l'API ?
Dans WhatsApp › Conversations (le fil du client), WhatsApp › Statistiques (livrés, lus, répondus) et sur la ligne de la campagne dans WhatsApp › Campagnes (envoyés, échecs, dernière erreur).
Le client répond : qui reçoit la réponse ?
Vous, dans WhatsApp › Conversations, comme pour tout autre message. Si l'assistant IA est activé, il peut répondre à votre place.
Comment tester sans coder ?
Sur votre campagne API, le bouton « Tester » envoie un vrai message à votre numéro par le même chemin que l'API. Ou collez l'exemple cURL dans un terminal.
Faut-il un numéro WhatsApp particulier ?
Celui de votre boutique, connecté dans AICommerce (Commandes › Connecter WhatsApp). Les messages partent de ce numéro, avec son nom et sa photo.