Giant Context
Giant ContextGet Early Access

Website

Manage website content, pages, posts, and public rendering.


POST

Ask the search engines to recrawl a page, post, article or doc now

/organizations/{organizationId}/projects/{projectId}/content/search-index

Submits a content item's public URL to IndexNow (Bing, Yandex, Naver, Yep, Seznam) and nudges Google to re-fetch the sitemap. Publishing or editing content already does this automatically — reach for this when something is stale anyway: the page was edited outside the platform's knowledge, a domain was verified after the content went live, or an earlier submission failed. Only web-facing content has a URL to submit: pages, posts, KB articles, developer docs and the landings. Headers, footers, layouts and forms are not submittable because they have no URL of their own, even though editing one changes what a page renders. Drafts are not submitted either.

Parameters
organizationIdRequired
path · string
projectIdRequired
path · string
BodyRequired
contentIdRequired
stringThe entity being edited.
contentTypeRequired
stringEntity discriminator: website_page, website_post, website_landing, etc.
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.website.submitContentToSearchEngines({  organizationId: org.id,  projectId: projects[0].id,  data: { urls: ["https://example.com"] }});
GET

Get one dialog with its full block tree, max width and close control

/organizations/{organizationId}/projects/{projectId}/apps/website/{appId}/dialogs/{dialogId}

Returns a single website dialog by ID, including its name, type, trigger rules, content blocks, and display settings.

Parameters
organizationIdRequired
path · string
projectIdRequired
path · string
appIdRequired
path · string
dialogIdRequired
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 dialog = await gc.website.getWebsiteDialog({  organizationId: org.id,  projectId: projects[0].id,  appId: "my-app-id",  dialogId: "my-dialog-id",});
DELETE

Delete dialog

/organizations/{organizationId}/projects/{projectId}/apps/website/{appId}/dialogs/{dialogId}

Permanently deletes a website dialog.

Parameters
organizationIdRequired
path · string
projectIdRequired
path · string
appIdRequired
path · string
dialogIdRequired
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 { dialogs } = await gc.website.listWebsiteDialogs({  organizationId: org.id,  projectId: projects[0].id,  appId: apps[0].id,});
const result = await gc.website.deleteWebsiteDialog({  organizationId: org.id,  projectId: projects[0].id,  appId: apps[0].id,  dialogId: dialogs[0].id,});
GET

List popup dialogs (modals, banners, slide-ins) in a site, newest first

/organizations/{organizationId}/projects/{projectId}/apps/website/{appId}/dialogs

Returns a list of all popup dialogs configured for this website app. Dialogs are used for modals, popups, banners, and slide-ins.

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, maxWidth, createdAt, updatedAt. Direction is 'asc' or 'desc' and defaults to 'asc'.
search
query · stringFree-text search. Matched against: name.
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).
maxWidth
query · stringFilter by maxWidth. Operators: maxWidth=value (equals), maxWidth_ne, maxWidth_gt, maxWidth_gte, maxWidth_lt, maxWidth_lte, maxWidth_like (contains), maxWidth_isnull=true|false, maxWidth_has=value (jsonb array contains), maxWidth[]=a&maxWidth[]=b (in).
includeClose
query · stringFilter by includeClose. Operators: includeClose=value (equals), includeClose_ne, includeClose_gt, includeClose_gte, includeClose_lt, includeClose_lte, includeClose_like (contains), includeClose_isnull=true|false, includeClose_has=value (jsonb array contains), includeClose[]=a&includeClose[]=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).
updatedAt
query · stringFilter by updatedAt. Operators: updatedAt=value (equals), updatedAt_ne, updatedAt_gt, updatedAt_gte, updatedAt_lt, updatedAt_lte, updatedAt_like (contains), updatedAt_isnull=true|false, updatedAt_has=value (jsonb array contains), updatedAt[]=a&updatedAt[]=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 { dialogs } = await gc.website.listWebsiteDialogs({  organizationId: org.id,  projectId: projects[0].id,  appId: apps[0].id,});
POST

