Envoyer des boutons de réponse rapide sans template

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.

Envoyer des boutons de réponse rapide sans template

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.

Scénario

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.

Conversation

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"

Code

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())

Limites exactes

ÉlémentLimite
Nombre de boutons1 à 3
Titre d'un bouton20 caractères
id d'un bouton256 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.