Manage email campaigns, templates, recipients, and tracking.
Send transactional email
/organizations/{organizationId}/projects/{projectId}/apps/email/{appId}/actions/send- organizationIdRequired
- path · string
- projectIdRequired
- path · string
- appIdRequired
- path · string
- toRequired
- string
- locale
- stringRecipient locale (e.g., 'en', 'fr'). Resolves TranslatableString fields and passes through to block rendering. Defaults to 'en'.
- emailSlugRequired
- stringEmail template slug
- variables
- objectTemplate variables to replace
- skipTracking
- booleanSkip adding tracking pixel/links
import { createGiantContext } from "@giantcontext/sdk-typescript";
const gc = createGiantContext({ apiKey: process.env.GIANTCONTEXT_API_KEY! });
const { organizations: orgs } = await gc.me.listMyOrganizations();const { projects } = await gc.projects.listProjects({ organizationId: orgs[0].id });const { apps } = await gc.projects.listProjectApps({ organizationId: orgs[0].id, projectId: projects[0].id,});
const result = await gc.email.sendTransactionalEmail({ organizationId: orgs[0].id, projectId: projects[0].id, appId: apps[0].id, data: { to: "user@example.com", subject: "Hello", html: "<p>World</p>" }});
Get one contact's sent and planned emails with per-send opens and clicks
/organizations/{organizationId}/projects/{projectId}/apps/email/{appId}/contacts/{contactId}/timeline- organizationIdRequired
- path · string
- projectIdRequired
- path · string
- appIdRequired
- path · string
- contactIdRequired
- path · string
import { createGiantContext } from "@giantcontext/sdk-typescript";
const gc = createGiantContext({ apiKey: process.env.GIANTCONTEXT_API_KEY! });
const { organizations: orgs } = await gc.me.listMyOrganizations();const { projects } = await gc.projects.listProjects({ organizationId: orgs[0].id });const { apps } = await gc.projects.listProjectApps({ organizationId: orgs[0].id, projectId: projects[0].id,});const { contacts } = await gc.contacts.listContacts({ organizationId: orgs[0].id, projectId: projects[0].id, appId: apps[0].id,});
const { timeline } = await gc.email.getContactEmailTimeline({ organizationId: orgs[0].id, projectId: projects[0].id, appId: apps[0].id, contactId: contacts[0].id,});
Get one email with its full content blocks and header/footer links
/organizations/{organizationId}/projects/{projectId}/apps/email/{appId}/emails/{emailId}- organizationIdRequired
- path · string
- projectIdRequired
- path · string
- appIdRequired
- path · string
- emailIdRequired
- path · string
import { createGiantContext } from "@giantcontext/sdk-typescript";
const gc = createGiantContext({ apiKey: process.env.GIANTCONTEXT_API_KEY! });
const { organizations: orgs } = await gc.me.listMyOrganizations();const { projects } = await gc.projects.listProjects({ organizationId: orgs[0].id });const { apps } = await gc.projects.listProjectApps({ organizationId: orgs[0].id, projectId: projects[0].id,});const { emails } = await gc.email.listEmails({ organizationId: orgs[0].id, projectId: projects[0].id, appId: apps[0].id,});
const email = await gc.email.getEmail({ organizationId: orgs[0].id, projectId: projects[0].id, appId: apps[0].id, emailId: emails[0].id,});
Delete email
/organizations/{organizationId}/projects/{projectId}/apps/email/{appId}/emails/{emailId}- organizationIdRequired
- path · string
- projectIdRequired
- path · string
- appIdRequired
- path · string
- emailIdRequired
- path · string
import { createGiantContext } from "@giantcontext/sdk-typescript";
const gc = createGiantContext({ apiKey: process.env.GIANTCONTEXT_API_KEY! });
const { organizations: orgs } = await gc.me.listMyOrganizations();const { projects } = await gc.projects.listProjects({ organizationId: orgs[0].id });
const result = await gc.email.deleteEmail({ organizationId: orgs[0].id, projectId: projects[0].id, appId: "YOUR_APP_ID", emailId: "YOUR_EMAIL_ID",});
Update an email's name, slug, subject, preheader and send-trigger sentence, not content or status
/organizations/{organizationId}/projects/{projectId}/apps/email/{appId}/emails/{emailId}- organizationIdRequired
- path · string
- projectIdRequired
- path · string
- appIdRequired
- path · string
- emailIdRequired
- path · string
- name
- stringInternal use only
- slug
- stringInternal reference for this email. Emails are sent rather than served, so this is not a public URL and changing it breaks no link.
- subject
- union
- footerId
- unionThe footer this email renders with. Discover ids with listEmailFooters. Null unbinds and falls back to the app default.
- headerId
- unionThe header this email renders with. Discover ids with listEmailHeaders. Null unbinds and falls back to the app default.
- preheader
- unionTranslatableString. The line most inboxes print beside the subject. Null clears it, and the client then falls back to whatever the body opens with.
- triggerDescription
- union
import { createGiantContext } from "@giantcontext/sdk-typescript";
const gc = createGiantContext({ apiKey: process.env.GIANTCONTEXT_API_KEY! });
const { organizations: orgs } = await gc.me.listMyOrganizations();const { projects } = await gc.projects.listProjects({ organizationId: orgs[0].id });
const result = await gc.email.updateEmailMeta({ organizationId: orgs[0].id, projectId: projects[0].id, appId: "app_123", emailId: "email_123", data: {},});
List emails in an email app, newest first; pass lite=true to skip content
/organizations/{organizationId}/projects/{projectId}/apps/email/{appId}/emails- page
- query · number
- pageSize
- query · number
- lite
- query · string
- sort
- query · string
- search
- query · string
- status
- query · string
- slug
- query · string
- name
- query · string
- headerId
- query · string
- footerId
- query · string
- organizationIdRequired
- path · string
- projectIdRequired
- path · string
- appIdRequired
- path · string
import { createGiantContext } from "@giantcontext/sdk-typescript";
const gc = createGiantContext({ apiKey: process.env.GIANTCONTEXT_API_KEY! });
const { organizations: orgs } = await gc.me.listMyOrganizations();const { projects } = await gc.projects.listProjects({ organizationId: orgs[0].id });const { apps } = await gc.projects.listProjectApps({ organizationId: orgs[0].id, projectId: projects[0].id,});
const { emails } = await gc.emails.listEmails({ organizationId: orgs[0].id, projectId: projects[0].id, appId: apps[0].id,});
Get one header's full block tree; no lite mode, so expect heavy output
/organizations/{organizationId}/projects/{projectId}/apps/email/{appId}/headers/{headerId}- organizationIdRequired
- path · string
- projectIdRequired
- path · string
- appIdRequired
- path · string
- headerIdRequired
- path · string
import { createGiantContext } from "@giantcontext/sdk-typescript";
const gc = createGiantContext({ apiKey: process.env.GIANTCONTEXT_API_KEY! });
const { organizations: orgs } = await gc.me.listMyOrganizations();const { projects } = await gc.projects.listProjects({ organizationId: orgs[0].id });
const appId = "your-app-id";const headerId = "your-header-id";
const result = await gc.email.getEmailHeader({ organizationId: orgs[0].id, projectId: projects[0].id, appId, headerId,});
Delete email header
/organizations/{organizationId}/projects/{projectId}/apps/email/{appId}/headers/{headerId}- organizationIdRequired
- path · string
- projectIdRequired
- path · string
- appIdRequired
- path · string
- headerIdRequired
- path · string
import { createGiantContext } from "@giantcontext/sdk-typescript";
const gc = createGiantContext({ apiKey: process.env.GIANTCONTEXT_API_KEY! });
const { organizations: orgs } = await gc.me.listMyOrganizations();const { projects } = await gc.projects.listProjects({ organizationId: orgs[0].id });const { apps } = await gc.projects.listProjectApps({ organizationId: orgs[0].id, projectId: projects[0].id,});const { headers } = await gc.email.listEmailHeaders({ organizationId: orgs[0].id, projectId: projects[0].id, appId: apps[0].id,});
const result = await gc.email.deleteEmailHeader({ organizationId: orgs[0].id, projectId: projects[0].id, appId: apps[0].id, headerId: headers[0].id,});
List headers in an email app, newest first; pass lite=true to skip content
/organizations/{organizationId}/projects/{projectId}/apps/email/{appId}/headers- page
- query · number
- pageSize
- query · number
- lite
- query · string
- sort
- query · string
- search
- query · string
- name
- query · string
- createdAt
- query · string
- updatedAt
- query · string
- organizationIdRequired
- path · string
- projectIdRequired
- path · string
- appIdRequired
- path · string
import { createGiantContext } from "@giantcontext/sdk-typescript";
const gc = createGiantContext({ apiKey: process.env.GIANTCONTEXT_API_KEY! });
const { organizations: orgs } = await gc.me.listMyOrganizations();const { projects } = await gc.projects.listProjects({ organizationId: orgs[0].id });const { apps } = await gc.projects.listProjectApps({ organizationId: orgs[0].id, projectId: projects[0].id,});
const { headers } = await gc.email.listEmailHeaders({ organizationId: orgs[0].id, projectId: projects[0].id, appId: apps[0].id,});
Create a header shell; only name is required, add blocks afterwards
/organizations/{organizationId}/projects/{projectId}/apps/email/{appId}/headers- organizationIdRequired
- path · string
- projectIdRequired
- path · string
- appIdRequired
- path · string
- nameRequired
- string
- content
- array
import { createGiantContext } from "@giantcontext/sdk-typescript";
const gc = createGiantContext({ apiKey: process.env.GIANTCONTEXT_API_KEY! });
const { organizations: orgs } = await gc.me.listMyOrganizations();const { projects } = await gc.projects.listProjects({ organizationId: orgs[0].id });const { apps } = await gc.projects.listProjectApps({ organizationId: orgs[0].id, projectId: projects[0].id,});
const result = await gc.email.createEmailHeader({ organizationId: orgs[0].id, projectId: projects[0].id, appId: apps[0].id, data: {},});
Get one send with its full delivery and engagement event log
/organizations/{organizationId}/projects/{projectId}/apps/email/{appId}/sends/{sendId}- organizationIdRequired
- path · string
- projectIdRequired
- path · string
- appIdRequired
- path · string
- sendIdRequired
- path · string
import { createGiantContext } from "@giantcontext/sdk-typescript";
const gc = createGiantContext({ apiKey: process.env.GIANTCONTEXT_API_KEY! });
const { organizations: orgs } = await gc.me.listMyOrganizations();const { projects } = await gc.projects.listProjects({ organizationId: orgs[0].id });const { apps } = await gc.projects.listProjectApps({ organizationId: orgs[0].id, projectId: projects[0].id,});const { sends } = await gc.email.listEmailSends({ organizationId: orgs[0].id, projectId: projects[0].id, appId: apps[0].id,});
const { send } = await gc.email.getEmailSend({ organizationId: orgs[0].id, projectId: projects[0].id, appId: apps[0].id, sendId: sends[0].id,});
Update a send to reschedule or cancel; only planned and queued rows accept edits
/organizations/{organizationId}/projects/{projectId}/apps/email/{appId}/sends/{sendId}- organizationIdRequired
- path · string
- projectIdRequired
- path · string
- appIdRequired
- path · string
- sendIdRequired
- path · string
- status
- union
- metadata
- object
- scheduledFor
- union
import { createGiantContext } from "@giantcontext/sdk-typescript";
const gc = createGiantContext({ apiKey: process.env.GIANTCONTEXT_API_KEY! });
const { organizations: orgs } = await gc.me.listMyOrganizations();const { projects } = await gc.projects.listProjects({ organizationId: orgs[0].id });
const result = await gc.email.updateEmailSend({ organizationId: orgs[0].id, projectId: projects[0].id, appId: "app-id", sendId: "send-id", data: {},});
List past, queued and planned sends across the app, filterable by email or contact
/organizations/{organizationId}/projects/{projectId}/apps/email/{appId}/sends- page
- query · number
- pageSize
- query · number
- lite
- query · string
- sort
- query · string
- search
- query · string
- emailId
- query · string
- contactId
- query · string
- status
- query · string
- locale
- query · string
- recipientEmail
- query · string
- organizationIdRequired
- path · string
- projectIdRequired
- path · string
- appIdRequired
- path · string
import { createGiantContext } from "@giantcontext/sdk-typescript";
const gc = createGiantContext({ apiKey: process.env.GIANTCONTEXT_API_KEY! });
const { organizations: orgs } = await gc.me.listMyOrganizations();const { projects } = await gc.projects.listProjects({ organizationId: orgs[0].id });const { apps } = await gc.projects.listProjectApps({ organizationId: orgs[0].id, projectId: projects[0].id,});
const { emailSends } = await gc.email.listEmailSends({ organizationId: orgs[0].id, projectId: projects[0].id, appId: apps[0].id,});
Create a send for one contact; defaults to planned, which sends nothing until queued
/organizations/{organizationId}/projects/{projectId}/apps/email/{appId}/sends- organizationIdRequired
- path · string
- projectIdRequired
- path · string
- appIdRequired
- path · string
- locale
- string
- status
- union
- emailIdRequired
- string
- metadata
- object
- contactIdRequired
- string
- scheduledFor
- string
import { createGiantContext } from "@giantcontext/sdk-typescript";
const gc = createGiantContext({ apiKey: process.env.GIANTCONTEXT_API_KEY! });
const { organizations: orgs } = await gc.me.listMyOrganizations();const { projects } = await gc.projects.listProjects({ organizationId: orgs[0].id });const { apps } = await gc.projects.listProjectApps({ organizationId: orgs[0].id, projectId: projects[0].id,});
const result = await gc.email.createEmailSend({ organizationId: orgs[0].id, projectId: projects[0].id, appId: apps[0].id, data: {},});