Create a popup dialog; nothing shows it until a button links dialog:{id}

/organizations/{organizationId}/projects/{projectId}/apps/website/{appId}/dialogs

Creates a new popup dialog for this website app.

Parameters
organizationIdRequired
path · string
projectIdRequired
path · string
appIdRequired
path · string
BodyRequired
nameRequired
string
content
array
maxWidth
union
includeClose
boolean
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 dialog = await gc.website.createWebsiteDialog({  organizationId: org.id,  projectId: projects[0].id,  appId: apps[0].id,  data: {    name: "New Dialog",    content: "Dialog content"  }});
GET

Get one domain with its verification token, verified state and primary flag

/organizations/{organizationId}/projects/{projectId}/apps/website/{appId}/domains/{domainId}

Returns a single custom domain by ID, including hostname, verification status, SSL status, DNS records needed, and primary flag.

Parameters
organizationIdRequired
path · string
projectIdRequired
path · string
appIdRequired
path · string
domainIdRequired
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 domain = await gc.website.getWebsiteCustomDomain({  organizationId: org.id,  projectId: projects[0].id,  appId: "your-app-id",  domainId: "your-domain-id",});
GET

List a site's custom domains, primary first, with verified state and verification token

/organizations/{organizationId}/projects/{projectId}/apps/website/{appId}/domains

Returns a list of all custom domains configured for this website app, including verification status, SSL status, and whether each is the primary domain. The primary domain comes first unless a sort is requested, over domain, isPrimary, isVerified, isGenerated, createdAt or updatedAt.

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: domain, isPrimary, isVerified, isGenerated, createdAt, updatedAt. Direction is 'asc' or 'desc' and defaults to 'asc'.
search
query · stringFree-text search. Matched against: hostname.
isPrimary
query · stringFilter by isPrimary. Operators: isPrimary=value (equals), isPrimary_ne, isPrimary_gt, isPrimary_gte, isPrimary_lt, isPrimary_lte, isPrimary_like (contains), isPrimary_isnull=true|false, isPrimary_has=value (jsonb array contains), isPrimary[]=a&isPrimary[]=b (in).
isVerified
query · stringFilter by isVerified. Operators: isVerified=value (equals), isVerified_ne, isVerified_gt, isVerified_gte, isVerified_lt, isVerified_lte, isVerified_like (contains), isVerified_isnull=true|false, isVerified_has=value (jsonb array contains), isVerified[]=a&isVerified[]=b (in).
isGenerated
query · stringFilter by isGenerated. Operators: isGenerated=value (equals), isGenerated_ne, isGenerated_gt, isGenerated_gte, isGenerated_lt, isGenerated_lte, isGenerated_like (contains), isGenerated_isnull=true|false, isGenerated_has=value (jsonb array contains), isGenerated[]=a&isGenerated[]=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).
updatedAt
query · stringFilter by updatedAt. Operators: updatedAt=value (equals), updatedAt_ne, updatedAt_gt, updatedAt_gte, updatedAt_lt, updatedAt_lte, updatedAt_like (contains), updatedAt_isnull=true|false, updatedAt_has=value (jsonb array contains), updatedAt[]=a&updatedAt[]=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 { customDomains } = await gc.website.listWebsiteCustomDomains({  organizationId: org.id,  projectId: projects[0].id,  appId: apps[0].id,});
GET

Get one footer with its full block tree, which lite listings omit

/organizations/{organizationId}/projects/{projectId}/apps/website/{appId}/footers/{footerId}

Returns a single website footer by ID, including its name, content blocks, and timestamps.

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 org = await gc.organizations.getOrganizationBySlug({ slug: "my-org" });const { projects } = await gc.projects.listProjects({ organizationId: org.id });
const footer = await gc.website.getWebsiteFooter({  organizationId: org.id,  projectId: projects[0].id,  appId: "app-id",  footerId: "footer-id"});
DELETE

Delete website footer

/organizations/{organizationId}/projects/{projectId}/apps/website/{appId}/footers/{footerId}

