Ir al contenido

Errores

Todas las respuestas de error de la API de MailerDash siguen un formato unificado inspirado en Stripe. Esto facilita el manejo programático: puedes distinguir qué tipo de error ocurrió (y cómo reaccionar) sin parsear el mensaje de texto.


{
"error": {
"type": "validation_error",
"code": "domain_unauthorized",
"message": "The from domain is not authorized for this key.",
"param": "from.email"
}
}
CampoTipoDescripción
typestringCategoría del error (ver tabla abajo). Determina la estrategia de retry.
codestringCódigo machine-readable específico.
messagestringDescripción human-readable en inglés.
paramstring (opcional)Campo o parámetro que causó el error, cuando aplica.
detailsarray (opcional)Lista de sub-errores para casos de validación múltiple.

El campo type es categórico y te permite decidir la estrategia sin leer code ni message:

typeHTTPCuándo usarlo
validation_error400 / 422El request tiene campos inválidos o faltantes. No reintentar sin corrección.
authentication_error401Token ausente, malformado o inválido. Revisar la API key.
authorization_error403Autenticado pero sin permisos. La key no tiene el scope necesario.
not_found_error404El recurso solicitado no existe.
rate_limit_error429Se excedió el límite de tasa o la cuota mensual. Reintentar con backoff.
conflict_error409Conflicto con el estado actual (p.ej. recurso ya existe).
payload_too_large_error413El body excede el tamaño permitido (p.ej. attachments demasiado grandes).
idempotency_error409La idempotency key ya se usó con un payload diferente.
smtp_error5xxError al entregar el correo via SMTP.
api_error5xxError interno del servidor. Reintentar con backoff exponencial.

codetypeDescripción
domain_unauthorizedauthorization_errorEl dominio del campo from no está autorizado para esta API key.
email_not_verifiedauthorization_errorLa cuenta no ha verificado su email; los envíos están bloqueados hasta hacerlo.
free_requires_verified_domainauthorization_errorEl plan gratuito requiere un dominio verificado para enviar.
monthly_quota_exceededrate_limit_errorSe alcanzó la cuota mensual de envíos del plan.
rate_limit_exceededrate_limit_errorSe superó el límite de requests por minuto (rate_per_min).
codetypeDescripción
max_domains_exceededvalidation_errorAlcanzaste el límite de dominios permitidos por tu plan.
domain_takenconflict_errorEl dominio ya está registrado en otra cuenta de la plataforma.
reserved_domainvalidation_errorEl dominio está reservado y no puede ser registrado por clientes.
cname_delegation_disabledvalidation_errorLa delegación CNAME no está habilitada para esta cuenta.
codetypeDescripción
max_api_keys_exceededvalidation_errorAlcanzaste el límite de API keys de tu plan.
key_not_linkedauthorization_errorEl JWT del usuario no tiene ninguna API key vinculada para el recurso solicitado.
already_revokedconflict_errorLa API key ya fue revocada.
wrong_passwordauthentication_errorLa contraseña proporcionada es incorrecta (operaciones que requieren confirmación).
codetypeDescripción
billing_unavailableapi_errorEl sistema de billing no está disponible en este momento.
no_billing_accountvalidation_errorLa cuenta no tiene una suscripción Stripe activa.
no_active_subscriptionvalidation_errorNo hay suscripción activa para esta operación.
overage_not_offeredvalidation_errorEl plan actual no ofrece envíos de overage.
package_not_selectablevalidation_errorEl plan solicitado no está disponible para selección.
already_subscribedconflict_errorYa tienes este plan activo.
codetypeDescripción
not_foundnot_found_errorEl recurso no existe.
unauthorizedauthentication_errorToken ausente o inválido.
forbiddenauthorization_errorSin permisos para esta operación.
payload_too_largepayload_too_large_errorBody o attachments demasiado grandes.
internal_errorapi_errorError interno del servidor.
bad_requestvalidation_errorRequest malformado.

Cuando un solo request tiene varios campos inválidos, la respuesta incluye el array details:

{
"error": {
"type": "validation_error",
"code": "invalid",
"message": "Request validation failed",
"details": [
{ "code": "required", "message": "'subject' is required", "param": "subject" },
{ "code": "invalid_format", "message": "'from.email' must be a valid email", "param": "from.email" }
]
}
}

const res = await fetch('https://api.mailerdash.com/v1/mail/send', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.MAILERDASH_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({ from: { email: 'noreply@mi-app.com' }, to: [...], subject: '...', text: '...' }),
});
if (!res.ok) {
const { error } = await res.json();
if (error.type === 'rate_limit_error') {
// Reintentar después de un backoff — el header Retry-After puede indicar cuándo
console.warn('Rate limit alcanzado, reintentando en 60s...', error.code);
} else if (error.type === 'validation_error') {
// No reintentar — corregir el request
console.error('Error de validación:', error.code, error.param);
} else if (error.type === 'authentication_error') {
// Revisar la API key
console.error('API key inválida o sin permisos');
} else {
console.error('Error inesperado:', error);
}
}

Ver la referencia completa de endpoints en /reference/transactional/ y /reference/bulk/.