Skip to content

Comments API

Comments are threaded discussions on issues. Adding a comment notifies the issue assignee and any @mentioned users.

Permissions

ActionRequired PermissionScope
ListComments: ReadComments on issues within accessible projects
CreateComments: CreateOn issues within accessible projects
UpdateComments: Update (Own/All)Own: only your comments. All: any comment
DeleteComments: Delete (Own/All)Own: only your comments. All: any comment
Pin / UnpinIssues: UpdatePinning curates the issue, so it follows issue-management permission — not comment authorship

Admins and project owners bypass all permission checks for project-scoped resources.

Endpoints

MethodEndpointDescription
GET/api/projects/{projectId}/issues/{issueId}/commentsList comments
POST/api/projects/{projectId}/issues/{issueId}/commentsCreate a comment
PUT/api/projects/{projectId}/issues/{issueId}/comments/{commentId}Update a comment
DELETE/api/projects/{projectId}/issues/{issueId}/comments/{commentId}Delete a comment
POST/api/projects/{projectId}/issues/{issueId}/comments/{commentId}/pinPin a comment
DELETE/api/projects/{projectId}/issues/{issueId}/comments/{commentId}/pinUnpin a comment

Create Comment

POST /api/projects/{projectId}/issues/{issueId}/comments

Request Fields

FieldTypeRequiredDescription
contentstringYesComment text, max 10,000 characters. Supports Markdown and @mentions.
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?"
  }'
json
{
  "id": 10,
  "content": "The pagination is working, but we should add a `per_page` parameter. @jasper what do you think?",
  "is_pinned": false,
  "user_id": 1,
  "issue_id": 42,
  "created_at": "2026-03-13T14:00:00.000000Z"
}

Update Comment

PUT /api/projects/{projectId}/issues/{issueId}/comments/{commentId}

Request Fields

FieldTypeRequiredDescription
contentstringYesUpdated comment text, max 10,000 characters
bash
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.",
  "is_pinned": false,
  "user_id": 1,
  "issue_id": 42,
  "created_at": "2026-03-13T14:00:00.000000Z"
}

Delete Comment

DELETE /api/projects/{projectId}/issues/{issueId}/comments/{commentId}

Returns 204 No Content on success.

bash
curl -X DELETE https://{tenant}.kendo.dev/api/projects/1/issues/42/comments/10 \
  -H "Authorization: Bearer your-token"

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 — 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"
bash
curl -X DELETE https://{tenant}.kendo.dev/api/projects/1/issues/42/comments/10/pin \
  -H "Authorization: Bearer your-token"
json
{
  "id": 10,
  "content": "Decision: we ship the per_page parameter in this PR.",
  "is_pinned": true,
  "user_id": 1,
  "issue_id": 42,
  "created_at": "2026-03-13T14:00:00.000000Z"
}

See Also