Create a comment in a release's discussion thread.
slug
The workspace slug. It appears in your Plane URLs. In https://app.plane.so/my-team/projects/, the slug is my-team.
https://app.plane.so/my-team/projects/
my-team
release_id
The release the resource belongs to.
comment_html
The comment body as HTML.
is_resolved
Whether the comment is resolved.
parent_id
Id of the parent comment, for threaded replies.
Nullable.
fields
Comma-separated list of fields to return. Fields you don't request are left out of the response instead of coming back as null. id is always included. Pass all to get every requestable field. An unknown field name returns 400. See Sparse fields.
null
id
all
400
Requestable here: comment_html, comment_id, created_at, created_by_id, edited_at, id, is_hidden, is_resolved, parent_id, release_id, updated_at, updated_by_id.
comment_id
created_at
created_by_id
edited_at
is_hidden
updated_at
updated_by_id
releases.comments:write
invalid_request
401
unauthorized
402
payment_required
403
forbidden
404
not_found
406
not_acceptable
Accept
409
conflict
413
payload_too_large
415
unsupported_media_type
Content-Type
429
rate_limited
Retry-After
curl -X POST \ "https://api.plane.so/api/v2/workspaces/my-team/releases/9c1f0b3d-6d2e-4c9a-8b41-2f7e5a0d6c88/comments/" \ -H "X-Api-Key: $PLANE_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "comment_html": "example", "is_resolved": false, "parent_id": "f960d3c2-8524-4a41-b8eb-055ce4be2a7f" }'
import requests response = requests.post( "https://api.plane.so/api/v2/workspaces/my-team/releases/9c1f0b3d-6d2e-4c9a-8b41-2f7e5a0d6c88/comments/", headers={"X-Api-Key": "your-api-key"}, json={ "comment_html": "example", "is_resolved": False, "parent_id": "f960d3c2-8524-4a41-b8eb-055ce4be2a7f" }, ) print(response.json())
const response = await fetch( "https://api.plane.so/api/v2/workspaces/my-team/releases/9c1f0b3d-6d2e-4c9a-8b41-2f7e5a0d6c88/comments/", { method: "POST", headers: { "X-Api-Key": "your-api-key", "Content-Type": "application/json", }, body: JSON.stringify({ comment_html: "example", is_resolved: false, parent_id: "f960d3c2-8524-4a41-b8eb-055ce4be2a7f", }), }, ); const data = await response.json();
{ "comment_html": "example", "comment_id": "f960d3c2-8524-4a41-b8eb-055ce4be2a7f", "created_at": "2026-01-14T09:22:41.478363Z", "updated_at": "2026-01-14T09:22:41.478363Z", "created_by_id": "16c61a3a-512a-48ac-b0be-b6b46fe6f430", "updated_by_id": null, "edited_at": "2026-01-14T09:22:41.478363Z", "id": "b7e42a19-3c5d-4f80-9a26-8d1c0f4e7b53", "is_hidden": false, "is_resolved": false, "parent_id": "f960d3c2-8524-4a41-b8eb-055ce4be2a7f", "release_id": "f960d3c2-8524-4a41-b8eb-055ce4be2a7f" }
Create a release comment
Create a comment in a release's discussion thread.
Path parameters
slug:requiredstringThe workspace slug. It appears in your Plane URLs. In
https://app.plane.so/my-team/projects/, the slug ismy-team.release_id:requiredstring (uuid)The release the resource belongs to.
Body parameters
comment_html:requiredstringThe comment body as HTML.
is_resolved:optionalbooleanWhether the comment is resolved.
parent_id:optionalstring (uuid)Id of the parent comment, for threaded replies.
Nullable.
Response shaping
fields:optionalstringComma-separated list of fields to return. Fields you don't request are left out of the response instead of coming back as
null.idis always included. Passallto get every requestable field. An unknown field name returns400. See Sparse fields.Requestable here:
comment_html,comment_id,created_at,created_by_id,edited_at,id,is_hidden,is_resolved,parent_id,release_id,updated_at,updated_by_id.Scopes
releases.comments:writeErrors
400invalid_request401unauthorized402payment_required403forbidden404not_found406not_acceptableAcceptheader asks for a representation the API can't produce.409conflict413payload_too_large415unsupported_media_typeContent-Typeisn't one this endpoint accepts.429rate_limitedRetry-Afterheader before retrying.