Jusqu'à 3 boutons cliquables sous un message, sans template ni validation Meta, tant que le client vous a écrit il y a moins de 24 h.
Astuce
Jusqu'à 3 boutons cliquables sous un message, sans template ni validation Meta, tant que le client vous a écrit il y a moins de 24 h.
Un client écrit « Bonjour » à votre numéro. Vous répondez par une question et trois boutons. Il touche un bouton au lieu de taper une réponse, et votre serveur sait lequel.
Oui, les boutons de réponse rapide existent hors template. Ce sont des messages « interactifs » que vous composez librement, sans validation Meta. La seule condition : le client vous a écrit dans les dernières 24 h (la fenêtre de service). Pour écrire en premier ou après 24 h, voir Écrire à un client qui ne vous a jamais écrit.
Client : Bonjour
Vous : Bonjour Awa ! Que souhaitez-vous faire ?
[ Prendre RDV ] [ Mes RDV ] [ Un conseiller ]
Client : (touche « Prendre RDV »)
Webhook : message.inbound type=text text="Prendre RDV" button_id="rdv:new"
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": "Bonjour Awa ! Que souhaitez-vous faire ?",
"footer": "Clinique Exemple",
"buttons": [
{ "id": "rdv:new", "title": "Prendre RDV" },
{ "id": "rdv:list", "title": "Mes RDV" },
{ "id": "human", "title": "Un conseiller" }
]
}'
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": "Bonjour Awa ! Que souhaitez-vous faire ?",
"footer": "Clinique Exemple",
"buttons": [
{ "id": "rdv:new", "title": "Prendre RDV" },
{ "id": "rdv:list", "title": "Mes RDV" },
{ "id": "human", "title": "Un conseiller" }
]
}),
});
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" => "Bonjour Awa ! Que souhaitez-vous faire ?",
"footer" => "Clinique Exemple",
"buttons" => [
["id" => "rdv:new", "title" => "Prendre RDV"],
["id" => "rdv:list", "title" => "Mes RDV"],
["id" => "human", "title" => "Un conseiller"],
],
]),
]);
$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": "Bonjour Awa ! Que souhaitez-vous faire ?",
"footer": "Clinique Exemple",
"buttons": [
{"id": "rdv:new", "title": "Prendre RDV"},
{"id": "rdv:list", "title": "Mes RDV"},
{"id": "human", "title": "Un conseiller"},
],
},
timeout=15,
)
print(res.status_code, res.json())
| Élément | Limite |
|---|---|
| Nombre de boutons | 1 à 3 |
| Titre d'un bouton | 20 caractères |
| id d'un bouton | 256 caractères |
| Texte du message (body) | 1 024 caractères |
| Pied (footer) | 60 caractères, optionnel |
Au-delà de 3 choix, utilisez un menu en liste (jusqu'à 10 lignes).
Attention
Piège : un titre de plus de 20 caractères est refusé en 422 avant tout envoi. Mettez le détail dans body et gardez des titres courts. Mettez votre clé de traitement dans id (ex. rdv:new), jamais dans le titre : c'est id qui revient dans button_id.
Attention
Piège : hors des 24 h, l'envoi répond 400 « Hors de la fenêtre de 24h ». Envoyez alors un template, qui peut lui aussi porter des boutons de réponse rapide.
Coût : tarif réduit des messages de service, 1 crédit pour 4 messages par défaut. Voir Coût d'un message.
Preuve — vérifié dans le code de l'API : api_schemas.py, public_api.py ; appliqué par la démo WhatsApp : whatsapp.