Channel API
Channel API handles textchat conversations between users.
| Endpoint | Method | Description |
|---|---|---|
| channel:getDirectChannel | websocket | Get direct channel |
| channel:getChannelForRoom | websocket | Get channel for room |
| channel:getChannelForProp | websocket | Get channel for prop |
| channel:getChannelForDirectAI | websocket | Get channel for direct aI |
| channel:getChannelForRoomAI | websocket | Get channel for room aI |
| channel:getUserNotesChannel | websocket | Get user notes channel |
| channel:getGroupChannel | websocket | Get group channel |
| channel:getChannelForCommunityPost | websocket | Get channel for community post |
| channel:getChannelForUserPosts | websocket | Get channel for user posts |
| channel:getThreadChannelForMessage | websocket | Get thread channel for message |
| channel:getChannelById | websocket | Get channel by id |
| channel:searchUserChannels | websocket | Search user channels |
| channel:getCountOfUnreadChannels | websocket | Get count of unread channels |
| channel:setHighAlert | websocket | Set channel to high alert |
| channel:pin | websocket | Pin channel |
| channel:createMessage | websocket | Create channel message |
| channel:editMessageBody | websocket | Edit channel message body |
| channel:addMessageAttachments | websocket | Add channel message attachments |
| channel:deleteMessageAttachments | websocket | Delete channel message attachments |
| channel:blockMessage | websocket | Block channel message |
| channel:unblockMessage | websocket | Unblock channel message |
| websocket | Delete channel message | |
| websocket | Restore channel message | |
| channel:updateMessageDeletedStatus | websocket | Update channel message deleted status |
| channel:deleteMessageFromChannel | websocket | Delete message from channel |
| channel:generateAIWelcomeMessage | websocket | Generate aI welcome message |
| channel:getLastMessage | websocket | Get last channel message |
| channel:listMessages | websocket | List channel messages |
| channel:listMessagesWithEngagement | websocket | List channel messages with engagement |
| channel:setChannelLastReadMessage | websocket | Set channel last read message |
| channel:setVoteForMessage | websocket | Set vote for channel message |
| channel:createPollMessage | websocket | Create channel poll message |
| channel:postPollVote | websocket | Post poll vote |
| channel:getPollStats | websocket | Get poll stats |
| channel:reactToMessage | websocket | React to message |
| channel:listUsersReactedToMessage | websocket | List users reacted to message |
| channel:searchAttachmentsOfChannel | websocket | Search attachments of channel |
| channel:createSubChannel | websocket | Create sub channel |
| channel:deleteSubChannel | websocket | Delete sub channel |
| channel:updateSubChannel | websocket | Update sub channel |
| channel:listSubChannels | websocket | List sub channels |
| channel:getSubChannelAndParents | websocket | Get sub channel and parents |
| channel:getZAddressesForParticipants | websocket | Get z addresses for channel participants |
| websocket | Create channel encryption epoch | |
| websocket | Update channel encryption epoch | |
| websocket | List channel encryption epoches | |
| websocket | List channel encryption epoches by tuples | |
| websocket | List channel encryption epoches by z address | |
| websocket | Get last channel encryption epoch | |
| channel:requestNewEncryptionEpoch | websocket | Request new encryption epoch for channel |
| channel:onMessageCreated | websocketEvent | On message created event |
| channel:onMessageDeleted | websocketEvent | On message deleted event |
| channel:onMessageEdited | websocketEvent | On message edited event |
| channel:onMessageBlockedStatusUpdated | websocketEvent | On message blocked status updated event |
| channel:onMessageDeletedStatusUpdated | websocketEvent | On message deleted status updated event |
| channel:onMessageRead | websocketEvent | On message read event |
| channel:onUnreadCountUpdated | websocketEvent | On unread count updated event |
| channel:onMessageReaction | websocketEvent | On message reaction event |
| channel:onPollVote | websocketEvent | On poll vote event |
| channel:onSubChannelCreated | websocketEvent | On sub channel created event |
| channel:onSubChannelDeleted | websocketEvent | On sub channel deleted event |
| channel:onSubChannelUpdated | websocketEvent | On sub channel updated event |
| websocketEvent | On channel encryption epoch created event | |
| channel:onLastEpochUpdated | websocketEvent | On last epoch updated event |
Get direct channel
Method: websocket
Endpoint: channel:getDirectChannel
Description: Api gets/creates direct textchat channel. Api subscribes user socket to broadcast events of channel. User can have channel with himself by putting his own user id to targetUser field.
Request:
{
"data": {
"targetUser": string
}
"event": { "id": string, "date": timestamp }
}
Response:
{
"data": {
"channel": {
"sourceString": string // textchat channel belonging source
"channelId": string // textchat channel id
"title": string // channel title
"settings": map[string]{ custom structure } // channel settings, like permissions for community channel
"contentDirectoryId": string // content directory resource id, for CMS
"options": [ string ] // additional options for a channel, like 'events' or 'booth'
"lastEpoch": int // last encryption epoch number for a channel
"needNewEpoch": bool // flag to point that channel encryption epoch should be changed on next message
"thumbnailId": string // channel thumbnail resource id
"totalCount": int // total count of messages in a channel
"unreadCount": int // count of unread messages for current participant / not returned if empty
"subChannelCount": int // amount of first level subchannels in a channel (if present)
"lastReadTs": timestamp // last read timestamp for current participant / not returned if empty
"opponentLastReadTs": timestamp // last read timestamp for opponent (only for direct channels) / not returned if empty
"lastMessage": { // last message in a channel / not returned if empty
"messageId": string
"created": timestamp
"authorId": string
"authorName": string
"messageBody": string
"messageContentType": int // 0 - text, 1 - blocked, 2 - deleted, 3 - request JSON, 4 - endorsement JSON, 5 - activity JSON, 6 - card JSON, 7 - system JSON, 8 - poll, 9 - forward, 10 - file attachment, 11 - image, 12 - video, 13 - audio
"encryptionVersion": string // encryption version, like 'verus.v1'
"encryptionEpoch": int // epoch defines key bundle that was used for encryption
"encryptionEpk": string // ephemeral public key that should be used to decrypt cypher data
}
"isHighAlert": bool // is channel set on high alert
"isPinned": bool // indicates if the channel was pinned by the user
}
}
"error": { "status": bool, "code": int, "message": string }
}
Get channel for room
Method: websocket
Endpoint: channel:getChannelForRoom
Description: Api gets/creates textchat channel for room and subscribes socket to that channel. Api subscribes user socket to broadcast events of channel.
Request:
{
"data": {
"roomId": string
}
"event": { "id": string, "date": timestamp }
}
Response:
{
"data": {
"channel": {
"sourceString": string // textchat channel belonging source
"channelId": string // textchat channel id
"title": string // channel title
"settings": map[string]{ custom structure } // channel settings, like permissions for community channel
"contentDirectoryId": string // content directory resource id, for CMS
"options": [ string ] // additional options for a channel, like 'events' or 'booth'
"lastEpoch": int // last encryption epoch number for a channel
"needNewEpoch": bool // flag to point that channel encryption epoch should be changed on next message
"thumbnailId": string // channel thumbnail resource id
"totalCount": int // total count of messages in a channel
"unreadCount": int // count of unread messages for current participant / not returned if empty
"subChannelCount": int // amount of first level subchannels in a channel (if present)
"lastReadTs": timestamp // last read timestamp for current participant / not returned if empty
"opponentLastReadTs": timestamp // last read timestamp for opponent (only for direct channels) / not returned if empty
"lastMessage": { // last message in a channel / not returned if empty
"messageId": string
"created": timestamp
"authorId": string
"authorName": string
"messageBody": string
"messageContentType": int // 0 - text, 1 - blocked, 2 - deleted, 3 - request JSON, 4 - endorsement JSON, 5 - activity JSON, 6 - card JSON, 7 - system JSON, 8 - poll, 9 - forward, 10 - file attachment, 11 - image, 12 - video, 13 - audio
"encryptionVersion": string // encryption version, like 'verus.v1'
"encryptionEpoch": int // epoch defines key bundle that was used for encryption
"encryptionEpk": string // ephemeral public key that should be used to decrypt cypher data
}
"isHighAlert": bool // is channel set on high alert
"isPinned": bool // indicates if the channel was pinned by the user
}
}
"error": { "status": bool, "code": int, "message": string }
}
Get channel for prop
Method: websocket
Endpoint: channel:getChannelForProp
Description: Api gets/creates textchat channel for prop. Api subscribes user socket to broadcast events of channel.
Request:
{
"data": {
"roomId": string
"propId": string
}
"event": { "id": string, "date": timestamp }
}
Response:
{
"data": {
"channel": {
"sourceString": string // textchat channel belonging source
"channelId": string // textchat channel id
"title": string // channel title
"settings": map[string]{ custom structure } // channel settings, like permissions for community channel
"contentDirectoryId": string // content directory resource id, for CMS
"options": [ string ] // additional options for a channel, like 'events' or 'booth'
"lastEpoch": int // last encryption epoch number for a channel
"needNewEpoch": bool // flag to point that channel encryption epoch should be changed on next message
"thumbnailId": string // channel thumbnail resource id
"totalCount": int // total count of messages in a channel
"unreadCount": int // count of unread messages for current participant / not returned if empty
"subChannelCount": int // amount of first level subchannels in a channel (if present)
"lastReadTs": timestamp // last read timestamp for current participant / not returned if empty
"opponentLastReadTs": timestamp // last read timestamp for opponent (only for direct channels) / not returned if empty
"lastMessage": { // last message in a channel / not returned if empty
"messageId": string
"created": timestamp
"authorId": string
"authorName": string
"messageBody": string
"messageContentType": int // 0 - text, 1 - blocked, 2 - deleted, 3 - request JSON, 4 - endorsement JSON, 5 - activity JSON, 6 - card JSON, 7 - system JSON, 8 - poll, 9 - forward, 10 - file attachment, 11 - image, 12 - video, 13 - audio
"encryptionVersion": string // encryption version, like 'verus.v1'
"encryptionEpoch": int // epoch defines key bundle that was used for encryption
"encryptionEpk": string // ephemeral public key that should be used to decrypt cypher data
}
"isHighAlert": bool // is channel set on high alert
"isPinned": bool // indicates if the channel was pinned by the user
}
}
"error": { "status": bool, "code": int, "message": string }
}
Get channel for direct aI
Method: websocket
Endpoint: channel:getChannelForDirectAI
Description: Api gets/creates channel for direct AI textchat. Api subscribes user socket to broadcast events of channel.
Request:
{
"data": {
"aiProvider": string // openai/ravai
}
"event": { "id": string, "date": timestamp }
}
Response:
{
"data": {
"channel": {
"sourceString": string // textchat channel belonging source
"channelId": string // textchat channel id
"title": string // channel title
"settings": map[string]{ custom structure } // channel settings, like permissions for community channel
"contentDirectoryId": string // content directory resource id, for CMS
"options": [ string ] // additional options for a channel, like 'events' or 'booth'
"lastEpoch": int // last encryption epoch number for a channel
"needNewEpoch": bool // flag to point that channel encryption epoch should be changed on next message
"thumbnailId": string // channel thumbnail resource id
"totalCount": int // total count of messages in a channel
"unreadCount": int // count of unread messages for current participant / not returned if empty
"subChannelCount": int // amount of first level subchannels in a channel (if present)
"lastReadTs": timestamp // last read timestamp for current participant / not returned if empty
"opponentLastReadTs": timestamp // last read timestamp for opponent (only for direct channels) / not returned if empty
"lastMessage": { // last message in a channel / not returned if empty
"messageId": string
"created": timestamp
"authorId": string
"authorName": string
"messageBody": string
"messageContentType": int // 0 - text, 1 - blocked, 2 - deleted, 3 - request JSON, 4 - endorsement JSON, 5 - activity JSON, 6 - card JSON, 7 - system JSON, 8 - poll, 9 - forward, 10 - file attachment, 11 - image, 12 - video, 13 - audio
"encryptionVersion": string // encryption version, like 'verus.v1'
"encryptionEpoch": int // epoch defines key bundle that was used for encryption
"encryptionEpk": string // ephemeral public key that should be used to decrypt cypher data
}
"isHighAlert": bool // is channel set on high alert
"isPinned": bool // indicates if the channel was pinned by the user
}
}
"error": { "status": bool, "code": int, "message": string }
}
Get channel for room aI
Method: websocket
Endpoint: channel:getChannelForRoomAI
Description: Api gets/creates channel for user AI textchat within room context. Api subscribes user socket to broadcast events of channel.
Request:
{
"data": {
"networkId": string
"roomId": string
"aiProvider": string // openai/ravai
}
"event": { "id": string, "date": timestamp }
}
Response:
{
"data": {
"channel": {
"sourceString": string // textchat channel belonging source
"channelId": string // textchat channel id
"title": string // channel title
"settings": map[string]{ custom structure } // channel settings, like permissions for community channel
"contentDirectoryId": string // content directory resource id, for CMS
"options": [ string ] // additional options for a channel, like 'events' or 'booth'
"lastEpoch": int // last encryption epoch number for a channel
"needNewEpoch": bool // flag to point that channel encryption epoch should be changed on next message
"thumbnailId": string // channel thumbnail resource id
"totalCount": int // total count of messages in a channel
"unreadCount": int // count of unread messages for current participant / not returned if empty
"subChannelCount": int // amount of first level subchannels in a channel (if present)
"lastReadTs": timestamp // last read timestamp for current participant / not returned if empty
"opponentLastReadTs": timestamp // last read timestamp for opponent (only for direct channels) / not returned if empty
"lastMessage": { // last message in a channel / not returned if empty
"messageId": string
"created": timestamp
"authorId": string
"authorName": string
"messageBody": string
"messageContentType": int // 0 - text, 1 - blocked, 2 - deleted, 3 - request JSON, 4 - endorsement JSON, 5 - activity JSON, 6 - card JSON, 7 - system JSON, 8 - poll, 9 - forward, 10 - file attachment, 11 - image, 12 - video, 13 - audio
"encryptionVersion": string // encryption version, like 'verus.v1'
"encryptionEpoch": int // epoch defines key bundle that was used for encryption
"encryptionEpk": string // ephemeral public key that should be used to decrypt cypher data
}
"isHighAlert": bool // is channel set on high alert
"isPinned": bool // indicates if the channel was pinned by the user
}
}
"error": { "status": bool, "code": int, "message": string }
}
Get user notes channel
Method: websocket
Endpoint: channel:getUserNotesChannel
Description: Api gets/creates textchat channel for user notes (user chat with himself). Api subscribes user socket to broadcast events of channel.
Request:
{ empty }
Response:
{
"data": {
"channel": {
"sourceString": string // textchat channel belonging source
"channelId": string // textchat channel id
"title": string // channel title
"settings": map[string]{ custom structure } // channel settings, like permissions for community channel
"contentDirectoryId": string // content directory resource id, for CMS
"options": [ string ] // additional options for a channel, like 'events' or 'booth'
"lastEpoch": int // last encryption epoch number for a channel
"needNewEpoch": bool // flag to point that channel encryption epoch should be changed on next message
"thumbnailId": string // channel thumbnail resource id
"totalCount": int // total count of messages in a channel
"unreadCount": int // count of unread messages for current participant / not returned if empty
"subChannelCount": int // amount of first level subchannels in a channel (if present)
"lastReadTs": timestamp // last read timestamp for current participant / not returned if empty
"opponentLastReadTs": timestamp // last read timestamp for opponent (only for direct channels) / not returned if empty
"lastMessage": { // last message in a channel / not returned if empty
"messageId": string
"created": timestamp
"authorId": string
"authorName": string
"messageBody": string
"messageContentType": int // 0 - text, 1 - blocked, 2 - deleted, 3 - request JSON, 4 - endorsement JSON, 5 - activity JSON, 6 - card JSON, 7 - system JSON, 8 - poll, 9 - forward, 10 - file attachment, 11 - image, 12 - video, 13 - audio
"encryptionVersion": string // encryption version, like 'verus.v1'
"encryptionEpoch": int // epoch defines key bundle that was used for encryption
"encryptionEpk": string // ephemeral public key that should be used to decrypt cypher data
}
"isHighAlert": bool // is channel set on high alert
"isPinned": bool // indicates if the channel was pinned by the user
}
}
"error": { "status": bool, "code": int, "message": string }
}
Get group channel
Method: websocket
Endpoint: channel:getGroupChannel
Description: Api gets/creates group textchat channel. Api subscribes user socket to broadcast events of channel.
Request:
{
"data": {
"groupId": string
}
"event": { "id": string, "date": timestamp }
}
Response:
{
"data": {
"channel": {
"sourceString": string // textchat channel belonging source
"channelId": string // textchat channel id
"title": string // channel title
"settings": map[string]{ custom structure } // channel settings, like permissions for community channel
"contentDirectoryId": string // content directory resource id, for CMS
"options": [ string ] // additional options for a channel, like 'events' or 'booth'
"lastEpoch": int // last encryption epoch number for a channel
"needNewEpoch": bool // flag to point that channel encryption epoch should be changed on next message
"thumbnailId": string // channel thumbnail resource id
"totalCount": int // total count of messages in a channel
"unreadCount": int // count of unread messages for current participant / not returned if empty
"subChannelCount": int // amount of first level subchannels in a channel (if present)
"lastReadTs": timestamp // last read timestamp for current participant / not returned if empty
"opponentLastReadTs": timestamp // last read timestamp for opponent (only for direct channels) / not returned if empty
"lastMessage": { // last message in a channel / not returned if empty
"messageId": string
"created": timestamp
"authorId": string
"authorName": string
"messageBody": string
"messageContentType": int // 0 - text, 1 - blocked, 2 - deleted, 3 - request JSON, 4 - endorsement JSON, 5 - activity JSON, 6 - card JSON, 7 - system JSON, 8 - poll, 9 - forward, 10 - file attachment, 11 - image, 12 - video, 13 - audio
"encryptionVersion": string // encryption version, like 'verus.v1'
"encryptionEpoch": int // epoch defines key bundle that was used for encryption
"encryptionEpk": string // ephemeral public key that should be used to decrypt cypher data
}
"isHighAlert": bool // is channel set on high alert
"isPinned": bool // indicates if the channel was pinned by the user
}
}
"error": { "status": bool, "code": int, "message": string }
}
Get channel for community post
Method: websocket
Endpoint: channel:getChannelForCommunityPost
Description: Api gets/creates channel for community post discussion textchat. Api subscribes user socket to broadcast events of channel.
Request:
{
"data": {
"communityId": string
"channelId": string
"postId": string
}
"event": { "id": string, "date": timestamp }
}
Response:
{
"data": {
"channel": {
"sourceString": string // textchat channel belonging source
"channelId": string // textchat channel id
"title": string // channel title
"settings": map[string]{ custom structure } // channel settings, like permissions for community channel
"contentDirectoryId": string // content directory resource id, for CMS
"options": [ string ] // additional options for a channel, like 'events' or 'booth'
"lastEpoch": int // last encryption epoch number for a channel
"needNewEpoch": bool // flag to point that channel encryption epoch should be changed on next message
"thumbnailId": string // channel thumbnail resource id
"totalCount": int // total count of messages in a channel
"unreadCount": int // count of unread messages for current participant / not returned if empty
"subChannelCount": int // amount of first level subchannels in a channel (if present)
"lastReadTs": timestamp // last read timestamp for current participant / not returned if empty
"opponentLastReadTs": timestamp // last read timestamp for opponent (only for direct channels) / not returned if empty
"lastMessage": { // last message in a channel / not returned if empty
"messageId": string
"created": timestamp
"authorId": string
"authorName": string
"messageBody": string
"messageContentType": int // 0 - text, 1 - blocked, 2 - deleted, 3 - request JSON, 4 - endorsement JSON, 5 - activity JSON, 6 - card JSON, 7 - system JSON, 8 - poll, 9 - forward, 10 - file attachment, 11 - image, 12 - video, 13 - audio
"encryptionVersion": string // encryption version, like 'verus.v1'
"encryptionEpoch": int // epoch defines key bundle that was used for encryption
"encryptionEpk": string // ephemeral public key that should be used to decrypt cypher data
}
"isHighAlert": bool // is channel set on high alert
"isPinned": bool // indicates if the channel was pinned by the user
}
}
"error": { "status": bool, "code": int, "message": string }
}
Get channel for user posts
Method: websocket
Endpoint: channel:getChannelForUserPosts
Description: Api gets/creates textchat channel for user posts (public channel of a user). Api subscribes user socket to broadcast events of channel.
Request:
{ empty }
Response:
{
"data": {
"channel": {
"sourceString": string // textchat channel belonging source
"channelId": string // textchat channel id
"title": string // channel title
"settings": map[string]{ custom structure } // channel settings, like permissions for community channel
"contentDirectoryId": string // content directory resource id, for CMS
"options": [ string ] // additional options for a channel, like 'events' or 'booth'
"lastEpoch": int // last encryption epoch number for a channel
"needNewEpoch": bool // flag to point that channel encryption epoch should be changed on next message
"thumbnailId": string // channel thumbnail resource id
"totalCount": int // total count of messages in a channel
"unreadCount": int // count of unread messages for current participant / not returned if empty
"subChannelCount": int // amount of first level subchannels in a channel (if present)
"lastReadTs": timestamp // last read timestamp for current participant / not returned if empty
"opponentLastReadTs": timestamp // last read timestamp for opponent (only for direct channels) / not returned if empty
"lastMessage": { // last message in a channel / not returned if empty
"messageId": string
"created": timestamp
"authorId": string
"authorName": string
"messageBody": string
"messageContentType": int // 0 - text, 1 - blocked, 2 - deleted, 3 - request JSON, 4 - endorsement JSON, 5 - activity JSON, 6 - card JSON, 7 - system JSON, 8 - poll, 9 - forward, 10 - file attachment, 11 - image, 12 - video, 13 - audio
"encryptionVersion": string // encryption version, like 'verus.v1'
"encryptionEpoch": int // epoch defines key bundle that was used for encryption
"encryptionEpk": string // ephemeral public key that should be used to decrypt cypher data
}
"isHighAlert": bool // is channel set on high alert
"isPinned": bool // indicates if the channel was pinned by the user
}
}
"error": { "status": bool, "code": int, "message": string }
}
Get thread channel for message
Method: websocket
Endpoint: channel:getThreadChannelForMessage
Description: Api gets/creates sub channel (thread) for given message. Threads are available for community posts (+comments) and user public posts (+comments). Api subscribes user socket to broadcast events of channel.
Request:
{
"data": {
"channelId": string
"messageId": string
}
"event": { "id": string, "date": timestamp }
}
Response:
{
"data": {
"channel": {
"sourceString": string // textchat channel belonging source
"channelId": string // textchat channel id
"title": string // channel title
"settings": map[string]{ custom structure } // channel settings, like permissions for community channel
"contentDirectoryId": string // content directory resource id, for CMS
"options": [ string ] // additional options for a channel, like 'events' or 'booth'
"lastEpoch": int // last encryption epoch number for a channel
"needNewEpoch": bool // flag to point that channel encryption epoch should be changed on next message
"thumbnailId": string // channel thumbnail resource id
"totalCount": int // total count of messages in a channel
"unreadCount": int // count of unread messages for current participant / not returned if empty
"subChannelCount": int // amount of first level subchannels in a channel (if present)
"lastReadTs": timestamp // last read timestamp for current participant / not returned if empty
"opponentLastReadTs": timestamp // last read timestamp for opponent (only for direct channels) / not returned if empty
"lastMessage": { // last message in a channel / not returned if empty
"messageId": string
"created": timestamp
"authorId": string
"authorName": string
"messageBody": string
"messageContentType": int // 0 - text, 1 - blocked, 2 - deleted, 3 - request JSON, 4 - endorsement JSON, 5 - activity JSON, 6 - card JSON, 7 - system JSON, 8 - poll, 9 - forward, 10 - file attachment, 11 - image, 12 - video, 13 - audio
"encryptionVersion": string // encryption version, like 'verus.v1'
"encryptionEpoch": int // epoch defines key bundle that was used for encryption
"encryptionEpk": string // ephemeral public key that should be used to decrypt cypher data
}
"isHighAlert": bool // is channel set on high alert
"isPinned": bool // indicates if the channel was pinned by the user
}
}
"error": { "status": bool, "code": int, "message": string }
}
Get channel by id
Method: websocket
Endpoint: channel:getChannelById
Description: Api returns textchat channel by its id. Api subscribes user socket to broadcast events of channel.
Request:
{
"data": {
"channelId": string // textchat channel id
}
"event": { "id": string, "date": timestamp }
}
Response:
{
"data": {
"channel": {
"sourceString": string // textchat channel belonging source
"channelId": string // textchat channel id
"title": string // channel title
"settings": map[string]{ custom structure } // channel settings, like permissions for community channel
"contentDirectoryId": string // content directory resource id, for CMS
"options": [ string ] // additional options for a channel, like 'events' or 'booth'
"lastEpoch": int // last encryption epoch number for a channel
"needNewEpoch": bool // flag to point that channel encryption epoch should be changed on next message
"thumbnailId": string // channel thumbnail resource id
"totalCount": int // total count of messages in a channel
"unreadCount": int // count of unread messages for current participant / not returned if empty
"subChannelCount": int // amount of first level subchannels in a channel (if present)
"lastReadTs": timestamp // last read timestamp for current participant / not returned if empty
"opponentLastReadTs": timestamp // last read timestamp for opponent (only for direct channels) / not returned if empty
"lastMessage": { // last message in a channel / not returned if empty
"messageId": string
"created": timestamp
"authorId": string
"authorName": string
"messageBody": string
"messageContentType": int // 0 - text, 1 - blocked, 2 - deleted, 3 - request JSON, 4 - endorsement JSON, 5 - activity JSON, 6 - card JSON, 7 - system JSON, 8 - poll, 9 - forward, 10 - file attachment, 11 - image, 12 - video, 13 - audio
"encryptionVersion": string // encryption version, like 'verus.v1'
"encryptionEpoch": int // epoch defines key bundle that was used for encryption
"encryptionEpk": string // ephemeral public key that should be used to decrypt cypher data
}
"isHighAlert": bool // is channel set on high alert
"isPinned": bool // indicates if the channel was pinned by the user
}
}
"error": { "status": bool, "code": int, "message": string }
}
Search user channels
Method: websocket
Endpoint: channel:searchUserChannels
Description: Api returns list of textchat channels depending on filters.
Api subscribes user socket to broadcast events of all channels.
Filter could be one of the following:
- all - return all channels
- unread - return all unread channels
- direct - return direct channels
- group - return all non-direct channels
- allWithinRoom - return all non-direct channels within the room
- rooms - return only room channels
- noProps - return all channels (excluding prop channels)
Request:
{
"data": {
"channelsFilter": string // all/group/groups/unread/direct/rooms/allWithinRoom/noProps
"query": string // search query
"sourceId": string // in case if filter requires some source, like roomId
"afterChannelId": string // pagination cursor, get channels after this channel id
"limit": int // max number of channels to return (1-100)
}
"event": { "id": string, "date": timestamp }
}
Response:
{
"data": {
"channels": [{
"sourceString": string // textchat channel belonging source
"channelId": string // textchat channel id
"title": string // channel title
"settings": map[string]{ custom structure } // channel settings, like permissions for community channel
"contentDirectoryId": string // content directory resource id, for CMS
"options": [ string ] // additional options for a channel, like 'events' or 'booth'
"lastEpoch": int // last encryption epoch number for a channel
"needNewEpoch": bool // flag to point that channel encryption epoch should be changed on next message
"thumbnailId": string // channel thumbnail resource id
"totalCount": int // total count of messages in a channel
"unreadCount": int // count of unread messages for current participant / not returned if empty
"subChannelCount": int // amount of first level subchannels in a channel (if present)
"lastReadTs": timestamp // last read timestamp for current participant / not returned if empty
"opponentLastReadTs": timestamp // last read timestamp for opponent (only for direct channels) / not returned if empty
"lastMessage": { // last message in a channel / not returned if empty
"messageId": string
"created": timestamp
"authorId": string
"authorName": string
"messageBody": string
"messageContentType": int // 0 - text, 1 - blocked, 2 - deleted, 3 - request JSON, 4 - endorsement JSON, 5 - activity JSON, 6 - card JSON, 7 - system JSON, 8 - poll, 9 - forward, 10 - file attachment, 11 - image, 12 - video, 13 - audio
"encryptionVersion": string // encryption version, like 'verus.v1'
"encryptionEpoch": int // epoch defines key bundle that was used for encryption
"encryptionEpk": string // ephemeral public key that should be used to decrypt cypher data
}
"isHighAlert": bool // is channel set on high alert
"isPinned": bool // indicates if the channel was pinned by the user
}]
"total": int // total amount of channels
"hasNext": bool // there are more channels to fetch
}
"error": { "status": bool, "code": int, "message": string }
}
Get count of unread channels
Method: websocket
Endpoint: channel:getCountOfUnreadChannels
Description: Api returns amount of unread textchat channels.
Request:
{ empty }
Response:
{
"data": {
"unreadChannelCount": int // amount of user channels with unread messages
"highAlertCount": int // amount of user channels on high alert with unread messages'
}
"error": { "status": bool, "code": int, "message": string }
}
Set channel to high alert
Method: websocket
Endpoint: channel:setHighAlert
Description: Sets the selected channel on/off high alert
Request:
{
"data": {
"channelId": string
"isHighAlert": bool
}
"event": { "id": string, "date": timestamp }
}
Response:
{
"error": { "status": bool, "code": int, "message": string }
}
Pin channel
Method: websocket
Endpoint: channel:pin
Description: pin/unpin user's channel
Request:
{
"data": {
"channelId": string
"pin": bool
}
"event": { "id": string, "date": timestamp }
}
Response:
{
"data": {
"channel": {
"sourceString": string // textchat channel belonging source
"channelId": string // textchat channel id
"title": string // channel title
"settings": map[string]{ custom structure } // channel settings, like permissions for community channel
"contentDirectoryId": string // content directory resource id, for CMS
"options": [ string ] // additional options for a channel, like 'events' or 'booth'
"lastEpoch": int // last encryption epoch number for a channel
"needNewEpoch": bool // flag to point that channel encryption epoch should be changed on next message
"thumbnailId": string // channel thumbnail resource id
"totalCount": int // total count of messages in a channel
"unreadCount": int // count of unread messages for current participant / not returned if empty
"subChannelCount": int // amount of first level subchannels in a channel (if present)
"lastReadTs": timestamp // last read timestamp for current participant / not returned if empty
"opponentLastReadTs": timestamp // last read timestamp for opponent (only for direct channels) / not returned if empty
"lastMessage": { // last message in a channel / not returned if empty
"messageId": string
"created": timestamp
"authorId": string
"authorName": string
"messageBody": string
"messageContentType": int // 0 - text, 1 - blocked, 2 - deleted, 3 - request JSON, 4 - endorsement JSON, 5 - activity JSON, 6 - card JSON, 7 - system JSON, 8 - poll, 9 - forward, 10 - file attachment, 11 - image, 12 - video, 13 - audio
"encryptionVersion": string // encryption version, like 'verus.v1'
"encryptionEpoch": int // epoch defines key bundle that was used for encryption
"encryptionEpk": string // ephemeral public key that should be used to decrypt cypher data
}
"isHighAlert": bool // is channel set on high alert
"isPinned": bool // indicates if the channel was pinned by the user
}
}
"error": { "status": bool, "code": int, "message": string }
}
Create channel message
Method: websocket
Endpoint: channel:createMessage
Description: Api creates new message in a textchat channel.
Request:
{
"data": {
"channelId": string // textchat channel id
"subChannelId": string // subchannel id, if message is sent to subchannel
"messageBody": string // content of message
"messageTitle": string // message title (for posts)
"messageType": int // type of message
"attachmentIds": [ string ] // ids of resources that will be attached to the message (must be pre-uploaded using upload session)
"options": [ string ] // custom options, like 'event:{eventId}'
"replyMessageId": string // message id of origin message for reply
"forwardChannelId": string // channel id of origin message for forward
"forwardMessageId": string // message id of origin message for forward
"forwardBody": string // body of forwarded message
"forwardEncryption": { // encryption forwarded message body
"encryptionVersion": string // encryption version, like 'verus.v1'
"encryptionEpoch": int // epoch defines key bundle that was used for encryption
"encryptionEpk": string // ephemeral public key that should be used to decrypt cypher data
}
"encryptionVersion": string // encryption version, like 'verus.v1'
"encryptionEpoch": int // epoch defines key bundle that was used for encryption
"encryptionEpk": string // ephemeral public key that should be used to decrypt cypher data
}
"event": { "id": string, "date": timestamp }
}
Response:
{
"data": {
"message": {
"channelId": string
"bucketId": string
"messageId": string
"authorId": string
"networkId": string
"created": timestamp
"updated": timestamp
"messageType": int // 0 - my, 1 - user, 3 - system, 4 - system JSON, 6 - request JSON, 7 - endorsement JSON, 8 - activity JSON, 9 - card JSON, 100-199 - AI messages
"messageBody": string
"messageTitle": string
"isBlocked": bool
"isDeleted": bool
"attachments": [{
"resourceId": string
"fileName": string
"fileSize": int
"contentType": string
"durationFloat": float
"encryptionVersion": string // encryption version, like 'verus.v1'
"encryptionEpoch": int // epoch defines key bundle that was used for encryption
"encryptionEpk": string // ephemeral public key that should be used to decrypt cypher data
}]
"replyMessage": {
"channelId": string
"messageId": string
"authorId": string
"created": timestamp
"messageType": int
"messageBody": string
"attachments": [{
"resourceId": string
"fileName": string
"fileSize": int
"contentType": string
"durationFloat": float
"encryptionVersion": string // encryption version, like 'verus.v1'
"encryptionEpoch": int // epoch defines key bundle that was used for encryption
"encryptionEpk": string // ephemeral public key that should be used to decrypt cypher data
}]
"encryptionVersion": string // encryption version, like 'verus.v1'
"encryptionEpoch": int // epoch defines key bundle that was used for encryption
"encryptionEpk": string // ephemeral public key that should be used to decrypt cypher data
}
"forwardMessage": {
"channelId": string
"messageId": string
"authorId": string
"created": timestamp
"messageType": int
"messageBody": string
"attachments": [{
"resourceId": string
"fileName": string
"fileSize": int
"contentType": string
"durationFloat": float
"encryptionVersion": string // encryption version, like 'verus.v1'
"encryptionEpoch": int // epoch defines key bundle that was used for encryption
"encryptionEpk": string // ephemeral public key that should be used to decrypt cypher data
}]
"encryptionVersion": string // encryption version, like 'verus.v1'
"encryptionEpoch": int // epoch defines key bundle that was used for encryption
"encryptionEpk": string // ephemeral public key that should be used to decrypt cypher data
}
"subChannelPath": string
"subChannelTitles": [ string ]
"options": [ string ]
"reactions": {
"counters": [{ // counter per reaction, in descending order
"emoji": string
"count": int
}]
"userEmoji": string // user's emoji reaction to the message
}
"pollId": string
"userPoll": {
"poll": { // channel's poll
"id": string
"channelId": string // the channel the poll is in
"question": string // question/description of the poll
"isMultiSelect": bool // allow the users to select multiple choices
"isAnonymous": bool // can users see who voted for what
"created": timestamp // the time when poll was created
"closingTime": timestamp // users cannot vote after the closing time, defaults to one day
"options": [ string ] // list of options which the channel users vote for
"voteCounters": [ int ] // calculated number of votes per option respectively
}
"vote": { // user's vote in the poll'
"pollId": string
"userId": string
"options": [ string ] // list of options the user voted for
}
}
"threadChannelId": string
"threadMessageCount": int
"viewCount": int
"upVoteCount": int
"downVoteCount": int
"encryptionVersion": string // encryption version, like 'verus.v1'
"encryptionEpoch": int // epoch defines key bundle that was used for encryption
"encryptionEpk": string // ephemeral public key that should be used to decrypt cypher data
}
}
"error": { "status": bool, "code": int, "message": string }
}
Edit channel message body
Method: websocket
Endpoint: channel:editMessageBody
Description: Api edits message body in a textchat channel.
Request:
{
"data": {
"channelId": string
"messageId": string
"messageBody": string
"messageTitle": string
"encryptionVersion": string // encryption version, like 'verus.v1'
"encryptionEpoch": int // epoch defines key bundle that was used for encryption
"encryptionEpk": string // ephemeral public key that should be used to decrypt cypher data
}
"event": { "id": string, "date": timestamp }
}
Response:
{
"error": { "status": bool, "code": int, "message": string }
}
Add channel message attachments
Method: websocket
Endpoint: channel:addMessageAttachments
Description: Api add attachments to a message in a textchat channel.
Request:
{
"data": {
"channelId": string
"messageId": string
"attachmentIds": [ string ]
}
"event": { "id": string, "date": timestamp }
}
Response:
{
"error": { "status": bool, "code": int, "message": string }
}
Delete channel message attachments
Method: websocket
Endpoint: channel:deleteMessageAttachments
Description: Api deletes attachments from a message in a textchat channel.
Request:
{
"data": {
"channelId": string
"messageId": string
"attachmentIds": [ string ]
}
"event": { "id": string, "date": timestamp }
}
Response:
{
"error": { "status": bool, "code": int, "message": string }
}
Block channel message
Method: websocket
Endpoint: channel:blockMessage
Description: Api blocks message in a textchat channel. Only channel manager in group channel can block message.
Request:
{
"data": {
"channelId": string
"messageId": string
}
"event": { "id": string, "date": timestamp }
}
Response:
{
"error": { "status": bool, "code": int, "message": string }
}
Unblock channel message
Method: websocket
Endpoint: channel:unblockMessage
Description: Api unblock blocked message in a textchat channel. Only channel manager in group channel can unblock message.
Request:
{
"data": {
"channelId": string
"messageId": string
}
"event": { "id": string, "date": timestamp }
}
Response:
{
"error": { "status": bool, "code": int, "message": string }
}
Delete channel message
Method: websocket
Endpoint: channel:deleteMessage
DEPRECATED
Description: DEPRECATED, use channel:updateMessageDeletedStatus instead.
Request:
{
"data": {
"channelId": string
"messageId": string
}
"event": { "id": string, "date": timestamp }
}
Response:
{
"error": { "status": bool, "code": int, "message": string }
}
Restore channel message
Method: websocket
Endpoint: channel:restoreMessage
DEPRECATED
Description: DEPRECATED, use channel:updateMessageDeletedStatus instead.
Request:
{
"data": {
"channelId": string
"messageId": string
}
"event": { "id": string, "date": timestamp }
}
Response:
{
"error": { "status": bool, "code": int, "message": string }
}
Update channel message deleted status
Method: websocket
Endpoint: channel:updateMessageDeletedStatus
Description: Api updates deletes status for a message in a textchat channel. Only message author can restore message.
Request:
{
"data": {
"channelId": string
"messageId": string
"isDeleted": bool
}
"event": { "id": string, "date": timestamp }
}
Response:
{
"error": { "status": bool, "code": int, "message": string }
}
Delete message from channel
Method: websocket
Endpoint: channel:deleteMessageFromChannel
Description: Api completely deletes message from a textchat channel. Api is available for a limited number of channel types (community and user posts).
Request:
{
"data": {
"channelId": string
"messageId": string
}
"event": { "id": string, "date": timestamp }
}
Response:
{
"error": { "status": bool, "code": int, "message": string }
}
Generate aI welcome message
Method: websocket
Endpoint: channel:generateAIWelcomeMessage
Description: Api generates welcome message in AI textchat channel.
Request:
{
"data": {
"channelId": string
"messageBody": string
}
"event": { "id": string, "date": timestamp }
}
Response:
{
"error": { "status": bool, "code": int, "message": string }
}
Get last channel message
Method: websocket
Endpoint: channel:getLastMessage
Description: Api returns last message of textchat channel (does not update last read timestamp).
Request:
{
"data": {
"channelId": string // textchat channel id
}
"event": { "id": string, "date": timestamp }
}
Response:
{
"data": {
"message": {
"channelId": string
"bucketId": string
"messageId": string
"authorId": string
"networkId": string
"created": timestamp
"updated": timestamp
"messageType": int // 0 - my, 1 - user, 3 - system, 4 - system JSON, 6 - request JSON, 7 - endorsement JSON, 8 - activity JSON, 9 - card JSON, 100-199 - AI messages
"messageBody": string
"messageTitle": string
"isBlocked": bool
"isDeleted": bool
"attachments": [{
"resourceId": string
"fileName": string
"fileSize": int
"contentType": string
"durationFloat": float
"encryptionVersion": string // encryption version, like 'verus.v1'
"encryptionEpoch": int // epoch defines key bundle that was used for encryption
"encryptionEpk": string // ephemeral public key that should be used to decrypt cypher data
}]
"replyMessage": {
"channelId": string
"messageId": string
"authorId": string
"created": timestamp
"messageType": int
"messageBody": string
"attachments": [{
"resourceId": string
"fileName": string
"fileSize": int
"contentType": string
"durationFloat": float
"encryptionVersion": string // encryption version, like 'verus.v1'
"encryptionEpoch": int // epoch defines key bundle that was used for encryption
"encryptionEpk": string // ephemeral public key that should be used to decrypt cypher data
}]
"encryptionVersion": string // encryption version, like 'verus.v1'
"encryptionEpoch": int // epoch defines key bundle that was used for encryption
"encryptionEpk": string // ephemeral public key that should be used to decrypt cypher data
}
"forwardMessage": {
"channelId": string
"messageId": string
"authorId": string
"created": timestamp
"messageType": int
"messageBody": string
"attachments": [{
"resourceId": string
"fileName": string
"fileSize": int
"contentType": string
"durationFloat": float
"encryptionVersion": string // encryption version, like 'verus.v1'
"encryptionEpoch": int // epoch defines key bundle that was used for encryption
"encryptionEpk": string // ephemeral public key that should be used to decrypt cypher data
}]
"encryptionVersion": string // encryption version, like 'verus.v1'
"encryptionEpoch": int // epoch defines key bundle that was used for encryption
"encryptionEpk": string // ephemeral public key that should be used to decrypt cypher data
}
"subChannelPath": string
"subChannelTitles": [ string ]
"options": [ string ]
"reactions": {
"counters": [{ // counter per reaction, in descending order
"emoji": string
"count": int
}]
"userEmoji": string // user's emoji reaction to the message
}
"pollId": string
"userPoll": {
"poll": { // channel's poll
"id": string
"channelId": string // the channel the poll is in
"question": string // question/description of the poll
"isMultiSelect": bool // allow the users to select multiple choices
"isAnonymous": bool // can users see who voted for what
"created": timestamp // the time when poll was created
"closingTime": timestamp // users cannot vote after the closing time, defaults to one day
"options": [ string ] // list of options which the channel users vote for
"voteCounters": [ int ] // calculated number of votes per option respectively
}
"vote": { // user's vote in the poll'
"pollId": string
"userId": string
"options": [ string ] // list of options the user voted for
}
}
"threadChannelId": string
"threadMessageCount": int
"viewCount": int
"upVoteCount": int
"downVoteCount": int
"encryptionVersion": string // encryption version, like 'verus.v1'
"encryptionEpoch": int // epoch defines key bundle that was used for encryption
"encryptionEpk": string // ephemeral public key that should be used to decrypt cypher data
}
}
"error": { "status": bool, "code": int, "message": string }
}
List channel messages
Method: websocket
Endpoint: channel:listMessages
Description: Api returns list of textchat channel messages. Api subscribes user socket to broadcast events of channel.
Field messageType could be one of:
- 0 - my message
- 1 - user message
- 3 - system message
- 4 - system json message
- 100 - Open AI question message
- 101 - Open AI answer message
- 102 - Rav AI question message
- 103 - Rav AI answer message
In case of system json message, parsed json is sent in message body:
{
"userId": string
"userName": string
"roomId": string
"propId": string
"propName": string
"eventType": int
}
Field event could be one of:
- 1 - user entered booth
- 2 - user wrote to booth
- 3 - user entered social circle
- 4 - user wrote to social circle
Request:
{
"data": {
"channelId": string // textchat channel id
"subChannelId": string // fetch messages sent to subchannel
"messagesFilter": string // all/allAI/openAI/ravAI
"beforeMessageId": string // deprecated. pagination cursor, get messages before this message id
"afterMessageId": string // deprecated. pagination cursor, get messages after this message id
"messageId": string // pagination cursor, skip to start from the beginning
"direction": string // pagination direction: before (default), after, bilateral
"limit": int // max number of messages to return (1-100)
}
"event": { "id": string, "date": timestamp }
}
Response:
{
"data": {
"messages": [{
"channelId": string
"bucketId": string
"messageId": string
"authorId": string
"networkId": string
"created": timestamp
"updated": timestamp
"messageType": int // 0 - my, 1 - user, 3 - system, 4 - system JSON, 6 - request JSON, 7 - endorsement JSON, 8 - activity JSON, 9 - card JSON, 100-199 - AI messages
"messageBody": string
"messageTitle": string
"isBlocked": bool
"isDeleted": bool
"attachments": [{
"resourceId": string
"fileName": string
"fileSize": int
"contentType": string
"durationFloat": float
"encryptionVersion": string // encryption version, like 'verus.v1'
"encryptionEpoch": int // epoch defines key bundle that was used for encryption
"encryptionEpk": string // ephemeral public key that should be used to decrypt cypher data
}]
"replyMessage": {
"channelId": string
"messageId": string
"authorId": string
"created": timestamp
"messageType": int
"messageBody": string
"attachments": [{
"resourceId": string
"fileName": string
"fileSize": int
"contentType": string
"durationFloat": float
"encryptionVersion": string // encryption version, like 'verus.v1'
"encryptionEpoch": int // epoch defines key bundle that was used for encryption
"encryptionEpk": string // ephemeral public key that should be used to decrypt cypher data
}]
"encryptionVersion": string // encryption version, like 'verus.v1'
"encryptionEpoch": int // epoch defines key bundle that was used for encryption
"encryptionEpk": string // ephemeral public key that should be used to decrypt cypher data
}
"forwardMessage": {
"channelId": string
"messageId": string
"authorId": string
"created": timestamp
"messageType": int
"messageBody": string
"attachments": [{
"resourceId": string
"fileName": string
"fileSize": int
"contentType": string
"durationFloat": float
"encryptionVersion": string // encryption version, like 'verus.v1'
"encryptionEpoch": int // epoch defines key bundle that was used for encryption
"encryptionEpk": string // ephemeral public key that should be used to decrypt cypher data
}]
"encryptionVersion": string // encryption version, like 'verus.v1'
"encryptionEpoch": int // epoch defines key bundle that was used for encryption
"encryptionEpk": string // ephemeral public key that should be used to decrypt cypher data
}
"subChannelPath": string
"subChannelTitles": [ string ]
"options": [ string ]
"reactions": {
"counters": [{ // counter per reaction, in descending order
"emoji": string
"count": int
}]
"userEmoji": string // user's emoji reaction to the message
}
"pollId": string
"userPoll": {
"poll": { // channel's poll
"id": string
"channelId": string // the channel the poll is in
"question": string // question/description of the poll
"isMultiSelect": bool // allow the users to select multiple choices
"isAnonymous": bool // can users see who voted for what
"created": timestamp // the time when poll was created
"closingTime": timestamp // users cannot vote after the closing time, defaults to one day
"options": [ string ] // list of options which the channel users vote for
"voteCounters": [ int ] // calculated number of votes per option respectively
}
"vote": { // user's vote in the poll'
"pollId": string
"userId": string
"options": [ string ] // list of options the user voted for
}
}
"threadChannelId": string
"threadMessageCount": int
"viewCount": int
"upVoteCount": int
"downVoteCount": int
"encryptionVersion": string // encryption version, like 'verus.v1'
"encryptionEpoch": int // epoch defines key bundle that was used for encryption
"encryptionEpk": string // ephemeral public key that should be used to decrypt cypher data
}]
"hasNext": bool // true if channel has newer messages and 'afterMessageId' cursor applied
"hasPrevious": bool // true if channel has older messages and 'afterMessageId' cursor not applied
"total": int // total amount of channel messages
"channelSource": string // channel source (belonging) string
}
"error": { "status": bool, "code": int, "message": string }
}
List channel messages with engagement
Method: websocket
Endpoint: channel:listMessagesWithEngagement
Description: Api does the same as listMessages but also returns user votes for messages.
Request:
{
"data": {
"channelId": string // textchat channel id
"subChannelId": string // fetch messages sent to subchannel
"messagesFilter": string // all/allAI/openAI/ravAI
"beforeMessageId": string // deprecated. pagination cursor, get messages before this message id
"afterMessageId": string // deprecated. pagination cursor, get messages after this message id
"messageId": string // pagination cursor, skip to start from the beginning
"direction": string // pagination direction: before (default), after, bilateral
"limit": int // max number of messages to return (1-100)
}
"event": { "id": string, "date": timestamp }
}
Response:
{
"data": {
"messages": [{
"channelId": string
"bucketId": string
"messageId": string
"authorId": string
"networkId": string
"created": timestamp
"updated": timestamp
"messageType": int // 0 - my, 1 - user, 3 - system, 4 - system JSON, 6 - request JSON, 7 - endorsement JSON, 8 - activity JSON, 9 - card JSON, 100-199 - AI messages
"messageBody": string
"messageTitle": string
"isBlocked": bool
"isDeleted": bool
"attachments": [{
"resourceId": string
"fileName": string
"fileSize": int
"contentType": string
"durationFloat": float
"encryptionVersion": string // encryption version, like 'verus.v1'
"encryptionEpoch": int // epoch defines key bundle that was used for encryption
"encryptionEpk": string // ephemeral public key that should be used to decrypt cypher data
}]
"replyMessage": {
"channelId": string
"messageId": string
"authorId": string
"created": timestamp
"messageType": int
"messageBody": string
"attachments": [{
"resourceId": string
"fileName": string
"fileSize": int
"contentType": string
"durationFloat": float
"encryptionVersion": string // encryption version, like 'verus.v1'
"encryptionEpoch": int // epoch defines key bundle that was used for encryption
"encryptionEpk": string // ephemeral public key that should be used to decrypt cypher data
}]
"encryptionVersion": string // encryption version, like 'verus.v1'
"encryptionEpoch": int // epoch defines key bundle that was used for encryption
"encryptionEpk": string // ephemeral public key that should be used to decrypt cypher data
}
"forwardMessage": {
"channelId": string
"messageId": string
"authorId": string
"created": timestamp
"messageType": int
"messageBody": string
"attachments": [{
"resourceId": string
"fileName": string
"fileSize": int
"contentType": string
"durationFloat": float
"encryptionVersion": string // encryption version, like 'verus.v1'
"encryptionEpoch": int // epoch defines key bundle that was used for encryption
"encryptionEpk": string // ephemeral public key that should be used to decrypt cypher data
}]
"encryptionVersion": string // encryption version, like 'verus.v1'
"encryptionEpoch": int // epoch defines key bundle that was used for encryption
"encryptionEpk": string // ephemeral public key that should be used to decrypt cypher data
}
"subChannelPath": string
"subChannelTitles": [ string ]
"options": [ string ]
"reactions": {
"counters": [{ // counter per reaction, in descending order
"emoji": string
"count": int
}]
"userEmoji": string // user's emoji reaction to the message
}
"pollId": string
"userPoll": {
"poll": { // channel's poll
"id": string
"channelId": string // the channel the poll is in
"question": string // question/description of the poll
"isMultiSelect": bool // allow the users to select multiple choices
"isAnonymous": bool // can users see who voted for what
"created": timestamp // the time when poll was created
"closingTime": timestamp // users cannot vote after the closing time, defaults to one day
"options": [ string ] // list of options which the channel users vote for
"voteCounters": [ int ] // calculated number of votes per option respectively
}
"vote": { // user's vote in the poll'
"pollId": string
"userId": string
"options": [ string ] // list of options the user voted for
}
}
"threadChannelId": string
"threadMessageCount": int
"viewCount": int
"upVoteCount": int
"downVoteCount": int
"encryptionVersion": string // encryption version, like 'verus.v1'
"encryptionEpoch": int // epoch defines key bundle that was used for encryption
"encryptionEpk": string // ephemeral public key that should be used to decrypt cypher data
}]
"hasNext": bool // true if channel has newer messages and 'afterMessageId' cursor applied
"hasPrevious": bool // true if channel has older messages and 'afterMessageId' cursor not applied
"total": int // total amount of channel messages
"channelSource": string // channel source (belonging) string
"userVotes": map[string]int // user votes per message id (if set)
}
"error": { "status": bool, "code": int, "message": string }
}
Set channel last read message
Method: websocket
Endpoint: channel:setChannelLastReadMessage
Description: Api updates last read timestamp for textchat channel participant.
Request:
{
"data": {
"channelId": string
"messageId": string
}
"event": { "id": string, "date": timestamp }
}
Response:
{
"error": { "status": bool, "code": int, "message": string }
}
Set vote for channel message
Method: websocket
Endpoint: channel:setVoteForMessage
Request:
{
"data": {
"channelId": string
"messageId": string
"voteStatus": int // up = 1, down = -1, none = 0
}
"event": { "id": string, "date": timestamp }
}
Response:
{
"error": { "status": bool, "code": int, "message": string }
}
Create channel poll message
Method: websocket
Endpoint: channel:createPollMessage
Description: Api creates a new poll message in a textchat channel.
Request:
{
"data": {
"id": string
"channelId": string // the channel the poll is in
"question": string // question/description of the poll
"isMultiSelect": bool // allow the users to select multiple choices
"isAnonymous": bool // can users see who voted for what
"created": timestamp // the time when poll was created
"closingTime": timestamp // users cannot vote after the closing time, defaults to one day
"options": [ string ] // list of options which the channel users vote for
"voteCounters": [ int ] // calculated number of votes per option respectively
"subChannelId": string // subchannel id, if message is sent to subchannel
}
"event": { "id": string, "date": timestamp }
}
Response:
{
"data": {
"message": {
"channelId": string
"bucketId": string
"messageId": string
"authorId": string
"networkId": string
"created": timestamp
"updated": timestamp
"messageType": int // 0 - my, 1 - user, 3 - system, 4 - system JSON, 6 - request JSON, 7 - endorsement JSON, 8 - activity JSON, 9 - card JSON, 100-199 - AI messages
"messageBody": string
"messageTitle": string
"isBlocked": bool
"isDeleted": bool
"attachments": [{
"resourceId": string
"fileName": string
"fileSize": int
"contentType": string
"durationFloat": float
"encryptionVersion": string // encryption version, like 'verus.v1'
"encryptionEpoch": int // epoch defines key bundle that was used for encryption
"encryptionEpk": string // ephemeral public key that should be used to decrypt cypher data
}]
"replyMessage": {
"channelId": string
"messageId": string
"authorId": string
"created": timestamp
"messageType": int
"messageBody": string
"attachments": [{
"resourceId": string
"fileName": string
"fileSize": int
"contentType": string
"durationFloat": float
"encryptionVersion": string // encryption version, like 'verus.v1'
"encryptionEpoch": int // epoch defines key bundle that was used for encryption
"encryptionEpk": string // ephemeral public key that should be used to decrypt cypher data
}]
"encryptionVersion": string // encryption version, like 'verus.v1'
"encryptionEpoch": int // epoch defines key bundle that was used for encryption
"encryptionEpk": string // ephemeral public key that should be used to decrypt cypher data
}
"forwardMessage": {
"channelId": string
"messageId": string
"authorId": string
"created": timestamp
"messageType": int
"messageBody": string
"attachments": [{
"resourceId": string
"fileName": string
"fileSize": int
"contentType": string
"durationFloat": float
"encryptionVersion": string // encryption version, like 'verus.v1'
"encryptionEpoch": int // epoch defines key bundle that was used for encryption
"encryptionEpk": string // ephemeral public key that should be used to decrypt cypher data
}]
"encryptionVersion": string // encryption version, like 'verus.v1'
"encryptionEpoch": int // epoch defines key bundle that was used for encryption
"encryptionEpk": string // ephemeral public key that should be used to decrypt cypher data
}
"subChannelPath": string
"subChannelTitles": [ string ]
"options": [ string ]
"reactions": {
"counters": [{ // counter per reaction, in descending order
"emoji": string
"count": int
}]
"userEmoji": string // user's emoji reaction to the message
}
"pollId": string
"userPoll": {
"poll": { // channel's poll
"id": string
"channelId": string // the channel the poll is in
"question": string // question/description of the poll
"isMultiSelect": bool // allow the users to select multiple choices
"isAnonymous": bool // can users see who voted for what
"created": timestamp // the time when poll was created
"closingTime": timestamp // users cannot vote after the closing time, defaults to one day
"options": [ string ] // list of options which the channel users vote for
"voteCounters": [ int ] // calculated number of votes per option respectively
}
"vote": { // user's vote in the poll'
"pollId": string
"userId": string
"options": [ string ] // list of options the user voted for
}
}
"threadChannelId": string
"threadMessageCount": int
"viewCount": int
"upVoteCount": int
"downVoteCount": int
"encryptionVersion": string // encryption version, like 'verus.v1'
"encryptionEpoch": int // epoch defines key bundle that was used for encryption
"encryptionEpk": string // ephemeral public key that should be used to decrypt cypher data
}
}
"error": { "status": bool, "code": int, "message": string }
}
Post poll vote
Method: websocket
Endpoint: channel:postPollVote
Description: Api casts a vote in the poll.
Request:
{
"data": {
"channelId": string
"pollId": string
"options": [ string ] // list of options to vote
"undo": bool // true to retract the existing vote
}
"event": { "id": string, "date": timestamp }
}
Response:
{
"data": {
"pollId": string
"userId": string
"options": [ string ] // list of options the user voted for
}
"error": { "status": bool, "code": int, "message": string }
}
Get poll stats
Method: websocket
Endpoint: channel:getPollStats
Description: Api gets a map of user votes for non-anonymous polls.
Request:
{
"data": {
"pollId": string
}
"event": { "id": string, "date": timestamp }
}
Response:
{
"data": {
"usersPerOption": map[string][ string ]
}
"error": { "status": bool, "code": int, "message": string }
}
React to message
Method: websocket
Endpoint: channel:reactToMessage
Description: Api sends a reaction to the specified message in a textchat channel.
Request:
{
"data": {
"channelId": string
"messageId": string // id the message to send reaction to
"emoji": string // emoji in unicode v16 string, empty string will erase the existing one.
}
"event": { "id": string, "date": timestamp }
}
Response:
{
"data": {
"channelId": string
"messageId": string
"reactions": {
"counters": [{ // counter per reaction, in descending order
"emoji": string
"count": int
}]
"userEmoji": string // user's emoji reaction to the message
}
}
"error": { "status": bool, "code": int, "message": string }
}
List users reacted to message
Method: websocket
Endpoint: channel:listUsersReactedToMessage
Description: Api returns a list of users to reacted to the specified message in a textchat channel.
Request:
{
"data": {
"channelId": string
"messageId": string
"emoji": string // users reacted with the emoji
"cursor": string // userId, return users created after the specified userId
"limit": int // max number of messages to return (1-100)
}
"event": { "id": string, "date": timestamp }
}
Response:
{
"data": {
"userList": [{ // list of reacted users with ascending order by userId
"channelId": string
"bucketId": string
"messageId": string
"userId": string
"emoji": string
"created": timestamp
}]
"hasMore": bool
}
"error": { "status": bool, "code": int, "message": string }
}
Search attachments of channel
Method: websocket
Endpoint: channel:searchAttachmentsOfChannel
Request:
{
"data": {
"channelId": string
"query": string
"cursor": string
"limit": int
}
"event": { "id": string, "date": timestamp }
}
Response:
{
"data": {
"resources": [{ resource structure }]
"nextCursor": string
"hasMore": bool
}
"error": { "status": bool, "code": int, "message": string }
}
Create sub channel
Method: websocket
Endpoint: channel:createSubChannel
Request:
{
"data": {
"channelId": string // textchat channel id
"parentSubChannelId": string // parent subchannel id, if nested
"title": string // subchannel title
"contentDirectoryId": string // content directory id for the sub channel, attachments will belong there
"options": [ string ] // additional options for a subchannel, like 'events' or 'booth'
}
"event": { "id": string, "date": timestamp }
}
Response:
{
"data": {
"subChannel": {
"channelId": string
"subChannelId": string
"parentSubChannelPath": string
"parentSubChannelTitles": [ string ]
"created": timestamp
"title": string
"contentDirectoryId": string
"options": [ string ]
"lastMessageBucketId": string
"lastMessage": {
"messageId": string
"created": timestamp
"authorId": string
"authorName": string
"messageBody": string
"messageContentType": int // 0 - text, 1 - blocked, 2 - deleted, 3 - request JSON, 4 - endorsement JSON, 5 - activity JSON, 6 - card JSON, 7 - system JSON, 8 - poll, 9 - forward, 10 - file attachment, 11 - image, 12 - video, 13 - audio
"encryptionVersion": string // encryption version, like 'verus.v1'
"encryptionEpoch": int // epoch defines key bundle that was used for encryption
"encryptionEpk": string // ephemeral public key that should be used to decrypt cypher data
}
"messageCount": int
"subChannelCount": int
}
}
"error": { "status": bool, "code": int, "message": string }
}
Delete sub channel
Method: websocket
Endpoint: channel:deleteSubChannel
Request:
{
"data": {
"channelId": string // textchat channel id
"subChannelId": string // subchannel id
}
"event": { "id": string, "date": timestamp }
}
Response:
{
"error": { "status": bool, "code": int, "message": string }
}
Update sub channel
Method: websocket
Endpoint: channel:updateSubChannel
Request:
{
"data": {
"channelId": string
"subChannelId": string
"title": string
}
"event": { "id": string, "date": timestamp }
}
Response:
{
"error": { "status": bool, "code": int, "message": string }
}
List sub channels
Method: websocket
Endpoint: channel:listSubChannels
Request:
{
"data": {
"channelId": string // textchat channel id
"parentSubChannelId": string // parent subchannel id, if nested
"fetchNested": bool // if false - api fetches only first level of subchannels; if true - all nested subchannels
}
"event": { "id": string, "date": timestamp }
}
Response:
{
"data": {
"subChannels": [{
"channelId": string
"subChannelId": string
"parentSubChannelPath": string
"parentSubChannelTitles": [ string ]
"created": timestamp
"title": string
"contentDirectoryId": string
"options": [ string ]
"lastMessageBucketId": string
"lastMessage": {
"messageId": string
"created": timestamp
"authorId": string
"authorName": string
"messageBody": string
"messageContentType": int // 0 - text, 1 - blocked, 2 - deleted, 3 - request JSON, 4 - endorsement JSON, 5 - activity JSON, 6 - card JSON, 7 - system JSON, 8 - poll, 9 - forward, 10 - file attachment, 11 - image, 12 - video, 13 - audio
"encryptionVersion": string // encryption version, like 'verus.v1'
"encryptionEpoch": int // epoch defines key bundle that was used for encryption
"encryptionEpk": string // ephemeral public key that should be used to decrypt cypher data
}
"messageCount": int
"subChannelCount": int
}]
}
"error": { "status": bool, "code": int, "message": string }
}
Get sub channel and parents
Method: websocket
Endpoint: channel:getSubChannelAndParents
Request:
{
"data": {
"channelId": string // textchat channel id
"subChannelId": string // subchannel id
}
"event": { "id": string, "date": timestamp }
}
Response:
{
"data": {
"subChannels": [{
"channelId": string
"subChannelId": string
"parentSubChannelPath": string
"parentSubChannelTitles": [ string ]
"created": timestamp
"title": string
"contentDirectoryId": string
"options": [ string ]
"lastMessageBucketId": string
"lastMessage": {
"messageId": string
"created": timestamp
"authorId": string
"authorName": string
"messageBody": string
"messageContentType": int // 0 - text, 1 - blocked, 2 - deleted, 3 - request JSON, 4 - endorsement JSON, 5 - activity JSON, 6 - card JSON, 7 - system JSON, 8 - poll, 9 - forward, 10 - file attachment, 11 - image, 12 - video, 13 - audio
"encryptionVersion": string // encryption version, like 'verus.v1'
"encryptionEpoch": int // epoch defines key bundle that was used for encryption
"encryptionEpk": string // ephemeral public key that should be used to decrypt cypher data
}
"messageCount": int
"subChannelCount": int
}]
}
"error": { "status": bool, "code": int, "message": string }
}
Get z addresses for channel participants
Method: websocket
Endpoint: channel:getZAddressesForParticipants
Description: Api returns z-addresses of channel participants.
Api is now available only for direct and group channels.
Api returns map of userId -> zAddress for all channel participants. If user does not have z-address, empty string is returned for that userId. Participants with empty zAddress would not be able to decrypt messages in the channel. Application should detect this situation and inform user about it.
Request:
{
"data": {
"channelId": string // textchat channel id
}
"event": { "id": string, "date": timestamp }
}
Response:
{
"data": {
"zAddresses": map[string]string // map of zAddresses per userIds for channel participants
}
"error": { "status": bool, "code": int, "message": string }
}
Create channel encryption epoch
Method: websocket
Endpoint: channel:createEncryptionEpoch
DEPRECATED
Description: Api creates new epoch for channel message encryption. Client application need to provide encrypted viewing key for each channel participant.
Request:
{
"data": {
"channelId": string // textchat channel id
"channelZAddress": string // channel zAddress for epoch
"participants": [{ // channel participants and viewing keys for epoch
"userId": string // participant user id
"userZAddress": string // participant zAddress for epoch
"vkEpk": string // ephemeral public key for viewing key decryption
"vkCypher": string // viewing key of channel epoch encrypted for participant
}]
"expectedEpoch": int // optional, if provided - server will check that new epoch equals to expectedEpoch (detect simultaneous epoch creation)
}
"event": { "id": string, "date": timestamp }
}
Response:
{
"data": {
"epoch": {
"channelId": string // textchat channel id
"channelZAddress": string // channel zAddress for epoch
"epoch": int // channel epoch number
"created": timestamp // epoch creation time
}
}
"error": { "status": bool, "code": int, "message": string }
}
Update channel encryption epoch
Method: websocket
Endpoint: channel:updateEncryptionEpoch
DEPRECATED
Description: Api updates epoch for participant in channel. This is useful in case when user has changed his zAddress and wants to update viewing keys correspondingly.
Request:
{
"data": {
"channelId": string
"epoch": int
"userZAddress": string // participant zAddress for epoch
"vkEpk": string // ephemeral public key for viewing key decryption
"vkCypher": string // viewing key of channel epoch encrypted for participant
}
"event": { "id": string, "date": timestamp }
}
Response:
{
"error": { "status": bool, "code": int, "message": string }
}
List channel encryption epoches
Method: websocket
Endpoint: channel:listEncryptionEpoches
DEPRECATED
Description: Api returns list of all epoches for provided channel.
Request:
{
"data": {
"channelId": string // textchat channel id
}
"event": { "id": string, "date": timestamp }
}
Response:
{
"data": {
"epoches": [{
"channelId": string // textchat channel id
"channelZAddress": string // channel zAddress for epoch
"epoch": int // channel epoch number
"created": timestamp // epoch creation time
"userId": string // participant user id
"userZAddress": string // participant zAddress for epoch
"vkEpk": string // ephemeral public key for viewing key decryption
"vkCypher": string // viewing key of channel epoch encrypted for participant
}]
}
"error": { "status": bool, "code": int, "message": string }
}
List channel encryption epoches by tuples
Method: websocket
Endpoint: channel:listEncryptionEpochesByTuples
DEPRECATED
Description: Api returns list of epoches for provided channels-epoch tuples.
Request:
{
"data": {
"epochTuples": [ ( targetId string, epoch int ) ] // list of [targetId, epoch] tuples
}
"event": { "id": string, "date": timestamp }
}
Response:
{
"data": {
"epoches": [{
"channelId": string // textchat channel id
"channelZAddress": string // channel zAddress for epoch
"epoch": int // channel epoch number
"created": timestamp // epoch creation time
"userId": string // participant user id
"userZAddress": string // participant zAddress for epoch
"vkEpk": string // ephemeral public key for viewing key decryption
"vkCypher": string // viewing key of channel epoch encrypted for participant
}]
}
"error": { "status": bool, "code": int, "message": string }
}
List channel encryption epoches by z address
Method: websocket
Endpoint: channel:listEncryptionEpochesByZAddress
DEPRECATED
Description: Api returns list of epoches for provided user zAddress.
Request:
{
"data": {
"zAddress": string
}
"event": { "id": string, "date": timestamp }
}
Response:
{
"data": {
"epoches": [{
"channelId": string // textchat channel id
"channelZAddress": string // channel zAddress for epoch
"epoch": int // channel epoch number
"created": timestamp // epoch creation time
"userId": string // participant user id
"userZAddress": string // participant zAddress for epoch
"vkEpk": string // ephemeral public key for viewing key decryption
"vkCypher": string // viewing key of channel epoch encrypted for participant
}]
}
"error": { "status": bool, "code": int, "message": string }
}
Get last channel encryption epoch
Method: websocket
Endpoint: channel:getLastEncryptionEpoch
DEPRECATED
Description: Api returns last epoch for participant in channel.
Request:
{
"data": {
"channelId": string // textchat channel id
}
"event": { "id": string, "date": timestamp }
}
Response:
{
"data": {
"epoch": {
"channelId": string // textchat channel id
"channelZAddress": string // channel zAddress for epoch
"epoch": int // channel epoch number
"created": timestamp // epoch creation time
"userId": string // participant user id
"userZAddress": string // participant zAddress for epoch
"vkEpk": string // ephemeral public key for viewing key decryption
"vkCypher": string // viewing key of channel epoch encrypted for participant
}
}
"error": { "status": bool, "code": int, "message": string }
}
Request new encryption epoch for channel
Method: websocket
Endpoint: channel:requestNewEncryptionEpoch
Description: Api marks channel as needing new encryption epoch.
Request:
{
"data": {
"channelId": string // textchat channel id
}
"event": { "id": string, "date": timestamp }
}
Response:
{
"error": { "status": bool, "code": int, "message": string }
}
On message created event
Event: channel:onMessageCreated
Description: Event is triggered when a new message is created in a channel.
Data:
{
"data": {
"channelId": string // textchat channel id
"channelSource": string // channel source (belonging) string
"message": { // message model
"channelId": string
"bucketId": string
"messageId": string
"authorId": string
"networkId": string
"created": timestamp
"updated": timestamp
"messageType": int // 0 - my, 1 - user, 3 - system, 4 - system JSON, 6 - request JSON, 7 - endorsement JSON, 8 - activity JSON, 9 - card JSON, 100-199 - AI messages
"messageBody": string
"messageTitle": string
"isBlocked": bool
"isDeleted": bool
"attachments": [{
"resourceId": string
"fileName": string
"fileSize": int
"contentType": string
"durationFloat": float
"encryptionVersion": string // encryption version, like 'verus.v1'
"encryptionEpoch": int // epoch defines key bundle that was used for encryption
"encryptionEpk": string // ephemeral public key that should be used to decrypt cypher data
}]
"replyMessage": {
"channelId": string
"messageId": string
"authorId": string
"created": timestamp
"messageType": int
"messageBody": string
"attachments": [{
"resourceId": string
"fileName": string
"fileSize": int
"contentType": string
"durationFloat": float
"encryptionVersion": string // encryption version, like 'verus.v1'
"encryptionEpoch": int // epoch defines key bundle that was used for encryption
"encryptionEpk": string // ephemeral public key that should be used to decrypt cypher data
}]
"encryptionVersion": string // encryption version, like 'verus.v1'
"encryptionEpoch": int // epoch defines key bundle that was used for encryption
"encryptionEpk": string // ephemeral public key that should be used to decrypt cypher data
}
"forwardMessage": {
"channelId": string
"messageId": string
"authorId": string
"created": timestamp
"messageType": int
"messageBody": string
"attachments": [{
"resourceId": string
"fileName": string
"fileSize": int
"contentType": string
"durationFloat": float
"encryptionVersion": string // encryption version, like 'verus.v1'
"encryptionEpoch": int // epoch defines key bundle that was used for encryption
"encryptionEpk": string // ephemeral public key that should be used to decrypt cypher data
}]
"encryptionVersion": string // encryption version, like 'verus.v1'
"encryptionEpoch": int // epoch defines key bundle that was used for encryption
"encryptionEpk": string // ephemeral public key that should be used to decrypt cypher data
}
"subChannelPath": string
"subChannelTitles": [ string ]
"options": [ string ]
"reactions": {
"counters": [{ // counter per reaction, in descending order
"emoji": string
"count": int
}]
"userEmoji": string // user's emoji reaction to the message
}
"pollId": string
"userPoll": {
"poll": { // channel's poll
"id": string
"channelId": string // the channel the poll is in
"question": string // question/description of the poll
"isMultiSelect": bool // allow the users to select multiple choices
"isAnonymous": bool // can users see who voted for what
"created": timestamp // the time when poll was created
"closingTime": timestamp // users cannot vote after the closing time, defaults to one day
"options": [ string ] // list of options which the channel users vote for
"voteCounters": [ int ] // calculated number of votes per option respectively
}
"vote": { // user's vote in the poll'
"pollId": string
"userId": string
"options": [ string ] // list of options the user voted for
}
}
"threadChannelId": string
"threadMessageCount": int
"viewCount": int
"upVoteCount": int
"downVoteCount": int
"encryptionVersion": string // encryption version, like 'verus.v1'
"encryptionEpoch": int // epoch defines key bundle that was used for encryption
"encryptionEpk": string // ephemeral public key that should be used to decrypt cypher data
}
"isLastMessage": bool // true, if the last message in the channel
}
"error": { "status": bool, "code": int, "message": string }
}
On message deleted event
Event: channel:onMessageDeleted
Description: Event is triggered when message is deleted from a channel.
Data:
{
"data": {
"channelId": string // textchat channel id
"channelSource": string // channel source (belonging) string
"messageId": string // message id
"isLastMessage": bool // true, if the last message in the channel
"subChannelPath": string // ids of parent subchannels (if present)
}
"error": { "status": bool, "code": int, "message": string }
}
On message edited event
Event: channel:onMessageEdited
Description: Event is triggered when message body is updated in a channel.
Data:
{
"data": {
"channelId": string // textchat channel id
"channelSource": string // channel source (belonging) string
"message": { // message model
"channelId": string
"bucketId": string
"messageId": string
"authorId": string
"networkId": string
"created": timestamp
"updated": timestamp
"messageType": int // 0 - my, 1 - user, 3 - system, 4 - system JSON, 6 - request JSON, 7 - endorsement JSON, 8 - activity JSON, 9 - card JSON, 100-199 - AI messages
"messageBody": string
"messageTitle": string
"isBlocked": bool
"isDeleted": bool
"attachments": [{
"resourceId": string
"fileName": string
"fileSize": int
"contentType": string
"durationFloat": float
"encryptionVersion": string // encryption version, like 'verus.v1'
"encryptionEpoch": int // epoch defines key bundle that was used for encryption
"encryptionEpk": string // ephemeral public key that should be used to decrypt cypher data
}]
"replyMessage": {
"channelId": string
"messageId": string
"authorId": string
"created": timestamp
"messageType": int
"messageBody": string
"attachments": [{
"resourceId": string
"fileName": string
"fileSize": int
"contentType": string
"durationFloat": float
"encryptionVersion": string // encryption version, like 'verus.v1'
"encryptionEpoch": int // epoch defines key bundle that was used for encryption
"encryptionEpk": string // ephemeral public key that should be used to decrypt cypher data
}]
"encryptionVersion": string // encryption version, like 'verus.v1'
"encryptionEpoch": int // epoch defines key bundle that was used for encryption
"encryptionEpk": string // ephemeral public key that should be used to decrypt cypher data
}
"forwardMessage": {
"channelId": string
"messageId": string
"authorId": string
"created": timestamp
"messageType": int
"messageBody": string
"attachments": [{
"resourceId": string
"fileName": string
"fileSize": int
"contentType": string
"durationFloat": float
"encryptionVersion": string // encryption version, like 'verus.v1'
"encryptionEpoch": int // epoch defines key bundle that was used for encryption
"encryptionEpk": string // ephemeral public key that should be used to decrypt cypher data
}]
"encryptionVersion": string // encryption version, like 'verus.v1'
"encryptionEpoch": int // epoch defines key bundle that was used for encryption
"encryptionEpk": string // ephemeral public key that should be used to decrypt cypher data
}
"subChannelPath": string
"subChannelTitles": [ string ]
"options": [ string ]
"reactions": {
"counters": [{ // counter per reaction, in descending order
"emoji": string
"count": int
}]
"userEmoji": string // user's emoji reaction to the message
}
"pollId": string
"userPoll": {
"poll": { // channel's poll
"id": string
"channelId": string // the channel the poll is in
"question": string // question/description of the poll
"isMultiSelect": bool // allow the users to select multiple choices
"isAnonymous": bool // can users see who voted for what
"created": timestamp // the time when poll was created
"closingTime": timestamp // users cannot vote after the closing time, defaults to one day
"options": [ string ] // list of options which the channel users vote for
"voteCounters": [ int ] // calculated number of votes per option respectively
}
"vote": { // user's vote in the poll'
"pollId": string
"userId": string
"options": [ string ] // list of options the user voted for
}
}
"threadChannelId": string
"threadMessageCount": int
"viewCount": int
"upVoteCount": int
"downVoteCount": int
"encryptionVersion": string // encryption version, like 'verus.v1'
"encryptionEpoch": int // epoch defines key bundle that was used for encryption
"encryptionEpk": string // ephemeral public key that should be used to decrypt cypher data
}
"isLastMessage": bool // true, if the last message in the channel
}
"error": { "status": bool, "code": int, "message": string }
}
On message blocked status updated event
Event: channel:onMessageBlockedStatusUpdated
Description: Event is triggered when message blocked status updated in a channel.
Data:
{
"data": {
"channelId": string // textchat channel id
"channelSource": string // channel source (belonging) string
"message": { // message model
"channelId": string
"bucketId": string
"messageId": string
"authorId": string
"networkId": string
"created": timestamp
"updated": timestamp
"messageType": int // 0 - my, 1 - user, 3 - system, 4 - system JSON, 6 - request JSON, 7 - endorsement JSON, 8 - activity JSON, 9 - card JSON, 100-199 - AI messages
"messageBody": string
"messageTitle": string
"isBlocked": bool
"isDeleted": bool
"attachments": [{
"resourceId": string
"fileName": string
"fileSize": int
"contentType": string
"durationFloat": float
"encryptionVersion": string // encryption version, like 'verus.v1'
"encryptionEpoch": int // epoch defines key bundle that was used for encryption
"encryptionEpk": string // ephemeral public key that should be used to decrypt cypher data
}]
"replyMessage": {
"channelId": string
"messageId": string
"authorId": string
"created": timestamp
"messageType": int
"messageBody": string
"attachments": [{
"resourceId": string
"fileName": string
"fileSize": int
"contentType": string
"durationFloat": float
"encryptionVersion": string // encryption version, like 'verus.v1'
"encryptionEpoch": int // epoch defines key bundle that was used for encryption
"encryptionEpk": string // ephemeral public key that should be used to decrypt cypher data
}]
"encryptionVersion": string // encryption version, like 'verus.v1'
"encryptionEpoch": int // epoch defines key bundle that was used for encryption
"encryptionEpk": string // ephemeral public key that should be used to decrypt cypher data
}
"forwardMessage": {
"channelId": string
"messageId": string
"authorId": string
"created": timestamp
"messageType": int
"messageBody": string
"attachments": [{
"resourceId": string
"fileName": string
"fileSize": int
"contentType": string
"durationFloat": float
"encryptionVersion": string // encryption version, like 'verus.v1'
"encryptionEpoch": int // epoch defines key bundle that was used for encryption
"encryptionEpk": string // ephemeral public key that should be used to decrypt cypher data
}]
"encryptionVersion": string // encryption version, like 'verus.v1'
"encryptionEpoch": int // epoch defines key bundle that was used for encryption
"encryptionEpk": string // ephemeral public key that should be used to decrypt cypher data
}
"subChannelPath": string
"subChannelTitles": [ string ]
"options": [ string ]
"reactions": {
"counters": [{ // counter per reaction, in descending order
"emoji": string
"count": int
}]
"userEmoji": string // user's emoji reaction to the message
}
"pollId": string
"userPoll": {
"poll": { // channel's poll
"id": string
"channelId": string // the channel the poll is in
"question": string // question/description of the poll
"isMultiSelect": bool // allow the users to select multiple choices
"isAnonymous": bool // can users see who voted for what
"created": timestamp // the time when poll was created
"closingTime": timestamp // users cannot vote after the closing time, defaults to one day
"options": [ string ] // list of options which the channel users vote for
"voteCounters": [ int ] // calculated number of votes per option respectively
}
"vote": { // user's vote in the poll'
"pollId": string
"userId": string
"options": [ string ] // list of options the user voted for
}
}
"threadChannelId": string
"threadMessageCount": int
"viewCount": int
"upVoteCount": int
"downVoteCount": int
"encryptionVersion": string // encryption version, like 'verus.v1'
"encryptionEpoch": int // epoch defines key bundle that was used for encryption
"encryptionEpk": string // ephemeral public key that should be used to decrypt cypher data
}
"isLastMessage": bool // true, if the last message in the channel
}
"error": { "status": bool, "code": int, "message": string }
}
On message deleted status updated event
Event: channel:onMessageDeletedStatusUpdated
Description: Event is triggered when message deleted status updated in a channel.
Data:
{
"data": {
"channelId": string // textchat channel id
"channelSource": string // channel source (belonging) string
"message": { // message model
"channelId": string
"bucketId": string
"messageId": string
"authorId": string
"networkId": string
"created": timestamp
"updated": timestamp
"messageType": int // 0 - my, 1 - user, 3 - system, 4 - system JSON, 6 - request JSON, 7 - endorsement JSON, 8 - activity JSON, 9 - card JSON, 100-199 - AI messages
"messageBody": string
"messageTitle": string
"isBlocked": bool
"isDeleted": bool
"attachments": [{
"resourceId": string
"fileName": string
"fileSize": int
"contentType": string
"durationFloat": float
"encryptionVersion": string // encryption version, like 'verus.v1'
"encryptionEpoch": int // epoch defines key bundle that was used for encryption
"encryptionEpk": string // ephemeral public key that should be used to decrypt cypher data
}]
"replyMessage": {
"channelId": string
"messageId": string
"authorId": string
"created": timestamp
"messageType": int
"messageBody": string
"attachments": [{
"resourceId": string
"fileName": string
"fileSize": int
"contentType": string
"durationFloat": float
"encryptionVersion": string // encryption version, like 'verus.v1'
"encryptionEpoch": int // epoch defines key bundle that was used for encryption
"encryptionEpk": string // ephemeral public key that should be used to decrypt cypher data
}]
"encryptionVersion": string // encryption version, like 'verus.v1'
"encryptionEpoch": int // epoch defines key bundle that was used for encryption
"encryptionEpk": string // ephemeral public key that should be used to decrypt cypher data
}
"forwardMessage": {
"channelId": string
"messageId": string
"authorId": string
"created": timestamp
"messageType": int
"messageBody": string
"attachments": [{
"resourceId": string
"fileName": string
"fileSize": int
"contentType": string
"durationFloat": float
"encryptionVersion": string // encryption version, like 'verus.v1'
"encryptionEpoch": int // epoch defines key bundle that was used for encryption
"encryptionEpk": string // ephemeral public key that should be used to decrypt cypher data
}]
"encryptionVersion": string // encryption version, like 'verus.v1'
"encryptionEpoch": int // epoch defines key bundle that was used for encryption
"encryptionEpk": string // ephemeral public key that should be used to decrypt cypher data
}
"subChannelPath": string
"subChannelTitles": [ string ]
"options": [ string ]
"reactions": {
"counters": [{ // counter per reaction, in descending order
"emoji": string
"count": int
}]
"userEmoji": string // user's emoji reaction to the message
}
"pollId": string
"userPoll": {
"poll": { // channel's poll
"id": string
"channelId": string // the channel the poll is in
"question": string // question/description of the poll
"isMultiSelect": bool // allow the users to select multiple choices
"isAnonymous": bool // can users see who voted for what
"created": timestamp // the time when poll was created
"closingTime": timestamp // users cannot vote after the closing time, defaults to one day
"options": [ string ] // list of options which the channel users vote for
"voteCounters": [ int ] // calculated number of votes per option respectively
}
"vote": { // user's vote in the poll'
"pollId": string
"userId": string
"options": [ string ] // list of options the user voted for
}
}
"threadChannelId": string
"threadMessageCount": int
"viewCount": int
"upVoteCount": int
"downVoteCount": int
"encryptionVersion": string // encryption version, like 'verus.v1'
"encryptionEpoch": int // epoch defines key bundle that was used for encryption
"encryptionEpk": string // ephemeral public key that should be used to decrypt cypher data
}
"isLastMessage": bool // true, if the last message in the channel
}
"error": { "status": bool, "code": int, "message": string }
}
On message read event
Event: channel:onMessageRead
Description: Event is triggered when a user requests a message that has been previously not read by him.
Data:
{
"data": {
"channelId": string // textchat channel id
"channelSource": string // channel source (belonging) string
"userId": string // participant user id
"lastReadTs": timestamp // participant last read message timestamp
}
"error": { "status": bool, "code": int, "message": string }
}
On unread count updated event
Event: channel:onUnreadCountUpdated
Description: Event is triggered when counter of unread channels for user is updated.
Data:
{
"data": {
"unreadChannelCount": int // amount of user channels with unread messages
"highAlertCount": int // amount of user channels on high alert with unread messages'
}
"error": { "status": bool, "code": int, "message": string }
}
On message reaction event
Event: channel:onMessageReaction
Description: Event is triggered when a new reaction is added to a message
Data:
{
"data": {
"channelId": string // textchat channel id
"channelSource": string // channel source (belonging) string
"messageId": string // message id
"userId": string // participant's' user id who reacted to the message
"reactions": { // updated reactions
"counters": [{ // counter per reaction, in descending order
"emoji": string
"count": int
}]
"userEmoji": string // user's emoji reaction to the message
}
}
"error": { "status": bool, "code": int, "message": string }
}
On poll vote event
Event: channel:onPollVote
Description: Event is triggered when someone votes in a channel poll.
Data:
{
"data": {
"channelId": string
"channelSource": string
"poll": {
"id": string
"channelId": string // the channel the poll is in
"question": string // question/description of the poll
"isMultiSelect": bool // allow the users to select multiple choices
"isAnonymous": bool // can users see who voted for what
"created": timestamp // the time when poll was created
"closingTime": timestamp // users cannot vote after the closing time, defaults to one day
"options": [ string ] // list of options which the channel users vote for
"voteCounters": [ int ] // calculated number of votes per option respectively
}
"userVote": { // optional, specified only if the poll is not anonymous
"userId": string
"option": [ string ]
"undo": bool
}
}
"error": { "status": bool, "code": int, "message": string }
}
On sub channel created event
Event: channel:onSubChannelCreated
Description: Event is triggered when sub channel is created within channel.
Data:
{
"data": {
"subChannel": {
"channelId": string
"subChannelId": string
"parentSubChannelPath": string
"parentSubChannelTitles": [ string ]
"created": timestamp
"title": string
"contentDirectoryId": string
"options": [ string ]
"lastMessageBucketId": string
"lastMessage": {
"messageId": string
"created": timestamp
"authorId": string
"authorName": string
"messageBody": string
"messageContentType": int // 0 - text, 1 - blocked, 2 - deleted, 3 - request JSON, 4 - endorsement JSON, 5 - activity JSON, 6 - card JSON, 7 - system JSON, 8 - poll, 9 - forward, 10 - file attachment, 11 - image, 12 - video, 13 - audio
"encryptionVersion": string // encryption version, like 'verus.v1'
"encryptionEpoch": int // epoch defines key bundle that was used for encryption
"encryptionEpk": string // ephemeral public key that should be used to decrypt cypher data
}
"messageCount": int
"subChannelCount": int
}
}
"error": { "status": bool, "code": int, "message": string }
}
On sub channel deleted event
Event: channel:onSubChannelDeleted
Description: Event is triggered when sub channel is deleted within channel.
Data:
{
"data": {
"channelId": string // textchat channel id
"subChannelId": string // subchannel id
}
"error": { "status": bool, "code": int, "message": string }
}
On sub channel updated event
Event: channel:onSubChannelUpdated
Description: Event is triggered when sub channel is updated within channel.
Data:
{
"data": {
"subChannel": {
"channelId": string
"subChannelId": string
"parentSubChannelPath": string
"parentSubChannelTitles": [ string ]
"created": timestamp
"title": string
"contentDirectoryId": string
"options": [ string ]
"lastMessageBucketId": string
"lastMessage": {
"messageId": string
"created": timestamp
"authorId": string
"authorName": string
"messageBody": string
"messageContentType": int // 0 - text, 1 - blocked, 2 - deleted, 3 - request JSON, 4 - endorsement JSON, 5 - activity JSON, 6 - card JSON, 7 - system JSON, 8 - poll, 9 - forward, 10 - file attachment, 11 - image, 12 - video, 13 - audio
"encryptionVersion": string // encryption version, like 'verus.v1'
"encryptionEpoch": int // epoch defines key bundle that was used for encryption
"encryptionEpk": string // ephemeral public key that should be used to decrypt cypher data
}
"messageCount": int
"subChannelCount": int
}
}
"error": { "status": bool, "code": int, "message": string }
}
On channel encryption epoch created event
Event: channel:onEpochCreated
DEPRECATED
Description: Event is triggered when new epoch is created within channel.
Data:
{
"data": {
"channelId": string // textchat channel id
"channelZAddress": string // channel zAddress for epoch
"epoch": int // channel epoch number
"created": timestamp // epoch creation time
"userId": string // participant user id
"userZAddress": string // participant zAddress for epoch
"vkEpk": string // ephemeral public key for viewing key decryption
"vkCypher": string // viewing key of channel epoch encrypted for participant
}
"error": { "status": bool, "code": int, "message": string }
}
On last epoch updated event
Event: channel:onLastEpochUpdated
Description: Event is triggered when epoch info is changed in channel model (requested or created new epoch).
Data:
{
"data": {
"channelId": string
"lastEpoch": int // last encryption epoch number for a channel
"needNewEpoch": bool // flag to point that channel encryption epoch should be changed on next message
}
"error": { "status": bool, "code": int, "message": string }
}
Models
Resource
{
"id": string
"created": timestamp
"updated": timestamp
"title": string
"description": string
"location": string
"date": string
"category": string
"linkId": string // id of resource link is pointing to
"linkType": string // global/local
"encryptionVersion": string // encryption version, like 'verus.v1'
"encryptionEpoch": int // epoch defines key bundle that was used for encryption
"encryptionEpk": string // ephemeral public key that should be used to decrypt cypher data
"belonging": string // determines resource location in the system in a way 'belongingType:belongingPath(networkId)'
"status": string // pending/processing/ready/failed
"metadata": {
"fileName": string
"fileSize": int
"fileDate": timestamp
"behaviourType": string
"contentType": string
"convertedFrom": string
"link": string
"origin": { resource origin structure }
"geolocation": { geolocation structure }
"dimensions": { dimensions structure }
}
"thumbnail": string
"fromTemplate": bool
"totalReactions": int // amount of users who reacted to the resource
"data": {
"audio": { resource data audio structure }
"video": { resource data video structure }
"amazon": { resource data amazon structure }
"imdb": { resource data imdb structure }
"youtube": { resource data youtube structure }
"pinterest": { resource data pinterest structure }
"pixabay": { resource data pixabay structure }
"facebook": { resource data facebook structure }
"remoteUrl": { resource data remote url structure }
"liveStream": { live stream data structure }
"aiGeneration": { ai generation data structure }
"thumbnailUrl": string
"downloadUrl": string
"directory": { resource data directory structure }
"channel": { channel data structure }
"googleDrive": { google drive structure }
}
"customParams": map[string]{ custom structure } // client defined parameters
"actions": [{ programmatic action with children structure }] // custom programmatic actions from users
}
Resource Origin
{
"type": string
"device": string
"deviceName": string
"path": string
}
Geolocation
{
"latitude": float
"longitude": float
}
Dimensions
{
"width": int
"height": int
"orientation": int
}
Resource Data Audio
{
"title": string
"artist": string
"album": string
"genre": string
"duration": int
"durationFloat": float
}
Resource Data Video
{
"duration": int
"durationFloat": float
"hasAlphaChannel": bool // true, if video generated from gif with transparent pixels
"alphaChannel": string // alpha channel video resource (if generated from gif)
}
Resource Data Amazon
{
"asin": string
"summary": string
"author": [ string ]
"manufacturer": string
"title": string
"publicationDate": string
"url": string
}
Resource Data Imdb
{
"Actors": string
"Genre": string
"Ratings": [{
"Source": string
"Value": string
}]
"Released": string
"Runtime": string
"Website": string
"Year": string
"Trailers": [ string ]
"imdbID": string
}
Resource Data Youtube
{
"videoId": string
"formatId": string
}
Resource Data Pinterest
{
"pin": string
"url": string
}
Resource Data Pixabay
{
"id": string
"pageUrl": string
}
Resource Data Facebook
{
"id": string
}
Resource Data Remote Url
{
"url": string
"urlType": string
"favicon": string
"title": string
}
Live Stream Data
{
"streamId": string
"assetId": string
"playbackUrl": string
"masterUrl": string
}
AI Generation Data
{
"generationModel": string // the model used for image generation [dall-e-3]
"prompt": string // a text description of the desired image
"revisedPrompt": string // the prompt that was used to generate the image, if there was any revision to the prompt
"url": string // the URL of the generated image
}
Resource Data Directory
{
"innerContentType": string
"innerContentCount": int
}
Channel Data
{
"communityId": string
"channelId": string
"subChannelId": string
"messageId": string
}
Google Drive
{
"fileId": string
"name": string
"mimeType": string
}
Programmatic Action with children
{
"localId": string // local action id, operated by client side only
"eventName": string
"actionName": string
"actionData": {
"usedPropId": string
"usedRoomId": string
"usedNetworkId": string
"usedStorylineId": string
"usedQuestionId": int
"usedQuestionnaireId": int
"usedSegmentId": string
"usedPlacementAreaId": string
"usedRoomPoint": string
"animationData": map[string]{ custom structure }
}
"childActions": [{ programmatic action structure }]
}
Programmatic Action
{
"localId": string // local action id, operated by client side only
"eventName": string
"actionName": string
"actionData": {
"usedPropId": string
"usedRoomId": string
"usedNetworkId": string
"usedStorylineId": string
"usedQuestionId": int
"usedQuestionnaireId": int
"usedSegmentId": string
"usedPlacementAreaId": string
"usedRoomPoint": string
"animationData": map[string]{ custom structure }
}
}