Permanently deletes a website footer component.

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 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 { footers } = await gc.website.listWebsiteFooters({  organizationId: org.id,  projectId: projects[0].id,  appId: apps[0].id,});
const result = await gc.website.deleteWebsiteFooter({  organizationId: org.id,  projectId: projects[0].id,  appId: apps[0].id,  footerId: footers[0].id,});
GET

List a site's footers newest first, each with its block tree unless lite

/organizations/{organizationId}/projects/{projectId}/apps/website/{appId}/footers

Returns a list of all footer components for this website app. Footers are reusable layout sections displayed at the bottom of pages.

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, createdAt, updatedAt. Direction is 'asc' or 'desc' and defaults to 'asc'.
search
query · stringFree-text search. Matched against: name.
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).
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).
updatedAt
query · stringFilter by updatedAt. Operators: updatedAt=value (equals), updatedAt_ne, updatedAt_gt, updatedAt_gte, updatedAt_lt, updatedAt_lte, updatedAt_like (contains), updatedAt_isnull=true|false, updatedAt_has=value (jsonb array contains), updatedAt[]=a&updatedAt[]=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 { footers } = await gc.website.listWebsiteFooters({  organizationId: org.id,  projectId: projects[0].id,  appId: apps[0].id,});
POST

Create a reusable footer shell; pages attach it by id, content optional

/organizations/{organizationId}/projects/{projectId}/apps/website/{appId}/footers

Creates a new footer component for this website app.

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 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 footer = await gc.website.createWebsiteFooter({  organizationId: org.id,  projectId: projects[0].id,  appId: apps[0].id,  data: {},});
GET

Get one header with its full block tree, which lite listings omit

/organizations/{organizationId}/projects/{projectId}/apps/website/{appId}/headers/{headerId}

Returns a single website header by ID, including its name, content blocks, and timestamps.

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 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 { headers } = await gc.website.listWebsiteHeaders({  organizationId: org.id,  projectId: projects[0].id,  appId: apps[0].id,});
const { header } = await gc.website.getWebsiteHeader({  organizationId: org.id,  projectId: projects[0].id,  appId: apps[0].id,  headerId: headers[0].id,});
DELETE

Delete website header

/organizations/{organizationId}/projects/{projectId}/apps/website/{appId}/headers/{headerId}

Permanently deletes a website header component.

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 org = await gc.organizations.getOrganizationBySlug({ slug: "default-org" });const { projects } = await gc.projects.listProjects({ organizationId: org.id });
const result = await gc.website.deleteWebsiteHeader({  organizationId: org.id,  projectId: projects[0].id,  appId: "app-id",  headerId: "header-id"});
GET

List a site's headers newest first, each with its block tree unless lite

/organizations/{organizationId}/projects/{projectId}/apps/website/{appId}/headers

Returns a list of all header components for this website app. Headers are reusable navigation/branding sections displayed at the top of pages.

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, createdAt, updatedAt. Direction is 'asc' or 'desc' and defaults to 'asc'.
search
query · stringFree-text search. Matched against: name.
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).
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).
updatedAt
query · stringFilter by updatedAt. Operators: updatedAt=value (equals), updatedAt_ne, updatedAt_gt, updatedAt_gte, updatedAt_lt, updatedAt_lte, updatedAt_like (contains), updatedAt_isnull=true|false, updatedAt_has=value (jsonb array contains), updatedAt[]=a&updatedAt[]=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 { headers } = await gc.website.listWebsiteHeaders({  organizationId: org.id,  projectId: projects[0].id,  appId: apps[0].id,});
POST

Create a reusable header shell; pages attach it by id, content optional

/organizations/{organizationId}/projects/{projectId}/apps/website/{appId}/headers

Creates a new header component for this website app.

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 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 header = await gc.website.createWebsiteHeader({  organizationId: org.id,  projectId: projects[0].id,  appId: apps[0].id,  data: {    title: "My Website Header"  }});
GET

Get the one seeded page at the site root; no create call exists

