Adapter
CommentsAdapter is the contract for local, BYO, and Hosted. resolveUsers, searchMentionCandidates, and renewAuthorToken are widget props, not adapter methods and not Hosted endpoints.
listThreads({ appId, tenantKey, resourceType, resourceId, filter?, cursor?, limit?, viewerId, viewerToken? })
listComments({ threadId, cursor?, limit?, viewerId, viewerToken? })
createThread({ appId, tenantKey, resourceType, resourceId, body, mentions, author, authorToken?, operationId })
reply({ threadId, body, mentions, author, authorToken?, operationId })
editComment({ commentId, body, mentions, version, author, authorToken?, operationId })
deleteComment({ commentId, version, author, authorToken?, operationId })
resolveThread({ threadId, version, author, authorToken?, operationId })
reopenThread({ threadId, version, author, authorToken?, operationId })
getReadState({ threadId, viewerId, viewerToken? })
markRead({ threadId, visibleSeq, author, authorToken?, operationId? })
subscribe?({ appId, tenantKey, resourceType, resourceId, threadId?, viewerId, viewerToken?, onEvent })filter is all, open, resolved, or unread, applied before pagination. Default all. There is no full-text search.
operationId is the client operation id, max 80 characters. It is required on create, reply, edit, delete, resolve, reopen, and purge. It is optional on markRead. The same id and the same payload replay with applied: false and the original events. The same id with a different payload is conflict / idempotency_payload_mismatch. Do not send Chat's idempotencyKey field name.
Mutations return { applied, events } plus the thread or comment. events entries are { id, name }. Consumers dedupe on id. Delivery is not exactly-once.
CommentsAuthor is { id, name?, avatarUrl? }. CommentsMention is { userId, start, end } with code-point offsets into the normalized body. end is exclusive.
A headless unread hook may call getReadState and listThreads with filter: "unread". It does not add a second protocol. subscribe is optional. If it is omitted or the stream errors, the widget polls every 4 seconds, pauses while the document is hidden, and backs off 4s, 8s, 16s, then 60s.
Hosted HTTP mapping is on the API overview. BYO implements the same inputs and outputs, including purge and export, on your server.
Related: Persisted BYO · Threads and updates · Troubleshooting