Reference

Content

Help articles, News posts and their taxonomy

See Content. These page with limit/offset, unlike the rest of the API.

archiveNewsPost

Mutation

ScopeCONTENT_MANAGE

Flip to ARCHIVED - hides from the visitor feed but preserves the row. Distinct from delete (hard-delete) and unpublish (back to drafts). Re-publish to undo.

Arguments

idID!Required

Returns

_idID!
organisationIdID!
integrationIds[ID!]!
titleString!
slugString
excerptString
contentMarkdownString!
bodyFormatString!
localeString!
translationGroupIdID
publishedAtDateTime
publishedByID
coverImageUrlMedia
externalCoverImageUrlString
archivedAtDateTime
scheduledForDateTime
viewCountInt!
reactionCountsJSON!
Per-slot reaction counts keyed by slotIndex (string). FE joins against reactionSet(NEWS) for emoji + sentiment.
viewerReactionInt
The current visitor's own reaction slotIndex on this item (per translation group), or null if they haven't reacted / aren't identified.
audienceModeNewsAudienceMode!
knowledgeAudienceKnowledgeAudience
Who the AI agent may answer from this post for (null = everyone; an AUTHED post is always at least signed-in). Does not change who can read it in the widget.
externalIdString
mutation {
  archiveNewsPost(id: "…") { _id organisationId integrationIds title slug }
}

createHelpArticle

Mutation

ScopeCONTENT_MANAGE

Create a draft help article. Articles always land as DRAFT - use publishHelpArticle to make them visible to visitors.

Arguments

CreateHelpArticleInput

integrationIds[ID!]
folderIdID
titleString!Required
slugString!Required
excerptString
contentString!Required
localeString!Required
authorIds[ID!]
tagIds[ID!]
canonicalUrlString
coverImageUrlID
orderInt
knowledgeAudienceKnowledgeAudienceInput
Who the AI may answer from this item for (EVERYONE clears it)

Returns

_idID!
organisationIdID!
integrationIds[ID!]!
ancestors[ID!]!
titleString!
slugString!
excerptString
contentString!
localeString!
translationGroupIdID
authors[User!]!
knowledgeAudienceKnowledgeAudience
Who the AI agent may answer from this article for (null = everyone). Does not change who can read it in the widget.
publishedAtDateTime
publishedByID
coverImageUrlMedia
orderInt!
viewCountInt!
reactionCountsJSON!
Per-slot reaction counts keyed by slotIndex (string). FE joins against reactionSet(HELP) for emoji + sentiment.
viewerReactionInt
The current visitor's own reaction slotIndex on this item (per translation group), or null if they haven't reacted / aren't identified.
canonicalUrlString
mutation {
  createHelpArticle(input: { … }) { _id organisationId integrationIds folder ancestors }
}

createHelpArticleTranslation

Mutation

ScopeCONTENT_MANAGE

Create a locale variant linked to an existing article (one logical article, grouped by translationGroupId). Mints the group on the source the first time; rejects a duplicate locale. Lands as DRAFT.

Arguments

sourceArticleIdID!Required

CreateHelpArticleInput

integrationIds[ID!]
folderIdID
titleString!Required
slugString!Required
excerptString
contentString!Required
localeString!Required
authorIds[ID!]
tagIds[ID!]
canonicalUrlString
coverImageUrlID
orderInt
knowledgeAudienceKnowledgeAudienceInput
Who the AI may answer from this item for (EVERYONE clears it)

Returns

_idID!
organisationIdID!
integrationIds[ID!]!
ancestors[ID!]!
titleString!
slugString!
excerptString
contentString!
localeString!
translationGroupIdID
authors[User!]!
knowledgeAudienceKnowledgeAudience
Who the AI agent may answer from this article for (null = everyone). Does not change who can read it in the widget.
publishedAtDateTime
publishedByID
coverImageUrlMedia
orderInt!
viewCountInt!
reactionCountsJSON!
Per-slot reaction counts keyed by slotIndex (string). FE joins against reactionSet(HELP) for emoji + sentiment.
viewerReactionInt
The current visitor's own reaction slotIndex on this item (per translation group), or null if they haven't reacted / aren't identified.
canonicalUrlString
mutation {
  createHelpArticleTranslation(sourceArticleId: "…", input: { … }) { _id organisationId integrationIds folder ancestors }
}

