Répondre à un client en texte libre, avec un lien cliquable

Oui — un texte libre jusqu'à 4 096 caractères, sans template, dans les 24 h suivant le dernier message du client ; un lien https dans le texte est cliquable (c'est WhatsApp qui le rend cliquable, il n'y a pas de bouton-lien).

Répondre à un client en texte libre, avec un lien cliquable

Astuce
Oui — un texte libre jusqu'à 4 096 caractères, sans template, dans les 24 h suivant le dernier message du client ; un lien https dans le texte est cliquable (c'est WhatsApp qui le rend cliquable, il n'y a pas de bouton-lien).

Scénario

Un client vous écrit. Vous lui répondez par un simple message texte, avec le lien de paiement ou de suivi dans la phrase. Il touche le lien et l'ouvre.

Oui, le texte libre existe hors template, tant que le client vous a écrit dans les dernières 24 h (la « fenêtre de service »). C'est l'envoi le plus simple : un destinataire, un texte. Pour écrire en premier ou après 24 h, voir Écrire à un client qui ne vous a jamais écrit.

Conversation

Client  : Je peux payer comment ?
Vous    : Bonjour Awa, voici votre lien de paiement sécurisé :
          https://exemple.com/payer/A123
          Il est valable 24 h.
Client  : (touche le lien, la page s'ouvre)

Code

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, voici votre lien de paiement sécurisé :\nhttps://exemple.com/payer/A123\nIl est valable 24 h."
}'

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, voici votre lien de paiement sécurisé :\nhttps://exemple.com/payer/A123\nIl est valable 24 h."
  }),
});
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, voici votre lien de paiement sécurisé :\nhttps://exemple.com/payer/A123\nIl est valable 24 h.",
  ]),
]);
$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, voici votre lien de paiement sécurisé :\nhttps://exemple.com/payer/A123\nIl est valable 24 h.",
    },
    timeout=15,
)
print(res.status_code, res.json())

La réponse (202) contient id, status et le solde de crédits ; le statut final (distribué, lu) arrive ensuite, voir Suivre la livraison.

Limites exactes

ÉlémentLimite
Texte (text)1 à 4 096 caractères
Destinataire (to)numéro au format international, ex. +237690000001
Délai24 h après le dernier message du client
Numéro d'envoi (from)optionnel : le phone_number_id d'un de vos numéros ; sinon le numéro par défaut
Coût1 crédit pour 4 messages par défaut (réglage du compte) ; ne bloque jamais l'envoi
Attention
Piège : le lien est cliquable parce que WhatsApp reconnaît une adresse commençant par https:// dans le texte : l'API n'envoie ni « bouton-lien » ni aperçu configurable. Écrivez l'adresse entière, sans espace, et préférez https. Le texte libre ne porte pas non plus d'image ni de PDF : pour un document, voir Envoyer un PDF.
Attention
Piège : hors des 24 h, l'appel répond 400 « Hors de la fenêtre de 24h : utilisez un template ». Ne réessayez pas : envoyez un template approuvé. Pour un lien différent par client dans un bouton, voir Un lien unique par client dans un bouton.

Preuve — vérifié dans le code de l'API : api_schemas.py, public_api.py, api_send.py, api_credits.py.