Oui : le champ from de chaque message.inbound est le numéro de l'expéditeur au format E.164 ; utilisez-le comme clé de votre fiche client. Il identifie le téléphone, pas la personne : pour une action sensible, ajoutez un PIN.
Astuce
Oui : le champ from de chaque message.inbound est le numéro de l'expéditeur au format E.164 ; utilisez-le comme clé de votre fiche client. Il identifie le téléphone, pas la personne : pour une action sensible, ajoutez un PIN.
Un client écrit « Où en est ma commande ? ». Votre serveur doit savoir qui c'est, retrouver sa fiche et répondre avec ses données, sans lui demander son nom ni un numéro de client.
Oui. Chaque message reçu arrive sur votre webhook avec data.from : le numéro de l'expéditeur, au format E.164 (+237690000001). C'est une valeur donnée par WhatsApp, que le client ne saisit pas. Faites-en la clé de recherche de votre base clients.
Client : Où en est ma commande ?
Webhook : message.inbound from=+237690000001 contact_name="Awa" text="Où en est ma commande ?"
Serveur : fiche trouvée par numéro → commande CMD-1042, « en préparation »
Vous : Bonjour Awa, votre commande CMD-1042 est en préparation.
Cherchez la fiche par from, puis répondez au même numéro (to = from) :
curl
curl -X POST "https://wa-api.geskap.com/v1/messages/reply" \
-H "Authorization: Bearer $GESKAP_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"to": "+237690000001",
"text": "Bonjour Awa, votre commande CMD-1042 est en préparation.",
"from": "100000000000001"
}'
Node.js
const res = await fetch("https://wa-api.geskap.com/v1/messages/reply", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.GESKAP_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"to": "+237690000001",
"text": "Bonjour Awa, votre commande CMD-1042 est en préparation.",
"from": "100000000000001"
}),
});
console.log(res.status, await res.json());
PHP
$ch = curl_init("https://wa-api.geskap.com/v1/messages/reply");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer " . getenv("GESKAP_API_KEY"),
"Content-Type: application/json",
],
CURLOPT_POSTFIELDS => json_encode([
"to" => "+237690000001",
"text" => "Bonjour Awa, votre commande CMD-1042 est en préparation.",
"from" => "100000000000001",
]),
]);
$res = curl_exec($ch);
echo curl_getinfo($ch, CURLINFO_HTTP_CODE), " ", $res;
Python
import os, requests
res = requests.request(
"POST",
"https://wa-api.geskap.com/v1/messages/reply",
headers={"Authorization": f"Bearer {os.environ['GESKAP_API_KEY']}"},
json={
"to": "+237690000001",
"text": "Bonjour Awa, votre commande CMD-1042 est en préparation.",
"from": "100000000000001",
},
timeout=15,
)
print(res.status_code, res.json())
Côté serveur, la recherche est une simple comparaison de numéros :
Node.js
// Webhook handler body: data is the "data" object of a message.inbound event.
function onInbound(data) {
const phone = data.from; // "+237690000001" (E.164)
const customer = customersByPhone.get(phone); // your own table, keys normalised to E.164
if (!customer) return replyUnknown(phone); // propose to sign up
return answerFor(customer, data.text);
}
Si aucune fiche n'existe, ne répondez pas par une erreur : proposez de s'inscrire ou de créer un dossier avec un formulaire pas à pas, ou orientez vers un conseiller.
Attention
Piège : normalisez les numéros de votre base au format E.164 avant de comparer (+237690000001, sans espaces ni tirets, avec l'indicatif). Un client enregistré comme 6 90 00 00 01 ne sera jamais retrouvé par une comparaison de chaînes.
Attention
Piège : from identifie un téléphone, pas une personne. Un téléphone se prête, se perd, se partage en famille. Pour consulter un solde, un historique ou valider un paiement, ne vous fiez pas au seul numéro : voir Données sensibles : lien unique et PIN.
Attention
Piège : contact_name est le nom de profil WhatsApp, choisi et modifiable par le client. Bon pour dire « Bonjour Awa », jamais pour identifier quelqu'un ni pour décider d'un droit d'accès.
Attention
Piège : répondez avec le champ number de l'événement en from si vous avez plusieurs numéros WhatsApp, pour que le client retrouve la même conversation : voir Plusieurs numéros.
Pour recevoir ces événements : Webhook : vérifier la signature. Pour les brancher à un outil existant : Webhook vers n8n, Zapier ou un CRM.
Preuve — vérifié dans le code de l'API : dev_api_docs.py, api_schemas.py ; appliqué par la démo WhatsApp : engine.