Giant Context
Giant ContextAsk for early access

KB

Manage knowledge base articles and categories.


GET

Get one article including its full content tree, status, SEO and category ids

/organizations/{organizationId}/projects/{projectId}/apps/kb/{appId}/articles/{articleId}
Parameters
organizationIdRequired
path · string
projectIdRequired
path · string
appIdRequired
path · string
articleIdRequired
path · string
SDK
import { createGiantContext } from "@giantcontext/sdk-typescript";
const gc = createGiantContext({ apiKey: process.env.GIANTCONTEXT_API_KEY! });
const { organizations: orgs } = await gc.me.listMyOrganizations();const { projects } = await gc.projects.listProjects({ organizationId: orgs[0].id });const { apps } = await gc.projects.listProjectApps({  organizationId: orgs[0].id,  projectId: projects[0].id,});const { articles } = await gc.kb.listKbArticles({  organizationId: orgs[0].id,  projectId: projects[0].id,  appId: apps[0].id,});
const { article } = await gc.kb.getKbArticle({  organizationId: orgs[0].id,  projectId: projects[0].id,  appId: apps[0].id,  articleId: articles[0].id,});
DELETE

Delete KB article

/organizations/{organizationId}/projects/{projectId}/apps/kb/{appId}/articles/{articleId}
Parameters
organizationIdRequired
path · string
projectIdRequired
path · string
appIdRequired
path · string
articleIdRequired
path · string
SDK
import { createGiantContext } from "@giantcontext/sdk-typescript";
const gc = createGiantContext({ apiKey: process.env.GIANTCONTEXT_API_KEY! });
const { organizations: orgs } = await gc.me.listMyOrganizations();const { projects } = await gc.projects.listProjects({ organizationId: orgs[0].id });
const result = await gc.kb.deleteKbArticle({  organizationId: orgs[0].id,  projectId: projects[0].id,  appId: "app-id",  articleId: "article-id",});
PATCH

Update an article's name, title, slug, SEO fields, excerpt, tags and featured image; cannot publish or edit content

/organizations/{organizationId}/projects/{projectId}/apps/kb/{appId}/articles/{articleId}
Parameters
organizationIdRequired
path · string
projectIdRequired
path · string
appIdRequired
path · string
articleIdRequired
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.
websiteAppId
unionThe website app whose shell this borrows. Discover ids with listProjectApps (appType website).
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 article.
SDK
import { createGiantContext } from "@giantcontext/sdk-typescript";
const gc = createGiantContext({ apiKey: process.env.GIANTCONTEXT_API_KEY! });
const { organizations: orgs } = await gc.me.listMyOrganizations();const { projects } = await gc.projects.listProjects({ organizationId: orgs[0].id });
const result = await gc.kb.updateKbArticleMeta({  organizationId: orgs[0].id,  projectId: projects[0].id,  appId: "app-id",  articleId: "article-id",  data: {}});
GET

List articles in one KB app, newest first; pass lite=true to omit huge content

/organizations/{organizationId}/projects/{projectId}/apps/kb/{appId}/articles
Parameters
page
query · number
pageSize
query · number
lite
query · string
sort
query · string
search
query · string
name
query · string
slug
query · string
status
query · string
isListed
query · string
categoryId
query · string
createdAt
query · string
updatedAt
query · string
publishedAt
query · string
organizationIdRequired
path · string
projectIdRequired
path · string
appIdRequired
path · string
SDK
import { createGiantContext } from "@giantcontext/sdk-typescript";
const gc = createGiantContext({ apiKey: process.env.GIANTCONTEXT_API_KEY! });
const { organizations: orgs } = await gc.me.listMyOrganizations();const { projects } = await gc.projects.listProjects({ organizationId: orgs[0].id });const { apps } = await gc.projects.listProjectApps({  organizationId: orgs[0].id,  projectId: projects[0].id,});
const { articles } = await gc.kb.listKbArticles({  organizationId: orgs[0].id,  projectId: projects[0].id,  appId: apps[0].id,});
POST

Create an article shell; publishing with content also ingests it for AI chat

