Giant Context
Giant ContextGet Early Access

CRM

Manage contacts, companies, activities, and CRM data.


GET

Get one activity's description, writing app and JSON data payload

/organizations/{organizationId}/projects/{projectId}/apps/crm/{appId}/activities/{activityId}

Returns a single CRM activity by ID. Each activity is a natural-language description of something that happened, tagged with the app that wrote it, with optional JSON metadata and linked contact/company objects.

Parameters
organizationIdRequired
path · string
projectIdRequired
path · string
appIdRequired
path · string
activityIdRequired
path · string
SDK
import { createGiantContext } from "@giantcontext/sdk-typescript";
const gc = createGiantContext({ apiKey: process.env.GIANTCONTEXT_API_KEY! });
const org = await gc.organizations.getOrganizationBySlug({ slug: "my-org" });const { projects } = await gc.projects.listProjects({ organizationId: org.id });
const activity = await gc.crm.getCrmActivity({  organizationId: org.id,  projectId: projects[0].id,  appId: "your-app-id",  activityId: "your-activity-id"});
GET

List the activity timeline for a whole CRM app, newest first, searchable

/organizations/{organizationId}/projects/{projectId}/apps/crm/{appId}/activities

Returns a paginated timeline of CRM activities for the specified app, newest first. Each activity is a natural-language description of something that happened for a contact (or company), tagged with the app that wrote it and optionally enriched with a JSON `data` payload. Supports free-text search across the description.

Parameters
page
query · numberPage number to return, 1-indexed. Defaults to 1.
pageSize
query · numberItems per page (1-100). Defaults to 10.
lite
query · stringWhen 'true', return only essential fields (id, slug, title/name) to reduce payload size. Useful for context fetching and link resolution.
sort
query · stringSort specifier as 'field:direction'. Sortable fields: createdAt, writtenBy. Direction is 'asc' or 'desc' and defaults to 'asc'.
search
query · stringFree-text search. Matched against: description.
contactId
query · stringFilter by contactId. Operators: contactId=value (equals), contactId_ne, contactId_gt, contactId_gte, contactId_lt, contactId_lte, contactId_like (contains), contactId_isnull=true|false, contactId_has=value (jsonb array contains), contactId[]=a&contactId[]=b (in).
companyId
query · stringFilter by companyId. Operators: companyId=value (equals), companyId_ne, companyId_gt, companyId_gte, companyId_lt, companyId_lte, companyId_like (contains), companyId_isnull=true|false, companyId_has=value (jsonb array contains), companyId[]=a&companyId[]=b (in).
writtenBy
query · stringFilter by writtenBy. Operators: writtenBy=value (equals), writtenBy_ne, writtenBy_gt, writtenBy_gte, writtenBy_lt, writtenBy_lte, writtenBy_like (contains), writtenBy_isnull=true|false, writtenBy_has=value (jsonb array contains), writtenBy[]=a&writtenBy[]=b (in).
createdAt
query · stringFilter by createdAt. Operators: createdAt=value (equals), createdAt_ne, createdAt_gt, createdAt_gte, createdAt_lt, createdAt_lte, createdAt_like (contains), createdAt_isnull=true|false, createdAt_has=value (jsonb array contains), createdAt[]=a&createdAt[]=b (in).
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 org = await gc.organizations.getOrganizationBySlug({ slug: "my-org" });const { projects } = await gc.projects.listProjects({ organizationId: org.id });const { apps } = await gc.projects.listProjectApps({  organizationId: org.id,  projectId: projects[0].id,});
const { activities } = await gc.crm.listCrmActivities({  organizationId: org.id,  projectId: projects[0].id,  appId: apps[0].id,});
POST

Log a past-tense sentence onto a contact or company timeline, append-only

/organizations/{organizationId}/projects/{projectId}/apps/crm/{appId}/activities

Appends an activity to the CRM timeline. `description` is a natural-language sentence ('Viewed pricing page', 'Unsubscribed from newsletter'). `writtenBy` identifies which app wrote it. Optional `data` carries structured metadata for agents to read. Link to a contact and/or company via id.

