MailLandDocs
Délivrabilité

Suppressions

Gérez les listes de suppression pour éviter d'envoyer à des adresses invalides, désabonnées ou ayant signalé des abus

La liste de suppression empêche l'envoi d'e-mails aux adresses qui ont rebondi, se sont désabonnées ou ont déposé des plaintes. MailLand gère les suppressions automatiquement à partir des événements de rebond et de plainte, et vous pouvez ajouter ou supprimer des entrées manuellement via l'API.

Types de suppression

TypeValeurDescriptionPortée par défaut
HardBounce1Échec de livraison permanentGlobal (toujours)
SoftBounce2Échec temporaire (suppression marketing de 30 jours, n'escalade qu'après ≥3 rebonds éligibles sur ≥7 jours)Marketing (expiration de 30 jours)
Complaint3Le destinataire a signalé l'e-mail comme spamGlobal (toujours)
Unsubscribe4Le destinataire s'est désabonnéDépend du type de message
Manual5Ajouté manuellement via l'API ou le tableau de bordN'importe quelle portée
Invalid6Format d'e-mail invalideGlobal (toujours)
SpamTrap7Adresse de piège à spam connueGlobal (toujours)
RoleAddress8E-mail basé sur un rôle (info@, admin@, etc.)Global (toujours)

Portées de suppression

Les portées contrôlent quels types d'e-mails sont bloqués :

PortéeValeurComportement
Global0Bloque tous les e-mails (transactionnels et marketing)
Marketing1Bloque les e-mails marketing ; les e-mails transactionnels sont toujours livrés
Transactional2Bloque uniquement les e-mails transactionnels (rare)
List3Bloque les e-mails pour une liste de diffusion spécifique uniquement

Contraintes de portée :

  • HardBounce, Complaint, Invalid, SpamTrap, RoleAddress → Portée Global uniquement
  • SoftBounce → Portée Marketing en général
  • Unsubscribe → Global, Marketing ou List (pas Transactional)
  • Manual → N'importe quelle portée

Lister les suppressions

GET https://api.mail.land/v1/transactional/suppressions

Authentifiez-vous avec Authorization: Bearer <token> ou X-API-Key: <api key>.

List suppressions
curl https://api.mail.land/v1/transactional/suppressions \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."

Paramètres de requête

ParamètreTypePar défautDescription
cursorstring-Curseur opaque issu du nextCursor de la page précédente. À omettre pour la première page.
limitint50Éléments par page (max 100)
searchstring-Filtrer par adresse e-mail
typeSuppressionType-Filtrer par type
scopeSuppressionScope-Filtrer par portée
mailingListIdstring-L'id public de la liste de diffusion, résolu dans votre tenant. Un id inconnu, étranger ou numérique renvoie 404.
fromDatedatetimeIl y a 90 joursDate de début
toDatedatetimeMaintenantDate de fin
sortBystringCreatedAtChamp de tri
sortDescendingbooltrueDirection du tri
Suppression list response
{
  "items": [
    {
      "id": "k3v9x2m8q1w7z4",
      "email": "[email protected]",
      "suppressionType": "hardBounce",
      "scope": "global",
      "mailingListId": null,
      "mailingListName": null,
      "expiresAt": null,
      "reason": "550 5.1.1 The email account does not exist",
      "bounceType": "Hard",
      "bounceCategory": "invalid_recipient",
      "bounceCount": 1,
      "lastBounceAt": "2026-02-17T12:00:00Z",
      "unsubscribeSource": null,
      "campaignId": null,
      "subscriberId": null,
      "source": "webhook",
      "notes": null,
      "createdAt": "2026-02-17T12:00:01Z",
      "isLocked": false,
      "lockedReason": null
    }
  ],
  "nextCursor": "eyJ2IjoxLCJzIjoiY3JlYXRlZGF0OmRlc2MiLCJrIjoi...",
  "hasMore": true
}

mailingListId, campaignId et subscriberId sont l'id public de la ressource associée, résolu dans votre tenant : jamais l'id numérique interne de la ligne. Chacun vaut null lorsque l'entrée n'a pas ce lien, ou lorsque la ressource associée a depuis été supprimée.

Statistiques de suppression

Obtenez un résumé de votre liste de suppression :

GET https://api.mail.land/v1/transactional/suppressions/stats
Get suppression stats
curl https://api.mail.land/v1/transactional/suppressions/stats \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."
Stats response
{
  "totalCount": 5000,
  "globalCount": 3000,
  "marketingCount": 1500,
  "transactionalCount": 200,
  "listCount": 300,
  "hardBounceCount": 2000,
  "softBounceCount": 1500,
  "complaintCount": 500,
  "unsubscribeCount": 700,
  "manualCount": 200,
  "invalidCount": 50,
  "spamTrapCount": 30,
  "roleAddressCount": 20,
  "expiringCount": 85,
  "lastSuppression": "2026-02-17T12:00:01Z"
}

expiringCount indique les rebonds temporaires qui expireront dans les 7 prochains jours.

Vérifier si un e-mail est supprimé

Vérification individuelle

