Menu

API reference · Knowledge Base

Items

knowledge_base · items · 12 operations

GET/v1/knowledge-base/items

List Knowledge Base articles

knowledge_base.items.list

ReadIdempotentSince 2026-11-01

Lists the articles of the organization's Knowledge Base that the caller can see, as summaries (title, excerpt of the first 280 characters, links, attachment metadata, tag ids, visibility, author, pinned, counts, is_favorite) — use knowledge_base.items.get for the full content. A restricted article (private, custom or agency) comes with excerpt null: its text is only read with get. Sort: created_desc (default), updated_desc, title_asc or most_viewed. Filters: search (title, text or author, ignoring case and accents), tag_id, pinned, favorites (the caller's), created_by_id and visibility. Visibility: public (everyone with access to the organization), private (only its creator), custom (its creator plus visible_to_user_ids) or agency (only people of the agency workspace with access to this Account; it exists only in Accounts). Private and restricted articles of other people never appear. Visibility and filters run on what each page reads (up to 500 articles per call), so a page can bring fewer than limit while has_more is true: follow next_cursor. Requires view access to the Knowledge Base.

Scope
knowledge_base:read
Permission
View the module
MCP tool
knowledge_base_items_listOn the full surface; on the compact one, mb_execute_operation with id: "knowledge_base.items.list".

Declared cost: up to 503 reads and 0 writes per call (they count against the daily quota).

Parameters

limitintegerqueryoptional

Articles per page (1 to 200; default 50).

Default: 50

cursorstringqueryoptional

The next_cursor of the previous page, exactly as it came (same sort and filters).

sortenumqueryoptional

created_desc (default), updated_desc, title_asc or most_viewed.

Values: created_desc, updated_desc, title_asc, most_viewed · Default: "created_desc"

tag_idstringqueryoptional

Only the articles with this tag (an id of knowledge_base.tags.list).

pinnedbooleanqueryoptional

true = only pinned articles; false = only unpinned.

favoritesbooleanqueryoptional

true = only the caller's favorites.

created_by_idstringqueryoptional

Only the articles of this author (a user id of members.members.list).

visibilityenumqueryoptional

Only articles with this visibility: public, private, custom or agency.

Values: public, private, custom, agency

searchstringqueryoptional

Words (any order, without case or accents) or a fragment of the title, the text or the author.

Response

dataarray<object>
has_moreboolean
next_cursorstring

Errors

Example

curl "https://api.mb-suite.com/v1/knowledge-base/items" \
  -H "Authorization: Bearer $MB_API_KEY"

Try it with your test API key

With a test API key the request always goes to your practice organization: example data you can reset.

curl "https://api.mb-suite.com/v1/knowledge-base/items" \
  -H "Authorization: Bearer $MB_TEST_KEY"
GET/v1/knowledge-base/items/{item_id}

Get a Knowledge Base article

knowledge_base.items.get

ReadIdempotentSince 2026-11-01

Returns one article with its full content: sanitized HTML in content and plain text in content_plain_text, links, attachments (metadata and the in-app link; files are downloaded from the app), tag ids, visibility and visible_to_user_ids, author, pinned state, view and comment counts, manual order and whether it is one of the caller's favorites. Not found (kb_item_not_found) if the id does not exist or the article is private or restricted and the caller cannot see it. Reading does not count a view. Requires view access.

Scope
knowledge_base:read
Permission
View the module
MCP tool
knowledge_base_items_getOn the full surface; on the compact one, mb_execute_operation with id: "knowledge_base.items.get".

Declared cost: up to 2 reads and 0 writes per call (they count against the daily quota).

Parameters

item_idstringpathrequired

The article's id (from knowledge_base.items.list).

Response

idstring
titlestring
linksarray<object>
attachmentsarray<object>
tag_idsarray<string>
visibilityenum

Values: public, private, custom, agency

visible_to_user_idsarray<string>
created_by_idstring
created_atnumber
updated_atnumber
is_pinnedboolean
view_countnumber
comment_countnumber
is_favoriteboolean
contentstring
content_plain_textstring
excerptstring | null

List only: the first 280 characters of the plain text; null for a restricted article (private, custom or agency), whose text is read with knowledge_base.items.get.

created_by_namestring | null
created_by_photo_urlstring | null

Only in knowledge_base.items.get and the writes.

pinned_atnumber | null
pinned_by_idstring | null
ordernumber | null

Errors

Example

