Skip to content

Project release comments overview ​

Project release comments are the discussion thread on a project release. They are the same object as release comments on a workspace release, served under the project route.

A comment can reply to another comment through parent_id, and you can mark a thread resolved with is_resolved.

Learn more about project releases

The project release comment object ​

Attributes ​

  • id string (uuid)

    Unique identifier for the comment.

  • release_id string (uuid)

    The release the comment is on.

  • comment_id string (uuid)

    The id of the description record that holds the comment body.

  • comment_html string

    The comment body as HTML.

  • parent_id string (uuid)

    The comment this one replies to. null for a top-level comment.

  • edited_at string (date-time)

    When the body was last changed. null until an update changes comment_html.

  • is_resolved boolean

    Whether the comment is marked resolved.

  • is_hidden boolean

    Whether the comment has been hidden by moderation. Read-only.

  • created_at string (date-time)

    When the comment was created.

  • updated_at string (date-time)

    When the comment was last updated.

  • created_by_id string (uuid)

    The user who wrote the comment.

  • updated_by_id string (uuid)

    The user who last updated the comment.

Response200
json
{
  "id": "9a4e7c21-6b3d-4f58-8e12-7d0c5b9a3f46",
  "release_id": "3e8a1f52-7c4b-4d9e-a6f1-0b2c5d8e9f14",
  "comment_id": "2f8c1d6e-5a9b-4e37-b4c0-8e1f7a2d9c53",
  "comment_html": "<p>QA signed off on the offline mode build.</p>",
  "parent_id": null,
  "edited_at": null,
  "is_resolved": false,
  "is_hidden": false,
  "created_at": "2026-02-20T10:14:07.552190Z",
  "updated_at": "2026-02-20T10:14:07.552190Z",
  "created_by_id": "16c61a3a-512a-48ac-b0be-b6b46fe6f430",
  "updated_by_id": "16c61a3a-512a-48ac-b0be-b6b46fe6f430"
}

Endpoints ​

MethodPathDescription
GET/api/v2/workspaces/{slug}/projects/{project_id}/releases/{release_id}/comments/List project release comments
GET/api/v2/workspaces/{slug}/projects/{project_id}/releases/{release_id}/comments/{pk}/Get a project release comment
POST/api/v2/workspaces/{slug}/projects/{project_id}/releases/{release_id}/comments/Create a project release comment
PATCH/api/v2/workspaces/{slug}/projects/{project_id}/releases/{release_id}/comments/{pk}/Update a project release comment
DELETE/api/v2/workspaces/{slug}/projects/{project_id}/releases/{release_id}/comments/{pk}/Delete a project release comment

Access follows the release ​

Comments have no permissions of their own. Every request checks your access to the parent release in its project:

  • Reading comments needs view access to the release. Without it, list and get return 404, the same answer as for a release that doesn't exist.
  • Creating a comment needs view and edit access to the release. Without view access you get 404. With view access but no edit access you get 403.
  • Updating or deleting a comment needs edit access to the release, and returns 403 without it. The API doesn't check who wrote the comment, so anyone who can edit the release can edit or delete any of its comments.

Every route also checks that the release belongs to the project in the path and that the comment belongs to the release. A mismatch at either level returns 404.

These routes need the project releases entitlement on your plan, and return 402 payment_required without it. The workspace comment routes at /api/v2/workspaces/{slug}/releases/{release_id}/comments/ don't serve project releases and return 404 for them.

Response shaping ​

Every project release comment read accepts ?fields= for sparse responses. See Sparse fields. Errors follow the shared problem+json contract.

Changed from v1 ​

In v1, comments on a project release were served on the workspace route, /api/v1/workspaces/{slug}/releases/{release_id}/comments/. In v2 they live under the project route. See Migrating from v1.