/organizations/{organizationId}/projects/{projectId}/apps/website/{appId}/landing

Returns the app-level website landing page rendered at the website root.

Parameters
draftId
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 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 landing = await gc.website.getWebsiteLanding({  organizationId: org.id,  projectId: projects[0].id,  appId: apps[0].id,});
PATCH

Update the landing page's name and SEO fields; cannot publish or edit content

/organizations/{organizationId}/projects/{projectId}/apps/website/{appId}/landing

Updates the fields that describe the website landing page rather than govern it: its internal name, and SEO title, description, image and noindex. Only the fields you send are changed. A landing is the app's root singleton, so it has no slug and no title. Can rebind the layout, header and footer. Cannot change the landing's content or visibility — use the block tools for content.

Parameters
draftId
query · string
organizationIdRequired
path · string
projectIdRequired
path · string
appIdRequired
path · string
BodyRequired
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.
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 result = await gc.website.updateWebsiteLandingMeta({  organizationId: org.id,  projectId: projects[0].id,  appId: apps[0].id,  data: { title: "New Landing Page Title" },});
GET

Get one layout with its full block tree, which lite listings omit

/organizations/{organizationId}/projects/{projectId}/apps/website/{appId}/layouts/{layoutId}

Returns a single website layout by ID, including its name, content blocks, layout structure, and timestamps.

Parameters
organizationIdRequired
path · string
projectIdRequired
path · string
appIdRequired
path · string
layoutIdRequired
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 layout = await gc.website.getWebsiteLayout({  organizationId: org.id,  projectId: projects[0].id,  appId: "your-app-id",  layoutId: "your-layout-id",});
DELETE

Delete website layout

/organizations/{organizationId}/projects/{projectId}/apps/website/{appId}/layouts/{layoutId}

Permanently deletes a website page layout.

Parameters
organizationIdRequired
path · string
projectIdRequired
path · string
appIdRequired
path · string
layoutIdRequired
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 { layouts } = await gc.website.listWebsiteLayouts({  organizationId: org.id,  projectId: projects[0].id,  appId: apps[0].id,});
const result = await gc.website.deleteWebsiteLayout({  organizationId: org.id,  projectId: projects[0].id,  appId: apps[0].id,  layoutId: layouts[0].id,});
GET

List page layouts you can apply when creating a page, newest first

/organizations/{organizationId}/projects/{projectId}/apps/website/{appId}/layouts

Returns a list of all page layouts for this website app. Layouts provide reusable page layouts and content block structures.

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, createdAt, updatedAt. Direction is 'asc' or 'desc' and defaults to 'asc'.
search
query · stringFree-text search. Matched against: name.
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).
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).
updatedAt
query · stringFilter by updatedAt. Operators: updatedAt=value (equals), updatedAt_ne, updatedAt_gt, updatedAt_gte, updatedAt_lt, updatedAt_lte, updatedAt_like (contains), updatedAt_isnull=true|false, updatedAt_has=value (jsonb array contains), updatedAt[]=a&updatedAt[]=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 { layouts } = await gc.website.listWebsiteLayouts({  organizationId: org.id,  projectId: projects[0].id,  appId: apps[0].id,});
POST

Create a layout shell; pages set layoutId to share its block tree

/organizations/{organizationId}/projects/{projectId}/apps/website/{appId}/layouts

Creates a new page layout for this website app.

Parameters
organizationIdRequired
path · string
projectIdRequired
path · string
appIdRequired
path · string
BodyRequired
nameRequired
string
content
array
description
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 result = await gc.website.createWebsiteLayout({  organizationId: org.id,  projectId: projects[0].id,  appId: apps[0].id,  data: { name: "Main Layout" },});
GET

Get one page with its full block tree, SEO, status and layout ids

/organizations/{organizationId}/projects/{projectId}/apps/website/{appId}/pages/{pageId}

Returns a single website page by ID, including title, slug, full content blocks, SEO metadata, publish status, and layout references (header, footer, sidebar).