curl "https://api.mb-suite.com/v1/knowledge-base/items/{item_id}" \
  -H "Authorization: Bearer $MB_API_KEY"

Try it with your test API key

With a test API key the request always goes to your practice organization: example data you can reset.

curl "https://api.mb-suite.com/v1/knowledge-base/items/{item_id}" \
  -H "Authorization: Bearer $MB_TEST_KEY"
POST/v1/knowledge-base/items

Create a Knowledge Base article

knowledge_base.items.create

WriteSince 2026-11-01

Creates an article authored by the caller: title (up to 500 characters), content as HTML (sanitized: formatting, lists, links and images survive, scripts do not) or plain text (blank lines become paragraphs), up to 100,000 characters; links (each url must start with http:// or https://, otherwise invalid_input on links[n].url; the link's domain is filled in from the url when missing); tag_ids (ids from knowledge_base.tags.list; unknown ids are dropped); attachments (only files already uploaded to this organization's Knowledge Base storage, which the app does: an API client cannot upload files); visibility (default public) and, with custom, visible_to_user_ids (people without access to the organization are dropped). Visibility: public (everyone with access to the organization), private (only its creator), custom (its creator plus visible_to_user_ids) or agency (only people of the agency workspace with access to this Account; it exists only in Accounts). Passwords and keys do not belong in an article: if the text looks like it holds one, the article is saved anyway and warnings says content_looks_like_credential. Returns the new article. Requires full access to the Knowledge Base.

Scope
knowledge_base:write
Permission
Edit in the module
MCP tool
knowledge_base_items_createOn the full surface; on the compact one, mb_execute_operation with id: "knowledge_base.items.create".

Declared cost: up to 34 reads and 1 writes per call (they count against the daily quota).

Parameters

titlestringbodyrequired

The article's title.

contentstringbodyoptional

The article: HTML (sanitized) or plain text (it becomes paragraphs). Never put a password here: credentials go to the Vault.

content_plain_textstringbodyoptional

The plain-text version for search and previews (derived when missing); only together with content.

linksarray<object>bodyoptional

Links of the article (up to 50; replaces the list).

attachmentsarray<object>bodyoptional

Attachments (up to 50; replaces the list).

tag_idsarray<string>bodyoptional

Tags (ids of knowledge_base.tags.list, up to 30).

visibilityenumbodyoptional

public (default: everyone in the organization), private (only its author), custom (its author and visible_to_user_ids) or agency (only the workspace's people).

Values: public, private, custom, agency

visible_to_user_idsarray<string>bodyoptional

With visibility custom: who else sees it (user ids of members.members.list).

Response

item_idstring
itemobject
warningsarray<string>

Only when there is something to warn: content_looks_like_credential means the text looks like it holds a password, an API key or a private key; tell the person to move it to the Vault (vault.items.create), which keeps it encrypted, and to remove it from the article.

Errors

Example

curl -X POST "https://api.mb-suite.com/v1/knowledge-base/items" \
  -H "Authorization: Bearer $MB_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
  "title": "TITLE"
}'

Try it with your test API key

With a test API key the request always goes to your practice organization: example data you can reset.

curl -X POST "https://api.mb-suite.com/v1/knowledge-base/items" \
  -H "Authorization: Bearer $MB_TEST_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
  "title": "TITLE"
}'
PATCH/v1/knowledge-base/items/{item_id}

Update a Knowledge Base article

knowledge_base.items.update

WriteIdempotentSince 2026-11-01

Changes one or more fields of an article the caller can see, sent inside updates: title, content (HTML or plain text; content_plain_text only together with content, otherwise it is derived), links, tag_ids and attachments (each replaces the whole list: keep an existing attachment by sending its id), visibility and visible_to_user_ids. Anyone with full access can edit the content; only the article's creator or an owner/admin can change its visibility (403 kb_visibility_change_denied); sending the visibility it already has is not a change. Unknown fields are rejected. Idempotent: sending what the article already has changes nothing (changed: false). If the new text looks like it holds a password or a key, warnings says content_looks_like_credential. Returns the article.

Scope
knowledge_base:write
Permission
Edit in the module
MCP tool
knowledge_base_items_updateOn the full surface; on the compact one, mb_execute_operation with id: "knowledge_base.items.update".

Declared cost: up to 35 reads and 1 writes per call (they count against the daily quota).

Parameters

item_idstringpathrequired

The article's id (from knowledge_base.items.list).