createHelpFolder

Mutation

ScopeCONTENT_MANAGE

Create a help folder. Pass `parentId` to nest it under another folder, or omit / send null for a root-level folder. Slug must be unique per parent.

Arguments

CreateHelpFolderInput

integrationIds[ID!]
nameString!Required
slugString!Required
descriptionString
parentIdID
orderInt

Returns

_idID!
organisationIdID!
integrationIds[ID!]!
nameString!
slugString!
descriptionString
nameI18nJSON
descriptionI18nJSON
parentIdID
ancestors[ID!]!
orderInt!
createdAtDateTime!
updatedAtDateTime!
articleCountInt!
Total published articles in this folder + all nested subfolders. Computed via a single countDocuments against the ancestors index.
mutation {
  createHelpFolder(input: { … }) { _id organisationId integrationIds name slug }
}

createHelpTag

Mutation

ScopeCONTENT_MANAGE

Create a help tag.

Arguments

inputCreateHelpTagInput!Required

CreateHelpTagInput

slugString!Required
labelString!Required
descriptionString

Returns

_idID!
organisationIdID!
slugString!
labelString!
labelI18nJSON
descriptionString
createdAtDateTime!
updatedAtDateTime!
mutation {
  createHelpTag(input: { … }) { _id organisationId slug label labelI18n }
}

createNewsCategory

Mutation

ScopeCONTENT_MANAGE

Create a news category. Slug must be unique per integration; auto-derive from label on the FE then operator can edit.

Arguments

CreateNewsCategoryInput

slugString!Required
labelString!Required
descriptionString

Returns

_idID!
organisationIdID!
slugString!
labelString!
labelI18nJSON
descriptionString
createdAtDateTime!
updatedAtDateTime!
mutation {
  createNewsCategory(input: { … }) { _id organisationId slug label labelI18n }
}

createNewsPost

Mutation

ScopeCONTENT_MANAGE

Create a draft news post. Always lands as DRAFT - use publishNewsPost to make it visitor-visible.

Arguments

CreateNewsPostInput

integrationIds[ID!]
titleString!Required
slugString!Required
excerptString
contentMarkdownString!Required
localeString!Required
coverImageUrlID
audienceModeNewsAudienceMode
authorIds[ID!]
categoryIds[ID!]
tagIds[ID!]
knowledgeAudienceKnowledgeAudienceInput
Who the AI may answer from this item for (EVERYONE clears it)

Returns

_idID!
organisationIdID!
integrationIds[ID!]!
titleString!
slugString
excerptString
contentMarkdownString!
bodyFormatString!
localeString!
translationGroupIdID
publishedAtDateTime
publishedByID
coverImageUrlMedia
externalCoverImageUrlString
archivedAtDateTime
scheduledForDateTime
viewCountInt!
reactionCountsJSON!
Per-slot reaction counts keyed by slotIndex (string). FE joins against reactionSet(NEWS) for emoji + sentiment.
viewerReactionInt
The current visitor's own reaction slotIndex on this item (per translation group), or null if they haven't reacted / aren't identified.
audienceModeNewsAudienceMode!
knowledgeAudienceKnowledgeAudience
Who the AI agent may answer from this post for (null = everyone; an AUTHED post is always at least signed-in). Does not change who can read it in the widget.
externalIdString
mutation {
  createNewsPost(input: { … }) { _id organisationId integrationIds title slug }
}

createNewsPostTranslation

Mutation

ScopeCONTENT_MANAGE

Create a locale variant linked to an existing post (one logical article, grouped by translationGroupId). Mints the group on the source the first time; rejects a duplicate locale in the group. Lands as DRAFT.

Arguments

sourcePostIdID!Required

CreateNewsPostInput

