# Comments service

Comments service manages conversations about resources.

OpenAPI file: [`CommentsService.json`](https://dev.nominal.io/api/_downloads/29f9a0595906bd719b7e5208e4dfa09a/CommentsService.json)

## Endpoints

### Get conversation

GET `/comments/v1/conversations/{resourceType}/{resourceRid}`

A conversation is a fully resolved comment tree. It includes all comments for the given resource and all the nested comments/replies to those comments.

Path parameters

`resourceType` string, one of `RUN`, `EVENT` required
:   The type of resource that the comments are associated with

`resourceRid` string (RID) required
:   The RID of resource that the comments are associated with

Response

`resourceRid` string (RID)
:   RID for the resource that the conversation is associated with.

`resourceType` [`ResourceType`](https://dev.nominal.io/api/legacy/comments-service.md#resourcetype)
:   The type of the resource that the conversation is associated with.

    Values of `ResourceType`

    `RUN`
    :   ​

    `EVENT`
    :   ​

`comments` array of [`ConversationNode`](https://dev.nominal.io/api/legacy/comments-service.md#conversationnode)
:   The comments on the conversation ordered by creation time. Empty if the comment has no replies.

    Fields of `ConversationNode`

    `comment` [`Comment`](https://dev.nominal.io/api/legacy/comments-service.md#comment)
    :   The comment

        Fields of `Comment`

        `rid` string (RID)
        :   Unique resource identifier for the comment

        `parent` [`CommentParent`](https://dev.nominal.io/api/legacy/comments-service.md#commentparent)
        :   The parent of the comment. It can be a resource or another comment.

            **resource**

            Set `type` to `"resource"`.

            `resource` [`CommentParentResource`](https://dev.nominal.io/api/legacy/comments-service.md#commentparentresource)
            :   ​

                Fields of `CommentParentResource`

                `resourceType` [`ResourceType`](https://dev.nominal.io/api/legacy/comments-service.md#resourcetype)
                :   The type of resource that the comment is associated with

                `resourceRid` string (RID)
                :   The resource identifier for the resource that the comment is associated with. For example, a run or a workbook.

            **comment**

            Set `type` to `"comment"`.

            `comment` [`CommentParentComment`](https://dev.nominal.io/api/legacy/comments-service.md#commentparentcomment)
            :   ​

                Fields of `CommentParentComment`

                `commentRid` string (RID)
                :   The resource identifier for the comment that the comment is replying to

        `authorRid` string (RID)
        :   The user who authored the comment

        `createdAt` string (date-time)
        :   The time the comment was created

        `editedAt` string (date-time)
        :   The time the comment was edited. Empty if the comment has not been edited.

        `deletedAt` string (date-time)
        :   The time the comment was deleted. Empty if the comment has not been deleted.

        `content` string
        :   The markdown content of the comment.

        `pinnedBy` string (RID)
        :   The user who pinned the comment. Empty if the comment is not pinned.

        `pinnedAt` string (date-time)
        :   The time the comment was pinned. Empty if the comment is not pinned.

        `reactions` array of [`Reaction`](https://dev.nominal.io/api/legacy/comments-service.md#reaction)
        :   The reactions on the comment

            Fields of `Reaction`

            `rid` string (RID)
            :   Unique resource identifier for the reaction

            `userRid` string (RID)
            :   The user who authored the reaction

            `createdAt` string (date-time)
            :   The time the reaction was created

            `type` [`ReactionType`](https://dev.nominal.io/api/legacy/comments-service.md#reactiontype)
            :   The type of reaction

                Values of `ReactionType`

                `LIKE`
                :   ​

                `DISLIKE`
                :   ​

                `HEART`
                :   ​

                `HOORAY`
                :   ​

                `ROCKET`
                :   ​

                `EYES`
                :   ​

        `attachments` array of string (RID)
        :   The comment’s attachments

    `replies` array of [`ConversationNode`](https://dev.nominal.io/api/legacy/comments-service.md#conversationnode)
    :   The comments on (aka replies to) the comment ordered by creation time. Empty if the comment has no replies.

Request

**curl**

```shell
curl "https://api.gov.nominal.io/api/comments/v1/conversations/<resource type>/<resource rid>" \
  -H "Authorization: Bearer <api key>"
```

**requests**

```python
import requests

response = requests.get(
    "https://api.gov.nominal.io/api/comments/v1/conversations/<resource type>/<resource rid>",
    headers={"Authorization": "Bearer <api key>"},
)
response.raise_for_status()
print(response.json())
```

**httpx**

```python
import httpx

response = httpx.get(
    "https://api.gov.nominal.io/api/comments/v1/conversations/<resource type>/<resource rid>",
    headers={"Authorization": "Bearer <api key>"},
)
response.raise_for_status()
print(response.json())
```

**aiohttp**

```python
import asyncio

import aiohttp

async def main() -> None:
    async with aiohttp.ClientSession() as session:
        async with session.get(
            "https://api.gov.nominal.io/api/comments/v1/conversations/<resource type>/<resource rid>",
            headers={"Authorization": "Bearer <api key>"},
        ) as response:
            response.raise_for_status()
            print(await response.json())

asyncio.run(main())
```

Response: `200`

```json
{
  "resourceRid": "<resource rid>",
  "resourceType": "RUN",
  "comments": [
    {
      "comment": {
        "rid": "<comment rid>",
        "parent": {
          "type": "resource",
          "resource": {
            "resourceType": "RUN",
            "resourceRid": "<resource rid>"
          }
        },
        "authorRid": "<author rid>",
        "createdAt": "2026-01-01T00:00:00Z",
        "editedAt": "2026-01-01T00:00:00Z",
        "deletedAt": "2026-01-01T00:00:00Z",
        "content": "<content>",
        "pinnedBy": "<pinned by>",
        "pinnedAt": "2026-01-01T00:00:00Z",
        "reactions": [
          {
            "rid": "<reaction rid>",
            "userRid": "<user rid>",
            "createdAt": "2026-01-01T00:00:00Z",
            "type": "LIKE"
          }
        ],
        "attachments": [
          "<attachment rid>"
        ]
      },
      "replies": []
    }
  ]
}
```

### Get conversation count

GET `/comments/v1/conversations/{resourceType}/{resourceRid}/count`

Returns the number of comments in a conversation.

Path parameters

`resourceType` string, one of `RUN`, `EVENT` required
:   The type of resource that the comments are associated with

`resourceRid` string (RID) required
:   The RID of resource that the comments are associated with

Query parameters

`includeDeleted` boolean
:   Whether to include deleted comments in the count

Response

The body is an integer.

Request

**curl**

```shell
curl "https://api.gov.nominal.io/api/comments/v1/conversations/<resource type>/<resource rid>/count" \
  -H "Authorization: Bearer <api key>"
```

**requests**

```python
import requests

response = requests.get(
    "https://api.gov.nominal.io/api/comments/v1/conversations/<resource type>/<resource rid>/count",
    headers={"Authorization": "Bearer <api key>"},
)
response.raise_for_status()
print(response.json())
```

**httpx**

```python
import httpx

response = httpx.get(
    "https://api.gov.nominal.io/api/comments/v1/conversations/<resource type>/<resource rid>/count",
    headers={"Authorization": "Bearer <api key>"},
)
response.raise_for_status()
print(response.json())
```

**aiohttp**

```python
import asyncio

import aiohttp

async def main() -> None:
    async with aiohttp.ClientSession() as session:
        async with session.get(
            "https://api.gov.nominal.io/api/comments/v1/conversations/<resource type>/<resource rid>/count",
            headers={"Authorization": "Bearer <api key>"},
        ) as response:
            response.raise_for_status()
            print(await response.json())

asyncio.run(main())
```

Response: `200`

```json
1
```

### Get comment

GET `/comments/v1/comments/{commentRid}`

Get a comment identified by its RID

Path parameters

`commentRid` string (RID) required
:   The RID of comment to fetch

Response

`rid` string (RID)
:   Unique resource identifier for the comment

`parent` [`CommentParent`](https://dev.nominal.io/api/legacy/comments-service.md#commentparent)
:   The parent of the comment. It can be a resource or another comment.

    **resource**

    Set `type` to `"resource"`.

    `resource` [`CommentParentResource`](https://dev.nominal.io/api/legacy/comments-service.md#commentparentresource)
    :   ​

        Fields of `CommentParentResource`

        `resourceType` [`ResourceType`](https://dev.nominal.io/api/legacy/comments-service.md#resourcetype)
        :   The type of resource that the comment is associated with

            Values of `ResourceType`

            `RUN`
            :   ​

            `EVENT`
            :   ​

        `resourceRid` string (RID)
        :   The resource identifier for the resource that the comment is associated with. For example, a run or a workbook.

    **comment**

    Set `type` to `"comment"`.

    `comment` [`CommentParentComment`](https://dev.nominal.io/api/legacy/comments-service.md#commentparentcomment)
    :   ​

        Fields of `CommentParentComment`

        `commentRid` string (RID)
        :   The resource identifier for the comment that the comment is replying to

`authorRid` string (RID)
:   The user who authored the comment

`createdAt` string (date-time)
:   The time the comment was created

`editedAt` string (date-time)
:   The time the comment was edited. Empty if the comment has not been edited.

`deletedAt` string (date-time)
:   The time the comment was deleted. Empty if the comment has not been deleted.

`content` string
:   The markdown content of the comment.

`pinnedBy` string (RID)
:   The user who pinned the comment. Empty if the comment is not pinned.

`pinnedAt` string (date-time)
:   The time the comment was pinned. Empty if the comment is not pinned.

`reactions` array of [`Reaction`](https://dev.nominal.io/api/legacy/comments-service.md#reaction)
:   The reactions on the comment

    Fields of `Reaction`

    `rid` string (RID)
    :   Unique resource identifier for the reaction

    `userRid` string (RID)
    :   The user who authored the reaction

    `createdAt` string (date-time)
    :   The time the reaction was created

    `type` [`ReactionType`](https://dev.nominal.io/api/legacy/comments-service.md#reactiontype)
    :   The type of reaction

        Values of `ReactionType`

        `LIKE`
        :   ​

        `DISLIKE`
        :   ​

        `HEART`
        :   ​

        `HOORAY`
        :   ​

        `ROCKET`
        :   ​

        `EYES`
        :   ​

`attachments` array of string (RID)
:   The comment’s attachments

Request

**curl**

```shell
curl "https://api.gov.nominal.io/api/comments/v1/comments/<comment rid>" \
  -H "Authorization: Bearer <api key>"
```

**requests**

```python
import requests

response = requests.get(
    "https://api.gov.nominal.io/api/comments/v1/comments/<comment rid>",
    headers={"Authorization": "Bearer <api key>"},
)
response.raise_for_status()
print(response.json())
```

**httpx**

```python
import httpx

response = httpx.get(
    "https://api.gov.nominal.io/api/comments/v1/comments/<comment rid>",
    headers={"Authorization": "Bearer <api key>"},
)
response.raise_for_status()
print(response.json())
```

**aiohttp**

```python
import asyncio

import aiohttp

async def main() -> None:
    async with aiohttp.ClientSession() as session:
        async with session.get(
            "https://api.gov.nominal.io/api/comments/v1/comments/<comment rid>",
            headers={"Authorization": "Bearer <api key>"},
        ) as response:
            response.raise_for_status()
            print(await response.json())

asyncio.run(main())
```

Response: `200`

```json
{
  "rid": "<comment rid>",
  "parent": {
    "type": "resource",
    "resource": {
      "resourceType": "RUN",
      "resourceRid": "<resource rid>"
    }
  },
  "authorRid": "<author rid>",
  "createdAt": "2026-01-01T00:00:00Z",
  "editedAt": "2026-01-01T00:00:00Z",
  "deletedAt": "2026-01-01T00:00:00Z",
  "content": "<content>",
  "pinnedBy": "<pinned by>",
  "pinnedAt": "2026-01-01T00:00:00Z",
  "reactions": [
    {
      "rid": "<reaction rid>",
      "userRid": "<user rid>",
      "createdAt": "2026-01-01T00:00:00Z",
      "type": "LIKE"
    }
  ],
  "attachments": [
    "<attachment rid>"
  ]
}
```

### Edit comment

PUT `/comments/v1/comments/{commentRid}`

Edit an existing comment

Path parameters

`commentRid` string (RID) required
:   The RID of comment to edit

Body

`content` string required
:   The content of the comment. Markdown supported.

`attachments` array of string (RID)
:   Attachments to the comment.

Response

`rid` string (RID)
:   Unique resource identifier for the comment

`parent` [`CommentParent`](https://dev.nominal.io/api/legacy/comments-service.md#commentparent)
:   The parent of the comment. It can be a resource or another comment.

    **resource**

    Set `type` to `"resource"`.

    `resource` [`CommentParentResource`](https://dev.nominal.io/api/legacy/comments-service.md#commentparentresource)
    :   ​

        Fields of `CommentParentResource`

        `resourceType` [`ResourceType`](https://dev.nominal.io/api/legacy/comments-service.md#resourcetype)
        :   The type of resource that the comment is associated with

            Values of `ResourceType`

            `RUN`
            :   ​

            `EVENT`
            :   ​

        `resourceRid` string (RID)
        :   The resource identifier for the resource that the comment is associated with. For example, a run or a workbook.

    **comment**

    Set `type` to `"comment"`.

    `comment` [`CommentParentComment`](https://dev.nominal.io/api/legacy/comments-service.md#commentparentcomment)
    :   ​

        Fields of `CommentParentComment`

        `commentRid` string (RID)
        :   The resource identifier for the comment that the comment is replying to

`authorRid` string (RID)
:   The user who authored the comment

`createdAt` string (date-time)
:   The time the comment was created

`editedAt` string (date-time)
:   The time the comment was edited. Empty if the comment has not been edited.

`deletedAt` string (date-time)
:   The time the comment was deleted. Empty if the comment has not been deleted.

`content` string
:   The markdown content of the comment.

`pinnedBy` string (RID)
:   The user who pinned the comment. Empty if the comment is not pinned.

`pinnedAt` string (date-time)
:   The time the comment was pinned. Empty if the comment is not pinned.

`reactions` array of [`Reaction`](https://dev.nominal.io/api/legacy/comments-service.md#reaction)
:   The reactions on the comment

    Fields of `Reaction`

    `rid` string (RID)
    :   Unique resource identifier for the reaction

    `userRid` string (RID)
    :   The user who authored the reaction

    `createdAt` string (date-time)
    :   The time the reaction was created

    `type` [`ReactionType`](https://dev.nominal.io/api/legacy/comments-service.md#reactiontype)
    :   The type of reaction

        Values of `ReactionType`

        `LIKE`
        :   ​

        `DISLIKE`
        :   ​

        `HEART`
        :   ​

        `HOORAY`
        :   ​

        `ROCKET`
        :   ​

        `EYES`
        :   ​

`attachments` array of string (RID)
:   The comment’s attachments

Request

**curl**

```shell
curl -X PUT "https://api.gov.nominal.io/api/comments/v1/comments/<comment rid>" \
  -H "Authorization: Bearer <api key>" \
  -H "Content-Type: application/json" \
  --data '{
  "content": "<content>"
}'
```

**requests**

```python
import requests

response = requests.put(
    "https://api.gov.nominal.io/api/comments/v1/comments/<comment rid>",
    headers={"Authorization": "Bearer <api key>"},
    json={"content": "<content>"},
)
response.raise_for_status()
print(response.json())
```

**httpx**

```python
import httpx

response = httpx.put(
    "https://api.gov.nominal.io/api/comments/v1/comments/<comment rid>",
    headers={"Authorization": "Bearer <api key>"},
    json={"content": "<content>"},
)
response.raise_for_status()
print(response.json())
```

**aiohttp**

```python
import asyncio

import aiohttp

async def main() -> None:
    async with aiohttp.ClientSession() as session:
        async with session.put(
            "https://api.gov.nominal.io/api/comments/v1/comments/<comment rid>",
            headers={"Authorization": "Bearer <api key>"},
            json={"content": "<content>"},
        ) as response:
            response.raise_for_status()
            print(await response.json())

asyncio.run(main())
```

Response: `200`

```json
{
  "rid": "<comment rid>",
  "parent": {
    "type": "resource",
    "resource": {
      "resourceType": "RUN",
      "resourceRid": "<resource rid>"
    }
  },
  "authorRid": "<author rid>",
  "createdAt": "2026-01-01T00:00:00Z",
  "editedAt": "2026-01-01T00:00:00Z",
  "deletedAt": "2026-01-01T00:00:00Z",
  "content": "<content>",
  "pinnedBy": "<pinned by>",
  "pinnedAt": "2026-01-01T00:00:00Z",
  "reactions": [
    {
      "rid": "<reaction rid>",
      "userRid": "<user rid>",
      "createdAt": "2026-01-01T00:00:00Z",
      "type": "LIKE"
    }
  ],
  "attachments": [
    "<attachment rid>"
  ]
}
```

### Delete comment

DELETE `/comments/v1/comments/{commentRid}`

Delete an existing comment

Path parameters

`commentRid` string (RID) required
:   The RID of comment to delete

Response

`rid` string (RID)
:   Unique resource identifier for the comment

`parent` [`CommentParent`](https://dev.nominal.io/api/legacy/comments-service.md#commentparent)
:   The parent of the comment. It can be a resource or another comment.

    **resource**

    Set `type` to `"resource"`.

    `resource` [`CommentParentResource`](https://dev.nominal.io/api/legacy/comments-service.md#commentparentresource)
    :   ​

        Fields of `CommentParentResource`

        `resourceType` [`ResourceType`](https://dev.nominal.io/api/legacy/comments-service.md#resourcetype)
        :   The type of resource that the comment is associated with

            Values of `ResourceType`

            `RUN`
            :   ​

            `EVENT`
            :   ​

        `resourceRid` string (RID)
        :   The resource identifier for the resource that the comment is associated with. For example, a run or a workbook.

    **comment**

    Set `type` to `"comment"`.

    `comment` [`CommentParentComment`](https://dev.nominal.io/api/legacy/comments-service.md#commentparentcomment)
    :   ​

        Fields of `CommentParentComment`

        `commentRid` string (RID)
        :   The resource identifier for the comment that the comment is replying to

`authorRid` string (RID)
:   The user who authored the comment

`createdAt` string (date-time)
:   The time the comment was created

`editedAt` string (date-time)
:   The time the comment was edited. Empty if the comment has not been edited.

`deletedAt` string (date-time)
:   The time the comment was deleted. Empty if the comment has not been deleted.

`content` string
:   The markdown content of the comment.

`pinnedBy` string (RID)
:   The user who pinned the comment. Empty if the comment is not pinned.

`pinnedAt` string (date-time)
:   The time the comment was pinned. Empty if the comment is not pinned.

`reactions` array of [`Reaction`](https://dev.nominal.io/api/legacy/comments-service.md#reaction)
:   The reactions on the comment

    Fields of `Reaction`

    `rid` string (RID)
    :   Unique resource identifier for the reaction

    `userRid` string (RID)
    :   The user who authored the reaction

    `createdAt` string (date-time)
    :   The time the reaction was created

    `type` [`ReactionType`](https://dev.nominal.io/api/legacy/comments-service.md#reactiontype)
    :   The type of reaction

        Values of `ReactionType`

        `LIKE`
        :   ​

        `DISLIKE`
        :   ​

        `HEART`
        :   ​

        `HOORAY`
        :   ​

        `ROCKET`
        :   ​

        `EYES`
        :   ​

`attachments` array of string (RID)
:   The comment’s attachments

Request

**curl**

```shell
curl -X DELETE "https://api.gov.nominal.io/api/comments/v1/comments/<comment rid>" \
  -H "Authorization: Bearer <api key>"
```

**requests**

```python
import requests

response = requests.delete(
    "https://api.gov.nominal.io/api/comments/v1/comments/<comment rid>",
    headers={"Authorization": "Bearer <api key>"},
)
response.raise_for_status()
print(response.json())
```

**httpx**

```python
import httpx

response = httpx.delete(
    "https://api.gov.nominal.io/api/comments/v1/comments/<comment rid>",
    headers={"Authorization": "Bearer <api key>"},
)
response.raise_for_status()
print(response.json())
```

**aiohttp**

```python
import asyncio

import aiohttp

async def main() -> None:
    async with aiohttp.ClientSession() as session:
        async with session.delete(
            "https://api.gov.nominal.io/api/comments/v1/comments/<comment rid>",
            headers={"Authorization": "Bearer <api key>"},
        ) as response:
            response.raise_for_status()
            print(await response.json())

asyncio.run(main())
```

Response: `200`

```json
{
  "rid": "<comment rid>",
  "parent": {
    "type": "resource",
    "resource": {
      "resourceType": "RUN",
      "resourceRid": "<resource rid>"
    }
  },
  "authorRid": "<author rid>",
  "createdAt": "2026-01-01T00:00:00Z",
  "editedAt": "2026-01-01T00:00:00Z",
  "deletedAt": "2026-01-01T00:00:00Z",
  "content": "<content>",
  "pinnedBy": "<pinned by>",
  "pinnedAt": "2026-01-01T00:00:00Z",
  "reactions": [
    {
      "rid": "<reaction rid>",
      "userRid": "<user rid>",
      "createdAt": "2026-01-01T00:00:00Z",
      "type": "LIKE"
    }
  ],
  "attachments": [
    "<attachment rid>"
  ]
}
```

### Create comment

POST `/comments/v1/comments`

Create a comment on a resource

Body

`parent` [`CommentParent`](https://dev.nominal.io/api/legacy/comments-service.md#commentparent) required
:   ​

    **resource**

    Set `type` to `"resource"`.

    `resource` [`CommentParentResource`](https://dev.nominal.io/api/legacy/comments-service.md#commentparentresource)
    :   ​

        Fields of `CommentParentResource`

        `resourceType` [`ResourceType`](https://dev.nominal.io/api/legacy/comments-service.md#resourcetype) required
        :   The type of resource that the comment is associated with

            Values of `ResourceType`

            `RUN`
            :   ​

            `EVENT`
            :   ​

        `resourceRid` string (RID) required
        :   The resource identifier for the resource that the comment is associated with. For example, a run or a workbook.

    **comment**

    Set `type` to `"comment"`.

    `comment` [`CommentParentComment`](https://dev.nominal.io/api/legacy/comments-service.md#commentparentcomment)
    :   ​

        Fields of `CommentParentComment`

        `commentRid` string (RID) required
        :   The resource identifier for the comment that the comment is replying to

`content` string required
:   The content of the comment. Markdown supported.

`attachments` array of string (RID)
:   Attachments to the comment.

Response

`rid` string (RID)
:   Unique resource identifier for the comment

`parent` [`CommentParent`](https://dev.nominal.io/api/legacy/comments-service.md#commentparent)
:   The parent of the comment. It can be a resource or another comment.

    **resource**

    Set `type` to `"resource"`.

    `resource` [`CommentParentResource`](https://dev.nominal.io/api/legacy/comments-service.md#commentparentresource)
    :   ​

        Fields of `CommentParentResource`

        `resourceType` [`ResourceType`](https://dev.nominal.io/api/legacy/comments-service.md#resourcetype)
        :   The type of resource that the comment is associated with

            Values of `ResourceType`

            `RUN`
            :   ​

            `EVENT`
            :   ​

        `resourceRid` string (RID)
        :   The resource identifier for the resource that the comment is associated with. For example, a run or a workbook.

    **comment**

    Set `type` to `"comment"`.

    `comment` [`CommentParentComment`](https://dev.nominal.io/api/legacy/comments-service.md#commentparentcomment)
    :   ​

        Fields of `CommentParentComment`

        `commentRid` string (RID)
        :   The resource identifier for the comment that the comment is replying to

`authorRid` string (RID)
:   The user who authored the comment

`createdAt` string (date-time)
:   The time the comment was created

`editedAt` string (date-time)
:   The time the comment was edited. Empty if the comment has not been edited.

`deletedAt` string (date-time)
:   The time the comment was deleted. Empty if the comment has not been deleted.

`content` string
:   The markdown content of the comment.

`pinnedBy` string (RID)
:   The user who pinned the comment. Empty if the comment is not pinned.

`pinnedAt` string (date-time)
:   The time the comment was pinned. Empty if the comment is not pinned.

`reactions` array of [`Reaction`](https://dev.nominal.io/api/legacy/comments-service.md#reaction)
:   The reactions on the comment

    Fields of `Reaction`

    `rid` string (RID)
    :   Unique resource identifier for the reaction

    `userRid` string (RID)
    :   The user who authored the reaction

    `createdAt` string (date-time)
    :   The time the reaction was created

    `type` [`ReactionType`](https://dev.nominal.io/api/legacy/comments-service.md#reactiontype)
    :   The type of reaction

        Values of `ReactionType`

        `LIKE`
        :   ​

        `DISLIKE`
        :   ​

        `HEART`
        :   ​

        `HOORAY`
        :   ​

        `ROCKET`
        :   ​

        `EYES`
        :   ​

`attachments` array of string (RID)
:   The comment’s attachments

Request

**curl**

```shell
curl -X POST "https://api.gov.nominal.io/api/comments/v1/comments" \
  -H "Authorization: Bearer <api key>" \
  -H "Content-Type: application/json" \
  --data '{
  "parent": {
    "type": "resource",
    "resource": {
      "resourceType": "RUN",
      "resourceRid": "<resource rid>"
    }
  },
  "content": "<content>"
}'
```

**requests**

```python
import requests

response = requests.post(
    "https://api.gov.nominal.io/api/comments/v1/comments",
    headers={"Authorization": "Bearer <api key>"},
    json={
        "parent": {
            "type": "resource",
            "resource": {"resourceType": "RUN", "resourceRid": "<resource rid>"},
        },
        "content": "<content>",
    },
)
response.raise_for_status()
print(response.json())
```

**httpx**

```python
import httpx

response = httpx.post(
    "https://api.gov.nominal.io/api/comments/v1/comments",
    headers={"Authorization": "Bearer <api key>"},
    json={
        "parent": {
            "type": "resource",
            "resource": {"resourceType": "RUN", "resourceRid": "<resource rid>"},
        },
        "content": "<content>",
    },
)
response.raise_for_status()
print(response.json())
```

**aiohttp**

```python
import asyncio

import aiohttp

async def main() -> None:
    async with aiohttp.ClientSession() as session:
        async with session.post(
            "https://api.gov.nominal.io/api/comments/v1/comments",
            headers={"Authorization": "Bearer <api key>"},
            json={
                "parent": {
                    "type": "resource",
                    "resource": {"resourceType": "RUN", "resourceRid": "<resource rid>"},
                },
                "content": "<content>",
            },
        ) as response:
            response.raise_for_status()
            print(await response.json())

asyncio.run(main())
```

Response: `200`

```json
{
  "rid": "<comment rid>",
  "parent": {
    "type": "resource",
    "resource": {
      "resourceType": "RUN",
      "resourceRid": "<resource rid>"
    }
  },
  "authorRid": "<author rid>",
  "createdAt": "2026-01-01T00:00:00Z",
  "editedAt": "2026-01-01T00:00:00Z",
  "deletedAt": "2026-01-01T00:00:00Z",
  "content": "<content>",
  "pinnedBy": "<pinned by>",
  "pinnedAt": "2026-01-01T00:00:00Z",
  "reactions": [
    {
      "rid": "<reaction rid>",
      "userRid": "<user rid>",
      "createdAt": "2026-01-01T00:00:00Z",
      "type": "LIKE"
    }
  ],
  "attachments": [
    "<attachment rid>"
  ]
}
```

### Pin comment

PUT `/comments/v1/comments/{commentRid}/pin`

Pin a comment to the top of the conversation

Path parameters

`commentRid` string (RID) required
:   The RID of comment to pin

Response

`rid` string (RID)
:   Unique resource identifier for the comment

`parent` [`CommentParent`](https://dev.nominal.io/api/legacy/comments-service.md#commentparent)
:   The parent of the comment. It can be a resource or another comment.

    **resource**

    Set `type` to `"resource"`.

    `resource` [`CommentParentResource`](https://dev.nominal.io/api/legacy/comments-service.md#commentparentresource)
    :   ​

        Fields of `CommentParentResource`

        `resourceType` [`ResourceType`](https://dev.nominal.io/api/legacy/comments-service.md#resourcetype)
        :   The type of resource that the comment is associated with

            Values of `ResourceType`

            `RUN`
            :   ​

            `EVENT`
            :   ​

        `resourceRid` string (RID)
        :   The resource identifier for the resource that the comment is associated with. For example, a run or a workbook.

    **comment**

    Set `type` to `"comment"`.

    `comment` [`CommentParentComment`](https://dev.nominal.io/api/legacy/comments-service.md#commentparentcomment)
    :   ​

        Fields of `CommentParentComment`

        `commentRid` string (RID)
        :   The resource identifier for the comment that the comment is replying to

`authorRid` string (RID)
:   The user who authored the comment

`createdAt` string (date-time)
:   The time the comment was created

`editedAt` string (date-time)
:   The time the comment was edited. Empty if the comment has not been edited.

`deletedAt` string (date-time)
:   The time the comment was deleted. Empty if the comment has not been deleted.

`content` string
:   The markdown content of the comment.

`pinnedBy` string (RID)
:   The user who pinned the comment. Empty if the comment is not pinned.

`pinnedAt` string (date-time)
:   The time the comment was pinned. Empty if the comment is not pinned.

`reactions` array of [`Reaction`](https://dev.nominal.io/api/legacy/comments-service.md#reaction)
:   The reactions on the comment

    Fields of `Reaction`

    `rid` string (RID)
    :   Unique resource identifier for the reaction

    `userRid` string (RID)
    :   The user who authored the reaction

    `createdAt` string (date-time)
    :   The time the reaction was created

    `type` [`ReactionType`](https://dev.nominal.io/api/legacy/comments-service.md#reactiontype)
    :   The type of reaction

        Values of `ReactionType`

        `LIKE`
        :   ​

        `DISLIKE`
        :   ​

        `HEART`
        :   ​

        `HOORAY`
        :   ​

        `ROCKET`
        :   ​

        `EYES`
        :   ​

`attachments` array of string (RID)
:   The comment’s attachments

Request

**curl**

```shell
curl -X PUT "https://api.gov.nominal.io/api/comments/v1/comments/<comment rid>/pin" \
  -H "Authorization: Bearer <api key>"
```

**requests**

```python
import requests

response = requests.put(
    "https://api.gov.nominal.io/api/comments/v1/comments/<comment rid>/pin",
    headers={"Authorization": "Bearer <api key>"},
)
response.raise_for_status()
print(response.json())
```

**httpx**

```python
import httpx

response = httpx.put(
    "https://api.gov.nominal.io/api/comments/v1/comments/<comment rid>/pin",
    headers={"Authorization": "Bearer <api key>"},
)
response.raise_for_status()
print(response.json())
```

**aiohttp**

```python
import asyncio

import aiohttp

async def main() -> None:
    async with aiohttp.ClientSession() as session:
        async with session.put(
            "https://api.gov.nominal.io/api/comments/v1/comments/<comment rid>/pin",
            headers={"Authorization": "Bearer <api key>"},
        ) as response:
            response.raise_for_status()
            print(await response.json())

asyncio.run(main())
```

Response: `200`

```json
{
  "rid": "<comment rid>",
  "parent": {
    "type": "resource",
    "resource": {
      "resourceType": "RUN",
      "resourceRid": "<resource rid>"
    }
  },
  "authorRid": "<author rid>",
  "createdAt": "2026-01-01T00:00:00Z",
  "editedAt": "2026-01-01T00:00:00Z",
  "deletedAt": "2026-01-01T00:00:00Z",
  "content": "<content>",
  "pinnedBy": "<pinned by>",
  "pinnedAt": "2026-01-01T00:00:00Z",
  "reactions": [
    {
      "rid": "<reaction rid>",
      "userRid": "<user rid>",
      "createdAt": "2026-01-01T00:00:00Z",
      "type": "LIKE"
    }
  ],
  "attachments": [
    "<attachment rid>"
  ]
}
```

### Unpin comment

DELETE `/comments/v1/comments/{commentRid}/pin`

Unpin a comment from the top of the conversation

Path parameters

`commentRid` string (RID) required
:   The RID of comment to unpin

Response

`rid` string (RID)
:   Unique resource identifier for the comment

`parent` [`CommentParent`](https://dev.nominal.io/api/legacy/comments-service.md#commentparent)
:   The parent of the comment. It can be a resource or another comment.

    **resource**

    Set `type` to `"resource"`.

    `resource` [`CommentParentResource`](https://dev.nominal.io/api/legacy/comments-service.md#commentparentresource)
    :   ​

        Fields of `CommentParentResource`

        `resourceType` [`ResourceType`](https://dev.nominal.io/api/legacy/comments-service.md#resourcetype)
        :   The type of resource that the comment is associated with

            Values of `ResourceType`

            `RUN`
            :   ​

            `EVENT`
            :   ​

        `resourceRid` string (RID)
        :   The resource identifier for the resource that the comment is associated with. For example, a run or a workbook.

    **comment**

    Set `type` to `"comment"`.

    `comment` [`CommentParentComment`](https://dev.nominal.io/api/legacy/comments-service.md#commentparentcomment)
    :   ​

        Fields of `CommentParentComment`

        `commentRid` string (RID)
        :   The resource identifier for the comment that the comment is replying to

`authorRid` string (RID)
:   The user who authored the comment

`createdAt` string (date-time)
:   The time the comment was created

`editedAt` string (date-time)
:   The time the comment was edited. Empty if the comment has not been edited.

`deletedAt` string (date-time)
:   The time the comment was deleted. Empty if the comment has not been deleted.

`content` string
:   The markdown content of the comment.

`pinnedBy` string (RID)
:   The user who pinned the comment. Empty if the comment is not pinned.

`pinnedAt` string (date-time)
:   The time the comment was pinned. Empty if the comment is not pinned.

`reactions` array of [`Reaction`](https://dev.nominal.io/api/legacy/comments-service.md#reaction)
:   The reactions on the comment

    Fields of `Reaction`

    `rid` string (RID)
    :   Unique resource identifier for the reaction

    `userRid` string (RID)
    :   The user who authored the reaction

    `createdAt` string (date-time)
    :   The time the reaction was created

    `type` [`ReactionType`](https://dev.nominal.io/api/legacy/comments-service.md#reactiontype)
    :   The type of reaction

        Values of `ReactionType`

        `LIKE`
        :   ​

        `DISLIKE`
        :   ​

        `HEART`
        :   ​

        `HOORAY`
        :   ​

        `ROCKET`
        :   ​

        `EYES`
        :   ​

`attachments` array of string (RID)
:   The comment’s attachments

Request

**curl**

```shell
curl -X DELETE "https://api.gov.nominal.io/api/comments/v1/comments/<comment rid>/pin" \
  -H "Authorization: Bearer <api key>"
```

**requests**

```python
import requests

response = requests.delete(
    "https://api.gov.nominal.io/api/comments/v1/comments/<comment rid>/pin",
    headers={"Authorization": "Bearer <api key>"},
)
response.raise_for_status()
print(response.json())
```

**httpx**

```python
import httpx

response = httpx.delete(
    "https://api.gov.nominal.io/api/comments/v1/comments/<comment rid>/pin",
    headers={"Authorization": "Bearer <api key>"},
)
response.raise_for_status()
print(response.json())
```

**aiohttp**

```python
import asyncio

import aiohttp

async def main() -> None:
    async with aiohttp.ClientSession() as session:
        async with session.delete(
            "https://api.gov.nominal.io/api/comments/v1/comments/<comment rid>/pin",
            headers={"Authorization": "Bearer <api key>"},
        ) as response:
            response.raise_for_status()
            print(await response.json())

asyncio.run(main())
```

Response: `200`

```json
{
  "rid": "<comment rid>",
  "parent": {
    "type": "resource",
    "resource": {
      "resourceType": "RUN",
      "resourceRid": "<resource rid>"
    }
  },
  "authorRid": "<author rid>",
  "createdAt": "2026-01-01T00:00:00Z",
  "editedAt": "2026-01-01T00:00:00Z",
  "deletedAt": "2026-01-01T00:00:00Z",
  "content": "<content>",
  "pinnedBy": "<pinned by>",
  "pinnedAt": "2026-01-01T00:00:00Z",
  "reactions": [
    {
      "rid": "<reaction rid>",
      "userRid": "<user rid>",
      "createdAt": "2026-01-01T00:00:00Z",
      "type": "LIKE"
    }
  ],
  "attachments": [
    "<attachment rid>"
  ]
}
```

### Add reaction

PUT `/comments/v1/comments/{commentRid}/reactions/{type}`

Create a reaction on a comment

Path parameters

`commentRid` string (RID) required
:   The RID of comment to delete

`type` string, one of `LIKE`, `DISLIKE`, `HEART`, `HOORAY`, `ROCKET`, `EYES` required
:   The type of reaction

Response

`rid` string (RID)
:   Unique resource identifier for the comment

`parent` [`CommentParent`](https://dev.nominal.io/api/legacy/comments-service.md#commentparent)
:   The parent of the comment. It can be a resource or another comment.

    **resource**

    Set `type` to `"resource"`.

    `resource` [`CommentParentResource`](https://dev.nominal.io/api/legacy/comments-service.md#commentparentresource)
    :   ​

        Fields of `CommentParentResource`

        `resourceType` [`ResourceType`](https://dev.nominal.io/api/legacy/comments-service.md#resourcetype)
        :   The type of resource that the comment is associated with

            Values of `ResourceType`

            `RUN`
            :   ​

            `EVENT`
            :   ​

        `resourceRid` string (RID)
        :   The resource identifier for the resource that the comment is associated with. For example, a run or a workbook.

    **comment**

    Set `type` to `"comment"`.

    `comment` [`CommentParentComment`](https://dev.nominal.io/api/legacy/comments-service.md#commentparentcomment)
    :   ​

        Fields of `CommentParentComment`

        `commentRid` string (RID)
        :   The resource identifier for the comment that the comment is replying to

`authorRid` string (RID)
:   The user who authored the comment

`createdAt` string (date-time)
:   The time the comment was created

`editedAt` string (date-time)
:   The time the comment was edited. Empty if the comment has not been edited.

`deletedAt` string (date-time)
:   The time the comment was deleted. Empty if the comment has not been deleted.

`content` string
:   The markdown content of the comment.

`pinnedBy` string (RID)
:   The user who pinned the comment. Empty if the comment is not pinned.

`pinnedAt` string (date-time)
:   The time the comment was pinned. Empty if the comment is not pinned.

`reactions` array of [`Reaction`](https://dev.nominal.io/api/legacy/comments-service.md#reaction)
:   The reactions on the comment

    Fields of `Reaction`

    `rid` string (RID)
    :   Unique resource identifier for the reaction

    `userRid` string (RID)
    :   The user who authored the reaction

    `createdAt` string (date-time)
    :   The time the reaction was created

    `type` [`ReactionType`](https://dev.nominal.io/api/legacy/comments-service.md#reactiontype)
    :   The type of reaction

        Values of `ReactionType`

        `LIKE`
        :   ​

        `DISLIKE`
        :   ​

        `HEART`
        :   ​

        `HOORAY`
        :   ​

        `ROCKET`
        :   ​

        `EYES`
        :   ​

`attachments` array of string (RID)
:   The comment’s attachments

Request

**curl**

```shell
curl -X PUT "https://api.gov.nominal.io/api/comments/v1/comments/<comment rid>/reactions/<type>" \
  -H "Authorization: Bearer <api key>"
```

**requests**

```python
import requests

response = requests.put(
    "https://api.gov.nominal.io/api/comments/v1/comments/<comment rid>/reactions/<type>",
    headers={"Authorization": "Bearer <api key>"},
)
response.raise_for_status()
print(response.json())
```

**httpx**

```python
import httpx

response = httpx.put(
    "https://api.gov.nominal.io/api/comments/v1/comments/<comment rid>/reactions/<type>",
    headers={"Authorization": "Bearer <api key>"},
)
response.raise_for_status()
print(response.json())
```

**aiohttp**

```python
import asyncio

import aiohttp

async def main() -> None:
    async with aiohttp.ClientSession() as session:
        async with session.put(
            "https://api.gov.nominal.io/api/comments/v1/comments/<comment rid>/reactions/<type>",
            headers={"Authorization": "Bearer <api key>"},
        ) as response:
            response.raise_for_status()
            print(await response.json())

asyncio.run(main())
```

Response: `200`

```json
{
  "rid": "<comment rid>",
  "parent": {
    "type": "resource",
    "resource": {
      "resourceType": "RUN",
      "resourceRid": "<resource rid>"
    }
  },
  "authorRid": "<author rid>",
  "createdAt": "2026-01-01T00:00:00Z",
  "editedAt": "2026-01-01T00:00:00Z",
  "deletedAt": "2026-01-01T00:00:00Z",
  "content": "<content>",
  "pinnedBy": "<pinned by>",
  "pinnedAt": "2026-01-01T00:00:00Z",
  "reactions": [
    {
      "rid": "<reaction rid>",
      "userRid": "<user rid>",
      "createdAt": "2026-01-01T00:00:00Z",
      "type": "LIKE"
    }
  ],
  "attachments": [
    "<attachment rid>"
  ]
}
```

### Remove reaction

DELETE `/comments/v1/comments/{commentRid}/reactions/{type}`

Create a reaction on a comment

Path parameters

`commentRid` string (RID) required
:   The RID of comment to delete

`type` string, one of `LIKE`, `DISLIKE`, `HEART`, `HOORAY`, `ROCKET`, `EYES` required
:   The type of reaction

Response

`rid` string (RID)
:   Unique resource identifier for the comment

`parent` [`CommentParent`](https://dev.nominal.io/api/legacy/comments-service.md#commentparent)
:   The parent of the comment. It can be a resource or another comment.

    **resource**

    Set `type` to `"resource"`.

    `resource` [`CommentParentResource`](https://dev.nominal.io/api/legacy/comments-service.md#commentparentresource)
    :   ​

        Fields of `CommentParentResource`

        `resourceType` [`ResourceType`](https://dev.nominal.io/api/legacy/comments-service.md#resourcetype)
        :   The type of resource that the comment is associated with

            Values of `ResourceType`

            `RUN`
            :   ​

            `EVENT`
            :   ​

        `resourceRid` string (RID)
        :   The resource identifier for the resource that the comment is associated with. For example, a run or a workbook.

    **comment**

    Set `type` to `"comment"`.

    `comment` [`CommentParentComment`](https://dev.nominal.io/api/legacy/comments-service.md#commentparentcomment)
    :   ​

        Fields of `CommentParentComment`

        `commentRid` string (RID)
        :   The resource identifier for the comment that the comment is replying to

`authorRid` string (RID)
:   The user who authored the comment

`createdAt` string (date-time)
:   The time the comment was created

`editedAt` string (date-time)
:   The time the comment was edited. Empty if the comment has not been edited.

`deletedAt` string (date-time)
:   The time the comment was deleted. Empty if the comment has not been deleted.

`content` string
:   The markdown content of the comment.

`pinnedBy` string (RID)
:   The user who pinned the comment. Empty if the comment is not pinned.

`pinnedAt` string (date-time)
:   The time the comment was pinned. Empty if the comment is not pinned.

`reactions` array of [`Reaction`](https://dev.nominal.io/api/legacy/comments-service.md#reaction)
:   The reactions on the comment

    Fields of `Reaction`

    `rid` string (RID)
    :   Unique resource identifier for the reaction

    `userRid` string (RID)
    :   The user who authored the reaction

    `createdAt` string (date-time)
    :   The time the reaction was created

    `type` [`ReactionType`](https://dev.nominal.io/api/legacy/comments-service.md#reactiontype)
    :   The type of reaction

        Values of `ReactionType`

        `LIKE`
        :   ​

        `DISLIKE`
        :   ​

        `HEART`
        :   ​

        `HOORAY`
        :   ​

        `ROCKET`
        :   ​

        `EYES`
        :   ​

`attachments` array of string (RID)
:   The comment’s attachments

Request

**curl**

```shell
curl -X DELETE "https://api.gov.nominal.io/api/comments/v1/comments/<comment rid>/reactions/<type>" \
  -H "Authorization: Bearer <api key>"
```

**requests**

```python
import requests

response = requests.delete(
    "https://api.gov.nominal.io/api/comments/v1/comments/<comment rid>/reactions/<type>",
    headers={"Authorization": "Bearer <api key>"},
)
response.raise_for_status()
print(response.json())
```

**httpx**

```python
import httpx

response = httpx.delete(
    "https://api.gov.nominal.io/api/comments/v1/comments/<comment rid>/reactions/<type>",
    headers={"Authorization": "Bearer <api key>"},
)
response.raise_for_status()
print(response.json())
```

**aiohttp**

```python
import asyncio

import aiohttp

async def main() -> None:
    async with aiohttp.ClientSession() as session:
        async with session.delete(
            "https://api.gov.nominal.io/api/comments/v1/comments/<comment rid>/reactions/<type>",
            headers={"Authorization": "Bearer <api key>"},
        ) as response:
            response.raise_for_status()
            print(await response.json())

asyncio.run(main())
```

Response: `200`

```json
{
  "rid": "<comment rid>",
  "parent": {
    "type": "resource",
    "resource": {
      "resourceType": "RUN",
      "resourceRid": "<resource rid>"
    }
  },
  "authorRid": "<author rid>",
  "createdAt": "2026-01-01T00:00:00Z",
  "editedAt": "2026-01-01T00:00:00Z",
  "deletedAt": "2026-01-01T00:00:00Z",
  "content": "<content>",
  "pinnedBy": "<pinned by>",
  "pinnedAt": "2026-01-01T00:00:00Z",
  "reactions": [
    {
      "rid": "<reaction rid>",
      "userRid": "<user rid>",
      "createdAt": "2026-01-01T00:00:00Z",
      "type": "LIKE"
    }
  ],
  "attachments": [
    "<attachment rid>"
  ]
}
```

## Errors

[Errors](https://dev.nominal.io/api/legacy.md#errors) shows how these errors are sent.

Each error’s `errorName` is `Comments:` followed by its name below.

| Status | Name | Notes |
| --- | --- | --- |
| 400 | `ContentTooLong` |  |
| 400 | `EmptyCommentContent` |  |
| 400 | `InvalidAttachment` |  |
| 400 | `MaxNestingDepthExceeded` |  |
| 403 | `Unauthorized` |  |
| 404 | `CommentNotFound` |  |

## Types

### Comment

`rid` string (RID) required
:   Unique resource identifier for the comment

`parent` [`CommentParent`](https://dev.nominal.io/api/legacy/comments-service.md#commentparent) required
:   The parent of the comment. It can be a resource or another comment.

`authorRid` string (RID) required
:   The user who authored the comment

`createdAt` string (date-time) required
:   The time the comment was created

`editedAt` string (date-time)
:   The time the comment was edited. Empty if the comment has not been edited.

`deletedAt` string (date-time)
:   The time the comment was deleted. Empty if the comment has not been deleted.

`content` string required
:   The markdown content of the comment.

`pinnedBy` string (RID)
:   The user who pinned the comment. Empty if the comment is not pinned.

`pinnedAt` string (date-time)
:   The time the comment was pinned. Empty if the comment is not pinned.

`reactions` array of [`Reaction`](https://dev.nominal.io/api/legacy/comments-service.md#reaction)
:   The reactions on the comment

`attachments` array of string (RID)
:   The comment’s attachments

### CommentParent

The parent of a comment. It can be a resource or another comment in the case of a reply.

Set `type` to the name of one of the other fields, and set only that field.

`resource` [`CommentParentResource`](https://dev.nominal.io/api/legacy/comments-service.md#commentparentresource)
:   ​

`comment` [`CommentParentComment`](https://dev.nominal.io/api/legacy/comments-service.md#commentparentcomment)
:   ​

### CommentParentComment

`commentRid` string (RID) required
:   The resource identifier for the comment that the comment is replying to

### CommentParentResource

`resourceType` [`ResourceType`](https://dev.nominal.io/api/legacy/comments-service.md#resourcetype) required
:   The type of resource that the comment is associated with

`resourceRid` string (RID) required
:   The resource identifier for the resource that the comment is associated with. For example, a run or a workbook.

### ConversationNode

`comment` [`Comment`](https://dev.nominal.io/api/legacy/comments-service.md#comment) required
:   The comment

`replies` array of [`ConversationNode`](https://dev.nominal.io/api/legacy/comments-service.md#conversationnode)
:   The comments on (aka replies to) the comment ordered by creation time. Empty if the comment has no replies.

### Reaction

`rid` string (RID) required
:   Unique resource identifier for the reaction

`userRid` string (RID) required
:   The user who authored the reaction

`createdAt` string (date-time) required
:   The time the reaction was created

`type` [`ReactionType`](https://dev.nominal.io/api/legacy/comments-service.md#reactiontype) required
:   The type of reaction

### ReactionType

`LIKE`
:   ​

`DISLIKE`
:   ​

`HEART`
:   ​

`HOORAY`
:   ​

`ROCKET`
:   ​

`EYES`
:   ​

### ResourceType

`RUN`
:   ​

`EVENT`
:   ​

Page design based on [Scalar](https://scalar.com), MIT License.
