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, с которого отправляются сообщения, со страницы настроек WhatsApp. В отличие от API отправки сообщений, этот endpoint никогда не выбирает номер за вас.
Получатели и сообщение
phonestringобязательноНомера телефонов и названия групп в одной строке через запятую, например
9876543210,9812345670,Sales Team Mumbai. Не передавайте JSON-массив. См. раздел Как разбираются получатели.country_codestringнеобязательноТелефонный код страны без
+, например91. Он добавляется перед каждым номером телефона, если номер ещё не начинается с него. В JSON передавайте его строкой ("91"), а не числом. Если передать число, каждый номер телефона в списке считается названием группы (is_group: true), и эти сообщения не отправляются.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 по запятым, удаляет пробелы вокруг каждого элемента, а затем определяет, чем является каждый элемент:
- Только цифры (допускаются
+в начале и ведущие нули): считается номером телефона. Добавляетсяcountry_code, если номер ещё не начинается с него; после этого номер должен содержать от 6 до 15 цифр. - Всё остальное: считается названием группы WhatsApp, которая ищется так же, как в API отправки в группу.
- Группа, название которой состоит только из цифр (например,
2024), считается номером телефона, а группы с запятыми в названии нельзя отправить через этот endpoint. Для них используйте API отправки в группу.
Что ещё нужно знать:
- Номера, которые после добавления кода страны оказываются слишком короткими или слишком длинными, молча пропускаются. Они не появляются в ответе и не получают
msg_id. - Дубликаты не удаляются. Номер, указанный дважды, получит два сообщения.
- Если местный номер случайно начинается с тех же цифр, что и
country_code(например,9123456780приcountry_code91), код не добавляется. Передавайте такие номера сразу с кодом страны (919123456780). - URL изображений и файлов не проверяются при вызове API. Они скачиваются при отправке каждого сообщения, поэтому из-за нерабочей ссылки позже завершатся ошибкой сами сообщения, а не запрос. Действуют те же правила отправки, что и в API отправки сообщений: изображения больше 16 МБ и видео больше 64 МБ не проходят, аудио WAV и OGG не поддерживается, а к файлам (
msg_type2) без поддерживаемого расширения добавляется.pdf. См. Отправка изображений и файлов.
Кредиты#
Перед созданием сообщений весь пакет сверяется с остатком ваших кредитов. Учитывается каждый непустой элемент в phone, включая те, что позже будут пропущены. Если их больше, чем оставшихся кредитов, сообщения не создаются, и вы получаете:
{
"message": "Not enough credits: 120 messages requested, 85 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 | Уменьшите число получателей или пополните кредиты. См. раздел Кредиты. |
Invalid whatsapp client | Этого ID whatsapp_client нет в вашем рабочем пространстве. |
No valid contacts found | Все элементы в phone оказались пустыми или были пропущены. Проверьте, что номера вместе с кодом страны содержат от 6 до 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 отправки сообщений отдельно для каждого получателя.
