Añadir o actualizar un contacto

POST /api/v1/lists/{listId}/contacts Añade un contacto a una lista, o completa el que ya está: la dirección de email es la clave, dentro de esa lista. Este es el endpoint al que llama un embudo o un lead magnet: a diferencia de la importación en bloque, produce efectos secundarios, así que se dispara un evento de inscripción y sale una confirmación de doble opt-in cuando la organización la exige.

Autorización

Rol en la organizaciónEste endpoint
OWNERPermitido
ADMINPermitido
MEMBERRechazado — 403
Una clave lleva el rol que su creador tiene en esta organización, nunca un rol sobre AgentsMail en sí. Consulta Claves de API.

Parámetros de ruta

ParámetroTipoDescripción
listIdstringObligatorio. La lista a la que se une el contacto. Un contacto pertenece exactamente a una

Cuerpo de la solicitud

CampoTipoObligatorioDescripción
emailstringsíLa clave de la inserción o actualización, junto con la lista. Debe ser una dirección válida
firstNamestringnoHasta 100 caracteres
tagsstring[]noNombres de etiquetas, de 1 a 50 caracteres cada uno. Se crean en la organización si todavía no existen
doubleOptInbooleannoCampo heredado, aceptado pero ignorado. Solo el ajuste de suscripción de la organización decide si se exige confirmación
json
{
  "email": "ada@example.com",
  "firstName": "Ada",
  "tags": ["vip", "webinar-march"]
}

Ejemplo

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"

Respuesta

  • 200 OK: el contacto, creado o completado. No 201: la semántica es la de un upsert, y la llamada no te permite saber cuál de los dos casos ocurrió.
  • 400 Bad Request: dirección no válida, una etiqueta de más de 50 caracteres, un cuerpo mal formado; details lleva los problemas por campo.
  • 401 Unauthorized: clave ausente o no válida, o su propietario salió de la organización.
  • 403 Forbidden: el propietario de la clave es member de la organización, no admin.
  • 404 Not Found: no existe esa lista, o pertenece a otra organización. La API nunca confirma que un id existe a un llamante que no tiene derecho sobre él.
  • 429 Too Many Requests: más de 120 solicitudes en un minuto para esta clave.

Campos de la respuesta

CampoTipoDescripción
successbooleanIndica si la operación se realizó correctamente
data.idstringIdentificador único del contacto
data.emailstringSu dirección: única dentro de su lista
data.firstNamestring | nullLo que sabes de la persona
data.lastNamestring | nullEste endpoint nunca lo establece; viene de una importación o de la interfaz
data.statusstringpending, subscribed, unsubscribed, bounced, complained
data.listIdstringLa lista a la que pertenece
data.listobject{id, name} de esa lista
data.tagsarray{id, name} de cada etiqueta que lleva después de la llamada
data.createdAtstringFecha de creación ISO
data.updatedAtstringFecha ISO del último cambio

Ejemplo de respuesta

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"
  }
}

Notas

  • Un contacto existente se completa, nunca se reinicia. Su status no se toca: alguien que se dio de baja sigue dado de baja, lleve lo que lleve esta llamada. Devolver un contacto a subscribed es un acto explícito; consulta Volver a suscribir un contacto.
  • Solo el ajuste de la organización decide el estado de un contacto nuevo. Activado: pending con un email de confirmación. Desactivado: subscribed sin email de confirmación, aunque se envíe doubleOptIn: true. El booleano heredado se acepta pero se ignora.
  • lastName no se acepta aquí. El upsert individual solo recibe firstName; un nombre completo entra por Importar contactos en bloque o por la interfaz.
  • Las etiquetas se añaden, nunca se reemplazan: un contacto conserva las etiquetas que ya llevaba.
  • Una lista eliminada responde 404. Nada puede entrar en una lista que eliminaste: dirige la llamada a una lista activa, o crea una.

Relacionado