/organizations/{organizationId}/projects/{projectId}/apps/kb/{appId}/articles
Parameters
organizationIdRequired
path · string
projectIdRequired
path · string
appIdRequired
path · string
BodyRequired
seo
object
nameRequired
string
slugRequired
string
tags
array
order
number
title
any
status
union
content
array
excerpt
any
footerId
union
headerId
union
isListed
boolean
layoutId
union
categoryIds
array
websiteAppId
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 article.
SDK
import { createGiantContext } from "@giantcontext/sdk-typescript";
const gc = createGiantContext({ apiKey: process.env.GIANTCONTEXT_API_KEY! });
const { organizations: orgs } = await gc.me.listMyOrganizations();const { projects } = await gc.projects.listProjects({ organizationId: orgs[0].id });const { apps } = await gc.projects.listProjectApps({  organizationId: orgs[0].id,  projectId: projects[0].id,});
const { article } = await gc.kb.createKbArticle({  organizationId: orgs[0].id,  projectId: projects[0].id,  appId: apps[0].id,  data: {    title: "New KB Article",    content: "Article content goes here."  }});
GET

Get one category's name, slug, description, parent and order; not its articles

/organizations/{organizationId}/projects/{projectId}/apps/kb/{appId}/categories/{categoryId}
Parameters
organizationIdRequired
path · string
projectIdRequired
path · string
appIdRequired
path · string
categoryIdRequired
path · string
SDK
import { createGiantContext } from "@giantcontext/sdk-typescript";
const gc = createGiantContext({ apiKey: process.env.GIANTCONTEXT_API_KEY! });
const { organizations: orgs } = await gc.me.listMyOrganizations();const { projects } = await gc.projects.listProjects({ organizationId: orgs[0].id });const { apps } = await gc.projects.listProjectApps({  organizationId: orgs[0].id,  projectId: projects[0].id,});const { categories } = await gc.kb.listKbCategories({  organizationId: orgs[0].id,  projectId: projects[0].id,  appId: apps[0].id,});
const { category } = await gc.kb.getKbCategory({  organizationId: orgs[0].id,  projectId: projects[0].id,  appId: apps[0].id,  categoryId: categories[0].id,});
DELETE

Delete KB category

/organizations/{organizationId}/projects/{projectId}/apps/kb/{appId}/categories/{categoryId}
Parameters
organizationIdRequired
path · string
projectIdRequired
path · string
appIdRequired
path · string
categoryIdRequired
path · string
SDK
import { createGiantContext } from "@giantcontext/sdk-typescript";
const gc = createGiantContext({ apiKey: process.env.GIANTCONTEXT_API_KEY! });
const { organizations: orgs } = await gc.me.listMyOrganizations();const { projects } = await gc.projects.listProjects({ organizationId: orgs[0].id });const { apps } = await gc.projects.listProjectApps({  organizationId: orgs[0].id,  projectId: projects[0].id,});const { categories } = await gc.kb.listKbCategories({  organizationId: orgs[0].id,  projectId: projects[0].id,  appId: apps[0].id,});
const result = await gc.kb.deleteKbCategory({  organizationId: orgs[0].id,  projectId: projects[0].id,  appId: apps[0].id,  categoryId: categories[0].id,});
PATCH

Update a category's name and description; cannot re-slug, reorder or re-parent it

/organizations/{organizationId}/projects/{projectId}/apps/kb/{appId}/categories/{categoryId}
Parameters
organizationIdRequired
path · string
projectIdRequired
path · string
appIdRequired
path · string
categoryIdRequired
path · string
BodyRequired
name
stringThe internal handle. One string, never translated. Operators search and reference by this; readers never see it.
title
unionThe category label a reader sees, per locale. Send a locale map like {"en": "..."} on a multilingual project. The internal handle is `name` and is not reader-facing, so it is not editable here.
description
union
SDK
import { createGiantContext } from "@giantcontext/sdk-typescript";
const gc = createGiantContext({ apiKey: process.env.GIANTCONTEXT_API_KEY! });
const { organizations } = await gc.me.listMyOrganizations();const { projects } = await gc.projects.listProjects({ organizationId: organizations[0].id });
const result = await gc.kb.updateKbCategoryMeta({  organizationId: organizations[0].id,  projectId: projects[0].id,  appId: "app-id",  categoryId: "category-id",  data: {}});
GET

List a KB app's categories as a nested parent-child tree, roots paginated

