Supresiones
Administre las listas de supresión para evitar envíos a direcciones inválidas, desuscritas o que han presentado quejas
La lista de supresión evita que se envíen correos electrónicos a direcciones que han rebotado, se han desuscrito o han presentado quejas. MailLand administra las supresiones automáticamente a partir de eventos de rebote y queja, y usted puede agregar o eliminar entradas manualmente a través de la API.
Tipos de supresión
| Tipo | Valor | Descripción | Alcance predeterminado |
|---|---|---|---|
HardBounce | 1 | Fallo de entrega permanente | Global (siempre) |
SoftBounce | 2 | Fallo temporal (supresión de marketing de 30 días, escala solo tras ≥3 rebotes elegibles en ≥7 días) | Marketing (expiración de 30 días) |
Complaint | 3 | El destinatario marcó el correo como spam | Global (siempre) |
Unsubscribe | 4 | El destinatario se desuscribió | Depende del tipo de mensaje |
Manual | 5 | Agregado manualmente vía API o panel | Cualquier alcance |
Invalid | 6 | Formato de correo electrónico inválido | Global (siempre) |
SpamTrap | 7 | Dirección de trampa de spam conocida | Global (siempre) |
RoleAddress | 8 | Correo basado en rol (info@, admin@, etc.) | Global (siempre) |
Alcances de supresión
Los alcances controlan qué tipos de correos son bloqueados:
| Alcance | Valor | Comportamiento |
|---|---|---|
Global | 0 | Bloquea todos los correos (transaccionales y de marketing) |
Marketing | 1 | Bloquea correos de marketing; los correos transaccionales se entregan normalmente |
Transactional | 2 | Bloquea solo correos transaccionales (raro) |
List | 3 | Bloquea correos solo para una lista de correo específica |
Restricciones de alcance:
HardBounce,Complaint,Invalid,SpamTrap,RoleAddress→ solo alcance GlobalSoftBounce→ típicamente alcance MarketingUnsubscribe→ Global, Marketing o List (no Transactional)Manual→ cualquier alcance
Listar supresiones
GET https://api.mail.land/v1/transactional/suppressionsAutentíquese con Authorization: Bearer <token> o X-API-Key: <api key>.
curl https://api.mail.land/v1/transactional/suppressions \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."Parámetros de consulta
| Parámetro | Tipo | Predeterminado | Descripción |
|---|---|---|---|
cursor | string | - | Cursor opaco del nextCursor de la página anterior. Omitir para la primera página. |
limit | int | 50 | Elementos por página (máx. 100) |
search | string | - | Filtrar por dirección de correo electrónico |
type | SuppressionType | - | Filtrar por tipo |
scope | SuppressionScope | - | Filtrar por alcance |
mailingListId | string | - | El id público de la lista de correo, resuelto dentro de su tenant. Un id desconocido, ajeno o numérico devuelve 404. |
fromDate | datetime | hace 90 días | Fecha de inicio |
toDate | datetime | Ahora | Fecha de fin |
sortBy | string | CreatedAt | Campo de ordenamiento |
sortDescending | bool | true | Dirección de ordenamiento |
{
"items": [
{
"id": "k3v9x2m8q1w7z4",
"email": "[email protected]",
"suppressionType": "hardBounce",
"scope": "global",
"mailingListId": null,
"mailingListName": null,
"expiresAt": null,
"reason": "550 5.1.1 The email account does not exist",
"bounceType": "Hard",
"bounceCategory": "invalid_recipient",
"bounceCount": 1,
"lastBounceAt": "2026-02-17T12:00:00Z",
"unsubscribeSource": null,
"campaignId": null,
"subscriberId": null,
"source": "webhook",
"notes": null,
"createdAt": "2026-02-17T12:00:01Z",
"isLocked": false,
"lockedReason": null
}
],
"nextCursor": "eyJ2IjoxLCJzIjoiY3JlYXRlZGF0OmRlc2MiLCJrIjoi...",
"hasMore": true
}mailingListId, campaignId y subscriberId son el id público del recurso relacionado, resuelto dentro de su tenant: nunca el id numérico interno de la fila. Cada uno es null cuando la entrada no tiene ese vínculo, o cuando el recurso vinculado se ha eliminado desde entonces.
Estadísticas de supresión
Obtenga un resumen de su lista de supresión:
GET https://api.mail.land/v1/transactional/suppressions/statscurl https://api.mail.land/v1/transactional/suppressions/stats \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."{
"totalCount": 5000,
"globalCount": 3000,
"marketingCount": 1500,
"transactionalCount": 200,
"listCount": 300,
"hardBounceCount": 2000,
"softBounceCount": 1500,
"complaintCount": 500,
"unsubscribeCount": 700,
"manualCount": 200,
"invalidCount": 50,
"spamTrapCount": 30,
"roleAddressCount": 20,
"expiringCount": 85,
"lastSuppression": "2026-02-17T12:00:01Z"
}El campo expiringCount muestra los rebotes soft que expirarán dentro de los próximos 7 días.
Verificar si un correo electrónico está suprimido
Verificación individual
GET https://api.mail.land/v1/transactional/suppressions/[email protected]&messageType=Marketingcurl "https://api.mail.land/v1/transactional/suppressions/[email protected]&messageType=Marketing" \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."| Parámetro | Tipo | Predeterminado | Descripción |
|---|---|---|---|
email | string | - | Dirección de correo electrónico (obligatorio) |
messageType | string | Marketing | Marketing o Transactional |
mailingListId | string | - | El id público de la lista de correo, resuelto dentro de su tenant. Un id desconocido, ajeno o numérico devuelve 404. |
{
"email": "[email protected]",
"isSuppressed": true,
"messageType": "Marketing"
}Verificación masiva
Verifique hasta 1,000 correos electrónicos a la vez:
POST https://api.mail.land/v1/transactional/suppressions/check-bulkcurl -X POST https://api.mail.land/v1/transactional/suppressions/check-bulk \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..." \
-H "Content-Type: application/json" \
-d '{"emails":["[email protected]","[email protected]","[email protected]"],"messageType":"Marketing","mailingListId":null}'{
"emails": ["[email protected]", "[email protected]", "[email protected]"],
"messageType": "Marketing",
"mailingListId": null
}{
"suppressedEmails": ["[email protected]"]
}Agregar una supresión
POST https://api.mail.land/v1/transactional/suppressionscurl -X POST https://api.mail.land/v1/transactional/suppressions \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..." \
-H "Content-Type: application/json" \
-d '{"email":"[email protected]","suppressionType":"Manual","scope":"Global","reason":"Customer requested removal from all lists","notes":"Ticket #4521"}'{
"email": "[email protected]",
"suppressionType": "Manual",
"scope": "Global",
"reason": "Customer requested removal from all lists",
"notes": "Ticket #4521"
}| Campo | Tipo | Obligatorio | Predeterminado | Descripción |
|---|---|---|---|---|
email | string | Sí | - | Dirección de correo electrónico (máx. 255 caracteres) |
suppressionType | string | No | Manual | Tipo de supresión |
scope | string | No | Global | Alcance de supresión |
mailingListId | string | No | - | El id público de la lista de correo, resuelto dentro de su tenant. Obligatorio si el alcance es List; un id desconocido, ajeno o numérico devuelve 404. |
reason | string | No | - | Razón (máx. 500 caracteres) |
notes | string | No | - | Notas internas |
Devuelve 201 Created con el objeto de supresión completo. El encabezado Location es
/v1/transactional/suppressions: la ruta de listado, ya que no existe un endpoint de obtención por
id. Use el campo id del cuerpo para identificar la supresión creada, y las secciones "Listar
supresiones" o "Verificar si un correo electrónico está suprimido" más abajo para buscarla.
Agregar en masa
Agregue hasta 1,000 supresiones a la vez:
POST https://api.mail.land/v1/transactional/suppressions/bulkcurl -X POST https://api.mail.land/v1/transactional/suppressions/bulk \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..." \
-H "Content-Type: application/json" \
-d '{"emails":[{"email":"[email protected]","suppressionType":"Manual","scope":"Global","reason":"Cleanup"},{"email":"[email protected]","suppressionType":"Manual","scope":"Marketing"}]}'{
"emails": [
{ "email": "[email protected]", "suppressionType": "Manual", "scope": "Global", "reason": "Cleanup" },
{ "email": "[email protected]", "suppressionType": "Manual", "scope": "Marketing" }
]
}{
"totalCount": 2,
"addedCount": 2,
"skippedCount": 0,
"skippedEmails": [],
"message": "Added 2 suppressions"
}Los correos electrónicos que ya existen en la lista de supresión se omiten (no se duplican).
Importar desde CSV
Desde contenido de texto
POST https://api.mail.land/v1/transactional/suppressions/importcurl -X POST https://api.mail.land/v1/transactional/suppressions/import \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..." \
-H "Content-Type: application/json" \
-d '{"csvContent":"[email protected]\[email protected]\[email protected]","defaultReason":"Imported from legacy system","suppressionType":"Manual","scope":"Global"}'{
"csvContent": "[email protected]\n[email protected]\n[email protected]",
"defaultReason": "Imported from legacy system",
"suppressionType": "Manual",
"scope": "Global"
}Desde carga de archivo
POST https://api.mail.land/v1/transactional/suppressions/import-filecurl -X POST "https://api.mail.land/v1/transactional/suppressions/import-file?scope=List&mailingListId=123" \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..." \
-F "[email protected]"scope y mailingListId son parámetros de consulta, no campos de formulario: un campo de formulario con cualquiera de esos nombres se ignora silenciosamente, así que una importación de alcance List enviada como campo de formulario falla con 400. mailingListId es el id público de la lista, resuelto dentro de su tenant; un id desconocido, ajeno o numérico devuelve 404.
Cargue un archivo .csv (máx. 5 MB) con direcciones de correo electrónico separadas por comas o saltos de línea. Una fila de encabezado que contenga "email" se omite automáticamente.
Parámetros de consulta:
| Parámetro | Tipo | Descripción |
|---|---|---|
file | file (campo de formulario multipart) | Archivo CSV (máx. 5 MB, extensión .csv obligatoria) |
scope | string (consulta) | Alcance de supresión (predeterminado: Global) |
mailingListId | string (consulta) | El id público de la lista de correo, resuelto dentro de su tenant. Obligatorio si el alcance es List; un id desconocido, ajeno o numérico devuelve 404. |
{
"totalRows": 1000,
"importedCount": 950,
"skippedCount": 40,
"invalidCount": 10,
"invalidEmails": ["not-an-email", "missing-domain@", "..."],
"errors": [],
"message": "Imported 950 emails. 40 already existed. 10 invalid."
}La lista invalidEmails muestra hasta 10 entradas inválidas. Los correos electrónicos que ya existían se cuentan como skippedCount, no como errores.
Exportar supresiones
Descargue su lista de supresión como CSV:
GET https://api.mail.land/v1/transactional/suppressions/exportcurl https://api.mail.land/v1/transactional/suppressions/export \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..." \
-o suppressions.csv| Parámetro | Tipo | Descripción |
|---|---|---|
type | SuppressionType | Filtrar por tipo |
scope | SuppressionScope | Filtrar por alcance |
mailingListId | string | El id público de la lista de correo, resuelto dentro de su tenant. Un id desconocido, ajeno o numérico devuelve 404. |
Devuelve un archivo CSV con las columnas: email, type, scope, mailing_list, reason, bounce_count, source, created_at, expires_at. Limitado a 100,000 filas.
Eliminar una supresión
Por ID
DELETE https://api.mail.land/v1/transactional/suppressions/{id}curl -X DELETE https://api.mail.land/v1/transactional/suppressions/k3v9x2m8q1w7z4 \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."Por correo electrónico
DELETE https://api.mail.land/v1/transactional/suppressions/[email protected]curl -X DELETE "https://api.mail.land/v1/transactional/suppressions/[email protected]" \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."| Parámetro | Tipo | Descripción |
|---|---|---|
email | string | Correo electrónico a desuprimir (obligatorio) |
scope | SuppressionScope | Eliminar solo para este alcance |
mailingListId | string | Eliminar solo para esta lista de correo: su id público, resuelto dentro de su tenant. Un id desconocido, ajeno o numérico devuelve 404. |
Devuelve 204 No Content en caso de éxito, 404 si no se encuentra.
Supresiones bloqueadas
Ciertas supresiones no pueden eliminarse para proteger la reputación de su remitente y cumplir con las regulaciones antispam:
| Tipo bloqueado | Razón |
|---|---|
Complaint | Queja de spam: requisito de cumplimiento |
SpamTrap | Trampa de spam conocida: protección de entregabilidad |
Desuscripción vía FeedbackLoop | Bucle de retroalimentación del ISP |
Desuscripción vía OneClick | Desuscripción con un clic RFC 8058 |
Desuscripción vía ManualLink | El usuario confirmó la desuscripción |
Desuscripción vía Preference | Elección del centro de preferencias del usuario |
Intentar eliminar una supresión bloqueada devuelve:
{
"code": "SUPPRESSION_LOCKED",
"message": "Cannot delete: Spam complaint - compliance requirement",
"details": {
"lockedReason": "Spam complaint - compliance requirement"
}
}Eliminar supresiones basadas en quejas y reenviar a esas direcciones dañará la reputación de su remitente y puede violar las leyes antispam. Estas supresiones están bloqueadas para su protección.
Fuentes de desuscripción
Cuando un destinatario se desuscribe, se registra la fuente:
| Fuente | Valor | Descripción | Bloqueada |
|---|---|---|---|
ListUnsubscribeHeader | 0 | Encabezado List-Unsubscribe RFC 8058 | No |
ListUnsubscribeMail | 1 | Desuscripción por mailto: | No |
WebForm | 2 | Página web de desuscripción | No |
Api | 3 | Llamada a la API | No |
Admin | 4 | Panel de administración | No |
FeedbackLoop | 5 | Bucle de retroalimentación del ISP | Sí |
OneClick | 6 | POST de un clic RFC 8058 | Sí |
ManualLink | 7 | El usuario confirmó vía enlace | Sí |
Preference | 8 | Elección del centro de preferencias | Sí |
Respuestas de error
| Estado | Código | Descripción |
|---|---|---|
400 | INVALID_REQUEST | Error de validación (correo, alcance o tipo inválido) |
400 | INVALID_EMAIL_FORMAT | El formato de la dirección de correo electrónico es inválido |
400 | CONTENT_TOO_LARGE | El archivo CSV excede 5 MB |
403 | SUPPRESSION_LOCKED | No se puede eliminar una supresión bloqueada |
404 | RESOURCE_NOT_FOUND | Supresión no encontrada, o un mailingListId indicado no nombra ninguna lista de correo en su tenant |
Próximos pasos
- Rebotes: comprenda los tipos de rebotes y la supresión automática
- Resumen de entregabilidad: monitoree la reputación del remitente
- Eventos de webhooks: reciba eventos
message.bounced(suppression.added/suppression.removedestán definidos en el catálogo, pero hoy nunca se emiten)