GET https://api.mail.land/v1/transactional/suppressions/[email protected]&messageType=Marketing
Check suppression
curl "https://api.mail.land/v1/transactional/suppressions/[email protected]&messageType=Marketing" \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."
ParamètreTypePar défautDescription
emailstring-Adresse e-mail (obligatoire)
messageTypestringMarketingMarketing ou Transactional
mailingListIdstring-L'id public de la liste de diffusion, résolu dans votre tenant. Un id inconnu, étranger ou numérique renvoie 404.
Check response
{
  "email": "[email protected]",
  "isSuppressed": true,
  "messageType": "Marketing"
}

Vérification en lot

Vérifiez jusqu'à 1 000 e-mails à la fois :

POST https://api.mail.land/v1/transactional/suppressions/check-bulk
Bulk check suppressions
curl -X POST https://api.mail.land/v1/transactional/suppressions/check-bulk \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..." \
  -H "Content-Type: application/json" \
  -d '{"emails":["[email protected]","[email protected]","[email protected]"],"messageType":"Marketing","mailingListId":null}'
Bulk check request
{
  "emails": ["[email protected]", "[email protected]", "[email protected]"],
  "messageType": "Marketing",
  "mailingListId": null
}
Bulk check response
{
  "suppressedEmails": ["[email protected]"]
}

Ajouter une suppression

POST https://api.mail.land/v1/transactional/suppressions
Add suppression
curl -X POST https://api.mail.land/v1/transactional/suppressions \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..." \
  -H "Content-Type: application/json" \
  -d '{"email":"[email protected]","suppressionType":"Manual","scope":"Global","reason":"Customer requested removal from all lists","notes":"Ticket #4521"}'
Add suppression request
{
  "email": "[email protected]",
  "suppressionType": "Manual",
  "scope": "Global",
  "reason": "Customer requested removal from all lists",
  "notes": "Ticket #4521"
}
ChampTypeObligatoirePar défautDescription
emailstringOui-Adresse e-mail (max 255 caractères)
suppressionTypestringNonManualType de suppression
scopestringNonGlobalPortée de la suppression
mailingListIdstringNon-L'id public de la liste de diffusion, résolu dans votre tenant. Obligatoire si la portée est List ; un id inconnu, étranger ou numérique renvoie 404.
reasonstringNon-Raison (max 500 caractères)
notesstringNon-Notes internes

Retourne 201 Created avec l'objet de suppression complet. L'en-tête Location est /v1/transactional/suppressions : la route de liste, puisqu'il n'existe pas de route de récupération par id. Utilisez le champ id du corps pour identifier la suppression créée, et les sections « Lister les suppressions » ou « Vérifier si un e-mail est supprimé » ci-dessous pour la retrouver.

Ajout en lot

Ajoutez jusqu'à 1 000 suppressions à la fois :

POST https://api.mail.land/v1/transactional/suppressions/bulk
Bulk add suppressions
curl -X POST https://api.mail.land/v1/transactional/suppressions/bulk \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..." \
  -H "Content-Type: application/json" \
  -d '{"emails":[{"email":"[email protected]","suppressionType":"Manual","scope":"Global","reason":"Cleanup"},{"email":"[email protected]","suppressionType":"Manual","scope":"Marketing"}]}'
Bulk add request
{
  "emails": [
    { "email": "[email protected]", "suppressionType": "Manual", "scope": "Global", "reason": "Cleanup" },
    { "email": "[email protected]", "suppressionType": "Manual", "scope": "Marketing" }
  ]
}
Bulk add response
{
  "totalCount": 2,
  "addedCount": 2,
  "skippedCount": 0,
  "skippedEmails": [],
  "message": "Added 2 suppressions"
}

Les e-mails déjà présents dans la liste de suppression sont ignorés (pas de doublons).

Importer depuis CSV

Depuis du contenu texte

POST https://api.mail.land/v1/transactional/suppressions/import
Import suppressions from CSV text
curl -X POST https://api.mail.land/v1/transactional/suppressions/import \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..." \
  -H "Content-Type: application/json" \
  -d '{"csvContent":"[email protected]\[email protected]\[email protected]","defaultReason":"Imported from legacy system","suppressionType":"Manual","scope":"Global"}'
CSV import request
{
  "csvContent": "[email protected]\n[email protected]\n[email protected]",
  "defaultReason": "Imported from legacy system",
  "suppressionType": "Manual",
  "scope": "Global"
}

Depuis un fichier téléversé

POST https://api.mail.land/v1/transactional/suppressions/import-file
Import suppressions from file
curl -X POST "https://api.mail.land/v1/transactional/suppressions/import-file?scope=List&mailingListId=123" \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..." \
  -F "[email protected]"

scope et mailingListId sont des paramètres de requête, pas des champs de formulaire : un champ de formulaire portant l'un de ces noms est ignoré silencieusement, si bien qu'un import de portée List envoyé comme champ de formulaire échoue avec 400. mailingListId est l'id public de la liste, résolu dans votre tenant ; un id inconnu, étranger ou numérique renvoie 404.

Téléversez un fichier .csv (max 5 Mo) avec des adresses e-mail séparées par des virgules ou des retours à la ligne. Une ligne d'en-tête contenant "email" est automatiquement ignorée.