Parameters
organizationIdRequired
path · string
projectIdRequired
path · string
appIdRequired
path · string
BodyRequired
data
object
companyId
string
contactId
string
writtenBy
string
descriptionRequired
string
SDK
import { createGiantContext } from "@giantcontext/sdk-typescript";
const gc = createGiantContext({ apiKey: process.env.GIANTCONTEXT_API_KEY! });
const org = await gc.organizations.getOrganizationBySlug({ slug: "my-org" });const { projects } = await gc.projects.listProjects({ organizationId: org.id });
const result = await gc.crm.logCrmActivity({  organizationId: org.id,  projectId: projects[0].id,  appId: "my-app-id",  data: { action: "login", timestamp: Date.now() }});
GET

List a company's activity timeline, newest first, whatever app logged it

/organizations/{organizationId}/projects/{projectId}/apps/crm/{appId}/companies/{companyId}/activities

Returns the natural-language activity timeline for a company, newest first. Each row is a description of something that happened, tagged with the app that wrote it, with optional JSON metadata.

Parameters
page
query · numberPage number to return, 1-indexed. Defaults to 1.
pageSize
query · numberItems per page (1-100). Defaults to 10.
lite
query · stringWhen 'true', return only essential fields (id, slug, title/name) to reduce payload size. Useful for context fetching and link resolution.
sort
query · stringSort specifier as 'field:direction'. Sortable fields: createdAt, writtenBy. Direction is 'asc' or 'desc' and defaults to 'asc'.
search
query · stringFree-text search. Matched against: description.
writtenBy
query · stringFilter by writtenBy. Operators: writtenBy=value (equals), writtenBy_ne, writtenBy_gt, writtenBy_gte, writtenBy_lt, writtenBy_lte, writtenBy_like (contains), writtenBy_isnull=true|false, writtenBy_has=value (jsonb array contains), writtenBy[]=a&writtenBy[]=b (in).
contactId
query · stringFilter by contactId. Operators: contactId=value (equals), contactId_ne, contactId_gt, contactId_gte, contactId_lt, contactId_lte, contactId_like (contains), contactId_isnull=true|false, contactId_has=value (jsonb array contains), contactId[]=a&contactId[]=b (in).
organizationIdRequired
path · string
projectIdRequired
path · string
appIdRequired
path · string
companyIdRequired
path · string
SDK
import { createGiantContext } from "@giantcontext/sdk-typescript";
const gc = createGiantContext({ apiKey: process.env.GIANTCONTEXT_API_KEY! });
const { id: orgId } = await gc.organizations.getOrganizationBySlug({ slug: "my-org" });const { projects } = await gc.projects.listProjects({ organizationId: orgId });
const { activities } = await gc.crm.listCrmCompanyActivities({  organizationId: orgId,  projectId: projects[0].id,  appId: "your-app-id",  companyId: "your-company-id",});
GET

List contacts linked to one company, paginated, alphabetical by last name

/organizations/{organizationId}/projects/{projectId}/apps/crm/{appId}/companies/{companyId}/contacts

Returns a paginated list of CRM contacts linked to a specific company, ordered by last name then first name. Each contact includes name, email, phone, title, department, status, source, tags, and linked company object.