integrationIds[ID!]
titleString!Required
slugString!Required
excerptString
contentMarkdownString!Required
localeString!Required
coverImageUrlID
audienceModeNewsAudienceMode
authorIds[ID!]
categoryIds[ID!]
tagIds[ID!]
knowledgeAudienceKnowledgeAudienceInput
Who the AI may answer from this item for (EVERYONE clears it)

Returns

_idID!
organisationIdID!
integrationIds[ID!]!
titleString!
slugString
excerptString
contentMarkdownString!
bodyFormatString!
localeString!
translationGroupIdID
publishedAtDateTime
publishedByID
coverImageUrlMedia
externalCoverImageUrlString
archivedAtDateTime
scheduledForDateTime
viewCountInt!
reactionCountsJSON!
Per-slot reaction counts keyed by slotIndex (string). FE joins against reactionSet(NEWS) for emoji + sentiment.
viewerReactionInt
The current visitor's own reaction slotIndex on this item (per translation group), or null if they haven't reacted / aren't identified.
audienceModeNewsAudienceMode!
knowledgeAudienceKnowledgeAudience
Who the AI agent may answer from this post for (null = everyone; an AUTHED post is always at least signed-in). Does not change who can read it in the widget.
externalIdString
mutation {
  createNewsPostTranslation(sourcePostId: "…", input: { … }) { _id organisationId integrationIds title slug }
}

createNewsTag

Mutation

ScopeCONTENT_MANAGE

Create a news tag.

Arguments

inputCreateNewsTagInput!Required

CreateNewsTagInput

slugString!Required
labelString!Required
descriptionString

Returns

_idID!
organisationIdID!
slugString!
labelString!
labelI18nJSON
descriptionString
createdAtDateTime!
updatedAtDateTime!
mutation {
  createNewsTag(input: { … }) { _id organisationId slug label labelI18n }
}

deleteHelpArticle

Mutation

ScopeCONTENT_MANAGE

Hard-delete an article. No soft-delete in v1.

Arguments

idID!Required

Returns

Boolean!
mutation {
  deleteHelpArticle(id: "…")
}

deleteHelpFolder

Mutation

ScopeCONTENT_MANAGE

Delete a folder. Refuses when the folder has any direct child (folder OR article) - operator re-parents / deletes the children first. No cascade.

Arguments

idID!Required

Returns

Boolean!
mutation {
  deleteHelpFolder(id: "…")
}

deleteHelpTag

Mutation

ScopeCONTENT_MANAGE

Delete a help tag. Linked articles survive - the tag ref is detached via $pull, no cascade-delete of articles.

Arguments

idID!Required

Returns

Boolean!
mutation {
  deleteHelpTag(id: "…")
}

deleteNewsCategory

Mutation

ScopeCONTENT_MANAGE

Delete a news category. Posts referencing it survive - the ref is detached via $pull, no cascade-delete of posts.

Arguments

idID!Required

Returns

Boolean!
mutation {
  deleteNewsCategory(id: "…")
}

deleteNewsPost

Mutation

ScopeCONTENT_MANAGE

Hard-delete a news post.

Arguments

idID!Required

Returns

Boolean!
mutation {
  deleteNewsPost(id: "…")
}

deleteNewsTag

Mutation

ScopeCONTENT_MANAGE

Delete a news tag. Posts referencing it survive (refs detached).

Arguments

idID!Required

Returns

Boolean!
mutation {
  deleteNewsTag(id: "…")
}

helpArticle

Query

ScopeCONTENT_READ

Fetch a single article by id (operator view).

Arguments

idID!Required

Returns

_idID!
organisationIdID!
integrationIds[ID!]!
ancestors[ID!]!
titleString!
slugString!
excerptString
contentString!
localeString!
translationGroupIdID
authors[User!]!
knowledgeAudienceKnowledgeAudience
Who the AI agent may answer from this article for (null = everyone). Does not change who can read it in the widget.
publishedAtDateTime
publishedByID
coverImageUrlMedia
orderInt!
viewCountInt!
reactionCountsJSON!
Per-slot reaction counts keyed by slotIndex (string). FE joins against reactionSet(HELP) for emoji + sentiment.
viewerReactionInt
The current visitor's own reaction slotIndex on this item (per translation group), or null if they haven't reacted / aren't identified.
canonicalUrlString
query {
  helpArticle(id: "…") { _id organisationId integrationIds folder ancestors }
}