updatesobjectbodyrequired

The fields to change; only what is sent changes.

Response

itemobject
changedboolean
warningsarray<string>

Only when there is something to warn: content_looks_like_credential means the text looks like it holds a password, an API key or a private key; tell the person to move it to the Vault (vault.items.create), which keeps it encrypted, and to remove it from the article.

Errors

Example

curl -X PATCH "https://api.mb-suite.com/v1/knowledge-base/items/{item_id}" \
  -H "Authorization: Bearer $MB_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "updates": {}
}'

Try it with your test API key

With a test API key the request always goes to your practice organization: example data you can reset.

curl -X PATCH "https://api.mb-suite.com/v1/knowledge-base/items/{item_id}" \
  -H "Authorization: Bearer $MB_TEST_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "updates": {}
}'
DELETE/v1/knowledge-base/items/{item_id}

Delete a Knowledge Base article

knowledge_base.items.delete

IrreversibleSince 2026-11-01

Deletes an article together with its comments. Only its creator or an owner/admin can delete it (403 kb_delete_denied). It stays 30 days in the trash with its comments, where an owner or admin can restore it (platform.trash.restore); its attached files are kept for the restore. A private or restricted article appears in the trash without its title. Outside the app it needs a dry run (which counts the comments) and a confirm_token, except a REST DELETE with a key allowed to delete.

With an API key, this DELETE runs directly: the record stays 30 days in the trash and the response carries its trash_item_id. With an OAuth token, and through the MCP, it needs dry_run → confirm_token.

Scope
knowledge_base:write and “Allow deletions” (knowledge_base:delete in OAuth)
Permission
Edit in the module
MCP tool
knowledge_base_items_deleteOn the full surface; on the compact one, mb_execute_operation with id: "knowledge_base.items.delete".

Declared cost: up to 305 reads and 302 writes per call (they count against the daily quota).

Parameters

item_idstringpathrequired

The article's id (from knowledge_base.items.list).

Response

oktrue
trash_item_idstring

The trash item this deletion left: the item_id of platform.trash.restore (POST /trash/{item_id}/restore). Missing if nothing went to the trash.

trash_item_idsarray<string>

Only when the deletion left more than one copy: all of them, the first being trash_item_id.

trash_expires_atnumber

When the copy leaves the trash for good (epoch ms): 30 days after the deletion.

Errors

Example

curl -X DELETE "https://api.mb-suite.com/v1/knowledge-base/items/{item_id}" \
  -H "Authorization: Bearer $MB_API_KEY"

Try it with your test API key

With a test API key the request always goes to your practice organization: example data you can reset.

curl -X DELETE "https://api.mb-suite.com/v1/knowledge-base/items/{item_id}" \
  -H "Authorization: Bearer $MB_TEST_KEY"
POST/v1/knowledge-base/items/bulk/delete

Delete many Knowledge Base articles

knowledge_base.items.bulk.delete

IrreversibleBulk · up to 50Since 2026-11-01

Deletes up to 50 articles with their comments; each one goes to the 30-day trash and can be restored on its own. Ids that do not exist or that the caller cannot see come back in not_found; articles the caller can see but did not create (and the caller is not an owner/admin) are skipped and come back in denied. Returns how many were deleted and their ids. Outside the app it requires a dry run (which lists what will be deleted and what will be skipped) and a confirm_token.

Needs confirmation: first dry_run: true (preview and confirm_token, valid 10 minutes and for one run), then the same body with confirm_token. In a few operations only with certain data: the description says when. Why and how: Dry run and confirm_token.

Scope
knowledge_base:write and “Allow deletions” (knowledge_base:delete in OAuth)
Permission
Edit in the module
MCP tool
knowledge_base_items_bulk_deleteOn the full surface; on the compact one, mb_execute_operation with id: "knowledge_base.items.bulk.delete".

Declared cost: up to 1000 reads and 1000 writes per call (they count against the daily quota).

Parameters

item_idsarray<string>bodyrequired

Article ids (1 to 50), from knowledge_base.items.list.

Response

deletednumber
deleted_idsarray<string>
not_foundarray<string>
deniedarray<string>
trash_item_idsarray<string>

The trash items this deletion left, one per record: the item_id of platform.trash.restore (POST /trash/{item_id}/restore).

trash_expires_atnumber

When the copy leaves the trash for good (epoch ms): 30 days after the deletion.

Errors

Example

