Invitations API
| Endpoint | Method | Description |
|---|---|---|
| social:inviteUsers | websocket | Invite users to room |
| social:deleteInvitation | websocket | Delete invitation |
| social:editInvitation | websocket | Edit invitation |
| social:acceptInvitation | websocket | Accept invitation |
| websocket | Archive invitation | |
| websocket | Unarchive invitation | |
| room:getRoomInvitations | websocket | Get room invitations |
| room:getUserRoomAccessInfo | websocket | Get user room access info |
| social:getUserInvitations | websocket | Get user invitations |
| websocket | Get archived user invitations | |
| social:requestThoughtsOfUsers | websocket | Request thoughts of users |
| social:onInvitationCreated | websocketEvent | On invitation created event |
| social:onInvitationEdited | websocketEvent | On invitation edited event |
| social:onInvitationDeleted | websocketEvent | On invitation deleted event |
| room:permissionsChanged | websocketEvent | On user room permissions changed event |
Invite users to room
Method: websocket
Endpoint: social:inviteUsers
Description: Invite multiple users to the room.
Function creates user request of "Invitation" type. See requests API for further steps.
Request:
{
"data": {
"roomId": string
"permissions": {
"view": bool
"comment": bool
"contribute": bool
"edit": bool
"manage": bool
}
"description": string
"inviteToVideochat": bool
"inviteSilently": bool // do not send invitation notification and email
"userIds": [ string ]
"facebookIds": [ string(fbAppId:fbUserId) ]
"emails": [ string ]
"phones": [ string ]
}
"event": { "id": string, "date": timestamp }
}
Response:
{
"error": { "status": bool, "code": int, "message": string }
}
Delete invitation
Method: websocket
Endpoint: social:deleteInvitation
Request:
{
"data": {
"invitation": string
"room": string
"invitedUser": string
}
"event": { "id": string, "date": timestamp }
}
Response:
{
"data": {
"invitation": string
}
"error": { "status": bool, "code": int, "message": string }
}
Edit invitation
Method: websocket
Endpoint: social:editInvitation
Description: Function creates user request of "Invitation" type, if owner permission granted. See requests API for further steps.
Request:
{
"data": {
"invitation": string
"room": string
"invitedUser": string
"permissions": {
"view": bool
"comment": bool
"contribute": bool
"edit": bool
"manage": bool
}
}
"event": { "id": string, "date": timestamp }
}
Response:
{
"error": { "status": bool, "code": int, "message": string }
}
Accept invitation
Method: websocket
Endpoint: social:acceptInvitation
Request:
{
"data": {
"invitation": string
"room": string
}
"event": { "id": string, "date": timestamp }
}
Response:
{
"error": { "status": bool, "code": int, "message": string }
}
Archive invitation
Method: websocket
Endpoint: social:archiveInvitation
DEPRECATED
Description: Endpoint is deprecated, not used and is going to be removed.
Request:
{
"data": {
"invitation": string
"room": string
}
"event": { "id": string, "date": timestamp }
}
Response:
{
"data": {
"invitation": string
}
"error": { "status": bool, "code": int, "message": string }
}
Unarchive invitation
Method: websocket
Endpoint: social:unarchiveInvitation
DEPRECATED
Description: Endpoint is deprecated, not used and is going to be removed.
Request:
{
"data": {
"invitation": string
"room": string
}
"event": { "id": string, "date": timestamp }
}
Response:
{
"data": {
"invitation": string
}
"error": { "status": bool, "code": int, "message": string }
}
Get room invitations
Method: websocket
Endpoint: room:getRoomInvitations
Request:
{
"data": {
"room": string
}
"event": { "id": string, "date": timestamp }
}
Response:
{
"data": {
"invitations": [{
"id": string
"created": timestamp
"updated": timestamp
"status": string
"description": string
"permissions": {
"view": bool
"comment": bool
"contribute": bool
"edit": bool
"manage": bool
}
"invitedById": string
"userId": string
"roomId": string
"roomPrivacy": string
}]
}
"error": { "status": bool, "code": int, "message": string }
}
Get user room access info
Method: websocket
Endpoint: room:getUserRoomAccessInfo
Description: Returns whether the target user has access to the room (via an explicit invitation, or implicitly, e.g. the room is public) along with that invitation, if one exists. The calling user must have view access to the room.
Request:
{
"data": {
"roomId": string
"userId": string
}
"event": { "id": string, "date": timestamp }
}
Response:
{
"data": {
"hasAccess": bool // whether the target user can view the room, via an invitation or otherwise (e.g. public room)
"permissions": { // the target user's permissions in the room, if they have access
"view": bool
"comment": bool
"contribute": bool
"edit": bool
"manage": bool
}
"invitation": { // present only if the target user has an explicit invitation
"id": string
"created": timestamp
"updated": timestamp
"status": string
"description": string
"permissions": {
"view": bool
"comment": bool
"contribute": bool
"edit": bool
"manage": bool
}
"invitedById": string
"userId": string
"roomId": string
"roomPrivacy": string
}
}
"error": { "status": bool, "code": int, "message": string }
}
Get user invitations
Method: websocket
Endpoint: social:getUserInvitations
Request:
{
"data": {
"query": string
"exclude": [ string ]
"offset": int
"size": int
}
"event": { "id": string, "date": timestamp }
}
Response:
{
"data": {
"invitations": [{
"invitation": {
"id": string
"created": timestamp
"updated": timestamp
"status": string
"description": string
"permissions": {
"view": bool
"comment": bool
"contribute": bool
"edit": bool
"manage": bool
}
"invitedById": string
"userId": string
"roomId": string
"roomPrivacy": string
}
"room": {
"id": string
"name": string
"tags": [ string ]
"ownerIds": [ string ]
"privacy": string // private/public/openForAttendees
"subscriptionStatus": string // free/active/expired
}
}]
}
"error": { "status": bool, "code": int, "message": string }
}
Get archived user invitations
Method: websocket
Endpoint: social:getArchivedInvitations
DEPRECATED
Description: Endpoint is deprecated, not used and is going to be removed.
Request:
{
"data": {
"query": string
"exclude": [ string ]
"offset": int
"size": int
}
"event": { "id": string, "date": timestamp }
}
Response:
{
"data": {
"invitations": [{ invitation info structure }]
}
"error": { "status": bool, "code": int, "message": string }
}
Request thoughts of users
Method: websocket
Endpoint: social:requestThoughtsOfUsers
Description: Function works the same way as user invitation. Additionally, function creates request though notification and email.
Request:
{
"data": {
"roomId": string
"permissions": {
"view": bool
"comment": bool
"contribute": bool
"edit": bool
"manage": bool
}
"description": string
"inviteToVideochat": bool
"inviteSilently": bool // do not send invitation notification and email
"userIds": [ string ]
"facebookIds": [ string(fbAppId:fbUserId) ]
"emails": [ string ]
"phones": [ string ]
"resourceId": string
}
"event": { "id": string, "date": timestamp }
}
Response:
{
"error": { "status": bool, "code": int, "message": string }
}
On invitation created event
Event: social:onInvitationCreated
Data:
{
"data": {
"invitation": {
"id": string
"created": timestamp
"updated": timestamp
"status": string
"description": string
"permissions": {
"view": bool
"comment": bool
"contribute": bool
"edit": bool
"manage": bool
}
"invitedById": string
"userId": string
"roomId": string
"roomPrivacy": string
}
}
"error": { "status": bool, "code": int, "message": string }
}
On invitation edited event
Event: social:onInvitationEdited
Data:
{
"data": {
"invitation": {
"id": string
"created": timestamp
"updated": timestamp
"status": string
"description": string
"permissions": {
"view": bool
"comment": bool
"contribute": bool
"edit": bool
"manage": bool
}
"invitedById": string
"userId": string
"roomId": string
"roomPrivacy": string
}
"oldInvitationStatus": string
}
"error": { "status": bool, "code": int, "message": string }
}
On invitation deleted event
Event: social:onInvitationDeleted
Data:
{
"data": {
"userId": string
"invitationId": string
"roomId": string
}
"error": { "status": bool, "code": int, "message": string }
}
On user room permissions changed event
Event: room:permissionsChanged
Data:
{
"data": {
"roomId": string
"permissions": {
"view": bool
"comment": bool
"contribute": bool
"edit": bool
"manage": bool
}
}
"error": { "status": bool, "code": int, "message": string }
}
Models
Invitation Info
{
"id": string
"created": timestamp
"updated": timestamp
"status": string
"description": string
"permissions": {
"view": bool
"comment": bool
"contribute": bool
"edit": bool
"manage": bool
}
"invitedById": string
"invitedUser": { user simple structure }
"invitedBy": { user simple structure }
"room": { room structure }
}
User Simple
{
"id": string
"firstName": string
"lastName": string
"privacyMode": int // 0 - Default, 1 - Incognito
"avatar": string
"avatar3D": { // field is not returned if empty
"assetId": string
"assetSkins": map[string]string // map of selected skins per variants
"avatarResourceId": string // resource id (in case of avatar uploaded to user3DAvatar belonging)
"avatarUrl": string // url to gbl file (Ready Player Me)
"avatarUserId": string // user id for session recovery (Ready Player Me)
}
"companyName": string // name of company that user represents
"companyTitle": string // user title in the company
}
Room
{
"id": string
"created": timestamp
"updated": timestamp
"explorerStatus": string // show/hide room in explorer
"subscriptionStatus": string // free/active/expired
"environmentId": string // id of environment asset
"price": float // price for room template
"allowEmbed": bool // allow embedding room to non valuverse web pages
"roomIdentity": string // verus identity of room
"metadata": {
"name": string
"description": string
"location": string
"privacy": string // private/public/openForAttendees
"tags": [ string ]
"firstStyle": string
}
"alias": string
"group": string
"domains": [ string ]
"thumbnail": { resource structure }
"preview": { resource structure }
"content": [{ room style structure }]
"owners": [{ user simple structure }]
"invitedUsers": [{ user simple structure }]
"stories": [{ storyline structure }]
"cameraPositions": [{ camera position structure }]
"hasJourneyPath": bool
"hasPlacementAreas": bool
"templateStyles": [ string ]
}
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
"userId": string // user id of resource author
"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 }
"vimeo": { resource data vimeo 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 }
"googleDrive": { google drive structure }
"channel": { channel data structure }
"enrichment": { enrichment data 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 Vimeo
{
"videoUrl": 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
"createdAt": int
}
AI Generation Data
{
"generationModel": string // the model used for image generation [gpt-image-2, gpt-image-1.5, gpt-image-1, gpt-image-1-mini]; defaults to gpt-image-2
"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
}
Google Drive
{
"fileId": string
"name": string
"mimeType": string
}
Channel Data
{
"communityId": string
"channelId": string
"subChannelId": string
"messageId": string
}
Enrichment Data
{
"categories": [ string ]
"enrichedAt": timestamp
"enrichmentStatus": string
"language": string
"qualityScore": int
"tags": [ 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 }
}
}
Room Style
{
"id": string
"created": timestamp
"updated": timestamp
"assetId": string
"panels": [{ room panel structure }]
}
Room Panel
{
"id": string
"created": timestamp
"updated": timestamp
"type": string
"mobileGeometry": { geometry structure }
"props": [{ room prop structure }]
}
Geometry
{
"scale": float
"size": { xyz structure }
"position": { xyz structure }
"rotation": { xyz structure }
}
XYZ
{
"x": float
"y": float
"z": float
}
Room Prop
{
"id": string
"created": timestamp
"updated": timestamp
"mobileGeometry": { geometry structure }
"title": string
"description": string
"tags": [ string ]
"propTypes": [ string ] // booth/fileCabinet/socialCircleStatic/socialCircleDynamic/entireRoomChat
"parentId": string // prop id of parent where current prop is standing
"actionType": string
"webLink": string
"webTitle": string
"isInteractive": bool // show prop when clicking next/previous in room prop list
"showType": int // 0 - None, 1 - GoldPanel, 2 - BoothPanel
"contentPickerType": int // 0 - Default, 1 - AudioContainer, 2 - VideoContainer
"contentSorting": {
"type": string // default/name/date/type/size
"direction": string // asc/desc
}
"contentAppend": string // default direction for content appending (start/end)
"isAllowTextchat": bool // if true - allow prop textchat
"allowUserParams": bool // if true - allow custom params per user
"customParams": map[string]{ custom structure } // client defined params
"actions": [{ programmatic action with children structure }] // custom programmatic actions from users
"dataBound": { // bound prop data to some action
"isEnabled": bool
"dataBoundAction": string
}
"assetId": string
"assetTitle": string
"assetSkins": map[string]string // map of selected skins per variants
"roomId": string
"roomTitle": string
"styleId": string
"panelId": string
"placementAreaId": string // in case if prop is a part of placement area
"contentSource": { // if present, current prop will fetch content from source prop
"roomId": string
"propId": string
}
"contentCount": int // amount of resources in prop
"content": [{ resource structure }] // prop resources
}
Storyline
{
"id": string
"created": timestamp
"updated": timestamp
"title": string
"data": string
"published": bool
"roomId": string
"propId": string
}
Camera Position
{
"id": string
"created": timestamp
"updated": timestamp
"position": { xyz structure }
"rotation": { xyzw structure }
"name": string
"cameraMode": int
}
XYZW
{
"x": float
"y": float
"z": float
"w": float
}