# Comment

URL: /business/nouns/comment · Id: `noun:comment`

> A Comment is an internal note by a Worker about a Thing, never sent to a Contact.

A Comment is an internal note by a [Worker](/business/nouns/worker) about a [Thing](/business/nouns/thing), never sent to a [Contact](/business/nouns/contact).

## Properties
| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `body` | `text` | Yes | What it says. |

## Object
```json
{
  "$id": "https://api.sb/shiftnote.app/comments/comment_1",
  "$type": "Comment",
  "body": "Example body"
}
```

## Relationships
- <a id="rel-annotates"></a>A Comment **annotates** one [Thing](/business/nouns/thing): a Comment is an internal note on one [Thing](/business/nouns/thing), never sent to a [Contact](/business/nouns/contact). `annotates`, inverse [`comments`](/business/nouns/thing#rel-comments).
- <a id="rel-author"></a>A Comment’s **author** is one [Worker](/business/nouns/worker): every Comment names the [Worker](/business/nouns/worker), human or agent, who wrote it. `author`, inverse [`writes`](/business/nouns/worker#rel-writes).

## Verbs
| Verb | Description | Subject | Event | Class |
| --- | --- | --- | --- | --- |
| <a id="create"></a>[Comment.create](/business/nouns/comment/create) | Creates a Comment. Inherited from [Noun](/business/nouns/noun). | None. | `Comment.created` | Two-way: `try`, `send`, `do` |
| <a id="get"></a>[Comment.get](/business/nouns/comment/get) | Returns one Comment by id. Inherited from [Noun](/business/nouns/noun). | None. | None. | Read: `try`, `do` |
| <a id="list"></a>[Comment.list](/business/nouns/comment/list) | Returns Comments, newest first, one page at a time. Inherited from [Noun](/business/nouns/noun). | None. | None. | Read: `try`, `do` |
| <a id="update"></a>[Comment.update](/business/nouns/comment/update) | Changes the given properties of a Comment. Inherited from [Noun](/business/nouns/noun). | None. | `Comment.updated` | Two-way: `try`, `send`, `do` |
| <a id="delete"></a>[Comment.delete](/business/nouns/comment/delete) | Deletes a Comment; its history is kept. Inherited from [Noun](/business/nouns/noun). | None. | `Comment.deleted` | One-way: `send`, `do` |

## Permissions
Which Access level may call each Verb. One-way Verbs wait their delay window.

| Operation | `owner` | `admin` | `member` | `viewer` |
| --- | --- | --- | --- | --- |
| `Comment.create` | Yes | Yes | Yes | No |
| `Comment.get` | Yes | Yes | Yes | Yes |
| `Comment.list` | Yes | Yes | Yes | Yes |
| `Comment.update` | Yes | Yes | Yes | No |
| `Comment.delete` | Yes | Yes | Yes | No |

## Call it

**Ask**

```text
Add a comment to RouteWise.
```

**API**

```bash
curl -X POST https://api.sb/routewise.dev/comments \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"body":"Example body"}'
```

```json
{
  "api": "https://api.sb/routewise.dev",
  "comment": {
    "$id": "https://api.sb/routewise.dev/comments/comment_1",
    "$type": "Comment",
    "body": "Example body"
  },
  "action": {
    "$id": "https://api.sb/routewise.dev/actions/action_1",
    "operation": "Comment.create",
    "status": "done"
  },
  "links": {
    "self": "https://api.sb/routewise.dev/actions/action_1"
  }
}
```

**SDK**

```ts
import { $ } from 'startup-builder'

const comment = await $.Comment.create({ body: 'Example body' })
```

**CLI**

```bash
npx startup-builder do Comment.create --json '{"body":"Example body"}'
```

**MCP**

```json
{
  "name": "do",
  "arguments": {
    "code": "return await $.Comment.create({ body: 'Example body' })"
  }
}
```

## Example
A support [Agent](/business/nouns/agent) leaves a Comment on a [Conversation](/business/nouns/conversation): `refund approved, send confirmation`. The [Contact](/business/nouns/contact) never sees it.