POST
/api/public/v1/conversations/{conversationId}/messages/{messageId}/readMark a thread read
Marks one thread read, up to now, for the token’s employee, which clears the root’s `unreadReplyCount`. Idempotent. `messageId` must be a top-level message of the conversation in the URL. You must be a member (403 otherwise): being able to read a public channel without joining it is not the same as having a place to keep what you have read.
Required scope
The access token must carry this scope. A token missing it gets 403 Forbidden. Grant them to an API client under Dev Tools → API, to an assistant or CLI sign-in when you approve or edit it under Dev Tools, and to a teammate under Employee → Permissions.
threads:write
Path Parameters
| Name | Type | Required | Description |
|---|---|---|---|
conversationId | string | Required | Conversation ID. |
messageId | string | Required | The thread’s root message — a top-level message of that conversation. |
POSTExample request
curl
curl -X POST "https://www.pxb.app/api/public/v1/conversations/{conversationId}/messages/{messageId}/read" \
-H "Authorization: Bearer your_access_token"200Example response
json
{
"message": "Thread marked as read.",
"content": {
"messageId": "msg_9931",
"unreadReplyCount": 0
}
}403Example response
json
{
"message": "You are not a member."
}404Example response
json
{
"message": "Message not found."
}In the console
The same thing done by hand, for anyone comparing the API against the screen they already use.