MailLandDocs
Webhooks

Descripción General de Webhooks

Reciba notificaciones en tiempo real sobre eventos de correo electrónico a través de webhooks

Los webhooks entregan notificaciones HTTP en tiempo real a su servidor cuando ocurren eventos de correo electrónico, entregas, rebotes, quejas y más. En lugar de consultar periódicamente los cambios de estado, MailLand envía los eventos a su endpoint en el momento en que ocurren.

Cómo Funcionan los Webhooks

Configurar un webhook

Registre la URL de su endpoint y seleccione los eventos que desea recibir.

Mail.Land envía los eventos

Cuando ocurre un evento (por ejemplo, se entrega un correo electrónico), MailLand envía un HTTP POST firmado a su endpoint con el payload del evento.

Su servidor responde

Devuelva un código de estado 2xx para confirmar la recepción. Las respuestas que no sean 2xx desencadenan reintentos automáticos.

Crear un Webhook

POST https://api.mail.land/v1/webhooks
Create a webhook
curl -X POST https://api.mail.land/v1/webhooks \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..." \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Production Events",
    "webhookUrl": "https://your-app.com/webhooks/mailland",
    "products": ["transactional", "marketing"],
    "events": ["message.delivered", "message.bounced", "message.deferred", "message.complained"],
    "includeFutureEvents": true,
    "scope": "all_domains"
  }'

Campos de la Solicitud

CampoTipoRequeridoDescripción
namestringNoNombre legible para este webhook
webhookUrlstringSíURL del endpoint HTTPS para recibir eventos
productsarrayNoFiltro de producto: transactional, marketing, inbound, system
eventsarrayNoEventos específicos a los que suscribirse (ver Eventos)
includeFutureEventsbooleanNoRecibir nuevos eventos añadidos a los productos suscritos (predeterminado: true)
scopestringNoall_domains (predeterminado) o selected_domains
domainIdsarrayNoIDs de dominio para filtrar (requerido si scope es selected_domains)

Respuesta

Estado: 201 Created

Webhook created response
{
  "webhook": {
    "id": "k3m9x2p7qw4rtz",
    "name": "Production Events",
    "webhookUrl": "https://your-app.com/webhooks/mailland",
    "products": ["transactional", "marketing"],
    "events": ["message.delivered", "message.bounced", "message.deferred", "message.complained"],
    "includeFutureEvents": true,
    "scope": "all_domains",
    "domainIds": [],
    "isActive": true,
    "createdAt": "2026-02-17T10:00:00Z",
    "successCount": 0,
    "failureCount": 0,
    "consecutiveFailures": 0,
    "pauseThreshold": 10
  },
  "secret": "whsec_a1b2c3d4e5f6g7h8i9j0..."
}

El secret solo se muestra una vez cuando se crea el webhook. Guárdelo de forma segura: lo necesitará para verificar las firmas del webhook. Si lo pierde, puede regenerarlo, lo que invalida el secret anterior.

Las URL de los webhooks deben usar HTTPS. MailLand valida las URL contra ataques SSRF: las direcciones de red privada (127.0.0.1, 10.x, 192.168.x, etc.) son rechazadas. La entrega es solo por HTTPS en el puerto 443; una URL en otro puerto, o que apunte a los servidores o nombres de host de MailLand, se rechaza con 400 WEBHOOK_DESTINATION_NOT_ALLOWED. Otro puerto TLS requiere la aprobación explícita del soporte de MailLand.

Listar Webhooks

GET https://api.mail.land/v1/webhooks
List webhooks
curl -X GET https://api.mail.land/v1/webhooks \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."
List response
[
  {
    "id": "k3m9x2p7qw4rtz",
    "name": "Production Events",
    "webhookUrl": "https://your-app.com/webhooks/mailland",
    "products": ["transactional", "marketing"],
    "events": ["message.delivered", "message.bounced"],
    "isActive": true,
    "lastTriggeredAt": "2026-02-17T12:30:00Z",
    "lastSuccessAt": "2026-02-17T12:30:00Z",
    "successCount": 1542,
    "failureCount": 3,
    "consecutiveFailures": 0,
    "createdAt": "2026-02-10T08:00:00Z"
  }
]

Devuelve hasta 100 webhooks ordenados por fecha de creación (más reciente primero).

Obtener Detalle del Webhook

GET https://api.mail.land/v1/webhooks/{id}
Get webhook detail
curl -X GET https://api.mail.land/v1/webhooks/k3m9x2p7qw4rtz \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."

Devuelve la configuración completa del webhook más los 50 registros de entrega más recientes. Consulte Lógica de Reintentos para detalles de los registros de entrega.

Actualizar un Webhook

PUT https://api.mail.land/v1/webhooks/{id}
Update webhook
curl -X PUT https://api.mail.land/v1/webhooks/k3m9x2p7qw4rtz \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..." \
  -H "Content-Type: application/json" \
  -d '{
    "name": "All Events",
    "events": ["message.delivered", "message.bounced", "message.deferred", "message.complained"],
    "isActive": true
  }'

