Knolo
Log inStart building — free

Documentation

Knolo CMS API: read and write your Minds over REST

The Knolo CMS API is a REST interface for a single Space's knowledge. Use it to list and search Minds (knowledge bases), read and write their entries (files and table rows), and manage Minds programmatically — authenticated with a Space-scoped API key. It is the headless way to use Knolo as a content backend for your own website or service.

If instead you want an AI client like Cursor, Claude, or ChatGPT to use your Space through tools and prompts, use the Knolo Connector (MCP).

Base URL

https://api.knolo.io

All CMS endpoints are under the /cms path, e.g. https://api.knolo.io/cms/minds.

Authentication

Every request must send a Space-scoped API key (prefix kn_) as a Bearer token:

Authorization: Bearer kn_your_key

Create and revoke keys in Space Settings → API Access. A key is shown once and grants access to exactly one Space. Missing or invalid keys return 401.

Minds and entries

A Mind is a knowledge base. There are two kinds:

  • Document minds (dataType: "default") hold files — text, Markdown, PDFs, images, and data files. Indexable document minds are chunked and searchable.
  • Table minds (dataType: "table") hold structured rows validated against a schema.

An entry is one item in a Mind: a file in a document mind, or a row in a table mind.

Quick start

List your Minds:

curl https://api.knolo.io/cms/minds \
  -H "Authorization: Bearer kn_your_key"

Create a text file in a document mind:

curl -X POST https://api.knolo.io/cms/minds/MIND_ID/entries \
  -H "Authorization: Bearer kn_your_key" \
  -H "Content-Type: application/json" \
  -d '{ "filename": "notes.md", "content": "# Meeting notes\nShip the API." }'

Endpoints

Minds

MethodPathDescription
GET/cms/mindsList Minds in the Space. Query: limit (max 100), offset.
GET/cms/minds/{mindId}Get one Mind's metadata.
POST/cms/mindsCreate a Mind. Body: name, optional description, indexable, dataType, schema, folderId.
PATCH/cms/minds/{mindId}Update name, description, indexable, schema, or folderId.
DELETE/cms/minds/{mindId}Delete a Mind and all of its entries.

Entries

MethodPathDescription
GET/cms/minds/{mindId}/entriesList or query entries. Query: limit, offset; table minds also accept filters, sortBy, sortDirection.
GET/cms/minds/{mindId}/entries/{entryId}Get one entry's metadata (and structuredData for table rows).
GET/cms/minds/{mindId}/entries/{entryId}/downloadGet file content (text) or a downloadUrl (binary/media).
POST/cms/minds/{mindId}/entriesCreate an entry (see below).
PATCH/cms/minds/{mindId}/entries/{entryId}Update an entry (see below).
DELETE/cms/minds/{mindId}/entries/{entryId}Delete a file or table row.

Creating entries

The request body depends on the Mind's kind.

Table mind — provide data, a row object matching the Mind's schema:

curl -X POST https://api.knolo.io/cms/minds/MIND_ID/entries \
  -H "Authorization: Bearer kn_your_key" \
  -H "Content-Type: application/json" \
  -d '{ "data": { "title": "Refund policy", "status": "published" } }'

Document mind, text — provide filename and content:

{ "filename": "policy.md", "content": "Our refund policy..." }

Document mind, binary upload — provide filename and contentBase64 (base64-encoded bytes, max 20 MB) for PDFs, images, or spreadsheets:

{ "filename": "report.pdf", "contentBase64": "JVBERi0xLjc..." }

Updating entries

Table mind — provide updates, a partial row object:

{ "updates": { "status": "archived" } }

Document mind — provide content (with an optional operation of replace, append, or prepend) and/or a new name to rename:

{ "content": "\n\nAddendum: effective today.", "operation": "append" }

Querying table minds

Pass filters as a JSON-encoded array of conditions, plus sortBy and sortDirection:

curl -G https://api.knolo.io/cms/minds/MIND_ID/entries \
  -H "Authorization: Bearer kn_your_key" \
  --data-urlencode 'filters=[{"field":"status","op":"==","value":"published"}]' \
  --data-urlencode 'sortBy=createdAt' \
  --data-urlencode 'sortDirection=desc' \
  --data-urlencode 'limit=50'

Pagination

List endpoints accept limit and offset and return total and hasMore:

{ "minds": [], "total": 42, "limit": 50, "offset": 0, "hasMore": false }

limit is capped at 100. Page by increasing offset until hasMore is false.

Errors

Errors return a JSON body with a message and a stable code:

{ "error": { "message": "Mind not found", "code": "not_found" } }
HTTP statusCodeMeaning
400invalid_argumentMissing or malformed parameters.
401unauthenticatedMissing or invalid API key.
404not_foundThe Mind or entry does not exist.
413payload_too_largeUpload exceeds 20 MB, or storage quota reached.
500internalUnexpected server error.

Limits

  • Maximum limit per list request: 100.
  • Maximum binary upload (contentBase64, decoded): 20 MB.
  • A key is scoped to one Space; there is no cross-Space access.

FAQ

How do I authenticate with the Knolo CMS API?

Send your Space API key (prefix kn_) as a Bearer token in the Authorization header. Create keys in Space Settings → API Access.

What is the difference between a document mind and a table mind?

Document minds hold files (text, PDFs, images, data files) and can be indexed for search. Table minds hold structured rows validated against a schema and support filtering and sorting.

How do I upload a PDF or image?

POST to /cms/minds/{mindId}/entries with filename and contentBase64 (base64-encoded file bytes, up to 20 MB).

Where is the interactive API reference?

The Swagger UI is at https://api.knolo.io/cms/docs and the raw OpenAPI document is at https://api.knolo.io/cms/api-json.

Related

Build your own AI system with Knolo

Describe what you want and Knolo builds it. No code, no nodes, no setup time.

Try Knolo free