Giant Context
Giant ContextAsk for early access

Email

Manage email campaigns, templates, recipients, and tracking.


POST

Send transactional email

/organizations/{organizationId}/projects/{projectId}/apps/email/{appId}/actions/send
Parameters
organizationIdRequired
path · string
projectIdRequired
path · string
appIdRequired
path · string
BodyRequired
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
SDK
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

Get one contact's sent and planned emails with per-send opens and clicks

/organizations/{organizationId}/projects/{projectId}/apps/email/{appId}/contacts/{contactId}/timeline
Parameters
organizationIdRequired
path · string
projectIdRequired
path · string
appIdRequired
path · string
contactIdRequired
path · string
SDK
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

Get one email with its full content blocks and header/footer links

/organizations/{organizationId}/projects/{projectId}/apps/email/{appId}/emails/{emailId}
Parameters
organizationIdRequired
path · string
projectIdRequired
path · string
appIdRequired
path · string
emailIdRequired
path · string
SDK
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

Delete email

/organizations/{organizationId}/projects/{projectId}/apps/email/{appId}/emails/{emailId}
Parameters
organizationIdRequired
path · string
projectIdRequired
path · string
appIdRequired
path · string
emailIdRequired
path · string
SDK
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",});
PATCH

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}
Parameters
organizationIdRequired
path · string
projectIdRequired
path · string
appIdRequired
path · string
emailIdRequired
path · string
BodyRequired
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
SDK
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: {},});
GET

List emails in an email app, newest first; pass lite=true to skip content

/organizations/{organizationId}/projects/{projectId}/apps/email/{appId}/emails
Parameters
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
SDK
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

Get one footer's block content in full; listEmailFooters lite=true returns metadata only

/organizations/{organizationId}/projects/{projectId}/apps/email/{appId}/footers/{footerId}
Parameters
organizationIdRequired
path · string
projectIdRequired
path · string
appIdRequired
path · string
footerIdRequired
path · string
SDK
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 { footers } = await gc.email.listEmailFooters({  organizationId: orgs[0].id,  projectId: projects[0].id,  appId: apps[0].id,});
const footer = await gc.email.getEmailFooter({  organizationId: orgs[0].id,  projectId: projects[0].id,  appId: apps[0].id,  footerId: footers[0].id,});
DELETE

Delete email footer

/organizations/{organizationId}/projects/{projectId}/apps/email/{appId}/footers/{footerId}
Parameters
organizationIdRequired
path · string
projectIdRequired
path · string
appIdRequired
path · string
footerIdRequired
path · string
SDK
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 { footers } = await gc.email.listEmailFooters({  organizationId: orgs[0].id,  projectId: projects[0].id,  appId: apps[0].id,});
const result = await gc.email.deleteEmailFooter({  organizationId: orgs[0].id,  projectId: projects[0].id,  appId: apps[0].id,  footerId: footers[0].id,});
GET

List footers in an email app, newest first; pass lite=true to skip content

/organizations/{organizationId}/projects/{projectId}/apps/email/{appId}/footers
Parameters
page
query · number
pageSize
query · number
lite
query · string
sort
query · string
search
query · string
name
query · string
organizationIdRequired
path · string
projectIdRequired
path · string
appIdRequired
path · string
SDK
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 { emailFooters } = await gc.email.listEmailFooters({  organizationId: orgs[0].id,  projectId: projects[0].id,  appId: apps[0].id,});
POST

Create a footer shell; only name is required, add blocks afterwards

/organizations/{organizationId}/projects/{projectId}/apps/email/{appId}/footers
Parameters
organizationIdRequired
path · string
projectIdRequired
path · string
appIdRequired
path · string
BodyRequired
nameRequired
string
content
array
SDK
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 footer = await gc.email.createEmailFooter({  organizationId: orgs[0].id,  projectId: projects[0].id,  appId: apps[0].id,  data: {},});
GET

Get one header's full block tree; no lite mode, so expect heavy output

/organizations/{organizationId}/projects/{projectId}/apps/email/{appId}/headers/{headerId}
Parameters
organizationIdRequired
path · string
projectIdRequired
path · string
appIdRequired
path · string
headerIdRequired
path · string
SDK
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

Delete email header

/organizations/{organizationId}/projects/{projectId}/apps/email/{appId}/headers/{headerId}
Parameters
organizationIdRequired
path · string
projectIdRequired
path · string
appIdRequired
path · string
headerIdRequired
path · string
SDK
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,});
GET

List headers in an email app, newest first; pass lite=true to skip content

/organizations/{organizationId}/projects/{projectId}/apps/email/{appId}/headers
Parameters
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
SDK
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,});
POST

Create a header shell; only name is required, add blocks afterwards

/organizations/{organizationId}/projects/{projectId}/apps/email/{appId}/headers
Parameters
organizationIdRequired
path · string
projectIdRequired
path · string
appIdRequired
path · string
BodyRequired
nameRequired
string
content
array
SDK
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

Get one send with its full delivery and engagement event log

/organizations/{organizationId}/projects/{projectId}/apps/email/{appId}/sends/{sendId}
Parameters
organizationIdRequired
path · string
projectIdRequired
path · string
appIdRequired
path · string
sendIdRequired
path · string
SDK
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,});
PATCH

Update a send to reschedule or cancel; only planned and queued rows accept edits

/organizations/{organizationId}/projects/{projectId}/apps/email/{appId}/sends/{sendId}
Parameters
organizationIdRequired
path · string
projectIdRequired
path · string
appIdRequired
path · string
sendIdRequired
path · string
BodyRequired
status
union
metadata
object
scheduledFor
union
SDK
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: {},});
GET

List past, queued and planned sends across the app, filterable by email or contact

/organizations/{organizationId}/projects/{projectId}/apps/email/{appId}/sends
Parameters
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
SDK
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,});
POST

Create a send for one contact; defaults to planned, which sends nothing until queued

/organizations/{organizationId}/projects/{projectId}/apps/email/{appId}/sends
Parameters
organizationIdRequired
path · string
projectIdRequired
path · string
appIdRequired
path · string
BodyRequired
locale
string
status
union
emailIdRequired
string
metadata
object
contactIdRequired
string
scheduledFor
string
SDK
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: {},});

BuiltAutonomously With AI
This content was built autonomously. Giant Context analyzed the site, determined what was missing, created and submitted an idea and draft, which Giant Context staff accepted and published.
Giant Context
Product
  • How It Works
  • Mind
  • Create
  • Capture
  • Nurture
  • Optimize
  • Publishing
  • Pricing
  • Use Cases

© 2026 Giant Context
Privacy PolicyTermsCookie PolicyAcceptable Use
Powered by
Email | Giant Context