API напоминаний
API создания напоминаний
Создайте повторяющееся сообщение WhatsApp, которое автоматически отправляется по расписанию. Подходит для напоминаний об оплате, еженедельных сообщений, ежедневных повторных сообщений и других регулярных рассылок.
https://wbiztool.com/api/v1/reminder/create/Тело запроса: JSON или поля формы
Расписание задаётся выражением cron и часовым поясом. Каждый раз, когда расписание срабатывает, Wbiztool ставит в очередь сообщение на номер телефона или в группу — так же, как при отправке через API отправки сообщений. Напоминания, созданные здесь, также появляются на странице Напоминания в панели управления, где их можно приостановить или изменить.
Быстрый пример#
curl -X POST https://wbiztool.com/api/v1/reminder/create/ \
-H "Content-Type: application/json" \
-d '{
"client_id": 12345,
"api_key": "YOUR_API_KEY",
"whatsapp_client": 678,
"reminder_name": "Monthly rent reminder",
"phone": "919876543210",
"message": "Hi Aman, a reminder that your rent is due on {current_date_formatted}.",
"cron_expression": "0 10 1 * *",
"timezone": "Asia/Kolkata"
}'import requests
response = requests.post(
"https://wbiztool.com/api/v1/reminder/create/",
json={
"client_id": 12345,
"api_key": "YOUR_API_KEY",
"whatsapp_client": 678,
"reminder_name": "Monthly rent reminder",
"phone": "919876543210",
"message": "Hi Aman, a reminder that your rent is due on {current_date_formatted}.",
"cron_expression": "0 10 1 * *",
"timezone": "Asia/Kolkata",
},
timeout=60,
)
try:
result = response.json() # read the body even when the HTTP code is 400
except ValueError:
raise SystemExit(f"HTTP {response.status_code}: not JSON. Check that your api_key exists.")
if result["status"] == 1:
print("Reminder created with reminder_id", result["reminder_id"])
else:
print("Failed:", result["message"])// Node.js 18+ (built-in fetch). Save as .mjs to use top-level await.
const response = await fetch("https://wbiztool.com/api/v1/reminder/create/", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
client_id: 12345,
api_key: "YOUR_API_KEY",
whatsapp_client: 678,
reminder_name: "Monthly rent reminder",
phone: "919876543210",
message: "Hi Aman, a reminder that your rent is due on {current_date_formatted}.",
cron_expression: "0 10 1 * *",
timezone: "Asia/Kolkata",
}),
});
// Read the body even when the HTTP code is 400. A non-JSON reply means the api_key wasn't found.
const text = await response.text();
let result;
try {
result = JSON.parse(text);
} catch {
throw new Error(`HTTP ${response.status}: not JSON. Check that your api_key exists.`);
}
if (result.status === 1) {
console.log("Reminder created with reminder_id", result.reminder_id);
} else {
console.error("Failed:", result.message);
}<?php
$payload = [
'client_id' => 12345,
'api_key' => 'YOUR_API_KEY',
'whatsapp_client' => 678,
'reminder_name' => 'Monthly rent reminder',
'phone' => '919876543210',
'message' => 'Hi Aman, a reminder that your rent is due on {current_date_formatted}.',
'cron_expression' => '0 10 1 * *',
'timezone' => 'Asia/Kolkata',
];
$ch = curl_init('https://wbiztool.com/api/v1/reminder/create/');
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);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($result === null) {
echo "HTTP $httpCode: not JSON. Check that your api_key exists.";
} elseif ($result['status'] === 1) {
echo 'Reminder created with reminder_id ' . $result['reminder_id'];
} else {
echo 'Failed: ' . $result['message'];
}Это напоминание отправляется в 10:00 по индийскому времени 1-го числа каждого месяца. Замените 12345, YOUR_API_KEY и 678 своими значениями. Где их найти, описано в разделе Аутентификация.
Параметры запроса#
Передавайте параметры в теле JSON или в виде полей формы. В JSON передавайте каждое текстовое значение (api_key, reminder_name, phone, message, cron_expression, timezone, img_url, file_name) строкой.
Аутентификация
client_idintegerобязательноВаш API Client ID из раздела Настройки → API ключи.
api_keystringобязательноВаш API-ключ с той же страницы.
Отправитель
whatsapp_clientintegerнеобязательноID номера WhatsApp, с которого отправляется сообщение, со страницы настроек WhatsApp. Если параметр не передан или ID нет в вашем рабочем пространстве, каждое напоминание отправляется с первого номера рабочего пространства, подключённого на момент запуска.
Напоминание
reminder_namestringобязательноНазвание напоминания. Отображается на странице Напоминания и доступно в сообщении как
{reminder_name}.phonestringобязательноНомер WhatsApp получателя с кодом страны, например
919876543210. Отдельного параметраcountry_codeнет. Пробелы,+,-,.и скобки удаляются, а также удаляется ведущий0(в теле JSON — до двух ведущих нулей). Значение, состоящее не только из цифр, считается названием группы WhatsApp.messagestringобязательноТекст сообщения. Может содержать переменные шаблона, которые заполняются при каждом запуске напоминания. Форматирование WhatsApp работает:
*bold*,_italic_,~strikethrough~.cron_expressionstringобязательноКогда отправлять — выражение cron из пяти полей, например
0 9 * * 1-5. См. раздел Выражения cron.timezonestringнеобязательноЧасовой пояс, в котором выполняется выражение cron, в виде названия IANA, например
Asia/Kolkata,America/New_YorkилиEurope/London. Если параметр не передан, используетсяUTC. Пустая строка возвращаетInvalid timezone. Полный список — в справочнике часовых поясов.
Изображения и файлы
msg_typeintegerнеобязательно0— текст (по умолчанию),1— изображение или2— файл, сmessageв качестве подписи. Любое другое значение считается0.img_urlstringОбязателен, если msg_type равен 1 или 2Публичный URL изображения (
httpилиhttps) или, дляmsg_type2, файла, до 1000 символов. Он скачивается при каждом запуске напоминания, поэтому ссылка должна оставаться рабочей. Разместить файлы можно с помощью API загрузки медиафайлов.file_namestringОбязателен, если msg_type равен 2Для
msg_type2 — имя файла с расширением, до 100 символов, напримерinvoice.pdf. Для других типов сообщений игнорируется.
Выражения cron#
Выражение cron — это пять значений, разделённых пробелами. Напоминание срабатывает, когда текущее время в timezone совпадает со всеми пятью:
┌───────── minute (0-59)
│ ┌─────── hour (0-23)
│ │ ┌───── day of month (1-31)
│ │ │ ┌─── month (1-12)
│ │ │ │ ┌─ day of week (0-7, where 0 and 7 are Sunday)
│ │ │ │ │
0 9 * * 1-5
| Символ | Значение | Пример |
|---|---|---|
* | Любое значение | * в поле часа означает каждый час. |
, | Список значений | 9,18 в поле часа означает 9:00 и 18:00. |
- | Диапазон | 1-5 в поле дня недели означает с понедельника по пятницу. |
/ | Шаг | */6 в поле часа означает каждые 6 часов. |
Типичные примеры#
| Выражение | Когда срабатывает |
|---|---|
0 9 * * * | Каждый день в 9:00 |
0 9 * * 1-5 | С понедельника по пятницу в 9:00 |
0 9 * * 1 | Каждый понедельник в 9:00 |
30 18 * * 0 | Каждое воскресенье в 18:30 |
0 9,18 * * * | Каждый день в 9:00 и 18:00 |
0 */6 * * * | Каждые 6 часов, в начале часа |
*/30 9-17 * * 1-5 | Каждые 30 минут с 9:00 до 17:30, с понедельника по пятницу |
0 9 1 * * | 1-го числа каждого месяца в 9:00 |
0 10 15 * * | 15-го числа каждого месяца в 10:00 |
0 8 1 1 * | Каждое 1 января в 8:00 |
Время указывается в часовом поясе напоминания (timezone). Используйте ровно пять полей: не добавляйте поле секунд и сокращения вроде @daily.
Переменные шаблона#
Эти подстановки в message заменяются при каждом запуске напоминания. Дата и время указываются в часовом поясе напоминания (timezone).
| Переменная | Заменяется на | Пример |
|---|---|---|
{current_date} | Дата | 2026-10-01 |
{current_date_formatted} | Дата словами, день с ведущим нулём | October 01, 2026 |
{current_time} | Время в 24-часовом формате | 09:00:00 |
{current_time_12h} | Время в 12-часовом формате | 09:00 AM |
{current_datetime} | Дата и время | 2026-10-01 09:00:00 |
{timezone} | Значение timezone | Asia/Kolkata |
{timezone_short} | Сокращение часового пояса | IST |
{reminder_name} | Значение reminder_name | Monthly rent reminder |
{to_number} | Сохранённое значение phone | 919876543210 |
{client_name} | Имя владельца рабочего пространства | |
{organisation_name} | Название вашего рабочего пространства |
Напоминание с изображением#
curl -X POST https://wbiztool.com/api/v1/reminder/create/ \
-H "Content-Type: application/json" \
-d '{
"client_id": 12345,
"api_key": "YOUR_API_KEY",
"whatsapp_client": 678,
"reminder_name": "Weekly class timetable",
"phone": "919876543210",
"msg_type": 1,
"img_url": "https://example.com/timetable.png",
"message": "Here is this week'\''s timetable.",
"cron_expression": "0 8 * * 1",
"timezone": "Asia/Kolkata"
}'import requests
response = requests.post(
"https://wbiztool.com/api/v1/reminder/create/",
json={
"client_id": 12345,
"api_key": "YOUR_API_KEY",
"whatsapp_client": 678,
"reminder_name": "Weekly class timetable",
"phone": "919876543210",
"msg_type": 1,
"img_url": "https://example.com/timetable.png",
"message": "Here is this week's timetable.",
"cron_expression": "0 8 * * 1",
"timezone": "Asia/Kolkata",
},
timeout=60,
)
print(response.status_code, response.text)// Node.js 18+ (built-in fetch). Save as .mjs to use top-level await.
const response = await fetch("https://wbiztool.com/api/v1/reminder/create/", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
client_id: 12345,
api_key: "YOUR_API_KEY",
whatsapp_client: 678,
reminder_name: "Weekly class timetable",
phone: "919876543210",
msg_type: 1,
img_url: "https://example.com/timetable.png",
message: "Here is this week's timetable.",
cron_expression: "0 8 * * 1",
timezone: "Asia/Kolkata",
}),
});
console.log(response.status, await response.text());<?php
$ch = curl_init('https://wbiztool.com/api/v1/reminder/create/');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => http_build_query([
'client_id' => 12345,
'api_key' => 'YOUR_API_KEY',
'whatsapp_client' => 678,
'reminder_name' => 'Weekly class timetable',
'phone' => '919876543210',
'msg_type' => 1,
'img_url' => 'https://example.com/timetable.png',
'message' => "Here is this week's timetable.",
'cron_expression' => '0 8 * * 1',
'timezone' => 'Asia/Kolkata',
]),
CURLOPT_RETURNTRANSFER => true,
]);
echo curl_exec($ch);
curl_close($ch);Пример на PHP отправляет поля формы вместо JSON. Работают оба варианта.
Ответ#
Успешный запрос возвращает HTTP 200:
{
"reminder_id": 3187,
"message": "Reminder created successfully",
"status": 1
}
| Поле | Тип | Описание |
|---|---|---|
status | integer | 1, если напоминание создано, 0, если запрос не выполнен. |
message | string | Reminder created successfully, иначе текст ошибки. |
reminder_id | integer | ID нового напоминания. Сохраните его, чтобы позже отменить напоминание. Присутствует только при успехе. |
Новые напоминания активны сразу.
Ошибки#
Ошибки возвращаются с HTTP 400 и status, равным 0, если не указано иное:
{ "status": 0, "message": "Invalid timezone" }
| Сообщение | Как исправить |
|---|---|
Invalid JSON format: … | Тело JSON некорректно — часто из-за лишней запятой в конце или неэкранированного перевода строки в message. Для новой строки используйте \n. Эта ошибка возвращается и для запроса с полями формы без client_id, а также для любого запроса GET. |
Invalid client id. | Передайте client_id числом. |
Reminder name cannot be null | Добавьте reminder_name. |
Phone number cannot be null | Добавьте phone. |
Message template cannot be null | Добавьте message. |
Cron expression cannot be null | Добавьте cron_expression. |
Auth Error - Please send correct API key and Client id | Передайте непустой api_key. |
Invalid cron expression | Проверьте, что в выражении пять корректных полей. См. раздел Выражения cron. |
Invalid timezone | Используйте название IANA, например Asia/Kolkata, а не сокращение вроде IST. |
Image URL cannot be null for image messages | Для msg_type 1 передайте img_url. |
File URL cannot be null for file messages | Для msg_type 2 передайте file_name. |
Auth Error: invalid api key | Ключ принадлежит другому client_id. |
Auth Error: please check client id | Ключ не привязан к рабочему пространству. Создайте новый ключ в нужном рабочем пространстве. |
Demo Account cannot access APIs | Используйте обычный аккаунт. |
Not enough credits | В вашем тарифе закончились сообщения. |
Upgrade your plan to use reminders feature | Ваш тариф не включает напоминания. Повысьте тариф. |
WhatsApp Logged Out. Please Reconnect!! | Номер whatsapp_client отключён. Подключите его снова на странице настроек WhatsApp. |
Invalid WhatsApp client id | Передайте whatsapp_client числом. |
Error creating reminder: … (HTTP 500) | Не удалось сохранить напоминание. Проверьте переданные значения, например что img_url не длиннее 1000 символов, а file_name — не длиннее 100. |
Как работают напоминания#
- Расписание проверяется в часовом поясе напоминания (
timezone), и сообщение ставится в очередь, когда текущее время совпадает с выражением cron. - Каждый запуск создаёт обычное сообщение, которое отправляется с вашего номера WhatsApp, поэтому номер должен оставаться подключённым.
- Запуск пропускается, если в вашем рабочем пространстве закончились кредиты или если
whatsapp_clientне задан и в этот момент в рабочем пространстве нет ни одного подключённого номера. - Если
whatsapp_clientзадан, каждый запуск ставится в очередь на этот номер, даже если он с тех пор отключился, и ждёт там. Переключения на другой номер не происходит. - Напоминания проверяются периодически, а не с точностью до секунды, после чего сообщение ждёт в очереди отправки, как любое другое. Не рассчитывайте на точное время. Если проверка запаздывает, запуск всё равно отправляется с опозданием до 10 минут (до 1 минуты для первого запуска напоминания); после этого он пропускается. Один и тот же запуск никогда не отправляется дважды.
Советы#
- Просмотр и очистка: получите свои напоминания и их ID через API списка напоминаний, а остановите ненужное через API отмены напоминаний.
- Приостановка и редактирование через API недоступны. Используйте страницу Напоминания в панели управления.
- Много напоминаний сразу: на странице Напоминания также можно импортировать напоминания из CSV-файла.
- Переводы строк в JSON: записывайте их как
\nвнутриmessage. Непосредственный перенос строки делает JSON некорректным.