/organizations/{organizationId}/projects/{projectId}/apps/kb/{appId}/categories
Parameters
page
query · number
pageSize
query · number
lite
query · string
sort
query · string
search
query · string
slug
query · string
icon
query · string
organizationIdRequired
path · string
projectIdRequired
path · string
appIdRequired
path · string
SDK
import { createGiantContext } from "@giantcontext/sdk-typescript";
const gc = createGiantContext({ apiKey: process.env.GIANTCONTEXT_API_KEY! });
const { organizations: orgs } = await gc.me.listMyOrganizations();const { projects } = await gc.projects.listProjects({ organizationId: orgs[0].id });const { apps } = await gc.projects.listProjectApps({  organizationId: orgs[0].id,  projectId: projects[0].id,});
const { categories } = await gc.kb.listKbCategories({  organizationId: orgs[0].id,  projectId: projects[0].id,  appId: apps[0].id,});
POST

Create a category, optionally nested under a parent; order assigned automatically

/organizations/{organizationId}/projects/{projectId}/apps/kb/{appId}/categories
Parameters
organizationIdRequired
path · string
projectIdRequired
path · string
appIdRequired
path · string
BodyRequired
icon
union
nameRequired
string
slugRequired
string
order
number
title
any
parentId
union
description
any
SDK
import { createGiantContext } from "@giantcontext/sdk-typescript";
const gc = createGiantContext({ apiKey: process.env.GIANTCONTEXT_API_KEY! });
const { organizations: orgs } = await gc.me.listMyOrganizations();const { projects } = await gc.projects.listProjects({ organizationId: orgs[0].id });const { apps } = await gc.projects.listProjectApps({  organizationId: orgs[0].id,  projectId: projects[0].id,});
const result = await gc.kb.createKbCategory({  organizationId: orgs[0].id,  projectId: projects[0].id,  appId: apps[0].id,  data: {    name: "New Category"  }});
PATCH

Update knowledge base landing page metadata

/organizations/{organizationId}/projects/{projectId}/apps/kb/{appId}/landing
Parameters
organizationIdRequired
path · string
projectIdRequired
path · string
appIdRequired
path · string
BodyRequired
seo
object
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.
websiteAppId
unionThe website app whose shell this landing borrows. Discover ids with listProjectApps (appType website).
SDK
import { createGiantContext } from "@giantcontext/sdk-typescript";
const gc = createGiantContext({ apiKey: process.env.GIANTCONTEXT_API_KEY! });
const { organizations: orgs } = await gc.me.listMyOrganizations();const { projects } = await gc.projects.listProjects({ organizationId: orgs[0].id });const { apps } = await gc.projects.listProjectApps({  organizationId: orgs[0].id,  projectId: projects[0].id,});
const result = await gc.kb.updateKbLandingMeta({  organizationId: orgs[0].id,  projectId: projects[0].id,  appId: apps[0].id,  data: {},});
GET

Get one URL redirect by id

/organizations/{organizationId}/projects/{projectId}/apps/kb/{appId}/redirects/{redirectId}
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 { organizations: orgs } = await gc.me.listMyOrganizations();const { projects } = await gc.projects.listProjects({ organizationId: orgs[0].id });
const redirect = await gc.kb.getKbRedirect({  organizationId: orgs[0].id,  projectId: projects[0].id,  appId: "app-id",  redirectId: "redirect-id",});
GET

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

/organizations/{organizationId}/projects/{projectId}/apps/kb/{appId}/redirects
Parameters
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
SDK
import { createGiantContext } from "@giantcontext/sdk-typescript";
const gc = createGiantContext({ apiKey: process.env.GIANTCONTEXT_API_KEY! });
const { organizations: orgs } = await gc.me.listMyOrganizations();const { projects } = await gc.projects.listProjects({ organizationId: orgs[0].id });const { apps } = await gc.projects.listProjectApps({  organizationId: orgs[0].id,  projectId: projects[0].id,});
const { redirects } = await gc.kb.listKbRedirects({  organizationId: orgs[0].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 Giant Context staff accepted and published.
Giant Context
Product
  • How It Works
  • Mind
  • Create
  • Capture
  • Nurture
  • Optimize
  • Publishing
  • Pricing
  • Use Cases

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