---
title: "Post Record Comment"
method: POST
path: "/api/v1/entities/{entity_id}/comments"
tags: ["comments"]
---

# Post Record Comment

`POST /api/v1/entities/{entity_id}/comments`

Post a comment. Requires only the ability to READ the record — a viewer
who cannot edit it can still comment.

## Path parameters

- `entity_id` string, uuid, required

## Query parameters

- `embed_host_app_id` string, uuid, nullable

## Request body

- CommentCreate
  - `row_key` string, required — The record's `_row_key`.
  - `body` string, required
  - `app_id` string, uuid, nullable — Set when commenting from inside an app — selects the app authorization lane. Omit on the ontology record page.
  - `parent_comment_id` string, uuid, nullable — Reply to this comment. Must be a live comment on the SAME record. Replying to a reply is allowed — rendering is flat, so quote resolution never follows more than one hop.

## Response `201`

Successful Response

- CommentRead
  - `id` string, uuid, required
  - `body` string, required
  - `author` CommentAuthor, required
    - `user_id` string, uuid, required
    - `name` string — Display name; blank if unresolvable.
    - `email` string — Email; blank if unresolvable.
  - `created_at` string, date-time, required
  - `updated_at` string, date-time, required
  - `reply_to` CommentQuote — The parent preview above a reply. Resolved SERVER-side, not by the client. The thread pages at DEFAULT_PAGE_SIZE, so a reply routinely loads on a page its parent is not on — a client-side lookup would render a blank quote roughly whenever a thread got long.
    - `id` string, uuid, required
    - `author_name` string — Blank if unresolvable.
    - `body_excerpt` string — Plain text, markers stripped, <= 280 chars. Empty when `is_deleted` — there is nothing left to preview.
    - `is_deleted` boolean, required — The parent was soft-deleted. The reply survives; the client renders 'Original message deleted' in place of the excerpt.
  - `mentions` CommentMention[]
    - `user_id` string, uuid, required
    - `name` string — Falls back to the stored marker text.
    - `email` string
  - `like_count` integer
  - `liked_by_me` boolean
  - `can_edit` boolean, required — Whether THIS caller may edit it. Computed server-side because the app runtime's CurrentUser carries no user id, so the widget cannot decide ownership locally.
  - `can_delete` boolean, required — Whether THIS caller may delete it.

## Other responses

- `422` — Validation Error

## Changes

- **2026-08-26** `53e8494489be` — 5 info
  - added the new optional request property `parent_comment_id`
  - added the optional property `like_count` to the response with the `201` status
  - added the optional property `liked_by_me` to the response with the `201` status
  - added the optional property `mentions` to the response with the `201` status
  - …1 more
- **2026-08-25** `962a03cad931` — 1 info
  - endpoint added

[Change history](https://skmtc.dev/netter/apis/dmi-backend/changes/api/v1/entities/:entity_id/comments/post.md)

---

[API](https://skmtc.dev/netter/apis/dmi-backend.md) · [All operations](https://skmtc.dev/netter/apis/dmi-backend/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/netter/dmi-backend/revisions/eed6fb164abd/schema)
