Number verification API
WhatsApp number verification status (API)
Check the progress of a number verification task and get the result for every number in it. Poll this endpoint after creating a verification task until the task is complete.
https://wbiztool.com/api/v1/verification/status/?campaign_id=4521Quick example#
curl "https://wbiztool.com/api/v1/verification/status/?campaign_id=4521" \
-H "Authorization: Bearer YOUR_API_KEY"import requests
response = requests.get(
"https://wbiztool.com/api/v1/verification/status/",
headers={"Authorization": "Bearer YOUR_API_KEY"},
params={"campaign_id": 4521},
timeout=60,
)
result = response.json() # read the body even when the HTTP code is 4xx or 5xx
if result["status"] == "success":
progress = result["progress"]
print(result["overall_status"], f"{progress['completed_percentage']}% done")
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/status/");
url.searchParams.set("campaign_id", "4521");
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.overall_status, `${result.progress.completed_percentage}% done`);
for (const item of result.results) {
console.log(item.number, item.status);
}
} else {
console.error(`Failed (${response.status}):`, result.message);
}<?php
$ch = curl_init('https://wbiztool.com/api/v1/verification/status/?campaign_id=4521');
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['overall_status'] . ' - ' . $result['progress']['completed_percentage'] . "% done\n";
foreach ($result['results'] as $item) {
echo $item['number'] . ': ' . $item['status'] . "\n";
}
} else {
echo 'Failed: ' . ($result['message'] ?? 'no response');
}Request parameters#
AuthorizationheaderrequiredBearer YOUR_API_KEY, using a key from Settings → API keys. You can pass the key as anapi_keyquery parameter instead, but the header keeps it out of server and proxy logs.campaign_idintegerrequiredThe
campaign_idreturned by Create verification, sent in the query string. It must be a verification task in the same workspace as the API key.
Response#
A successful request returns HTTP 200:
{
"status": "success",
"campaign_id": 4521,
"campaign_name": "Website leads - September",
"overall_status": "processing",
"progress": {
"total": 3,
"pending": 1,
"verified": 1,
"invalid": 1,
"completed_percentage": 66.67
},
"results": [
{
"number": "14155550123",
"status": "pending",
"checked_at": null,
"created_at": "2026-09-16T10:15:00.483101+00:00"
},
{
"number": "919876543210",
"status": "verified",
"checked_at": "2026-09-16T10:16:12.204551+00:00",
"created_at": "2026-09-16T10:15:00.482913+00:00"
},
{
"number": "919876543211",
"status": "invalid",
"checked_at": "2026-09-16T10:16:19.915372+00:00",
"created_at": "2026-09-16T10:15:00.483020+00:00"
}
],
"created_at": "2026-09-16T10:15:00.471820+00:00",
"last_updated": "2026-09-16T10:15:00.471820+00:00"
}
| Field | Type | Description |
|---|---|---|
status | string | "success". Errors return "error". |
campaign_id | integer | ID of the verification task. |
campaign_name | string | Name of the task. |
overall_status | string | pending, processing or completed. See Overall status values. |
progress.total | integer | Numbers in the task. |
progress.pending | integer | Numbers not checked yet. |
progress.verified | integer | Numbers registered on WhatsApp. |
progress.invalid | integer | Numbers marked invalid (not on WhatsApp, not a valid number, or a check that failed). |
progress.completed_percentage | number | Checked numbers (verified + invalid) as a percentage of total, rounded to 2 decimals. |
results | array | Every number in the task, sorted by number. The whole list is returned at once, with no pagination. |
results[].number | string | The cleaned phone number. |
results[].status | string | pending, verified, invalid or unknown. See Number status values. |
results[].checked_at | string or null | When the number was checked, or null while it's pending. |
results[].created_at | string | When the number was added. |
created_at | string | When the task was created. |
last_updated | string | When the task record was last changed. It doesn't change as numbers are checked, so use checked_at to see recent activity. |
All timestamps are ISO 8601 in UTC with microseconds and a +00:00 offset, for example 2026-09-16T10:16:12.204551+00:00.
Number status values#
| Value | Meaning |
|---|---|
pending | Waiting to be checked. |
verified | The number is registered on WhatsApp. |
invalid | The number isn't registered on WhatsApp, isn't a valid phone number, or couldn't be checked because of a processing error. If a number you expect to be valid shows invalid, verify it again in a new task. |
unknown | The check was cancelled by Wbiztool support. Normal processing doesn't set it. |
Overall status values#
| Value | Meaning |
|---|---|
pending | No numbers have been checked yet. |
processing | Some numbers have been checked and some are still pending. |
completed | No numbers are pending. |
A completed task can show a completed_percentage below 100 if some checks were cancelled, because cancelled numbers count towards total but not towards the percentage.
Errors#
Errors return a JSON body with status set to "error" and an HTTP error code:
{ "status": "error", "message": "Campaign not found" }
| HTTP | Message | How to fix it |
|---|---|---|
405 | Only GET method allowed | Send a GET request. |
401 | API key required | Add the Authorization: Bearer YOUR_API_KEY header. |
401 | Invalid API key | Check the key exists and hasn't been deleted or disabled. |
400 | campaign_id is required | Add campaign_id to the query string. |
404 | Campaign not found | The ID doesn't exist, isn't a verification task, or belongs to another workspace. Use a key from the workspace that created the task. |
500 | Internal server error: … | Most often campaign_id isn't a number. Send digits only. |
Tips#
- Poll gently. Up to 10 numbers are checked per run in the background, so checking every 30 to 60 seconds is plenty, and a large task can take a long time.
- Stop polling when
overall_statusiscompleted. - Stuck on
pending? Verification needs a WhatsApp number connected in WhatsApp settings in the same workspace. Without one, numbers are never checked. Checks also wait while your connected number is busy sending messages. - Big tasks: this endpoint returns every number in one response. To read results page by page, or only the
verifiednumbers, use Verification results.
