API mesej
API Sejarah Mesej
Dapatkan senarai mesej dalam ruang kerja anda bagi julat tarikh tertentu, beserta status setiap satu. Gunakannya untuk menyemak semula apa yang telah dihantar, membina laporan atau mencari mesej gagal untuk dicuba semula.
https://wbiztool.com/api/v1/report/Body: JSON (diperlukan untuk halaman selepas yang pertama) atau medan borang
Sejarah ini merangkumi setiap mesej dalam ruang kerja kunci API anda, sama ada dihantar melalui API, papan pemuka atau kempen. Hasil dipulangkan 200 setiap halaman, yang paling lama dahulu. Data yang sama boleh didapati di halaman Reports (Laporan).
Contoh ringkas#
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';Gantikan 12345 dan YOUR_API_KEY dengan nilai anda sendiri. Lihat Pengesahan identiti untuk mengetahui di mana nilai ini boleh didapati.
Parameter permintaan#
Pengesahan identiti
client_idintegerwajibAPI Client ID anda dari Settings → API keys (Tetapan → Kunci API).
api_keystringwajibKunci API anda dari halaman yang sama.
Penapis
start_datestringwajibHari pertama yang disertakan, dalam format
DD-MM-YYYY, contohnya01-09-2026.end_datestringwajibHujung julat, dalam format
DD-MM-YYYY. Hari ini sendiri tidak disertakan. Lihat Julat tarikh.whatsapp_clientintegerpilihanPulangkan hanya mesej yang dihantar dari nombor WhatsApp ini, menggunakan ID nombor dari tetapan WhatsApp. Jangan sertakan untuk mendapatkan mesej dari semua nombor anda.
pageintegerpilihanNombor halaman, bermula dari
1(lalai). Setiap halaman memuatkan sehingga 200 mesej. Hantarkannya sebagai nombor JSON.0atau nombor negatif memulangkantotaldenganhistoryyang kosong.
Julat tarikh#
Tarikh dibaca sebagai tengah malam pada permulaan hari itu dalam Waktu Piawai India (IST, UTC+5:30), dan mesej dipadankan mengikut masa ia dicipta (dimasukkan ke dalam baris gilir atau dijadualkan), bukan masa ia dihantar. Julat bermula dari start_date 00:00 hingga end_date 00:00, jadi:
"start_date": "01-09-2026", "end_date": "08-09-2026"memulangkan 1 hingga 7 September. 8 September tidak disertakan.- Untuk mendapatkan satu hari sahaja, tetapkan
end_datekepada hari berikutnya:"start_date": "15-09-2026", "end_date": "16-09-2026". - Jika kedua-dua tarikh sama, anda tidak akan mendapat sebarang mesej.
Penomboran halaman#
Setiap respons mengandungi total, iaitu bilangan mesej dalam keseluruhan julat, dan sehingga 200 daripadanya dalam history. Minta page 2, 3 dan seterusnya sehingga page × 200 sekurang-kurangnya sama dengan total.
Respons#
Permintaan yang berjaya memulangkan 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" }
]
}
| Medan | Jenis | Penerangan |
|---|---|---|
message | string | Success apabila permintaan berjaya, jika tidak, mesej ralat. |
status | integer | Sentiasa 0. Jangan gunakannya untuk mengesan kejayaan. |
total | integer | Bilangan mesej dalam julat tarikh merentasi semua halaman. Hanya ada jika berjaya. |
history | tatasusunan | Sehingga 200 mesej pada halaman ini, yang paling lama dahulu. Kosong apabila berlaku ralat. |
history[].id | integer | ID mesej, sama seperti msg_id yang dipulangkan semasa ia dihantar. |
history[].msg_type | string | Text, Image atau File. |
history[].contact | string | Nombor telefon penerima dengan kod negara, atau nama kumpulan bagi mesej kumpulan. |
history[].message_status | string | Lihat jadual di bawah. |
Nilai status mesej#
message_status | Maksud |
|---|---|
Pending | Dalam baris gilir atau dijadualkan, belum dihantar (status 0). |
Sent | Telah dihantar dari nombor WhatsApp anda (status 1). |
Delivered | Dikhaskan, tidak dipulangkan pada masa ini. |
Read | Dikhaskan, tidak dipulangkan pada masa ini. |
Failed | Tidak dapat dihantar, atau penghantaran terganggu (status 2). Gunakan Status mesej untuk melihat error. |
Cancelled | Dibatalkan sebelum dihantar (status 3). |
Expired | Tidak dihantar sebelum tarikh akhir expire_after_seconds (status 4). |
Tanda sampai dan tanda dibaca tidak direkodkan pada masa ini, jadi mesej yang dihantar sentiasa dipaparkan sebagai Sent. Delivered dan Read ialah nilai yang dikhaskan; jika ia muncul, anggap sebagai Sent.
Ralat#
Ralat memulangkan HTTP 200 dengan status ditetapkan kepada 0, kecuali dinyatakan sebaliknya:
{ "message": "Error", "status": 0, "history": [] }
| Mesej | Cara membetulkannya |
|---|---|
Error | start_date atau end_date tiada atau bukan dalam format DD-MM-YYYY, badan JSON tidak sah (selalunya koma di hujung), atau permintaan bukan POST. |
Auth Error | Hantar kedua-dua client_id dan api_key. |
Invalid Client Id | Hantar client_id sebagai nombor. Dipulangkan dengan HTTP 403, tanpa history. |
Auth Error: invalid api key | Pastikan kunci wujud, belum dipadam dan milik client_id ini. Dipulangkan dengan HTTP 400, tanpa history. |
Demo Account can not access apis | Gunakan akaun biasa. |
Petua#
- Tarik sejarah dalam julat kecil: sehari atau seminggu pada satu masa mengekalkan bilangan halaman yang sedikit.
- Cari mesej yang gagal: tapis
historyuntukFailed, kemudian panggil Status mesej dengan setiapiduntuk melihat sebab ia gagal. Sebelum mencuba semula, semakerror:Sending was interrupted and may have been delivered…bermaksud penerima mungkin sudah menerima mesej itu. - Mesej lama dibuang: mesej yang telah mencapai status muktamad dan tidak berubah selama kira-kira 90 hari mungkin dibuang dan tidak lagi muncul di sini, begitu juga mesej yang masih dalam baris gilir 90 hari selepas ia dicipta atau dijadualkan, pada nombor yang terputus sambungan atau dipadam.
- Penjejakan masa nyata: untuk bertindak balas semasa mesej dihantar, hantar
webhooksemasa anda menghantar mesej dan bukannya meninjau endpoint ini berulang kali.
