AI AICommerce.ma · Documentation API Mes campagnes API Se connecter

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

1Un modèle validéDans AICommerce › WhatsApp › Modèles, créez votre message (ex. « Bonjour {{1}}, votre commande {{2}} est confirmée ») et attendez la validation de Meta, souvent quelques minutes.
2Une campagne APIWhatsApp › Campagnes › Nouvelle campagne › Campagne API. Donnez-lui un nom, par exemple confirmation_commande, et choisissez le modèle. Votre clé API est créée au même moment.
3Un appel depuis votre siteVotre site envoie la requête ci-dessous à chaque commande. Le client reçoit le message, et sa réponse arrive dans WhatsApp › Conversations.
Où trouver la clé et le code prêt à copier ?WhatsApp › Campagnes › votre campagne API › « Gérer ». Le bouton « Code à intégrer » donne la requête déjà remplie avec votre clé et le nom de votre campagne. « Tester » envoie un vrai message sur votre numéro.

La requête

POSThttps://aicommerce.ma/api/v1/campaign/send

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

ChampCe qu'il contient
apiKeyobligatoireVotre clé API (aic_…), sauf si elle est dans l'en-tête Authorization ou X-Api-Key.
campaignNameobligatoireLe nom exact de la campagne API, tel que vous l'avez créé. C'est lui qui décide quel modèle part.
destinationobligatoireLe 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.
userNamefacultatifLe 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.
templateParamsselon le modèleLes 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.urlselon le modèleSeulement 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ête Content-Type: application/json.
  • Data : collez le JSON de la section « La requête » et remplacez le numéro et les valeurs de templateParams par les champs de la commande que Zapier vous propose. Le JSON complet garde templateParams sous forme de liste, dans l'ordre des variables.

Make (Integromat)

  • Module HTTP › Make a request, méthode POST, Body type Raw, Content type JSON (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_thankyou ou woocommerce_order_status_processing de votre thème ou d'une petite extension, ou Zapier / Make.
Votre boutique YouCan est connectée à AICommerce ?Vos commandes YouCan arrivent déjà dans AICommerce, et la confirmation WhatsApp automatique peut partir d'ici sans une ligne de code (Commandes › WhatsApp). L'API sert surtout aux boutiques hébergées ailleurs ou aux messages que vous déclenchez vous-même.

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)."
}
CodeSignificationQue faire
200Message accepté par Meta. Il est dans Conversations ; sa livraison et sa lecture s'affichent dans WhatsApp › Statistiques.Rien.
401Clé API absente ou invalide (une clé remplacée par « Nouvelle clé » cesse de marcher tout de suite).Copiez la clé actuelle depuis AICommerce.
404Aucune campagne API de ce nom pour cette clé.Vérifiez l'orthographe exacte de campaignName.
409La campagne est en pause.Réactivez-la dans AICommerce.
422Le 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.
429Trop 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.
ConsentementN'écrivez qu'à des clients qui ont commandé chez vous ou vous ont écrit. Trop de signalements « spam » font baisser la qualité de votre numéro et peuvent le faire bloquer par WhatsApp.

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.