Oui — trois boutons Oui, Non, Plus tard sans template dans les 24 h ; le choix revient dans button_id et « Plus tard » est à gérer chez vous (relance planifiée).
Astuce
Oui — trois boutons Oui, Non, Plus tard sans template dans les 24 h ; le choix revient dans button_id et « Plus tard » est à gérer chez vous (relance planifiée).
Vous posez une question fermée (« Voulez-vous recevoir votre facture par WhatsApp ? ») et laissez trois issues : oui, non, ou « plus tard ». Le client touche, votre serveur lit button_id et agit.
Oui, c'est possible sans template, avec trois boutons de réponse rapide, si le client vous a écrit dans les dernières 24 h. Hors des 24 h, la question doit être posée par un template à boutons.
Vous : Awa, voulez-vous recevoir vos factures ici, sur WhatsApp ?
[ Oui ] [ Non ] [ Plus tard ]
Client : (touche « Plus tard »)
Webhook : message.inbound type=text text="Plus tard" button_id="optin:later"
Vous : D'accord, je vous reposerai la question dans quelques jours.
curl
curl -X POST "https://wa-api.geskap.com/v1/messages/interactive" \
-H "Authorization: Bearer $GESKAP_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"to": "+237690000001",
"body": "Awa, voulez-vous recevoir vos factures ici, sur WhatsApp ?",
"buttons": [
{ "id": "optin:yes", "title": "Oui" },
{ "id": "optin:no", "title": "Non" },
{ "id": "optin:later", "title": "Plus tard" }
]
}'
Node.js
const res = await fetch("https://wa-api.geskap.com/v1/messages/interactive", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.GESKAP_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"to": "+237690000001",
"body": "Awa, voulez-vous recevoir vos factures ici, sur WhatsApp ?",
"buttons": [
{ "id": "optin:yes", "title": "Oui" },
{ "id": "optin:no", "title": "Non" },
{ "id": "optin:later", "title": "Plus tard" }
]
}),
});
console.log(res.status, await res.json());
PHP
$ch = curl_init("https://wa-api.geskap.com/v1/messages/interactive");
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",
"body" => "Awa, voulez-vous recevoir vos factures ici, sur WhatsApp ?",
"buttons" => [
["id" => "optin:yes", "title" => "Oui"],
["id" => "optin:no", "title" => "Non"],
["id" => "optin:later", "title" => "Plus tard"],
],
]),
]);
$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/interactive",
headers={"Authorization": f"Bearer {os.environ['GESKAP_API_KEY']}"},
json={
"to": "+237690000001",
"body": "Awa, voulez-vous recevoir vos factures ici, sur WhatsApp ?",
"buttons": [
{"id": "optin:yes", "title": "Oui"},
{"id": "optin:no", "title": "Non"},
{"id": "optin:later", "title": "Plus tard"},
],
},
timeout=15,
)
print(res.status_code, res.json())
Réception :
switch (data.button_id) {
case "optin:yes": await db.setOptIn(data.from, true); break;
case "optin:no": await db.setOptIn(data.from, false); break;
case "optin:later": await db.scheduleAsk(data.from, { inDays: 3 }); break; // votre planificateur
default: /* le client a tapé du texte : traitez data.text */ ;
}
Voir Savoir quel bouton ou quelle ligne le client a touché pour recevoir le webhook signé.
| Élément | Limite |
|---|---|
| Boutons | 1 à 3 : trois suffisent pour Oui / Non / Plus tard |
| Titre d'un bouton | 20 caractères |
| id d'un bouton | 256 caractères |
| Texte de la question (body) | 1 024 caractères |
Attention
Piège : « Plus tard » n'est qu'une réponse reçue : l'API ne rappelle rien toute seule. C'est à vous de noter la date et de reposer la question. Si le client n'a pas écrit depuis plus de 24 h à ce moment-là, la relance doit passer par un template, pas par ces boutons (400 « Hors de la fenêtre de 24h »).
Attention
Piège : ne déduisez pas le consentement d'un silence ni du seul libellé du bouton : enregistrez le choix par son id avec la date. Un client peut aussi répondre « stop » en texte : voir Stop / désinscription.
Preuve — vérifié dans le code de l'API : api_schemas.py, public_api.py, webhooks.py ; appliqué par la démo WhatsApp : engine.