API v2 (бета)
Переход с v1 на v2
API v2 умеет то же, что и v1, но с более безопасными ключами, единым стилем URL, настоящими кодами состояния HTTP и подписанными вебхуками JSON. На этой странице для каждого endpoint и поля v1 указан его аналог в v2. Что нового в самом v2, описано в обзоре.
Что меняется везде#
- Ключи:
client_id+api_keyиз v1 превращаются в один заголовокAuthorization: Bearer wbz_live_…. Создайте ключ v2 на странице Настройки → API-ключи, в карточке API-ключи v2, только с теми областями доступа, которые нужны приложению. Ключи v1 не работают в v2, а ключи v2 не работают в v1. - Только JSON: никаких полей формы. Файлы загружаются через
POST /media(multipart) и отправляются поmedia_id. - Методы и URL:
GETдля чтения,POSTдля создания,PATCHдля изменения,DELETEдля отмены или удаления, подhttps://wbiztool.com/api/v2. - Коды состояния HTTP вместо
"status": 0или1(см. Ответы и ошибки). - Номера телефонов в международном формате с
+, безcountry_code. - Время в ISO 8601 со смещением вместо отдельных полей даты, времени и часового пояса.
- Вебхуки — это endpoint, которые вы один раз добавляете для рабочего пространства, с подписанными событиями JSON, а не URL
webhookв каждом сообщении.
Соответствие endpoint#
Пути v2 указаны относительно https://wbiztool.com/api/v2.
Отправка: поле за полем#
| v1 | v2 | Примечания |
|---|---|---|
client_id + api_key (в теле или Authorization: Bearer) | Authorization: Bearer wbz_live_… | Новый ключ v2; без client_id |
phone + country_code | to.phone | Один номер в E.164 с +: "9876543210" с "country_code": "91" превращается в {"phone": "+919876543210"}. Код страны за вас не добавляется |
phone с @username (Telegram) | to.username | @name, t.me/name или tg: и ID, с аккаунта Telegram |
group_name | to.group | Точное название группы |
| (нет в v1) | to.contact_id | Сохранённый контакт |
whatsapp_client | from | id номера; необязателен, когда подключён один номер, как и раньше |
msg (или message) | text | До 3000 символов, как и раньше |
msg_type 0, 1, 2 | нет | Сообщение с media — медиасообщение; media.type (image или file), если по ссылке тип не понятен |
img_url / file_url | media.url | Публичная ссылка http(s) |
file (загрузка в том же запросе) | media.media_id | Сначала загрузите, затем отправляйте ID сколько угодно |
file_name | media.file_name | Для файлов |
date + time + timezone из schedule_msg/ | send_at | Одно время со смещением: 24/12/2026, 10:30 и Asia/Kolkata превращаются в "2026-12-24T10:30:00+05:30" |
expire_after_seconds | expires_at | Момент времени, а не длительность: текущее время плюс секунды, со смещением |
webhook | webhook endpoint | Добавляются один раз через POST /webhooks, для всех сообщений рабочего пространства |
msg_id в ответе | id | Возвращается сам Message со своим status |
Одна и та же отправка в v1 и v2:
# v1
curl -X POST https://wbiztool.com/api/v1/send_msg/ \
-H "Authorization: Bearer YOUR_V1_KEY" \
-H "Content-Type: application/json" \
-d '{"whatsapp_client": 101, "msg_type": 1, "country_code": "91", "phone": "9876543210",
"img_url": "https://example.com/offers/diwali-sale.jpg", "msg": "Our Diwali sale starts today",
"expire_after_seconds": 3600}'
# v2
curl -X POST https://wbiztool.com/api/v2/messages \
-H "Authorization: Bearer $WBIZTOOL_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: diwali-9876543210" \
-d '{"from": 101, "to": {"phone": "+919876543210"},
"media": {"url": "https://example.com/offers/diwali-sale.jpg"}, "text": "Our Diwali sale starts today",
"expires_at": "2026-10-20T11:30:00+05:30"}'
Некоторые особенности v1 убраны намеренно:
- Код страны не угадывается. v1 добавлял
country_codeперед номером (с91— всегда перед 10-значным номером). v2 принимает номер ровно так, как он написан с+. - Файл не скачивается при вызове. v1 скачивал
img_urlиfile_urlво время запроса. v2 проверяет, что ссылка публичная, и скачивает файл при отправке сообщения; нерабочая ссылка проявляется как сообщениеfailed. - Отказ не оставляет строку с ошибкой. Когда v1 отклоняет отправку сверх суточных 1000, он всё равно сохраняет сообщение как неудачное. v2 ничего не сохраняет, когда отклоняет отправку.
- Неизвестные поля отклоняются, а не игнорируются.
Статусы#
Числа и слова v1 превращаются в одно поле status:
| v1 | status в v2 |
|---|---|
0 Created / Pending | queued или scheduled, пока его send_at ещё впереди |
1 Sent | sent, delivered или read (галочки WhatsApp) |
2 Failed | failed |
3 Cancelled | cancelled |
4 Expired | expired |
События вебхуков — message.sent, message.failed, message.cancelled и message.expired, они соответствуют SENT, FAILED, CANCELLED и EXPIRED из v1.
Ответы и ошибки#
v1 отвечает на многие ошибки HTTP 200 или 400 с "status": 0, а на успех — "status": 1. v2 использует код состояния HTTP:
- Успех — это
200,201(создано) или202(в очереди), а тело — сам объект, например Message. Обёрткиstatus: 1нет. - Ошибки — это
4xxили5xxв одном формате:{"error": {"code", "message", "field", "docs", "request_id"}}. Опирайтесь наcode, а не на английскийmessage. Все коды есть на странице ошибок.
# v1
result = response.json()
if result.get("status") == 1:
msg_id = result["msg_id"]
# v2
if response.status_code == 202:
message_id = response.json()["id"]
else:
error = response.json()["error"]
if error["code"] == "number_daily_cap_reached":
... # try again tomorrow
Некоторые сообщения v1 и их коды в v2:
| Сообщение v1 | Код v2 |
|---|---|
Auth Error: invalid api key | 401 invalid_api_key, api_key_revoked или api_key_expired |
Invalid phone number / Invalid Contact Number "…" | 422 invalid_phone |
Msg cant be null | 400 text_required |
Message length is too long | 400 text_too_long |
Invalid whatsapp client | 422 number_not_found |
Invalid whatsapp client id. | 422 from_required |
Not enough credits | 402 no_credits |
Daily limit reached: … | 429 number_daily_cap_reached |
Demo Account can not access apis | 403 demo_account |
Account Disabled | 403 account_disabled |
Invalid JSON format: … | 400 invalid_json |
Вебхуки#
В v1 каждое сообщение может содержать URL webhook, который получает данные формы msg_id=…&status=SENT. В v2:
- Один раз добавьте endpoint через
POST /webhooksи сохраните егоsecret. - Он получает события JSON по всем сообщениям рабочего пространства, с полным Message в
data.message. Сопоставляйте их со своими записями поdata.message.id. - Проверяйте подпись: схема та же, что в v1 (
WbizTool-Timestamp,WbizTool-Signature: v1=…), но с собственным секретом endpoint вместо секрета рабочего пространства. - Отбрасывайте повторы по
WbizTool-Event-Id. Повторные попытки идут около 23 часов, а не 4 попытки за несколько минут, как в v1, и ответы4xxтоже повторяются.
У событий подключения из v1 (webhook_url в whatsapp/connect/) пока нет события в v2: вместо этого опрашивайте GET /numbers/{id}.
Чек-лист#
Создайте ключ v2 для каждого приложения
На странице Настройки → API-ключи, только с нужными ему областями доступа. Сначала попробуйте тестовый ключ: он всё проверяет и ничего не отправляет.
Измените запросы
Новые URL и методы, тела JSON,
to/from/text/media, номера телефонов с+, время со смещением. ДобавляйтеIdempotency-Keyк каждой отправке.Измените обработку ошибок
Проверяйте статус HTTP, затем
error.code. На429ждите столько, сколько указано вRetry-After.Перенесите вебхуки
Добавьте endpoint, проверяйте подписи его секретом и отбрасывайте повторы по ID события.
Переключитесь и отзовите ключ v1
Когда приложение заработает на v2, удалите его ключ v1 на странице Настройки → API-ключи.
