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/webhookscurl -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
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
name | string | No | Nombre legible para este webhook |
webhookUrl | string | Sí | URL del endpoint HTTPS para recibir eventos |
products | array | No | Filtro de producto: transactional, marketing, inbound, system |
events | array | No | Eventos específicos a los que suscribirse (ver Eventos) |
includeFutureEvents | boolean | No | Recibir nuevos eventos añadidos a los productos suscritos (predeterminado: true) |
scope | string | No | all_domains (predeterminado) o selected_domains |
domainIds | array | No | IDs de dominio para filtrar (requerido si scope es selected_domains) |
Respuesta
Estado: 201 Created
{
"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/webhookscurl -X GET https://api.mail.land/v1/webhooks \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."[
{
"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}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}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}/testcurl -X POST https://api.mail.land/v1/webhooks/k3m9x2p7qw4rtz/test \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."{
"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:
| Campo | Significado |
|---|---|
wouldReceiveRealEvents | Si algún evento real puede llegar a este endpoint |
liveEvents | Eventos suscritos que pasan el mismo filtro que aplica el despachador |
dormantEvents | Eventos suscritos que nunca llegarán, cada uno con su motivo |
subscriptionWarning | Se 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-secretcurl -X POST https://api.mail.land/v1/webhooks/k3m9x2p7qw4rtz/regenerate-secret \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."{
"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:
{
"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 pausedReasondescribe el motivo de la pausa- Se envía un evento
account.webhook_pauseda 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}/resumecurl -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}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
| Estado | Código | Descripción |
|---|---|---|
400 | INVALID_REQUEST | URL, eventos o configuración de alcance inválidos |
403 | PLAN_LIMIT_REACHED | Se 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 |
404 | RESOURCE_NOT_FOUND | El ID del webhook no existe, devuelto solo por /test |
Próximos Pasos
- Eventos: referencia completa de todos los tipos de eventos y payloads
- Verificación de Firma: verificar la autenticidad del webhook
- Lógica de Reintentos: comprender el comportamiento de reintentos y el manejo de fallos