Skip to content

Update a comment

PATCH/api/v2/workspaces/{slug}/projects/{project_id}/work-items/{work_item_id}/comments/{pk}/

Edit an existing comment. Updates are partial — send only the fields you want to change, and everything you omit is left untouched. There is no PUT.

Plane stamps edited_at on the comment when the update succeeds, which is what clients render as an "edited" marker. When you send comment_html, the plain-text comment_stripped is re-derived from it in the same write, so search stays in sync with the visible body.

Editing is not restricted to your own comment id

Whether you can edit a given comment is decided by your role and token scope, not by a body field. A comment you are not allowed to edit returns 403 forbidden; a comment on another work item returns 404.

Path Parameters

slug:requiredstring

The workspace slug. It appears in your Plane URLs — in https://app.plane.so/my-team/projects/, the slug is my-team.

project_id:requiredstring (uuid)

The project the work item belongs to.

work_item_id:requiredstring (uuid)

The work item the comment is attached to.

pk:requiredstring (uuid)

The comment to update.

Body Parameters

comment_html:optionalstring

Replacement body for the comment, as HTML. It overwrites the previous body — there is no append mode, so send the full new text.

access:optionalstring

Change the comment's visibility.

  • INTERNAL — visible to the project team
  • EXTERNAL — marked as visible outside the team, for example on a published project
external_id:optionalstring

Your system's identifier for this comment. Maximum 255 characters. Accepts null to clear the correlation.

external_source:optionalstring

The system external_id came from, for example github or zendesk. Maximum 255 characters. Accepts null.

external_id is a correlation field, not a key: nothing stops two comments on the same work item from carrying the same value, so keep your own side of the mapping authoritative.

Scopes

projects.work_items.comments:write

Errors

StatusCodeCause
400validation_errorAn access value outside the enum, or an external_id over 255 characters.
401unauthorizedMissing or invalid credentials.
403forbiddenYour role or token scope can't edit this comment.
404resource_not_foundNo such comment, it belongs to another work item, or it's outside your tenant.
409conflictThe update conflicts with the current state of the comment.
429rate_limitedThrottled. Honor the Retry-After header before retrying.
Update a comment
bash
curl -X PATCH \
  "https://api.plane.so/api/v2/workspaces/my-team/projects/4af68566-94a4-4eb3-94aa-50dc9427067b/work-items/8f4c2b1e-0d3a-4f7b-9c21-6e5a8b7d4f13/comments/c1f7a3d9-2b64-4f80-9c1a-3d5e8b2a6c47/" \
  -H "X-Api-Key: $PLANE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "comment_html": "<p>Deployed the fix to staging and production.</p>"
}'
Response200
json
{
  "id": "c1f7a3d9-2b64-4f80-9c1a-3d5e8b2a6c47",
  "work_item_id": "8f4c2b1e-0d3a-4f7b-9c21-6e5a8b7d4f13",
  "comment_html": "<p>Deployed the fix to staging and production.</p>",
  "comment_stripped": "Deployed the fix to staging and production.",
  "access": "INTERNAL",
  "actor_id": "16c61a3a-512a-48ac-b0be-b6b46fe6f430",
  "external_id": null,
  "external_source": null,
  "edited_at": "2026-01-15T11:04:02.115740Z",
  "created_at": "2026-01-14T09:22:41.478363Z",
  "created_by_id": "16c61a3a-512a-48ac-b0be-b6b46fe6f430"
}
Response400
json
{
  "type": "https://api.plane.so/errors/validation_error",
  "title": "Validation Error",
  "status": 400,
  "code": "validation_error",
  "detail": "The request body failed validation.",
  "errors": [{ "field": "access", "message": "\"PUBLIC\" is not a valid choice." }]
}