Parameters
page
query · numberPage number to return, 1-indexed. Defaults to 1.
pageSize
query · numberItems per page (1-100). Defaults to 10.
lite
query · stringWhen 'true', return only essential fields (id, slug, title/name) to reduce payload size. Useful for context fetching and link resolution.
sort
query · stringSort specifier as 'field:direction'. Sortable fields: firstName, lastName, email, title, department, status, source, lastActivityAt, createdAt, updatedAt. Direction is 'asc' or 'desc' and defaults to 'asc'.
search
query · stringFree-text search. Matched against: firstName, lastName, email.
status
query · stringFilter by status. Operators: status=value (equals), status_ne, status_gt, status_gte, status_lt, status_lte, status_like (contains), status_isnull=true|false, status_has=value (jsonb array contains), status[]=a&status[]=b (in).
source
query · stringFilter by source. Operators: source=value (equals), source_ne, source_gt, source_gte, source_lt, source_lte, source_like (contains), source_isnull=true|false, source_has=value (jsonb array contains), source[]=a&source[]=b (in).
title
query · stringFilter by title. Operators: title=value (equals), title_ne, title_gt, title_gte, title_lt, title_lte, title_like (contains), title_isnull=true|false, title_has=value (jsonb array contains), title[]=a&title[]=b (in).
department
query · stringFilter by department. Operators: department=value (equals), department_ne, department_gt, department_gte, department_lt, department_lte, department_like (contains), department_isnull=true|false, department_has=value (jsonb array contains), department[]=a&department[]=b (in).
email
query · stringFilter by email. Operators: email=value (equals), email_ne, email_gt, email_gte, email_lt, email_lte, email_like (contains), email_isnull=true|false, email_has=value (jsonb array contains), email[]=a&email[]=b (in).
emailSubscribed
query · stringFilter by emailSubscribed. Operators: emailSubscribed=value (equals), emailSubscribed_ne, emailSubscribed_gt, emailSubscribed_gte, emailSubscribed_lt, emailSubscribed_lte, emailSubscribed_like (contains), emailSubscribed_isnull=true|false, emailSubscribed_has=value (jsonb array contains), emailSubscribed[]=a&emailSubscribed[]=b (in).
organizationIdRequired
path · string
projectIdRequired
path · string
appIdRequired
path · string
companyIdRequired
path · string
SDK
import { createGiantContext } from "@giantcontext/sdk-typescript";
const gc = createGiantContext({ apiKey: process.env.GIANTCONTEXT_API_KEY! });
const org = await gc.organizations.getOrganizationBySlug({ slug: "my-org" });const { projects } = await gc.projects.listProjects({ organizationId: org.id });const { apps } = await gc.projects.listProjectApps({  organizationId: org.id,  projectId: projects[0].id,});const { companies } = await gc.crm.listCrmCompanies({  organizationId: org.id,  projectId: projects[0].id,  appId: apps[0].id,});
const { contacts } = await gc.crm.listCrmCompanyContacts({  organizationId: org.id,  projectId: projects[0].id,  appId: apps[0].id,  companyId: companies[0].id,});
GET

Get one company with its profile fields and count of linked contacts

/organizations/{organizationId}/projects/{projectId}/apps/crm/{appId}/companies/{companyId}

Returns a single CRM company by ID, including name, website, industry, size, annual revenue, contact info, address, tags, custom properties, and a count of associated contacts.

Parameters
organizationIdRequired
path · string
projectIdRequired
path · string
appIdRequired
path · string
companyIdRequired
path · string
SDK
import { createGiantContext } from "@giantcontext/sdk-typescript";
const gc = createGiantContext({ apiKey: process.env.GIANTCONTEXT_API_KEY! });
const org = await gc.organizations.getOrganizationBySlug({ slug: "my-org" });const { projects } = await gc.projects.listProjects({ organizationId: org.id });
const company = await gc.crm.getCrmCompany({  organizationId: org.id,  projectId: projects[0].id,  appId: "your-app-id",  companyId: "your-company-id"});
GET

List companies in one CRM app, alphabetical by name, each with contact count

/organizations/{organizationId}/projects/{projectId}/apps/crm/{appId}/companies

Returns a paginated list of all CRM companies for the specified app. Supports search by company name or industry. Each company includes a count of associated contacts.