Parameters
organizationIdRequired
path · string
projectIdRequired
path · string
appIdRequired
path · string
pageIdRequired
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 { pages } = await gc.website.listWebsitePages({  organizationId: org.id,  projectId: projects[0].id,  appId: apps[0].id,});
const page = await gc.website.getWebsitePage({  organizationId: org.id,  projectId: projects[0].id,  appId: apps[0].id,  pageId: pages[0].id,});
DELETE

Delete website page

/organizations/{organizationId}/projects/{projectId}/apps/website/{appId}/pages/{pageId}

Soft-deletes a website page by moving it to the project trash. Can be restored from trash later.

Parameters
organizationIdRequired
path · string
projectIdRequired
path · string
appIdRequired
path · string
pageIdRequired
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 { pages } = await gc.website.listWebsitePages({  organizationId: org.id,  projectId: projects[0].id,  appId: apps[0].id,});
const result = await gc.website.deleteWebsitePage({  organizationId: org.id,  projectId: projects[0].id,  appId: apps[0].id,  pageId: pages[0].id,});
PATCH

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}

Updates the fields that describe a page rather than govern it: SEO title, description, image, noindex, featured image, and tags. Only the fields you send are changed. Can rebind the layout, header and footer. Cannot change the page's content, status or visibility — use the block tools for content and publishContent to take it live.

Parameters
organizationIdRequired
path · string
projectIdRequired
path · string
appIdRequired
path · string
pageIdRequired
path · string
BodyRequired
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.
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 { pages } = await gc.website.listWebsitePages({  organizationId: org.id,  projectId: projects[0].id,  appId: apps[0].id,});
const result = await gc.website.updateWebsitePageMeta({  organizationId: org.id,  projectId: projects[0].id,  appId: apps[0].id,  pageId: pages[0].id,  data: { title: "Updated Page Title" },});
GET

List a site's pages with slug, live URL and publish status, newest first

/organizations/{organizationId}/projects/{projectId}/apps/website/{appId}/pages

Returns a list of all pages for this website app. Each page includes its title, slug, publish status, SEO metadata, and associated header/footer/sidebar references.

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, slug, status, createdAt, updatedAt. Direction is 'asc' or 'desc' and defaults to 'asc'.
search
query · stringFree-text search. Matched against: name, slug.
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).
slug
query · stringFilter by slug. Operators: slug=value (equals), slug_ne, slug_gt, slug_gte, slug_lt, slug_lte, slug_like (contains), slug_isnull=true|false, slug_has=value (jsonb array contains), slug[]=a&slug[]=b (in).
isPublic
query · stringFilter by isPublic. Operators: isPublic=value (equals), isPublic_ne, isPublic_gt, isPublic_gte, isPublic_lt, isPublic_lte, isPublic_like (contains), isPublic_isnull=true|false, isPublic_has=value (jsonb array contains), isPublic[]=a&isPublic[]=b (in).
layoutId
query · stringFilter by layoutId. Operators: layoutId=value (equals), layoutId_ne, layoutId_gt, layoutId_gte, layoutId_lt, layoutId_lte, layoutId_like (contains), layoutId_isnull=true|false, layoutId_has=value (jsonb array contains), layoutId[]=a&layoutId[]=b (in).
headerId
query · stringFilter by headerId. Operators: headerId=value (equals), headerId_ne, headerId_gt, headerId_gte, headerId_lt, headerId_lte, headerId_like (contains), headerId_isnull=true|false, headerId_has=value (jsonb array contains), headerId[]=a&headerId[]=b (in).
footerId
query · stringFilter by footerId. Operators: footerId=value (equals), footerId_ne, footerId_gt, footerId_gte, footerId_lt, footerId_lte, footerId_like (contains), footerId_isnull=true|false, footerId_has=value (jsonb array contains), footerId[]=a&footerId[]=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).
updatedAt
query · stringFilter by updatedAt. Operators: updatedAt=value (equals), updatedAt_ne, updatedAt_gt, updatedAt_gte, updatedAt_lt, updatedAt_lte, updatedAt_like (contains), updatedAt_isnull=true|false, updatedAt_has=value (jsonb array contains), updatedAt[]=a&updatedAt[]=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 { data: pages } = await gc.website.listWebsitePages({  organizationId: org.id,  projectId: projects[0].id,  appId: apps[0].id,});
POST

