Passer au contenu principal

Passer des anciennes routes de désabonnement à l’API v2

Les anciennes routes /unsubscribes ne fonctionneront plus à partir du 1er novembre 2026. Voici l’équivalent de chaque appel, les changements de réponse qui cassent le code existant et les nouvelles options par contact et en masse.

Les anciennes routes de l’API de désabonnement seront désactivées à partir du 1er novembre 2026. Après cette date, les appels à ces routes ne fonctionneront plus. Pour éviter toute interruption, tous les processus qui les utilisent encore (votre propre code, Zapier, Make, n8n) doivent donc passer aux routes v2 de désabonnement multicanal. Cet article présente l’équivalent de chaque ancienne route, les changements dans les réponses qui peuvent empêcher votre code de fonctionner et les nouvelles routes de désabonnement par contact et en masse.


Pourquoi ce changement ?

La fonctionnalité de désabonnement a été conçue à une époque où l’email était le seul canal disponible sur lemlist. Avec l’arrivée de nouveaux canaux, le système de désabonnement a été revu pour les prendre en charge.

Cette refonte permet aussi de désabonner un contact, tous canaux confondus. Aucune communication ne lui sera alors envoyée, y compris sur les canaux qui seront ajoutés à la plateforme par la suite.


Avant de commencer

  • Les appels aux anciennes routes ne fonctionneront plus à partir du 1er novembre 2026.

  • Les anciennes routes acceptent uniquement les adresses email et les domaines. Pour désabonner des URL LinkedIn ou des numéros de téléphone, vous devez utiliser la v2.

  • Vous ne pouvez pas réabonner une variable dont la source est lead ou abuse. Ces sources sont protégées : la requête renvoie le code 409.

  • Sur la route qui renvoie la liste, le paramètre limit accepte une valeur maximale de 100.

  • Une requête de désabonnement en masse peut contenir jusqu’à 10 000 valeurs.

Il vous faut :


Notions clés

  • Variable : une donnée de contact que vous pouvez désabonner. Quatre types sont possibles : adresse email, domaine (commençant par @), URL LinkedIn et numéro de téléphone.

  • Contact : une personne identifiée par un contactId (préfixe con_). Le désabonnement d’un contact active l’indicateur doNotContact, qui bloque tous les canaux. La route de récupération d’un contact (GET) renvoie cet indicateur dans le champ booléen unsubscribed.

  • Source : l’origine d’un désabonnement. Valeurs possibles : api, bounced, lead, user, abuse.

  • Idempotence : si vous désabonnez une variable qui l’est déjà, l’API renvoie l’enregistrement existant avec le code 200.


Partie 1 : remplacer chaque ancien appel par son équivalent v2

Ces cinq anciennes routes vont être désactivées. Remplacez chacune par son équivalent direct en v2 : l’action reste la même.

  • POST /unsubscribes/{email} → POST /v2/unsubscribes/variables/{value} (Désabonner une variable)

  • GET /unsubscribes/{email} → GET /v2/unsubscribes/variables/{value} (Récupérer une variable désabonnée)

  • GET /unsubscribes → GET /v2/unsubscribes/variables (Lister les variables désabonnées)

  • DELETE /unsubscribes/{email} → DELETE /v2/unsubscribes/variables/{value} (Réabonner une variable)

  • GET /unsubs/export → GET /v2/unsubscribes/exports/variables (Exporter les variables désabonnées)

✅ À vérifier : l’appel à la route v2 renvoie l’enregistrement avec le code 200, et l’ancienne route correspondante n’est plus appelée nulle part dans votre processus.


Partie 2 : adapter votre code aux nouvelles réponses

Ces changements peuvent empêcher votre code client de fonctionner. Vérifiez votre intégration actuelle point par point.

  • Désabonnement d’une variable (POST) : le champ email a été supprimé. Lisez value à la place. La réponse contient aussi les champs variable et source.

  • Récupération d’une variable (GET) : la réponse ne contient plus createdAt. Si la valeur est introuvable, vous obtenez 404 avec le message "Variable not found". Si la valeur est vide, vous obtenez 400 au lieu de 500.

  • Réabonnement d’une variable (DELETE) : la réponse est une simple chaîne de caractères, "Variable subscribed", et non un objet JSON. Si la valeur n’existe pas, vous obtenez 400 au lieu de 404. Si la source est protégée, vous obtenez 409.

  • Récupération de la liste (GET) : le format ne change pas. Le paramètre limit accepte désormais une valeur maximale de 100.

  • Export CSV : la colonne _id est ajoutée en première position. Les colonnes sont désormais _id, value, source, createdAt.

