API Pesan
API Riwayat Pesan
Dapatkan daftar pesan di workspace Anda untuk rentang tanggal tertentu, beserta status masing-masing. Gunakan untuk mencocokkan apa yang sudah terkirim, membuat laporan, atau menemukan pesan gagal untuk dikirim ulang.
https://wbiztool.com/api/v1/report/Body: JSON (diperlukan untuk halaman setelah halaman pertama) atau field formulir
Riwayat mencakup setiap pesan di workspace API key Anda, baik yang dikirim melalui API, dashboard, maupun kampanye. Hasil ditampilkan 200 per halaman, dari yang terlama. Data yang sama tersedia di halaman Reports (Laporan).
Contoh singkat#
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';Ganti 12345 dan YOUR_API_KEY dengan nilai Anda sendiri. Lihat Autentikasi untuk mengetahui di mana menemukannya.
Parameter request#
Autentikasi
client_idintegerwajibAPI Client ID Anda dari Settings → API keys (Pengaturan → Kunci API).
api_keystringwajibAPI key Anda dari halaman yang sama.
Filter
start_datestringwajibHari pertama yang disertakan, dalam format
DD-MM-YYYY, misalnya01-09-2026.end_datestringwajibAkhir rentang, dalam format
DD-MM-YYYY. Hari ini sendiri tidak disertakan. Lihat Rentang tanggal.whatsapp_clientintegeropsionalHanya kembalikan pesan yang dikirim dari nomor WhatsApp ini, menggunakan ID-nya dari WhatsApp settings (pengaturan WhatsApp). Hilangkan untuk mendapatkan pesan dari semua nomor Anda.
pageintegeropsionalNomor halaman, dimulai dari
1(default). Setiap halaman berisi hingga 200 pesan. Kirim sebagai angka JSON.0atau angka negatif mengembalikantotaldenganhistorykosong.
Rentang tanggal#
Tanggal dibaca sebagai tengah malam di awal hari tersebut dalam Waktu Standar India (IST, UTC+5:30), dan pesan dicocokkan berdasarkan waktu pembuatannya (masuk antrean atau dijadwalkan), bukan waktu pengirimannya. Rentang berjalan dari start_date 00:00 hingga end_date 00:00, sehingga:
"start_date": "01-09-2026", "end_date": "08-09-2026"mengembalikan 1 hingga 7 September. 8 September tidak disertakan.- Untuk mendapatkan satu hari saja, isi
end_datedengan hari berikutnya:"start_date": "15-09-2026", "end_date": "16-09-2026". - Jika kedua tanggal sama, Anda tidak mendapatkan pesan apa pun.
Paginasi#
Setiap respons berisi total, yaitu jumlah pesan di seluruh rentang, dan hingga 200 pesan di history. Minta page 2, 3, dan seterusnya sampai page × 200 paling tidak sama dengan total.
Respons#
Request yang berhasil mengembalikan 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" }
]
}
| Field | Tipe | Deskripsi |
|---|---|---|
message | string | Success jika request berhasil, selain itu berisi error. |
status | integer | Selalu 0. Jangan gunakan untuk mendeteksi keberhasilan. |
total | integer | Jumlah pesan dalam rentang tanggal di semua halaman. Hanya ada jika berhasil. |
history | array | Hingga 200 pesan di halaman ini, dari yang terlama. Kosong jika terjadi error. |
history[].id | integer | ID pesan, sama dengan msg_id yang dikembalikan saat pesan dikirim. |
history[].msg_type | string | Text, Image, atau File. |
history[].contact | string | Nomor telepon penerima dengan kode negara, atau nama grup untuk pesan grup. |
history[].message_status | string | Lihat tabel di bawah. |
Nilai status pesan#
message_status | Arti |
|---|---|
Pending | Dalam antrean atau terjadwal, belum terkirim (status 0). |
Sent | Sudah dikirim dari nomor WhatsApp Anda (status 1). |
Delivered | Dicadangkan, saat ini tidak dikembalikan. |
Read | Dicadangkan, saat ini tidak dikembalikan. |
Failed | Tidak dapat dikirim, atau pengiriman terputus (status 2). Gunakan Status pesan untuk melihat error. |
Cancelled | Dibatalkan sebelum terkirim (status 3). |
Expired | Tidak terkirim sebelum batas waktu expire_after_seconds (status 4). |
Centang terkirim dan dibaca saat ini tidak dicatat, sehingga pesan yang terkirim selalu tampil sebagai Sent. Delivered dan Read adalah nilai yang dicadangkan; jika suatu saat muncul, anggap sebagai Sent.
Error#
Error mengembalikan HTTP 200 dengan status bernilai 0, kecuali disebutkan lain:
{ "message": "Error", "status": 0, "history": [] }
| Pesan | Cara memperbaikinya |
|---|---|
Error | start_date atau end_date tidak dikirim atau tidak dalam format DD-MM-YYYY, body JSON tidak valid (sering kali karena koma di akhir), atau request bukan POST. |
Auth Error | Kirim client_id dan api_key. |
Invalid Client Id | Kirim client_id sebagai angka. Dikembalikan dengan HTTP 403, tanpa history. |
Auth Error: invalid api key | Pastikan key tersebut ada, belum dihapus, dan milik client_id ini. Dikembalikan dengan HTTP 400, tanpa history. |
Demo Account can not access apis | Gunakan akun biasa. |
Tips#
- Ambil riwayat dalam rentang kecil: satu hari atau satu minggu sekaligus membuat jumlah halaman tetap sedikit.
- Temukan pesan yang gagal: filter
historyuntukFailed, lalu panggil Status pesan dengan setiapiduntuk melihat penyebab kegagalannya. Sebelum mencoba ulang, periksaerror:Sending was interrupted and may have been delivered…berarti penerima mungkin sudah menerima pesan tersebut. - Pesan lama dihapus: pesan yang sudah mencapai status final dan tidak berubah selama sekitar 90 hari dapat dihapus dan tidak lagi muncul di sini, begitu pula pesan yang masih dalam antrean 90 hari setelah dibuat atau dijadwalkan, pada nomor yang terputus atau dihapus.
- Pelacakan real-time: untuk bereaksi saat pesan terkirim, kirim
webhookketika Anda mengirim pesan, bukan melakukan polling ke endpoint ini.
