API Pesan
API Kirim Pesan
Kirim teks, gambar, atau dokumen WhatsApp ke satu nomor telepon dari nomor WhatsApp Anda yang terhubung. Gunakan untuk konfirmasi pesanan, pengingat pembayaran, notifikasi, dan balasan layanan pelanggan.
https://wbiztool.com/api/v1/send_msg/Body: JSON, field formulir, atau multipart/form-data saat mengunggah file
Pesan masuk antrean dan dikirim dari nomor WhatsApp Anda dalam hitungan detik. Respons memberi Anda msg_id yang dapat digunakan untuk memeriksa statusnya.
Contoh singkat#
curl -X POST https://wbiztool.com/api/v1/send_msg/ \
-H "Content-Type: application/json" \
-d '{
"client_id": 12345,
"api_key": "YOUR_API_KEY",
"whatsapp_client": 678,
"msg_type": 0,
"country_code": "91",
"phone": "9876543210",
"msg": "Hi Aman, your order #4821 has shipped and will arrive on Thursday."
}'import requests
response = requests.post(
"https://wbiztool.com/api/v1/send_msg/",
json={
"client_id": 12345,
"api_key": "YOUR_API_KEY",
"whatsapp_client": 678,
"msg_type": 0,
"country_code": "91",
"phone": "9876543210",
"msg": "Hi Aman, your order #4821 has shipped and will arrive on Thursday.",
},
timeout=60,
)
result = response.json() # read the body even when the HTTP code is 400
if result.get("status") == 1:
print("Queued with msg_id", result["msg_id"])
else:
print("Failed:", result.get("message"))// Node.js 18+ (built-in fetch). Save as .mjs to use top-level await.
const response = await fetch("https://wbiztool.com/api/v1/send_msg/", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
client_id: 12345,
api_key: "YOUR_API_KEY",
whatsapp_client: 678,
msg_type: 0,
country_code: "91",
phone: "9876543210",
msg: "Hi Aman, your order #4821 has shipped and will arrive on Thursday.",
}),
});
const result = await response.json(); // read the body even when the HTTP code is 400
if (result.status === 1) {
console.log("Queued with msg_id", result.msg_id);
} else {
console.error("Failed:", result.message);
}<?php
$payload = [
'client_id' => 12345,
'api_key' => 'YOUR_API_KEY',
'whatsapp_client' => 678,
'msg_type' => 0,
'country_code' => '91',
'phone' => '9876543210',
'msg' => 'Hi Aman, your order #4821 has shipped and will arrive on Thursday.',
];
$ch = curl_init('https://wbiztool.com/api/v1/send_msg/');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
CURLOPT_POSTFIELDS => json_encode($payload),
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 60,
]);
$result = json_decode(curl_exec($ch), true);
curl_close($ch);
if (($result['status'] ?? 0) === 1) {
echo 'Queued with msg_id ' . $result['msg_id'];
} else {
echo 'Failed: ' . ($result['message'] ?? 'no response');
}Ganti 12345, YOUR_API_KEY, dan 678 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.
whatsapp_clientintegerWajib jika Anda memiliki lebih dari satu nomorID nomor WhatsApp yang digunakan untuk mengirim, dari WhatsApp settings (pengaturan WhatsApp). Jika tidak dikirim dan workspace Anda memiliki tepat satu nomor yang terhubung, nomor tersebut yang digunakan.
Penerima dan pesan
phonestringwajibNomor WhatsApp penerima, hanya angka. Spasi,
+,-,., dan tanda kurung otomatis dihapus. Kirim nomor dengan kode negaranya (919876543210) atau tanpa kode negara (9876543210) bersamacountry_code. Dengan field formulir, jangan sertakan awalan0di depan (09876543210): angka ini tidak dihapus sebelumcountry_codeditambahkan, sehingga pesan terkirim ke nomor yang salah. Request JSON menghapusnya secara otomatis.country_codestringopsionalKode panggilan negara tanpa
+, misalnya91untuk India atau1untuk Amerika Serikat. Kode ini ditambahkan di depanphonekecuali nomornya sudah diawali kode tersebut. Pengecualian: dengan91, nomor 10 digit selalu mendapat awalan. Dengan kode lain, nomor lokal yang diawali angka yang sama tidak diberi awalan, jadi kirim nomor tersebut lengkap dengan kode negaranya.msg_typeintegeropsional0teks (default),1gambar,2file atau dokumen.msgstringWajib jika msg_type bernilai 0Teks pesan, hingga 3.000 karakter. Untuk gambar dan file, ini adalah keterangan (caption) dan boleh kosong. Format WhatsApp berfungsi:
*bold*,_italic_,~strikethrough~.messagediterima sebagai alias.
Gambar dan file
img_urlstringWajib jika msg_type bernilai 1 dan tidak ada file yang diunggahURL
httpatauhttpspublik dari gambar.file_urlstringWajib jika msg_type bernilai 2 dan tidak ada file yang diunggahURL
httpatauhttpspublik tempat file dapat diunduh secara langsung.filefileopsionalUnggah gambar atau file sebagai ganti URL. Kirim request sebagai
multipart/form-datadengan field bernamafile.file_namestringopsionalNama file yang dilihat penerima, misalnya
invoice-4821.pdf. Ekstensinya menentukan cara file dikirim, jadi sertakan ekstensi. Nama dikirim dalam huruf kecil, karakter seperti& : ? * $ ;diganti dengan_, dan dipotong menjadi 150 karakter. Jika tidak dikirim, nama diambil dari URL atau file yang diunggah.
Opsi pengiriman
expire_after_secondsintegeropsionalTandai pesan sebagai kedaluwarsa (status
4) jika belum terkirim dalam jumlah detik ini, misalnya3600untuk satu jam. Berguna untuk pesan yang bergantung pada waktu, seperti perkiraan waktu pengantaran. Proses latar belakang melakukannya paling cepat 30 detik setelah batas waktu, jadi jangan mengandalkannya untuk batas waktu yang lebih pendek dari satu menit.webhookstringopsionalURL yang menerima
POSTketika pesan terkirim atau gagal. Lihat Webhook.
Mengirim gambar dan file#
Batas unduhan untuk img_url dan file_url:
- URL harus publik:
httpatauhttps, dapat dijangkau dari internet. Hingga 5 redirect diikuti, dan setiap redirect juga harus mengarah ke alamat publik. - File yang ditautkan boleh berukuran hingga 100 MB. Server harus mulai merespons dalam 45 detik dan tidak boleh berhenti lebih lama dari itu.
- File diambil saat Anda memanggil API, jadi tautan yang rusak langsung gagal dengan
Invalid file url.
Ekstensi yang didukung: .pdf, .xlsx, .xls, .txt, .docx, .png, .jpg, .jpeg, .webp, .mp3, .mpga, .m4a, .mp4, .webm.
Pemeriksaan berikut dijalankan saat pesan dikirim, bukan saat Anda memanggil API, sehingga kegagalannya hanya terlihat di Status pesan dan webhook:
| Masalah | error di Status pesan |
|---|---|
Gambar (msg_type 1) lebih dari 16 MB | File exceeds WhatsApp size limit (16MB max) |
Video (.mp4, .webm) lebih dari 64 MB, atau file kosong | File exceeds WhatsApp size limit (…) |
File .ogg, atau file .wav yang dikirim sebagai gambar (msg_type 1) | File type not supported |
Audio WAV dan OGG tidak didukung. File .wav yang dikirim sebagai file (msg_type 2) tidak ditolak, tetapi diterima sebagai recording.wav.pdf. Konversi audio ke .mp3 atau .m4a terlebih dahulu.
curl -X POST https://wbiztool.com/api/v1/send_msg/ \
-H "Content-Type: application/json" \
-d '{
"client_id": 12345,
"api_key": "YOUR_API_KEY",
"whatsapp_client": 678,
"msg_type": 1,
"country_code": "91",
"phone": "9876543210",
"img_url": "https://example.com/offers/diwali-sale.jpg",
"msg": "Our Diwali sale starts today 🎉"
}'import requests
response = requests.post(
"https://wbiztool.com/api/v1/send_msg/",
json={
"client_id": 12345,
"api_key": "YOUR_API_KEY",
"whatsapp_client": 678,
"msg_type": 1,
"country_code": "91",
"phone": "9876543210",
"img_url": "https://example.com/offers/diwali-sale.jpg",
"msg": "Our Diwali sale starts today 🎉",
},
timeout=60,
)
print(response.json())// Node.js 18+ (built-in fetch). Save as .mjs to use top-level await.
const response = await fetch("https://wbiztool.com/api/v1/send_msg/", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
client_id: 12345,
api_key: "YOUR_API_KEY",
whatsapp_client: 678,
msg_type: 1,
country_code: "91",
phone: "9876543210",
img_url: "https://example.com/offers/diwali-sale.jpg",
msg: "Our Diwali sale starts today 🎉",
}),
});
console.log(await response.json());<?php
$ch = curl_init('https://wbiztool.com/api/v1/send_msg/');
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',
'whatsapp_client' => 678,
'msg_type' => 1,
'country_code' => '91',
'phone' => '9876543210',
'img_url' => 'https://example.com/offers/diwali-sale.jpg',
'msg' => 'Our Diwali sale starts today 🎉',
]),
CURLOPT_RETURNTRANSFER => true,
]);
echo curl_exec($ch);
curl_close($ch);curl -X POST https://wbiztool.com/api/v1/send_msg/ \
-F client_id=12345 \
-F api_key=YOUR_API_KEY \
-F whatsapp_client=678 \
-F msg_type=2 \
-F country_code=91 \
-F phone=9876543210 \
-F "msg=Your invoice for order #4821 is attached." \
-F file_name=invoice-4821.pdf \
-F file=@./invoice-4821.pdfimport requests
with open("invoice-4821.pdf", "rb") as f:
response = requests.post(
"https://wbiztool.com/api/v1/send_msg/",
data={
"client_id": 12345,
"api_key": "YOUR_API_KEY",
"whatsapp_client": 678,
"msg_type": 2,
"country_code": "91",
"phone": "9876543210",
"msg": "Your invoice for order #4821 is attached.",
"file_name": "invoice-4821.pdf",
},
files={"file": f},
timeout=120,
)
print(response.json())// Node.js 20+ (built-in fetch, FormData and fs.openAsBlob). Save as .mjs to use top-level await.
import { openAsBlob } from "node:fs";
const form = new FormData();
form.append("client_id", "12345");
form.append("api_key", "YOUR_API_KEY");
form.append("whatsapp_client", "678");
form.append("msg_type", "2");
form.append("country_code", "91");
form.append("phone", "9876543210");
form.append("msg", "Your invoice for order #4821 is attached.");
form.append("file_name", "invoice-4821.pdf");
form.append("file", await openAsBlob("./invoice-4821.pdf"), "invoice-4821.pdf");
// Don't set Content-Type yourself; fetch adds the multipart boundary.
const response = await fetch("https://wbiztool.com/api/v1/send_msg/", { method: "POST", body: form });
console.log(await response.json());<?php
$ch = curl_init('https://wbiztool.com/api/v1/send_msg/');
curl_setopt_array($ch, [
CURLOPT_POST => true,
// An array body (not json_encode) makes cURL send multipart/form-data.
CURLOPT_POSTFIELDS => [
'client_id' => 12345,
'api_key' => 'YOUR_API_KEY',
'whatsapp_client' => 678,
'msg_type' => 2,
'country_code' => '91',
'phone' => '9876543210',
'msg' => 'Your invoice for order #4821 is attached.',
'file_name' => 'invoice-4821.pdf',
'file' => new CURLFile('/path/to/invoice-4821.pdf', 'application/pdf', 'invoice-4821.pdf'),
],
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 120,
]);
echo curl_exec($ch);
curl_close($ch);Menggunakan klien resmi#
Klien Python dan Node.js memanggil endpoint ini untuk Anda.
from wbiztool_client import WbizToolClient
client = WbizToolClient(api_key="YOUR_API_KEY", client_id="12345")
result = client.send_message(
phone="9876543210",
country_code="91",
msg="Hi Aman, your order #4821 has shipped.",
whatsapp_client=678,
)
print(result)Error memunculkan requests.HTTPError. Baca penyebabnya dengan e.response.json()["message"].
const { WbizToolClient } = require("wbiztool-client");
const client = new WbizToolClient({
clientId: 12345,
apiKey: "YOUR_API_KEY",
whatsappClient: 678,
});
(async () => {
// Errors throw, with the API's response in the error message.
const result = await client.sendMessage({
phone: "9876543210",
countryCode: "91",
message: "Hi Aman, your order #4821 has shipped.",
});
console.log(result);
})().catch(console.error);Respons#
Request yang berhasil mengembalikan HTTP 200:
{
"status": 1,
"message": "Created",
"msg_id": 9817263
}
| Field | Tipe | Deskripsi |
|---|---|---|
status | integer | 1 jika pesan masuk antrean, 0 jika request gagal. |
message | string | Created jika berhasil, selain itu berisi error. |
msg_id | integer | ID pesan dalam antrean. Simpan untuk memeriksa status nanti. Hanya ada jika berhasil. |
"status": 1 berarti pesan sudah masuk antrean, belum tentu sudah sampai ke penerima. Gunakan webhook atau Status pesan untuk memastikan pesan sudah terkirim.
Error#
Error mengembalikan HTTP 400 dengan status bernilai 0 (Account Disabled tidak memiliki field status):
{ "status": 0, "message": "Msg cant be null" }
| Pesan | Cara memperbaikinya |
|---|---|
Auth Error - Please send correct API key and Client id | Kirim api_key yang tidak kosong. |
Invalid client id. | Kirim client_id sebagai angka. |
Auth Error: invalid api key | Pastikan key tersebut ada, belum dihapus, dan milik client_id ini. |
Either phone or group_name parameter is required | Tambahkan phone. |
Please provide either phone OR group_name, not both | Hapus salah satunya. |
Invalid phone number | phone hanya boleh berisi angka (6–17 digit), boleh diawali +. |
Invalid Contact Number "…" | Setelah kode negara ditambahkan, nomor harus sepanjang 6–15 digit. |
Msg cant be null | Pesan teks (msg_type 0) memerlukan msg. |
Message length is too long | Batasi msg hingga 3.000 karakter atau kurang. |
Image Url Can't be null | Untuk msg_type 1, kirim img_url atau unggah file. |
File Url Can't be null | Untuk msg_type 2, kirim file_url atau unggah file. |
Invalid file url, Can't download / Invalid file url | URL tidak publik, waktu habis (timeout), atau file lebih dari 100 MB. |
Invalid whatsapp client | ID whatsapp_client tersebut tidak ada di workspace Anda. |
Invalid whatsapp client id. | Kirim whatsapp_client. Parameter ini wajib jika workspace Anda memiliki lebih dari satu nomor yang terhubung. |
Not enough credits | Paket Anda sudah tidak memiliki sisa pesan. |
Demo Account can not access apis | Gunakan akun biasa. |
Account Disabled | Akun Anda dinonaktifkan. Hubungi dukungan. |
Invalid JSON format: … | Body JSON tidak valid, sering kali karena koma di akhir atau baris baru tanpa escape di msg. Gunakan \n untuk baris baru. |
Pesan yang sudah masuk antrean masih bisa gagal saat dikirim, misalnya dengan File exceeds WhatsApp size limit (…). Error tersebut tidak pernah muncul di respons ini. Lihat Mengirim gambar dan file dan periksa Status pesan.
Webhook#
Jika Anda mengirim webhook, Wbiztool mengirim POST ke URL tersebut ketika pesan terkirim atau gagal. Body-nya dienkode sebagai formulir (application/x-www-form-urlencoded), bukan JSON:
msg_id=9817263&status=SENT
| Field | Nilai |
|---|---|
msg_id | msg_id yang dikembalikan saat Anda mengirim pesan. |
status | SENT atau FAILED |
Balas dengan kode 2xx apa pun. Jika endpoint Anda mengalami timeout (setelah 3 detik) atau mengembalikan 5xx, panggilan dicoba ulang hingga total 3 kali. Respons 4xx tidak dicoba ulang. Tidak ada webhook yang dikirim ketika pesan dibatalkan atau kedaluwarsa; gunakan Status pesan untuk kasus tersebut.
Tips#
- Nomor telepon: simpan nomor dalam format internasional dan kirim bersama
country_codeuntuk menghindari ambiguitas. - Baris baru di JSON: tulis sebagai
\ndi dalammsg. Baris baru mentah membuat JSON tidak valid. - Jaga nomor Anda tetap terhubung: pesan dikirim dari nomor WhatsApp Anda, jadi nomor tersebut harus tetap terhubung di WhatsApp settings.
- Banyak penerima: untuk mengirim pesan yang sama ke beberapa nomor dalam satu request, gunakan Kirim ke banyak nomor. Untuk kampanye besar, unggah spreadsheet dari halaman Campaigns (Kampanye).
