API v2 (bêta)
Désinscriptions
Une désinscription est une personne qui ne veut pas des messages de votre espace de travail. Rien n'est jamais envoyé à un numéro désinscrit : un nouveau message pour lui est refusé, et les messages mis en file d'attente avant échouent avec l'erreur Opted out au lieu de partir. Cela vaut pour toutes les façons d'envoyer : l'API (v1 et v2), le tableau de bord, les campagnes, les messages modèles, les rappels, Google Sheets et Shopify.
La liste est la même que l'onglet Désinscrits des Contacts dans le tableau de bord.
| Opération | Endpoint | Scope |
|---|---|---|
| Désinscrire un numéro | POST /api/v2/opt-outs | contacts |
| Lister les désinscriptions | GET /api/v2/opt-outs | contacts |
| Obtenir une désinscription | GET /api/v2/opt-outs/{phone} | contacts |
| Réinscrire un numéro | DELETE /api/v2/opt-outs/{phone} | contacts |
Les réponses STOP sont ajoutées pour vous#
Quand quelqu'un répond à l'un de vos numéros de boîte de réception par un message qui n'est qu'un mot de désinscription, il est désinscrit automatiquement, avec source reply et son message comme keyword. Un message qui n'est que START (ou Subscribe) le réinscrit.
- Les mots, en majuscules ou en minuscules, avec ou sans ponctuation :
STOP,Stop all,Unsubscribe,Opt out,Baja,Parar,Sair,Stopp,Abmelden,Arrêt,Désabonner,Basta,Disiscrivi,Стоп,Отписаться,Berhenti,Dur,توقف,إلغاء الاشتراك,עצור,הסר. - Seul compte un message qui n'est que le mot : « merci d'arrêter de m'envoyer la liste des prix » ne désinscrit personne.
- Il faut la boîte de réception sur le numéro auquel la personne répond, car seuls les numéros de boîte de réception lisent les messages reçus. Les réponses de plus de 7 jours, comme celles lues à l'ajout d'un numéro de boîte de réception, ne comptent pas.
- Rien ne lui est renvoyé, et aucune réponse automatique ne répond au STOP.
Désinscrire un numéro#
https://wbiztool.com/api/v2/opt-outsCorps: JSON (application/json)
Corps
phonestringobligatoireLe numéro au format international avec
+(+919876543210). Les espaces, tirets et parenthèses sont ignorés. Un@usernameTelegram fonctionne aussi.notestringfacultatifLa raison, pour votre équipe, jusqu'à 200 caractères. Affichée sur l'onglet Désinscrits.
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);Réponse : 201 avec la désinscription. Un numéro déjà désinscrit répond 200 avec son entrée existante, inchangée.
{
"recipient": "+919876543210",
"source": "api",
"keyword": null,
"note": "Asked by email",
"created_at": "2026-10-26T09:12:03.120Z"
}
Erreurs#
| HTTP | Code | Quand |
|---|---|---|
400 | validation_failed | note n'est pas du texte ou dépasse 200 caractères |
422 | invalid_phone | phone est absent ou n'est pas un numéro de téléphone |
Lister les désinscriptions#
https://wbiztool.com/api/v2/opt-outsToutes les personnes désinscrites, les plus récentes d'abord, par pages (limit de 1 à 100, 25 par défaut, et cursor). Ajoutez phone pour chercher un seul numéro.
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
}
Obtenir une désinscription#
https://wbiztool.com/api/v2/opt-outs/{phone}Le numéro figure dans l'adresse au format international sans + (919876543210). Répond 404 opt_out_not_found quand le numéro ne s'est pas désinscrit : c'est donc une vérification rapide avant d'envoyer.
curl https://wbiztool.com/api/v2/opt-outs/919876543210 \
-H "Authorization: Bearer $WBIZTOOL_API_KEY"
Réinscrire un numéro#
https://wbiztool.com/api/v2/opt-outs/{phone}Les messages vers le numéro repartent à partir de maintenant. Les messages déjà en échec avec Opted out restent en échec. Ne le faites que lorsque la personne a de nouveau demandé vos messages.
curl -X DELETE https://wbiztool.com/api/v2/opt-outs/919876543210 \
-H "Authorization: Bearer $WBIZTOOL_API_KEY"
{ "recipient": "+919876543210", "deleted": true }
Un numéro qui n'était pas désinscrit répond 404 opt_out_not_found.
Envoyer à un numéro désinscrit#
POST /messagesrépond422recipient_opted_out, et rien n'est mis en file d'attente. Dans un lot, tout le lot est refusé et lefieldde l'erreur indique l'entrée.- Un message mis en file d'attente avant la désinscription de la personne échoue avec
errorOpted outquand vient son tour, et un webhook reçoitmessage.failed. - L'API v1 met le message en file d'attente et il échoue avec
Opted out, comme vous le verrez dans le statut du message. - Renvoyer … messages en échec des campagnes ignore ces messages.
L'objet Désinscription#
| Champ | Type | Description |
|---|---|---|
recipient | string | + et le numéro, ou un @username Telegram |
source | string | reply : la personne a répondu STOP à un numéro de boîte de réception. dashboard : ajoutée depuis Contacts. import : depuis un CSV dans Contacts. api : cette API |
keyword | string or null | La réponse qui l'a désinscrite, telle qu'elle l'a écrite |
note | string or null | La note de votre équipe |
created_at | string | Date de la désinscription (ISO 8601, UTC) |
