API сообщений
API отправки на несколько номеров
Отправляйте одно и то же сообщение WhatsApp на несколько номеров телефонов и в группы одним запросом. Подходит для небольших рассылок: новостей, предложений и объявлений.
https://wbiztool.com/api/v1/send_msg/multi/Тело запроса: JSON или поля формы
WbizTool создаёт отдельное сообщение для каждого получателя и возвращает msg_id для каждого из них, чтобы вы могли проверить их статус по отдельности.
Быстрый пример#
curl -X POST https://wbiztool.com/api/v1/send_msg/multi/ \
-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,9812345670,Sales Team Mumbai",
"msg": "Our Diwali sale starts tomorrow. Get 20% off on all orders!"
}'import requests
response = requests.post(
"https://wbiztool.com/api/v1/send_msg/multi/",
json={
"client_id": 12345,
"api_key": "YOUR_API_KEY",
"whatsapp_client": 678,
"msg_type": 0,
"country_code": "91",
"phone": ",".join(["9876543210", "9812345670", "Sales Team Mumbai"]),
"msg": "Our Diwali sale starts tomorrow. Get 20% off on all orders!",
},
timeout=60,
)
result = response.json() # read the body even when the HTTP code is 400
if result.get("status") == 1:
for item in result["messages"]:
print(item["contact"], "->", item["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/send_msg/multi/", {
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", "9812345670", "Sales Team Mumbai"].join(","),
msg: "Our Diwali sale starts tomorrow. Get 20% off on all orders!",
}),
});
const result = await response.json(); // read the body even when the HTTP code is 400
if (result.status === 1) {
for (const item of result.messages) {
console.log(item.contact, "->", item.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' => implode(',', ['9876543210', '9812345670', 'Sales Team Mumbai']),
'msg' => 'Our Diwali sale starts tomorrow. Get 20% off on all orders!',
];
$ch = curl_init('https://wbiztool.com/api/v1/send_msg/multi/');
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) {
foreach ($result['messages'] as $item) {
echo $item['contact'] . ' -> ' . $item['msg_id'] . PHP_EOL;
}
} 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 или аккаунта Telegram, с которого отправляются сообщения, со страницы настроек WhatsApp. В отличие от API отправки сообщений, этот endpoint никогда не выбирает номер за вас.
Получатели и сообщение
phonestringобязательноНомера телефонов и названия групп в одной строке через запятую, например
9876543210,9812345670,Sales Team Mumbai. Не передавайте JSON-массив. См. раздел Как разбираются получатели.country_codestringнеобязательноТелефонный код страны без
+, например91. Он добавляется перед каждым номером телефона, если номер ещё не начинается с него и не написан с+или00. В JSON подходят и строка ("91"), и число (91).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необязательноИмя файла, которое увидят получатели, например
price-list.pdf. Отправляется в нижнем регистре, символы вроде& : ? * $ ;заменяются на_, а длина обрезается до 150 символов. Если параметр не передан, имя берётся из URL.
Параметры доставки
webhookstringнеобязательноURL, на который приходит
POSTдля каждого сообщения, когда оно отправлено, не удалось его отправить, оно отменено или срок его действия истёк. Содержимое запроса такое же, как в API отправки сообщений.
curl -X POST https://wbiztool.com/api/v1/send_msg/multi/ \
-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,9812345670",
"img_url": "https://example.com/offers/diwali-sale.jpg",
"msg": "Our Diwali sale starts tomorrow."
}'Как разбираются получатели#
WbizTool разбивает phone по запятым, удаляет пробелы вокруг каждого элемента, а затем определяет, чем является каждый элемент:
- Номера телефонов можно писать так, как они у вас есть:
+91 98765 43210,98765-43210,(987) 654-3210,0091 98765 43210и+44 (0)20 7946 0018подходят, как и значения из таблиц, например919876543210.0и9.19876543210E+11. country_codeдобавляется, если номер ещё не начинается с него и не написан с+или00:+44 20 7946 0018сcountry_code91остаётся442079460018. Поэтому в одном списке можно смешивать страны: пишите номера других стран с+.- Местный номер с ведущим
0тоже работает:09876543210сcountry_code91уходит на919876543210, а0612345678с39(Италия, где0— часть номера) — на390612345678. - Вместе с кодом страны номер должен содержать от 7 до 15 цифр.
- Текст с буквами или другими символами, например
Sales Team MumbaiилиFamily 2024, считается названием группы WhatsApp, которая ищется так же, как в API отправки в группу. - Название группы без букв, например
2024-2025, читается как номер телефона, если только в нём не меньше 10 цифр и ваше рабочее пространство уже не отправляло сообщение в группу с точно таким названием (она есть в разделе Группы в Контактах). Короткое название, в котором меньше 7 цифр и есть дефис, точка или скобки, например2024-25или(2024), всегда считается названием группы. Группы с запятыми в названии нельзя отправить через этот endpoint. Для них используйте API отправки в группу. - С аккаунта Telegram
@username, ссылкаt.me/usernameилиtg:<id>— это человек, а не название группы, а номер телефона уходит этому человеку в Telegram. С номера WhatsApp имена пользователей, ссылкиt.meиtg:<id>пропускаются.
Что ещё нужно знать:
- Номера, которые после добавления кода страны оказываются слишком короткими или слишком длинными, округлённые значения из таблиц и элементы только из нулей (
0,00) молча пропускаются. Они не появляются в ответе и не получаютmsg_id. - Дубликаты не удаляются. Номер, указанный дважды, получит два сообщения.
- Если местный номер случайно начинается с тех же цифр, что и
country_code(например,9123456780приcountry_code91), код не добавляется. Передавайте такие номера сразу с кодом страны (919123456780). - URL изображений и файлов не проверяются при вызове API. Они скачиваются при отправке каждого сообщения, поэтому из-за нерабочей ссылки позже завершатся ошибкой сами сообщения, а не запрос. Действуют те же правила отправки, что и в API отправки сообщений: изображения больше 16 МБ и видео больше 64 МБ не проходят, аудио WAV и OGG нельзя отправить как изображение (
msg_type1), а к файлам (msg_type2) без расширения или с неподдерживаемым расширением добавляется.pdf. См. Отправка изображений и файлов.
Лимиты сообщений#
Весь пакет проверяется до создания сообщений, поэтому список никогда не отправляется частично. Учитывается каждый непустой элемент в phone, включая те, что позже будут пропущены, а также сообщения, которые стоят в очереди, но ещё не отправлены.
- Любой тариф: пакет должен уложиться в дневной лимит честного использования номера-отправителя — 1 000 сообщений за любые 24 часа. Иначе сообщения не создаются, и вы получаете:
{
"message": "Daily limit reached: a number can send 1,000 messages in 24 hours (fair use). Send the rest tomorrow. 1200 messages requested, 640 more can go out from this number in the next 24 hours.",
"code": "daily_limit_reached",
"status": 0
}
- Бесплатный тариф: пакет также должен уложиться в оставшиеся бесплатные сообщения рабочего пространства (50 за любые 30 дней). Иначе вы получаете:
{
"message": "Not enough credits: 120 messages requested, 35 credits remaining",
"status": 0
}
Распределяйте большие списки на несколько номеров или дней. Для крупных кампаний загрузите таблицу на странице Кампании.
Ответ#
Успешный запрос возвращает HTTP 200:
{
"msg_ids": [9817263, 9817264, 9817265],
"messages": [
{ "msg_id": 9817263, "contact": "919876543210", "is_group": false },
{ "msg_id": 9817264, "contact": "919812345670", "is_group": false },
{ "msg_id": 9817265, "contact": "Sales Team Mumbai", "is_group": true }
],
"message": "Successfully created 3 messages",
"status": 1
}
| Поле | Тип | Описание |
|---|---|---|
status | integer | 1, если в очередь поставлено хотя бы одно сообщение, иначе 0. |
message | string | Successfully created N messages при успехе, иначе текст ошибки. |
msg_ids | array of integers | ID сообщений в очереди в порядке phone. Присутствует только при успехе. |
messages | array | По одному объекту на каждое сообщение в очереди. Присутствует только при успехе. |
messages[].msg_id | integer | ID сообщения. |
messages[].contact | string | Номер телефона с применённым кодом страны или название группы. |
messages[].is_group | boolean | true, если элемент был распознан как название группы. |
Сравните messages с отправленным списком, чтобы найти пропущенные номера, и проверьте, что is_group равен false для каждого элемента, который вы передавали как номер телефона.
Ошибки#
Большинство ошибок возвращаются с HTTP 200 и status, равным 0, поэтому всегда проверяйте status в теле ответа. Кроме ошибок с HTTP 400 и 403, ответы (включая успешные) — это JSON с заголовком Content-Type: text/html, поэтому разбирайте тело самостоятельно, а не полагайтесь на автоматическое определение JSON (например, в no-code-инструментах):
{ "message": "Invalid whatsapp client", "status": 0 }
| Сообщение | Как исправить |
|---|---|
Auth Error | Передайте и client_id, и api_key. |
Invalid Client Id | Передайте client_id числом. Возвращается с HTTP 403. |
Auth Error: invalid api key | Проверьте, что ключ существует, не удалён и принадлежит этому client_id. Возвращается с HTTP 400. |
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. |
Not enough credits: … messages requested, … credits remaining | Сообщений бесплатного тарифа не хватает на весь список. Уменьшите число получателей или выберите тариф. См. раздел Лимиты сообщений. |
Daily limit reached: … messages requested, … more can go out from this number in the next 24 hours. | Распределите список на несколько дней или номеров. См. раздел Лимиты сообщений. |
Invalid whatsapp client | Этого ID whatsapp_client нет в вашем рабочем пространстве. |
No valid contacts found | Все элементы в phone оказались пустыми или были пропущены. Проверьте, что номера вместе с кодом страны содержат от 7 до 15 цифр. |
Demo Account can not access apis | Используйте обычный аккаунт. |
Invalid JSON format: … | Тело JSON некорректно, или вы отправили поля формы без client_id. |
Советы#
- Передавайте
phoneстрокой: объедините список через запятую. На JSON-массив возвращается{}. - Пока не используйте
send_bulk_messagesиз клиента для Python: он передаёт список какphones, а этот endpoint такое поле игнорирует. Вызывайте endpoint напрямую, как в примерах выше. - Отслеживайте каждое сообщение: сохраняйте каждый
msg_idизmessagesили передайтеwebhook, чтобы получать уведомление об отправке, ошибке, отмене или истечении срока каждого сообщения. - Держите номер подключённым: все сообщения отправляются с вашего номера WhatsApp, поэтому он должен оставаться подключённым в настройках WhatsApp, пока не уйдёт весь пакет.
- Разный текст для разных людей: этот endpoint отправляет всем один и тот же
msg. Чтобы персонализировать сообщения, вызывайте API отправки сообщений отдельно для каждого получателя.
