Giant Context
Giant ContextGet 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}

Retrieves a single knowledge base article by its ID, including its full rich text content, publish status, SEO metadata, and associated category IDs. Returns 404 if the article does not exist or has been soft-deleted.

Parameters
organizationIdRequired
path · string
projectIdRequired
path · string
appIdRequired
path · string
articleIdRequired
path · string
SDK
import osfrom giantcontext import GiantContext
gc = GiantContext(api_key=os.environ["GIANTCONTEXT_API_KEY"])
orgs = gc.me.list_my_organizations()org_id = orgs.items[0].id
projects = gc.projects.list_projects(organization_id=org_id)project_id = projects.items[0].id
app_id = "your_app_id"article_id = "your_article_id"
article = gc.kb.get_kb_article(    organization_id=org_id,    project_id=project_id,    app_id=app_id,    article_id=article_id)
DELETE

Delete KB article

/organizations/{organizationId}/projects/{projectId}/apps/kb/{appId}/articles/{articleId}

Soft-deletes a knowledge base article by moving it to the trash. Also removes the article from the AI knowledge base. Returns 404 if the article does not exist or is already deleted.

Parameters
organizationIdRequired
path · string
projectIdRequired
path · string
appIdRequired
path · string
articleIdRequired
path · string
SDK
import osfrom giantcontext import GiantContext
gc = GiantContext(api_key=os.environ["GIANTCONTEXT_API_KEY"])
orgs = gc.me.list_my_organizations()org_id = orgs.items[0].id
projects = gc.projects.list_projects(organization_id=org_id)project_id = projects.items[0].id
apps = gc.projects.list_project_apps(organization_id=org_id, project_id=project_id)app_id = apps.items[0].id
articles = gc.kb.list_kb_articles(    organization_id=org_id,    project_id=project_id,    app_id=app_id)article_id = articles.items[0].id
result = gc.kb.delete_kb_article(    organization_id=org_id,    project_id=project_id,    app_id=app_id,    article_id=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}

Updates the fields that describe a knowledge base article rather than govern it: SEO title, description, image and noindex, plus the excerpt, tags and featured image. Only the fields you send are changed. Can rebind the layout, header and footer. Cannot change the article's content, status, visibility, order or category assignments — use publishContent to take it live.

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 osfrom giantcontext import GiantContext
gc = GiantContext(api_key=os.environ["GIANTCONTEXT_API_KEY"])
orgs = gc.me.list_my_organizations()org_id = orgs.items[0].id
projects = gc.projects.list_projects()project_id = projects.items[0].id
result = gc.kb.update_kb_article_meta(    organization_id=org_id,    project_id=project_id,    app_id="app_id_placeholder",    article_id="article_id_placeholder",    data={"meta_key": "meta_value"})
GET

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

/organizations/{organizationId}/projects/{projectId}/apps/kb/{appId}/articles

Lists all knowledge base articles for the specified app, with support for pagination, filtering by category, filtering by publish status, and full-text search across names and slugs. Returns articles sorted by creation date (newest first) by default.

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, isPublic, createdAt, updatedAt, publishedAt. Direction is 'asc' or 'desc' and defaults to 'asc'.
search
query · stringFree-text search. Matched against: name, slug.
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).
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).
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).
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).
categoryId
query · stringFilter by categoryId. Operators: categoryId=value (equals), categoryId_ne, categoryId_gt, categoryId_gte, categoryId_lt, categoryId_lte, categoryId_like (contains), categoryId_isnull=true|false, categoryId_has=value (jsonb array contains), categoryId[]=a&categoryId[]=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).
publishedAt
query · stringFilter by publishedAt. Operators: publishedAt=value (equals), publishedAt_ne, publishedAt_gt, publishedAt_gte, publishedAt_lt, publishedAt_lte, publishedAt_like (contains), publishedAt_isnull=true|false, publishedAt_has=value (jsonb array contains), publishedAt[]=a&publishedAt[]=b (in).
organizationIdRequired
path · string
projectIdRequired
path · string
appIdRequired
path · string
SDK
import osfrom giantcontext import GiantContext
gc = GiantContext(api_key=os.environ["GIANTCONTEXT_API_KEY"])
orgs = gc.me.list_my_organizations()org = orgs.items[0]
projects = gc.projects.list_projects(organization_id=org.id)project = projects.items[0]
apps = gc.projects.list_project_apps(organization_id=org.id, project_id=project.id)app = apps.items[0]
articles = gc.kb.list_kb_articles(    organization_id=org.id,    project_id=project.id,    app_id=app.id)
POST

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

