API 参考
Authors
Management API: GET /sites/{id}/authors, POST /sites/{id}/authors, PATCH /sites/{id}/authors/{authorId}
List the site's shared author list: post authors and deliverable instructors are the same people. Use ids in posts.create / posts.update authorIds and deliverables.update authorIds. 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[].slugstringrequiredUse it in Delivery API filters: /api/v1/products?author=<slug> (courses they teach) and the blog author filter.
data[].namestringrequireddata[].titlestring | nullrequiredJob title or credential shown next to the name, e.g. Head Chef.
data[].avatarstring | nullrequiredDisplayable image URL.
data[].avatarAssetIdstring | nullrequiredMedia library asset id of the avatar, when it is in the library.
data[].biostring | nullrequireddata[].urlstring | nullrequiredPersonal website or social profile; the name on courses links here.
data[].countsobjectrequireddata[].counts.postsintegerrequiredPublished posts.
data[].counts.deliverablesintegerrequiredDeliverables where this person is an instructor.
hasMorebooleanrequiredTrue 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 authors_list
curl -X GET "https://app.kanorio.com/api/v1/sites/{id}/authors" \
-H "Authorization: Bearer $KANORIO_TOKEN"{
"data": [
{
"id": "author_example01",
"slug": "sunny",
"name": "Sunny",
"title": "Head Baker",
"avatar": "https://imagedelivery.net/example/sunny/avatar",
"avatarAssetId": "asset_example01",
"bio": "Runs the bakehouse and teaches the sourdough course.",
"url": "https://sunny.example.com",
"counts": {
"posts": 12,
"deliverables": 1
}
}
],
"hasMore": false,
"nextCursor": null
}Add a person to the site's shared author list (post authors and deliverable instructors are the same list). Then attach them with deliverables.update { authorIds } or posts.update { authorIds }. A blog author page only exists once they have a published post. Errors: FORBIDDEN, VALIDATION, SLUG_TAKEN, ASSET_NOT_FOUND (avatarAssetId not in this site's media library), ASSET_NOT_ALLOWED (avatar must be an image).
Parameters
idstring · pathrequiredWebsite id. Get it from sites.list or from sites.create.
Request body
namestringrequiredslugstringGenerated from name when omitted.
titlestringJob title or credential, e.g. Head Chef. Empty string clears it.
avatarAssetIdstring | nullImage asset id from the media library (media.upload first); null removes the avatar.
biostringurlstringPersonal website or social profile. Empty string clears it.
Response 201
authorobjectrequiredauthor.idstringrequiredauthor.slugstringrequiredUse it in Delivery API filters: /api/v1/products?author=<slug> (courses they teach) and the blog author filter.
author.namestringrequiredauthor.titlestring | nullrequiredJob title or credential shown next to the name, e.g. Head Chef.
author.avatarstring | nullrequiredDisplayable image URL.
author.avatarAssetIdstring | nullrequiredMedia library asset id of the avatar, when it is in the library.
author.biostring | nullrequiredauthor.urlstring | nullrequiredPersonal website or social profile; the name on courses links here.
author.countsobjectrequiredauthor.counts.postsintegerrequiredPublished posts.
author.counts.deliverablesintegerrequiredDeliverables where this person is an instructor.
Errors
FORBIDDEN403VALIDATION400SLUG_TAKEN409ASSET_NOT_FOUND404 · avatarAssetId not in this site's media libraryASSET_NOT_ALLOWED422 · avatar must be an image
MCP tool authors_create
curl -X POST "https://app.kanorio.com/api/v1/sites/{id}/authors" \
-H "Authorization: Bearer $KANORIO_TOKEN" \
-H "Content-Type: application/json" \
-d '{"name":"Sunny","title":"Head Baker","avatarAssetId":"asset_example01","url":"https://sunny.example.com"}'{
"author": {
"id": "author_example01",
"slug": "sunny",
"name": "Sunny",
"title": "Head Baker",
"avatar": "https://imagedelivery.net/example/sunny/avatar",
"avatarAssetId": "asset_example01",
"bio": null,
"url": "https://sunny.example.com",
"counts": {
"posts": 0,
"deliverables": 0
}
}
}Update a person on the shared author list; the change shows on their posts and the courses they teach. Only provided fields change. Errors: AUTHOR_NOT_FOUND, FORBIDDEN, VALIDATION, SLUG_TAKEN, ASSET_NOT_FOUND (avatarAssetId not in this site's media library), ASSET_NOT_ALLOWED (avatar must be an image).
Parameters
idstring · pathrequiredWebsite id. Get it from sites.list or from sites.create.
authorIdstring · pathrequired
Request body
namestringslugstringtitlestringJob title or credential, e.g. Head Chef. Empty string clears it.
avatarAssetIdstring | nullImage asset id from the media library (media.upload first); null removes the avatar.
biostringurlstringPersonal website or social profile. Empty string clears it.
Response 200
authorobjectrequiredauthor.idstringrequiredauthor.slugstringrequiredUse it in Delivery API filters: /api/v1/products?author=<slug> (courses they teach) and the blog author filter.
author.namestringrequiredauthor.titlestring | nullrequiredJob title or credential shown next to the name, e.g. Head Chef.
author.avatarstring | nullrequiredDisplayable image URL.
author.avatarAssetIdstring | nullrequiredMedia library asset id of the avatar, when it is in the library.
author.biostring | nullrequiredauthor.urlstring | nullrequiredPersonal website or social profile; the name on courses links here.
author.countsobjectrequiredauthor.counts.postsintegerrequiredPublished posts.
author.counts.deliverablesintegerrequiredDeliverables where this person is an instructor.
Errors
AUTHOR_NOT_FOUND404FORBIDDEN403VALIDATION400SLUG_TAKEN409ASSET_NOT_FOUND404 · avatarAssetId not in this site's media libraryASSET_NOT_ALLOWED422 · avatar must be an image
MCP tool authors_update
curl -X PATCH "https://app.kanorio.com/api/v1/sites/{id}/authors/{authorId}" \
-H "Authorization: Bearer $KANORIO_TOKEN" \
-H "Content-Type: application/json" \
-d '{"title":"Head Baker & Instructor"}'{
"author": {
"id": "author_example01",
"slug": "sunny",
"name": "Sunny",
"title": "Head Baker & Instructor",
"avatar": null,
"avatarAssetId": null,
"bio": null,
"url": null,
"counts": {
"posts": 12,
"deliverables": 1
}
}
}