curl -X POST "https://api.mb-suite.com/v1/knowledge-base/items/bulk/delete" \
  -H "Authorization: Bearer $MB_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "item_ids": [
    "ITEM_ID"
  ],
  "dry_run": true
}'

Try it with your test API key

With a test API key the request always goes to your practice organization: example data you can reset.

curl -X POST "https://api.mb-suite.com/v1/knowledge-base/items/bulk/delete" \
  -H "Authorization: Bearer $MB_TEST_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "item_ids": [
    "ITEM_ID"
  ],
  "dry_run": true
}'
POST/v1/knowledge-base/items/{item_id}/pin

Pin a Knowledge Base article

knowledge_base.items.pin

WriteIdempotentSince 2026-11-01

Pins an article at the top of the Knowledge Base for everyone who can see it (pinning is shared, unlike favorites). Idempotent: pinning an article that is already pinned changes nothing (changed: false). Returns the article. Requires full access.

Scope
knowledge_base:write
Permission
Edit in the module
MCP tool
knowledge_base_items_pinOn the full surface; on the compact one, mb_execute_operation with id: "knowledge_base.items.pin".

Declared cost: up to 2 reads and 1 writes per call (they count against the daily quota).

Parameters

item_idstringpathrequired

The article's id (from knowledge_base.items.list).

Response

itemobject
changedboolean

Errors

Example

curl -X POST "https://api.mb-suite.com/v1/knowledge-base/items/{item_id}/pin" \
  -H "Authorization: Bearer $MB_API_KEY"

Try it with your test API key

With a test API key the request always goes to your practice organization: example data you can reset.

curl -X POST "https://api.mb-suite.com/v1/knowledge-base/items/{item_id}/pin" \
  -H "Authorization: Bearer $MB_TEST_KEY"
POST/v1/knowledge-base/items/{item_id}/unpin

Unpin a Knowledge Base article

knowledge_base.items.unpin

WriteIdempotentSince 2026-11-01

Removes an article from the pinned strip, for everyone. Idempotent: unpinning an article that is not pinned changes nothing (changed: false). Returns the article. Requires full access.

Scope
knowledge_base:write
Permission
Edit in the module
MCP tool
knowledge_base_items_unpinOn the full surface; on the compact one, mb_execute_operation with id: "knowledge_base.items.unpin".

Declared cost: up to 2 reads and 1 writes per call (they count against the daily quota).

Parameters

item_idstringpathrequired

The article's id (from knowledge_base.items.list).

Response

itemobject
changedboolean

Errors

Example

curl -X POST "https://api.mb-suite.com/v1/knowledge-base/items/{item_id}/unpin" \
  -H "Authorization: Bearer $MB_API_KEY"

Try it with your test API key

With a test API key the request always goes to your practice organization: example data you can reset.

curl -X POST "https://api.mb-suite.com/v1/knowledge-base/items/{item_id}/unpin" \
  -H "Authorization: Bearer $MB_TEST_KEY"
POST/v1/knowledge-base/items/{item_id}/favorite

Add an article to the caller's favorites

knowledge_base.items.favorite

WriteIdempotentSince 2026-11-01

Marks an article as a favorite of the caller only (each person has their own favorites; filter them with favorites=true in knowledge_base.items.list). It does not change the article for anyone else nor its update date. Idempotent (changed: false when it already was). Returns the article. Requires full access.

Scope
knowledge_base:write
Permission
Edit in the module
MCP tool
knowledge_base_items_favoriteOn the full surface; on the compact one, mb_execute_operation with id: "knowledge_base.items.favorite".

Declared cost: up to 2 reads and 1 writes per call (they count against the daily quota).

Parameters

item_idstringpathrequired

The article's id (from knowledge_base.items.list).

Response

itemobject
changedboolean

Errors

Example

curl -X POST "https://api.mb-suite.com/v1/knowledge-base/items/{item_id}/favorite" \
  -H "Authorization: Bearer $MB_API_KEY"

Try it with your test API key

With a test API key the request always goes to your practice organization: example data you can reset.

curl -X POST "https://api.mb-suite.com/v1/knowledge-base/items/{item_id}/favorite" \
  -H "Authorization: Bearer $MB_TEST_KEY"
POST/v1/knowledge-base/items/{item_id}/unfavorite

Remove an article from the caller's favorites

knowledge_base.items.unfavorite

WriteIdempotentSince 2026-11-01