helpArticles

Query

ScopeCONTENT_READ

List articles for an integration (operator view). Returns `\{ items, meta \}`. Defaults to all statuses + folders, newest-created first, unbounded. Pass search / status / folderId / recursive / tagIds / sort / limit / offset to scope. `folderId: null` = root-level articles; `folderId` + `recursive: true` walks the entire subtree.

Arguments

integrationIdID
localeString
searchString
folderIdID
recursiveBoolean
tagIds[ID!]
Defaults to CREATED_DESC.
limitInt
offsetInt

Returns

List of items for current page
Pagination metadata
query {
  helpArticles(integrationId: "…", status: DRAFT, locale: "…", search: "…", folderId: "…", recursive: false, tagIds: "…", sort: CREATED_DESC, limit: 0, offset: 0) { items meta }
}

helpFolder

Query

ScopeCONTENT_READ

Fetch a folder by id.

Arguments

idID!Required

Returns

_idID!
organisationIdID!
integrationIds[ID!]!
nameString!
slugString!
descriptionString
nameI18nJSON
descriptionI18nJSON
parentIdID
ancestors[ID!]!
orderInt!
createdAtDateTime!
updatedAtDateTime!
articleCountInt!
Total published articles in this folder + all nested subfolders. Computed via a single countDocuments against the ancestors index.
query {
  helpFolder(id: "…") { _id organisationId integrationIds name slug }
}

helpFolderCounts

Query

ScopeCONTENT_READ

Recursive subtree counts - `\{ folders, articles \}` below this folder. Powers the badge on each folder card in the operator UI.

Arguments

idID!Required

Returns

foldersInt!
articlesInt!
query {
  helpFolderCounts(id: "…") { folders articles }
}

helpFolderCountsBatch

Query

ScopeCONTENT_READ

Batched subtree counts for many folders in one round-trip. Returns one row per requested id (unknown / cross-org ids return zeros). Use this instead of N×`helpFolderCounts` when rendering a tree.

Arguments

ids[ID!]!Required

Returns

folderIdID!
foldersInt!
articlesInt!
query {
  helpFolderCountsBatch(ids: "…") { folderId folders articles }
}

helpFolderTree

Query

ScopeCONTENT_READ

Every folder for an integration in one call. Sorted by ancestors then order - operator dashboard hydrates the whole tree without per-click round-trips.

Arguments

integrationIdID!Required

Returns

_idID!
organisationIdID!
integrationIds[ID!]!
nameString!
slugString!
descriptionString
nameI18nJSON
descriptionI18nJSON
parentIdID
ancestors[ID!]!
orderInt!
createdAtDateTime!
updatedAtDateTime!
articleCountInt!
Total published articles in this folder + all nested subfolders. Computed via a single countDocuments against the ancestors index.
query {
  helpFolderTree(integrationId: "…") { _id organisationId integrationIds name slug }
}

helpFolders

Query

ScopeCONTENT_READ

List child folders of `parentId` (or root-level when null/omitted). Use this for the operator dashboard's lazy-load tree view.

Arguments

integrationIdID!Required
parentIdID

Returns

_idID!
organisationIdID!
integrationIds[ID!]!
nameString!
slugString!
descriptionString
nameI18nJSON
descriptionI18nJSON
parentIdID
ancestors[ID!]!
orderInt!
createdAtDateTime!
updatedAtDateTime!
articleCountInt!
Total published articles in this folder + all nested subfolders. Computed via a single countDocuments against the ancestors index.
query {
  helpFolders(integrationId: "…", parentId: "…") { _id organisationId integrationIds name slug }
}

helpTag

Query

ScopeCONTENT_READ

Fetch a help tag by id.

Arguments

