Website
Manage website content, pages, posts, and public rendering.
Ask the search engines to recrawl a page, post, article or doc now
/organizations/{organizationId}/projects/{projectId}/content/search-index- organizationIdRequired
- path · string
- projectIdRequired
- path · string
- contentIdRequired
- stringThe entity being edited.
- contentTypeRequired
- stringEntity discriminator: website_page, website_post, website_landing, etc.
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.website.submitContentToSearchEngines({ organizationId: orgs[0].id, projectId: projects[0].id, data: {}});
Get the one seeded blog archive page; no create call exists
/organizations/{organizationId}/projects/{projectId}/apps/website/{appId}/blog-page- draftId
- 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 { page } = await gc.website.getWebsiteBlogPage({ organizationId: orgs[0].id, projectId: projects[0].id, appId: apps[0].id,});
Update the blog archive page's name and SEO fields; cannot publish or edit content
/organizations/{organizationId}/projects/{projectId}/apps/website/{appId}/blog-page- draftId
- query · string
- organizationIdRequired
- path · string
- projectIdRequired
- path · string
- appIdRequired
- path · string
- seo
- object
- name
- stringInternal use only
- footerId
- unionThe footer this renders with. Discover ids with listWebsiteFooters. Null unbinds and falls back to the app default.
- headerId
- unionThe header this renders with. Discover ids with listWebsiteHeaders. Null unbinds and falls back to the app default.
- layoutId
- unionThe layout this renders inside. Discover ids with listWebsiteLayouts. Null unbinds and falls back to the app default.
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.website.updateWebsiteBlogPageMeta({ organizationId: orgs[0].id, projectId: projects[0].id, appId: apps[0].id, data: {},});
Get the cookie banner copy, category toggles and policy links
/organizations/{organizationId}/projects/{projectId}/apps/website/{appId}/consent- 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 { settings } = await gc.website.getWebsiteConsentSettings({ organizationId: orgs[0].id, projectId: projects[0].id, appId: apps[0].id,});
Get one dialog with its full block tree, max width and close control
/organizations/{organizationId}/projects/{projectId}/apps/website/{appId}/dialogs/{dialogId}- organizationIdRequired
- path · string
- projectIdRequired
- path · string
- appIdRequired
- path · string
- dialogIdRequired
- 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 { dialogs } = await gc.website.listWebsiteDialogs({ organizationId: orgs[0].id, projectId: projects[0].id, appId: apps[0].id,});
const dialog = await gc.website.getWebsiteDialog({ organizationId: orgs[0].id, projectId: projects[0].id, appId: apps[0].id, dialogId: dialogs[0].id,});
Delete dialog
/organizations/{organizationId}/projects/{projectId}/apps/website/{appId}/dialogs/{dialogId}- organizationIdRequired
- path · string
- projectIdRequired
- path · string
- appIdRequired
- path · string
- dialogIdRequired
- 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 { dialogs } = await gc.website.listWebsiteDialogs({ organizationId: orgs[0].id, projectId: projects[0].id, appId: apps[0].id,});
const result = await gc.website.deleteWebsiteDialog({ organizationId: orgs[0].id, projectId: projects[0].id, appId: apps[0].id, dialogId: dialogs[0].id,});
List popup dialogs (modals, banners, slide-ins) in a site, newest first
/organizations/{organizationId}/projects/{projectId}/apps/website/{appId}/dialogs- page
- query · number
- pageSize
- query · number
- lite
- query · string
- sort
- query · string
- search
- query · string
- name
- query · string
- maxWidth
- query · string
- includeClose
- 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 { dialogs } = await gc.website.listWebsiteDialogs({ organizationId: orgs[0].id, projectId: projects[0].id, appId: apps[0].id,});
Create a popup dialog; nothing shows it until a button links dialog:{id}
/organizations/{organizationId}/projects/{projectId}/apps/website/{appId}/dialogs- organizationIdRequired
- path · string
- projectIdRequired
- path · string
- appIdRequired
- path · string
- nameRequired
- string
- content
- array
- maxWidth
- union
- includeClose
- boolean
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 dialog = await gc.website.createWebsiteDialog({ organizationId: orgs[0].id, projectId: projects[0].id, appId: apps[0].id, data: {},});
Get one domain with its verification token, verified state and primary flag
/organizations/{organizationId}/projects/{projectId}/apps/website/{appId}/domains/{domainId}- organizationIdRequired
- path · string
- projectIdRequired
- path · string
- appIdRequired
- path · string
- domainIdRequired
- 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 { domains } = await gc.website.listWebsiteCustomDomains({ organizationId: orgs[0].id, projectId: projects[0].id, appId: apps[0].id,});
const { domain } = await gc.website.getWebsiteCustomDomain({ organizationId: orgs[0].id, projectId: projects[0].id, appId: apps[0].id, domainId: domains[0].id,});
List a site's custom domains, primary first, with verified state and verification token
/organizations/{organizationId}/projects/{projectId}/apps/website/{appId}/domains- page
- query · number
- pageSize
- query · number
- lite
- query · string
- sort
- query · string
- search
- query · string
- isPrimary
- query · string
- isVerified
- query · string
- isGenerated
- 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 { customDomains } = await gc.website.listWebsiteCustomDomains({ organizationId: orgs[0].id, projectId: projects[0].id, appId: apps[0].id,});
Get one header with its full block tree, which lite listings omit
/organizations/{organizationId}/projects/{projectId}/apps/website/{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.website.listWebsiteHeaders({ organizationId: orgs[0].id, projectId: projects[0].id, appId: apps[0].id,});
const header = await gc.website.getWebsiteHeader({ organizationId: orgs[0].id, projectId: projects[0].id, appId: apps[0].id, headerId: headers[0].id,});
Delete website header
/organizations/{organizationId}/projects/{projectId}/apps/website/{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.website.listWebsiteHeaders({ organizationId: orgs[0].id, projectId: projects[0].id, appId: apps[0].id,});
const result = await gc.website.deleteWebsiteHeader({ organizationId: orgs[0].id, projectId: projects[0].id, appId: apps[0].id, headerId: headers[0].id,});
List a site's headers newest first, each with its block tree unless lite
/organizations/{organizationId}/projects/{projectId}/apps/website/{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.website.listWebsiteHeaders({ organizationId: orgs[0].id, projectId: projects[0].id, appId: apps[0].id,});
Create a reusable header shell; pages attach it by id, content optional
/organizations/{organizationId}/projects/{projectId}/apps/website/{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 { header } = await gc.website.createWebsiteHeader({ organizationId: orgs[0].id, projectId: projects[0].id, appId: apps[0].id, data: {},});
Get the one seeded page at the site root; no create call exists
/organizations/{organizationId}/projects/{projectId}/apps/website/{appId}/landing- draftId
- 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 { landing } = await gc.website.getWebsiteLanding({ organizationId: orgs[0].id, projectId: projects[0].id, appId: apps[0].id,});
Update the landing page's name and SEO fields; cannot publish or edit content
/organizations/{organizationId}/projects/{projectId}/apps/website/{appId}/landing- draftId
- query · string
- organizationIdRequired
- path · string
- projectIdRequired
- path · string
- appIdRequired
- path · string
- seo
- object
- name
- stringInternal use only
- footerId
- unionThe footer this renders with. Discover ids with listWebsiteFooters. Null unbinds and falls back to the app default.
- headerId
- unionThe header this renders with. Discover ids with listWebsiteHeaders. Null unbinds and falls back to the app default.
- layoutId
- unionThe layout this renders inside. Discover ids with listWebsiteLayouts. Null unbinds and falls back to the app default.
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.website.updateWebsiteLandingMeta({ organizationId: orgs[0].id, projectId: projects[0].id, appId: apps[0].id, data: {},});
Get one layout with its full block tree, which lite listings omit
/organizations/{organizationId}/projects/{projectId}/apps/website/{appId}/layouts/{layoutId}- organizationIdRequired
- path · string
- projectIdRequired
- path · string
- appIdRequired
- path · string
- layoutIdRequired
- 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 { layouts } = await gc.website.listWebsiteLayouts({ organizationId: orgs[0].id, projectId: projects[0].id, appId: apps[0].id,});
const { layout } = await gc.website.getWebsiteLayout({ organizationId: orgs[0].id, projectId: projects[0].id, appId: apps[0].id, layoutId: layouts[0].id,});
Delete website layout
/organizations/{organizationId}/projects/{projectId}/apps/website/{appId}/layouts/{layoutId}- organizationIdRequired
- path · string
- projectIdRequired
- path · string
- appIdRequired
- path · string
- layoutIdRequired
- 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 { layouts } = await gc.website.listWebsiteLayouts({ organizationId: orgs[0].id, projectId: projects[0].id, appId: apps[0].id,});
const result = await gc.website.deleteWebsiteLayout({ organizationId: orgs[0].id, projectId: projects[0].id, appId: apps[0].id, layoutId: layouts[0].id,});
List page layouts you can apply when creating a page, newest first
/organizations/{organizationId}/projects/{projectId}/apps/website/{appId}/layouts- 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 { layouts } = await gc.website.listWebsiteLayouts({ organizationId: orgs[0].id, projectId: projects[0].id, appId: apps[0].id,});
Create a layout shell; pages set layoutId to share its block tree
/organizations/{organizationId}/projects/{projectId}/apps/website/{appId}/layouts- organizationIdRequired
- path · string
- projectIdRequired
- path · string
- appIdRequired
- path · string
- nameRequired
- string
- content
- array
- description
- 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 { layout } = await gc.website.createWebsiteLayout({ organizationId: orgs[0].id, projectId: projects[0].id, appId: apps[0].id, data: {},});
Get the one seeded not found page; no create call exists
/organizations/{organizationId}/projects/{projectId}/apps/website/{appId}/not-found-page- draftId
- 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 { page } = await gc.website.getWebsiteNotFoundPage({ organizationId: orgs[0].id, projectId: projects[0].id, appId: apps[0].id,});
Update the not found page's name and SEO fields; cannot publish or edit content
/organizations/{organizationId}/projects/{projectId}/apps/website/{appId}/not-found-page- draftId
- query · string
- organizationIdRequired
- path · string
- projectIdRequired
- path · string
- appIdRequired
- path · string
- seo
- object
- name
- stringInternal use only
- footerId
- unionThe footer this renders with. Discover ids with listWebsiteFooters. Null unbinds and falls back to the app default.
- headerId
- unionThe header this renders with. Discover ids with listWebsiteHeaders. Null unbinds and falls back to the app default.
- layoutId
- unionThe layout this renders inside. Discover ids with listWebsiteLayouts. Null unbinds and falls back to the app default.
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.website.updateWebsiteNotFoundPageMeta({ organizationId: orgs[0].id, projectId: projects[0].id, appId: apps[0].id, data: { title: "Page Not Found" },});
Get one page with its full block tree, SEO, status and layout ids
/organizations/{organizationId}/projects/{projectId}/apps/website/{appId}/pages/{pageId}- organizationIdRequired
- path · string
- projectIdRequired
- path · string
- appIdRequired
- path · string
- pageIdRequired
- 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 { pages } = await gc.website.listWebsitePages({ organizationId: orgs[0].id, projectId: projects[0].id, appId: apps[0].id,});
const { page } = await gc.website.getWebsitePage({ organizationId: orgs[0].id, projectId: projects[0].id, appId: apps[0].id, pageId: pages[0].id,});
Delete website page
/organizations/{organizationId}/projects/{projectId}/apps/website/{appId}/pages/{pageId}- organizationIdRequired
- path · string
- projectIdRequired
- path · string
- appIdRequired
- path · string
- pageIdRequired
- 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 { pages } = await gc.website.listWebsitePages({ organizationId: orgs[0].id, projectId: projects[0].id, appId: apps[0].id,});
const result = await gc.website.deleteWebsitePage({ organizationId: orgs[0].id, projectId: projects[0].id, appId: apps[0].id, pageId: pages[0].id,});
Update a page's name, title, slug, SEO fields, featured image and tags; cannot publish or edit content
/organizations/{organizationId}/projects/{projectId}/apps/website/{appId}/pages/{pageId}- organizationIdRequired
- path · string
- projectIdRequired
- path · string
- appIdRequired
- path · string
- pageIdRequired
- path · string
- seo
- object
- name
- stringInternal use only
- slug
- stringThe URL segment. Changing this MOVES the public URL: a redirect from the old path to the new one is recorded automatically, so existing links keep working, but anything quoting the old URL verbatim (a printed link, an external citation) now travels one hop. Must be unique within the app — a collision is a 409, not a silent rename.
- tags
- array
- title
- unionWhat a reader sees, per locale. Send a locale map like {"en": "..."} on a multilingual project; check the project's enabledLocales with getProject first. Falls back to name where unset.
- footerId
- unionThe footer this renders with. Discover ids with listWebsiteFooters. Null unbinds and falls back to the app default.
- headerId
- unionThe header this renders with. Discover ids with listWebsiteHeaders. Null unbinds and falls back to the app default.
- layoutId
- unionThe layout this renders inside. Discover ids with listWebsiteLayouts. Null unbinds and falls back to the app default.
- featuredImageUrl
- unionFeatured image, stored as a file reference (file:{uuid}) and resolved to a serving URL at render. Set it to a project file's reference, not a resolved URL — a URL is not recorded as in-use in core.file_references and could be deleted out from under the page.
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 { pages } = await gc.website.listWebsitePages({ organizationId: orgs[0].id, projectId: projects[0].id, appId: apps[0].id,});
const result = await gc.website.updateWebsitePageMeta({ organizationId: orgs[0].id, projectId: projects[0].id, appId: apps[0].id, pageId: pages[0].id, data: { title: "Updated Page Title" },});
List a site's pages with slug, live URL and publish status, newest first
/organizations/{organizationId}/projects/{projectId}/apps/website/{appId}/pages- page
- query · number
- pageSize
- query · number
- lite
- query · string
- sort
- query · string
- search
- query · string
- status
- query · string
- slug
- query · string
- isListed
- query · string
- layoutId
- query · string
- headerId
- query · string
- footerId
- 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 { pages } = await gc.website.listWebsitePages({ organizationId: orgs[0].id, projectId: projects[0].id, appId: apps[0].id,});
Create a page shell; content optional and status defaults to published, live immediately
/organizations/{organizationId}/projects/{projectId}/apps/website/{appId}/pages- organizationIdRequired
- path · string
- projectIdRequired
- path · string
- appIdRequired
- path · string
- seo
- object
- nameRequired
- string
- slugRequired
- string
- tags
- array
- title
- unionWhat a reader sees, per locale. `name` is the internal handle and is never translated; this is the copy that appears on the page, in links, in NextPost and in the sitemap. Falls back to name where unset.
- status
- union
- content
- array
- footerId
- union
- headerId
- union
- layoutId
- union
- featuredImageUrl
- unionFeatured image, stored as a file reference (file:{uuid}) and resolved to a serving URL at render. Set it to a project file's reference, not a resolved URL — a URL is not recorded as in-use in core.file_references and could be deleted out from under the page.
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 { data: page } = await gc.website.createWebsitePage({ organizationId: orgs[0].id, projectId: projects[0].id, appId: apps[0].id, data: { name: "My New Page", path: "/my-new-page" }});
Get one blog post with its full content blocks, tags and SEO fields
/organizations/{organizationId}/projects/{projectId}/apps/website/{appId}/posts/{postId}- organizationIdRequired
- path · string
- projectIdRequired
- path · string
- appIdRequired
- path · string
- postIdRequired
- 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 { posts } = await gc.website.listWebsitePosts({ organizationId: orgs[0].id, projectId: projects[0].id, appId: apps[0].id,});
const { post } = await gc.website.getWebsitePost({ organizationId: orgs[0].id, projectId: projects[0].id, appId: apps[0].id, postId: posts[0].id,});
Delete blog post
/organizations/{organizationId}/projects/{projectId}/apps/website/{appId}/posts/{postId}- organizationIdRequired
- path · string
- projectIdRequired
- path · string
- appIdRequired
- path · string
- postIdRequired
- 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 { posts } = await gc.website.listWebsitePosts({ organizationId: orgs[0].id, projectId: projects[0].id, appId: apps[0].id,});
const result = await gc.website.deleteWebsitePost({ organizationId: orgs[0].id, projectId: projects[0].id, appId: apps[0].id, postId: posts[0].id,});
Update a post's name, title, slug, excerpt, author, publish date, tags and SEO, not its content
/organizations/{organizationId}/projects/{projectId}/apps/website/{appId}/posts/{postId}- organizationIdRequired
- path · string
- projectIdRequired
- path · string
- appIdRequired
- path · string
- postIdRequired
- path · string
- seo
- object
- name
- stringInternal use only
- slug
- stringThe URL segment. Changing this MOVES the public URL: a redirect from the old path to the new one is recorded automatically, so existing links keep working, but anything quoting the old URL verbatim (a printed link, an external citation) now travels one hop. Must be unique within the app — a collision is a 409, not a silent rename.
- tags
- array
- title
- unionWhat a reader sees, per locale. Send a locale map like {"en": "..."} on a multilingual project; check the project's enabledLocales with getProject first. Falls back to name where unset.
- excerpt
- union
- footerId
- unionThe footer this renders with. Discover ids with listWebsiteFooters. Null unbinds and falls back to the app default.
- headerId
- unionThe header this renders with. Discover ids with listWebsiteHeaders. Null unbinds and falls back to the app default.
- layoutId
- unionThe layout this renders inside. Discover ids with listWebsiteLayouts. Null unbinds and falls back to the app default.
- authorName
- union
- publishDate
- union
- featuredImageUrl
- unionFeatured image, stored as a file reference (file:{uuid}) and resolved to a serving URL at render. Set it to a project file's reference, not a resolved URL — a URL is not recorded as in-use in core.file_references and could be deleted out from under the post.
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.website.updateWebsitePostMeta({ organizationId: orgs[0].id, projectId: projects[0].id, appId: "app-id", postId: "post-id", data: {},});
List blog posts in a site, newest first, with author, tags and status
/organizations/{organizationId}/projects/{projectId}/apps/website/{appId}/posts- page
- query · number
- pageSize
- query · number
- lite
- query · string
- sort
- query · string
- search
- query · string
- status
- query · string
- slug
- query · string
- isListed
- query · string
- authorId
- query · string
- authorName
- query · string
- publishDate
- 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 { posts } = await gc.website.listWebsitePosts({ organizationId: orgs[0].id, projectId: projects[0].id, appId: apps[0].id,});
Create a blog post; status defaults to draft, unlike createWebsitePage
/organizations/{organizationId}/projects/{projectId}/apps/website/{appId}/posts- organizationIdRequired
- path · string
- projectIdRequired
- path · string
- appIdRequired
- path · string
- seo
- object
- nameRequired
- string
- slugRequired
- string
- tags
- array
- title
- unionWhat a reader sees, per locale. `name` is the internal handle and is never translated; this is the copy that appears on the page, in links, in NextPost and in the sitemap. Falls back to name where unset.
- status
- union
- content
- array
- excerpt
- union
- footerId
- union
- headerId
- union
- layoutId
- union
- authorName
- union
- publishDate
- union
- featuredImageUrl
- unionFeatured image, stored as a file reference (file:{uuid}) and resolved to a serving URL at render. Set it to a project file's reference, not a resolved URL — a URL is not recorded as in-use in core.file_references and could be deleted out from under the post.
- scheduledPublishAt
- unionWhen this item should go live. It stays a draft and stays invisible until then; a job publishes it within five minutes of that time. Null means not scheduled. Publishing or unpublishing by hand clears it.
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 { post } = await gc.website.createWebsitePost({ organizationId: orgs[0].id, projectId: projects[0].id, appId: apps[0].id, data: {},});
Get one URL redirect by id
/organizations/{organizationId}/projects/{projectId}/apps/website/{appId}/redirects/{redirectId}- organizationIdRequired
- path · string
- projectIdRequired
- path · string
- appIdRequired
- path · string
- redirectIdRequired
- 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 { redirects } = await gc.website.listWebsiteRedirects({ organizationId: orgs[0].id, projectId: projects[0].id, appId: apps[0].id,});
const { redirect } = await gc.website.getWebsiteRedirect({ organizationId: orgs[0].id, projectId: projects[0].id, appId: apps[0].id, redirectId: redirects[0].id,});
List a site's URL redirects, newest first, with from, to, status and source
/organizations/{organizationId}/projects/{projectId}/apps/website/{appId}/redirects- page
- query · number
- pageSize
- query · number
- lite
- query · string
- sort
- query · string
- search
- query · string
- source
- query · string
- status
- 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 { redirects } = await gc.website.listWebsiteRedirects({ organizationId: orgs[0].id, projectId: projects[0].id, appId: apps[0].id,});
Get one sidebar with its full block tree, which lite listings omit
/organizations/{organizationId}/projects/{projectId}/apps/website/{appId}/sidebars/{sidebarId}- organizationIdRequired
- path · string
- projectIdRequired
- path · string
- appIdRequired
- path · string
- sidebarIdRequired
- 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 { sidebars } = await gc.website.listWebsiteSidebars({ organizationId: orgs[0].id, projectId: projects[0].id, appId: apps[0].id,});
const { sidebar } = await gc.website.getWebsiteSidebar({ organizationId: orgs[0].id, projectId: projects[0].id, appId: apps[0].id, sidebarId: sidebars[0].id,});
Delete website sidebar
/organizations/{organizationId}/projects/{projectId}/apps/website/{appId}/sidebars/{sidebarId}- organizationIdRequired
- path · string
- projectIdRequired
- path · string
- appIdRequired
- path · string
- sidebarIdRequired
- 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 { sidebars } = await gc.website.listWebsiteSidebars({ organizationId: orgs[0].id, projectId: projects[0].id, appId: apps[0].id,});
const result = await gc.website.deleteWebsiteSidebar({ organizationId: orgs[0].id, projectId: projects[0].id, appId: apps[0].id, sidebarId: sidebars[0].id,});
List a site's sidebars newest first, each with its block tree unless lite
/organizations/{organizationId}/projects/{projectId}/apps/website/{appId}/sidebars- 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 { sidebars } = await gc.website.listWebsiteSidebars({ organizationId: orgs[0].id, projectId: projects[0].id, appId: apps[0].id,});
Create a reusable sidebar shell; a layoutSidebar block points at it by id
/organizations/{organizationId}/projects/{projectId}/apps/website/{appId}/sidebars- 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 { sidebar } = await gc.website.createWebsiteSidebar({ organizationId: orgs[0].id, projectId: projects[0].id, appId: apps[0].id, data: {},});
Get the one seeded sign-in page; no create call exists
/organizations/{organizationId}/projects/{projectId}/apps/website/{appId}/sign-in-page- draftId
- 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 { page } = await gc.website.getWebsiteSignInPage({ organizationId: orgs[0].id, projectId: projects[0].id, appId: apps[0].id,});
Update the sign-in page's name and SEO fields; cannot publish or edit content
/organizations/{organizationId}/projects/{projectId}/apps/website/{appId}/sign-in-page- draftId
- query · string
- organizationIdRequired
- path · string
- projectIdRequired
- path · string
- appIdRequired
- path · string
- seo
- object
- name
- stringInternal use only
- footerId
- unionThe footer this renders with. Discover ids with listWebsiteFooters. Null unbinds and falls back to the app default.
- headerId
- unionThe header this renders with. Discover ids with listWebsiteHeaders. Null unbinds and falls back to the app default.
- layoutId
- unionThe layout this renders inside. Discover ids with listWebsiteLayouts. Null unbinds and falls back to the app default.
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.website.updateWebsiteSignInPageMeta({ organizationId: orgs[0].id, projectId: projects[0].id, appId: apps[0].id, data: {},});
List the tag names in use across a site's pages and posts
/organizations/{organizationId}/projects/{projectId}/apps/website/{appId}/tags- page
- query · number
- pageSize
- query · number
- lite
- query · string
- sort
- query · string
- search
- query · string
- tag
- 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 { tags } = await gc.website.listWebsiteTags({ organizationId: orgs[0].id, projectId: projects[0].id, appId: apps[0].id,});
Get the site's Google Tag Manager container ID, the only tracking setting
/organizations/{organizationId}/projects/{projectId}/apps/website/{appId}/tracking- 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 { settings } = await gc.website.getWebsiteTrackingSettings({ organizationId: orgs[0].id, projectId: projects[0].id, appId: apps[0].id,});
Get existing page slugs and each page's layout, to avoid duplicate slugs
/organizations/{organizationId}/projects/{projectId}/apps/website/{appId}/urls- 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 { urls } = await gc.website.getWebsiteUrls({ organizationId: orgs[0].id, projectId: projects[0].id, appId: apps[0].id,});
Whether this site's private pages have members, and which tenant
/organizations/{organizationId}/projects/{projectId}/apps/website/{appId}/viewer-auth- 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 auth = await gc.website.getWebsiteViewerAuth({ organizationId: orgs[0].id, projectId: projects[0].id, appId: apps[0].id,});
The identity providers this site's readers can sign in with
/organizations/{organizationId}/projects/{projectId}/apps/website/{appId}/viewer-auth/sso- organizationIdRequired
- path · string
- projectIdRequired
- path · string
- appIdRequired
- path · string
Remove somebody's access to this website's gated content
/organizations/{organizationId}/projects/{projectId}/apps/website/{appId}/viewers/{uid}- organizationIdRequired
- path · string
- projectIdRequired
- path · string
- appIdRequired
- path · string
- uidRequired
- 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 { viewers } = await gc.website.listWebsiteViewers({ organizationId: orgs[0].id, projectId: projects[0].id, appId: apps[0].id,});
const result = await gc.website.removeWebsiteViewer({ organizationId: orgs[0].id, projectId: projects[0].id, appId: apps[0].id, uid: viewers[0].uid,});
List the people who can read this website's gated content
/organizations/{organizationId}/projects/{projectId}/apps/website/{appId}/viewers- page
- query · number
- pageSize
- query · number
- lite
- query · string
- sort
- query · string
- search
- query · string
- signedInAt
- query · string
- invitedAt
- 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 { viewers } = await gc.website.listWebsiteViewers({ organizationId: orgs[0].id, projectId: projects[0].id, appId: apps[0].id,});
Invite somebody to read this website's gated content
/organizations/{organizationId}/projects/{projectId}/apps/website/{appId}/viewers- organizationIdRequired
- path · string
- projectIdRequired
- path · string
- appIdRequired
- path · string
- emailRequired
- stringWho to invite. Inviting somebody who already has an account sends them a fresh link rather than failing — that is how an expired invitation is repaired.
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.website.inviteWebsiteViewer({ organizationId: orgs[0].id, projectId: projects[0].id, appId: apps[0].id, data: { email: "viewer@example.com" }});