Contactos
Gestiona los perfiles de contacto y los campos personalizados, de forma masiva o de uno en uno.
Crear un contacto
Crea un contacto y, opcionalmente, lo suscribe a listas de contactos.
/contactsRequiere una clave de API full. Las direcciones de email son únicas en cada espacio de trabajo y se guardan en minúsculas; si creas un contacto que ya existe, la petición devuelve 409 con el contacto en existing. Dispara contact.created y, por cada lista, subscriber.created. Consulta Contactos.
Parámetros del cuerpo
emailstringobligatoriofirst_namestringlast_namestringcustom_fieldsobjectLos valores por clave de campo personalizado, como {"company": "Analytical Engines"}. Los valores de los campos de fecha deben tener el formato YYYY-MM-DD. Las claves que no coinciden con ningún campo personalizado se guardan tal cual.
audiencesstring[]aud_…) a las que se suscribe el contacto. Los ID que no existen en el espacio de trabajo se omiten.unsubscribedbooleanpor defecto: falsetrue para crear el contacto como dado de baja. Las campañas omiten a los contactos dados de baja, y sus pertenencias a listas empiezan como dadas de baja.
Devuelve
Devuelve 201 con el objeto de contacto. Aquí, audiences enumera cada lista con su id, su name y su estado subscribed. Para ver todos los campos, consulta Obtener un contacto.
Devuelve 422 con usage si una lista ha alcanzado el límite de suscriptores de tu plan. En ese caso, no se crea ningún contacto.
{
"object": "contact",
"id": "con_4K9kQdrXth7am0TPKvPrR5yd2oo",
"email": "ada@example.com",
"first_name": "Ada",
"last_name": "Lovelace",
"custom_fields": {
"company": "Analytical Engines",
"plan": "pro"
},
"unsubscribed": false,
"audiences": [
{
"id": "aud_4KbFmQPy1feMCGAY8F8pAhiZ1u2",
"name": "Newsletter",
"subscribed": true
}
],
"created_at": "2026-10-01T10:20:31.704113Z",
"updated_at": "2026-10-01T10:20:31.704113Z"
}{
"error": "Custom field \"Birthday\" must be a date in YYYY-MM-DD format"
}{
"error": "Contact with this email already exists",
"existing": {
"object": "contact",
"id": "con_4K9kQdrXth7am0TPKvPrR5yd2oo",
"email": "ada@example.com",
"first_name": "Ada",
"last_name": "Lovelace",
"custom_fields": {
"company": "Analytical Engines",
"plan": "pro"
},
"unsubscribed": false,
"audiences": [
{
"id": "aud_4KbFmQPy1feMCGAY8F8pAhiZ1u2",
"name": "Newsletter",
"subscribed": true
}
],
"created_at": "2026-10-01T10:20:31.704113Z",
"updated_at": "2026-10-01T10:20:31.704113Z"
}
}{
"error": "Pro includes 50,000 subscribers per audience.",
"usage": {
"used": 50000,
"limit": 50000,
"plan": "pro"
}
}Obtener un contacto
Obtiene un contacto con sus campos personalizados y sus pertenencias a listas.
/contacts/{id}Requiere una clave de API full.
Parámetros de ruta
idstringobligatoriocon_…) o su dirección de email, codificada para URL.Devuelve
Devuelve el objeto de contacto.
objectstringcontact.idstringemailstringfirst_namestring | nulllast_namestring | nullcustom_fieldsobject{} si no hay ninguno.unsubscribedbooleantrue si el contacto se ha dado de baja de todas las campañas.audiencesobject[]Las listas a las que pertenece el contacto, cada una con id, name y un objeto subscriber: id (sub_…), subscribed, subscribed_at, unsubscribed_at, created_at y updated_at.
created_atstringupdated_atstring{
"object": "contact",
"id": "con_4K9kQdrXth7am0TPKvPrR5yd2oo",
"email": "ada@example.com",
"first_name": "Ada",
"last_name": "Lovelace",
"custom_fields": {
"company": "Analytical Engines",
"plan": "pro"
},
"unsubscribed": false,
"audiences": [
{
"id": "aud_4KbFmQPy1feMCGAY8F8pAhiZ1u2",
"name": "Newsletter",
"subscriber": {
"id": "sub_4KECYl5AwXEy8ezswYRhuddttxo",
"subscribed": true,
"subscribed_at": "2026-10-01T10:20:31.000000Z",
"unsubscribed_at": null,
"created_at": "2026-10-01T10:20:31.000000Z",
"updated_at": "2026-10-01T10:20:31.000000Z"
}
}
],
"created_at": "2026-10-01T10:20:31.000000Z",
"updated_at": "2026-10-01T10:20:31.000000Z"
}{
"error": "Contact not found"
}Actualizar un contacto
Actualiza un contacto. Solo cambian los campos que envíes.
/contacts/{id}Requiere una clave de API full. Dispara contact.updated, con los valores anteriores de los campos modificados en previous. Cambiar audiences también dispara subscriber.created y subscriber.deleted por las pertenencias que añade y elimina.
Parámetros de ruta
idstringobligatoriocon_…) o su dirección de email, codificada para URL.Parámetros del cuerpo
emailstringfirst_namestringlast_namestringcustom_fieldsobjectunsubscribedbooleantrue para dar de baja al contacto de todas las campañas, false para volver a suscribirlo. Las pertenencias a listas existentes conservan su propio estado.audiencesstring[]La lista completa de ID de las listas de contactos a las que debe pertenecer el contacto. El contacto se añade a las listas en las que aún no está y se quita de las que no están en tu lista. Envía [] para quitarlo de todas las listas. Para añadirlo a una lista o quitarlo de ella sin enumerar todas, usa Añadir un suscriptor o Eliminar un suscriptor.
Devuelve
Devuelve el contacto actualizado en el mismo formato que Obtener un contacto. Una petición sin ninguno de estos campos devuelve 400.
curl -X POST https://api.emailit.com/v2/contacts/ada%40example.com \
-H "Authorization: Bearer $EMAILIT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"custom_fields": { "company": "Analytical Engines", "plan": "business" },
"audiences": ["aud_4KbFmQPy1feMCGAY8F8pAhiZ1u2", "aud_4KOlh9t2uw5od4qypqCtyrZyDq2"]
}'{
"object": "contact",
"id": "con_4K9kQdrXth7am0TPKvPrR5yd2oo",
"email": "ada@example.com",
"first_name": "Augusta",
"last_name": "Lovelace",
"custom_fields": {
"company": "Analytical Engines",
"plan": "pro"
},
"unsubscribed": false,
"audiences": [
{
"id": "aud_4KbFmQPy1feMCGAY8F8pAhiZ1u2",
"name": "Newsletter",
"subscriber": {
"id": "sub_4KECYl5AwXEy8ezswYRhuddttxo",
"subscribed": true,
"subscribed_at": "2026-10-01T10:20:31.000000Z",
"unsubscribed_at": null,
"created_at": "2026-10-01T10:20:31.000000Z",
"updated_at": "2026-10-01T10:20:31.000000Z"
}
}
],
"created_at": "2026-10-01T10:20:31.000000Z",
"updated_at": "2026-10-02T09:03:17.000000Z"
}{
"error": "No valid fields provided for update. Provide at least one of: email, first_name, last_name, custom_fields, unsubscribed, audiences"
}{
"error": "Contact not found"
}{
"error": "Another contact with this email already exists"
}Listar contactos
Devuelve una página de contactos, del más reciente al más antiguo.
/contactsRequiere una clave de API full. Usa los mismos parámetros con Exportar contactos para descargar en un archivo todos los contactos que coincidan.
Parámetros de consulta
pageintegerpor defecto: 1limitintegerpor defecto: 10searchstringq.audience_idstringaud_…).unsubscribedbooleantrue o false. Solo los contactos con este estado de baja.sortstringpor defecto: created_atemail, first_name, last_name, name, audiences, created_at o updated_at.orderstringpor defecto: descasc o desc. En este endpoint, order es la dirección de la ordenación, no la clave por la que se ordena.matchstringpor defecto: allall u or. Cómo se combinan los filtros de abajo.Filtros
Añade filtros con el formato key.condition=value, por ejemplo email.ends_with=@acme.com o custom_fields.plan.exact=pro. Consulta Filtrado.
| Clave | Tipo | Notas |
|---|---|---|
email |
cadena | |
first_name |
cadena | |
last_name |
cadena | |
name |
cadena | El nombre y los apellidos unidos con un espacio. |
audiences |
cadena | El primer nombre de lista del contacto por orden alfabético. |
unsubscribed |
booleano | |
created_at |
fecha | |
updated_at |
fecha | |
audience_id |
cadena | Solo exact y not_exact. El valor es un ID de lista. |
custom_fields.<key> |
cadena | Sustituye <key> por la clave de un campo personalizado. Los valores se comparan como texto. |
Los parámetros antiguos filter[audience_id], filter[unsubscribed] y filter[custom_fields][<key>] siguen funcionando.
Devuelve
dataobject[]audiences en forma de id, name y subscribed. Consulta Obtener un contacto.total_recordsintegernext_page_urlstring | nullnull. Consulta Paginación.previous_page_urlstring | nullnull.curl -G https://api.emailit.com/v2/contacts \
-H "Authorization: Bearer $EMAILIT_API_KEY" \
--data-urlencode "audience_id=aud_4KbFmQPy1feMCGAY8F8pAhiZ1u2" \
--data-urlencode "custom_fields.plan.exact=pro" \
--data-urlencode "sort=email" \
--data-urlencode "order=asc" \
--data-urlencode "limit=100"{
"data": [
{
"object": "contact",
"id": "con_4K9kQdrXth7am0TPKvPrR5yd2oo",
"email": "ada@example.com",
"first_name": "Ada",
"last_name": "Lovelace",
"custom_fields": {
"company": "Analytical Engines",
"plan": "pro"
},
"unsubscribed": false,
"audiences": [
{
"id": "aud_4KbFmQPy1feMCGAY8F8pAhiZ1u2",
"name": "Newsletter",
"subscribed": true
}
],
"created_at": "2026-10-01T10:20:31.704113Z",
"updated_at": "2026-10-01T10:20:31.704113Z"
},
{
"object": "contact",
"id": "con_4KiXIs4xLTcJIAHnKJaLcnMZYh7",
"email": "grace@example.com",
"first_name": "Grace",
"last_name": "Hopper",
"custom_fields": {},
"unsubscribed": true,
"audiences": [],
"created_at": "2026-09-28T07:55:02.118342Z",
"updated_at": "2026-09-30T18:11:40.902215Z"
}
],
"total_records": 2,
"next_page_url": null,
"previous_page_url": null
}Actualizar contactos de forma masiva
Ejecuta una acción sobre hasta 100 contactos en una sola petición.
/contacts/bulkRequiere una clave de API full. Todos los ID deben pertenecer a contactos del espacio de trabajo; si no, no se cambia nada y la respuesta enumera en missing los ID que no existen. Cada contacto dispara los mismos eventos que los endpoints de un solo contacto. Si la lista alcanza el límite de suscriptores de tu plan durante add_to_audience, la petición se detiene con 422, y los contactos procesados hasta ese momento siguen añadidos.
| Acción | Qué hace |
|---|---|
delete |
Elimina los contactos y sus pertenencias a listas, como Eliminar un contacto. |
add_to_audience |
Añade los contactos a audience_id. Los contactos que ya están en ella no se modifican. |
remove_from_audience |
Quita los contactos de audience_id. |
unsubscribe |
Establece unsubscribed en true, de modo que las campañas omiten a esos contactos. |
resubscribe |
Establece unsubscribed en false. |
Parámetros del cuerpo
actionstringobligatoriodelete, add_to_audience, remove_from_audience, unsubscribe o resubscribe.idsstring[]obligatoriocon_…), de 1 a 100. Aquí no se aceptan direcciones de email. Los duplicados se ignoran.audience_idstringadd_to_audience y remove_from_audience.Devuelve
objectstringcontact_bulk.actionstringprocessedintegeridsstring[]{
"object": "contact_bulk",
"action": "add_to_audience",
"processed": 2,
"ids": ["con_4K9kQdrXth7am0TPKvPrR5yd2oo", "con_4KiXIs4xLTcJIAHnKJaLcnMZYh7"]
}{
"error": "A maximum of 100 contacts can be updated per request"
}{
"error": "One or more contacts were not found",
"missing": ["con_4K3pZc1Q9nWm2LrT8vYb5Hd0XaE"]
}{
"error": "Pro includes 50,000 subscribers per audience.",
"usage": {
"used": 50000,
"limit": 50000,
"plan": "pro"
}
}Exportar contactos
Descarga los contactos que coinciden en un archivo CSV o XLSX.
/contacts/exportRequiere una clave de API full. Acepta los mismos parámetros de búsqueda, filtrado y ordenación que Listar contactos, en la cadena de consulta y sin paginación. POST /contacts/export funciona igual. Una exportación puede incluir hasta 10.000 contactos; si coinciden más, la petición devuelve 422, así que acota los filtros.
Parámetros de consulta
formatstringpor defecto: csvcsv o xlsx.search, audience_id, unsubscribed, sort, order, match, key.conditionstringDevuelve
Devuelve el archivo como adjunto: contacts.csv (text/csv; charset=utf-8) o contacts.xlsx. Cada fila es un contacto con estas columnas:
| Columna | Contenido |
|---|---|
email |
La dirección de email. |
first_name, last_name |
El nombre y los apellidos. |
unsubscribed |
true o false. |
audiences |
Los nombres de las listas del contacto, separados por ; . |
| Una columna por campo personalizado | El valor de cada campo personalizado definido en el espacio de trabajo, con su clave como nombre de columna. Los valores múltiples se unen con ;. |
created_at, updated_at |
Marcas de tiempo en formato ISO 8601. |
email,first_name,last_name,unsubscribed,audiences,company,plan,created_at,updated_at
ada@example.com,Ada,Lovelace,false,Newsletter,Analytical Engines,pro,2026-10-01T10:20:31.000000Z,2026-10-01T10:20:31.000000Z{
"error": "format must be csv or xlsx"
}{
"error": "Export is limited to 10000 contacts. Narrow your filters and try again."
}Eliminar un contacto
Elimina de forma permanente un contacto y todas sus pertenencias a listas.
/contacts/{id}Requiere una clave de API full. La eliminación no se puede deshacer. Para dejar de enviar emails a alguien sin perder sus datos, actualiza el contacto con unsubscribed: true o añade la dirección a tus direcciones bloqueadas. Dispara subscriber.deleted por cada pertenencia y, después, contact.deleted.
Parámetros de ruta
idstringobligatoriocon_…) o su dirección de email, codificada para URL.Devuelve
objectstringcontact.idstringemailstringdeletedbooleantrue.{
"object": "contact",
"id": "con_4Kt4ZXloQR8WGcMsYx8PFCUjokM",
"email": "alan@example.com",
"deleted": true
}{
"error": "Contact not found"
}