API de messagerie
API d'historique des messages
Obtenez la liste des messages de votre espace de travail sur une plage de dates, avec le statut de chacun. Utilisez-la pour rapprocher ce qui a été envoyé, créer des rapports ou retrouver les messages en échec à renvoyer.
https://wbiztool.com/api/v1/report/Corps: JSON (nécessaire pour les pages après la première) ou champs de formulaire
L'historique couvre tous les messages de l'espace de travail de votre clé API, qu'ils aient été envoyés via l'API, le tableau de bord ou une campagne. Les résultats sont renvoyés par pages de 200, du plus ancien au plus récent. Les mêmes données sont disponibles sur la page Rapports.
Exemple rapide#
curl -X POST https://wbiztool.com/api/v1/report/ \
-H "Content-Type: application/json" \
-d '{
"client_id": 12345,
"api_key": "YOUR_API_KEY",
"start_date": "01-09-2026",
"end_date": "08-09-2026",
"page": 1
}'import requests
page = 1
history = []
while True:
response = requests.post(
"https://wbiztool.com/api/v1/report/",
json={
"client_id": 12345,
"api_key": "YOUR_API_KEY",
"start_date": "01-09-2026",
"end_date": "08-09-2026",
"page": page, # must be a JSON number, not a string
},
timeout=60,
)
result = response.json() # read the body even when the HTTP code is 400
if result.get("message") != "Success" or "total" not in result:
print("Failed:", result.get("message", "no message in response"))
break
history.extend(result["history"])
if page * 200 >= result["total"]:
break
page += 1
failed = [m for m in history if m["message_status"] == "Failed"]
print(len(history), "messages,", len(failed), "failed")// Node.js 18+ (built-in fetch). Save as .mjs to use top-level await.
const history = [];
let page = 1;
while (true) {
const response = await fetch("https://wbiztool.com/api/v1/report/", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
client_id: 12345,
api_key: "YOUR_API_KEY",
start_date: "01-09-2026",
end_date: "08-09-2026",
page, // must be a JSON number, not a string
}),
});
const result = await response.json(); // read the body even when the HTTP code is 400
if (result.message !== "Success" || !("total" in result)) {
console.error("Failed:", result.message ?? "no message in response");
break;
}
history.push(...result.history);
if (page * 200 >= result.total) break;
page += 1;
}
const failed = history.filter((m) => m.message_status === "Failed");
console.log(`${history.length} messages, ${failed.length} failed`);<?php
$history = [];
$page = 1;
do {
$ch = curl_init('https://wbiztool.com/api/v1/report/');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
CURLOPT_POSTFIELDS => json_encode([
'client_id' => 12345,
'api_key' => 'YOUR_API_KEY',
'start_date' => '01-09-2026',
'end_date' => '08-09-2026',
'page' => $page, // an integer, so json_encode sends a number
]),
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 60,
]);
$result = json_decode(curl_exec($ch), true);
curl_close($ch);
if (($result['message'] ?? '') !== 'Success' || !isset($result['total'])) {
echo 'Failed: ' . ($result['message'] ?? 'no message in response');
break;
}
$history = array_merge($history, $result['history']);
$page++;
} while (($page - 1) * 200 < $result['total']);
echo count($history) . ' messages';Remplacez 12345 et YOUR_API_KEY par vos propres valeurs. Consultez Authentification pour savoir où les trouver.
Paramètres de la requête#
Authentification
client_idintegerobligatoireVotre ID client API, dans Paramètres → Clés API.
api_keystringobligatoireVotre clé API, sur cette même page.
Filtres
start_datestringobligatoirePremier jour à inclure, au format
DD-MM-YYYY, par exemple01-09-2026.end_datestringobligatoireFin de la plage, au format
DD-MM-YYYY. Ce jour lui-même n'est pas inclus. Consultez Plage de dates.whatsapp_clientintegerfacultatifRenvoie uniquement les messages envoyés depuis ce numéro WhatsApp, à l'aide de son ID indiqué dans les paramètres WhatsApp. Omettez-le pour obtenir les messages de tous vos numéros.
pageintegerfacultatifNuméro de page, à partir de
1(valeur par défaut). Chaque page contient jusqu'à 200 messages. Envoyez-le sous forme de nombre JSON.0ou un nombre négatif renvoietotalavec unhistoryvide.
Plage de dates#
Les dates sont interprétées comme minuit au début de ce jour, à l'heure normale de l'Inde (IST, UTC+5:30), et les messages sont sélectionnés selon leur date de création (mise en file d'attente ou planification), et non leur date d'envoi. La plage va de start_date 00:00 jusqu'à end_date 00:00, donc :
"start_date": "01-09-2026", "end_date": "08-09-2026"renvoie du 1er au 7 septembre. Le 8 septembre n'est pas inclus.- Pour obtenir une seule journée, définissez
end_datesur le jour suivant :"start_date": "15-09-2026", "end_date": "16-09-2026". - Si les deux dates sont identiques, vous n'obtenez aucun message.
Pagination#
Chaque réponse contient total, le nombre de messages sur toute la plage, et jusqu'à 200 d'entre eux dans history. Demandez les page 2, 3 et ainsi de suite jusqu'à ce que page × 200 soit supérieur ou égal à total.
Réponse#
Une requête réussie renvoie le code HTTP 200 :
{
"message": "Success",
"status": 0,
"total": 3,
"history": [
{ "id": 9817263, "msg_type": "Text", "contact": "919876543210", "message_status": "Sent" },
{ "id": 9817264, "msg_type": "File", "contact": "919812345670", "message_status": "Failed" },
{ "id": 9817265, "msg_type": "Image", "contact": "Sales Team Mumbai", "message_status": "Pending" }
]
}
| Champ | Type | Description |
|---|---|---|
message | string | Success lorsque la requête a réussi, sinon l'erreur. |
status | integer | Toujours 0. Ne l'utilisez pas pour détecter un succès. |
total | integer | Nombre de messages dans la plage de dates, toutes pages confondues. Présent uniquement en cas de succès. |
history | array | Jusqu'à 200 messages sur cette page, du plus ancien au plus récent. Vide en cas d'erreur. |
history[].id | integer | ID du message, identique au msg_id renvoyé lors de son envoi. |
history[].msg_type | string | Text, Image ou File. |
history[].contact | string | Le numéro de téléphone du destinataire avec l'indicatif pays, ou le nom du groupe pour les messages de groupe. |
history[].message_status | string | Consultez le tableau ci-dessous. |
Valeurs de statut des messages#
message_status | Signification |
|---|---|
Pending | En file d'attente ou planifié, pas encore envoyé (statut 0). |
Sent | Envoyé depuis votre numéro WhatsApp (statut 1). |
Delivered | Réservé, non renvoyé actuellement. |
Read | Réservé, non renvoyé actuellement. |
Failed | N'a pas pu être envoyé, ou l'envoi a été interrompu (statut 2). Utilisez Statut du message pour consulter l'error. |
Cancelled | Annulé avant d'être envoyé (statut 3). |
Expired | Non envoyé avant son délai expire_after_seconds (statut 4). |
Les coches de remise et de lecture ne sont pas enregistrées pour le moment : les messages envoyés apparaissent donc toujours comme Sent. Delivered et Read sont des valeurs réservées ; si elles apparaissent un jour, traitez-les comme Sent.
Erreurs#
Les erreurs renvoient le code HTTP 200 avec status à 0, sauf indication contraire :
{ "message": "Error", "status": 0, "history": [] }
| Message | Comment corriger |
|---|---|
Error | start_date ou end_date est absent ou n'est pas au format DD-MM-YYYY, le corps JSON n'est pas valide (souvent à cause d'une virgule finale), ou la requête n'était pas un POST. |
Auth Error | Envoyez à la fois client_id et api_key. |
Invalid Client Id | Envoyez client_id sous forme de nombre. Renvoyé avec le code HTTP 403, sans history. |
Auth Error: invalid api key | Vérifiez que la clé existe, n'a pas été supprimée et appartient à ce client_id. Renvoyé avec le code HTTP 400, sans history. |
Demo Account can not access apis | Utilisez un compte standard. |
Conseils#
- Récupérez l'historique par petites plages : une journée ou une semaine à la fois limite le nombre de pages.
- Retrouvez les messages en échec : filtrez
historysurFailed, puis appelez Statut du message avec chaqueidpour connaître la raison de l'échec. Avant de réessayer, vérifiez l'error:Sending was interrupted and may have been delivered…signifie que le destinataire a peut-être déjà reçu le message. - Les anciens messages sont purgés : les messages qui ont atteint un statut final et n'ont pas changé depuis environ 90 jours peuvent être purgés et ne plus apparaître ici, de même que les messages toujours en file d'attente 90 jours après leur création ou leur date programmée, sur un numéro déconnecté ou supprimé.
- Suivi en temps réel : pour réagir dès l'envoi des messages, transmettez un
webhooklorsque vous envoyez le message au lieu d'interroger régulièrement cet endpoint.
