Oui : un compte peut connecter plusieurs numéros ; GET /v1/numbers les liste, le champ from (phone_number_id) choisit l'expéditeur, les templates sont propres à chaque numéro, et un palier plafonne le nombre de numéros.
Astuce
Oui : un compte peut connecter plusieurs numéros ; GET /v1/numbers les liste, le champ from (phone_number_id) choisit l'expéditeur, les templates sont propres à chaque numéro, et un palier plafonne le nombre de numéros.
Vous gérez trois agences à Douala, Yaoundé et Abidjan, chacune avec son propre numéro WhatsApp. Vous voulez qu'une seule intégration envoie depuis le bon numéro, et sache sur lequel un client a écrit. Oui, un compte peut avoir plusieurs numéros. Il n'y a pas à créer un compte par numéro.
Un compte, une clé API, un solde de crédits, un webhook
├─ numéro A +237690000011 (par défaut) templates de A
├─ numéro B +237690000012 templates de B
└─ numéro C +237690000013 templates de C
Envoi : champ "from" = phone_number_id du numéro choisi
Réception : champ "number" du webhook = numéro qui a reçu
curl
curl -X GET "https://wa-api.geskap.com/v1/numbers" \
-H "Authorization: Bearer $GESKAP_API_KEY"
Node.js
const res = await fetch("https://wa-api.geskap.com/v1/numbers", {
method: "GET",
headers: {
Authorization: `Bearer ${process.env.GESKAP_API_KEY}`,
},
});
console.log(res.status, await res.json());
PHP
$ch = curl_init("https://wa-api.geskap.com/v1/numbers");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer " . getenv("GESKAP_API_KEY"),
],
]);
$res = curl_exec($ch);
echo curl_getinfo($ch, CURLINFO_HTTP_CODE), " ", $res;
Python
import os, requests
res = requests.request(
"GET",
"https://wa-api.geskap.com/v1/numbers",
headers={"Authorization": f"Bearer {os.environ['GESKAP_API_KEY']}"},
timeout=15,
)
print(res.status_code, res.json())
Chaque entrée porte phone_number_id, display_phone_number, verified_name, connected, is_default et coexistence. Le numéro is_default est celui qui envoie quand vous n'indiquez pas from.
Ajoutez from avec le phone_number_id (et non le numéro affiché) dans POST /v1/messages, POST /v1/messages/reply et POST /v1/messages/interactive :
curl
curl -X POST "https://wa-api.geskap.com/v1/messages" \
-H "Authorization: Bearer $GESKAP_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"to": "+237690000001",
"from": "100000000000002",
"template": {
"name": "rappel_rdv",
"language": "fr",
"variables": ["Awa", "demain 9 h"]
}
}'
Node.js
const res = await fetch("https://wa-api.geskap.com/v1/messages", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.GESKAP_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"to": "+237690000001",
"from": "100000000000002",
"template": {
"name": "rappel_rdv",
"language": "fr",
"variables": ["Awa", "demain 9 h"]
}
}),
});
console.log(res.status, await res.json());
PHP
$ch = curl_init("https://wa-api.geskap.com/v1/messages");
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",
"from" => "100000000000002",
"template" => [
"name" => "rappel_rdv",
"language" => "fr",
"variables" => ["Awa", "demain 9 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",
headers={"Authorization": f"Bearer {os.environ['GESKAP_API_KEY']}"},
json={
"to": "+237690000001",
"from": "100000000000002",
"template": {
"name": "rappel_rdv",
"language": "fr",
"variables": ["Awa", "demain 9 h"],
},
},
timeout=15,
)
print(res.status_code, res.json())
| Élément | Portée |
|---|---|
| Templates et leur statut Meta | Par numéro : ?number=<phone_number_id> sur GET, POST et DELETE /v1/templates |
| Messages reçus | Par numéro : number dans le webhook, ?number= sur GET /v1/messages/inbound |
| Clé API, solde de crédits, webhook | Communs à tout le compte |
Pour répondre à un client depuis le numéro qui l'a reçu, repassez data.number du webhook dans from.
Le nombre de numéros connectables dépend d'un palier. Ne le codez pas en dur : lisez-le.
La connexion d'un numéro se fait dans la console (fenêtre Meta dans le navigateur), pas par un simple appel d'API.
À la création de la clé dans la console, vous pouvez la limiter à une liste de numéros (allowed_numbers). Une telle clé ne voit que ces numéros dans GET /v1/numbers. Voir Clé API restreinte.
Attention
Piège : un template approuvé sur le numéro A n'est pas utilisable depuis le numéro B. Créez-le sur chaque numéro (POST /v1/templates?number=…) et attendez son approbation sur chacun.
Attention
Piège : un from qui n'appartient pas à votre compte répond 400 « Numéro non rattaché à ce compte ». Une clé limitée à un seul numéro l'utilise par défaut ; limitée à plusieurs, elle répond 403 tant que vous n'indiquez pas from.
Attention
Piège : vous n'avez qu'une seule adresse de webhook pour tous les numéros. Triez sur le champ number. Si un numéro est partagé avec un autre système et que la réponse automatique est réglée sur l'autre système, le message est stocké mais n'est pas poussé sur votre webhook.
Pour le détail des coûts d'envoi, voir Coût d'un message.
Preuve — vérifié dans le code de l'API : public_api.py, api_schemas.py, api_numbers.py, console_api.py, webhooks.py.