Skip to main content

Opt-out y listas de supresión

Una lista de supresión es el conjunto de direcciones a las que nunca debe volver a enviar mensajes: personas que respondieron STOP, se dieron de baja, generaron rebotes o presentaron reclamaciones. Respetarla es un requisito legal en todos los canales regulados, y Orbit la trata como una puerta de envío estricta: una dirección suprimida se descarta antes del envío, independientemente de la campaña, la importación de contactos o la llamada a la API. Esta página explica cómo funciona la supresión, cómo importar masivamente una lista de supresión existente — por ejemplo, al migrar desde otra plataforma — mediante una única carga de CSV, y cómo exportar el registro para una auditoría. Todos los endpoints siguientes están enraizados en https://api.orbit.devotel.io/api/v1/compliance.

Cómo se produce la supresión

Una dirección llega a la lista de supresión de varias formas:
  • Un contacto responde con una palabra clave STOP en SMS/WhatsApp.
  • Un contacto se da de baja a través del Centro de preferencias.
  • Usted registra una baja a través de la API de consentimiento (opt_in: false).
  • Usted importa masivamente una lista (esta página).
Cada entrada tiene un ámbito de canal. El conjunto completo de ámbitos es: all, sms, voice, whatsapp, email, push, telegram, messenger, rcs. El ámbito elegido depende del punto de entrada:
  • La importación masiva de CSV infiere el ámbito a partir del tipo de dirección de cada fila: las direcciones de teléfono y de WhatsApp tienen por defecto el ámbito all — una señal de STOP en un número de teléfono suprime todos los canales alcanzables en ese número — mientras que las direcciones de correo electrónico se limitan al ámbito email. Una columna channel sobrescribe esto por fila (consulte Importación masiva de CSV).
  • La API de consentimiento y el Centro de preferencias siempre suprimen con el ámbito all, independientemente de si el identificador registrado es un número de teléfono o una dirección de correo electrónico. Una baja a través de cualquiera de estos puntos de entrada elimina al contacto de todos los canales.
Sea cual sea la forma en que se suprima un número de teléfono, las puertas de voz y del marcador lo respetan: un número que se da de baja en cualquier canal deja de recibir tanto llamadas como mensajes. El mecanismo difiere según el punto de entrada. Una importación masiva de CSV además refleja las filas de teléfono en la lista DNC y marca los contactos coincidentes. Una baja por palabra clave STOP, por el Centro de preferencias o por la API de consentimiento se registra en su lugar con el ámbito all, que las puertas de voz y del marcador leen directamente de la lista de supresión: la llamada sigue bloqueada, pero no se escribe una fila separada en la lista DNC ni una marca en el contacto.

Importación masiva de CSV

POST /compliance/suppression-list/import acepta una carga multipart/form-data de un archivo CSV. Requiere una clave de administrador o de propietario y está limitada a 5 solicitudes por minuto.

Campos del formulario

Formato del CSV

La primera fila es el encabezado. Los nombres de columna son insensibles a mayúsculas e independientes de la posición, y se aceptan alias comunes: Cada fila debe contener al menos una de las columnas phone / email / wa_id. Una misma fila puede llevar varios tipos de dirección: cada una genera su propia entrada de supresión. Ejemplo:
Si hay una columna channel, sobrescribe el ámbito por defecto de esa fila y debe ser uno de los valores de ámbito enumerados arriba.

Resultados por fila

La respuesta informa de resultados por fila. Las filas aceptadas se escriben; las demás se clasifican, nunca se descartan silenciosamente.
Los dos contadores de duplicados se informan por separado y a propósito: intra_file_duplicates son repeticiones dentro del archivo que acaba de subir, mientras que duplicates ya estaban en su lista de antes. Ninguno es un error y ninguno se traga silenciosamente: ambos se cuentan para que su reconciliación cuadre.

Motivos de validación

Cada entrada de errors[] lleva un reason descriptivo y la línea de origen raw_line para que pueda corregir y volver a subir:

Límites

Para volúmenes superiores a 100.000 filas, divida el archivo e importe por lotes: la detección de duplicados hace que reimportar rangos que se solapen sea seguro.

Cuando falla una importación

Diagnostique los fallos en dos niveles: rechazos a nivel HTTP (no se escribe nada) y clasificaciones a nivel de fila (el archivo se acepta, pero filas concretas no). Rechazos a nivel HTTP: Las clasificaciones a nivel de fila (las entradas de errors[] que acompañan a una importación correcta) corresponden a causas como sigue: Solo se devuelven las primeras 100 entradas de errors[] con detalle completo: el contador invalid siempre refleja el total real. El asistente del panel (más abajo) empaqueta las filas detectadas como un skipped.csv descargable para que pueda corregir y reimportar solo los fallos.

