API de vérification de numéros
Résultats de la vérification de numéros WhatsApp (API)
Lisez les résultats de vérification de numéros page par page, filtrés par tâche ou par statut. Utilisez-la pour exporter les numéros présents sur WhatsApp, retirer les numéros invalides de votre liste de contacts ou synchroniser les résultats avec votre CRM.
https://wbiztool.com/api/v1/verification/results/Sans filtre, elle renvoie toutes les vérifications de votre espace de travail, des plus récentes aux plus anciennes. Cela inclut les tâches créées depuis la page Vérification de numéro du tableau de bord, et pas seulement celles créées via l'API.
Exemple rapide#
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');
}Paramètres de la requête#
Tous les paramètres sont transmis dans la chaîne de requête.
Authentification
AuthorizationheaderobligatoireBearer YOUR_API_KEY, avec une clé issue de Paramètres → Clés API. Vous pouvez aussi transmettre la clé via le paramètre de requêteapi_key, mais l'en-tête évite qu'elle n'apparaisse dans les journaux des serveurs et des proxys.
Filtres et pagination
campaign_idintegerfacultatifRenvoie uniquement les numéros de cette tâche de vérification. Il doit s'agir d'une tâche de vérification du même espace de travail que la clé API. Omettez-le pour obtenir les résultats de toutes les tâches.
statusstringfacultatifRenvoie uniquement les numéros ayant ce statut :
pending,verifiedouinvalid. Toute autre valeur est ignorée et aucun filtre de statut n'est appliqué, y comprisunknown:status=unknownrenvoie donc tous les statuts. Les valeurs sont sensibles à la casse :Verifiedest ignoré et renvoie tous les statuts.limitintegerfacultatifNombre de résultats par page. Valeur par défaut :
100. Utilisez une valeur supérieure ou égale à 1.offsetintegerfacultatifNombre de résultats à ignorer. Valeur par défaut :
0. Doit être supérieur ou égal à 0.
Réponse#
Une requête réussie renvoie le code 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"
}
]
}
| Champ | Type | Description |
|---|---|---|
status | string | "success". Les erreurs renvoient "error". |
total_count | integer | Nombre de résultats correspondant à vos filtres, toutes pages confondues. |
returned_count | integer | Nombre de résultats dans cette réponse. |
limit | integer | La valeur de limit utilisée. |
offset | integer | La valeur de offset utilisée. |
has_more | boolean | true si offset + limit est inférieur à total_count, c'est-à-dire s'il existe une page suivante. |
results | array | Les résultats, des plus récents aux plus anciens. |
results[].id | integer | ID de cet enregistrement de vérification. |
results[].campaign_id | integer or null | ID de la tâche à laquelle appartient le numéro. |
results[].campaign_name | string or null | Nom de cette tâche. |
results[].number | string | Le numéro de téléphone nettoyé. |
results[].status | string | pending, verified, invalid, ou unknown pour une vérification annulée. |
results[].checked_at | string or null | Date de vérification du numéro, ou null tant qu'il est en attente. |
results[].created_at | string | Date d'ajout du numéro. |
Les horodatages sont au format ISO 8601 en UTC, avec un décalage +00:00. Pour la signification de chaque statut, consultez Valeurs de statut des numéros.
Erreurs#
Les erreurs renvoient un corps JSON avec status à "error" et un code d'erreur HTTP :
{ "status": "error", "message": "Campaign not found" }
| HTTP | Message | Comment corriger |
|---|---|---|
405 | Only GET method allowed | Envoyez une requête GET. |
401 | API key required | Ajoutez l'en-tête Authorization: Bearer YOUR_API_KEY. |
401 | Invalid API key | Vérifiez que la clé existe et n'a pas été supprimée ni désactivée. |
404 | Campaign not found | Le campaign_id n'existe pas, ne correspond pas à une tâche de vérification ou appartient à un autre espace de travail. |
500 | Internal server error: … | Le plus souvent, campaign_id, limit ou offset n'est pas un nombre entier, offset est négatif, ou offset + limit est négatif. |
Lire toutes les pages#
Augmentez offset de la valeur de limit jusqu'à ce que has_more vaille 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");Conseils#
- Dédoublonnez par
idlors de la pagination. Les résultats sont triés par date de création, du plus récent au plus ancien. Les numéros d'une même tâche ont presque le même horodatage et de nouvelles vérifications peuvent être ajoutées pendant que vous parcourez les pages : une ligne peut donc apparaître sur deux pages ou être omise. Filtrer parcampaign_idet attendre la fin de la tâche limite ce problème. - Attendez la fin de la tâche avant d'exporter. Consultez Statut de la vérification jusqu'à ce que
overall_statusvaillecompleted, ou gérez les résultatspendingdans votre code. - Nettoyez votre liste de contacts en exportant
status=invalidet en supprimant ces numéros avant votre prochaine campagne. - Taille de page : il n'y a pas de
limitmaximale, mais une page très grande produit une réponse volumineuse et lente.
