Erreurs
Mailbeam utilise les codes de statut HTTP standards. Toute réponse d'erreur porte un champ error lisible par la machine et un message lisible par un humain.
Structure d'une réponse d'erreur
{
"error": "invalid_email_format",
"message": "The email address is not RFC 5322 compliant.",
"request_id": "req_01hx9abc123"
}
Testez toujours le champ error dans votre code : message peut changer, error est stable.
Codes de statut HTTP
| Code | Signification |
|---|
200 | La requête a réussi |
400 | Requête incorrecte — vérifiez votre payload |
401 | Échec de l'authentification |
403 | Interdit — droits insuffisants |
422 | Erreur de validation — l'adresse a un problème précis |
413 | Corps de requête trop volumineux |
429 | Limite de débit ou quota dépassé |
500 | Erreur interne du serveur — contactez le support |
503 | Capacité indisponible sur ce déploiement |
Codes d'erreur
Erreurs d'authentification
| Erreur | Statut | Description |
|---|
missing_api_key | 401 | Pas d'en-tête Authorization |
invalid_api_key | 401 | Le format de la clé est invalide |
revoked_api_key | 401 | La clé a été révoquée |
insufficient_permissions | 403 | La clé n'a pas la portée requise |
Erreurs de validation
| Erreur | Statut | Description |
|---|
invalid_email_format | 422 | L'adresse ne respecte pas la syntaxe du RFC 5322 |
email_too_long | 422 | L'adresse dépasse 254 caractères |
missing_required_field | 400 | Un champ obligatoire est absent du corps |
invalid_json | 400 | Le corps de la requête n'est pas du JSON valide |
invalid_request | 400 | Le JSON est bien formé mais la requête n'est pas valide — par exemple une URL de webhook qui n'est pas en HTTPS |
payload_too_large | 413 | Le corps de la requête dépasse la taille limite de cet endpoint |
Erreurs de limite de débit
| Erreur | Statut | Description |
|---|
rate_limit_exceeded | 429 | Limite par seconde atteinte ; regardez retry_after |
quota_exceeded | 429 | Quota mensuel épuisé (le forfait Free bloque ; les forfaits payants continuent en facturation de dépassement) |
Erreurs serveur
| Erreur | Statut | Description |
|---|
internal_error | 500 | Erreur serveur passagère — réessayez avec un backoff |
service_unavailable | 503 | Une capacité n'est pas configurée sur ce déploiement |
upstream_timeout | 504 | La sonde SMTP a expiré ; le résultat n'est pas concluant |
Traiter les erreurs dans le code
try {
const result = await verifyEmail(email);
if (!result.valid) {
// L'adresse est invalide, mais la requête a réussi — ce n'est PAS une erreur
handleInvalidEmail(result.reason);
}
} catch (err) {
switch (err.code) {
case "rate_limit_exceeded":
await sleep(err.retryAfter * 1000);
// réessai
break;
case "quota_exceeded":
// Prévenir l'exploitation, basculer sur un repli, ou laisser passer l'inscription
notifyOpsTeam();
break;
case "invalid_api_key":
case "revoked_api_key":
// Alerte — problème de configuration
alertPagerDuty("Clé d'API Mailbeam invalide");
break;
default:
// Journaliser et continuer — ne bloquez pas vos utilisateurs sur une erreur inattendue
logger.error("Erreur Mailbeam", { code: err.code, requestId: err.requestId });
}
}
Le champ reason
Quand valid vaut false, le champ reason porte une chaîne lisible par la machine qui explique pourquoi :
| Motif | Explication |
|---|
invalid_syntax | Échec du contrôle de format RFC 5322 |
no_mx_records | Le domaine n'a pas de serveur de messagerie, ou publie un MX nul |
domain_not_found | Le domaine ne se résout pas du tout |
smtp_rejected | La boîte n'existe pas |
mailbox_full | La boîte existe mais a dépassé son quota |
disposable_domain | Correspond à un fournisseur d'adresses temporaires |
role_address | Ressemble à une adresse non personnelle |
catch_all_unverifiable | Le domaine accepte tout le courrier ; le SMTP n'est pas concluant |
greylisted | Le serveur nous a demandé de revenir plus tard — à traiter comme inconnu |
smtp_blocked | Le serveur a refusé notre sonde, pas l'adresse |
smtp_unreachable | Aucun serveur de messagerie n'a répondu |
timeout | La sonde a expiré — à traiter comme inconnu |
status face à valid
valid est un booléen, et deux états ne peuvent pas distinguer « cette boîte
n'existe pas » de « nous n'avons pas pu savoir ». Servez-vous de status quand
cette différence compte :
| Statut | Signification | valid |
|---|
deliverable | La boîte a été confirmée | true |
undeliverable | Confirmée mauvaise — syntaxe incorrecte, pas de route de messagerie, boîte rejetée, adresse jetable | false |
risky | Réelle mais de faible qualité — domaine catch-all, adresse fonctionnelle, boîte pleine | false |
unknown | Nous n'avons pas pu savoir : greylisting, sonde bloquée, expiration DNS | false |
Bloquer une inscription sur undeliverable est sans danger. Bloquer sur
unknown bloque de vrais utilisateurs — servez-vous du score à la place.
Ne bloquez jamais un utilisateur sur le seul catch_all_unverifiable. Servez-vous du champ score pour prendre une décision nuancée.