/organizations/{organizationId}/projects/{projectId}/apps/kb/{appId}/articles

Creates a new knowledge base article in the specified app. Validates slug uniqueness, automatically assigns display order, and optionally associates the article with categories. If the article is created with 'published' status and has content, it is automatically ingested into the AI knowledge base for search and retrieval.

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
isPublic
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 osfrom giantcontext import GiantContext
gc = GiantContext(api_key=os.environ["GIANTCONTEXT_API_KEY"])
orgs = gc.me.list_my_organizations()org_id = orgs.items[0].id
projects = gc.projects.list_projects()project_id = projects.items[0].id
article = gc.kb.create_kb_article(    organization_id=org_id,    project_id=project_id,    app_id="app_123",    data={"title": "My KB Article", "content": "Article content here"})
GET

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

/organizations/{organizationId}/projects/{projectId}/apps/kb/{appId}/categories/{categoryId}

Retrieves a single knowledge base category by its ID, including its name, slug, description, parent relationship, icon, and display order. Returns 404 if the category does not exist or has been soft-deleted.

Parameters
organizationIdRequired
path · string
projectIdRequired
path · string
appIdRequired
path · string
categoryIdRequired
path · string
SDK
import osfrom giantcontext import GiantContext
gc = GiantContext(api_key=os.environ["GIANTCONTEXT_API_KEY"])
orgs = gc.me.list_my_organizations()org_id = orgs.items[0].id
projects = gc.projects.list_projects(organization_id=org_id)project_id = projects.items[0].id
category = gc.kb.get_kb_category(    organization_id=org_id,    project_id=project_id,    app_id="your_app_id",    category_id="your_category_id")
DELETE

Delete KB category

/organizations/{organizationId}/projects/{projectId}/apps/kb/{appId}/categories/{categoryId}

Soft-deletes a knowledge base category by moving it to the trash. Returns 404 if the category does not exist or is already deleted.

Parameters
organizationIdRequired
path · string
projectIdRequired
path · string
appIdRequired
path · string
categoryIdRequired
path · string
SDK
import osfrom giantcontext import GiantContext
gc = GiantContext(api_key=os.environ["GIANTCONTEXT_API_KEY"])
orgs = gc.me.list_my_organizations()projects = gc.projects.list_projects(organization_id=orgs.items[0].id)
result = gc.kb.delete_kb_category(    organization_id=orgs.items[0].id,    project_id=projects.items[0].id,    app_id="your_app_id",    category_id="your_category_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}

Updates a knowledge base category's name and its description, the blurb shown beneath it in listings and on its own page. Only the fields you send are changed. A category has no separate title, so name IS the label a reader sees, and it is translatable. Cannot change the category's slug or icon, reorder it, or move it in the hierarchy — a category slug sits in the public path of every article beneath it and re-slugging leaves no redirect.

Parameters
organizationIdRequired
path · string
projectIdRequired
path · string
appIdRequired
path · string
categoryIdRequired
path · string
BodyRequired
name
unionThe category label a reader sees, per locale. Categories have no separate title: this IS the public string. Send a locale map like {"en": "..."} on a multilingual project.
description
union
SDK
import osfrom giantcontext import GiantContext
gc = GiantContext(api_key=os.environ["GIANTCONTEXT_API_KEY"])
orgs = gc.me.list_my_organizations()org_id = orgs.items[0].id
projects = gc.projects.list_projects(organization_id=org_id)project_id = projects.items[0].id
result = gc.kb.update_kb_category_meta(    organization_id=org_id,    project_id=project_id,    app_id="app_123",    category_id="cat_123",    data={"key": "value"})
GET

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

/organizations/{organizationId}/projects/{projectId}/apps/kb/{appId}/categories

Lists all knowledge base categories for the specified app, returned as a hierarchical tree structure. Categories are nested under their parent categories and sorted by their display order. Includes all active (non-deleted) categories.

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, order, createdAt, updatedAt. Direction is 'asc' or 'desc' and defaults to 'asc'.
search
query · stringFree-text search. Matched against: name, slug, description.
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).
icon
query · stringFilter by icon. Operators: icon=value (equals), icon_ne, icon_gt, icon_gte, icon_lt, icon_lte, icon_like (contains), icon_isnull=true|false, icon_has=value (jsonb array contains), icon[]=a&icon[]=b (in).
organizationIdRequired
path · string
projectIdRequired
path · string
appIdRequired
path · string
SDK
import osfrom giantcontext import GiantContext
gc = GiantContext(api_key=os.environ["GIANTCONTEXT_API_KEY"])
orgs = gc.me.list_my_organizations()org_id = orgs.items[0].id
projects = gc.projects.list_projects(organization_id=org_id)project_id = projects.items[0].id
apps = gc.projects.list_project_apps(organization_id=org_id, project_id=project_id)app_id = apps.items[0].id
categories = gc.kb.list_kb_categories(    organization_id=org_id,    project_id=project_id,    app_id=app_id)
POST

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

