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
| Type | Valeur | Description | Portée par défaut |
|---|---|---|---|
HardBounce | 1 | Échec de livraison permanent | Global (toujours) |
SoftBounce | 2 | Échec temporaire (suppression marketing de 30 jours, n'escalade qu'après ≥3 rebonds éligibles sur ≥7 jours) | Marketing (expiration de 30 jours) |
Complaint | 3 | Le destinataire a signalé l'e-mail comme spam | Global (toujours) |
Unsubscribe | 4 | Le destinataire s'est désabonné | Dépend du type de message |
Manual | 5 | Ajouté manuellement via l'API ou le tableau de bord | N'importe quelle portée |
Invalid | 6 | Format d'e-mail invalide | Global (toujours) |
SpamTrap | 7 | Adresse de piège à spam connue | Global (toujours) |
RoleAddress | 8 | E-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ée | Valeur | Comportement |
|---|---|---|
Global | 0 | Bloque tous les e-mails (transactionnels et marketing) |
Marketing | 1 | Bloque les e-mails marketing ; les e-mails transactionnels sont toujours livrés |
Transactional | 2 | Bloque uniquement les e-mails transactionnels (rare) |
List | 3 | Bloque les e-mails pour une liste de diffusion spécifique uniquement |
Contraintes de portée :
HardBounce,Complaint,Invalid,SpamTrap,RoleAddress→ Portée Global uniquementSoftBounce→ Portée Marketing en généralUnsubscribe→ Global, Marketing ou List (pas Transactional)Manual→ N'importe quelle portée
Lister les suppressions
GET https://api.mail.land/v1/transactional/suppressionsAuthentifiez-vous avec Authorization: Bearer <token> ou X-API-Key: <api key>.
curl https://api.mail.land/v1/transactional/suppressions \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."Paramètres de requête
| Paramètre | Type | Par défaut | Description |
|---|---|---|---|
cursor | string | - | Curseur opaque issu du nextCursor de la page précédente. À omettre pour la première page. |
limit | int | 50 | Éléments par page (max 100) |
search | string | - | Filtrer par adresse e-mail |
type | SuppressionType | - | Filtrer par type |
scope | SuppressionScope | - | Filtrer par portée |
mailingListId | string | - | L'id public de la liste de diffusion, résolu dans votre tenant. Un id inconnu, étranger ou numérique renvoie 404. |
fromDate | datetime | Il y a 90 jours | Date de début |
toDate | datetime | Maintenant | Date de fin |
sortBy | string | CreatedAt | Champ de tri |
sortDescending | bool | true | Direction du tri |
{
"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/statscurl https://api.mail.land/v1/transactional/suppressions/stats \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."{
"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=Marketingcurl "https://api.mail.land/v1/transactional/suppressions/[email protected]&messageType=Marketing" \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."| Paramètre | Type | Par défaut | Description |
|---|---|---|---|
email | string | - | Adresse e-mail (obligatoire) |
messageType | string | Marketing | Marketing ou Transactional |
mailingListId | string | - | L'id public de la liste de diffusion, résolu dans votre tenant. Un id inconnu, étranger ou numérique renvoie 404. |
{
"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-bulkcurl -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}'{
"emails": ["[email protected]", "[email protected]", "[email protected]"],
"messageType": "Marketing",
"mailingListId": null
}{
"suppressedEmails": ["[email protected]"]
}Ajouter une suppression
POST https://api.mail.land/v1/transactional/suppressionscurl -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"}'{
"email": "[email protected]",
"suppressionType": "Manual",
"scope": "Global",
"reason": "Customer requested removal from all lists",
"notes": "Ticket #4521"
}| Champ | Type | Obligatoire | Par défaut | Description |
|---|---|---|---|---|
email | string | Oui | - | Adresse e-mail (max 255 caractères) |
suppressionType | string | Non | Manual | Type de suppression |
scope | string | Non | Global | Portée de la suppression |
mailingListId | string | Non | - | 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. |
reason | string | Non | - | Raison (max 500 caractères) |
notes | string | Non | - | 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/bulkcurl -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"}]}'{
"emails": [
{ "email": "[email protected]", "suppressionType": "Manual", "scope": "Global", "reason": "Cleanup" },
{ "email": "[email protected]", "suppressionType": "Manual", "scope": "Marketing" }
]
}{
"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/importcurl -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"}'{
"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-filecurl -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ètre | Type | Description |
|---|---|---|
file | file (champ de formulaire multipart) | Fichier CSV (max 5 Mo, extension .csv requise) |
scope | string (requête) | Portée de suppression (par défaut : Global) |
mailingListId | string (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. |
{
"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/exportcurl https://api.mail.land/v1/transactional/suppressions/export \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..." \
-o suppressions.csv| Paramètre | Type | Description |
|---|---|---|
type | SuppressionType | Filtrer par type |
scope | SuppressionScope | Filtrer par portée |
mailingListId | string | L'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}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]curl -X DELETE "https://api.mail.land/v1/transactional/suppressions/[email protected]" \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."| Paramètre | Type | Description |
|---|---|---|
email | string | E-mail à désupprimer (obligatoire) |
scope | SuppressionScope | Supprimer uniquement pour cette portée |
mailingListId | string | Supprimer 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 |
|---|---|
Complaint | Plainte pour spam : obligation de conformité |
SpamTrap | Piège à spam connu : protection de la délivrabilité |
Désabonnement via FeedbackLoop | Boucle de rétroaction ISP |
Désabonnement via OneClick | Désabonnement en un clic RFC 8058 |
Désabonnement via ManualLink | Utilisateur a confirmé via un lien |
Désabonnement via Preference | Choix du centre de préférences |
Tenter de supprimer une suppression verrouillée retourne :
{
"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 :
| Source | Valeur | Description | Verrouillé |
|---|---|---|---|
ListUnsubscribeHeader | 0 | En-tête List-Unsubscribe RFC 8058 | Non |
ListUnsubscribeMail | 1 | Désabonnement par mailto: | Non |
WebForm | 2 | Page de désabonnement web | Non |
Api | 3 | Appel API | Non |
Admin | 4 | Panneau d'administration | Non |
FeedbackLoop | 5 | Boucle de rétroaction ISP | Oui |
OneClick | 6 | POST en un clic RFC 8058 | Oui |
ManualLink | 7 | Utilisateur confirmé via un lien | Oui |
Preference | 8 | Choix du centre de préférences | Oui |
Réponses d'erreur
| Statut | Code | Description |
|---|---|---|
400 | INVALID_REQUEST | Échec de validation (e-mail, portée ou type invalide) |
400 | INVALID_EMAIL_FORMAT | Format d'adresse e-mail invalide |
400 | CONTENT_TOO_LARGE | Le fichier CSV dépasse 5 Mo |
403 | SUPPRESSION_LOCKED | Impossible de supprimer une suppression verrouillée |
404 | RESOURCE_NOT_FOUND | Suppression 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.removedsont définis dans le catalogue mais ne sont jamais émis aujourd'hui)