/api/merchant/v1. Send:
{storeId}. When its store scope is SELECTED, {storeId} must be in that list.
RESTRICTED keys must include the scope named on the method (feedback:read or feedback:reply:write). FULL keys skip that scope list. Either way the user must still have dashboard permission viewFeedbacks.
Success JSON is the payload below. It is not wrapped in data. Errors are { "success": false, "error", "code" }. A 500 also includes errorId.
A storeId property in a JSON body is ignored. The path store id is the one that is used.
{feedbackId} may be the internal id or the public id (FBK-XXXX-XXXX-XXXX-XXXX-XXXX). The response id is always the internal id. publicId is not returned. A review that belongs to another shop returns 404 with error Feedback not found.
List feedback
feedback:read
Reviews are ordered by createdAt descending. page and limit paginate in the database. total is the count for the current rating filter. ratingCounts is always the full store, including reviews outside that filter.
ratingCounts keys are "1", "2", "3", "4", "5", and "all". Each value is a number. all is the sum of those five counts.
Get feedback
feedback:read
Returns one feedback object with the fields in the list above. Status 200.
Reply to feedback
feedback:reply:write
PUT calls the same handler as POST. Both return 200 and the updated feedback object.
Body must be a JSON object:
Clear a reply
feedback:reply:write
No body. Sets reply and repliedAt to null and returns the feedback object. Status 200.

