API сообщений
API планирования сообщений WhatsApp
Запланируйте отправку текста, изображения или документа WhatsApp на номер телефона или в группу на выбранные дату и время. Подходит для напоминаний о записи, поздравлений с днём рождения, повторных сообщений и предложений, ограниченных по времени.
https://wbiztool.com/api/v1/schedule_msg/Тело запроса: JSON или поля формы
Сообщение ждёт в очереди до запланированного времени, а затем отправляется с вашего номера WhatsApp. В ответе вы получаете msg_id, по которому можно проверить его статус или отменить его.
Быстрый пример#
curl -X POST https://wbiztool.com/api/v1/schedule_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, a reminder that your appointment is today at 11:30 AM.",
"date": "24/12/2026",
"time": "09:00",
"timezone": "Asia/Kolkata"
}'import requests
response = requests.post(
"https://wbiztool.com/api/v1/schedule_msg/",
json={
"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 is today at 11:30 AM.",
"date": "24/12/2026",
"time": "09:00",
"timezone": "Asia/Kolkata",
},
timeout=60,
)
result = response.json() # read the body even when the HTTP code is 400
if result.get("status") == 1:
print("Scheduled with msg_id", result["msg_id"])
else:
print("Failed:", result.get("message", "no message in response"))// Node.js 18+ (built-in fetch). Save as .mjs to use top-level await.
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 is today at 11:30 AM.",
date: "24/12/2026",
time: "09:00",
timezone: "Asia/Kolkata",
}),
});
const result = await response.json(); // read the body even when the HTTP code is 400
if (result.status === 1) {
console.log("Scheduled with msg_id", result.msg_id);
} else {
console.error("Failed:", result.message ?? "no message in response");
}<?php
$payload = [
'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 is today at 11:30 AM.',
'date' => '24/12/2026',
'time' => '09:00',
'timezone' => 'Asia/Kolkata',
];
$ch = curl_init('https://wbiztool.com/api/v1/schedule_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 'Scheduled with msg_id ' . $result['msg_id'];
} else {
echo 'Failed: ' . ($result['message'] ?? 'no message in response');
}Замените 12345, YOUR_API_KEY и 678 своими значениями. Где их найти, описано в разделе Аутентификация.
Параметры запроса#
Аутентификация
client_idintegerобязательноВаш API Client ID из раздела Настройки → API ключи.
api_keystringобязательноВаш API-ключ с той же страницы.
whatsapp_clientintegerобязательноID номера WhatsApp, с которого отправляется сообщение, со страницы настроек WhatsApp. В отличие от API отправки сообщений, этот endpoint никогда не выбирает номер за вас.
Расписание
datestringобязательноДень отправки сообщения в формате
dd/mm/yyyy, например24/12/2026.timestringобязательноВремя отправки сообщения в 24-часовом формате
HH:MM, например09:00или18:45. Секунды не указывайте.timezonestringнеобязательноЧасовой пояс, в котором указаны
dateиtime. Если не передан, используетсяIST(Индия). См. раздел Часовые пояса.
Получатель и сообщение
phonestringОбязателен, если не передан group_nameНомер WhatsApp получателя, только цифры. Пробелы,
+,-,.и скобки удаляются автоматически. Передайте номер либо с кодом страны (919876543210), либо без него (9876543210) вместе сcountry_code.group_namestringОбязателен, если не передан phoneНазвание группы WhatsApp, участником которой является ваш номер. Группа ищется так же, как в API отправки в группу. Передавайте
phoneилиgroup_name, но не оба параметра.country_codestringнеобязательноТелефонный код страны без
+, например91для Индии или1для США. Он добавляется передphone, если номер ещё не начинается с него. Исключение: с кодом91к 10-значному номеру префикс добавляется всегда. С другими кодами передавайте местные номера, которые начинаются с тех же цифр, уже с кодом страны. Для групп игнорируется.msg_typeintegerнеобязательно0— текст (по умолчанию),1— изображение,2— файл или документ.msgstringОбязателен, если msg_type равен 0Текст сообщения. Для изображений и файлов это подпись, она может быть пустой. Форматирование WhatsApp работает:
*bold*,_italic_,~strikethrough~. В качестве псевдонима принимаетсяmessage.
Изображения и файлы
img_urlstringОбязателен, если msg_type равен 1Публичный URL изображения (
httpилиhttps).file_urlstringОбязателен, если msg_type равен 2Публичный URL (
httpилиhttps), по которому файл можно скачать напрямую.file_namestringнеобязательноИмя файла, которое увидит получатель, например
invoice-4821.pdf. Отправляется в нижнем регистре, символы вроде& : ? * $ ;заменяются на_, а длина обрезается до 150 символов. Если параметр не передан, имя берётся из URL.
Параметры доставки
webhookstringнеобязательноURL, на который приходит
POST, когда сообщение отправлено или не удалось его отправить. Содержимое запроса такое же, как в API отправки сообщений.
Когда отправляется сообщение#
- Wbiztool переводит
date,timeиtimezoneв единый момент времени и отправляет сообщение, как только этот момент наступил, при условии что ваш номер WhatsApp подключён. - Время в прошлом принимается. Сообщение отправляется сразу, как при обычной отправке. Перепроверьте формат даты (
dd/mm/yyyy, сначала день), чтобы не отправить сообщение на несколько месяцев раньше. - Если в запланированное время ваш номер отключён, сообщение ждёт и уходит сразу после повторного подключения номера, даже если это произойдёт намного позже запланированного. У этого endpoint нет срока действия сообщений, поэтому отмените сообщение, если оно больше не актуально. Сообщение, которое через 90 дней после запланированного времени всё ещё ждёт на отключённом или удалённом номере, удаляется.
- Пока сообщение не отправлено, у него статус
0(Created) и его можно отменить. Во время ожидания оно также расходует остаток ваших кредитов.
Часовые пояса#
timezone принимает либо название часового пояса, либо одно из сокращений ниже.
Названия часовых поясов, например Asia/Kolkata, America/New_York, Europe/London или Australia/Sydney. Подходит любое название из базы часовых поясов IANA. Это самый надёжный вариант. Список — в справочнике часовых поясов.
Сокращения должны быть написаны заглавными буквами. Каждое соответствует региону, и летнее время этого региона учитывается автоматически:
| Сокращение | Интерпретируется как |
|---|---|
IST | Asia/Kolkata |
UTC | UTC |
GMT | GMT |
EST | US/Eastern |
CST | US/Central |
MST | US/Mountain |
PST | US/Pacific |
CET, CEST | Europe/Paris |
EET, EEST | Europe/Athens |
JST | Asia/Tokyo |
AEST, AEDT | Australia/Sydney |
Например, EST в июле означает летнее время Нью-Йорка (UTC−4), а не фиксированное UTC−5.
Планирование для группы#
curl -X POST https://wbiztool.com/api/v1/schedule_msg/ \
-H "Content-Type: application/json" \
-d '{
"client_id": 12345,
"api_key": "YOUR_API_KEY",
"whatsapp_client": 678,
"msg_type": 0,
"group_name": "Sales Team Mumbai",
"msg": "Team meeting starts in 15 minutes.",
"date": "24/12/2026",
"time": "14:45",
"timezone": "Asia/Kolkata"
}'import requests
response = requests.post(
"https://wbiztool.com/api/v1/schedule_msg/",
json={
"client_id": 12345,
"api_key": "YOUR_API_KEY",
"whatsapp_client": 678,
"msg_type": 0,
"group_name": "Sales Team Mumbai",
"msg": "Team meeting starts in 15 minutes.",
"date": "24/12/2026",
"time": "14:45",
"timezone": "Asia/Kolkata",
},
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/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,
group_name: "Sales Team Mumbai",
msg: "Team meeting starts in 15 minutes.",
date: "24/12/2026",
time: "14:45",
timezone: "Asia/Kolkata",
}),
});
console.log(await response.json());<?php
$ch = curl_init('https://wbiztool.com/api/v1/schedule_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' => 0,
'group_name' => 'Sales Team Mumbai',
'msg' => 'Team meeting starts in 15 minutes.',
'date' => '24/12/2026',
'time' => '14:45',
'timezone' => 'Asia/Kolkata',
]),
CURLOPT_RETURNTRANSFER => true,
]);
echo curl_exec($ch);
curl_close($ch);Ответ#
Успешный запрос возвращает HTTP 200:
{
"msg_id": 9817263,
"message": "Created",
"status": 1
}
| Поле | Тип | Описание |
|---|---|---|
status | integer | 1, если сообщение запланировано, 0, если запрос не выполнен. |
message | string | Created при успехе, иначе текст ошибки. |
msg_id | integer | ID запланированного сообщения. Сохраните его, чтобы позже проверить статус или отменить сообщение. Присутствует только при успехе. |
В ответе не повторяются запланированное время и часовой пояс, поэтому сохраняйте в журнале то, что отправили.
Ошибки#
Большинство ошибок возвращаются с HTTP 200 и status, равным 0, поэтому всегда проверяйте status в теле ответа:
{ "message": "Scheduled date & time is not in valid format", "status": 0 }
| Сообщение | Как исправить |
|---|---|
Auth Error | Передайте и client_id, и api_key. |
Invalid Client Id | Передайте client_id числом. Возвращается с HTTP 403. |
Auth Error: invalid api key | Проверьте, что ключ существует, не удалён и принадлежит этому client_id. Возвращается с HTTP 400. |
Either phone or group_name parameter is required | Добавьте phone или group_name. |
Please provide either phone OR group_name, not both | Удалите один из параметров. |
Invalid phone number | phone должен содержать только цифры (от 6 до 17), в начале допускается +. |
Invalid Contact Number "…" | Вместе с кодом страны номер должен содержать от 6 до 15 цифр. |
Msg cant be null | Для текстовых сообщений (msg_type 0) нужен msg. |
Image Url Can't be null | Для msg_type 1 передайте img_url. |
File Url Can't be null | Для msg_type 2 передайте file_url. |
Scheduled date & time is not in valid format | Отсутствует date или time, либо timezone — пустая строка. |
Not enough credits | В вашем тарифе закончились сообщения. |
Demo Account can not access apis | Используйте обычный аккаунт. |
Invalid JSON format: … | Тело JSON некорректно, или вы отправили поля формы без client_id. |
Советы#
-
Аккуратно формируйте дату: в Python используйте
strftime("%d/%m/%Y")иstrftime("%H:%M"). В JavaScript форматируйте дату и время в том же часовом поясе, который передаёте вtimezone, а не в локальном времени сервера:const tz = "Asia/Kolkata"; // d is the Date to send at const date = new Intl.DateTimeFormat("en-GB", { timeZone: tz, day: "2-digit", month: "2-digit", year: "numeric" }).format(d); // "24/12/2026" const time = new Intl.DateTimeFormat("en-GB", { timeZone: tz, hour: "2-digit", minute: "2-digit", hourCycle: "h23" }).format(d); // "09:00" -
Проверьте время: запланируйте тестовое сообщение на пять минут вперёд и убедитесь, что оно приходит вовремя.
-
Изменились планы: чтобы перенести сообщение, отмените его и запланируйте новое.
-
Пока не используйте официальные клиенты для планирования:
schedule_messageв Python передаёт дату в форматеYYYY-MM-DD(ответ —{}), аscheduleMessageв Node передаётschedule_time, который этот endpoint не читает. Вызывайте endpoint напрямую, как показано выше. -
Повторяющиеся сообщения: для регулярных сообщений, например ежемесячных напоминаний об оплате, см. API создания напоминаний.
