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.
- Interactive reference (Swagger UI): https://api.knolo.io/cms/docs
- OpenAPI document (JSON): https://api.knolo.io/cms/api-json
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
| Method | Path | Description |
|---|---|---|
| GET | /cms/minds | List Minds in the Space. Query: limit (max 100), offset. |
| GET | /cms/minds/{mindId} | Get one Mind's metadata. |
| POST | /cms/minds | Create 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
| Method | Path | Description |
|---|---|---|
| GET | /cms/minds/{mindId}/entries | List 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}/download | Get file content (text) or a downloadUrl (binary/media). |
| POST | /cms/minds/{mindId}/entries | Create 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 status | Code | Meaning |
|---|---|---|
| 400 | invalid_argument | Missing or malformed parameters. |
| 401 | unauthenticated | Missing or invalid API key. |
| 404 | not_found | The Mind or entry does not exist. |
| 413 | payload_too_large | Upload exceeds 20 MB, or storage quota reached. |
| 500 | internal | Unexpected server error. |
Limits
- Maximum
limitper 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
- Knolo Connector (MCP) — connect AI clients to your Space.
- Documentation overview — Spaces, Minds, Assistants, Agents, Triggers.
- Interactive API reference — try requests in Swagger UI.
