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.
Audiencias
Sección titulada «Audiencias»curl -X POST https://api.spacepost.dev/audiences \ -H "Authorization: Bearer $SPACEPOST_API_KEY" -H "Content-Type: application/json" \ -d '{ "name": "Newsletter" }'{ "object": "audience", "id": "0192e1c4-0000-7000-8000-0000000000a1", "name": "Newsletter" }const { data } = await spacepost.audiences.create({ 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.
Contactos
Sección titulada «Contactos»Los contactos viven bajo su audiencia: /audiences/{audienceId}/contacts.
emailstringobligatorioÚnico dentro de la audiencia. Se guarda en minúsculas. Crear un duplicado devuelve 422.
first_namestringopcionalHasta 100 caracteres. Lo usa {{{FIRST_NAME}}}.
last_namestringopcionalHasta 100 caracteres. Lo usa {{{LAST_NAME}}}.
unsubscribedbooleanopcionalCrea el contacto ya dado de baja (por ejemplo, al importar una lista de supresión). Por defecto es false.
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);
// Createawait 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);
// Updateawait spacepost.contacts.update({ audienceId: audience.id, email: "ada@example.com", firstName: "Augusta" });
// List, newest firstconst { data: page } = await spacepost.contacts.list({ audienceId: audience.id, limit: 50 });console.log(page?.data.length, page?.has_more);
// Unsubscribe manually, then deleteawait spacepost.contacts.update({ audienceId: audience.id, email: "ada@example.com", unsubscribed: true });await spacepost.contacts.remove({ audienceId: audience.id, email: "ada@example.com" });AUD=0192e1c4-0000-7000-8000-0000000000a1
# createcurl -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 idcurl "https://api.spacepost.dev/audiences/$AUD/contacts/ada%40example.com" -H "Authorization: Bearer $SPACEPOST_API_KEY"
# updatecurl -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 }'
# deletecurl -X DELETE "https://api.spacepost.dev/audiences/$AUD/contacts/ada%40example.com" -H "Authorization: Bearer $SPACEPOST_API_KEY"base = f"https://api.spacepost.dev/audiences/{audience_id}/contacts"h = {"Authorization": f"Bearer {os.environ['SPACEPOST_API_KEY']}"}
requests.post(base, headers=h, json={"email": "ada@example.com", "first_name": "Ada"})requests.patch(f"{base}/ada@example.com", headers=h, json={"unsubscribed": True})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.
Importar
Sección titulada «Importar»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.