Importar desde el panel

El mismo endpoint está envuelto por un asistente guiado en Settings → Compliance → Opt-out lists → Import suppression list: el mismo contrato de CSV, sin necesidad de terminal.
  1. Elegir archivo CSV: elija un .csv de menos de 25 MB. Use Download sample CSV en el diálogo para obtener un archivo inicial preformateado.
  2. Establecer valores por defecto (opcional): un Default country (ISO alpha-2) para normalizar números en formato nacional y un Reason de texto libre estampado en cada fila aceptada.
  3. Previsualizar: ejecuta la importación como una ejecución de prueba en el servidor: no se escribe nada y el diálogo muestra el desglose de aceptadas / ya en la lista / repetidas en el archivo / inválidas antes de que confirme.
  4. Confirmar importación: realiza la escritura que confirma. Si alguna fila fue inválida, descargue skipped.csv para corregirlas y reimportarlas.
El asistente también aplica las comprobaciones de tipo de archivo y de 25 MB en el cliente, de modo que una exportación mal hecha falla antes de llegar a la API.

Exportar la lista de supresión

GET /compliance/suppression-list/export descarga el registro de supresión: la contraparte simétrica de la importación de arriba. Úselo para demostrar a un regulador o auditor qué direcciones estaban suprimidas en un momento dado, incluidos los números importados masivamente sin contacto coincidente.
Parámetros de consulta: Cada fila lleva suppression_id, channel, address, el status derivado (active o revoked), reason, source, contact_id (vacío para direcciones importadas masivamente sin contacto), notes y las marcas de tiempo suppressed_at / revoked_at / created_at. El acceso está restringido a las claves de propietario y de administrador, y cada exportación se escribe en el registro de auditoría. Cuando el registro supera las 50.000 filas, la respuesta CSV lleva un encabezado X-Export-Truncated: true (el equivalente JSON establece truncated: true): filtre por canal o exporte ventanas de fechas consecutivas para capturar el resto.

Verificar que una supresión surtió efecto

Confíe pero verifique: tras una importación (o cualquier evento de baja), confirme que la puerta de envío realmente bloquea la dirección antes de entregar la lista a una campaña.
  1. Envíe un mensaje de prueba a la dirección suprimida. Un envío directo por API a un destinatario suprimido falla de forma síncrona con HTTP 422 y el código de error RECIPIENT_OPTED_OUT. En modo sandbox no se toca ningún operador y no se deduce saldo; cualquier destinatario que termine en 8 además se resuelve al recibo de entrega simulado blocked, que es la visión del operador de la misma barrera.
    Un envío de campaña a la misma dirección se comporta de forma diferente por diseño: el destinatario se omite silenciosamente (status: "skipped", reason: "opted_out") para que el lote siga avanzando: consulte el informe por destinatario de la campaña en lugar de esperar un error.
  2. Confirme que la entrada está en el registro. Exporte con la consulta anterior (status=active es el valor por defecto) y compruebe que la dirección aparece con el ámbito channel esperado. La exportación es la fuente de verdad que lee cada puerta de envío: si la fila está active ahí, la barrera está levantada.
Las dos comprobaciones responden a preguntas distintas: el paso 1 demuestra la aplicación (la puerta salta), el paso 2 demuestra el ámbito (la entrada existe con el canal que usted pretendía).

Eliminar una supresión (nueva suscripción)

Para recuperar una dirección, registre una nueva suscripción a través de la API de consentimiento (opt_in: true). Eso revoca la entrada de supresión coincidente y retira la barrera del STOP. Nunca vuelva a enviar mensajes a un contacto previamente suprimido sin un evento de consentimiento fresco y documentado. Confirmar que la barrera está bajada. Exporte con status=revoked y localice la dirección: la fila sigue ahí para auditoría con status: revoked y una marca de tiempo revoked_at: el historial de supresión nunca se elimina, solo se revoca. A continuación, envíe un pequeño mensaje de prueba a la dirección como en Verificar que una supresión surtió efecto: un envío correcto (sin RECIPIENT_OPTED_OUT) confirma que la puerta ya no salta sobre el historial revocado. Hasta que ambas comprobaciones pasen, trate la dirección como todavía cercada.

Referencias relacionadas