Editorial comments
Requires a license with the
content-profeature. See pricing.
Editorial comments let your team talk about an entry where the entry is. A first comment opens a thread, and replies stay under it, one level deep. Resolve a thread when it is settled and reopen it if it is not. Mention a colleague and they get an email.
How it works
Section titled “How it works”| Part | What it does |
|---|---|
| Thread | A first comment with no parent_id. It can be resolved and reopened. |
| Reply | A comment whose parent_id is the thread's first comment. A reply to a reply lands in the same thread. |
| Mention | A user id in mentions. Each person mentioned gets an email when email is set up. Without it the comment is still saved and nobody is mailed. |
Threads belong to the entry and are deleted with it. When a person's data is erased, their comments keep the text and lose the author.
Try it
Section titled “Try it”Run this on an install whose license carries content-pro. You need an admin
token in TOKEN. The quickstart shows how
to get one. Copy an entry's id into ENTRY_ID, for example from
Content lifecycle.
-
Open a thread:
Terminal window curl -X POST http://localhost:3001/api/admin/content/entries/$ENTRY_ID/comments \-H "Authorization: Bearer $TOKEN" \-H "Content-Type: application/json" \-d '{"body": "Can we shorten the second paragraph?"}'{"id": "f57403a3-5392-4663-90bb-9554fc919823","entry_id": "059b65ff-ef7e-4e3a-8ea8-fa543834804a","author_id": "3e7cc859-1207-4c7c-9af2-363fa5079e0b","body": "Can we shorten the second paragraph?","mentions": [],"resolved": false,"created_at": "2026-10-03T15:06:55Z","updated_at": "2026-10-03T15:06:55Z"}The answer is
201. Copy itsidintoTHREAD_ID. -
Reply to it:
Terminal window curl -X POST http://localhost:3001/api/admin/content/entries/$ENTRY_ID/comments \-H "Authorization: Bearer $TOKEN" \-H "Content-Type: application/json" \-d '{"body": "Done, it is two sentences now.", "parent_id": "'"$THREAD_ID"'"}' -
Resolve the thread:
Terminal window curl -X POST http://localhost:3001/api/admin/content/entries/$ENTRY_ID/comments/$THREAD_ID/resolve \-H "Authorization: Bearer $TOKEN"The answer is the first comment with
"resolved": true,resolved_byandresolved_at. -
List the resolved threads:
Terminal window curl "http://localhost:3001/api/admin/content/entries/$ENTRY_ID/comments?state=resolved" \-H "Authorization: Bearer $TOKEN"The answer is
{"data": [...]}, with the thread and its reply underreplies. -
In the admin console, the Comments panel on an entry's page shows the threads, with New thread, Reply and Mention.
Comment, reply and mention
Section titled “Comment, reply and mention”| Field | Meaning |
|---|---|
body | The comment, required, at most 10,000 bytes. |
parent_id | The first comment of the thread to reply to. Leave it out to open a thread. |
mentions | Up to 20 user ids of people in your tenant. |
GET .../comments takes ?state=open, resolved or all, the default. Each
thread comes with its replies, oldest first. .../resolve and .../reopen
work on the first comment of a thread only.
If the license lapses
Section titled “If the license lapses”Your threads stay. Reading, resolving and reopening stay free. Writing a new
comment or a reply needs content-pro again.
Routes
Section titled “Routes”Every route needs the admin or super_admin role. An
admin token can list with the content:read grant
and write with content:write.
| Method | Path | Purpose | Needs content-pro |
|---|---|---|---|
GET | /api/admin/content/entries/{id}/comments | The entry's threads. | No |
POST | /api/admin/content/entries/{id}/comments | Open a thread or reply. Answers 201. | Yes |
POST | /api/admin/content/entries/{id}/comments/{commentID}/resolve | Resolve a thread. | No |
POST | /api/admin/content/entries/{id}/comments/{commentID}/reopen | Reopen a thread. | No |
Errors
Section titled “Errors”| Status | Message | Cause |
|---|---|---|
400 | invalid JSON body | The body does not parse. |
400 | state must be open, resolved or all | An unknown state. |
400 | a mentioned person has no account here | A mention is not an account of your tenant. |
400 | the comment replied to is not on this entry | parent_id belongs to another entry. |
400 | only the first comment of a thread can be resolved or reopened | Resolve the thread, not a reply. |
402 | payment_required, naming feature:content-pro | Writing a comment without content-pro. |
404 | entry or comment not found | No such entry or comment in your tenant. |
422 | body is required and at most 10000 bytes | Fix the body. |
422 | a comment mentions at most 20 people | Mention fewer people. |
Related
Section titled “Related”- Content lifecycle: the entries comments belong to.
- Content releases: the other part of
content-pro. - Editorial review: approvals in stages, with a comment at each decision.
- Content editing: the entry page in the admin console.