Отправка сообщений WhatsApp на Node.js
Отправляйте тексты, изображения и файлы WhatsApp из приложения на Node.js с вашего собственного номера, привязанного к WbizTool как WhatsApp Web. Используйте официальный пакет wbiztool-client или fetch, встроенный в Node.js 18 и новее.
Бесплатный пробный период: 50 сообщений за любые 30 дней, без карты.
Как это работает
Получите API-ключ и привяжите номер
Зарегистрируйтесь, затем привяжите номер WhatsApp на странице «Номера WhatsApp» по QR-коду или коду привязки, как WhatsApp Web. В разделе «Настройки → API-ключи» создайте ключ и скопируйте свой Client ID (где их найти, показано в руководстве по API-ключам ниже). ID на карточке номера (например, ID 678) – это ваш
whatsapp_client.Установите клиент или используйте fetch
Выполните
npm install wbiztool-client, чтобы установить официальный клиент. Или вызывайте API через fetch, которому в Node.js 18 и новее не нужен никакой пакет.Отправьте сообщение
Отправьте POST с учётными данными, номером телефона и текстом на
https://wbiztool.com/api/v1/send_msg/. Ответ с"status": 1иmsg_idозначает, что сообщение поставлено в очередь на вашем номере.Проверьте, что оно ушло
Передайте URL в
webhook, чтобы узнать, когда сообщение отправлено или не отправлено, или запросите эндпоинт статуса сообщения сmsg_id.
Примеры кода: Node.js
npm install wbiztool-clientconst { 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);// 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);
}{"status": 1, "message": "Created", "msg_id": 9817263}// 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());// Node.js 18+ (built-in fetch). Save as .mjs to use top-level await.
const msgId = 9817263;
const response = await fetch(`https://wbiztool.com/api/v1/message/status/${msgId}/`, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
client_id: 12345,
api_key: "YOUR_API_KEY",
}),
});
const result = await response.json(); // read the body even when the HTTP code is 400
if (result.message === "Unknown message id") {
console.log("No message with this ID in your workspace");
} else if (!("status_text" in result)) {
console.error("Request failed:", result.message ?? "no message in response");
} else if (result.status === 1) {
console.log("Sent");
} else if (result.status === 2) {
console.log("Failed:", result.error);
} else {
console.log("Status:", result.status_text);
}// Node.js 18+ (built-in fetch). Save as .mjs to use top-level await.
const tz = "Asia/Kolkata";
const sendAt = new Date(Date.now() + 2 * 60 * 60 * 1000); // two hours from now
// Format the date and time in the timezone you send, not your server's.
const date = new Intl.DateTimeFormat("en-GB", { timeZone: tz, day: "2-digit", month: "2-digit", year: "numeric" }).format(sendAt); // "24/12/2026"
const time = new Intl.DateTimeFormat("en-GB", { timeZone: tz, hour: "2-digit", minute: "2-digit", hourCycle: "h23" }).format(sendAt); // "09:00"
const response = await fetch("https://wbiztool.com/api/v1/schedule_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, a reminder that your appointment starts in 30 minutes.",
date,
time,
timezone: tz,
}),
});
const result = await response.json(); // schedule errors come back with HTTP 200 and "status": 0
if (result.status === 1) {
console.log("Scheduled with msg_id", result.msg_id);
} else {
console.error("Failed:", result.message ?? "no message in response");
}const express = require("express");
const app = express();
// WbizTool posts form fields, not JSON.
app.post("/wbiztool-webhook", express.urlencoded({ extended: false }), (req, res) => {
const { msg_id, status } = req.body; // status: SENT, FAILED, CANCELLED or EXPIRED
console.log(msg_id, status);
res.sendStatus(200);
});
app.listen(3000);Что можно делать
Тексты, изображения и файлы
Укажите
msg_type0 для текста, 1 для изображения или 2 для файла. Передайте публичныйimg_urlилиfile_urlлибо загрузите файл как multipart form data в полеfile.Личные сообщения из ваших данных
Заполняйте
msgиз своих записей – имя, номер заказа, срок оплаты. Работает форматирование WhatsApp, например *жирный* и _курсив_, до 3 000 символов.Вебхуки для каждого статуса
Передайте
webhook, и ваш сервер получит POST в формате form-encoded, напримерmsg_id=9817263&status=SENT, когда сообщение отправлено, не отправлено, отменено или истекло.Планирование на потом
Отправьте POST на
/api/v1/schedule_msg/сdate(дд/мм/гггг),time(ЧЧ:ММ) иtimezone. Форматируйте дату черезIntl.DateTimeFormatв том же часовом поясе, а не в часовом поясе сервера.Отбрасывайте опоздавшие сообщения
expire_after_secondsпомечает сообщение как истёкшее, если оно не ушло вовремя, – это подходит для срочных сообщений, например о времени доставки.Повторяющиеся напоминания
API напоминаний повторяет сообщение по расписанию cron, например 1-го числа каждого месяца в 10:00. Напоминаниям нужен платный тариф.
Полезно знать
"status": 1означает, что сообщение в очереди, а не доставлено. «Отправлено» – конечное успешное состояние; API не сообщает, доставлено ли сообщение и прочитано ли оно.- Ошибки отправки сообщения приходят с HTTP 400 (429 при дневном лимите); ошибки планирования обычно приходят с HTTP 200 и
"status": 0, поэтому всегда разбирайте тело ответа и проверяйтеstatus, а неresponse.ok. scheduleMessageофициального клиента отправляет поле, которое эндпоинт планирования не читает. Вместо него вызывайте/api/v1/schedule_msg/через fetch, как показано выше.- Храните API-ключ на сервере, например в переменной окружения. Любой, у кого он есть, может отправлять с ваших номеров, поэтому никогда не размещайте его в JavaScript в браузере, в мобильном приложении или в публикуемом коде.
- Чтобы написать в группу WhatsApp вместо номера, см. пример отправки сообщений в группы: это работает на любом тарифе, включая пробный период.
- В пробном периоде – 50 сообщений за любые 30 дней и 1 номер, без карты. На платных тарифах – от $25 в месяц в США (ваша цена – на странице «Цены») – сообщения безлимитные в рамках честного использования: до 1 000 в день с одного номера.
- Сообщения уходят с вашего собственного номера WhatsApp, поэтому действуют правила самого WhatsApp: пишите тем, кто ждёт ваших сообщений.
Вопросы и ответы
- Есть ли официальный пакет Node.js для API WbizTool?
- Да:
wbiztool-clientна npm (npm install wbiztool-client). ЕгоsendMessageотправляет сообщение. Для планирования и проверки статуса вызывайте эндпоинты через fetch, как показано выше. - Можно ли вызывать API из браузера?
- Не стоит: запрос содержит ваш API-ключ, а любой, у кого он есть, может отправлять с ваших номеров. Вызывайте API со своего сервера на Node.js и храните ключ в переменной окружения.
- Как узнать, что сообщение отправлено?
- Ответ с
"status": 1иmsg_idозначает, что оно в очереди. Передайте URL вwebhook, чтобы получить POST сSENT,FAILED,CANCELLEDилиEXPIRED, или вызовите эндпоинт статуса сообщения сmsg_id. «Отправлено» – конечное состояние: API не сообщает о доставке или прочтении. - В каком формате указывать номер телефона?
- Передайте номер с кодом страны (79161234567) или без него (9161234567) вместе с
country_code(7). Пробелы, +, дефисы и скобки удаляются автоматически, поэтому +7 (916) 123-45-67 тоже подойдёт. - Нужны ли WhatsApp Business API или одобрение Meta?
- Нет. WbizTool отправляет с вашего собственного номера WhatsApp или WhatsApp Business, привязанного как WhatsApp Web. Одобрение Meta не нужно, и согласовывать шаблоны сообщений тоже не надо.
- Есть ли плата за каждое сообщение?
- Нет. Пробный период включает 50 сообщений за любые 30 дней. На платных тарифах сообщения безлимитные в рамках честного использования, до 1 000 в день с одного номера: Lite – $25, Standard – $59 и Advanced – $149 в месяц в США; на странице «Цены» показана цена для вашей страны.
Читайте руководства
- API отправки сообщения
- API статуса сообщения
- API планирования сообщения
- API-ключи и Client ID
- Подключение номера WhatsApp
Смотрите также
- PythonОтправляйте сообщения WhatsApp из Python с официальным клиентом или обычным requests.
- cURLОтправляйте, планируйте и отслеживайте сообщения WhatsApp одной командой cURL.
- n8nОтправляйте сообщения WhatsApp из n8n с community-узлом WbizTool.
- Уведомления о заказахПодтверждения заказов, уведомления об отправке и оповещения о новых заказах для Shopify, WooCommerce и не только.
Отправьте своё первое автоматическое сообщение в WhatsApp уже сегодня
Создайте аккаунт, отсканируйте QR-код и отправьте сообщение менее чем за пять минут.
Начать бесплатноПлатные тарифы – от $25 в месяц в США. Цены