idID!Required

Returns

_idID!
organisationIdID!
slugString!
labelString!
labelI18nJSON
descriptionString
createdAtDateTime!
updatedAtDateTime!
query {
  helpTag(id: "…") { _id organisationId slug label labelI18n }
}

helpTags

Query

ScopeCONTENT_READ

List help tags for the organisation.

Returns

_idID!
organisationIdID!
slugString!
labelString!
labelI18nJSON
descriptionString
createdAtDateTime!
updatedAtDateTime!
query {
  helpTags { _id organisationId slug label labelI18n }
}

moveHelpFolder

Mutation

ScopeCONTENT_MANAGE

Move a folder to a new parent (or to root via `newParentId: null`). Refuses to move a folder into its own subtree (cycle). Recomputes ancestors for the folder + every descendant folder + every article in the moved subtree.

Arguments

idID!Required
newParentIdID

Returns

_idID!
organisationIdID!
integrationIds[ID!]!
nameString!
slugString!
descriptionString
nameI18nJSON
descriptionI18nJSON
parentIdID
ancestors[ID!]!
orderInt!
createdAtDateTime!
updatedAtDateTime!
articleCountInt!
Total published articles in this folder + all nested subfolders. Computed via a single countDocuments against the ancestors index.
mutation {
  moveHelpFolder(id: "…", newParentId: "…") { _id organisationId integrationIds name slug }
}

newsCategories

Query

ScopeCONTENT_READ

List news categories for the organisation.

Returns

_idID!
organisationIdID!
slugString!
labelString!
labelI18nJSON
descriptionString
createdAtDateTime!
updatedAtDateTime!
query {
  newsCategories { _id organisationId slug label labelI18n }
}

newsCategory

Query

ScopeCONTENT_READ

Fetch a news category by id.

Arguments

idID!Required

Returns

_idID!
organisationIdID!
slugString!
labelString!
labelI18nJSON
descriptionString
createdAtDateTime!
updatedAtDateTime!
query {
  newsCategory(id: "…") { _id organisationId slug label labelI18n }
}

newsPost

Query

ScopeCONTENT_READ

Fetch a single news post by id (operator view).

Arguments

idID!Required

Returns

_idID!
organisationIdID!
integrationIds[ID!]!
titleString!
slugString
excerptString
contentMarkdownString!
bodyFormatString!
localeString!
translationGroupIdID
publishedAtDateTime
publishedByID
coverImageUrlMedia
externalCoverImageUrlString
archivedAtDateTime
scheduledForDateTime
viewCountInt!
reactionCountsJSON!
Per-slot reaction counts keyed by slotIndex (string). FE joins against reactionSet(NEWS) for emoji + sentiment.
viewerReactionInt
The current visitor's own reaction slotIndex on this item (per translation group), or null if they haven't reacted / aren't identified.
audienceModeNewsAudienceMode!
knowledgeAudienceKnowledgeAudience
Who the AI agent may answer from this post for (null = everyone; an AUTHED post is always at least signed-in). Does not change who can read it in the widget.
externalIdString
query {
  newsPost(id: "…") { _id organisationId integrationIds title slug }
}

newsPosts

Query

ScopeCONTENT_READ

List news posts for an integration (operator view). Returns `\{ items, meta \}`. Defaults to all statuses, updatedAt-desc, unbounded. Pass status / search / categoryIds / tagIds / sort / limit / offset to scope.

Arguments

integrationIdID
localeString
searchString
categoryIds[ID!]
tagIds[ID!]
Defaults to CREATED_DESC.
limitInt
offsetInt

Returns

List of items for current page
Pagination metadata
query {
  newsPosts(integrationId: "…", status: DRAFT, locale: "…", search: "…", categoryIds: "…", tagIds: "…", sort: CREATED_DESC, limit: 0, offset: 0) { items meta }
}

newsTag

Query

ScopeCONTENT_READ

Fetch a news tag by id.

Arguments

idID!Required

Returns

