API v2 (бета)
Отписки
Отписка (opt-out) — это человек, который не хочет получать сообщения вашего рабочего пространства. На отписавшийся номер никогда ничего не отправляется: новое сообщение на него отклоняется, а сообщения, поставленные в очередь раньше, вместо отправки завершаются ошибкой Opted out. Это работает для любого способа отправки: API (v1 и v2), панели, кампаний, шаблонных сообщений, напоминаний, Google Sheets и Shopify.
Это тот же список, что на вкладке Отписались страницы Контакты в панели.
| Операция | Endpoint | Область доступа |
|---|---|---|
| Отписка номера | POST /api/v2/opt-outs | contacts |
| Список отписок | GET /api/v2/opt-outs | contacts |
| Получение отписки | GET /api/v2/opt-outs/{phone} | contacts |
| Возврат подписки номера | DELETE /api/v2/opt-outs/{phone} | contacts |
Ответы STOP добавляются автоматически#
Когда кто-то отвечает на один из ваших номеров для входящих сообщением, состоящим только из слова отписки, он отписывается сам, с source reply и своим сообщением в keyword. Сообщение, состоящее только из START (или Subscribe), возвращает ему подписку.
- Слова, в любом регистре и со знаками препинания или без них:
STOP,Stop all,Unsubscribe,Opt out,Baja,Parar,Sair,Stopp,Abmelden,Arrêt,Désabonner,Basta,Disiscrivi,Стоп,Отписаться,Berhenti,Dur,توقف,إلغاء الاشتراك,עצור,הסר. - Считается только сообщение, в котором есть одно это слово: «стоп, не присылайте мне больше прайс-лист» никого не отписывает.
- На номере, которому отвечают, должны быть включены входящие, потому что только номера для входящих читают входящие сообщения. Ответы старше 7 дней, например прочитанные при добавлении номера для входящих, не считаются.
- Человеку ничего не отправляется в ответ, и ни один автоответ не отвечает на STOP.
Отписка номера#
https://wbiztool.com/api/v2/opt-outsТело запроса: JSON (application/json)
Тело запроса
phonestringобязательноНомер в международном формате с
+(+919876543210). Пробелы, дефисы и скобки игнорируются. Подходит и@usernameв Telegram.notestringнеобязательноПричина, для вашей команды, до 200 символов. Показывается на вкладке «Отписались».
curl -X POST https://wbiztool.com/api/v2/opt-outs \
-H "Authorization: Bearer $WBIZTOOL_API_KEY" \
-H "Content-Type: application/json" \
-d '{"phone": "+919876543210", "note": "Asked by email"}'import os
import requests
r = requests.post("https://wbiztool.com/api/v2/opt-outs", timeout=30,
headers={"Authorization": f"Bearer {os.environ['WBIZTOOL_API_KEY']}"},
json={"phone": "+919876543210", "note": "Asked by email"})
print(r.status_code, r.json())// Node.js 18+ (built-in fetch). Save as .mjs to use top-level await.
const r = await fetch("https://wbiztool.com/api/v2/opt-outs", {
method: "POST",
headers: { Authorization: `Bearer ${process.env.WBIZTOOL_API_KEY}`, "Content-Type": "application/json" },
body: JSON.stringify({ phone: "+919876543210", note: "Asked by email" }),
});
console.log(r.status, await r.json());<?php
$ch = curl_init('https://wbiztool.com/api/v2/opt-outs');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('WBIZTOOL_API_KEY'), 'Content-Type: application/json'],
CURLOPT_POSTFIELDS => json_encode(['phone' => '+919876543210', 'note' => 'Asked by email']),
CURLOPT_RETURNTRANSFER => true,
]);
echo curl_exec($ch);
curl_close($ch);Ответ: 201 с отпиской. Номер, который уже был отписан, возвращает 200 со своей существующей записью, без изменений.
{
"recipient": "+919876543210",
"source": "api",
"keyword": null,
"note": "Asked by email",
"created_at": "2026-10-26T09:12:03.120Z"
}
Ошибки#
| HTTP | Код | Когда |
|---|---|---|
400 | validation_failed | note не текст или длиннее 200 символов |
422 | invalid_phone | phone отсутствует или не является номером телефона |
Список отписок#
https://wbiztool.com/api/v2/opt-outsВсе, кто отписался, сначала самые новые, страницами (limit от 1 до 100, по умолчанию 25, и cursor). Добавьте phone, чтобы найти один номер.
curl "https://wbiztool.com/api/v2/opt-outs?limit=100" \
-H "Authorization: Bearer $WBIZTOOL_API_KEY"
{
"data": [
{ "recipient": "+919876543210", "source": "reply", "keyword": "STOP", "note": null, "created_at": "2026-10-26T09:12:03.120Z" }
],
"next_cursor": null
}
Получение отписки#
https://wbiztool.com/api/v2/opt-outs/{phone}Номер в адресе — в международном формате без + (919876543210). Возвращает 404 opt_out_not_found, если номер не отписан, так что это быстрая проверка перед отправкой.
curl https://wbiztool.com/api/v2/opt-outs/919876543210 \
-H "Authorization: Bearer $WBIZTOOL_API_KEY"
Возврат подписки номера#
https://wbiztool.com/api/v2/opt-outs/{phone}С этого момента сообщения на номер снова отправляются. Сообщения, которые уже завершились ошибкой Opted out, остаются с ошибкой. Делайте это, только если человек снова попросил присылать ему ваши сообщения.
curl -X DELETE https://wbiztool.com/api/v2/opt-outs/919876543210 \
-H "Authorization: Bearer $WBIZTOOL_API_KEY"
{ "recipient": "+919876543210", "deleted": true }
Номер, который не был отписан, возвращает 404 opt_out_not_found.
Отправка на отписавшийся номер#
POST /messagesвозвращает422recipient_opted_out, и ничего не ставится в очередь. В пакете отклоняется весь пакет, аfieldв ошибке указывает элемент.- Сообщение, поставленное в очередь до того, как человек отписался, завершается ошибкой с
errorOpted out, когда до него доходит черёд, а вебхук получаетmessage.failed. - API v1 ставит сообщение в очередь, и оно завершается ошибкой
Opted out, что видно в статусе сообщения. - Повторить неудачные: … в кампаниях пропускает эти сообщения.
Объект Opt-out#
| Поле | Тип | Описание |
|---|---|---|
recipient | string | + и номер или @username в Telegram |
source | string | reply: человек ответил STOP на номер для входящих. dashboard: добавлен в «Контактах». import: из CSV в «Контактах». api: этот API |
keyword | string or null | Ответ, которым человек отписался, в том виде, как он его написал |
note | string or null | Заметка вашей команды |
created_at | string | Когда человек отписался (ISO 8601, UTC) |