Todos los campos son opcionales: incluya solo los campos que desea cambiar.

Probar un Webhook

Envíe un evento de prueba para verificar que su endpoint funciona:

POST https://api.mail.land/v1/webhooks/{id}/test
Test a webhook
curl -X POST https://api.mail.land/v1/webhooks/k3m9x2p7qw4rtz/test \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."
Test result
{
  "success": true,
  "statusCode": 200,
  "statusText": "OK",
  "durationMs": 145,
  "responseBody": "{\"received\": true}",
  "headersSent": {
    "X-MLND-Signature": "t=1708171200,v1=abc123...",
    "X-MLND-Event-Id": "evt_test_abc123",
    "X-MLND-Event-Version": "1",
    "X-MLND-Event": "webhook.test",
    "X-MLND-Webhook-Id": "k3m9x2p7qw4rtz",
    "X-MLND-Attempt": "1"
  },
  "wouldReceiveRealEvents": true,
  "liveEvents": ["message.delivered", "message.bounced"],
  "dormantEvents": {},
  "subscriptionWarning": null
}

El envío de prueba usa la misma firma y el mismo transporte de entrega que un evento real, así que un éxito aquí demuestra su URL, su TLS y su verificación de firma.

No demuestra su suscripción: una prueba se envía bajo demanda y no se enruta según su selección de eventos. Los cuatro últimos campos lo responden por separado:

CampoSignificado
wouldReceiveRealEventsSi algún evento real puede llegar a este endpoint
liveEventsEventos suscritos que pasan el mismo filtro que aplica el despachador
dormantEventsEventos suscritos que nunca llegarán, cada uno con su motivo
subscriptionWarningSe rellena cuando el endpoint es alcanzable pero queda inactivo de forma permanente

Un "success": true junto con "wouldReceiveRealEvents": false es el caso importante: el endpoint funciona pero no está suscrito a nada que pueda entregarse.

Si la prueba falla, el campo errorType indica el motivo: ssrf_blocked (la URL, o una redirección desde ella, apuntaba a un destino al que la plataforma se niega a enviar) o network_error (tiempo de espera, fallo de TLS, conexión rechazada; errorMessage lleva el detalle).

Regenerar el Secret

Si pierde o necesita rotar el secret de su webhook:

POST https://api.mail.land/v1/webhooks/{id}/regenerate-secret
Regenerate webhook secret
curl -X POST https://api.mail.land/v1/webhooks/k3m9x2p7qw4rtz/regenerate-secret \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."
New secret
{
  "secretKey": "whsec_x9y8z7w6v5u4..."
}

La regeneración del secret invalida inmediatamente el anterior. Actualice el código de verificación de su servidor antes de la próxima entrega del webhook, o rechazará eventos válidos.

Alcance de Dominio

De manera predeterminada, los webhooks reciben eventos para todos los dominios de su espacio de trabajo. Para limitar un webhook a dominios específicos:

Domain-scoped webhook
{
  "webhookUrl": "https://your-app.com/webhooks/mailland",
  "scope": "selected_domains",
  "domainIds": ["d4n8q1zt5wm3xc", "b7r2mv9k0jy4pw"]
}

Solo los eventos relacionados con esos dominios activarán el webhook.

Pausa Automática por Fallos

MailLand pausa automáticamente los webhooks después de 10 fallos de entrega consecutivos (configurable por webhook mediante pauseThreshold). Esto evita desperdiciar recursos en endpoints que están caídos.

Cuando un webhook es pausado:

  • Se establece la marca de tiempo pausedAt
  • pausedReason describe el motivo de la pausa
  • Se envía un evento account.webhook_paused a sus otros webhooks activos
  • Se crea una notificación dentro de la aplicación

Reanudar un Webhook Pausado

Después de solucionar el problema, reanude la entrega:

POST https://api.mail.land/v1/webhooks/{id}/resume
Resume a paused webhook
curl -X POST https://api.mail.land/v1/webhooks/k3m9x2p7qw4rtz/resume \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."

Esta acción borra el estado de pausa, restablece el contador de fallos consecutivos y reactiva el webhook (isActive vuelve a ser true), de modo que los eventos futuros se entregan con normalidad.

Eliminar un Webhook

DELETE https://api.mail.land/v1/webhooks/{id}
Delete a webhook
curl -X DELETE https://api.mail.land/v1/webhooks/k3m9x2p7qw4rtz \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."

Devuelve 204 No Content. Si el webhook es utilizado por rutas de correo entrante, esas rutas serán actualizadas o deshabilitadas automáticamente.

Respuestas de Error

EstadoCódigoDescripción
400INVALID_REQUESTURL, eventos o configuración de alcance inválidos
403PLAN_LIMIT_REACHEDSe alcanzó el máximo de webhooks para su plan
404(cuerpo vacío)El ID del webhook no existe: devuelto por get, update, delete, regenerate-secret y resume
404RESOURCE_NOT_FOUNDEl ID del webhook no existe, devuelto solo por /test

Próximos Pasos

En esta página