API проверки номеров
Результаты проверки номеров WhatsApp (API)
Получайте результаты проверки номеров постранично с фильтрацией по задаче или статусу. Используйте этот API, чтобы экспортировать номера, зарегистрированные в WhatsApp, удалять недействительные номера из списка контактов или синхронизировать результаты с CRM.
https://wbiztool.com/api/v1/verification/results/Без фильтров он возвращает все проверки вашего рабочего пространства, начиная с самых новых. Сюда входят и задачи, созданные на странице проверки номеров в панели управления, а не только через API.
Быстрый пример#
curl "https://wbiztool.com/api/v1/verification/results/?campaign_id=4521&status=verified&limit=100&offset=0" \
-H "Authorization: Bearer YOUR_API_KEY"import requests
response = requests.get(
"https://wbiztool.com/api/v1/verification/results/",
headers={"Authorization": "Bearer YOUR_API_KEY"},
params={"campaign_id": 4521, "status": "verified", "limit": 100, "offset": 0},
timeout=60,
)
result = response.json() # read the body even when the HTTP code is 4xx or 5xx
if result["status"] == "success":
print(f"{result['returned_count']} of {result['total_count']} results")
for item in result["results"]:
print(item["number"], item["status"])
else:
print(f"Failed ({response.status_code}):", result["message"])// Node.js 18+ (built-in fetch). Save as .mjs to use top-level await.
const url = new URL("https://wbiztool.com/api/v1/verification/results/");
url.search = new URLSearchParams({ campaign_id: "4521", status: "verified", limit: "100", offset: "0" });
const response = await fetch(url, {
headers: { Authorization: "Bearer YOUR_API_KEY" },
});
const result = await response.json(); // read the body even when the HTTP code is 4xx or 5xx
if (result.status === "success") {
console.log(`${result.returned_count} of ${result.total_count} results`);
for (const item of result.results) {
console.log(item.number, item.status);
}
} else {
console.error(`Failed (${response.status}):`, result.message);
}<?php
$query = http_build_query([
'campaign_id' => 4521,
'status' => 'verified',
'limit' => 100,
'offset' => 0,
]);
$ch = curl_init('https://wbiztool.com/api/v1/verification/results/?' . $query);
curl_setopt_array($ch, [
CURLOPT_HTTPHEADER => ['Authorization: Bearer YOUR_API_KEY'],
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 60,
]);
$result = json_decode(curl_exec($ch), true);
curl_close($ch);
if (($result['status'] ?? '') === 'success') {
echo $result['returned_count'] . ' of ' . $result['total_count'] . " results\n";
foreach ($result['results'] as $item) {
echo $item['number'] . ': ' . $item['status'] . "\n";
}
} else {
echo 'Failed: ' . ($result['message'] ?? 'no response');
}Параметры запроса#
Все параметры передаются в строке запроса.
Аутентификация
AuthorizationheaderобязательноBearer YOUR_API_KEYс ключом из раздела Настройки → API ключи. Вместо этого ключ можно передать в параметре запросаapi_key, но заголовок не попадает в журналы серверов и прокси.
Фильтры и пагинация
campaign_idintegerнеобязательноВозвращать только номера из этой задачи проверки. Это должна быть задача проверки в том же рабочем пространстве, что и API-ключ. Не передавайте параметр, чтобы получить результаты всех задач.
statusstringнеобязательноВозвращать только номера с этим статусом:
pending,verifiedилиinvalid. Любое другое значение игнорируется, и фильтр по статусу не применяется, в том числеunknown, поэтомуstatus=unknownвозвращает номера со всеми статусами. Значения чувствительны к регистру:Verifiedигнорируется и возвращает номера со всеми статусами.limitintegerнеобязательноРезультатов на странице. По умолчанию
100. Используйте значение 1 или больше.offsetintegerнеобязательноСколько результатов пропустить. По умолчанию
0. Должно быть 0 или больше.
Ответ#
Успешный запрос возвращает HTTP 200:
{
"status": "success",
"total_count": 2,
"returned_count": 2,
"limit": 100,
"offset": 0,
"has_more": false,
"results": [
{
"id": 88215,
"campaign_id": 4521,
"campaign_name": "Website leads - September",
"number": "14155550123",
"status": "verified",
"checked_at": "2026-09-16T10:16:26.730114+00:00",
"created_at": "2026-09-16T10:15:00.483101+00:00"
},
{
"id": 88213,
"campaign_id": 4521,
"campaign_name": "Website leads - September",
"number": "919876543210",
"status": "verified",
"checked_at": "2026-09-16T10:16:12.204551+00:00",
"created_at": "2026-09-16T10:15:00.482913+00:00"
}
]
}
| Поле | Тип | Описание |
|---|---|---|
status | string | "success". При ошибках возвращается "error". |
total_count | integer | Число результатов, подходящих под фильтры, на всех страницах. |
returned_count | integer | Число результатов в этом ответе. |
limit | integer | Использованное значение limit. |
offset | integer | Использованное значение offset. |
has_more | boolean | true, если offset + limit меньше total_count, то есть есть ещё одна страница. |
results | array | Результаты, начиная с самых новых. |
results[].id | integer | ID этой записи проверки. |
results[].campaign_id | integer or null | ID задачи, к которой относится номер. |
results[].campaign_name | string or null | Название этой задачи. |
results[].number | string | Очищенный номер телефона. |
results[].status | string | pending, verified, invalid или unknown для отменённой проверки. |
results[].checked_at | string or null | Когда номер был проверен, или null, пока проверка не выполнена. |
results[].created_at | string | Когда номер был добавлен. |
Метки времени указываются в формате ISO 8601 в UTC со смещением +00:00. Значение каждого статуса описано в разделе Значения статуса номера.
Ошибки#
Ошибки возвращают JSON-тело со status, равным "error", и кодом ошибки HTTP:
{ "status": "error", "message": "Campaign not found" }
| HTTP | Сообщение | Как исправить |
|---|---|---|
405 | Only GET method allowed | Отправьте запрос GET. |
401 | API key required | Добавьте заголовок Authorization: Bearer YOUR_API_KEY. |
401 | Invalid API key | Проверьте, что ключ существует, не удалён и не отключён. |
404 | Campaign not found | campaign_id не существует, не является задачей проверки или принадлежит другому рабочему пространству. |
500 | Internal server error: … | Обычно campaign_id, limit или offset не является целым числом, offset отрицательный или сумма offset + limit отрицательная. |
Чтение всех страниц#
Увеличивайте offset на limit, пока has_more не станет false.
import requests
numbers, offset, limit = [], 0, 500
while True:
response = requests.get(
"https://wbiztool.com/api/v1/verification/results/",
headers={"Authorization": "Bearer YOUR_API_KEY"},
params={"campaign_id": 4521, "status": "verified", "limit": limit, "offset": offset},
timeout=60,
)
result = response.json()
if result["status"] != "success":
raise RuntimeError(result["message"])
numbers += [item["number"] for item in result["results"]]
if not result["has_more"]:
break
offset += limit
print(len(numbers), "numbers are on WhatsApp")// Node.js 18+ (built-in fetch). Save as .mjs to use top-level await.
const numbers = [];
const limit = 500;
let offset = 0;
while (true) {
const url = new URL("https://wbiztool.com/api/v1/verification/results/");
url.search = new URLSearchParams({ campaign_id: "4521", status: "verified", limit: String(limit), offset: String(offset) });
const response = await fetch(url, { headers: { Authorization: "Bearer YOUR_API_KEY" } });
const result = await response.json();
if (result.status !== "success") throw new Error(result.message);
numbers.push(...result.results.map((item) => item.number));
if (!result.has_more) break;
offset += limit;
}
console.log(numbers.length, "numbers are on WhatsApp");Советы#
- Удаляйте дубликаты по
idпри постраничном чтении. Результаты отсортированы по времени создания, начиная с самых новых. У номеров одной задачи почти одинаковые метки времени, а во время чтения могут добавляться новые проверки, поэтому строка может появиться на двух страницах или быть пропущена. Фильтр поcampaign_idи ожидание завершения задачи уменьшают этот эффект. - Дождитесь завершения перед экспортом. Проверяйте API статуса проверки, пока
overall_statusне станетcompleted, или обрабатывайте результаты со статусомpendingв своём коде. - Очистите список контактов: экспортируйте
status=invalidи удалите эти номера перед следующей кампанией. - Размер страницы: максимального
limitнет, но очень большая страница означает большой и медленный ответ.