Create a page shell; content optional and status defaults to published, live immediately

/organizations/{organizationId}/projects/{projectId}/apps/website/{appId}/pages

Creates a new website page. Requires a title. Optionally set slug, content blocks, SEO metadata, header, footer, and sidebar references.

Parameters
organizationIdRequired
path · string
projectIdRequired
path · string
appIdRequired
path · string
BodyRequired
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.
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 page = await gc.website.createWebsitePage({  organizationId: org.id,  projectId: projects[0].id,  appId: apps[0].id,  data: {    title: "My New Page",    path: "/my-new-page"  }});
GET

Get one blog post with its full content blocks, tags and SEO fields

/organizations/{organizationId}/projects/{projectId}/apps/website/{appId}/posts/{postId}

Returns a single blog post by ID, including title, slug, full content blocks, excerpt, tags, author, featured image, SEO metadata, and publish status.

Parameters
organizationIdRequired
path · string
projectIdRequired
path · string
appIdRequired
path · string
postIdRequired
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 { posts } = await gc.website.listWebsitePosts({  organizationId: org.id,  projectId: projects[0].id,  appId: apps[0].id,});
const post = await gc.website.getWebsitePost({  organizationId: org.id,  projectId: projects[0].id,  appId: apps[0].id,  postId: posts[0].id,});
DELETE

Delete blog post

/organizations/{organizationId}/projects/{projectId}/apps/website/{appId}/posts/{postId}

Soft-deletes a blog post by moving it to the project trash. Can be restored from trash later.

Parameters
organizationIdRequired
path · string
projectIdRequired
path · string
appIdRequired
path · string
postIdRequired
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 { posts } = await gc.website.listWebsitePosts({  organizationId: org.id,  projectId: projects[0].id,  appId: apps[0].id,});
const response = await gc.website.deleteWebsitePost({  organizationId: org.id,  projectId: projects[0].id,  appId: apps[0].id,  postId: posts[0].id,});
PATCH

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}

Updates the fields that describe a post rather than govern it: SEO title and description, excerpt, author name, publish date, tags and featured image. Only the fields you send are changed. Can rebind the layout, header and footer. Cannot change the post's content or status — use the block tools for content and publishContent to take it live.

Parameters
organizationIdRequired
path · string
projectIdRequired
path · string
appIdRequired
path · string
postIdRequired
path · string
BodyRequired
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.
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 projectId = projects[0].id;
const appId = "app-123";const postId = "post-123";const data = { key: "value" };
const result = await gc.website.updateWebsitePostMeta({  organizationId,  projectId,  appId,  postId,  data});
GET

List blog posts in a site, newest first, with author, tags and status

/organizations/{organizationId}/projects/{projectId}/apps/website/{appId}/posts

