Skip to content

API: Comments

Comments are discussion threads on a task. Every workspace member can read and write them; emoji reactions are per user and per emoji.

GET /api/workspaces/{workspaceId}/tasks/{taskId}/comments

Returns the task’s comments, newest first:

[
{
"id": "019f8a12-…",
"body": "Looks good — ship it.",
"author": {
"userId": "019f7488-…",
"firstName": "Ada",
"lastName": "Lovelace",
"avatarUrl": "/api/avatars/019f7488-…?v=…",
"inactive": false
},
"createdAt": "2026-07-22T09:50:16Z",
"reactions": [
{ "emoji": "👍", "count": 2, "mine": true }
]
}
]

reactions is aggregated per emoji; mine is true when the calling user reacted with that emoji. author.inactive marks content whose author deleted their account — clients render a localized “Inactive User” label.

POST /api/workspaces/{workspaceId}/tasks/{taskId}/comments
{ "body": "Looks good — ship it." }

Returns 201 with { "id": "…" }. The body must not be blank and is limited to 2000 characters (400 otherwise).

DELETE /api/workspaces/{workspaceId}/tasks/{taskId}/comments/{commentId}

Returns 204. Only the comment’s author and the workspace owner may delete (403 otherwise).

PUT /api/workspaces/{workspaceId}/tasks/{taskId}/comments/{commentId}/reactions/{emoji}
DELETE /api/workspaces/{workspaceId}/tasks/{taskId}/comments/{commentId}/reactions/{emoji}

PUT sets the calling user’s reaction, DELETE removes it; both are idempotent and return 204. The {emoji} path segment is the URL-encoded emoji itself. Supported reactions: 👍 ❤️ 😄 🎉 👀 🚀 — anything else answers 400.