_idID!
organisationIdID!
slugString!
labelString!
labelI18nJSON
descriptionString
createdAtDateTime!
updatedAtDateTime!
query {
  newsTag(id: "…") { _id organisationId slug label labelI18n }
}

newsTags

Query

ScopeCONTENT_READ

List news tags for the organisation.

Returns

_idID!
organisationIdID!
slugString!
labelString!
labelI18nJSON
descriptionString
createdAtDateTime!
updatedAtDateTime!
query {
  newsTags { _id organisationId slug label labelI18n }
}

publishHelpArticle

Mutation

ScopeCONTENT_MANAGE

Flip an article to PUBLISHED. Stamps publishedAt (drives visitor sort) + publishedBy. Re-publishing refreshes publishedAt - useful for surfacing tweaks at the top of the list.

Arguments

idID!Required

Returns

_idID!
organisationIdID!
integrationIds[ID!]!
ancestors[ID!]!
titleString!
slugString!
excerptString
contentString!
localeString!
translationGroupIdID
authors[User!]!
knowledgeAudienceKnowledgeAudience
Who the AI agent may answer from this article for (null = everyone). Does not change who can read it in the widget.
publishedAtDateTime
publishedByID
coverImageUrlMedia
orderInt!
viewCountInt!
reactionCountsJSON!
Per-slot reaction counts keyed by slotIndex (string). FE joins against reactionSet(HELP) for emoji + sentiment.
viewerReactionInt
The current visitor's own reaction slotIndex on this item (per translation group), or null if they haven't reacted / aren't identified.
canonicalUrlString
mutation {
  publishHelpArticle(id: "…") { _id organisationId integrationIds folder ancestors }
}

publishNewsPost

Mutation

ScopeCONTENT_MANAGE

Flip to PUBLISHED. Stamps publishedAt (drives visitor sort) + publishedBy. Re-publishing refreshes publishedAt - useful for surfacing tweaks at the top of the feed. Re-publishing an archived post clears archivedAt.

Arguments

idID!Required

Returns

_idID!
organisationIdID!
integrationIds[ID!]!
titleString!
slugString
excerptString
contentMarkdownString!
bodyFormatString!
localeString!
translationGroupIdID
publishedAtDateTime
publishedByID
coverImageUrlMedia
externalCoverImageUrlString
archivedAtDateTime
scheduledForDateTime
viewCountInt!
reactionCountsJSON!
Per-slot reaction counts keyed by slotIndex (string). FE joins against reactionSet(NEWS) for emoji + sentiment.
viewerReactionInt
The current visitor's own reaction slotIndex on this item (per translation group), or null if they haven't reacted / aren't identified.
audienceModeNewsAudienceMode!
knowledgeAudienceKnowledgeAudience
Who the AI agent may answer from this post for (null = everyone; an AUTHED post is always at least signed-in). Does not change who can read it in the widget.
externalIdString
mutation {
  publishNewsPost(id: "…") { _id organisationId integrationIds title slug }
}

scheduleNewsPost

Mutation

ScopeCONTENT_MANAGE

Stage a post for future publish at `scheduledFor`. Status flips to SCHEDULED; the scheduler tick promotes the row to PUBLISHED when scheduledFor \<= now. Refuses past-dated timestamps - use publishNewsPost for "publish now". Re-scheduling overwrites the timestamp.

Arguments

idID!Required
scheduledForDateTime!Required

Returns

_idID!
organisationIdID!
integrationIds[ID!]!
titleString!
slugString
excerptString
contentMarkdownString!
bodyFormatString!
localeString!
translationGroupIdID
publishedAtDateTime
publishedByID
coverImageUrlMedia
externalCoverImageUrlString
archivedAtDateTime
scheduledForDateTime
viewCountInt!
reactionCountsJSON!
Per-slot reaction counts keyed by slotIndex (string). FE joins against reactionSet(NEWS) for emoji + sentiment.
viewerReactionInt
The current visitor's own reaction slotIndex on this item (per translation group), or null if they haven't reacted / aren't identified.
audienceModeNewsAudienceMode!
knowledgeAudienceKnowledgeAudience
Who the AI agent may answer from this post for (null = everyone; an AUTHED post is always at least signed-in). Does not change who can read it in the widget.
externalIdString
mutation {
  scheduleNewsPost(id: "…", scheduledFor: { … }) { _id organisationId integrationIds title slug }
}