Paramètres de requête :

ParamètreTypeDescription
filefile (champ de formulaire multipart)Fichier CSV (max 5 Mo, extension .csv requise)
scopestring (requête)Portée de suppression (par défaut : Global)
mailingListIdstring (requête)L'id public de la liste de diffusion, résolu dans votre tenant. Obligatoire si la portée est List ; un id inconnu, étranger ou numérique renvoie 404.
Import result
{
  "totalRows": 1000,
  "importedCount": 950,
  "skippedCount": 40,
  "invalidCount": 10,
  "invalidEmails": ["not-an-email", "missing-domain@", "..."],
  "errors": [],
  "message": "Imported 950 emails. 40 already existed. 10 invalid."
}

La liste invalidEmails affiche jusqu'à 10 entrées invalides. Les e-mails déjà existants sont comptés dans skippedCount, pas comme des erreurs.

Exporter les suppressions

Téléchargez votre liste de suppression au format CSV :

GET https://api.mail.land/v1/transactional/suppressions/export
Export suppressions
curl https://api.mail.land/v1/transactional/suppressions/export \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..." \
  -o suppressions.csv
ParamètreTypeDescription
typeSuppressionTypeFiltrer par type
scopeSuppressionScopeFiltrer par portée
mailingListIdstringL'id public de la liste de diffusion, résolu dans votre tenant. Un id inconnu, étranger ou numérique renvoie 404.

Retourne un fichier CSV avec les colonnes : email, type, scope, mailing_list, reason, bounce_count, source, created_at, expires_at. Limité à 100 000 lignes.

Supprimer une suppression

Par ID

DELETE https://api.mail.land/v1/transactional/suppressions/{id}
Delete suppression by ID
curl -X DELETE https://api.mail.land/v1/transactional/suppressions/k3v9x2m8q1w7z4 \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."

Par e-mail

DELETE https://api.mail.land/v1/transactional/suppressions/[email protected]
Delete suppression by email
curl -X DELETE "https://api.mail.land/v1/transactional/suppressions/[email protected]" \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."
ParamètreTypeDescription
emailstringE-mail à désupprimer (obligatoire)
scopeSuppressionScopeSupprimer uniquement pour cette portée
mailingListIdstringSupprimer uniquement pour cette liste de diffusion : son id public, résolu dans votre tenant. Un id inconnu, étranger ou numérique renvoie 404.

Retourne 204 No Content en cas de succès, 404 si introuvable.

Suppressions verrouillées

Certaines suppressions ne peuvent pas être supprimées pour protéger votre réputation d'expéditeur et respecter les réglementations anti-spam :

Type verrouilléRaison
ComplaintPlainte pour spam : obligation de conformité
SpamTrapPiège à spam connu : protection de la délivrabilité
Désabonnement via FeedbackLoopBoucle de rétroaction ISP
Désabonnement via OneClickDésabonnement en un clic RFC 8058
Désabonnement via ManualLinkUtilisateur a confirmé via un lien
Désabonnement via PreferenceChoix du centre de préférences

Tenter de supprimer une suppression verrouillée retourne :

403 Forbidden
{
  "code": "SUPPRESSION_LOCKED",
  "message": "Cannot delete: Spam complaint - compliance requirement",
  "details": {
    "lockedReason": "Spam complaint - compliance requirement"
  }
}

Supprimer des suppressions basées sur des plaintes et renvoyer à ces adresses endommagera votre réputation d'expéditeur et peut violer les lois anti-spam. Ces suppressions sont verrouillées pour votre protection.

Sources de désabonnement

Lorsqu'un destinataire se désabonne, la source est enregistrée :

SourceValeurDescriptionVerrouillé
ListUnsubscribeHeader0En-tête List-Unsubscribe RFC 8058Non
ListUnsubscribeMail1Désabonnement par mailto:Non
WebForm2Page de désabonnement webNon
Api3Appel APINon
Admin4Panneau d'administrationNon
FeedbackLoop5Boucle de rétroaction ISPOui
OneClick6POST en un clic RFC 8058Oui
ManualLink7Utilisateur confirmé via un lienOui
Preference8Choix du centre de préférencesOui

Réponses d'erreur

StatutCodeDescription
400INVALID_REQUESTÉchec de validation (e-mail, portée ou type invalide)
400INVALID_EMAIL_FORMATFormat d'adresse e-mail invalide
400CONTENT_TOO_LARGELe fichier CSV dépasse 5 Mo
403SUPPRESSION_LOCKEDImpossible de supprimer une suppression verrouillée
404RESOURCE_NOT_FOUNDSuppression introuvable, ou un mailingListId fourni ne désigne aucune liste de diffusion de votre tenant

Prochaines étapes

  • Rebonds : comprendre les types de rebonds et la suppression automatique
  • Vue d'ensemble de la délivrabilité : surveiller la réputation de l'expéditeur
  • Événements Webhook : recevoir les événements message.bounced (suppression.added/suppression.removed sont définis dans le catalogue mais ne sont jamais émis aujourd'hui)

Sur cette page