API v2 (beta)
Descadastros
Um descadastro é uma pessoa que não quer as mensagens do seu espaço de trabalho. Nada é enviado para um número descadastrado: uma mensagem nova para ele é recusada, e as mensagens colocadas na fila antes falham com o erro Opted out em vez de sair. Vale para todas as formas de envio: a API (v1 e v2), o painel, campanhas, mensagens de modelo, lembretes, Google Sheets e Shopify.
A lista é a mesma da aba Descadastrados de Contatos no painel.
| Operação | Endpoint | Permissão |
|---|---|---|
| Descadastrar um número | POST /api/v2/opt-outs | contacts |
| Listar descadastros | GET /api/v2/opt-outs | contacts |
| Obter um descadastro | GET /api/v2/opt-outs/{phone} | contacts |
| Recadastrar um número | DELETE /api/v2/opt-outs/{phone} | contacts |
Respostas STOP são adicionadas automaticamente#
Quando alguém responde a um dos seus números da caixa de entrada com uma mensagem que é só uma palavra de descadastro, a pessoa é descadastrada automaticamente, com source reply e a mensagem dela como keyword. Uma mensagem que é só START (ou Subscribe) a recadastra.
- As palavras, em maiúsculas ou minúsculas e com ou sem pontuação:
STOP,Stop all,Unsubscribe,Opt out,Baja,Parar,Sair,Stopp,Abmelden,Arrêt,Désabonner,Basta,Disiscrivi,Стоп,Отписаться,Berhenti,Dur,توقف,إلغاء الاشتراك,עצור,הסר. - Só conta uma mensagem que seja apenas a palavra: "por favor, pare de me mandar a tabela de preços" não descadastra ninguém.
- É preciso ter a caixa de entrada no número para o qual a pessoa responde, porque só os números da caixa de entrada leem as mensagens recebidas. Respostas com mais de 7 dias, como as lidas quando um número da caixa de entrada é adicionado, não contam.
- Nada é enviado de volta para a pessoa, e nenhuma resposta automática responde ao STOP.
Descadastrar um número#
https://wbiztool.com/api/v2/opt-outsCorpo: JSON (application/json)
Corpo
phonestringobrigatórioO número em formato internacional com
+(+919876543210). Espaços, hifens e parênteses são ignorados. Um@usernamedo Telegram também funciona.notestringopcionalO motivo, para a sua equipe, com até 200 caracteres. Aparece na aba Descadastrados.
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);Resposta: 201 com o descadastro. Um número que já estava descadastrado responde 200 com a entrada existente, sem alterações.
{
"recipient": "+919876543210",
"source": "api",
"keyword": null,
"note": "Asked by email",
"created_at": "2026-10-26T09:12:03.120Z"
}
Erros#
| HTTP | Código | Quando |
|---|---|---|
400 | validation_failed | note não é texto ou tem mais de 200 caracteres |
422 | invalid_phone | phone está faltando ou não é um número de telefone |
Listar descadastros#
https://wbiztool.com/api/v2/opt-outsTodos os que se descadastraram, dos mais recentes para os mais antigos, em páginas (limit de 1 a 100, padrão 25, e cursor). Adicione phone para consultar um único número.
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
}
Obter um descadastro#
https://wbiztool.com/api/v2/opt-outs/{phone}O número vai no endereço em formato internacional sem + (919876543210). Responde 404 opt_out_not_found quando o número não se descadastrou, então é uma verificação rápida antes de enviar.
curl https://wbiztool.com/api/v2/opt-outs/919876543210 \
-H "Authorization: Bearer $WBIZTOOL_API_KEY"
Recadastrar um número#
https://wbiztool.com/api/v2/opt-outs/{phone}A partir de agora, as mensagens para o número voltam a sair. As mensagens que já falharam como Opted out continuam com falha. Faça isso só quando a pessoa pedir suas mensagens de novo.
curl -X DELETE https://wbiztool.com/api/v2/opt-outs/919876543210 \
-H "Authorization: Bearer $WBIZTOOL_API_KEY"
{ "recipient": "+919876543210", "deleted": true }
Um número que não estava descadastrado responde 404 opt_out_not_found.
Enviar para um número descadastrado#
POST /messagesresponde422recipient_opted_out, e nada entra na fila. Em um lote, o lote inteiro é recusado e ofielddo erro indica a entrada.- Uma mensagem colocada na fila antes de a pessoa se descadastrar falha com
errorOpted outquando chega a vez dela, e um webhook recebemessage.failed. - A API v1 coloca a mensagem na fila e ela falha com
Opted out, como você verá no status da mensagem. - Reenviar as com falha das campanhas ignora essas mensagens.
O objeto Opt-out#
| Campo | Tipo | Descrição |
|---|---|---|
recipient | string | + e o número, ou um @username do Telegram |
source | string | reply: respondeu STOP a um número da caixa de entrada. dashboard: adicionado em Contatos. import: de um CSV em Contatos. api: esta API |
keyword | string or null | A resposta que descadastrou a pessoa, como ela escreveu |
note | string or null | A nota da sua equipe |
created_at | string | Quando a pessoa se descadastrou (ISO 8601, UTC) |