Parameters
page
query · numberPage number to return, 1-indexed. Defaults to 1.
pageSize
query · numberItems per page (1-100). Defaults to 10.
lite
query · stringWhen 'true', return only essential fields (id, slug, title/name) to reduce payload size. Useful for context fetching and link resolution.
sort
query · stringSort specifier as 'field:direction'. Sortable fields: name, industry, size, annualRevenue, email, createdAt, updatedAt. Direction is 'asc' or 'desc' and defaults to 'asc'.
search
query · stringFree-text search. Matched against: name, industry.
name
query · stringFilter by name. Operators: name=value (equals), name_ne, name_gt, name_gte, name_lt, name_lte, name_like (contains), name_isnull=true|false, name_has=value (jsonb array contains), name[]=a&name[]=b (in).
industry
query · stringFilter by industry. Operators: industry=value (equals), industry_ne, industry_gt, industry_gte, industry_lt, industry_lte, industry_like (contains), industry_isnull=true|false, industry_has=value (jsonb array contains), industry[]=a&industry[]=b (in).
size
query · stringFilter by size. Operators: size=value (equals), size_ne, size_gt, size_gte, size_lt, size_lte, size_like (contains), size_isnull=true|false, size_has=value (jsonb array contains), size[]=a&size[]=b (in).
email
query · stringFilter by email. Operators: email=value (equals), email_ne, email_gt, email_gte, email_lt, email_lte, email_like (contains), email_isnull=true|false, email_has=value (jsonb array contains), email[]=a&email[]=b (in).
website
query · stringFilter by website. Operators: website=value (equals), website_ne, website_gt, website_gte, website_lt, website_lte, website_like (contains), website_isnull=true|false, website_has=value (jsonb array contains), website[]=a&website[]=b (in).
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 org = await gc.organizations.getOrganizationBySlug({ slug: "my-org" });const { projects } = await gc.projects.listProjects({ organizationId: org.id });const { apps } = await gc.projects.listProjectApps({  organizationId: org.id,  projectId: projects[0].id,});
const { companies } = await gc.crm.listCrmCompanies({  organizationId: org.id,  projectId: projects[0].id,  appId: apps[0].id,});
GET

List a contact's activity timeline, newest first, including rows written by other apps

/organizations/{organizationId}/projects/{projectId}/apps/crm/{appId}/contacts/{contactId}/activities

Returns the natural-language activity timeline for a contact, newest first. Each row is a description of something that happened, tagged with the app that wrote it, with optional JSON metadata.

Parameters
page
query · numberPage number to return, 1-indexed. Defaults to 1.
pageSize
query · numberItems per page (1-100). Defaults to 10.
lite
query · stringWhen 'true', return only essential fields (id, slug, title/name) to reduce payload size. Useful for context fetching and link resolution.
sort
query · stringSort specifier as 'field:direction'. Sortable fields: createdAt, writtenBy. Direction is 'asc' or 'desc' and defaults to 'asc'.
search
query · stringFree-text search. Matched against: description.
writtenBy
query · stringFilter by writtenBy. Operators: writtenBy=value (equals), writtenBy_ne, writtenBy_gt, writtenBy_gte, writtenBy_lt, writtenBy_lte, writtenBy_like (contains), writtenBy_isnull=true|false, writtenBy_has=value (jsonb array contains), writtenBy[]=a&writtenBy[]=b (in).
companyId
query · stringFilter by companyId. Operators: companyId=value (equals), companyId_ne, companyId_gt, companyId_gte, companyId_lt, companyId_lte, companyId_like (contains), companyId_isnull=true|false, companyId_has=value (jsonb array contains), companyId[]=a&companyId[]=b (in).
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 org = await gc.organizations.getOrganizationBySlug({ slug: "my-org" });const { projects } = await gc.projects.listProjects({ organizationId: org.id });
const { activities } = await gc.crm.listCrmContactActivities({  organizationId: org.id,  projectId: projects[0].id,  appId: "your-app-id",  contactId: "your-contact-id"});
PUT

Set one key in a contact's custom properties, merging without clobbering siblings

/organizations/{organizationId}/projects/{projectId}/apps/crm/{appId}/contacts/{contactId}/fields

Sets a single key on a contact's custom `properties`. Merges at the key level — siblings are preserved. Use this instead of PUT /contacts when only one field needs to change, especially from other apps.

Parameters
organizationIdRequired
path · string
projectIdRequired
path · string
appIdRequired
path · string
contactIdRequired
path · string
BodyRequired
keyRequired
string
valueRequired
any
SDK
import { createGiantContext } from "@giantcontext/sdk-typescript";
const gc = createGiantContext({ apiKey: process.env.GIANTCONTEXT_API_KEY! });
const org = await gc.organizations.getOrganizationBySlug({ slug: "my-org" });const { projects } = await gc.projects.listProjects({ organizationId: org.id });
const result = await gc.crm.setCrmContactField({  organizationId: org.id,  projectId: projects[0].id,  appId: "app-123",  contactId: "contact-123",  data: { customField: "value" }});
GET

Get one contact with all fields, tags and its linked company

/organizations/{organizationId}/projects/{projectId}/apps/crm/{appId}/contacts/{contactId}

