API v2 (beta)
Disiscrizioni
Una disiscrizione è una persona che non vuole i messaggi del tuo spazio di lavoro. A un numero disiscritto non viene mai inviato nulla: un nuovo messaggio per lui viene rifiutato, e i messaggi messi in coda prima falliscono con l'errore Opted out invece di partire. Vale per ogni modo di inviare: l'API (v1 e v2), la dashboard, le campagne, i messaggi template, i promemoria, Google Sheets e Shopify.
L'elenco è lo stesso della scheda Disiscritti di Contatti nella dashboard.
| Operazione | Endpoint | Scope |
|---|---|---|
| Disiscrivere un numero | POST /api/v2/opt-outs | contacts |
| Elencare le disiscrizioni | GET /api/v2/opt-outs | contacts |
| Ottenere una disiscrizione | GET /api/v2/opt-outs/{phone} | contacts |
| Iscrivere di nuovo un numero | DELETE /api/v2/opt-outs/{phone} | contacts |
Le risposte STOP vengono aggiunte da sole#
Quando qualcuno risponde a uno dei tuoi numeri inbox con un messaggio che è solo una parola di disiscrizione, viene disiscritto da solo, con source reply e il suo messaggio come keyword. Un messaggio che è solo START (o Subscribe) lo iscrive di nuovo.
- Le parole, in maiuscolo o minuscolo e con o senza punteggiatura:
STOP,Stop all,Unsubscribe,Opt out,Baja,Parar,Sair,Stopp,Abmelden,Arrêt,Désabonner,Basta,Disiscrivi,Стоп,Отписаться,Berhenti,Dur,توقف,إلغاء الاشتراك,עצור,הסר. - Conta solo un messaggio che sia soltanto la parola: "per favore smettete di mandarmi il listino prezzi" non disiscrive nessuno.
- Serve la posta in arrivo sul numero a cui la persona risponde, perché solo i numeri inbox leggono i messaggi in arrivo. Le risposte più vecchie di 7 giorni, come quelle lette quando si aggiunge un numero inbox, non contano.
- Alla persona non viene inviato nulla in risposta, e nessuna risposta automatica risponde allo STOP.
Disiscrivere un numero#
https://wbiztool.com/api/v2/opt-outsCorpo: JSON (application/json)
Body
phonestringobbligatorioIl numero in formato internazionale con
+(+919876543210). Spazi, trattini e parentesi vengono ignorati. Funziona anche uno@usernamedi Telegram.notestringfacoltativoIl motivo, per il tuo team, fino a 200 caratteri. Mostrato nella scheda Disiscritti.
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);Risposta: 201 con la disiscrizione. Un numero già disiscritto risponde 200 con la sua voce esistente, invariata.
{
"recipient": "+919876543210",
"source": "api",
"keyword": null,
"note": "Asked by email",
"created_at": "2026-10-26T09:12:03.120Z"
}
Errori#
| HTTP | Codice | Quando |
|---|---|---|
400 | validation_failed | note non è testo o supera i 200 caratteri |
422 | invalid_phone | phone manca o non è un numero di telefono |
Elencare le disiscrizioni#
https://wbiztool.com/api/v2/opt-outsTutti quelli che si sono disiscritti, dal più recente, in pagine (limit da 1 a 100, predefinito 25, e cursor). Aggiungi phone per cercare un solo numero.
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
}
Ottenere una disiscrizione#
https://wbiztool.com/api/v2/opt-outs/{phone}Il numero va nell'indirizzo in formato internazionale senza + (919876543210). Risponde 404 opt_out_not_found quando il numero non si è disiscritto, quindi è un controllo rapido prima di inviare.
curl https://wbiztool.com/api/v2/opt-outs/919876543210 \
-H "Authorization: Bearer $WBIZTOOL_API_KEY"
Iscrivere di nuovo un numero#
https://wbiztool.com/api/v2/opt-outs/{phone}Da adesso i messaggi al numero partono di nuovo. I messaggi già falliti come Opted out restano falliti. Fallo solo quando la persona ha chiesto di nuovo i tuoi messaggi.
curl -X DELETE https://wbiztool.com/api/v2/opt-outs/919876543210 \
-H "Authorization: Bearer $WBIZTOOL_API_KEY"
{ "recipient": "+919876543210", "deleted": true }
Un numero che non era disiscritto risponde 404 opt_out_not_found.
Inviare a un numero disiscritto#
POST /messagesrisponde422recipient_opted_out, e nulla viene messo in coda. In un batch, l'intero batch viene rifiutato e ilfielddell'errore indica la voce.- Un messaggio messo in coda prima che la persona si disiscrivesse fallisce con
errorOpted outquando arriva il suo turno, e un webhook ricevemessage.failed. - L'API v1 mette il messaggio in coda e questo fallisce con
Opted out, come vedrai nello stato del messaggio. - Reinvia falliti delle campagne salta questi messaggi.
L'oggetto Opt-out#
| Campo | Tipo | Descrizione |
|---|---|---|
recipient | string | + e il numero, oppure uno @username di Telegram |
source | string | reply: ha risposto STOP a un numero inbox. dashboard: aggiunto da Contatti. import: da un CSV in Contatti. api: questa API |
keyword | string or null | La risposta che l'ha disiscritto, così come l'ha scritta |
note | string or null | La nota del tuo team |
created_at | string | Quando si è disiscritto (ISO 8601, UTC) |