unpublishHelpArticle

Mutation

ScopeCONTENT_MANAGE

Flip an article back to DRAFT. Visitors stop seeing it; operator-side "last published" timestamp is preserved.

Arguments

idID!Required

Returns

_idID!
organisationIdID!
integrationIds[ID!]!
ancestors[ID!]!
titleString!
slugString!
excerptString
contentString!
localeString!
translationGroupIdID
authors[User!]!
knowledgeAudienceKnowledgeAudience
Who the AI agent may answer from this article for (null = everyone). Does not change who can read it in the widget.
publishedAtDateTime
publishedByID
coverImageUrlMedia
orderInt!
viewCountInt!
reactionCountsJSON!
Per-slot reaction counts keyed by slotIndex (string). FE joins against reactionSet(HELP) for emoji + sentiment.
viewerReactionInt
The current visitor's own reaction slotIndex on this item (per translation group), or null if they haven't reacted / aren't identified.
canonicalUrlString
mutation {
  unpublishHelpArticle(id: "…") { _id organisationId integrationIds folder ancestors }
}

unpublishNewsPost

Mutation

ScopeCONTENT_MANAGE

Flip back to DRAFT (for further edits). Preserves publishedAt so the operator UI can show "last published" history. Distinct from archiveNewsPost (which is a "final, retired" state).

Arguments

idID!Required

Returns

_idID!
organisationIdID!
integrationIds[ID!]!
titleString!
slugString
excerptString
contentMarkdownString!
bodyFormatString!
localeString!
translationGroupIdID
publishedAtDateTime
publishedByID
coverImageUrlMedia
externalCoverImageUrlString
archivedAtDateTime
scheduledForDateTime
viewCountInt!
reactionCountsJSON!
Per-slot reaction counts keyed by slotIndex (string). FE joins against reactionSet(NEWS) for emoji + sentiment.
viewerReactionInt
The current visitor's own reaction slotIndex on this item (per translation group), or null if they haven't reacted / aren't identified.
audienceModeNewsAudienceMode!
knowledgeAudienceKnowledgeAudience
Who the AI agent may answer from this post for (null = everyone; an AUTHED post is always at least signed-in). Does not change who can read it in the widget.
externalIdString
mutation {
  unpublishNewsPost(id: "…") { _id organisationId integrationIds title slug }
}

updateHelpArticle

Mutation

ScopeCONTENT_MANAGE

Patch operator-mutable fields on a draft / published article. Pass `folderId` to move the article between folders; the service recomputes ancestors so descendant queries stay accurate.

Arguments

idID!Required

UpdateHelpArticleInput

integrationIds[ID!]
folderIdID
titleString
slugString
excerptString
contentString
localeString
authorIds[ID!]
tagIds[ID!]
canonicalUrlString
coverImageUrlID
orderInt
knowledgeAudienceKnowledgeAudienceInput
Who the AI may answer from this item for (EVERYONE clears it)

Returns

_idID!
organisationIdID!
integrationIds[ID!]!
ancestors[ID!]!
titleString!
slugString!
excerptString
contentString!
localeString!
translationGroupIdID
authors[User!]!
knowledgeAudienceKnowledgeAudience
Who the AI agent may answer from this article for (null = everyone). Does not change who can read it in the widget.
publishedAtDateTime
publishedByID
coverImageUrlMedia
orderInt!
viewCountInt!
reactionCountsJSON!
Per-slot reaction counts keyed by slotIndex (string). FE joins against reactionSet(HELP) for emoji + sentiment.
viewerReactionInt
The current visitor's own reaction slotIndex on this item (per translation group), or null if they haven't reacted / aren't identified.
canonicalUrlString
mutation {
  updateHelpArticle(id: "…", input: { … }) { _id organisationId integrationIds folder ancestors }
}

