API v2 (beta)
Bajas
Una baja es una persona que no quiere los mensajes de tu espacio de trabajo. A un número dado de baja nunca se le envía nada: un mensaje nuevo para él se rechaza, y los mensajes puestos en cola antes fallan con el error Opted out en lugar de salir. Funciona con todas las formas de enviar: la API (v1 y v2), el panel, las campañas, los mensajes de plantilla, los recordatorios, Google Sheets y Shopify.
La lista es la misma que la pestaña Dados de baja de Contactos en el panel.
| Operación | Endpoint | Permiso |
|---|---|---|
| Dar de baja un número | POST /api/v2/opt-outs | contacts |
| Listar bajas | GET /api/v2/opt-outs | contacts |
| Obtener una baja | GET /api/v2/opt-outs/{phone} | contacts |
| Reactivar un número | DELETE /api/v2/opt-outs/{phone} | contacts |
Las respuestas STOP se añaden solas#
Cuando alguien responde a uno de tus números de bandeja de entrada con un mensaje que es solo una palabra de baja, queda dado de baja por sí mismo, con source reply y su mensaje como keyword. Un mensaje que es solo START (o Subscribe) lo reactiva.
- Las palabras, en mayúsculas o minúsculas y con o sin signos de puntuación:
STOP,Stop all,Unsubscribe,Opt out,Baja,Parar,Sair,Stopp,Abmelden,Arrêt,Désabonner,Basta,Disiscrivi,Стоп,Отписаться,Berhenti,Dur,توقف,إلغاء الاشتراك,עצור,הסר. - Solo cuenta un mensaje que sea únicamente la palabra: "por favor, deja de enviarme la lista de precios" no da de baja a nadie.
- Hace falta la bandeja de entrada en el número al que responden, porque solo los números de bandeja de entrada leen los mensajes recibidos. Las respuestas de hace más de 7 días, como las que se leen al añadir un número de bandeja de entrada, no cuentan.
- No se les envía nada de vuelta, y ninguna respuesta automática contesta al STOP.
Dar de baja un número#
https://wbiztool.com/api/v2/opt-outsCuerpo: JSON (application/json)
Cuerpo
phonestringobligatorioEl número en formato internacional con
+(+919876543210). Los espacios, guiones y paréntesis se ignoran. También sirve un@usernamede Telegram.notestringopcionalEl motivo, para tu equipo, de hasta 200 caracteres. Se muestra en la pestaña Dados de baja.
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);Respuesta: 201 con la baja. Un número que ya estaba dado de baja responde 200 con su entrada existente, sin cambios.
{
"recipient": "+919876543210",
"source": "api",
"keyword": null,
"note": "Asked by email",
"created_at": "2026-10-26T09:12:03.120Z"
}
Errores#
| HTTP | Código | Cuándo |
|---|---|---|
400 | validation_failed | note no es texto o tiene más de 200 caracteres |
422 | invalid_phone | Falta phone o no es un número de teléfono |
Listar bajas#
https://wbiztool.com/api/v2/opt-outsTodas las personas que se dieron de baja, de la más reciente a la más antigua, en páginas (limit de 1 a 100, predeterminado 25, y cursor). Añade phone para buscar un solo 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
}
Obtener una baja#
https://wbiztool.com/api/v2/opt-outs/{phone}El número va en la dirección en formato internacional sin + (919876543210). Responde 404 opt_out_not_found cuando el número no se ha dado de baja, así que es una comprobación rápida antes de enviar.
curl https://wbiztool.com/api/v2/opt-outs/919876543210 \
-H "Authorization: Bearer $WBIZTOOL_API_KEY"
Reactivar un número#
https://wbiztool.com/api/v2/opt-outs/{phone}A partir de ahora, los mensajes al número vuelven a salir. Los mensajes que ya fallaron como Opted out siguen fallidos. Hazlo solo cuando la persona haya vuelto a pedir tus mensajes.
curl -X DELETE https://wbiztool.com/api/v2/opt-outs/919876543210 \
-H "Authorization: Bearer $WBIZTOOL_API_KEY"
{ "recipient": "+919876543210", "deleted": true }
Un número que no estaba dado de baja responde 404 opt_out_not_found.
Enviar a un número dado de baja#
POST /messagesresponde422recipient_opted_out, y no se pone nada en cola. En un lote, se rechaza el lote entero y elfielddel error indica la entrada.- Un mensaje puesto en cola antes de que la persona se diera de baja falla con
errorOpted outcuando le toca, y un webhook recibemessage.failed. - La API v1 pone el mensaje en cola y este falla con
Opted out, como verás en el estado del mensaje. - Reintentar fallidos de las campañas omite estos mensajes.
El objeto Opt-out#
| Campo | Tipo | Descripción |
|---|---|---|
recipient | string | + y el número, o un @username de Telegram |
source | string | reply: respondió STOP a un número de bandeja de entrada. dashboard: añadido en Contactos. import: desde un CSV en Contactos. api: esta API |
keyword | string or null | La respuesta que lo dio de baja, tal como la escribió |
note | string or null | La nota de tu equipo |
created_at | string | Cuándo se dio de baja (ISO 8601, UTC) |
