Skip to content
DashboardRequest access

Campaigns, contacts and lists

Back to the SDK Reference.

Campaigns

MethodSignature
listlist(query: CampaignListQuery): Promise<Campaign[]>
getget(id: string): Promise<Campaign>
createcreate(input: CampaignCreateInput): Promise<Campaign>
updateupdate(id: string, input: CampaignUpdateInput): Promise<Campaign>
sendsend(id: string): Promise<Campaign>
pausepause(id: string): Promise<Campaign>
resumeresume(id: string): Promise<Campaign>
cancelcancel(id: string): Promise<Campaign & { note: string }>
duplicateduplicate(id: string): Promise<Campaign>
deletedelete(id: string): Promise<void>
statsstats(id: string): Promise<CampaignStats>
providerStatsproviderStats(id: string): Promise<CampaignProviderStats[]>
const campaign = await client.campaigns.create({
  projectId: 'proj_123',
  name: 'July newsletter',
  subject: 'What shipped this month',
  fromAddress: '[email protected]',
  templateId: 'tmpl_456',
  listId: 'list_789',
});

await client.campaigns.send(campaign.id);
await client.campaigns.pause(campaign.id);
await client.campaigns.resume(campaign.id);

const { note } = await client.campaigns.cancel(campaign.id);
const copy = await client.campaigns.duplicate(campaign.id);

const stats = await client.campaigns.stats(campaign.id);
const byProvider = await client.campaigns.providerStats(campaign.id);

A campaign's status is one of draft, scheduled, sending, paused, sent or cancelled. list accepts limit (at most 100) and offset. CampaignStats includes an optional configurationBounced count for bounces caused by recipient-side configuration rather than the address itself.

Contacts

MethodSignature
listlist(query: ContactListQuery): Promise<ContactListResponse>
getget(id: string): Promise<Contact>
createcreate(input: ContactCreateInput): Promise<Contact>
updateupdate(id: string, input: ContactUpdateInput): Promise<Contact>
deletedelete(id: string): Promise<void>
bulkCreatebulkCreate(input: ContactBulkInput): Promise<ContactBulkResponse>
tagstags(projectId: string): Promise<string[]>
listslists(contactId: string): Promise<ContactListItem[]>
addToListaddToList(contactId: string, listId: string): Promise<void>
removeFromListremoveFromList(contactId: string, listId: string): Promise<void>

addToList and removeFromList are deprecated; use lists.addContacts and lists.removeContact instead.

const contact = await client.contacts.create({
  projectId: 'proj_123',
  email: '[email protected]',
  tags: ['trial'],
});

const { data, total } = await client.contacts.list({
  projectId: 'proj_123',
  search: '[email protected]',
});

// `tagMode` defaults to 'and' when omitted
const vipOrBeta = await client.contacts.list({
  projectId: 'proj_123',
  tags: ['vip', 'beta'],
  tagMode: 'or',
});

const { inserted, updated, skipped } = await client.contacts.bulkCreate({
  projectId: 'proj_123',
  contacts: [
    { email: '[email protected]', tags: ['import'] },
    { email: '[email protected]' },
  ],
});

const allTags = await client.contacts.tags('proj_123');
const memberships = await client.contacts.lists(contact.id);

ContactUpdateInput only supports unsubscribing a contact: client.contacts.update(id, { unsubscribe: true }). list takes limit (at most 200) and offset.

Lists

MethodSignature
listlist(projectId: string): Promise<ListWithCount[]>
getget(id: string): Promise<List>
createcreate(input: ListCreateInput): Promise<List>
updateupdate(id: string, input: ListUpdateInput): Promise<List>
deletedelete(id: string): Promise<void>
listContactslistContacts(id: string, query?: ListMembersQuery): Promise<ListMembersResponse>
addContactsaddContacts(id: string, contactIds: string[]): Promise<{ added: number }>
removeContactremoveContact(id: string, contactId: string): Promise<void>
const list = await client.lists.create({
  projectId: 'proj_123',
  name: 'Beta users',
});

await client.lists.addContacts(list.id, [contact.id]);

const { data: members, total } = await client.lists.listContacts(list.id, {
  limit: 50,
});

await client.lists.removeContact(list.id, contact.id);

listContacts takes an optional search, plus limit (at most 200) and offset.