{"templateId":"markdown","sharedDataIds":{"sidebar":"sidebar-sidebars.yaml"},"props":{"metadata":{"markdoc":{"tagList":[]},"type":"markdown"},"seo":{"title":"Knowledge Hub Content Manager API Overview"},"dynamicMarkdocComponents":[],"compilationErrors":[],"ast":{"$$mdtype":"Tag","name":"article","attributes":{},"children":[{"$$mdtype":"Tag","name":"Heading","attributes":{"level":1,"id":"knowledge-hub-content-manager-api-overview","__idx":0},"children":["Knowledge Hub Content Manager API Overview"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"introduction","__idx":1},"children":["Introduction"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Welcome to the eGain ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Knowledge Hub Content Manager API"]}," Guide. The Content Manager API enables enterprises to author, organize, import, and validate knowledge content in the knowledge base. It provides programmatic access to articles, folders, topics, prompt templates, and bulk import operations used by authors and knowledge managers."," ","Built on OAuth 2.0 authentication, the API ensures ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["secure, scoped, and role-aware"]}," access for users with a Knowledge + AI license. Typical callers hold the Author or Knowledge Base Manager role, or a custom role with the matching resource action. These APIs are subject to per-endpoint rate limits; see ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/developer-portal/rate-limits"},"children":["Usage Plans & Rate Limits"]},"."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"capabilities","__idx":2},"children":["Capabilities"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The API covers these operations:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Create, retrieve, and edit articles, including article content, attachments and article metadata."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Check out articles for editing, and retrieve published or latest versions as needed."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Publish articles after authoring edits are complete."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Create and maintain the folder tree used to organize knowledge content."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Create, retrieve, edit, and delete ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["manual"]}," topics. Topics generated from folders can be retrieved and their articles follow the folder."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Get and edit the article order within a topic."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Bulk-import knowledge content from Amazon S3 buckets or SFTP servers.",{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Validate content structure, format, and compliance before importing into production."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Monitor, pause, resume, cancel, and schedule import jobs, including validation hooks."]}]}]}]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"common-use-cases","__idx":3},"children":["Common Use Cases"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Legacy Knowledge Migration"]},": Import large volumes of content from external sources into eGain using the documented import format, reducing time spent on manual authoring."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Scheduled Bulk Updates"]},": Run regular content updates from Amazon S3 or SFTP, including off-peak scheduled imports, so production content stays current."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Pre-Production Validation"]},": Validate content against structure, language, and business rules before a production import, catching issues without changing existing data."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Knowledge Structure Authoring"]},": Create and maintain folders, topics, and articles programmatically."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Programmatic Edit and Publish"]},": Check out an article, save edits, and publish the updated version through a sequence of API calls."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Prompt Template Access"]},": Retrieve department and language-specific prompt templates used in authoring and AI-assisted workflows."]}]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"common-authoring-api-sequences","__idx":4},"children":["Common Authoring API Sequences"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Authoring goals often require calling multiple APIs in a specific order. The examples below use Content Manager v4 endpoints. For bulk structure and content, prefer the ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/developer-portal/guides/ingestion/ingestion-overview"},"children":["Ingestion API"]},"."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"create-a-root-folder-and-articles-in-it","__idx":5},"children":["Create a root folder and articles in it"]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Create a root-level folder"]}," with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST /folders"]}," and an explicit ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["department.id"]}," in the request body. Save the folder ID from the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Location"]}," response header. Each folder auto-creates a matching \"Topics From Folders\" topic."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Create articles"]}," in that folder with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST /articles"]},", using the folder ID. Newly created articles start checked out to the caller."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["To attach files or publish, see ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Edit and publish"]}," below. After article creation, you already hold the lock, so the first publish does not need checkout."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"create-a-top-level-topic-add-articles-set-order","__idx":6},"children":["Create a top-level topic, add articles, set order"]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Create a top-level topic"]}," with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST /topics"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["department.id"]}," in the request body. To create under an existing topic instead, supply ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["parent.id"]},". Save the topic ID from the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Location"]}," response header and the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ETag"]}," response header. You can include initial ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["links"]}," (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["rel: article"]},", article self-link in ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["href"]},") on create if the articles are already known."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Get the topic"]}," with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /topics/{topicIDs}?$lang=..."]}," to confirm it and refresh the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ETag"]}," response header before edits."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Add existing articles"]}," with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PATCH /topics/{topicIDs}"]}," using ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["links"]}," (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["rel: article"]},") and the topic ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["If-Match"]}," request header. To associate from the article side instead, use ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PATCH /articles/{articleIDs}"]}," with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["rel: topic"]},". Use ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["unlinks"]}," on edit to remove articles from the topic."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Set article order"]}," with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /topics/{topicIDs}/articleorder"]}," to read pinned top and bottom lists, then ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PATCH /topics/{topicIDs}/articleorder"]}," to pin articles to the top or bottom. Send the topic ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["If-Match"]}," request header from a prior GET or POST."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"edit-and-publish","__idx":7},"children":["Edit and publish"]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Get the latest version"]}," with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /article/{articleID}?versionSelector=latest"]},". Use ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["latest"]}," to fetch the draft version you can edit, not ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["published"]},". Save the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ETag"]}," response header. Inspect ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["lockedBy"]}," in the response body before you plan an edit."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Check out"]}," with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PUT /articles/{articleIDs}/checkout"]}," if you do not already hold the lock. If another user holds it, the API returns ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["409 Conflict"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Preupload an attachment."]}," Attachments and images must be uploaded before they are referenced; Content Manager does not accept raw file bytes in the article payload. Pre-upload with the File Manager ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Generate URL to upload a file"]}," API (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST /assets/preupload"]},"), with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["application"]}," request body parameter set to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["article"]},". For attachments, set ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["isInline"]}," request body parameter to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["false"]},". Send the file bytes to the returned ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["uploadUrl"]},", then provide returned ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["fileUploadId"]}," in ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["versions[].attachments"]}," request body parameter on the next Article ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PATCH"]},". For uploading inline images, set ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["isInline"]}," to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["true"]}," and then include ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["fileUploadId"]}," in the image tag in the article's ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["content"]}," in the next Article ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PATCH"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Publish"]}," with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PATCH /articles/{articleIDs}?operation=publish"]},", including any attachment or content changes in that request.",{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Send the saved ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ETag"]}," in the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["If-Match"]}," request header so you are publishing the version you retrieved. After each successful PATCH, use the new ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ETag"]}," response header before the next edit or publish."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Use ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["operation=edit"]}," to save and stay checked out, or ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["operation=checkin"]}," to save and release the lock without publishing."]}]}]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"delete-a-folder-and-check-job-status","__idx":8},"children":["Delete a folder and check job status"]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Delete"]}," with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["DELETE /folders/{folderIDs}"]},". The folder must be empty, or pass ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["deleteUnreferencedArticles=true"]},". If the folder is referenced as a topic in a portal, pass ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["deleteIfUsedInPortal=true"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Check job status."]}," Deletion is asynchronous: a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["202 Accepted"]}," response includes a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Location"]}," header. Poll Get Async Job Status at that URL (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["core/infomgr/v4/async/job/{jobID}"]},")."]}]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"working-with-the-api","__idx":9},"children":["Working with the API"]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Secure Access"]}]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Applications authenticate using OAuth 2.0 with Content Manager ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["read"]}," or ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["manage"]}," scopes. Authoring operations also support on-behalf-of user scopes."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Logged-in users must have a Knowledge + AI license. Operations require the Author or Knowledge Base Manager role, or a custom role with the matching resource action."]}]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Folder and Topic Structure"]}]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Create, edit, retrieve, and delete folders to organize knowledge content."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Create topics at department level or under a parent topic. Retrieve topics, including topics generated from folders."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Get and edit the article order for a topic."]}]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Article Authoring"]}]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Create articles in a folder; newly created articles start in the checked-out state."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Retrieve an article by ID with content, choosing published or latest draft."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Retrieve multiple articles by ID without content (summary and requested attributes)."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Check out articles for editing, save changes, and publish when ready."]}]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Import and Validation"]}]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Validate content before import to check structure, format, language support, and business rules."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Create import jobs from supported data sources (Amazon S3 and SFTP)."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Configure validation hooks, then pause, resume, or cancel jobs as needed."]}]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Monitor and Iterate"]}]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Check import job status and access detailed logs."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Use the import health endpoint to confirm the import service is available."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Retrieve prompt templates filtered by department and language."]}]}]}]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"additional-resources","__idx":10},"children":["Additional Resources"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/apis/v4/knowledge/contentmgr/api-bundled"},"children":["Content Manager API reference"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/developer-portal/guides/ingestion/ingestion-overview"},"children":["Ingestion API overview"]}]}]}]},"headings":[{"value":"Knowledge Hub Content Manager API Overview","id":"knowledge-hub-content-manager-api-overview","depth":1},{"value":"Introduction","id":"introduction","depth":2},{"value":"Capabilities","id":"capabilities","depth":2},{"value":"Common Use Cases","id":"common-use-cases","depth":2},{"value":"Common Authoring API Sequences","id":"common-authoring-api-sequences","depth":2},{"value":"Create a root folder and articles in it","id":"create-a-root-folder-and-articles-in-it","depth":3},{"value":"Create a top-level topic, add articles, set order","id":"create-a-top-level-topic-add-articles-set-order","depth":3},{"value":"Edit and publish","id":"edit-and-publish","depth":3},{"value":"Delete a folder and check job status","id":"delete-a-folder-and-check-job-status","depth":3},{"value":"Working with the API","id":"working-with-the-api","depth":2},{"value":"Additional Resources","id":"additional-resources","depth":2}],"frontmatter":{"seo":{"title":"Knowledge Hub Content Manager API Overview"}},"lastModified":"2026-09-30T01:50:12.000Z","pagePropGetterError":{"message":"","name":""}},"slug":"/developer-portal/guides/knowledge/content-manager","userData":{"isAuthenticated":false,"teams":["anonymous"]},"isPublic":true}