Codes d'erreur
Référence complète des codes d'erreur de l'API Mail.Land et leur signification
Chaque réponse d'erreur de l'API MailLand inclut un champ code avec un code d'erreur lisible par machine et un champ message avec une description lisible par l'humain.
Format des réponses d'erreur
{
"code": "DOMAIN_NOT_VERIFIED",
"message": "Domain is not verified",
"timestamp": "2026-02-18T12:35:00Z",
"traceId": "00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01"
}Certaines erreurs incluent des details supplémentaires :
{
"code": "IP_RATE_LIMIT_EXCEEDED",
"message": "Too many requests from this IP. Retry after 45 seconds.",
"details": {
"limit": 300,
"current": 301,
"retryAfter": 45,
"resetAt": "2026-02-18T12:35:00Z"
}
}Validation de la requête (400)
Retourné lorsque le corps de la requête, les paramètres de requête ou les en-têtes sont malformés ou manquent de champs obligatoires.
| Code | Description |
|---|---|
INVALID_REQUEST | Requête invalide générale |
VALIDATION_FAILED | Un ou plusieurs champs ont échoué la validation |
INVALID_EMAIL_FORMAT | Le format de l'adresse email est invalide |
WEBHOOK_DESTINATION_NOT_ALLOWED | Une URL de webhook est refusée par la politique de destination : les webhooks sont livrés uniquement en HTTPS sur le port 443 et ne peuvent pas pointer vers les serveurs, adresses ou noms d'hôte de MailLand |
MISSING_CONTENT | Déprécié depuis 2026-04. Utilisez VALIDATION_FAILED : les endpoints send/scheduled retournent désormais des erreurs de validation structurées. |
CONTENT_TOO_LARGE | "The message is too large to send: it would exceed the platform's message-size limit. Reduce the HTML, text, attachments or recipients." : Le message dépasse la limite de taille de la plateforme. POST /v1/transactional/send et send-batch le renvoient en 413 ; rien n'est mis en file. Réduisez le message. Pour l'import CSV, c'est 400 |
transactional_recipient_limit_exceeded | Plus de 5 destinataires sur un identifiant transactionnel (code en minuscules) |
marketing_recipient_limit_exceeded | Plus de 1 000 destinataires sur un identifiant marketing (code en minuscules) |
VALIDATION_FAILED | Envoi par lot avec plus de 10 000 destinataires |
SEND_FAILED | L'opération d'envoi d'email a échoué, y compris « tous les destinataires sont supprimés » |
BATCH_SEND_FAILED | L'opération d'envoi par lot a échoué |
IDEMPOTENCY_KEY_INVALID | Clé d'idempotence vide, mal formée, de plus de 255 caractères, ou en-tête envoyé plusieurs fois (send/send-batch uniquement) |
IDEMPOTENCY_KEY_CONFLICT | L'en-tête X-Idempotency-Key et le champ idempotencyKey ont tous deux été fournis et diffèrent |
INVALID_CURSOR | Le paramètre de pagination par curseur est mal formé |
PASSWORD_REQUIRED | La confirmation du mot de passe est requise |
RECIPIENT_SUPPRESSED | Le destinataire est sur la liste de suppression |
Authentification (401)
Retourné lorsque la requête ne contient pas d'identifiants ou que les identifiants sont invalides.
| Code | Description |
|---|---|
UNAUTHORIZED | X-API-Key manquante, invalide, expirée ou révoquée : le middleware de clé API retourne ce seul code dans tous les cas, avec un message descriptif. Il ne distingue pas manquante/invalide/expirée/révoquée par le code. Un mot de passe de connexion incorrect retourne aussi 401 UNAUTHORIZED. |
LOGIN_REQUIRED | La connexion est requise pour cette opération |
Authentification à deux facteurs
Les échecs de 2FA retournent 400 INVALID_REQUEST avec un message descriptif (par ex. « Invalid code », « 2FA is already enabled »). Il n'existe pas de codes d'erreur 2FA dédiés, lisez le champ message.
Autorisation (403)
Retourné lorsque l'utilisateur authentifié n'a pas la permission d'effectuer l'action demandée.
| Code | Description |
|---|---|
FORBIDDEN | Accès refusé général |
INSUFFICIENT_PERMISSIONS | L'utilisateur ne dispose pas du rôle ou de la permission requise |
ACCOUNT_SUSPENDED | Le compte utilisateur a été suspendu |
ACCOUNT_DISABLED | Le compte utilisateur a été désactivé |
ACCOUNT_NOT_ACTIVE | Le compte utilisateur n'est pas actif |
IP_NOT_ALLOWED | L'IP du client n'est pas dans la liste autorisée de l'identifiant |
VALIDATION_CREDENTIAL_REQUIRED | Une clé d'API Validation est requise pour les endpoints de validation d'e-mail. Une clé Envoi ou Réception est refusée ; une session connectée ou une clé du produit Validation est acceptée |
PLAN_LIMIT_REACHED | Limite de ressources du forfait atteinte, mise à niveau requise |
SENDING_BLOCKED | Le niveau de vérification du compte n'autorise pas cet envoi. Remarque : le refus SendingBlocked du moteur de politique lui-même est 403 ; le même code venant du chemin de politique de débit/préchauffage est 429, voir la section Moteur de politique ci-dessous. |
SUBSCRIPTION_EXPIRED | L'abonnement a expiré |
NO_ACTIVE_SUBSCRIPTION | Aucun abonnement actif trouvé |
TENANT_APPROVAL_REQUIRED | Le compte est en attente de revue avant de pouvoir envoyer. Réessayer n'aide pas ; contactez le support |
MARKETING_NOT_YET_ALLOWED | L'envoi marketing n'est pas encore ouvert. Il s'ouvre automatiquement avec un historique transactionnel sain (au moins 500 e-mails transactionnels livrés sur au moins 7 jours, rebonds durs sous 2 % et plaintes sous 0,1 %) |
MARKETING_SUSPENDED | L'e-mail marketing est temporairement indisponible sur toute la plateforme. L'e-mail transactionnel n'est pas affecté ; campagnes et automatisations sont conservées et reprennent à la réactivation du marketing |
ACTION_REQUIRED | Une action de l'utilisateur est requise avant que l'envoi puisse reprendre. Également renvoyé pour chaque envoi tant que l'espace de travail a un blocage de délivrabilité actif (dépassement du taux de rebond/plainte) : le relais SMTP renvoie 550 pour le même blocage. Voir Blocages de délivrabilité |
Introuvable (404)
Retourné lorsque la ressource demandée n'existe pas ou appartient à un autre espace de travail.
| Code | Description |
|---|---|
RESOURCE_NOT_FOUND | Ressource générique introuvable |
USER_NOT_FOUND | L'utilisateur n'existe pas |
WEBHOOK_NOT_FOUND | Le webhook n'existe pas |
DELIVERY_NOT_FOUND | La livraison webhook n'existe pas |
La plupart des réponses 404 utilisent le code RESOURCE_NOT_FOUND. Le champ message fournit le contexte sur la ressource introuvable (par exemple "Domain not found", "Template not found", "Campaign not found"). Les endpoints webhook font exception : relancer une livraison webhook utilise WEBHOOK_NOT_FOUND / DELIVERY_NOT_FOUND.
Conflit (409)
Retourné lorsque l'opération entre en conflit avec l'état actuel de la ressource.
| Code | Description |
|---|---|
CONFLICT | Conflit de ressource général |
IDEMPOTENCY_KEY_REUSED | Clé d'idempotence déjà utilisée pour un autre endpoint de ce compte (send/send-batch uniquement) |
Domaine et envoi (422)
Retourné lorsque la requête est bien formée mais ne peut pas être traitée en raison de contraintes de logique métier.
| Code | Description |
|---|---|
DOMAIN_NOT_FOUND | Le domaine n'existe pas dans l'espace de travail |
DOMAIN_NOT_VERIFIED | Le domaine n'a pas été vérifié, complétez d'abord la configuration DNS |
DOMAIN_NOT_ALLOWED_FOR_CREDENTIAL | L'identifiant n'est pas autorisé pour ce domaine d'expéditeur |
CAMPAIGN_LINK_BLOCKED | Un lien d'une campagne pointe vers une destination signalée comme dangereuse ; la campagne n'est ni planifiée ni envoyée |
DOMAIN_SUSPENDED | Le domaine a été suspendu |
DOMAIN_VERIFICATION_EXPIRED | La vérification du domaine a expiré, re-vérifiez |
Paiement requis (402)
Retourné lorsque le solde de crédit de l'espace de travail ne peut pas couvrir l'opération demandée.
| Code | Description |
|---|---|
INSUFFICIENT_CREDITS | Pas assez de crédits pour effectuer l'opération |
Limitation de taux (429)
Retourné lorsque la requête dépasse les limites de taux. Inclut généralement l'en-tête Retry-After ; s'il est absent, utilisez un backoff exponentiel plutôt que de supposer qu'aucune attente n'est nécessaire.
Limites de taux de l'API
| Code | Description |
|---|---|
RATE_LIMIT_EXCEEDED | Limite de taux générale de l'API dépassée |
IP_RATE_LIMIT_EXCEEDED | Limite de taux basée sur l'IP dépassée |
SUPPORT_RATE_LIMITED | Limite de taux de l'API de support dépassée |
TOO_MANY_LOGIN_ATTEMPTS | Trop de tentatives de connexion échouées, verrouillage temporaire |
Limites de taux d'envoi d'emails
| Code | Description |
|---|---|
DAILY_LIMIT_EXCEEDED | Limite quotidienne d'envoi d'emails dépassée |
WARMUP_LIMIT_EXCEEDED | La limite quotidienne de montée en charge de l'envoi du compte est atteinte ; réinitialisation à 00:00 UTC (voir Préchauffage des IP) |
PAYMENT_DAILY_LIMIT_EXCEEDED | Limite quotidienne atteinte sur un compte en retard de paiement |
Capacité de la plateforme (429)
Ces refus signifient que c'est la plateforme, et non le quota de votre compte, qui limite actuellement les nouveaux envois. Chacun est un 429 avec un en-tête Retry-After, rien n'a été mis en file et il est sûr de réessayer la même requête. Par SMTP, ce sont des 421 Try again later: <message> transitoires. Le message est le texte anglais renvoyé par l'API.
| Code | message (tel que renvoyé) | Quand réessayer |
|---|---|---|
WARMUP_POOL_BUDGET_EXCEEDED | "Sending is temporarily paused for today. It resumes automatically at 00:00 UTC; no action is needed." | Après Retry-After (prochain 00:00 UTC) |
WARMUP_POOL_BUDGET_EXCEEDED | "Sending is briefly delayed. Please retry in a few minutes." (même code, lorsque la capacité de la plateforme ne peut être vérifiée un instant) | Après le court Retry-After |
WARMUP_POOL_EMPTY | "Sending is temporarily paused. It resumes automatically; no action is needed." | Après Retry-After ; aucune action requise |
PLATFORM_DAILY_CAPACITY_REACHED | "Platform sending capacity for today is fully booked. This is a temporary platform-wide limit, not your account quota, and it resets at midnight UTC." | Après Retry-After (prochain 00:00 UTC) |
PLATFORM_CAPACITY_PROTECTION | "New sending is briefly paused to protect platform capacity. Mail already accepted is not affected. This is transient and clears on its own; retry shortly." | Après le court Retry-After |
PROBATION_CAP_REACHED | "New accounts can send to N recipients per rolling 24 hours until our team has reviewed the account. Capacity returns as earlier sends age out of the 24-hour window; contact support to request a review." (ou « …cannot be verified right now, so sending is briefly paused… » lors d'une brève interruption) | Après Retry-After, ou demandez une revue au support |
Les e-mails déjà acceptés ne sont jamais affectés. Traitez-les comme tout autre 429 : temporisez, respectez Retry-After et réessayez. Il n'y a rien à configurer ni à mettre à niveau.
Limites par flux
transactional_recipient_limit_exceeded et marketing_recipient_limit_exceeded sont en 400, pas en 429 : voir la section Validation de la requête ci-dessus. BATCH_NOT_ALLOWED_FOR_TRANSACTIONAL est également en 400 : un envoi par lot n'est pas autorisé sur un identifiant transactionnel, quelles que soient les limites de taux.
Quota et facturation
| Code | Description |
|---|---|
QUOTA_EXCEEDED | Quota d'utilisation dépassé pour la période de facturation en cours |
Moteur de politique
| Code | Description |
|---|---|
SENDING_BLOCKED | Le moteur de politique de débit/préchauffage a bloqué cet envoi : niveau de vérification, liste d'autorisation sandbox, restriction de compte, ou pic de volume inhabituel |
MARKETING_PAUSED | Les emails marketing sont en pause pour cet espace de travail |
Erreurs serveur (5xx)
| Code | Statut HTTP | Description |
|---|---|---|
INTERNAL_ERROR | 500 | Erreur interne inattendue du serveur |
AUTHENTICATION_FAILED | 500 | La validation de la clé API a échoué en interne (pas un mauvais mot de passe, réessayez) |
TIMEOUT | 504 | L'opération a expiré |
SERVICE_UNAVAILABLE | 503 | Le service est temporairement indisponible |
DATABASE_ERROR | 503 | Une erreur de base de données s'est produite |
Les erreurs serveur (5xx) sont transitoires. Retentez la requête avec un backoff exponentiel. Si l'erreur persiste, consultez la page de statut MailLand ou contactez le support.
Gestion des erreurs
Stratégie de nouvelle tentative
| Statut HTTP | Retenter ? | Stratégie |
|---|---|---|
| 400 | Non | Corrigez la requête et réessayez |
| 401 | Non | Vérifiez les identifiants ou renouvelez votre token |
| 403 | Non | Vérifiez les permissions ou mettez à niveau votre forfait |
| 404 | Non | Vérifiez l'ID de la ressource |
| 409 | Non | Résolvez le conflit |
| 422 | Non | Corrigez le problème de logique métier (par ex. vérifiez le domaine) |
| 429 | Oui | Attendez la durée Retry-After, puis retentez |
| 500 | Oui | Retentez avec un backoff exponentiel (max 3 tentatives) |
| 503 | Oui | Retentez avec un backoff exponentiel (max 5 tentatives) |
Lecture des en-têtes de limitation de taux
La plupart des réponses incluent X-RateLimit-Limit et X-RateLimit-Remaining :
| En-tête | Description |
|---|---|
X-RateLimit-Limit | Maximum de requêtes autorisées dans la fenêtre actuelle |
X-RateLimit-Remaining | Requêtes restantes dans la fenêtre actuelle |
Un 429 basé sur l'IP ajoute en plus :
| En-tête | Description |
|---|---|
X-RateLimit-Reset | Horodatage UTC au format ISO-8601 de la réinitialisation de la fenêtre actuelle (réponses de limite IP uniquement) |
Retry-After | Secondes d'attente avant de retenter |
Prochaines étapes
- Limites de taux : niveaux de limites de taux détaillés et bonnes pratiques
- Authentification : gestion des tokens et des clés API
- Journal des modifications : suivre les changements de l'API