Skip to main content

Listes de désinscription et de suppression

Une liste de suppression est l’ensemble des adresses auxquelles vous ne devez plus jamais envoyer de message — les personnes qui ont répondu STOP, se sont désinscrites, ont généré un bounce ou se sont plaintes. Honorer cette liste est une exigence légale sur chaque canal réglementé, et Orbit la traite comme une porte d’envoi dure : une adresse supprimée est abandonnée avant le dispatch, quel que soit la campagne, l’import de contacts ou l’appel API. Cette page explique comment fonctionne la suppression, comment importer en masse une liste de suppression existante — par exemple lors d’une migration depuis une autre plateforme — via un seul dépôt CSV, et comment exporter le registre pour un audit. Tous les endpoints ci-dessous sont enracinés sur https://api.orbit.devotel.io/api/v1/compliance.

Comment se produit la suppression

Une adresse rejoint la liste de suppression de plusieurs façons :
  • Un contact répond avec un mot-clé STOP sur SMS/WhatsApp.
  • Un contact se désinscrit via le centre de préférences.
  • Vous enregistrez une désinscription via l’API de consentement (opt_in: false).
  • Vous importez en masse une liste (cette page).
Chaque entrée possède une portée de canal. L’ensemble complet des portées est : all, sms, voice, whatsapp, email, push, telegram, messenger, rcs. La portée choisie dépend du point d’entrée :
  • L’import CSV en masse déduit la portée du type d’adresse de chaque ligne : les adresses téléphoniques et WhatsApp prennent par défaut la portée all — un signal STOP sur un numéro de téléphone supprime tous les canaux joignables sur ce numéro — tandis que les adresses e-mail sont limitées à email. Une colonne channel remplace cette valeur par ligne (voir Import CSV en masse).
  • L’API de consentement et le centre de préférences suppriment toujours avec la portée all, que l’identifiant enregistré soit un numéro de téléphone ou une adresse e-mail. Une désinscription via l’un de ces points d’entrée retire le contact de tous les canaux.
Quelle que soit la façon dont un numéro de téléphone est supprimé, les portes voix et composeur l’honorent : un numéro qui se désinscrit sur n’importe quel canal cesse de recevoir des appels aussi bien que des messages. Le mécanisme diffère selon le point d’entrée. Un import CSV en masse duplique en outre les lignes téléphoniques vers la liste DNC et marque les contacts correspondants. Une désinscription par mot-clé STOP, par le centre de préférences ou par l’API de consentement est au contraire enregistrée avec la portée all, que les portes voix et composeur lisent directement depuis la liste de suppression — l’appel reste bloqué, mais aucune ligne DNC ni marque de contact séparée n’est écrite.

Import CSV en masse

POST /compliance/suppression-list/import accepte un dépôt multipart/form-data d’un fichier CSV. Il exige une clé admin ou owner et est limité à 5 requêtes/minute.

Champs du formulaire

Format du CSV

La première ligne est un en-tête. Les noms de colonnes sont insensibles à la casse et indépendants de la position, et des alias courants sont acceptés : Chaque ligne doit contenir au moins l’un de phone / email / wa_id. Une même ligne peut porter plusieurs types d’adresses — chacun produit sa propre entrée de suppression. Exemple :
Si une colonne channel est présente, elle remplace la portée par défaut pour cette ligne et doit être l’une des valeurs de portée listées ci-dessus.

Résultats par ligne

La réponse rapporte les résultats par ligne. Les lignes acceptées sont écrites ; les autres sont classifiées, jamais abandonnées silencieusement.
Les deux compteurs de doublons sont rapportés séparément et à dessein : intra_file_duplicates sont des répétitions à l’intérieur du fichier que vous venez de déposer, tandis que duplicates étaient déjà sur votre liste auparavant. Aucun des deux n’est une erreur, et aucun n’est absorbé silencieusement — les deux sont comptés pour que votre rapprochement soit exact.

Raisons de validation

Chaque entrée errors[] porte une reason lisible et la raw_line source pour que vous puissiez corriger et redéposer :

Limites

Au-delà de 100 000 lignes, découpez le fichier et importez par lots — la détection des doublons rend sûre la ré-importation de plages qui se chevauchent.

En cas d’échec de l’import

Diagnostiquez les échecs à deux niveaux : rejets au niveau HTTP (rien n’est écrit) et classifications au niveau ligne (le fichier est accepté mais certaines lignes ne le sont pas). Rejets au niveau HTTP : Les classifications au niveau ligne (les entrées errors[] qui accompagnent un import réussi) correspondent aux causes suivantes : Seules les 100 premières entrées errors[] sont renvoyées avec le détail complet — le compteur invalid reflète toujours le total réel. L’assistant du tableau de bord (ci-dessous) empaquette les lignes signalées dans un skipped.csv téléchargeable pour que vous puissiez corriger et réimporter uniquement les échecs.

