Errores
Mailbeam usa códigos de estado HTTP estándar. Todas las respuestas de error incluyen un campo error legible por máquina y un message legible por personas.
Estructura de una respuesta de error
{
"error": "invalid_email_format",
"message": "The email address is not RFC 5322 compliant.",
"request_id": "req_01hx9abc123"
}
En tu código comprueba siempre el campo error: message puede cambiar, error es estable.
Códigos de estado HTTP
| Código | Significado |
|---|
200 | La petición ha ido bien |
400 | Petición incorrecta: revisa el cuerpo |
401 | Ha fallado la autenticación |
403 | Prohibido: permisos insuficientes |
422 | Error de validación: la dirección tiene un problema concreto |
413 | El cuerpo de la petición es demasiado grande |
429 | Límite de tasa o cuota superados |
500 | Error interno del servidor: contacta con soporte |
503 | Capacidad no disponible en este despliegue |
Códigos de error
Errores de autenticación
| Error | Estado | Descripción |
|---|
missing_api_key | 401 | No hay cabecera Authorization |
invalid_api_key | 401 | El formato de la clave no es válido |
revoked_api_key | 401 | La clave ha sido revocada |
insufficient_permissions | 403 | La clave no tiene el alcance necesario |
Errores de validación
| Error | Estado | Descripción |
|---|
invalid_email_format | 422 | El email no cumple la sintaxis del RFC 5322 |
email_too_long | 422 | El email supera los 254 caracteres |
missing_required_field | 400 | Falta un campo obligatorio en el cuerpo |
invalid_json | 400 | El cuerpo de la petición no es JSON válido |
invalid_request | 400 | El JSON está bien formado pero no es válido: por ejemplo, una URL de webhook que no es HTTPS |
payload_too_large | 413 | El cuerpo supera el límite de tamaño de ese endpoint |
Errores de límite de tasa
| Error | Estado | Descripción |
|---|
rate_limit_exceeded | 429 | Límite por segundo alcanzado; mira retry_after |
quota_exceeded | 429 | Cuota mensual agotada (el plan Free bloquea; los de pago siguen con facturación por exceso) |
Errores de servidor
| Error | Estado | Descripción |
|---|
internal_error | 500 | Error transitorio del servidor: reintenta con retroceso |
service_unavailable | 503 | Una capacidad no está configurada en este despliegue |
upstream_timeout | 504 | El sondeo SMTP ha agotado el tiempo; el resultado no es concluyente |
Gestionar los errores en tu código
try {
const result = await verifyEmail(email);
if (!result.valid) {
// El email es inválido pero la petición ha ido bien: esto NO es un error
handleInvalidEmail(result.reason);
}
} catch (err) {
switch (err.code) {
case "rate_limit_exceeded":
await sleep(err.retryAfter * 1000);
// reintenta
break;
case "quota_exceeded":
// Avisa a operaciones, usa un plan B o deja pasar el registro
notifyOpsTeam();
break;
case "invalid_api_key":
case "revoked_api_key":
// Alerta: es un problema de configuración
alertPagerDuty("clave de API de Mailbeam no válida");
break;
default:
// Registra y continúa: no bloquees usuarios por errores inesperados
logger.error("Error de Mailbeam", { code: err.code, requestId: err.requestId });
}
}
El campo reason
Cuando valid es false, el campo reason contiene una cadena legible por máquina que explica por qué:
| Motivo | Explicación |
|---|
invalid_syntax | No pasa la comprobación de formato del RFC 5322 |
no_mx_records | El dominio no tiene servidores de correo, o publica un MX nulo |
domain_not_found | El dominio no resuelve en absoluto |
smtp_rejected | El buzón no existe |
mailbox_full | El buzón existe pero ha superado su cuota |
disposable_domain | Coincide con un proveedor de email temporal |
role_address | Parece una dirección no personal |
catch_all_unverifiable | El dominio acepta todo el correo; SMTP no es concluyente |
greylisted | El servidor nos ha pedido volver más tarde: trátalo como desconocido |
smtp_blocked | El servidor ha rechazado nuestro sondeo, no la dirección |
smtp_unreachable | Ningún servidor de correo ha respondido |
timeout | El sondeo ha agotado el tiempo: trátalo como desconocido |
status frente a valid
valid es un booleano, y con dos estados no se puede distinguir «este buzón no
existe» de «no hemos podido averiguarlo». Usa status cuando esa diferencia
importe:
| Estado | Significado | valid |
|---|
deliverable | El buzón ha quedado confirmado | true |
undeliverable | Confirmado como malo: sintaxis errónea, sin ruta de correo, buzón rechazado, desechable | false |
risky | Real pero de baja calidad: dominio catch-all, dirección de rol, buzón lleno | false |
unknown | No hemos podido averiguarlo: greylisting, sondeo bloqueado, tiempo de DNS agotado | false |
Bloquear registros por undeliverable es seguro. Bloquear por unknown bloquea
usuarios reales: usa el score en su lugar.
No bloquees nunca a un usuario solo por catch_all_unverifiable. Usa el campo score para tomar decisiones con matices.