English
Appearance
Per-todo threaded comments. All endpoints require authentication and team membership. Comment permissions are checked against the team's permission configuration.
GET /api/teams/:teamId/todos/:todoId/comments
List all comments on a todo, ordered by createdAt ascending (oldest first).
createdAt
Auth required: Yes — team member with view_todos for the set
view_todos
Path parameters:
teamId
todoId
Response:
{ "comments": [ { "id": "uuid", "userId": "user-uuid", "username": "alice", "displayName": "Alice Chen", "avatarUrl": "https://id.example.com/avatars/alice.png", "body": "Looks good to me!", "createdAt": "2026-03-17T14:30:00.000Z" }, { "id": "uuid-2", "userId": "user-uuid-2", "username": "bob", "displayName": "Bob Smith", "avatarUrl": "", "body": "I'll handle the deployment.", "createdAt": "2026-03-17T15:00:00.000Z" } ] }
comments[].id
comments[].userId
comments[].username
comments[].displayName
comments[].avatarUrl
comments[].body
comments[].createdAt
Error responses:
error
401
"Unauthorized"
403
"Forbidden"
404
"Todo not found"
POST /api/teams/:teamId/todos/:todoId/comments
Add a new comment to a todo.
Auth required: Yes — comment permission
comment
Request body:
{ "body": "Looks good to me!" }
body
Response (201):
{ "comment": { "id": "new-uuid", "userId": "user-uuid", "username": "alice", "displayName": "Alice Chen", "avatarUrl": "https://id.example.com/avatars/alice.png", "body": "Looks good to me!", "createdAt": "2026-03-17T14:30:00.000Z" } }
400
"Body is required"
DELETE /api/teams/:teamId/todos/:todoId/comments/:commentId
Delete a comment. You can always delete your own comments; deleting others' requires the delete_any_comment permission.
delete_any_comment
Auth required: Yes — delete_own_comments (own comment) or delete_any_comment (others')
delete_own_comments
commentId
{ "ok": true }
"Comment not found"
Comments API
Per-todo threaded comments. All endpoints require authentication and team membership. Comment permissions are checked against the team's permission configuration.
GET /api/teams/:teamId/todos/:todoId/commentsList all comments on a todo, ordered by
createdAtascending (oldest first).Auth required: Yes — team member with
view_todosfor the setPath parameters:
teamIdtodoIdResponse:
comments[].idcomments[].userIdcomments[].usernamecomments[].displayNamecomments[].avatarUrlcomments[].bodycomments[].createdAtError responses:
error401"Unauthorized"403"Forbidden"view_todosis revoked for this set.404"Todo not found"POST /api/teams/:teamId/todos/:todoId/commentsAdd a new comment to a todo.
Auth required: Yes —
commentpermissionRequest body:
bodyResponse (201):
Error responses:
error400"Body is required"bodyis missing or empty.403"Forbidden"commentpermission.404"Todo not found"DELETE /api/teams/:teamId/todos/:todoId/comments/:commentIdDelete a comment. You can always delete your own comments; deleting others' requires the
delete_any_commentpermission.Auth required: Yes —
delete_own_comments(own comment) ordelete_any_comment(others')Path parameters:
commentIdResponse:
Error responses:
error403"Forbidden"delete_any_comment.404"Comment not found"