Removes an article from the caller's favorites (nobody else's). Idempotent (changed: false when it was not a favorite). Returns the article. Requires full access.

Scope
knowledge_base:write
Permission
Edit in the module
MCP tool
knowledge_base_items_unfavoriteOn the full surface; on the compact one, mb_execute_operation with id: "knowledge_base.items.unfavorite".

Declared cost: up to 2 reads and 1 writes per call (they count against the daily quota).

Parameters

item_idstringpathrequired

The article's id (from knowledge_base.items.list).

Response

itemobject
changedboolean

Errors

Example

curl -X POST "https://api.mb-suite.com/v1/knowledge-base/items/{item_id}/unfavorite" \
  -H "Authorization: Bearer $MB_API_KEY"

Try it with your test API key

With a test API key the request always goes to your practice organization: example data you can reset.

curl -X POST "https://api.mb-suite.com/v1/knowledge-base/items/{item_id}/unfavorite" \
  -H "Authorization: Bearer $MB_TEST_KEY"
POST/v1/knowledge-base/items/reorder

Set the manual order of articles

knowledge_base.items.reorder

WriteIdempotentSince 2026-11-01

Sets the shared manual order of the Knowledge Base (the "Manual" sort of the app): ordered_ids in the new order, up to 500; each article's order becomes its index. All or nothing: an id that does not exist or that the caller cannot see stops the whole reorder (404 kb_item_not_found with the missing ids), and a repeated id is 400. Articles not sent keep their position value. Returns how many were ordered. Requires full access.

Scope
knowledge_base:write
Permission
Edit in the module
MCP tool
knowledge_base_items_reorderOn the full surface; on the compact one, mb_execute_operation with id: "knowledge_base.items.reorder".

Declared cost: up to 502 reads and 500 writes per call (they count against the daily quota).

Parameters

ordered_idsarray<string>bodyrequired

The article ids in their new manual order (up to 500).

Response

countnumber

Errors

Example

curl -X POST "https://api.mb-suite.com/v1/knowledge-base/items/reorder" \
  -H "Authorization: Bearer $MB_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
  "ordered_ids": [
    "ORDERED_ID"
  ]
}'

Try it with your test API key

With a test API key the request always goes to your practice organization: example data you can reset.

curl -X POST "https://api.mb-suite.com/v1/knowledge-base/items/reorder" \
  -H "Authorization: Bearer $MB_TEST_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
  "ordered_ids": [
    "ORDERED_ID"
  ]
}'
POST/v1/knowledge-base/items/bulk/tags

Add or remove tags on many articles

knowledge_base.items.bulk.update_tags

WriteBulk · up to 50IdempotentSince 2026-11-01

Adds add_tag_ids and removes remove_tag_ids on up to 50 articles at once, like the selection bar of the app (the other tags of each article stay). Unknown tag ids to add are dropped; a tag in both lists is 400. Ids that do not exist or that the caller cannot see come back in not_found. Returns how many articles were updated. Outside the app it requires a dry run and a confirm_token.

Needs confirmation: first dry_run: true (preview and confirm_token, valid 10 minutes and for one run), then the same body with confirm_token. In a few operations only with certain data: the description says when. Why and how: Dry run and confirm_token.

Scope
knowledge_base:write
Permission
Edit in the module
MCP tool
knowledge_base_items_bulk_update_tagsOn the full surface; on the compact one, mb_execute_operation with id: "knowledge_base.items.bulk.update_tags".

Declared cost: up to 83 reads and 100 writes per call (they count against the daily quota).

Parameters

item_idsarray<string>bodyrequired

Article ids (1 to 50), from knowledge_base.items.list.

add_tag_idsarray<string>bodyoptional

Tags to add (ids of knowledge_base.tags.list).

remove_tag_idsarray<string>bodyoptional

Tags to remove.

Response

updatednumber
not_foundarray<string>

Errors

Example

curl -X POST "https://api.mb-suite.com/v1/knowledge-base/items/bulk/tags" \
  -H "Authorization: Bearer $MB_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "item_ids": [
    "ITEM_ID"
  ],
  "dry_run": true
}'

Try it with your test API key

With a test API key the request always goes to your practice organization: example data you can reset.

curl -X POST "https://api.mb-suite.com/v1/knowledge-base/items/bulk/tags" \
  -H "Authorization: Bearer $MB_TEST_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "item_ids": [
    "ITEM_ID"
  ],
  "dry_run": true
}'