MailLandDocs
Marketing

Abonnés

Gérez vos contacts abonnés, importez des listes et suivez l'engagement

Gérez vos contacts abonnés par e-mail. Chaque abonné possède un profil avec suivi de l'engagement, champs personnalisés et gestion des statuts.

Statuts des abonnés

StatutValeurDescription
Active0Abonné et recevant des e-mails
Unsubscribed1Désinscrit des e-mails
Bounced2Rebond permanent enregistré
Complained3A signalé un spam
Pending4Réservé : MailLand n'a pas de flux de double opt-in, donc rien ne définit jamais ce statut

optInMethod et les champs consent* d'un abonné sont enregistrés uniquement comme preuve : ils ne pilotent aucun workflow de confirmation.

Créer un abonné

POST https://api.mail.land/v1/marketing/subscribers
Create subscriber request
{
  "email": "[email protected]",
  "firstName": "John",
  "lastName": "Doe",
  "phone": "+1234567890",
  "company": "Acme Corp",
  "mailingListId": "ddv6ou6kz4wbto",
  "source": "api",
  "birthday": "1990-05-14",
  "customFields": {
    "plan": "enterprise",
    "region": "us-west"
  }
}
ChampTypeRequisDescription
emailstringOuiAdresse e-mail
firstNamestringNonPrénom
lastNamestringNonNom de famille
phonestringNonNuméro de téléphone
companystringNonNom de l'entreprise
mailingListIdstringNonListe de diffusion à rejoindre
sourcestringNonSource de l'abonnement (p. ex. api, form, import)
birthdaystringNonYYYY-MM-DD. Lu par le déclencheur d'automatisation DateBased
customFieldsobjectNonChamps personnalisés clé-valeur
Create a subscriber
curl -X POST https://api.mail.land/v1/marketing/subscribers \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..." \
  -H "Content-Type: application/json" \
  -d '{
    "email": "[email protected]",
    "firstName": "John",
    "lastName": "Doe",
    "mailingListId": "ddv6ou6kz4wbto",
    "source": "api"
  }'

Réponse

Subscriber response
{
  "id": "exz31qoqlf01sj",
  "email": "[email protected]",
  "firstName": "John",
  "lastName": "Doe",
  "phone": "+1234567890",
  "company": "Acme Corp",
  "status": "active",
  "statusName": "Active",
  "source": "api",
  "mailingListId": "ddv6ou6kz4wbto",
  "mailingListName": "Product Updates",
  "customFields": {
    "plan": "enterprise",
    "region": "us-west"
  },
  "subscribedAt": "2026-02-17T12:00:00Z",
  "unsubscribedAt": null,
  "createdAt": "2026-02-17T12:00:00Z",
  "updatedAt": "2026-02-17T12:00:00Z"
}

Lister les abonnés

GET https://api.mail.land/v1/marketing/subscribers
ParamètreTypeDéfautDescription
cursorstring-Curseur opaque issu du nextCursor de la page précédente. À omettre pour la première page.
limitint20Éléments par page
searchstring-Recherche par e-mail ou nom (pas par entreprise)
mailingListIdstring-Filtrer par liste de diffusion
statusint-Filtrer par statut d'abonné
sortBystring-Champ de tri
sortDescboolfalseTri décroissant
List subscribers
curl "https://api.mail.land/v1/marketing/subscribers?limit=20&mailingListId=ddv6ou6kz4wbto" \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."

Obtenir les détails d'un abonné

GET https://api.mail.land/v1/marketing/subscribers/{id}

Retourne un profil étendu avec les métriques d'engagement :

Get subscriber details
curl https://api.mail.land/v1/marketing/subscribers/exz31qoqlf01sj \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."
Subscriber detail response
{
  "id": "exz31qoqlf01sj",
  "email": "[email protected]",
  "firstName": "John",
  "lastName": "Doe",
  "phone": "+1234567890",
  "company": "Acme Corp",
  "status": "active",
  "source": "api",
  "mailingListId": "ddv6ou6kz4wbto",
  "mailingListName": "Product Updates",
  "customFields": { "plan": "enterprise" },
  "birthday": "1990-05-14",
  "emailsSent": 50,
  "emailsOpened": 25,
  "emailsClicked": 10,
  "lastEmailSentAt": "2026-02-17T09:30:00Z",
  "lastEmailOpenedAt": "2026-02-16T15:20:00Z",
  "lastEmailClickedAt": "2026-02-15T11:10:00Z",
  "openRate": 50.0,
  "clickRate": 40.0,
  "subscribedAt": "2026-01-15T08:00:00Z",
  "createdAt": "2026-01-15T08:00:00Z",
  "updatedAt": "2026-02-17T12:00:00Z"
}

