Release comments are the discussion thread on a release. Create a release comment.
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 html.
is_resolved
Whether is resolved.
parent_id
Id of the related parent.
Nullable.
fields
Comma-separated list of fields to return. Unrequested keys are omitted, not returned as null. id always comes back. Pass all for every requestable field. An unknown name is a 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.
comment_id
created_at
created_by_id
edited_at
is_hidden
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", "created_by_id": "16c61a3a-512a-48ac-b0be-b6b46fe6f430", "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
Release comments are the discussion thread on a release. Create a release comment.
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 html.
is_resolved:optionalbooleanWhether is resolved.
parent_id:optionalstring (uuid)Id of the related parent.
Nullable.
Response shaping
fields:optionalstringComma-separated list of fields to return. Unrequested keys are omitted, not returned as
null.idalways comes back. Passallfor every requestable field. An unknown name is a400. 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.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.