API reference
Collections
Management API: GET /sites/{id}/collections, POST /sites/{id}/collections, GET /sites/{id}/collections/{key}, …
List the site's collections (custom and system) with their field schemas and item counts. Call this before reading or writing items. Errors: FORBIDDEN, INVALID_CURSOR.
Parameters
idstring · pathrequiredWebsite id. Get it from sites.list or from sites.create.
limitinteger · queryMaximum number of items to return, 1–100. Defaults to 20.
cursorstring · queryOpaque cursor from the previous page's nextCursor. Omit for the first page.
Response 200
dataobject[]requireddata[].idstringrequireddata[].keystringrequireddata[].displayNamestringrequireddata[].singularNamestringrequireddata[].descriptionstring | nullrequireddata[].kind"custom" | "system"requiredsystem collections (blog) have reserved fields that cannot be removed or retyped.
data[].systemKeystring | nullrequireddata[].fieldsobject[]requireddata[].fields[].idstringrequireddata[].fields[].namestringrequireddata[].fields[].requiredbooleanrequireddata[].fields[].helpstringdata[].fields[].aiHintstringdata[].fields[].systembooleandata[].fields[].indexedbooleandata[].fields[].uniquebooleandata[].fields[].type"text"requireddata[].fields[].minintegerdata[].fields[].maxintegerdata[].fields[].patternstringdata[].fields[].defaultstringdata[].fields[].localizedbooleandata[].titleFieldIdstringrequireddata[].accessPolicyobject | nullrequiredField-level read policy for the Content Delivery API: gatedFields are stripped on anonymous requests (returning top-level access summary) and unlocked when a Customer Access Token (knr_cat_) satisfies requires (customer login or an active entitlement featureKey).
data[].accessPolicy.gatedFieldsstring[]requireddata[].accessPolicy.requiresobjectrequireddata[].accessPolicy.itemOverrideFieldstringdata[].searchobject | nullrequiredSite-search settings. null = items are not indexed. fields: text/rich_text fieldIds searched as body (the title field is always indexed). pathTemplate (optional, e.g. /recipes/{slug}) is a presentation setting: when set, search hits carry a url; otherwise url is null and the front end routes by collectionKey + slug or fetches the item from the Delivery API.
data[].search.fieldsstring[]requireddata[].search.pathTemplatestring | nulldata[].createdByobjectrequireddata[].createdBy.kind"agent" | "user"requireddata[].createdBy.actorIdstringrequireddata[].createdBy.clientNamestring | nulldata[].itemCountintegerrequireddata[].createdAtstringrequireddata[].updatedAtstringrequiredhasMorebooleanrequiredTrue when another page exists; pass nextCursor to fetch it.
nextCursorstring | nullrequiredCursor for the next page, or null on the last page.
Errors
FORBIDDEN403INVALID_CURSOR400
MCP tool collections_list
curl -X GET "https://app.kanorio.com/api/v1/sites/{id}/collections" \
-H "Authorization: Bearer $KANORIO_TOKEN"{
"data": [
{
"id": "coll_example01",
"key": "teachers",
"displayName": "Teachers",
"singularName": "Teacher",
"description": "Faculty shown on the About page.",
"kind": "custom",
"systemKey": null,
"fields": [
{
"id": "name",
"name": "Name",
"type": "text",
"required": true,
"max": 80,
"unique": true,
"aiHint": "Full name as shown on the site."
},
{
"id": "avatar",
"name": "Avatar",
"type": "image",
"required": false,
"help": "Square portrait."
},
{
"id": "subjects",
"name": "Subjects",
"type": "multi_select",
"required": true,
"options": [
{
"id": "math",
"label": "Math"
},
{
"id": "english",
"label": "English"
},
{
"id": "physics",
"label": "Physics"
}
]
},
{
"id": "bio",
"name": "Bio",
"type": "rich_text",
"required": false,
"max": 2000
},
{
"id": "website",
"name": "Personal website",
"type": "url",
"required": false
},
{
"id": "course",
"name": "Main course",
"type": "reference",
"required": false,
"targetCollectionKey": "courses"
}
],
"titleFieldId": "name",
"accessPolicy": null,
"search": {
"fields": [
"bio"
]
},
"createdBy": {
"kind": "agent",
"actorId": "user_example01",
"clientName": "Cursor"
},
"itemCount": 3,
"createdAt": "2026-10-01T02:30:00.000Z",
"updatedAt": "2026-10-06T08:00:00.000Z"
},
{
"id": "coll_example02",
"key": "courses",
"displayName": "Courses",
"singularName": "Course",
"description": null,
"kind": "custom",
"systemKey": null,
"fields": [
{
"id": "name",
"name": "Name",
"type": "text",
"required": true
}
],
"titleFieldId": "name",
"accessPolicy": null,
"search": null,
"createdBy": {
"kind": "agent",
"actorId": "user_example01",
"clientName": "Cursor"
},
"itemCount": 2,
"createdAt": "2026-10-01T02:30:00.000Z",
"updatedAt": "2026-10-06T08:00:00.000Z"
}
],
"hasMore": false,
"nextCursor": null
}Create a collection (a small database for site content: teachers, projects, locations, FAQ…). Not for app data such as members, orders or comments. Field types: text, rich_text, email, phone, url, video_url, number, boolean, date, datetime, select, multi_select, color, image, gallery, file, reference, multi_reference, json. Every field needs id (snake_case), name, type; required defaults to false. Constraints: text min/max/pattern/unique/default; number integer/min/max/unique; select/multi_select options [{id,label}]; reference/multi_reference targetCollectionKey; gallery/multi_* max. Add aiHint to tell future agents how to fill a field. titleFieldId must point to a text/email/url field; it names items and generates slugs. Optional search: { fields, pathTemplate? } puts published items into site search (GET /api/v1/search returns kind=COLLECTION_ITEM, collectionKey, refId, slug; url only when pathTemplate is set). Returns the Delivery API endpoints and a fetch example. Errors: FORBIDDEN, VALIDATION (details.issues), KEY_TAKEN, COLLECTION_LIMIT_REACHED, SYSTEM_COLLECTION (reserved key).
Parameters
idstring · pathrequiredWebsite id. Get it from sites.list or from sites.create.
Request body
keystringrequireddisplayNamestringrequiredsingularNamestringrequireddescriptionstringfieldsobject[]requiredfields[].idstringrequiredfields[].namestringrequiredfields[].requiredbooleanfields[].helpstringfields[].aiHintstringfields[].systembooleanfields[].indexedbooleanfields[].uniquebooleanfields[].type"text"requiredfields[].minintegerfields[].maxintegerfields[].patternstringfields[].defaultstringfields[].localizedbooleantitleFieldIdstringrequiredaccessPolicyobject | nullaccessPolicy.gatedFieldsstring[]requiredaccessPolicy.requiresobjectrequiredaccessPolicy.requires.kind"customer"requiredaccessPolicy.itemOverrideFieldstringsearchobject | nullsearch.fieldsstring[]requiredsearch.pathTemplatestring | null
Response 201
collectionobjectrequiredcollection.idstringrequiredcollection.keystringrequiredcollection.displayNamestringrequiredcollection.singularNamestringrequiredcollection.descriptionstring | nullrequiredcollection.kind"custom" | "system"requiredsystem collections (blog) have reserved fields that cannot be removed or retyped.
collection.systemKeystring | nullrequiredcollection.fieldsobject[]requiredcollection.fields[].idstringrequiredcollection.fields[].namestringrequiredcollection.fields[].requiredbooleanrequiredcollection.fields[].helpstringcollection.fields[].aiHintstringcollection.fields[].systembooleancollection.fields[].indexedbooleancollection.fields[].uniquebooleancollection.fields[].type"text"requiredcollection.fields[].minintegercollection.fields[].maxintegercollection.fields[].patternstringcollection.fields[].defaultstringcollection.fields[].localizedbooleancollection.titleFieldIdstringrequiredcollection.accessPolicyobject | nullrequiredField-level read policy for the Content Delivery API: gatedFields are stripped on anonymous requests (returning top-level access summary) and unlocked when a Customer Access Token (knr_cat_) satisfies requires (customer login or an active entitlement featureKey).
collection.accessPolicy.gatedFieldsstring[]requiredcollection.accessPolicy.requiresobjectrequiredcollection.accessPolicy.itemOverrideFieldstringcollection.searchobject | nullrequiredSite-search settings. null = items are not indexed. fields: text/rich_text fieldIds searched as body (the title field is always indexed). pathTemplate (optional, e.g. /recipes/{slug}) is a presentation setting: when set, search hits carry a url; otherwise url is null and the front end routes by collectionKey + slug or fetches the item from the Delivery API.
collection.search.fieldsstring[]requiredcollection.search.pathTemplatestring | nullcollection.createdByobjectrequiredcollection.createdBy.kind"agent" | "user"requiredcollection.createdBy.actorIdstringrequiredcollection.createdBy.clientNamestring | nullcollection.itemCountintegerrequiredcollection.createdAtstringrequiredcollection.updatedAtstringrequireddeliveryobjectrequireddelivery.baseUrlstringrequiredThe site's public origin.
delivery.listUrlstringrequireddelivery.itemUrlstringrequiredReplace {slug} with an item's slug.
delivery.schemaUrlstringrequireddelivery.fetchExamplestringrequiredCopy-paste JavaScript using fetch().
delivery.corsstringrequiredHow cross-origin access works and where to allow origins.
Errors
FORBIDDEN403VALIDATION400 · details.issuesKEY_TAKEN409COLLECTION_LIMIT_REACHED403SYSTEM_COLLECTION409 · reserved key
MCP tool collections_create
curl -X POST "https://app.kanorio.com/api/v1/sites/{id}/collections" \
-H "Authorization: Bearer $KANORIO_TOKEN" \
-H "Content-Type: application/json" \
-d '{"key":"teachers","displayName":"Teachers","singularName":"Teacher","description":"Faculty shown on the About page.","titleFieldId":"name","fields":[{"id":"name","name":"Name","type":"text","required":true,"max":80,"unique":true,"aiHint":"Full name as shown on the site."},{"id":"avatar","name":"Avatar","type":"image","required":false,"help":"Square portrait."},{"id":"subjects","name":"Subjects","type":"multi_select","required":true,"options":[{"id":"math","label":"Math"},{"id":"english","label":"English"},{"id":"physics","label":"Physics"}]},{"id":"bio","name":"Bio","type":"rich_text","required":false,"max":2000},{"id":"website","name":"Personal website","type":"url","required":false},{"id":"course","name":"Main course","type":"reference","required":false,"targetCollectionKey":"courses"}]}'{
"collection": {
"id": "coll_example01",
"key": "teachers",
"displayName": "Teachers",
"singularName": "Teacher",
"description": "Faculty shown on the About page.",
"kind": "custom",
"systemKey": null,
"fields": [
{
"id": "name",
"name": "Name",
"type": "text",
"required": true,
"max": 80,
"unique": true,
"aiHint": "Full name as shown on the site."
},
{
"id": "avatar",
"name": "Avatar",
"type": "image",
"required": false,
"help": "Square portrait."
},
{
"id": "subjects",
"name": "Subjects",
"type": "multi_select",
"required": true,
"options": [
{
"id": "math",
"label": "Math"
},
{
"id": "english",
"label": "English"
},
{
"id": "physics",
"label": "Physics"
}
]
},
{
"id": "bio",
"name": "Bio",
"type": "rich_text",
"required": false,
"max": 2000
},
{
"id": "website",
"name": "Personal website",
"type": "url",
"required": false
},
{
"id": "course",
"name": "Main course",
"type": "reference",
"required": false,
"targetCollectionKey": "courses"
}
],
"titleFieldId": "name",
"accessPolicy": null,
"search": {
"fields": [
"bio"
]
},
"createdBy": {
"kind": "agent",
"actorId": "user_example01",
"clientName": "Cursor"
},
"itemCount": 0,
"createdAt": "2026-10-01T02:30:00.000Z",
"updatedAt": "2026-10-06T08:00:00.000Z"
},
"delivery": {
"baseUrl": "https://sunny-bakery.kanorio.com",
"listUrl": "https://sunny-bakery.kanorio.com/api/v1/collections/teachers/items",
"itemUrl": "https://sunny-bakery.kanorio.com/api/v1/collections/teachers/items/{slug}",
"schemaUrl": "https://sunny-bakery.kanorio.com/api/v1/collections",
"fetchExample": "const res = await fetch(\"https://sunny-bakery.kanorio.com/api/v1/collections/teachers/items?limit=20&sort=-publishedAt\");\nconst { data, hasMore, nextCursor } = await res.json();",
"cors": "Same-origin requests need no setup. Other origins must be added with site.update_allowed_origins; localhost is always allowed."
}
}Retrieve a collection
/sites/{id}/collections/{key}Get one collection's schema (fields, constraints, aiHint) plus its Content Delivery API endpoints. Errors: FORBIDDEN, COLLECTION_NOT_FOUND.
Parameters
idstring · pathrequiredWebsite id. Get it from sites.list or from sites.create.
keystring · pathrequiredCollection key (slug). Get it from collections.list.
Response 200
collectionobjectrequiredcollection.idstringrequiredcollection.keystringrequiredcollection.displayNamestringrequiredcollection.singularNamestringrequiredcollection.descriptionstring | nullrequiredcollection.kind"custom" | "system"requiredsystem collections (blog) have reserved fields that cannot be removed or retyped.
collection.systemKeystring | nullrequiredcollection.fieldsobject[]requiredcollection.fields[].idstringrequiredcollection.fields[].namestringrequiredcollection.fields[].requiredbooleanrequiredcollection.fields[].helpstringcollection.fields[].aiHintstringcollection.fields[].systembooleancollection.fields[].indexedbooleancollection.fields[].uniquebooleancollection.fields[].type"text"requiredcollection.fields[].minintegercollection.fields[].maxintegercollection.fields[].patternstringcollection.fields[].defaultstringcollection.fields[].localizedbooleancollection.titleFieldIdstringrequiredcollection.accessPolicyobject | nullrequiredField-level read policy for the Content Delivery API: gatedFields are stripped on anonymous requests (returning top-level access summary) and unlocked when a Customer Access Token (knr_cat_) satisfies requires (customer login or an active entitlement featureKey).
collection.accessPolicy.gatedFieldsstring[]requiredcollection.accessPolicy.requiresobjectrequiredcollection.accessPolicy.itemOverrideFieldstringcollection.searchobject | nullrequiredSite-search settings. null = items are not indexed. fields: text/rich_text fieldIds searched as body (the title field is always indexed). pathTemplate (optional, e.g. /recipes/{slug}) is a presentation setting: when set, search hits carry a url; otherwise url is null and the front end routes by collectionKey + slug or fetches the item from the Delivery API.
collection.search.fieldsstring[]requiredcollection.search.pathTemplatestring | nullcollection.createdByobjectrequiredcollection.createdBy.kind"agent" | "user"requiredcollection.createdBy.actorIdstringrequiredcollection.createdBy.clientNamestring | nullcollection.itemCountintegerrequiredcollection.createdAtstringrequiredcollection.updatedAtstringrequireddeliveryobjectrequireddelivery.baseUrlstringrequiredThe site's public origin.
delivery.listUrlstringrequireddelivery.itemUrlstringrequiredReplace {slug} with an item's slug.
delivery.schemaUrlstringrequireddelivery.fetchExamplestringrequiredCopy-paste JavaScript using fetch().
delivery.corsstringrequiredHow cross-origin access works and where to allow origins.
Errors
FORBIDDEN403COLLECTION_NOT_FOUND404
MCP tool collections_get
curl -X GET "https://app.kanorio.com/api/v1/sites/{id}/collections/{key}" \
-H "Authorization: Bearer $KANORIO_TOKEN"{
"collection": {
"id": "coll_example01",
"key": "teachers",
"displayName": "Teachers",
"singularName": "Teacher",
"description": "Faculty shown on the About page.",
"kind": "custom",
"systemKey": null,
"fields": [
{
"id": "name",
"name": "Name",
"type": "text",
"required": true,
"max": 80,
"unique": true,
"aiHint": "Full name as shown on the site."
},
{
"id": "avatar",
"name": "Avatar",
"type": "image",
"required": false,
"help": "Square portrait."
},
{
"id": "subjects",
"name": "Subjects",
"type": "multi_select",
"required": true,
"options": [
{
"id": "math",
"label": "Math"
},
{
"id": "english",
"label": "English"
},
{
"id": "physics",
"label": "Physics"
}
]
},
{
"id": "bio",
"name": "Bio",
"type": "rich_text",
"required": false,
"max": 2000
},
{
"id": "website",
"name": "Personal website",
"type": "url",
"required": false
},
{
"id": "course",
"name": "Main course",
"type": "reference",
"required": false,
"targetCollectionKey": "courses"
}
],
"titleFieldId": "name",
"accessPolicy": null,
"search": {
"fields": [
"bio"
]
},
"createdBy": {
"kind": "agent",
"actorId": "user_example01",
"clientName": "Cursor"
},
"itemCount": 3,
"createdAt": "2026-10-01T02:30:00.000Z",
"updatedAt": "2026-10-06T08:00:00.000Z"
},
"delivery": {
"baseUrl": "https://sunny-bakery.kanorio.com",
"listUrl": "https://sunny-bakery.kanorio.com/api/v1/collections/teachers/items",
"itemUrl": "https://sunny-bakery.kanorio.com/api/v1/collections/teachers/items/{slug}",
"schemaUrl": "https://sunny-bakery.kanorio.com/api/v1/collections",
"fetchExample": "const res = await fetch(\"https://sunny-bakery.kanorio.com/api/v1/collections/teachers/items?limit=20&sort=-publishedAt\");\nconst { data, hasMore, nextCursor } = await res.json();",
"cors": "Same-origin requests need no setup. Other origins must be added with site.update_allowed_origins; localhost is always allowed."
}
}Update a collection
/sites/{id}/collections/{key}Change a collection's name, description, titleFieldId, fields, accessPolicy or search. fields replaces the whole ordered list: read it with collections.get, edit, send it back. Allowed immediately: add fields, rename, change help/aiHint, add options, relax constraints, remove custom fields (data is ignored, cleaned on next write). Type changes only along compatible paths (e.g. text→rich_text, select→multi_select, reference→multi_reference, image→gallery); otherwise add a new field, migrate, remove the old one. Tightened constraints are checked against existing items first. accessPolicy gates specific fieldIds (e.g. blog content) behind customer sign-in ({ kind: "customer" }) or an active commercial entitlement ({ kind: "entitlement", featureKey: "premium" }), with optional itemOverrideField (select field with public/customer/paid); pass null to clear. System collections (blog): reserved fields cannot be removed or retyped, but accessPolicy and custom fields can be configured. Errors: FORBIDDEN, COLLECTION_NOT_FOUND, VALIDATION (details.issues), SCHEMA_CHANGE_REJECTED (details.schemaIssues).
Parameters
idstring · pathrequiredWebsite id. Get it from sites.list or from sites.create.
keystring · pathrequiredCollection key (slug). Get it from collections.list.
Request body
displayNamestringsingularNamestringdescriptionstring | nullfieldsobject[]fields[].idstringrequiredfields[].namestringrequiredfields[].requiredbooleanfields[].helpstringfields[].aiHintstringfields[].systembooleanfields[].indexedbooleanfields[].uniquebooleanfields[].type"text"requiredfields[].minintegerfields[].maxintegerfields[].patternstringfields[].defaultstringfields[].localizedbooleantitleFieldIdstringaccessPolicyobject | nullField-level read policy (gatedFields, requires: customer | entitlement(featureKey), optional itemOverrideField). Pass null to remove the policy.
accessPolicy.gatedFieldsstring[]requiredaccessPolicy.requiresobjectrequiredaccessPolicy.requires.kind"customer"requiredaccessPolicy.itemOverrideFieldstringsearchobject | nullSite-search settings: { fields: [text/rich_text fieldIds], pathTemplate?: '/recipes/{slug}' }. Gated fields cannot be searched. Pass null to remove the collection from site search. Not configurable on system collections.
search.fieldsstring[]requiredsearch.pathTemplatestring | null
Response 200
collectionobjectrequiredcollection.idstringrequiredcollection.keystringrequiredcollection.displayNamestringrequiredcollection.singularNamestringrequiredcollection.descriptionstring | nullrequiredcollection.kind"custom" | "system"requiredsystem collections (blog) have reserved fields that cannot be removed or retyped.
collection.systemKeystring | nullrequiredcollection.fieldsobject[]requiredcollection.fields[].idstringrequiredcollection.fields[].namestringrequiredcollection.fields[].requiredbooleanrequiredcollection.fields[].helpstringcollection.fields[].aiHintstringcollection.fields[].systembooleancollection.fields[].indexedbooleancollection.fields[].uniquebooleancollection.fields[].type"text"requiredcollection.fields[].minintegercollection.fields[].maxintegercollection.fields[].patternstringcollection.fields[].defaultstringcollection.fields[].localizedbooleancollection.titleFieldIdstringrequiredcollection.accessPolicyobject | nullrequiredField-level read policy for the Content Delivery API: gatedFields are stripped on anonymous requests (returning top-level access summary) and unlocked when a Customer Access Token (knr_cat_) satisfies requires (customer login or an active entitlement featureKey).
collection.accessPolicy.gatedFieldsstring[]requiredcollection.accessPolicy.requiresobjectrequiredcollection.accessPolicy.itemOverrideFieldstringcollection.searchobject | nullrequiredSite-search settings. null = items are not indexed. fields: text/rich_text fieldIds searched as body (the title field is always indexed). pathTemplate (optional, e.g. /recipes/{slug}) is a presentation setting: when set, search hits carry a url; otherwise url is null and the front end routes by collectionKey + slug or fetches the item from the Delivery API.
collection.search.fieldsstring[]requiredcollection.search.pathTemplatestring | nullcollection.createdByobjectrequiredcollection.createdBy.kind"agent" | "user"requiredcollection.createdBy.actorIdstringrequiredcollection.createdBy.clientNamestring | nullcollection.itemCountintegerrequiredcollection.createdAtstringrequiredcollection.updatedAtstringrequired
Errors
FORBIDDEN403COLLECTION_NOT_FOUND404VALIDATION400 · details.issuesSCHEMA_CHANGE_REJECTED422 · details.schemaIssues
MCP tool collections_update
curl -X PATCH "https://app.kanorio.com/api/v1/sites/{id}/collections/{key}" \
-H "Authorization: Bearer $KANORIO_TOKEN" \
-H "Content-Type: application/json" \
-d '{"description":"Faculty and guest lecturers.","fields":[{"id":"name","name":"Name","type":"text","required":true,"max":80,"unique":true,"aiHint":"Full name as shown on the site."},{"id":"avatar","name":"Avatar","type":"image","required":false,"help":"Square portrait."},{"id":"subjects","name":"Subjects","type":"multi_select","required":true,"options":[{"id":"math","label":"Math"},{"id":"english","label":"English"},{"id":"physics","label":"Physics"}]},{"id":"bio","name":"Bio","type":"rich_text","required":false,"max":2000},{"id":"website","name":"Personal website","type":"url","required":false},{"id":"course","name":"Main course","type":"reference","required":false,"targetCollectionKey":"courses"},{"id":"years","name":"Years of experience","type":"number","required":false,"integer":true,"min":0}]}'{
"collection": {
"id": "coll_example01",
"key": "teachers",
"displayName": "Teachers",
"singularName": "Teacher",
"description": "Faculty and guest lecturers.",
"kind": "custom",
"systemKey": null,
"fields": [
{
"id": "name",
"name": "Name",
"type": "text",
"required": true,
"max": 80,
"unique": true,
"aiHint": "Full name as shown on the site."
},
{
"id": "avatar",
"name": "Avatar",
"type": "image",
"required": false,
"help": "Square portrait."
},
{
"id": "subjects",
"name": "Subjects",
"type": "multi_select",
"required": true,
"options": [
{
"id": "math",
"label": "Math"
},
{
"id": "english",
"label": "English"
},
{
"id": "physics",
"label": "Physics"
}
]
},
{
"id": "bio",
"name": "Bio",
"type": "rich_text",
"required": false,
"max": 2000
},
{
"id": "website",
"name": "Personal website",
"type": "url",
"required": false
},
{
"id": "course",
"name": "Main course",
"type": "reference",
"required": false,
"targetCollectionKey": "courses"
}
],
"titleFieldId": "name",
"accessPolicy": null,
"search": {
"fields": [
"bio"
]
},
"createdBy": {
"kind": "agent",
"actorId": "user_example01",
"clientName": "Cursor"
},
"itemCount": 3,
"createdAt": "2026-10-01T02:30:00.000Z",
"updatedAt": "2026-10-06T08:00:00.000Z"
}
}Delete a collection
/sites/{id}/collections/{key}Delete a custom collection and ALL its items. Irreversible. confirmKey must equal key. Refused while another collection references it, and for system collections. Not included in any OAuth scope preset; a PAT must grant collections:manage explicitly. Errors: FORBIDDEN, COLLECTION_NOT_FOUND, CONFIRM_REQUIRED, REFERENCED (details.referencedBy), SYSTEM_COLLECTION.
Parameters
idstring · pathrequiredWebsite id. Get it from sites.list or from sites.create.
keystring · pathrequiredCollection key (slug). Get it from collections.list.
confirmKeystring · queryrequiredMust equal key.
Response 200
deletedItemsintegerrequired
Errors
FORBIDDEN403COLLECTION_NOT_FOUND404CONFIRM_REQUIRED400REFERENCED409 · details.referencedBySYSTEM_COLLECTION409
MCP tool collections_delete
curl -X DELETE "https://app.kanorio.com/api/v1/sites/{id}/collections/{key}?confirmKey=teachers" \
-H "Authorization: Bearer $KANORIO_TOKEN"{
"deletedItems": 3
}