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).
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).
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.
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)
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.
| Élément | Limite |
|---|---|
| Texte (text) | 1 à 4 096 caractères |
| Destinataire (to) | numéro au format international, ex. +237690000001 |
| Délai | 24 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ût | 1 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.