Mettre à jour un abonné

PUT https://api.mail.land/v1/marketing/subscribers/{id}
Update subscriber request
{
  "firstName": "Jane",
  "lastName": "Smith",
  "phone": "+1234567890",
  "company": "TechCorp",
  "mailingListId": "ddv6ou6kz4wbto",
  "customFields": { "plan": "pro" },
  "birthday": "1990-05-14",
  "status": "Active"
}

PUT remplace tout le profil, il ne fusionne pas. firstName, lastName, phone, company et mailingListId sont tous écrasés par null (ou suppression de liste) lorsqu'ils sont omis, et non laissés inchangés. Omettre mailingListId supprime l'appartenance à la liste de l'abonné. Envoyez chaque champ que vous souhaitez conserver, y compris mailingListId. Seuls customFields et status restent inchangés lorsqu'ils sont omis. birthday suit sa propre règle : omettre le champ le laisse inchangé, envoyer "birthday": null l'efface, et une valeur YYYY-MM-DD le définit, une chaîne vide ("") est refusée avec 400. Si le destinataire a déjà un contact sans liste, l'appartenance supprimée est conservée uniquement comme historique : elle n'apparaît plus dans les contacts, et ses désinscriptions, ses preuves de consentement et son historique de campagnes sont préservés.

Update a subscriber
curl -X PUT https://api.mail.land/v1/marketing/subscribers/exz31qoqlf01sj \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..." \
  -H "Content-Type: application/json" \
  -d '{
    "firstName": "Jane",
    "lastName": "Smith",
    "company": "TechCorp",
    "mailingListId": "ddv6ou6kz4wbto",
    "customFields": { "plan": "pro" },
    "status": "Active"
  }'

Désinscrire un abonné

POST https://api.mail.land/v1/marketing/subscribers/{id}/unsubscribe

Enregistre une désinscription limitée à la liste de l'abonné, ou à tous les envois marketing si l'abonné n'a pas de liste, et définit le statut de l'abonné sur Unsubscribed avec un horodatage unsubscribedAt. Les e-mails transactionnels ne sont pas affectés par cet appel.

Unsubscribe a subscriber
curl -X POST https://api.mail.land/v1/marketing/subscribers/exz31qoqlf01sj/unsubscribe \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."

Supprimer un abonné

DELETE https://api.mail.land/v1/marketing/subscribers/{id}

Supprime définitivement l'abonné et ses données d'engagement. Les désinscriptions et suppressions sont conservées, donc réajouter la même adresse ne la réabonne pas.

Delete a subscriber
curl -X DELETE https://api.mail.land/v1/marketing/subscribers/exz31qoqlf01sj \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."

Importer des abonnés

POST https://api.mail.land/v1/marketing/subscribers/import

Importez des abonnés à partir d'un contenu CSV :

Import request
{
  "mailingListId": "ddv6ou6kz4wbto",
  "csvContent": "email,firstName,lastName\n[email protected],John,Doe\n[email protected],Jane,Smith",
  "source": "csv_import",
  "updateExisting": true
}
ChampTypeRequisDescription
mailingListIdstringNonListe de diffusion cible
csvContentstringOuiDonnées CSV : voir l'avertissement de format ci-dessous, la ligne d'en-tête n'est pas utilisée comme en-tête

La première ligne est traitée comme un en-tête et ignorée, quel que soit son contenu : elle n'est jamais lue pour mapper les colonnes 1 à 3 aux champs. Les colonnes sont positionnelles : la colonne 1 est toujours email, la colonne 2 toujours firstName, la colonne 3 toujours lastName ; toute autre colonne est ignorée, sauf une intitulée birthday (insensible à la casse, à n'importe quelle position après la colonne 1), qui est lue par le nom de son en-tête et non par sa position. Sa valeur doit être au format YYYY-MM-DD ; une valeur invalide est signalée par ligne dans errors et ce contact est quand même importé, simplement sans anniversaire. Un fichier sans en-tête birthday se comporte exactement comme avant. Les valeurs sont séparées par de simples virgules, donc une valeur contenant une virgule entre guillemets n'est pas prise en charge et sera divisée incorrectement. La réponse ajoute également les compteurs importedNewMembershipForExistingRecipient, updatedMembership, alreadyMember, suppressed et skippedDuplicateInFile en plus de ce qui est montré ci-dessous.

