Zum Inhalt springen

Zielgruppen und Kontakte

Eine Zielgruppe ist eine Liste von Kontakten, an die du Kampagnen senden kannst. Ein Kontakt gehört zu genau einer Zielgruppe; dieselbe E-Mail-Adresse in zwei Zielgruppen sind zwei Kontakte, jeder mit eigenem Abmeldestatus.

Terminal-Fenster
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} und DELETE /audiences/{id} vervollständigen die Operationen. Das Löschen einer Zielgruppe löscht ihre Kontakte. Namen von Zielgruppen sind 1 bis 100 Zeichen lang.

Kontakte liegen unter ihrer Zielgruppe: /audiences/{audienceId}/contacts.

Kontakt erstellen
emailstringerforderlich

Innerhalb der Zielgruppe eindeutig. Wird in Kleinbuchstaben gespeichert. Ein Duplikat liefert 422.

first_namestringoptional

Bis zu 100 Zeichen. Wird von {{{FIRST_NAME}}} verwendet.

last_namestringoptional

Bis zu 100 Zeichen. Wird von {{{LAST_NAME}}} verwendet.

unsubscribedbooleanoptional

Den Kontakt direkt als abgemeldet anlegen (zum Beispiel beim Import einer Sperrliste). Standardwert ist 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" });
Terminal-Fenster
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"

Ein Kontakt sieht so aus:

{
"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 gibt { "object": "contact", "contact": "ada@example.com", "deleted": true } zurück. Wo eine idOrEmail erwartet wird, kannst du entweder die Kontakt-ID oder die E-Mail-Adresse übergeben.

Ein Kontakt mit unsubscribed: true wird von jeder Kampagne übersprungen. Kontakte melden sich selbst über den Link in deinen E-Mails ab (Abmeldung), und du kannst das Flag über die API setzen, wenn du anderswo von einem Opt-out erfährst.

Importiere mit einer Schleife und beachte dabei das Rate Limit (10 Anfragen pro Sekunde bei Free und 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));
}

Importiere nur Personen, die zugestimmt haben, von dir zu hören. Siehe Compliance.