Returns a paginated list of all blog posts for this website app. Each post includes title, slug, excerpt, publish status, author, tags, and featured image.

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, slug, status, publishDate, authorName, createdAt, updatedAt. Direction is 'asc' or 'desc' and defaults to 'asc'.
search
query · stringFree-text search. Matched against: name, slug.
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).
slug
query · stringFilter by slug. Operators: slug=value (equals), slug_ne, slug_gt, slug_gte, slug_lt, slug_lte, slug_like (contains), slug_isnull=true|false, slug_has=value (jsonb array contains), slug[]=a&slug[]=b (in).
isPublic
query · stringFilter by isPublic. Operators: isPublic=value (equals), isPublic_ne, isPublic_gt, isPublic_gte, isPublic_lt, isPublic_lte, isPublic_like (contains), isPublic_isnull=true|false, isPublic_has=value (jsonb array contains), isPublic[]=a&isPublic[]=b (in).
authorId
query · stringFilter by authorId. Operators: authorId=value (equals), authorId_ne, authorId_gt, authorId_gte, authorId_lt, authorId_lte, authorId_like (contains), authorId_isnull=true|false, authorId_has=value (jsonb array contains), authorId[]=a&authorId[]=b (in).
authorName
query · stringFilter by authorName. Operators: authorName=value (equals), authorName_ne, authorName_gt, authorName_gte, authorName_lt, authorName_lte, authorName_like (contains), authorName_isnull=true|false, authorName_has=value (jsonb array contains), authorName[]=a&authorName[]=b (in).
publishDate
query · stringFilter by publishDate. Operators: publishDate=value (equals), publishDate_ne, publishDate_gt, publishDate_gte, publishDate_lt, publishDate_lte, publishDate_like (contains), publishDate_isnull=true|false, publishDate_has=value (jsonb array contains), publishDate[]=a&publishDate[]=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).
updatedAt
query · stringFilter by updatedAt. Operators: updatedAt=value (equals), updatedAt_ne, updatedAt_gt, updatedAt_gte, updatedAt_lt, updatedAt_lte, updatedAt_like (contains), updatedAt_isnull=true|false, updatedAt_has=value (jsonb array contains), updatedAt[]=a&updatedAt[]=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 { posts } = await gc.website.listWebsitePosts({  organizationId: org.id,  projectId: projects[0].id,  appId: apps[0].id,});
POST

Create a blog post; status defaults to draft, unlike createWebsitePage

/organizations/{organizationId}/projects/{projectId}/apps/website/{appId}/posts

Creates a new blog post. Requires a name and slug. Optionally set content blocks, excerpt, tags, featured image, SEO metadata, and publish status.

Parameters
organizationIdRequired
path · string
projectIdRequired
path · string
appIdRequired
path · string
BodyRequired
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.
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 post = await gc.website.createWebsitePost({  organizationId: org.id,  projectId: projects[0].id,  appId: apps[0].id,  data: {    title: "My New Post",    content: "This is the content of the post."  }});
GET

Get one URL redirect by id

/organizations/{organizationId}/projects/{projectId}/apps/website/{appId}/redirects/{redirectId}

Returns a single URL redirect by ID, including its fromPath, toPath, status and source.

Parameters
organizationIdRequired
path · string
projectIdRequired
path · string
appIdRequired
path · string
redirectIdRequired
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 { redirects } = await gc.website.listWebsiteRedirects({  organizationId: org.id,  projectId: projects[0].id,  appId: apps[0].id,});
const redirect = await gc.website.getWebsiteRedirect({  organizationId: org.id,  projectId: projects[0].id,  appId: apps[0].id,  redirectId: redirects[0].id,});
GET

List a site's URL redirects, newest first, with from, to, status and source

/organizations/{organizationId}/projects/{projectId}/apps/website/{appId}/redirects

Returns a paginated list of the URL redirects for this website app. Each maps an old path (fromPath) to the current path (toPath) with a status (301 or 308) and a source: auto (recorded when a slug changed) or manual (added by hand).

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: fromPath, toPath, source, status, createdAt, updatedAt. Direction is 'asc' or 'desc' and defaults to 'asc'.
search
query · stringFree-text search. Matched against: fromPath, toPath.
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).
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).
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).
updatedAt
query · stringFilter by updatedAt. Operators: updatedAt=value (equals), updatedAt_ne, updatedAt_gt, updatedAt_gte, updatedAt_lt, updatedAt_lte, updatedAt_like (contains), updatedAt_isnull=true|false, updatedAt_has=value (jsonb array contains), updatedAt[]=a&updatedAt[]=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 { redirects } = await gc.website.listWebsiteRedirects({  organizationId: org.id,  projectId: projects[0].id,  appId: apps[0].id,});
GET

Get one sidebar with its full block tree, which lite listings omit

/organizations/{organizationId}/projects/{projectId}/apps/website/{appId}/sidebars/{sidebarId}

