Ajouter ou mettre à jour un contact

POST /api/v1/lists/{listId}/contacts Ajoute un contact à une liste, ou complète celui qui s'y trouve déjà — l'adresse e-mail est la clé, au sein de cette liste. C'est l'endpoint qu'appelle un tunnel ou un lead magnet : contrairement à l'import en masse, il déclenche des effets de bord, si bien qu'un événement d'inscription est émis et qu'un e-mail de confirmation double opt-in part quand l'organisation en exige un.

Autorisation

Rôle dans l'organisationCet endpoint
OWNERAutorisé
ADMINAutorisé
MEMBERRefusé — 403
Une clé porte le rôle que son créateur détient dans cette organisation — jamais un rôle sur AgentsMail lui-même. Voir Clés d'API.

Paramètres de chemin

ParamètreTypeDescription
listIdstringObligatoire. La liste que rejoint le contact. Un contact appartient à une seule liste

Corps de la requête

ChampTypeObligatoireDescription
emailstringouiLa clé de l'ajout-ou-mise-à-jour, avec la liste. Doit être une adresse valide
firstNamestringnonJusqu'à 100 caractères
tagsstring[]nonNoms de tags, de 1 à 50 caractères chacun. Créés dans l'organisation s'ils n'existent pas encore
doubleOptInbooleannonChamp hérité, accepté mais ignoré. Seul le réglage d'inscription de l'organisation décide si une confirmation est requise
json
{
  "email": "ada@example.com",
  "firstName": "Ada",
  "tags": ["vip", "webinar-march"]
}

Exemple

bash
curl -X POST -H "x-api-key: $AGENTMAIL_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"email": "ada@example.com", "firstName": "Ada", "tags": ["vip"]}' \
  "https://www.agentsmail.io/api/v1/lists/$LIST_ID/contacts"

Réponse

  • 200 OK — le contact, créé ou complété. Pas 201 : la sémantique est celle d'un ajout-ou-mise-à-jour, et l'appel ne permet pas de savoir lequel des deux a eu lieu.
  • 400 Bad Request — adresse invalide, tag de plus de 50 caractères, corps mal formé ; details porte les erreurs champ par champ.
  • 401 Unauthorized — clé absente ou invalide, ou son propriétaire a quitté l'organisation.
  • 403 Forbidden — le propriétaire de la clé est member de l'organisation, pas admin.
  • 404 Not Found — liste inexistante, ou elle appartient à une autre organisation. L'API ne confirme jamais qu'un identifiant existe à un appelant qui n'y a pas droit.
  • 429 Too Many Requests — plus de 120 requêtes en une minute pour cette clé.

Champs de la réponse

ChampTypeDescription
successbooleanIndique si l'opération a réussi
data.idstringIdentifiant unique du contact
data.emailstringSon adresse — unique au sein de sa liste
data.firstNamestring | nullCe que vous savez de la personne
data.lastNamestring | nullJamais renseigné par cet endpoint ; provient d'un import ou de l'interface
data.statusstringpending, subscribed, unsubscribed, bounced, complained
data.listIdstringLa liste à laquelle il appartient
data.listobject{id, name} de cette liste
data.tagsarray{id, name} de chaque tag porté après l'appel
data.createdAtstringDate de création ISO
data.updatedAtstringDate ISO de la dernière modification

Exemple de réponse

json
{
  "success": true,
  "data": {
    "id": "4d19…",
    "email": "ada@example.com",
    "firstName": "Ada",
    "lastName": null,
    "status": "subscribed",
    "listId": "0b7c…",
    "list": {"id": "0b7c…", "name": "Newsletter"},
    "tags": [{"id": "7c2e…", "name": "vip"}],
    "createdAt": "2026-08-23T10:22:05.000Z",
    "updatedAt": "2026-08-23T10:22:05.000Z"
  }
}

Remarques

  • Un contact existant est complété, jamais réinitialisé. Son status n'est pas touché : quelqu'un qui s'est désabonné reste désabonné, quoi que porte cet appel. Remettre un contact en subscribed est un acte explicite — voir Réabonner un contact.
  • Seul le réglage de l'organisation décide du statut d'un nouveau contact. Activé : pending avec un e-mail de confirmation. Désactivé : subscribed sans e-mail de confirmation, même si doubleOptIn: true est fourni. Le booléen hérité est accepté mais ignoré.
  • lastName n'est pas accepté ici. L'ajout unitaire ne prend que firstName ; un nom complet passe par Importer des contacts en masse ou par l'interface.
  • Les tags sont ajoutés, jamais remplacés : un contact conserve les étiquettes qu'il portait déjà.
  • Une liste supprimée répond 404. Rien ne peut entrer dans une liste que vous avez supprimée — dirigez l'appel vers une liste active, ou créez-en une.

Voir aussi