Returns a single CRM contact by ID, including linked company details. Fields include name, email, phone, title, department, status, source, tags, email subscription status, and last activity timestamp.

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 org = await gc.organizations.getOrganizationBySlug({ slug: "my-org" });const { projects } = await gc.projects.listProjects({ organizationId: org.id });
const contact = await gc.crm.getCrmContact({  organizationId: org.id,  projectId: projects[0].id,  appId: "your-app-id",  contactId: "your-contact-id",});
PATCH

Update contact

/organizations/{organizationId}/projects/{projectId}/apps/crm/{appId}/contacts/{contactId}

Updates a CRM contact. All fields are optional — only provided fields are updated. Returns 409 if email or phone conflicts with an existing contact.

Parameters
organizationIdRequired
path · string
projectIdRequired
path · string
appIdRequired
path · string
contactIdRequired
path · string
BodyRequired
tags
array
email
string
phone
string
title
string
locale
union
source
union
status
union
lastName
string
companyId
string
firstName
string
department
string
properties
object
SDK
import { createGiantContext } from "@giantcontext/sdk-typescript";
const gc = createGiantContext({ apiKey: process.env.GIANTCONTEXT_API_KEY! });
const org = await gc.organizations.getOrganizationBySlug({ slug: "my-org" });const { projects } = await gc.projects.listProjects({ organizationId: org.id });
const result = await gc.crm.updateCrmContact({  organizationId: org.id,  projectId: projects[0].id,  appId: "your-app-id",  contactId: "your-contact-id",  data: {},});
POST

Tag one contact with a single free-form string, idempotent, returns the contact

/organizations/{organizationId}/projects/{projectId}/apps/crm/{appId}/contacts/{contactId}/tags

Adds a tag to a contact. Tags are free-form strings used for segmenting, gating marketing messages, and ad-hoc grouping. Idempotent — adding an existing tag is a no-op.

Parameters
organizationIdRequired
path · string
projectIdRequired
path · string
appIdRequired
path · string
contactIdRequired
path · string
BodyRequired
tagRequired
string
SDK
import { createGiantContext } from "@giantcontext/sdk-typescript";
const gc = createGiantContext({ apiKey: process.env.GIANTCONTEXT_API_KEY! });
const { id: organizationId } = await gc.organizations.getOrganizationBySlug({ slug: "my-org" });const { projects } = await gc.projects.listProjects({ organizationId });
const result = await gc.crm.tagCrmContact({  organizationId,  projectId: projects[0].id,  appId: "app-123",  contactId: "contact-456",  data: { tags: ["vip"] }});
DELETE

Untag one contact, one tag per call, idempotent, returns the updated contact

/organizations/{organizationId}/projects/{projectId}/apps/crm/{appId}/contacts/{contactId}/tags

Removes a tag from a contact. Idempotent — removing a tag the contact doesn't have is a no-op.

Parameters
organizationIdRequired
path · string
projectIdRequired
path · string
appIdRequired
path · string
contactIdRequired
path · string
BodyRequired
tagRequired
string
SDK
import { createGiantContext } from "@giantcontext/sdk-typescript";
const gc = createGiantContext({ apiKey: process.env.GIANTCONTEXT_API_KEY! });
const org = await gc.organizations.getOrganizationBySlug({ slug: "my-org" });const { projects } = await gc.projects.listProjects({ organizationId: org.id });
const result = await gc.crm.untagCrmContact({  organizationId: org.id,  projectId: projects[0].id,  appId: "app-123",  contactId: "contact-123",  data: { tagId: "tag-123" }});
GET

List contacts in one CRM app, alphabetical by last name, search supported

/organizations/{organizationId}/projects/{projectId}/apps/crm/{appId}/contacts

Returns a paginated list of all CRM contacts for the specified app. Supports search by first name, last name, or email. Each contact includes associated company info if linked.

