Comments support one level of threading. A reply is a comment with a parent_id pointing to a root comment on the same issue.
Max depth: 1. Replies cannot themselves be replied to — parent_id must reference a root comment (one with parent_id: null). Passing a parent_id that points to an existing reply returns 422.
Cascade delete. Deleting a root comment also deletes all its replies.
Reply notifications. Creating a reply notifies the parent comment's author (unless they are the replier, or already notified via @mention).
Comment text, max 10,000 characters. Supports Markdown and @mentions.
parent_id
integer
No
ID of the root comment to reply to. Must be a root comment (not a reply) on the same issue. Omit for top-level comments.
bash
curl -X POST https://{tenant}.kendo.dev/api/projects/1/issues/42/comments \ -H "Authorization: Bearer your-token" \ -H "Content-Type: application/json" \ -d '{ "content": "The pagination is working, but we should add a `per_page` parameter. @jasper what do you think?" }'
bash
curl -X POST https://{tenant}.kendo.dev/api/projects/1/issues/42/comments \ -H "Authorization: Bearer your-token" \ -H "Content-Type: application/json" \ -d '{ "content": "Agreed — I can add that in the follow-up.", "parent_id": 10 }'
json
{ "id": 11, "content": "Agreed — I can add that in the follow-up.", "parent_id": 10, "is_pinned": false, "user_id": 2, "issue_id": 42, "created_at": "2026-03-13T14:05:00.000000Z", "liker_ids": []}
curl -X PUT https://{tenant}.kendo.dev/api/projects/1/issues/42/comments/10 \ -H "Authorization: Bearer your-token" \ -H "Content-Type: application/json" \ -d '{ "content": "The pagination is working. Added a `per_page` parameter in the follow-up PR." }'
json
{ "id": 10, "content": "The pagination is working. Added a `per_page` parameter in the follow-up PR.", "parent_id": null, "is_pinned": false, "user_id": 1, "issue_id": 42, "created_at": "2026-03-13T14:00:00.000000Z", "liker_ids": []}
Each issue can have at most one pinned comment, surfaced at the top of the comment section regardless of pagination. Pinning a different comment unpins the previous one. Pinning requires Issues: Update permission — it curates the issue, so comment authorship alone does not grant it.
POST /api/projects/{projectId}/issues/{issueId}/comments/{commentId}/pin — pin DELETE /api/projects/{projectId}/issues/{issueId}/comments/{commentId}/pin — unpin
Both return 200 OK with the updated comment (is_pinned reflects the new state).
bash
curl -X POST https://{tenant}.kendo.dev/api/projects/1/issues/42/comments/10/pin \ -H "Authorization: Bearer your-token"
Liking is a single toggle — one request likes an unliked comment, the next unlikes it. Unlike pinning, any number of members can like the same comment, and a comment's own author can like it too. Both root comments and replies can be liked.
POST /api/projects/{projectId}/issues/{issueId}/comments/{commentId}/like — toggle
Returns 200 OK with the updated comment. liker_ids lists the IDs of every user who currently likes it, including the caller after a like.
bash
curl -X POST https://{tenant}.kendo.dev/api/projects/1/issues/42/comments/10/like \ -H "Authorization: Bearer your-token"
json
{ "id": 10, "content": "Decision: we ship the per_page parameter in this PR.", "parent_id": null, "is_pinned": true, "user_id": 1, "issue_id": 42, "created_at": "2026-03-13T14:00:00.000000Z", "liker_ids": [2]}
Comments API
Comments are threaded discussions on issues. Adding a comment notifies the issue assignee and any @mentioned users.
Permissions
Admins and project owners bypass all permission checks for project-scoped resources.
Endpoints
GET/api/projects/{projectId}/issues/{issueId}/commentsPOST/api/projects/{projectId}/issues/{issueId}/commentsPUT/api/projects/{projectId}/issues/{issueId}/comments/{commentId}DELETE/api/projects/{projectId}/issues/{issueId}/comments/{commentId}POST/api/projects/{projectId}/issues/{issueId}/comments/{commentId}/pinDELETE/api/projects/{projectId}/issues/{issueId}/comments/{commentId}/pinPOST/api/projects/{projectId}/issues/{issueId}/comments/{commentId}/likeThreaded Replies
Comments support one level of threading. A reply is a comment with a
parent_idpointing to a root comment on the same issue.parent_idmust reference a root comment (one withparent_id: null). Passing aparent_idthat points to an existing reply returns422.Create Comment
POST /api/projects/{projectId}/issues/{issueId}/commentsRequest Fields
contentparent_idUpdate Comment
PUT /api/projects/{projectId}/issues/{issueId}/comments/{commentId}Request Fields
contentDelete Comment
DELETE /api/projects/{projectId}/issues/{issueId}/comments/{commentId}Returns
204 No Contenton success.Pin / Unpin Comment
Each issue can have at most one pinned comment, surfaced at the top of the comment section regardless of pagination. Pinning a different comment unpins the previous one. Pinning requires Issues: Update permission — it curates the issue, so comment authorship alone does not grant it.
POST /api/projects/{projectId}/issues/{issueId}/comments/{commentId}/pin— pinDELETE /api/projects/{projectId}/issues/{issueId}/comments/{commentId}/pin— unpinBoth return
200 OKwith the updated comment (is_pinnedreflects the new state).Like / Unlike Comment
Liking is a single toggle — one request likes an unliked comment, the next unlikes it. Unlike pinning, any number of members can like the same comment, and a comment's own author can like it too. Both root comments and replies can be liked.
POST /api/projects/{projectId}/issues/{issueId}/comments/{commentId}/like— toggleReturns
200 OKwith the updated comment.liker_idslists the IDs of every user who currently likes it, including the caller after a like.See Also