Import depuis le tableau de bord

Le même endpoint est enveloppé par un assistant guidé dans Settings → Compliance → Opt-out lists → Import suppression list — le même contrat CSV, sans terminal.
  1. Choose CSV file — choisissez un .csv de moins de 25 Mo. Utilisez Download sample CSV dans la boîte de dialogue pour un fichier de départ préformaté.
  2. Set defaults (optional) — un Default country (ISO alpha-2) pour normaliser les numéros au format national, et un Reason en texte libre apposé sur chaque ligne acceptée.
  3. Preview — exécute l’import en dry run côté serveur : rien n’est écrit, et la boîte de dialogue affiche la répartition acceptées / déjà listées / répétées dans le fichier / invalides avant que vous ne validiez.
  4. Confirm import — effectue l’écriture définitive. Si des lignes étaient invalides, téléchargez skipped.csv pour les corriger et les réimporter.
L’assistant applique aussi les vérifications de type de fichier et de 25 Mo côté client, pour qu’un export mal nommé échoue avant même d’atteindre l’API.

Exporter la liste de suppression

GET /compliance/suppression-list/export télécharge le registre de suppression — le pendant symétrique de l’import ci-dessus. Utilisez-le pour prouver à un régulateur ou à un auditeur quelles adresses étaient supprimées à un instant donné, y compris les numéros importés en masse sans contact correspondant.
Paramètres de requête : Chaque ligne porte suppression_id, channel, address, le status dérivé (active ou revoked), reason, source, contact_id (vide pour les adresses importées en masse sans contact), notes, ainsi que les horodatages suppressed_at / revoked_at / created_at. L’accès est restreint aux clés owner et admin, et chaque exécution d’export est inscrite au journal d’audit. Lorsque le registre dépasse 50 000 lignes, la réponse CSV porte un en-tête X-Export-Truncated: true (l’équivalent JSON définit truncated: true) — filtrez par canal ou exportez des fenêtres de dates consécutives pour capturer la fin.

Vérifier qu’une suppression a pris effet

Faire confiance mais vérifier : après un import (ou toute désinscription), confirmez que la porte d’envoi bloque effectivement l’adresse avant de confier la liste à une campagne.
  1. Envoyez un message de test à l’adresse supprimée. Un envoi API direct vers un destinataire supprimé échoue de façon synchrone avec HTTP 422 et le code d’erreur RECIPIENT_OPTED_OUT. En mode sandbox, aucun opérateur n’est touché et aucun solde n’est débité ; tout destinataire se terminant par 8 se résout aussi vers l’accusé de livraison simulé blocked, qui est la vue côté opérateur de la même barrière.
    Un envoi de campagne vers la même adresse se comporte différemment par conception : le destinataire est ignoré silencieusement (status: "skipped", reason: "opted_out") pour que le lot continue — consultez le rapport par destinataire de la campagne plutôt que d’attendre une erreur.
  2. Confirmez que l’entrée figure dans le registre. Exportez avec la requête ci-dessus (status=active est la valeur par défaut) et vérifiez que l’adresse apparaît avec la portée channel attendue. L’export est la source de vérité que chaque porte d’envoi lit — si la ligne y est active, la barrière est levée.
Les deux vérifications répondent à des questions différentes : l’étape 1 prouve l’application (la porte se déclenche), l’étape 2 prouve la portée (l’entrée existe avec le canal voulu).

Levée d’une suppression (ré-opt-in)

Pour rétablir une adresse, enregistrez un nouvel opt-in via l’API de consentement (opt_in: true). Cela révoque l’entrée de suppression correspondante et lève la barrière STOP. Ne re-messagez jamais un contact précédemment supprimé sans un événement de consentement nouveau et documenté. Confirmation que la barrière est levée. Exportez avec status=revoked et trouvez l’adresse : la ligne reste présente pour l’audit avec status: revoked et un horodatage revoked_at — l’historique de suppression n’est jamais supprimé, seulement révoqué. Envoyez ensuite un petit message de test à l’adresse comme dans Vérifier qu’une suppression a pris effet : une soumission réussie (pas de RECIPIENT_OPTED_OUT) confirme que la porte ne se déclenche plus sur l’historique révoqué. Tant que les deux vérifications ne passent pas, traitez l’adresse comme encore bloquée.

Références associées

  • Consent Management — enregistrer et consulter le consentement par canal.
  • Send Gates — heures de silence, DNC, RND, RMD, arrêt d’urgence et centre de préférences.
  • DSAR — comment les requêtes delete / opt_out aboutissent à la suppression.
  • API Reference → Opt-outs — schémas des endpoints de désinscription et de suppression.