Une prochaine mise à jour modifiera les routes qui renvoient une simple chaîne de caractères, par exemple "Variable not found" ou "Variable subscribed". Ces routes renverront du JSON pour uniformiser l’API. Ne faites pas dépendre votre code du texte exact de la chaîne renvoyée.

✅ À vérifier : votre code ne lit pas le champ email dans une réponse POST, ne dépend pas du texte exact de la réponse DELETE et ne se base pas sur la position des colonnes de l’export.


Partie 3 : mettre à jour vos webhooks

Depuis le 30 mars 2026, le désabonnement d’un contact ne déclenche plus l’événement emailsUnsubscribed.

Abonnez-vous plutôt à entityUnsubscribed (contact, tous canaux confondus) ou à variableUnsubscribed (une seule variable).


Partie 4 : utiliser les nouveautés de la v2 (facultatif)

Vous pouvez désormais désabonner des variables en masse :

  • POST /v2/unsubscribes/variables → Désabonner des variables en masse

Vous avez aussi accès à de nouvelles routes pour gérer les désabonnements au niveau du contact, plutôt que pour un canal précis :

  • GET /v2/unsubscribes/contacts/{contactId} → Récupérer le statut d’abonnement d’un contact

  • POST /v2/unsubscribes/contacts/{contactId} → Désabonner un contact

  • DELETE /v2/unsubscribes/contacts/{contactId} → Réabonner un contact

  • GET /v2/unsubscribes/exports/contacts → Exporter les contacts désabonnés


Exemple

Un formulaire sur votre site internet permet de se désabonner. Votre script récupère l’adresse email dans la réponse pour la journaliser.

Avant : vous appeliez POST /unsubscribes/{email}, puis lisiez le champ email dans la réponse.

Après : appelez POST /v2/unsubscribes/variables/{value}, puis lisez le champ value. La réponse contient aussi variable et source. Si cette valeur est déjà désabonnée, l’API renvoie l’enregistrement existant avec le code 200 : vous n’avez donc pas besoin de vérifier son statut au préalable.

Si vous souhaitez bloquer toute communication avec cette personne sur tous les canaux, et pas seulement pour une adresse email, appelez plutôt POST /v2/unsubscribes/contacts/{contactId}. Cet appel active l’indicateur doNotContact sur le contact.


Problèmes courants et solutions

Problème : une requête GET qui fonctionnait auparavant renvoie 404 avec "Variable not found".

Cause : la valeur n’est pas désabonnée. La v2 renvoie donc un code 404, alors que votre code attendait la réponse de l’ancienne API.

Solution : traitez 404 comme l’indication que cette valeur n’est pas désabonnée, et non comme une erreur. Ne lisez plus createdAt dans cette réponse.

Problème : vous obtenez 409 lors du réabonnement d’une variable.

Cause : la variable a été désabonnée par une source protégée : lead ou abuse.

Solution : lisez le champ source avant de tenter un réabonnement, excluez les variables dont la source est protégée et gérez le code 409 sans relancer la requête.

Problème : votre appel DELETE échoue au moment de traiter la réponse.

Cause : la réponse est actuellement une simple chaîne de caractères, "Variable subscribed", et non un objet JSON. Elle passera au format JSON lors d’une prochaine mise à jour.

Solution : adaptez le traitement de la réponse pour accepter aussi bien une simple chaîne de caractères qu’un objet JSON. Ne faites jamais dépendre la logique de votre code du texte exact de la réponse. Appuyez-vous plutôt sur le code de statut : si la valeur n’existe pas, vous recevrez 400 au lieu de 404.

Problème : l’adresse email n’apparaît plus dans la réponse après un désabonnement.

Cause : le champ email a été supprimé de la réponse à la requête POST sur une variable.

Solution : lisez value à la place.


Autres cas de figure

Cette migration demande un peu de travail. Si vous avez besoin d’aide supplémentaire, contactez l’équipe support ou votre responsable de compte attitré.

Avez-vous trouvé la réponse à votre question ?