Comments
Comments belong to a task and accept either plain text or structured rich-text JSON (the same shape the in-app editor produces). HTML is rejected — the editor is structured to prevent stored XSS.
GET /tasks/{taskId}/comments
List all non-deleted comments on a task, ordered by creation time ascending.
{
"comments": [
{
"id": "...", "task_id": "...",
"author_id": "...", "author_name": "Alice",
"content": "Looking into this now",
"content_type": "text",
"created_at": 1735689600, "updated_at": null
}
]
}
content_type is "text" for plain strings and "rich" for structured JSON.
POST /tasks/{taskId}/comments
Post a comment.
curl -H "Authorization: Bearer kdt_..." \
-H "Content-Type: application/json" \
-d '{"content": "Looking into this now"}' \
https://api.konduit.work/v1/tasks/<id>/comments
For structured rich text, pass the editor's JSON output as content. The exact JSON shape mirrors what the in-app editor exports — capture it from the network tab of any comment posted from the UI to see the schema:
{
"content": {
"type": "doc",
"content": [
{ "type": "paragraph", "content": [{ "type": "text", "text": "Looking into this now" }] }
]
}
}
Posting on behalf of a member (comment_as)
If your API key is a service account integration, pass comment_as (a workspace member's user ID) so the comment displays as authored by that member rather than the service account:
{ "content": "Synced from Slack", "comment_as": "user_id_xxx" }
The comment_as member must be a workspace member. Useful for Slack/Teams sync, support-ticket import, etc.
PATCH /tasks/{taskId}/comments/{commentId}
Edit a comment. Body: { "content": "..." }.
Authorization:
- Master keys (scopes =
*) can edit any comment in the workspace - Scoped keys can only edit comments authored by the API key's creator
DELETE /tasks/{taskId}/comments/{commentId}
Soft-delete a comment. Same authorization rules as PATCH. Comments are removed from list responses but retained in the database for audit purposes.