API reference
Reviews
Management API: GET /sites/{id}/reviews, POST /sites/{id}/reviews, GET /sites/{id}/reviews/settings, …
List reviews for a website, newest first. Filter by targetKind, targetId, status or source. Errors: FORBIDDEN.
Parameters
idstring · pathrequiredWebsite id. Get it from sites.list or from sites.create.
targetKind"PRODUCT" | "SERVICE" · queryWhat the review is about: a product or a bookable service.
targetIdstring · queryId of the product or service.
status"PENDING" | "APPROVED" | "REJECTED" · querysource"BUYER" | "IMPORTED" · querylimitinteger · 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[].targetKind"PRODUCT" | "SERVICE"requiredWhat the review is about: a product or a bookable service.
data[].targetIdstringrequiredId of the product or service.
data[].targetTitlestring | nullrequiredDisplay name of the target when it still exists.
data[].status"PENDING" | "APPROVED" | "REJECTED"requireddata[].source"BUYER" | "IMPORTED"requiredBUYER reviews are tied to a paid order line or completed booking; IMPORTED ones were added by the store owner and are never shown as verified.
data[].authorNamestringrequireddata[].ratingintegerrequireddata[].contentstring | nullrequireddata[].replyobject | nullrequiredStore owner's public reply, if any.
data[].reply.bodystringrequireddata[].reply.repliedAtstringrequireddata[].reply.repliedBystring | nullrequireddata[].reviewDatestring | nullrequiredOriginal review date for imported reviews (ISO).
data[].publishedAtstring | nullrequiredWhen the review became public (ISO); null while pending or rejected.
data[].createdAtstringrequiredhasMorebooleanrequiredTrue when another page exists; pass nextCursor to fetch it.
nextCursorstring | nullrequiredCursor for the next page, or null on the last page.
Errors
FORBIDDEN403
MCP tool reviews_list
curl -X GET "https://app.kanorio.com/api/v1/sites/{id}/reviews" \
-H "Authorization: Bearer $KANORIO_TOKEN"{
"data": [
{
"id": "rev_1",
"targetKind": "PRODUCT",
"targetId": "prod_example01",
"targetTitle": "Strawberry Birthday Cake",
"status": "PENDING",
"source": "BUYER",
"authorName": "Avery",
"rating": 5,
"content": "Arrived on time and tasted fresh.",
"reply": null,
"reviewDate": null,
"publishedAt": null,
"createdAt": "2026-10-06T08:00:00.000Z"
}
],
"hasMore": false,
"nextCursor": null
}Add a review collected elsewhere (another marketplace, a paper form). It is published immediately, marked IMPORTED and never shown as a verified purchase. Errors: FORBIDDEN, VALIDATION, TARGET_NOT_FOUND.
Parameters
idstring · pathrequiredWebsite id. Get it from sites.list or from sites.create.
Request body
targetKind"PRODUCT" | "SERVICE"requiredWhat the review is about: a product or a bookable service.
targetIdstringrequiredId of the product or service.
authorNamestringrequiredratingintegerrequiredcontentstring | nullreviewDatestring | nullWhen the review was originally written (ISO).
Response 200
idstringrequiredtargetKind"PRODUCT" | "SERVICE"requiredWhat the review is about: a product or a bookable service.
targetIdstringrequiredId of the product or service.
targetTitlestring | nullrequiredDisplay name of the target when it still exists.
status"PENDING" | "APPROVED" | "REJECTED"requiredsource"BUYER" | "IMPORTED"requiredBUYER reviews are tied to a paid order line or completed booking; IMPORTED ones were added by the store owner and are never shown as verified.
authorNamestringrequiredratingintegerrequiredcontentstring | nullrequiredreplyobject | nullrequiredStore owner's public reply, if any.
reply.bodystringrequiredreply.repliedAtstringrequiredreply.repliedBystring | nullrequiredreviewDatestring | nullrequiredOriginal review date for imported reviews (ISO).
publishedAtstring | nullrequiredWhen the review became public (ISO); null while pending or rejected.
createdAtstringrequired
Errors
FORBIDDEN403VALIDATION400TARGET_NOT_FOUND404
MCP tool reviews_import
curl -X POST "https://app.kanorio.com/api/v1/sites/{id}/reviews" \
-H "Authorization: Bearer $KANORIO_TOKEN" \
-H "Content-Type: application/json" \
-d '{"targetKind":"PRODUCT","targetId":"prod_example01","authorName":"Jordan","rating":4,"content":"Great crust.","reviewDate":"2026-09-01T00:00:00.000Z"}'{
"id": "rev_2",
"targetKind": "PRODUCT",
"targetId": "prod_example01",
"targetTitle": "Strawberry Birthday Cake",
"status": "APPROVED",
"source": "IMPORTED",
"authorName": "Jordan",
"rating": 4,
"content": "Great crust.",
"reply": null,
"reviewDate": "2026-09-01T00:00:00.000Z",
"publishedAt": "2026-10-28T09:00:00.000Z",
"createdAt": "2026-10-06T08:00:00.000Z"
}Read a product's or service's review settings and current rating summary: whether reviews are enabled, when the rating is shown, any historical rating, and pending count. Errors: FORBIDDEN, TARGET_NOT_FOUND.
Parameters
idstring · pathrequiredWebsite id. Get it from sites.list or from sites.create.
targetKind"PRODUCT" | "SERVICE" · queryrequiredWhat the review is about: a product or a bookable service.
targetIdstring · queryrequiredId of the product or service.
Response 200
targetKind"PRODUCT" | "SERVICE"requiredWhat the review is about: a product or a bookable service.
targetIdstringrequiredId of the product or service.
enabledbooleanrequiredWhether buyers can submit new reviews for this target.
visibility"always" | "never" | "threshold_3" | "threshold_10" | "threshold_30"requiredWhen the rating is shown publicly: always, never, or once the review count reaches 3, 10 or 30.
historicalRatingnumber | nullrequiredAverage rating carried over from another platform; blended into the public rating.
historicalCountintegerrequiredHow many reviews the historical rating represents.
aggregateRatingnumber | nullrequiredCurrent blended average of approved reviews plus historical rating.
aggregateCountintegerrequiredApproved reviews plus historical count.
pendingCountintegerrequiredReviews waiting for moderation.
Errors
FORBIDDEN403TARGET_NOT_FOUND404
MCP tool reviews_settings_get
curl -X GET "https://app.kanorio.com/api/v1/sites/{id}/reviews/settings" \
-H "Authorization: Bearer $KANORIO_TOKEN"{
"targetKind": "PRODUCT",
"targetId": "prod_example01",
"enabled": true,
"visibility": "threshold_10",
"historicalRating": null,
"historicalCount": 0,
"aggregateRating": 5,
"aggregateCount": 1,
"pendingCount": 0
}Update a product's or service's review settings: enable or disable new reviews, choose when the rating is shown, or set a historical rating carried over from another platform. Omitted fields stay unchanged. Errors: FORBIDDEN, VALIDATION, TARGET_NOT_FOUND.
Parameters
idstring · pathrequiredWebsite id. Get it from sites.list or from sites.create.
Request body
targetKind"PRODUCT" | "SERVICE"requiredWhat the review is about: a product or a bookable service.
targetIdstringrequiredId of the product or service.
enabledbooleanvisibility"always" | "never" | "threshold_3" | "threshold_10" | "threshold_30"historicalRatingnumber | nullAverage rating from another platform; null clears it.
historicalCountintegerHow many reviews that historical rating represents.
Response 200
targetKind"PRODUCT" | "SERVICE"requiredWhat the review is about: a product or a bookable service.
targetIdstringrequiredId of the product or service.
enabledbooleanrequiredWhether buyers can submit new reviews for this target.
visibility"always" | "never" | "threshold_3" | "threshold_10" | "threshold_30"requiredWhen the rating is shown publicly: always, never, or once the review count reaches 3, 10 or 30.
historicalRatingnumber | nullrequiredAverage rating carried over from another platform; blended into the public rating.
historicalCountintegerrequiredHow many reviews the historical rating represents.
aggregateRatingnumber | nullrequiredCurrent blended average of approved reviews plus historical rating.
aggregateCountintegerrequiredApproved reviews plus historical count.
pendingCountintegerrequiredReviews waiting for moderation.
Errors
FORBIDDEN403VALIDATION400TARGET_NOT_FOUND404
MCP tool reviews_settings_update
curl -X PATCH "https://app.kanorio.com/api/v1/sites/{id}/reviews/settings" \
-H "Authorization: Bearer $KANORIO_TOKEN" \
-H "Content-Type: application/json" \
-d '{"targetKind":"PRODUCT","targetId":"prod_example01","visibility":"threshold_3","historicalRating":4.8,"historicalCount":25}'{
"targetKind": "PRODUCT",
"targetId": "prod_example01",
"enabled": true,
"visibility": "threshold_3",
"historicalRating": 4.8,
"historicalCount": 25,
"aggregateRating": 4.81,
"aggregateCount": 26,
"pendingCount": 0
}Get one review by id, including the store reply. Errors: FORBIDDEN, REVIEW_NOT_FOUND.
Parameters
idstring · pathrequiredWebsite id. Get it from sites.list or from sites.create.
reviewIdstring · pathrequiredReview id from reviews.list.
Response 200
idstringrequiredtargetKind"PRODUCT" | "SERVICE"requiredWhat the review is about: a product or a bookable service.
targetIdstringrequiredId of the product or service.
targetTitlestring | nullrequiredDisplay name of the target when it still exists.
status"PENDING" | "APPROVED" | "REJECTED"requiredsource"BUYER" | "IMPORTED"requiredBUYER reviews are tied to a paid order line or completed booking; IMPORTED ones were added by the store owner and are never shown as verified.
authorNamestringrequiredratingintegerrequiredcontentstring | nullrequiredreplyobject | nullrequiredStore owner's public reply, if any.
reply.bodystringrequiredreply.repliedAtstringrequiredreply.repliedBystring | nullrequiredreviewDatestring | nullrequiredOriginal review date for imported reviews (ISO).
publishedAtstring | nullrequiredWhen the review became public (ISO); null while pending or rejected.
createdAtstringrequired
Errors
FORBIDDEN403REVIEW_NOT_FOUND404
MCP tool reviews_get
curl -X GET "https://app.kanorio.com/api/v1/sites/{id}/reviews/{reviewId}" \
-H "Authorization: Bearer $KANORIO_TOKEN"{
"id": "rev_1",
"targetKind": "PRODUCT",
"targetId": "prod_example01",
"targetTitle": "Strawberry Birthday Cake",
"status": "PENDING",
"source": "BUYER",
"authorName": "Avery",
"rating": 5,
"content": "Arrived on time and tasted fresh.",
"reply": null,
"reviewDate": null,
"publishedAt": null,
"createdAt": "2026-10-06T08:00:00.000Z"
}Delete imported
/sites/{id}/reviews/{reviewId}Delete a review that was imported by the store. Buyer reviews cannot be deleted; reject them instead. Errors: FORBIDDEN, REVIEW_NOT_FOUND, NOT_IMPORTED.
Parameters
idstring · pathrequiredWebsite id. Get it from sites.list or from sites.create.
reviewIdstring · pathrequiredReview id from reviews.list.
Response 200
idstringrequireddeletedtruerequired
Errors
FORBIDDEN403REVIEW_NOT_FOUND404NOT_IMPORTED409
MCP tool reviews_delete_imported
curl -X DELETE "https://app.kanorio.com/api/v1/sites/{id}/reviews/{reviewId}" \
-H "Authorization: Bearer $KANORIO_TOKEN"{
"id": "rev_2",
"deleted": true
}Approve a review
/sites/{id}/reviews/{reviewId}/approveApprove a review so it appears publicly and counts toward the rating. Idempotent when already approved. Errors: FORBIDDEN, REVIEW_NOT_FOUND.
Parameters
idstring · pathrequiredWebsite id. Get it from sites.list or from sites.create.
reviewIdstring · pathrequiredReview id from reviews.list.
Response 200
idstringrequiredtargetKind"PRODUCT" | "SERVICE"requiredWhat the review is about: a product or a bookable service.
targetIdstringrequiredId of the product or service.
targetTitlestring | nullrequiredDisplay name of the target when it still exists.
status"PENDING" | "APPROVED" | "REJECTED"requiredsource"BUYER" | "IMPORTED"requiredBUYER reviews are tied to a paid order line or completed booking; IMPORTED ones were added by the store owner and are never shown as verified.
authorNamestringrequiredratingintegerrequiredcontentstring | nullrequiredreplyobject | nullrequiredStore owner's public reply, if any.
reply.bodystringrequiredreply.repliedAtstringrequiredreply.repliedBystring | nullrequiredreviewDatestring | nullrequiredOriginal review date for imported reviews (ISO).
publishedAtstring | nullrequiredWhen the review became public (ISO); null while pending or rejected.
createdAtstringrequired
Errors
FORBIDDEN403REVIEW_NOT_FOUND404
MCP tool reviews_approve
curl -X POST "https://app.kanorio.com/api/v1/sites/{id}/reviews/{reviewId}/approve" \
-H "Authorization: Bearer $KANORIO_TOKEN" \
-H "Content-Type: application/json" \
-d '{}'{
"id": "rev_1",
"targetKind": "PRODUCT",
"targetId": "prod_example01",
"targetTitle": "Strawberry Birthday Cake",
"status": "APPROVED",
"source": "BUYER",
"authorName": "Avery",
"rating": 5,
"content": "Arrived on time and tasted fresh.",
"reply": null,
"reviewDate": null,
"publishedAt": "2026-10-28T09:00:00.000Z",
"createdAt": "2026-10-06T08:00:00.000Z"
}Reject a review
/sites/{id}/reviews/{reviewId}/rejectReject a review so it is not shown publicly. Use this for content that breaks your rules; do not reject reviews because of a low rating (consumer protection rules in the US, UK and EU forbid hiding negative reviews). Idempotent when already rejected. Errors: FORBIDDEN, REVIEW_NOT_FOUND.
Parameters
idstring · pathrequiredWebsite id. Get it from sites.list or from sites.create.
reviewIdstring · pathrequiredReview id from reviews.list.
Response 200
idstringrequiredtargetKind"PRODUCT" | "SERVICE"requiredWhat the review is about: a product or a bookable service.
targetIdstringrequiredId of the product or service.
targetTitlestring | nullrequiredDisplay name of the target when it still exists.
status"PENDING" | "APPROVED" | "REJECTED"requiredsource"BUYER" | "IMPORTED"requiredBUYER reviews are tied to a paid order line or completed booking; IMPORTED ones were added by the store owner and are never shown as verified.
authorNamestringrequiredratingintegerrequiredcontentstring | nullrequiredreplyobject | nullrequiredStore owner's public reply, if any.
reply.bodystringrequiredreply.repliedAtstringrequiredreply.repliedBystring | nullrequiredreviewDatestring | nullrequiredOriginal review date for imported reviews (ISO).
publishedAtstring | nullrequiredWhen the review became public (ISO); null while pending or rejected.
createdAtstringrequired
Errors
FORBIDDEN403REVIEW_NOT_FOUND404
MCP tool reviews_reject
curl -X POST "https://app.kanorio.com/api/v1/sites/{id}/reviews/{reviewId}/reject" \
-H "Authorization: Bearer $KANORIO_TOKEN" \
-H "Content-Type: application/json" \
-d '{}'{
"id": "rev_1",
"targetKind": "PRODUCT",
"targetId": "prod_example01",
"targetTitle": "Strawberry Birthday Cake",
"status": "REJECTED",
"source": "BUYER",
"authorName": "Avery",
"rating": 5,
"content": "Arrived on time and tasted fresh.",
"reply": null,
"reviewDate": null,
"publishedAt": null,
"createdAt": "2026-10-06T08:00:00.000Z"
}Reply to a review
/sites/{id}/reviews/{reviewId}/replyPost or replace the store's public reply to a review (shown under the review). Pass body null to remove the reply. Errors: FORBIDDEN, REVIEW_NOT_FOUND, VALIDATION.
Parameters
idstring · pathrequiredWebsite id. Get it from sites.list or from sites.create.
reviewIdstring · pathrequiredReview id from reviews.list.
Request body
bodystring | nullrequiredReply text, up to 2000 characters; null clears the reply.
Response 200
idstringrequiredtargetKind"PRODUCT" | "SERVICE"requiredWhat the review is about: a product or a bookable service.
targetIdstringrequiredId of the product or service.
targetTitlestring | nullrequiredDisplay name of the target when it still exists.
status"PENDING" | "APPROVED" | "REJECTED"requiredsource"BUYER" | "IMPORTED"requiredBUYER reviews are tied to a paid order line or completed booking; IMPORTED ones were added by the store owner and are never shown as verified.
authorNamestringrequiredratingintegerrequiredcontentstring | nullrequiredreplyobject | nullrequiredStore owner's public reply, if any.
reply.bodystringrequiredreply.repliedAtstringrequiredreply.repliedBystring | nullrequiredreviewDatestring | nullrequiredOriginal review date for imported reviews (ISO).
publishedAtstring | nullrequiredWhen the review became public (ISO); null while pending or rejected.
createdAtstringrequired
Errors
FORBIDDEN403REVIEW_NOT_FOUND404VALIDATION400
MCP tool reviews_reply
curl -X PUT "https://app.kanorio.com/api/v1/sites/{id}/reviews/{reviewId}/reply" \
-H "Authorization: Bearer $KANORIO_TOKEN" \
-H "Content-Type: application/json" \
-d '{"body":"Thank you! We bake every morning."}'{
"id": "rev_1",
"targetKind": "PRODUCT",
"targetId": "prod_example01",
"targetTitle": "Strawberry Birthday Cake",
"status": "APPROVED",
"source": "BUYER",
"authorName": "Avery",
"rating": 5,
"content": "Arrived on time and tasted fresh.",
"reply": {
"body": "Thank you! We bake every morning.",
"repliedAt": "2026-10-28T10:00:00.000Z",
"repliedBy": null
},
"reviewDate": null,
"publishedAt": "2026-10-28T09:00:00.000Z",
"createdAt": "2026-10-06T08:00:00.000Z"
}