/organizations/{organizationId}/projects/{projectId}/apps/kb/{appId}/categories

Creates a new knowledge base category in the specified app. Validates slug uniqueness, automatically assigns display order among sibling categories, and supports hierarchical nesting via the parentId field. Categories are used to organize articles within the knowledge base.

Parameters
organizationIdRequired
path · string
projectIdRequired
path · string
appIdRequired
path · string
BodyRequired
icon
union
nameRequired
any
slugRequired
string
order
number
parentId
union
description
any
SDK
import osfrom giantcontext import GiantContext
gc = GiantContext(api_key=os.environ["GIANTCONTEXT_API_KEY"])
orgs = gc.me.list_my_organizations()org = orgs.items[0]
projects = gc.projects.list_projects(organization_id=org.id)project = projects.items[0]
apps = gc.projects.list_project_apps(    organization_id=org.id,    project_id=project.id)app = apps.items[0]
category = gc.kb.create_kb_category(    organization_id=org.id,    project_id=project.id,    app_id=app.id,    data={"name": "New Category"})
PATCH

Update knowledge base landing page metadata

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

Updates the SEO title, description and image of the knowledge base landing page. Only the fields you send are changed. Can rebind its website, layout, header and footer. Cannot replace the landing's builder content or change its visibility.

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 osfrom giantcontext import GiantContext
gc = GiantContext(api_key=os.environ["GIANTCONTEXT_API_KEY"])
orgs = gc.me.list_my_organizations()org_id = orgs.items[0].id
projects = gc.projects.list_projects(organization_id=org_id)project_id = projects.items[0].id
result = gc.kb.update_kb_landing_meta(    organization_id=org_id,    project_id=project_id,    app_id="app_id_placeholder",    data={"key": "value"})
GET

Get one URL redirect by id

/organizations/{organizationId}/projects/{projectId}/apps/kb/{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 osfrom giantcontext import GiantContext
gc = GiantContext(api_key=os.environ["GIANTCONTEXT_API_KEY"])
orgs = gc.me.list_my_organizations()projects = gc.projects.list_projects(organization_id=orgs.items[0].id)
redirect = gc.kb.get_kb_redirect(    organization_id=orgs.items[0].id,    project_id=projects.items[0].id,    app_id="app_id",    redirect_id="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

Returns a paginated list of the URL redirects for this knowledge base 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 osfrom giantcontext import GiantContext
gc = GiantContext(api_key=os.environ["GIANTCONTEXT_API_KEY"])
org = gc.me.list_my_organizations().items[0]project = gc.projects.list_projects(organization_id=org.id).items[0]app = gc.projects.list_project_apps(organization_id=org.id, project_id=project.id).items[0]
redirects = gc.kb.list_kb_redirects(    organization_id=org.id,    project_id=project.id,    app_id=app.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
KB | Giant Context