updateHelpFolder

Mutation

ScopeCONTENT_MANAGE

Patch operator-mutable fields. `parentId` is NOT here - use moveHelpFolder so the service can recompute ancestors atomically.

Arguments

idID!Required

UpdateHelpFolderInput

integrationIds[ID!]
nameString
slugString
descriptionString
orderInt
nameI18nJSON
descriptionI18nJSON

Returns

_idID!
organisationIdID!
integrationIds[ID!]!
nameString!
slugString!
descriptionString
nameI18nJSON
descriptionI18nJSON
parentIdID
ancestors[ID!]!
orderInt!
createdAtDateTime!
updatedAtDateTime!
articleCountInt!
Total published articles in this folder + all nested subfolders. Computed via a single countDocuments against the ancestors index.
mutation {
  updateHelpFolder(id: "…", input: { … }) { _id organisationId integrationIds name slug }
}

updateHelpTag

Mutation

ScopeCONTENT_MANAGE

Patch a help tag.

Arguments

idID!Required
inputUpdateHelpTagInput!Required

UpdateHelpTagInput

slugString
labelString
labelI18nJSON
descriptionString

Returns

_idID!
organisationIdID!
slugString!
labelString!
labelI18nJSON
descriptionString
createdAtDateTime!
updatedAtDateTime!
mutation {
  updateHelpTag(id: "…", input: { … }) { _id organisationId slug label labelI18n }
}

updateNewsCategory

Mutation

ScopeCONTENT_MANAGE

Patch a news category. Slug-collision returns 400.

Arguments

idID!Required

UpdateNewsCategoryInput

slugString
labelString
labelI18nJSON
descriptionString

Returns

_idID!
organisationIdID!
slugString!
labelString!
labelI18nJSON
descriptionString
createdAtDateTime!
updatedAtDateTime!
mutation {
  updateNewsCategory(id: "…", input: { … }) { _id organisationId slug label labelI18n }
}

updateNewsPost

Mutation

ScopeCONTENT_MANAGE

Patch operator-mutable fields on a news post. Status flips go via dedicated mutations.

Arguments

idID!Required

UpdateNewsPostInput

integrationIds[ID!]
titleString
slugString
excerptString
contentMarkdownString
bodyFormatString
localeString
coverImageUrlID
audienceModeNewsAudienceMode
authorIds[ID!]
categoryIds[ID!]
tagIds[ID!]
knowledgeAudienceKnowledgeAudienceInput
Who the AI may answer from this item for (EVERYONE clears it)

Returns

_idID!
organisationIdID!
integrationIds[ID!]!
titleString!
slugString
excerptString
contentMarkdownString!
bodyFormatString!
localeString!
translationGroupIdID
publishedAtDateTime
publishedByID
coverImageUrlMedia
externalCoverImageUrlString
archivedAtDateTime
scheduledForDateTime
viewCountInt!
reactionCountsJSON!
Per-slot reaction counts keyed by slotIndex (string). FE joins against reactionSet(NEWS) for emoji + sentiment.
viewerReactionInt
The current visitor's own reaction slotIndex on this item (per translation group), or null if they haven't reacted / aren't identified.
audienceModeNewsAudienceMode!
knowledgeAudienceKnowledgeAudience
Who the AI agent may answer from this post for (null = everyone; an AUTHED post is always at least signed-in). Does not change who can read it in the widget.
externalIdString
mutation {
  updateNewsPost(id: "…", input: { … }) { _id organisationId integrationIds title slug }
}

updateNewsTag

Mutation

ScopeCONTENT_MANAGE

Patch a news tag.

Arguments

idID!Required
inputUpdateNewsTagInput!Required

UpdateNewsTagInput

slugString
labelString
labelI18nJSON
descriptionString

Returns

_idID!
organisationIdID!
slugString!
labelString!
labelI18nJSON
descriptionString
createdAtDateTime!
updatedAtDateTime!
mutation {
  updateNewsTag(id: "…", input: { … }) { _id organisationId slug label labelI18n }
}

On this page