| source | string | Non | Libellé de la source d'import | | updateExisting | bool | Non | Mettre à jour les abonnés existants (défaut : false) |

Import subscribers
curl -X POST https://api.mail.land/v1/marketing/subscribers/import \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..." \
  -H "Content-Type: application/json" \
  -d '{
    "mailingListId": "ddv6ou6kz4wbto",
    "csvContent": "email,firstName,lastName\[email protected],John,Doe\[email protected],Jane,Smith",
    "source": "csv_import",
    "updateExisting": true
  }'
Import response
{
  "imported": 50,
  "updated": 10,
  "skipped": 5,
  "errors": [
    "Invalid email: not-an-email",
    "Could not resolve a recipient identity for: [email protected]"
  ]
}

Les abonnés importés déclenchent l'automatisation SubscriberJoins, pour chaque appartenance que l'import valide réellement : de la même façon qu'une création individuelle via POST /v1/marketing/subscribers. Un contact déjà présent sur la liste cible, un doublon au sein du fichier, ou une ligne perdue à cause d'un conflit (TenantId, Email) n'est pas inscrit. Si la liste cible a une automatisation SubscriberJoins active (ou que le tenant en a une non liée à une liste), importer un fichier de nouveaux contacts envoie désormais cette automatisation à chacun d'eux, dimensionnez l'import en conséquence. La suppression reste appliquée : l'inscription ne contourne jamais un destinataire supprimé.

Exporter les abonnés

GET https://api.mail.land/v1/marketing/subscribers/export
ParamètreTypeDescription
mailingListIdstringFiltrer par liste de diffusion
statusintFiltrer par statut

Retourne un téléchargement de fichier CSV avec le nom subscribers_yyyyMMdd_HHmmss.csv.

Export subscribers
curl "https://api.mail.land/v1/marketing/subscribers/export?mailingListId=ddv6ou6kz4wbto" \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..." \
  -o subscribers_export.csv

Statistiques des abonnés

GET https://api.mail.land/v1/marketing/subscribers/stats
ParamètreTypeDescription
mailingListIdstringFiltrer par liste de diffusion
Get subscriber stats
curl "https://api.mail.land/v1/marketing/subscribers/stats?mailingListId=ddv6ou6kz4wbto" \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."
Subscriber stats response
{
  "total": 1500,
  "active": 1200,
  "unsubscribed": 200,
  "bounced": 80,
  "complained": 10,
  "pending": 10
}

Nombre d'abonnés

GET https://api.mail.land/v1/marketing/subscribers/count
ParamètreTypeDescription
mailingListIdstringFiltrer par liste de diffusion
Get subscriber count
curl "https://api.mail.land/v1/marketing/subscribers/count?mailingListId=ddv6ou6kz4wbto" \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."
Count response
{
  "count": 1500,
  "mailingListId": "ddv6ou6kz4wbto"
}

Croissance des abonnés

GET https://api.mail.land/v1/marketing/subscribers/growth
ParamètreTypeDéfautDescription
daysint30Période d'analyse (max 90)
mailingListIdstring-Filtrer par liste de diffusion
Get subscriber growth
curl "https://api.mail.land/v1/marketing/subscribers/growth?days=30&mailingListId=ddv6ou6kz4wbto" \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."
Growth response
{
  "dataPoints": [
    {
      "date": "2026-02-17",
      "newSubscribers": 50,
      "unsubscribes": 5,
      "cumulativeTotal": 1500
    }
  ],
  "totalNew": 500,
  "totalUnsubscribes": 50,
  "netGrowth": 450,
  "currentTotal": 1500
}

Réponses d'erreur

StatutCodeDescription
400INVALID_EMAIL_FORMATFormat d'e-mail invalide
400INVALID_REQUESTL'adresse e-mail de l'abonné existe déjà
403FORBIDDENPermissions insuffisantes
404RESOURCE_NOT_FOUNDAbonné introuvable

Étapes suivantes

  • Listes : organisez vos abonnés en listes de diffusion
  • Segments : créez des segments dynamiques basés sur les données des abonnés
  • Campagnes : envoyez des campagnes à vos abonnés

Sur cette page