Ir al contenido

Audiencias y contactos

Una audiencia es una lista de contactos a los que puedes enviar campañas. Un contacto pertenece exactamente a una audiencia; la misma dirección de correo en dos audiencias son dos contactos, cada uno con su propio estado de baja.

Ventana de terminal
curl -X POST https://api.spacepost.dev/audiences \
-H "Authorization: Bearer $SPACEPOST_API_KEY" -H "Content-Type: application/json" \
-d '{ "name": "Newsletter" }'
Response
{ "object": "audience", "id": "0192e1c4-0000-7000-8000-0000000000a1", "name": "Newsletter" }

GET /audiences, GET /audiences/{id} y DELETE /audiences/{id} completan el conjunto. Eliminar una audiencia elimina sus contactos. Los nombres de las audiencias tienen de 1 a 100 caracteres.

Los contactos viven bajo su audiencia: /audiences/{audienceId}/contacts.

Crear contacto
emailstringobligatorio

Único dentro de la audiencia. Se guarda en minúsculas. Crear un duplicado devuelve 422.

first_namestringopcional

Hasta 100 caracteres. Lo usa {{{FIRST_NAME}}}.

last_namestringopcional

Hasta 100 caracteres. Lo usa {{{LAST_NAME}}}.

unsubscribedbooleanopcional

Crea el contacto ya dado de baja (por ejemplo, al importar una lista de supresión). Por defecto es false.

contacts.ts
import { SpacePost } from "@spacepost/node";
const spacepost = new SpacePost(process.env.SPACEPOST_API_KEY);
const { data: audience, error } = await spacepost.audiences.create({ name: "Newsletter" });
if (error) throw new Error(error.message);
// Create
await spacepost.contacts.create({
audienceId: audience.id,
email: "ada@example.com",
firstName: "Ada",
lastName: "Lovelace",
});
// Read by email (or by id)
const { data: contact } = await spacepost.contacts.get({ audienceId: audience.id, email: "ada@example.com" });
console.log(contact?.unsubscribed);
// Update
await spacepost.contacts.update({ audienceId: audience.id, email: "ada@example.com", firstName: "Augusta" });
// List, newest first
const { data: page } = await spacepost.contacts.list({ audienceId: audience.id, limit: 50 });
console.log(page?.data.length, page?.has_more);
// Unsubscribe manually, then delete
await spacepost.contacts.update({ audienceId: audience.id, email: "ada@example.com", unsubscribed: true });
await spacepost.contacts.remove({ audienceId: audience.id, email: "ada@example.com" });
Ventana de terminal
AUD=0192e1c4-0000-7000-8000-0000000000a1
# create
curl -X POST https://api.spacepost.dev/audiences/$AUD/contacts \
-H "Authorization: Bearer $SPACEPOST_API_KEY" -H "Content-Type: application/json" \
-d '{ "email": "ada@example.com", "first_name": "Ada", "last_name": "Lovelace" }'
# => { "object": "contact", "id": "..." }
# get by email (URL-encode the @) or by id
curl "https://api.spacepost.dev/audiences/$AUD/contacts/ada%40example.com" -H "Authorization: Bearer $SPACEPOST_API_KEY"
# update
curl -X PATCH "https://api.spacepost.dev/audiences/$AUD/contacts/ada%40example.com" \
-H "Authorization: Bearer $SPACEPOST_API_KEY" -H "Content-Type: application/json" \
-d '{ "unsubscribed": true }'
# delete
curl -X DELETE "https://api.spacepost.dev/audiences/$AUD/contacts/ada%40example.com" -H "Authorization: Bearer $SPACEPOST_API_KEY"

Un contacto tiene este aspecto:

{
"object": "contact",
"id": "0192e1c4-0000-7000-8000-0000000000c1",
"email": "ada@example.com",
"first_name": "Ada",
"last_name": "Lovelace",
"created_at": "2026-10-23T14:00:00.000Z",
"unsubscribed": false
}

DELETE devuelve { "object": "contact", "contact": "ada@example.com", "deleted": true }. Donde se espera un idOrEmail puedes pasar el id del contacto o la dirección de correo.

Un contacto con unsubscribed: true se omite en todas las campañas. Los contactos se dan de baja ellos mismos mediante el enlace de tus correos (Darse de baja), y tú puedes activar el indicador mediante la API cuando te enteres de una baja por otro medio.

Importa con un bucle, respetando el límite de tasa (10 peticiones por segundo en Free y Pro):

for (const row of rows) {
const { error } = await spacepost.contacts.create({ audienceId, email: row.email, firstName: row.first });
if (error?.name === "rate_limit_exceeded") await new Promise((r) => setTimeout(r, 1000));
}

Importa solo a personas que aceptaron recibir tus mensajes. Consulta Cumplimiento normativo.