Returns a single website sidebar by ID, including its name, content blocks, and timestamps.

Parameters
organizationIdRequired
path · string
projectIdRequired
path · string
appIdRequired
path · string
sidebarIdRequired
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 { sidebars } = await gc.website.listWebsiteSidebars({  organizationId: org.id,  projectId: projects[0].id,  appId: apps[0].id,});
const sidebar = await gc.website.getWebsiteSidebar({  organizationId: org.id,  projectId: projects[0].id,  appId: apps[0].id,  sidebarId: sidebars[0].id,});
DELETE

Delete website sidebar

/organizations/{organizationId}/projects/{projectId}/apps/website/{appId}/sidebars/{sidebarId}

Permanently deletes a website sidebar component.

Parameters
organizationIdRequired
path · string
projectIdRequired
path · string
appIdRequired
path · string
sidebarIdRequired
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 result = await gc.website.deleteWebsiteSidebar({  organizationId: org.id,  projectId: projects[0].id,  appId: "app-id",  sidebarId: "sidebar-id"});
GET

List a site's sidebars newest first, each with its block tree unless lite

/organizations/{organizationId}/projects/{projectId}/apps/website/{appId}/sidebars

Returns a list of all sidebar components for this website app. Sidebars are reusable layout sections displayed alongside page content.

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, createdAt, updatedAt. Direction is 'asc' or 'desc' and defaults to 'asc'.
search
query · stringFree-text search. Matched against: name.
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).
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).
updatedAt
query · stringFilter by updatedAt. Operators: updatedAt=value (equals), updatedAt_ne, updatedAt_gt, updatedAt_gte, updatedAt_lt, updatedAt_lte, updatedAt_like (contains), updatedAt_isnull=true|false, updatedAt_has=value (jsonb array contains), updatedAt[]=a&updatedAt[]=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 { sidebars } = await gc.website.listWebsiteSidebars({  organizationId: org.id,  projectId: projects[0].id,  appId: apps[0].id,});
POST

Create a reusable sidebar shell; a layoutSidebar block points at it by id

/organizations/{organizationId}/projects/{projectId}/apps/website/{appId}/sidebars

Creates a new sidebar component for this website app.

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 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 sidebar = await gc.website.createWebsiteSidebar({  organizationId: org.id,  projectId: projects[0].id,  appId: apps[0].id,  data: { name: "Main Sidebar" },});
GET

List the tag names in use across a site's pages and posts

/organizations/{organizationId}/projects/{projectId}/apps/website/{appId}/tags

Returns a list of all tags used across pages and posts in this website app. Tags are used for categorization and filtering.

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: tag. Direction is 'asc' or 'desc' and defaults to 'asc'.
search
query · stringFree-text search. Matched against: tag.
tag
query · stringFilter by tag. Operators: tag=value (equals), tag_ne, tag_gt, tag_gte, tag_lt, tag_lte, tag_like (contains), tag_isnull=true|false, tag_has=value (jsonb array contains), tag[]=a&tag[]=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 { tags } = await gc.website.listWebsiteTags({  organizationId: org.id,  projectId: projects[0].id,  appId: apps[0].id,});
GET

Get the site's Google Tag Manager container ID, the only tracking setting

/organizations/{organizationId}/projects/{projectId}/apps/website/{appId}/tracking

Returns the tracking configuration for this website app, including Google Tag Manager container ID.

Parameters
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 settings = await gc.website.getWebsiteTrackingSettings({  organizationId: org.id,  projectId: projects[0].id,  appId: apps[0].id,});
GET

Get existing page slugs and each page's layout, to avoid duplicate slugs

/organizations/{organizationId}/projects/{projectId}/apps/website/{appId}/urls

Returns existing page slugs (to avoid duplicate URLs) and per-page entries with the layout each page uses (the builder's peer-usage signal for layout selection).

Parameters
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 { urls } = await gc.website.getWebsiteUrls({  organizationId: org.id,  projectId: projects[0].id,  appId: apps[0].id,});

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
Website | Giant Context