Skip to Content

Simulators

Comments

Comments let an agent work beside people in a workspace: ask for a review, answer in a discussion and clean up its own notes. The notion_review_thread scenario holds a Launch Checklist page with two open discussions, so the block below loads it first:

curl -s -X POST "$RYSTIC_URL/_rystic/scenario" -d '{"name":"notion_review_thread"}'
curl -s "$RYSTIC_URL/v1/comments?block_id=f6000000-0000-4000-8000-000000000101" -H 'Authorization: Bearer secret_placeholder' -H 'Notion-Version: 2026-03-11' | jq -c '.results[] | {id, text: .rich_text[0].plain_text}'
# -> {"id":"f6000000-0000-4000-8000-000000000701","text":"Ready for review: every launch task is done or booked."}
# -> {"id":"f6000000-0000-4000-8000-000000000702","text":"@Review Bot"}
curl -s "$RYSTIC_URL/v1/comments" -H 'Authorization: Bearer secret_placeholder' -H 'Notion-Version: 2026-03-11' -H 'Content-Type: application/json' -d '{"discussion_id":"f6000000-0000-4000-8000-000000000601","markdown":"Reviewed: **ship it**"}' | jq -c '{id, discussion_id}'
# -> {"id":"925e28d1-dad3-4fd4-8000-000000000001","discussion_id":"f6000000-0000-4000-8000-000000000601"}
curl -s -X PATCH "$RYSTIC_URL/v1/comments/f6000000-0000-4000-8000-000000000701" -H 'Authorization: Bearer secret_placeholder' -H 'Notion-Version: 2026-03-11' -H 'Content-Type: application/json' -d '{"markdown":"Ready for review: all launch tasks are done."}' | jq -c '{id, text: .rich_text[0].plain_text}'
# -> {"id":"f6000000-0000-4000-8000-000000000701","text":"Ready for review: all launch tasks are done."}
curl -s -X PATCH "$RYSTIC_URL/v1/comments/f6000000-0000-4000-8000-000000000702" -H 'Authorization: Bearer secret_placeholder' -H 'Notion-Version: 2026-03-11' -H 'Content-Type: application/json' -d '{"markdown":"Edited"}' | jq -c '{status, code}'
# -> {"status":404,"code":"object_not_found"}
curl -s -X DELETE "$RYSTIC_URL/v1/comments/f6000000-0000-4000-8000-000000000701" -H 'Authorization: Bearer secret_placeholder' -H 'Notion-Version: 2026-03-11' | jq -c '{id, original_content_deleted, rich_text}'
# -> {"id":"f6000000-0000-4000-8000-000000000701","original_content_deleted":true,"rich_text":[]}

Creating and listing

POST /v1/comments adds a comment in one of three places, with its body as rich_text or as markdown:

  • on a page, named in parent.page_id;
  • on a whole block, named in parent.block_id;
  • as a reply in an existing discussion, named in discussion_id.

Neither Notion’s API nor the simulator opens a discussion on a selection of text inside a block.

GET /v1/comments?block_id=<page or block id> lists that page’s or block’s open comments, oldest first, paged with page_size and start_cursor. A block’s comments list apart from its page’s.

Updating and deleting

GET, PATCH and DELETE /v1/comments/{comment_id} read, rewrite and delete one comment. A connection can update or delete only a comment it created. Updating or deleting another user’s or another connection’s comment returns 404 object_not_found and leaves the comment as it was.

Deleting a comment is soft, as on Notion. The response and the stored comment carry original_content_deleted: true and rich_text: []. After that:

Request on the deleted commentThe simulator
GET /v1/comments/{comment_id}returns it with those values
GET /v1/commentsleaves it out of the list
PATCH or a second DELETEreturns 404 object_not_found

Times

A comment’s created_time and last_edited_time are rounded down to the minute, as a page’s are.

Last updated on