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.
List comments
Section titled “List comments”GET /api/workspaces/{workspaceId}/tasks/{taskId}/commentsReturns 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.
Write a comment
Section titled “Write a comment”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 a comment
Section titled “Delete a comment”DELETE /api/workspaces/{workspaceId}/tasks/{taskId}/comments/{commentId}Returns 204. Only the comment’s author and the workspace owner may
delete (403 otherwise).
React / remove a reaction
Section titled “React / remove a reaction”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.