Parameters
page
query · numberPage number to return, 1-indexed. Defaults to 1.
pageSize
query · numberItems per page (1-100). Defaults to 10.
lite
query · stringWhen 'true', return only essential fields (id, slug, title/name) to reduce payload size. Useful for context fetching and link resolution.
sort
query · stringSort specifier as 'field:direction'. Sortable fields: firstName, lastName, email, title, department, status, source, lastActivityAt, createdAt, updatedAt. Direction is 'asc' or 'desc' and defaults to 'asc'.
search
query · stringFree-text search. Matched against: firstName, lastName, email.
companyId
query · stringFilter by companyId. Operators: companyId=value (equals), companyId_ne, companyId_gt, companyId_gte, companyId_lt, companyId_lte, companyId_like (contains), companyId_isnull=true|false, companyId_has=value (jsonb array contains), companyId[]=a&companyId[]=b (in).
status
query · stringFilter by status. Operators: status=value (equals), status_ne, status_gt, status_gte, status_lt, status_lte, status_like (contains), status_isnull=true|false, status_has=value (jsonb array contains), status[]=a&status[]=b (in).
source
query · stringFilter by source. Operators: source=value (equals), source_ne, source_gt, source_gte, source_lt, source_lte, source_like (contains), source_isnull=true|false, source_has=value (jsonb array contains), source[]=a&source[]=b (in).
title
query · stringFilter by title. Operators: title=value (equals), title_ne, title_gt, title_gte, title_lt, title_lte, title_like (contains), title_isnull=true|false, title_has=value (jsonb array contains), title[]=a&title[]=b (in).
department
query · stringFilter by department. Operators: department=value (equals), department_ne, department_gt, department_gte, department_lt, department_lte, department_like (contains), department_isnull=true|false, department_has=value (jsonb array contains), department[]=a&department[]=b (in).
email
query · stringFilter by email. Operators: email=value (equals), email_ne, email_gt, email_gte, email_lt, email_lte, email_like (contains), email_isnull=true|false, email_has=value (jsonb array contains), email[]=a&email[]=b (in).
emailSubscribed
query · stringFilter by emailSubscribed. Operators: emailSubscribed=value (equals), emailSubscribed_ne, emailSubscribed_gt, emailSubscribed_gte, emailSubscribed_lt, emailSubscribed_lte, emailSubscribed_like (contains), emailSubscribed_isnull=true|false, emailSubscribed_has=value (jsonb array contains), emailSubscribed[]=a&emailSubscribed[]=b (in).
locale
query · stringFilter by locale. Operators: locale=value (equals), locale_ne, locale_gt, locale_gte, locale_lt, locale_lte, locale_like (contains), locale_isnull=true|false, locale_has=value (jsonb array contains), locale[]=a&locale[]=b (in).
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 org = await gc.organizations.getOrganizationBySlug({ slug: "my-org" });const { projects } = await gc.projects.listProjects({ organizationId: org.id });const { apps } = await gc.projects.listProjectApps({  organizationId: org.id,  projectId: projects[0].id,});
const { contacts } = await gc.crm.listCrmContacts({  organizationId: org.id,  projectId: projects[0].id,  appId: apps[0].id,});
POST

Create contact

/organizations/{organizationId}/projects/{projectId}/apps/crm/{appId}/contacts

Creates a new CRM contact. Requires firstName and lastName. Optionally link to a company via companyId. Supports email, phone, title, department, status, source, custom properties, and tags.

Parameters
organizationIdRequired
path · string
projectIdRequired
path · string
appIdRequired
path · string
BodyRequired
tags
array
email
string
phone
string
title
string
locale
union
source
union
status
union
lastNameRequired
string
companyId
string
firstNameRequired
string
department
string
properties
object
SDK
import { createGiantContext } from "@giantcontext/sdk-typescript";
const gc = createGiantContext({ apiKey: process.env.GIANTCONTEXT_API_KEY! });
const org = await gc.organizations.getOrganizationBySlug({ slug: "my-org" });const { projects } = await gc.projects.listProjects({ organizationId: org.id });
const contact = await gc.crm.createCrmContact({  organizationId: org.id,  projectId: projects[0].id,  appId: "my-app-id",  data: {    email: "test@example.com",    firstName: "John",    lastName: "Doe"  }});

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 Jesse accepted and published.
Product
  • How It Works
  • Mind
  • Create
  • Capture
  • Nurture
  • Optimize
  • Publishing
  • Pricing
  • Use Cases

© 2026 Giant Context
Privacy PolicyTermsCookie Policy
Powered by
CRM | Giant Context