Skip to content
On this page

Room API ​

EndpointMethodDescription
explorer:searchRoomswebsocketSearch public rooms
explorer:roomswebsocketGet public rooms: deprecated
explorer:searchwebsocketSearch public rooms: deprecated
explorer:featuredRoomswebsocketGet featured rooms: deprecated
explorer:searchStorylineswebsocketSearch storylines
roomswebsocketGet user rooms
room:searchRoomsOfUserwebsocketSearch rooms of user
room:searchRoomsForCMSwebsocketSearch rooms of user for CMS
room:discoverRoomsByCbacwebsocketDiscover rooms by CBAC
room:getTemplateRoomswebsocketGet template rooms
room:getTemplateRoomwebsocketGet template room
room:getTemplateRoomForPreviewwebsocketGet template room for preview
room:listTemplateRoomswebsocketList template rooms
room:createRoomFromTemplatewebsocketCreate room from template
room:createwebsocketCreate room
room:copywebsocketCopy room
room:get_noAssetMeshwebsocketGet room: no asset mesh
room:get_cachedwebsocketGet room: cached: old
room:getRoomwebsocketGet room: cached
room:getMetadatawebsocketGet room metadata
room:getRoomBasicModelwebsocketGet room basic model
room:getRoomSettingswebsocketGet room settings
room:getRoomForAvatarSetupwebsocketGet room for avatar setup
room:permissionswebsocketGet room permissions
room:requestAccesswebsocketRequest room access
room:deletewebsocketDelete room
room:updatewebsocketUpdate room
room:updateMetadatawebsocketUpdate room metadata
room:setEnvironmentwebsocketSet room environment
room:setAllowEmbedwebsocketSet room allow embed
room:deleteThumbnailwebsocketDelete room thumbnail
room:setPreviewwebsocketSet room preview
room:deletePreviewwebsocketDelete room preview
room:setRoomBehaviourSettingswebsocketSet room behaviour settings
room:setAvatarsLocationSettingswebsocketSet avatars location settings
room:setBotSettingswebsocketSet bot settings
room:setAmbientMusicSettingswebsocketSet ambient music settings
room:setSocialCircleSettingswebsocketSet social circle settings
room:setEnvironmentSettingswebsocketSet environment settings
room:setCustomSettingswebsocketSet custom room settings
room:setAIBotSettingswebsocketSet room aI bot settings
room:getAIBotSettingswebsocketGet room aI bot settings
room:getLightDatawebsocketGet room light data
room:getTemplateLightDatawebsocketGet template room light data
room:setLightDatawebsocketSet room light data
room:deleteLightDatawebsocketDelete room light data
room:createAliaswebsocketCreate room alias
room:deleteAliaswebsocketDelete room alias
room:addStylewebsocketAdd room style
room:deleteStylewebsocketDelete room style
room:addPanelwebsocketAdd room panel
room:deletePanelwebsocketDelete room panel
room:addPropwebsocketAdd room prop
room:getPropwebsocketGet room prop
room:getPropWithResourcewebsocketGet room prop with resource
room:listPropswebsocketList room props
room:deleteProp_outOfBoundwebsocketDelete room prop: out of bound
room:deletePropwebsocketDelete room prop
room:restorePropwebsocketRestore room prop
room:updatePropwebsocketUpdate prop
room:setUserCustomParamsForPropwebsocketSet user custom params for prop
room:deleteUserCustomParamsForPropwebsocketDelete user custom params for prop
room:getUserCustomParamsForPropsInRoomwebsocketGet user custom params for props in room
room:getSortingTablewebsocketGet room sorting table content
room:getRoomContentwebsocketGet room content
room:visitorswebsocketGet visitors
room:sendUserLocationwebsocketSend user location
room:joinwebsocketJoin room
room:leavewebsocketLeave room
room:addCameraPositionwebsocketAdd camera position
room:updateCameraPositionwebsocketUpdate camera position
room:deleteCameraPositionwebsocketDelete camera position
room:getCameraPositionswebsocketGet camera positions
room:listUserPublicRoomsWithStaticSocialCircleswebsocketList user public rooms with static social circles
room:importwebsocketImport room
room:createStorylinewebsocketCreate storyline
room:updateStorylinewebsocketUpdate storyline
room:deleteStorylinewebsocketDelete storyline
room:createJourneyPathwebsocketCreate journey path
room:updateJourneyPathwebsocketUpdate journey path
room:deleteJourneyPathwebsocketDelete journey path
room:getJourneyPathswebsocketGet journey paths
room:addResourcesToSortingTablewebsocketEventOn resources added to room sorting table event
room:deleteResourcesFromSortingTablewebsocketEventOn resources deleted from room sorting table event
room:resourceUpdatedwebsocketEventOn room resource updated event
room:sortingTableResourceUpdatedwebsocketEventOn room sorting table resource updated event
room:subscriptionStatusUpdatedwebsocketEventOn room subscription status updated event
room:createdwebsocketEventOn room created event
room:deletewebsocketEventOn room deleted event
room:metadataUpdatedwebsocketEventOn room metadata updated event
room:settingsUpdatedwebsocketEventOn room settings updated event
room:environmentUpdatedwebsocketEventOn room environment updated event
room:storylineCreatedwebsocketEventOn storyline created event
room:storylineUpdatedwebsocketEventOn storyline updated event
room:storylineDeletedwebsocketEventOn storyline deleted event
room:cameraPositionAddedwebsocketEventOn camera position added event
room:cameraPositionUpdatedwebsocketEventOn camera position updated event
room:cameraPositionDeletedwebsocketEventOn camera position deleted event
room:journeyPathCreatedwebsocketEventHandle journey path created event
room:journeyPathUpdatedwebsocketEventHandle journey path updated event
room:journeyPathDeletedwebsocketEventHandle journey path deleted event
room:propAddedwebsocketEventOn room prop added event
room:propDeletedwebsocketEventOn room prop deleted event
room:propRestoredwebsocketEventOn room prop restored event
room:propUpdatedwebsocketEventOn room prop updated event
room:userConnectedToSocialCircleVideochatwebsocketEventUser connected to social circle videochat
room:userDisconnectedFromSocialCircleVideochatwebsocketEventUser disconnected from social circle videochat
room:videochatPresenterChangedwebsocketEventRoom videochat presenter changed event
room:videochatCoPresenterChangedwebsocketEventRoom videochat co presenter changed event
room:userJoinedwebsocketEventUser joined room event
room:userLeftwebsocketEventUser left room event
room:userLocationChangedwebsocketEventUser room location changed event
room:hasLightDatawebsocketEventRoom has light data event

Search public rooms ​

Method: websocket

Endpoint: explorer:searchRooms

Description: API returns public rooms (according to search query) from all users in network.

Request:

{
    "data": {
        "query": string
        "tags": [ string ]
        "offset": int
        "size": int
    }
    "event": { "id": string, "date": timestamp }
}

Response:

{
    "data": {
        "rooms": [{
            "id": string
            "name": string
            "tags": [ string ]
            "thumbnailId": string
            "subscriptionStatus": string
            "ownerIds": [ string ]
        }]
    }
    "error": { "status": bool, "code": int, "message": string }
}

Get public rooms: deprecated ​

Method: websocket

Endpoint: explorer:rooms

DEPRECATED

Description: API returns public rooms from all users in network. Rooms are sorted by popularity, most watched come first.

Request:

{
    "data": {
        "tags": [ string ]
        "offset": int
        "size": int
    }
    "event": { "id": string, "date": timestamp }
}

Response:

{
    "data": {
        "query": string
        "tags": [ string ]
        "offset": int
        "size": int
        "rooms": [{ room structure }]
    }
    "error": { "status": bool, "code": int, "message": string }
}

Search public rooms: deprecated ​

Method: websocket

Endpoint: explorer:search

DEPRECATED

Description: API returns public rooms (according to search query) from all users in network.

Request:

{
    "data": {
        "query": string
        "tags": [ string ]
        "offset": int
        "size": int
    }
    "event": { "id": string, "date": timestamp }
}

Response:

{
    "data": {
        "query": string
        "tags": [ string ]
        "offset": int
        "size": int
        "rooms": [{ room structure }]
    }
    "error": { "status": bool, "code": int, "message": string }
}

Method: websocket

Endpoint: explorer:featuredRooms

DEPRECATED

Description: API returns public rooms that were featured by admins.

Request:

{
    "data": {
        "tags": [ string ]
        "offset": int
        "size": int
    }
    "event": { "id": string, "date": timestamp }
}

Response:

{
    "data": {
        "query": string
        "tags": [ string ]
        "offset": int
        "size": int
        "rooms": [{ room structure }]
    }
    "error": { "status": bool, "code": int, "message": string }
}

Search storylines ​

Method: websocket

Endpoint: explorer:searchStorylines

Description: API returns public storylines from all users in network.

Request:

{
    "data": {
        "query": string
        "offset": int
        "size": int
    }
    "event": { "id": string, "date": timestamp }
}

Response:

{
    "data": {
        "query": string
        "tags": [ string ]
        "offset": int
        "size": int
        "storylines": [{
            "id": string
            "title": string
            "roomId": string
            "roomName": string
            "roomThumbnailId": string
            "owners": [ string ]
        }]
    }
    "error": { "status": bool, "code": int, "message": string }
}

Get user rooms ​

Method: websocket

Endpoint: rooms

DEPRECATED

Request:

{
    "data": {
        "networkId": string  // if provided, api searches for rooms in a specific network
        "userId": string  // if provided, api searches for available (public/invitation) rooms of other user
        "query": string  // search query
        "filter": string  // public/private/shared/favourite
        "offset": int
        "size": int
    }
    "event": { "id": string, "date": timestamp }
}

Response:

{
    "data": {
        "userId": string
        "rooms": [{ room structure }]
    }
    "error": { "status": bool, "code": int, "message": string }
}

Search rooms of user ​

Method: websocket

Endpoint: room:searchRoomsOfUser

Request:

{
    "data": {
        "networkId": string  // if provided, api searches for rooms in a specific network
        "userId": string  // if provided, api searches for available (public/invitation) rooms of other user
        "query": string  // search query
        "filter": string  // public/private/shared/favourite
        "offset": int
        "size": int
    }
    "event": { "id": string, "date": timestamp }
}

Response:

{
    "data": {
        "rooms": [{
            "id": string
            "name": string
            "tags": [ string ]
            "thumbnailId": string
            "subscriptionStatus": string
            "ownerIds": [ string ]
        }]
    }
    "error": { "status": bool, "code": int, "message": string }
}

Search rooms of user for CMS ​

Method: websocket

Endpoint: room:searchRoomsForCMS

Description: Same as room:searchRoomsOfUser, but additionally returns indexation state (filled by RAG) of each returned room's room:{roomId} belonging, keyed by roomId.

Request:

{
    "data": {
        "networkId": string  // if provided, api searches for rooms in a specific network
        "userId": string  // if provided, api searches for available (public/invitation) rooms of other user
        "query": string  // search query
        "filter": string  // public/private/shared/favourite
        "offset": int
        "size": int
    }
    "event": { "id": string, "date": timestamp }
}

Response:

{
    "data": {
        "rooms": [{
            "id": string
            "name": string
            "tags": [ string ]
            "thumbnailId": string
            "subscriptionStatus": string
            "ownerIds": [ string ]
        }]
        "indexStates": map[string]{  // maps roomId to indexation state of its room:{roomId} belonging
            "belongingKey": string
            "state": map[string]{ custom structure }
        }
    }
    "error": { "status": bool, "code": int, "message": string }
}

Discover rooms by CBAC ​

Method: websocket

Endpoint: room:discoverRoomsByCbac

Description: Returns rooms that the calling user can access via CBAC badge policies, regardless of room privacy — this is how badge holders discover private rooms unlockable by their badges, without needing an existing invitation. Lists the caller's badges, resolves them to CBAC room targets, and returns the matching rooms.

Request:

{
    "data": {
        "query": string
        "tags": [ string ]
        "offset": int
        "size": int
    }
    "event": { "id": string, "date": timestamp }
}

Response:

{
    "data": {
        "rooms": [{
            "id": string
            "name": string
            "tags": [ string ]
            "thumbnailId": string
            "subscriptionStatus": string
            "ownerIds": [ string ]
        }]
    }
    "error": { "status": bool, "code": int, "message": string }
}

Get template rooms ​

Method: websocket

Endpoint: room:getTemplateRooms

DEPRECATED

Description: API returns list of template rooms. User can create a new room based on template room.

Request:

{
    "data": {
        "style": string
        "query": string
        "tags": [ string ]
        "offset": int
        "size": int
    }
    "event": { "id": string, "date": timestamp }
}

Response:

{
    "data": {
        "rooms": [{ room structure }]
    }
    "error": { "status": bool, "code": int, "message": string }
}

Get template room ​

Method: websocket

Endpoint: room:getTemplateRoom

Description: API returns template room model by its id. User can create a new room based on template room.

Request:

{
    "data": {
        "roomId": string
    }
    "event": { "id": string, "date": timestamp }
}

Response:

{
    "data": {
        "template": {
            "id": string
            "name": string
            "tags": [ string ]
            "ownerIds": [ string ]
            "privacy": string  // private/public/openForAttendees
            "subscriptionStatus": string  // free/active/expired
            "price": float
            "templateStyles": [ string ]
        }
    }
    "error": { "status": bool, "code": int, "message": string }
}

Get template room for preview ​

Method: websocket

Endpoint: room:getTemplateRoomForPreview

Description: Api returns template room with content. User can create a new room based on template room.

Request:

{
    "data": {
        "roomId": string
    }
    "event": { "id": string, "date": timestamp }
}

Response:

{
    "data": {
        "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 ]
            "permissions": {
                "view": bool
                "comment": bool
                "contribute": bool
                "edit": bool
                "manage": bool
            }
            "settings": {
                "roomBehaviour": int
                "videochat": {
                    "videochatMode": string  // videochat/conference
                    "videochatType": string  // twilio only (peer-to-peer/group/group-small)
                    "videochatEngine": string  // twilio/agora/livekit
                    "videochatInitUser": string  // who can start the videochat (any/manager)
                    "excludeListeners": bool  // don't show non-promoted videochat users
                    "usePresentationBoard": bool  // use presentation board as share screen media
                    "enableStreaming": bool  // enable videochat streaming to non participants
                    "notificationMode": int  // notification mode for videochat events
                    "autoPromotion": {
                        "useCustomSettings": bool  // if false, videochat will use server default settings
                        "autoPromotionLimit": int  // limit of participants with automatic voice permissions
                        "autoDemoteOnLimit": bool  // demote participants that were automatically promoted
                    }
                    "limitSettings": {
                        "useCustomSettings": bool  // if false, videochat will use server default settings
                        "videochatLimit": int  // amount of identities allowed in videochat (0 means unlimited)
                    }
                }
                "avatarsLocation": {
                    "showAvatars": bool
                    "showMode": string
                }
                "bots": {
                    "botsCount": int
                }
                "ambientMusic": {
                    "resourceId": string
                    "volume": float
                }
                "socialCircle": {
                    "isSocialCircleAvailableForAll": bool
                }
                "environment": {
                    "environmentId": string
                    "resourceId": string
                    "isVideo": bool
                    "useFlatColor": bool
                    "rotation": int
                    "altitude": int
                    "scale": int
                    "posX": int
                    "posZ": int
                    "title": string
                }
                "params": map[string]{ custom structure }  // custom params set by client application
            }
            "userReactions": { user reactions structure }
        }
        "assets": map[string]{ asset bundle prop structure }
        "styles": map[string]{ asset bundle style structure }
        "environments": map[string]{ asset bundle environment structure }
        "propSkins": map[string]{ asset bundle skin structure }
    }
    "error": { "status": bool, "code": int, "message": string }
}

List template rooms ​

Method: websocket

Endpoint: room:listTemplateRooms

Description: API returns list of template rooms. User can create a new room based on template room.

Request:

{
    "data": {
        "style": string
        "query": string
        "tags": [ string ]
        "offset": int
        "size": int
    }
    "event": { "id": string, "date": timestamp }
}

Response:

{
    "data": {
        "templates": [{
            "id": string
            "name": string
            "tags": [ string ]
            "ownerIds": [ string ]
            "privacy": string  // private/public/openForAttendees
            "subscriptionStatus": string  // free/active/expired
            "price": float
            "templateStyles": [ string ]
        }]
    }
    "error": { "status": bool, "code": int, "message": string }
}

Create room from template ​

Method: websocket

Endpoint: room:createRoomFromTemplate

Request:

{
    "data": {
        "room": string  // template room id
        "roomName": string  // name of new room
        "subscriptionPlan": string  // free/one_time_payment/subscription_week/subscription_month/subscription_6_months/subscription_year
        "walletAddress": string  // wallet address (in case of crypto currency payment)
        "currency": string  // rents (default) / roomi (Roomful crypto currency) / Valu (ValuVerse crypto currency)
    }
    "event": { "id": string, "date": timestamp }
}

Response:

{
    "data": {
        "roomId": string
    }
    "error": { "status": bool, "code": int, "message": string }
}

Create room ​

Method: websocket

Endpoint: room:create

Request:

{
    "data": {
        "metadata": {
            "name": string
            "description": string
            "location": string
            "privacy": string  // private/public/openForAttendees
            "tags": [ string ]
            "firstStyle": string
        }
        "environmentId": string
        "content": [{ room style structure }]
        "subscriptionPlan": string  // free/one_time_payment/subscription_week/subscription_month/subscription_6_months/subscription_year
        "walletAddress": string  // wallet address (in case of crypto currency payment)
        "currency": string  // rents (default) / roomi (Roomful crypto currency) / Valu (ValuVerse crypto currency)
    }
    "event": { "id": string, "date": timestamp }
}

Response:

{
    "data": {
        "roomId": string
    }
    "error": { "status": bool, "code": int, "message": string }
}

Copy room ​

Method: websocket

Endpoint: room:copy

Description: Endpoint creates copy of room. Endpoint requires network manager permissions.

Request:

{
    "data": {
        "roomId": string
    }
    "event": { "id": string, "date": timestamp }
}

Response:

{
    "data": {
        "roomId": string
    }
    "error": { "status": bool, "code": int, "message": string }
}

Get room: no asset mesh ​

Method: websocket

Endpoint: room:get_noAssetMesh

DEPRECATED

Description: Api returns room with content. Doesn't return assetmesh.

Deprecated, use room:getRoom instead.

Request:

{
    "data": {
        "roomId": string
        "subscribe": bool
    }
    "event": { "id": string, "date": timestamp }
}

Response:

{
    "data": {
        "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 ]
            "permissions": {
                "view": bool
                "comment": bool
                "contribute": bool
                "edit": bool
                "manage": bool
            }
            "settings": {
                "roomBehaviour": int
                "videochat": {
                    "videochatMode": string  // videochat/conference
                    "videochatType": string  // twilio only (peer-to-peer/group/group-small)
                    "videochatEngine": string  // twilio/agora/livekit
                    "videochatInitUser": string  // who can start the videochat (any/manager)
                    "excludeListeners": bool  // don't show non-promoted videochat users
                    "usePresentationBoard": bool  // use presentation board as share screen media
                    "enableStreaming": bool  // enable videochat streaming to non participants
                    "notificationMode": int  // notification mode for videochat events
                    "autoPromotion": {
                        "useCustomSettings": bool  // if false, videochat will use server default settings
                        "autoPromotionLimit": int  // limit of participants with automatic voice permissions
                        "autoDemoteOnLimit": bool  // demote participants that were automatically promoted
                    }
                    "limitSettings": {
                        "useCustomSettings": bool  // if false, videochat will use server default settings
                        "videochatLimit": int  // amount of identities allowed in videochat (0 means unlimited)
                    }
                }
                "avatarsLocation": {
                    "showAvatars": bool
                    "showMode": string
                }
                "bots": {
                    "botsCount": int
                }
                "ambientMusic": {
                    "resourceId": string
                    "volume": float
                }
                "socialCircle": {
                    "isSocialCircleAvailableForAll": bool
                }
                "environment": {
                    "environmentId": string
                    "resourceId": string
                    "isVideo": bool
                    "useFlatColor": bool
                    "rotation": int
                    "altitude": int
                    "scale": int
                    "posX": int
                    "posZ": int
                    "title": string
                }
                "params": map[string]{ custom structure }  // custom params set by client application
            }
            "userReactions": { user reactions structure }
        }
        "assets": map[string]{ asset bundle prop structure }
        "styles": map[string]{ asset bundle style structure }
        "environments": map[string]{ asset bundle environment structure }
        "propSkins": map[string]{ asset bundle skin structure }
    }
    "error": { "status": bool, "code": int, "message": string }
}

Get room: cached: old ​

Method: websocket

Endpoint: room:get_cached

DEPRECATED

Description: ~~Api returns room with content. ~~ ~~* Api doesn't return assetmesh. ~~ ~~* Api returns "Room is private" (error code 803) in case if room user doesn't have permissions to view room. ~~ * Api returns "Subscription expired" (error code 2008) in case if room subscription is expired.

Deprecated, use room:getRoom instead.

Request:

{
    "data": {
        "roomId": string
        "subscribe": bool
    }
    "event": { "id": string, "date": timestamp }
}

Response:

{
    "data": {
        "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 ]
            "permissions": {
                "view": bool
                "comment": bool
                "contribute": bool
                "edit": bool
                "manage": bool
            }
            "settings": {
                "roomBehaviour": int
                "videochat": {
                    "videochatMode": string  // videochat/conference
                    "videochatType": string  // twilio only (peer-to-peer/group/group-small)
                    "videochatEngine": string  // twilio/agora/livekit
                    "videochatInitUser": string  // who can start the videochat (any/manager)
                    "excludeListeners": bool  // don't show non-promoted videochat users
                    "usePresentationBoard": bool  // use presentation board as share screen media
                    "enableStreaming": bool  // enable videochat streaming to non participants
                    "notificationMode": int  // notification mode for videochat events
                    "autoPromotion": {
                        "useCustomSettings": bool  // if false, videochat will use server default settings
                        "autoPromotionLimit": int  // limit of participants with automatic voice permissions
                        "autoDemoteOnLimit": bool  // demote participants that were automatically promoted
                    }
                    "limitSettings": {
                        "useCustomSettings": bool  // if false, videochat will use server default settings
                        "videochatLimit": int  // amount of identities allowed in videochat (0 means unlimited)
                    }
                }
                "avatarsLocation": {
                    "showAvatars": bool
                    "showMode": string
                }
                "bots": {
                    "botsCount": int
                }
                "ambientMusic": {
                    "resourceId": string
                    "volume": float
                }
                "socialCircle": {
                    "isSocialCircleAvailableForAll": bool
                }
                "environment": {
                    "environmentId": string
                    "resourceId": string
                    "isVideo": bool
                    "useFlatColor": bool
                    "rotation": int
                    "altitude": int
                    "scale": int
                    "posX": int
                    "posZ": int
                    "title": string
                }
                "params": map[string]{ custom structure }  // custom params set by client application
            }
            "userReactions": { user reactions structure }
        }
        "assets": map[string]{ asset bundle prop structure }
        "styles": map[string]{ asset bundle style structure }
        "environments": map[string]{ asset bundle environment structure }
        "propSkins": map[string]{ asset bundle skin structure }
    }
    "error": { "status": bool, "code": int, "message": string }
}

Get room: cached ​

Method: websocket

Endpoint: room:getRoom

Description: Api returns room with content.

  • Api doesn't return assetmesh.
  • Api returns only resources with visible viewpoint in the room.
  • Api returns "Room is private" (error code 803) in case if room user doesn't have permissions to view room.
  • Api returns "Subscription expired" (error code 2008) in case if room subscription is expired.

Request:

{
    "data": {
        "roomId": string
        "subscribe": bool
    }
    "event": { "id": string, "date": timestamp }
}

Response:

{
    "data": {
        "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 ]
            "permissions": {
                "view": bool
                "comment": bool
                "contribute": bool
                "edit": bool
                "manage": bool
            }
            "settings": {
                "roomBehaviour": int
                "videochat": {
                    "videochatMode": string  // videochat/conference
                    "videochatType": string  // twilio only (peer-to-peer/group/group-small)
                    "videochatEngine": string  // twilio/agora/livekit
                    "videochatInitUser": string  // who can start the videochat (any/manager)
                    "excludeListeners": bool  // don't show non-promoted videochat users
                    "usePresentationBoard": bool  // use presentation board as share screen media
                    "enableStreaming": bool  // enable videochat streaming to non participants
                    "notificationMode": int  // notification mode for videochat events
                    "autoPromotion": {
                        "useCustomSettings": bool  // if false, videochat will use server default settings
                        "autoPromotionLimit": int  // limit of participants with automatic voice permissions
                        "autoDemoteOnLimit": bool  // demote participants that were automatically promoted
                    }
                    "limitSettings": {
                        "useCustomSettings": bool  // if false, videochat will use server default settings
                        "videochatLimit": int  // amount of identities allowed in videochat (0 means unlimited)
                    }
                }
                "avatarsLocation": {
                    "showAvatars": bool
                    "showMode": string
                }
                "bots": {
                    "botsCount": int
                }
                "ambientMusic": {
                    "resourceId": string
                    "volume": float
                }
                "socialCircle": {
                    "isSocialCircleAvailableForAll": bool
                }
                "environment": {
                    "environmentId": string
                    "resourceId": string
                    "isVideo": bool
                    "useFlatColor": bool
                    "rotation": int
                    "altitude": int
                    "scale": int
                    "posX": int
                    "posZ": int
                    "title": string
                }
                "params": map[string]{ custom structure }  // custom params set by client application
            }
            "userReactions": { user reactions structure }
        }
        "assets": map[string]{ asset bundle prop structure }
        "styles": map[string]{ asset bundle style structure }
        "environments": map[string]{ asset bundle environment structure }
        "propSkins": map[string]{ asset bundle skin structure }
    }
    "error": { "status": bool, "code": int, "message": string }
}

Get room metadata ​

Method: websocket

Endpoint: room:getMetadata

DEPRECATED

Request:

{
    "data": {
        "roomId": string
        "subscribe": bool
    }
    "event": { "id": string, "date": timestamp }
}

Response:

{
    "data": {
        "room": { room structure }
    }
    "error": { "status": bool, "code": int, "message": string }
}

Get room basic model ​

Method: websocket

Endpoint: room:getRoomBasicModel

Request:

{
    "data": {
        "networkId": string
        "roomId": string
    }
    "event": { "id": string, "date": timestamp }
}

Response:

{
    "data": {
        "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 room settings ​

Method: websocket

Endpoint: room:getRoomSettings

Request:

{
    "data": {
        "networkId": string
        "roomId": string
    }
    "event": { "id": string, "date": timestamp }
}

Response:

{
    "data": {
        "roomId": string
        "settings": {
            "roomBehaviour": int
            "videochat": {
                "videochatMode": string  // videochat/conference
                "videochatType": string  // twilio only (peer-to-peer/group/group-small)
                "videochatEngine": string  // twilio/agora/livekit
                "videochatInitUser": string  // who can start the videochat (any/manager)
                "excludeListeners": bool  // don't show non-promoted videochat users
                "usePresentationBoard": bool  // use presentation board as share screen media
                "enableStreaming": bool  // enable videochat streaming to non participants
                "notificationMode": int  // notification mode for videochat events
                "autoPromotion": {
                    "useCustomSettings": bool  // if false, videochat will use server default settings
                    "autoPromotionLimit": int  // limit of participants with automatic voice permissions
                    "autoDemoteOnLimit": bool  // demote participants that were automatically promoted
                }
                "limitSettings": {
                    "useCustomSettings": bool  // if false, videochat will use server default settings
                    "videochatLimit": int  // amount of identities allowed in videochat (0 means unlimited)
                }
            }
            "avatarsLocation": {
                "showAvatars": bool
                "showMode": string
            }
            "bots": {
                "botsCount": int
            }
            "ambientMusic": {
                "resourceId": string
                "volume": float
            }
            "socialCircle": {
                "isSocialCircleAvailableForAll": bool
            }
            "environment": {
                "environmentId": string
                "resourceId": string
                "isVideo": bool
                "useFlatColor": bool
                "rotation": int
                "altitude": int
                "scale": int
                "posX": int
                "posZ": int
                "title": string
            }
            "params": map[string]{ custom structure }  // custom params set by client application
        }
    }
    "error": { "status": bool, "code": int, "message": string }
}

Get room for avatar setup ​

Method: websocket

Endpoint: room:getRoomForAvatarSetup

Request:

{ empty }

Response:

{
    "data": {
        "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 ]
            "permissions": {
                "view": bool
                "comment": bool
                "contribute": bool
                "edit": bool
                "manage": bool
            }
            "settings": {
                "roomBehaviour": int
                "videochat": {
                    "videochatMode": string  // videochat/conference
                    "videochatType": string  // twilio only (peer-to-peer/group/group-small)
                    "videochatEngine": string  // twilio/agora/livekit
                    "videochatInitUser": string  // who can start the videochat (any/manager)
                    "excludeListeners": bool  // don't show non-promoted videochat users
                    "usePresentationBoard": bool  // use presentation board as share screen media
                    "enableStreaming": bool  // enable videochat streaming to non participants
                    "notificationMode": int  // notification mode for videochat events
                    "autoPromotion": {
                        "useCustomSettings": bool  // if false, videochat will use server default settings
                        "autoPromotionLimit": int  // limit of participants with automatic voice permissions
                        "autoDemoteOnLimit": bool  // demote participants that were automatically promoted
                    }
                    "limitSettings": {
                        "useCustomSettings": bool  // if false, videochat will use server default settings
                        "videochatLimit": int  // amount of identities allowed in videochat (0 means unlimited)
                    }
                }
                "avatarsLocation": {
                    "showAvatars": bool
                    "showMode": string
                }
                "bots": {
                    "botsCount": int
                }
                "ambientMusic": {
                    "resourceId": string
                    "volume": float
                }
                "socialCircle": {
                    "isSocialCircleAvailableForAll": bool
                }
                "environment": {
                    "environmentId": string
                    "resourceId": string
                    "isVideo": bool
                    "useFlatColor": bool
                    "rotation": int
                    "altitude": int
                    "scale": int
                    "posX": int
                    "posZ": int
                    "title": string
                }
                "params": map[string]{ custom structure }  // custom params set by client application
            }
            "userReactions": { user reactions structure }
        }
        "assets": map[string]{ asset bundle prop structure }
        "styles": map[string]{ asset bundle style structure }
        "environments": map[string]{ asset bundle environment structure }
        "propSkins": map[string]{ asset bundle skin structure }
    }
    "error": { "status": bool, "code": int, "message": string }
}

Get room permissions ​

Method: websocket

Endpoint: room:permissions

Request:

{
    "data": {
        "roomId": string
    }
    "event": { "id": string, "date": timestamp }
}

Response:

{
    "data": {
        "permissions": {
            "view": bool
            "comment": bool
            "contribute": bool
            "edit": bool
            "manage": bool
        }
    }
    "error": { "status": bool, "code": int, "message": string }
}

Request room access ​

Method: websocket

Endpoint: room:requestAccess

Request:

{
    "data": {
        "roomId": string
    }
    "event": { "id": string, "date": timestamp }
}

Response:

{
    "error": { "status": bool, "code": int, "message": string }
}

Delete room ​

Method: websocket

Endpoint: room:delete

Request:

{
    "data": {
        "roomId": string
    }
    "event": { "id": string, "date": timestamp }
}

Response:

{
    "data": {
        "roomId": string
    }
    "error": { "status": bool, "code": int, "message": string }
}

Update room ​

Method: websocket

Endpoint: room:update

Description: Does the same as room:updateRoomMetadata but ignores current socket for event broadcasting.

Request:

{
    "data": {
        "roomId": string
        "updated": timestamp
        "metadata": {
            "name": string
            "description": string
            "location": string
            "privacy": string  // private/public/openForAttendees
            "tags": [ string ]
            "firstStyle": string
        }
        "thumbnail": string
    }
    "event": { "id": string, "date": timestamp }
}

Response:

{
    "data": {
        "room": { room structure }
    }
    "error": { "status": bool, "code": int, "message": string }
}

Update room metadata ​

Method: websocket

Endpoint: room:updateMetadata

Description: Api updates room metadata and thumbnail.

Request:

{
    "data": {
        "roomId": string
        "updated": timestamp
        "metadata": {
            "name": string
            "description": string
            "location": string
            "privacy": string  // private/public/openForAttendees
            "tags": [ string ]
            "firstStyle": string
        }
        "thumbnail": string
    }
    "event": { "id": string, "date": timestamp }
}

Response:

{
    "data": {
        "room": { room structure }
    }
    "error": { "status": bool, "code": int, "message": string }
}

Set room environment ​

Method: websocket

Endpoint: room:setEnvironment

Request:

{
    "data": {
        "roomId": string
        "assetId": string
    }
    "event": { "id": string, "date": timestamp }
}

Response:

{
    "data": {
        "roomId": string
        "environment": { asset bundle environment structure }
    }
    "error": { "status": bool, "code": int, "message": string }
}

Set room allow embed ​

Method: websocket

Endpoint: room:setAllowEmbed

Request:

{
    "data": {
        "roomId": string
        "allowEmbed": bool
    }
    "event": { "id": string, "date": timestamp }
}

Response:

{
    "error": { "status": bool, "code": int, "message": string }
}

Delete room thumbnail ​

Method: websocket

Endpoint: room:deleteThumbnail

Request:

{
    "data": {
        "roomId": string
        "updated": timestamp
        "metadata": {
            "name": string
            "description": string
            "location": string
            "privacy": string  // private/public/openForAttendees
            "tags": [ string ]
            "firstStyle": string
        }
        "thumbnail": string
    }
    "event": { "id": string, "date": timestamp }
}

Response:

{
    "data": {
        "room": { room structure }
    }
    "error": { "status": bool, "code": int, "message": string }
}

Set room preview ​

Method: websocket

Endpoint: room:setPreview

Request:

{
    "data": {
        "roomId": string
        "preview": string
        "updated": timestamp
    }
    "event": { "id": string, "date": timestamp }
}

Response:

{
    "error": { "status": bool, "code": int, "message": string }
}

Delete room preview ​

Method: websocket

Endpoint: room:deletePreview

Request:

{
    "data": {
        "roomId": string
        "preview": string
        "updated": timestamp
    }
    "event": { "id": string, "date": timestamp }
}

Response:

{
    "error": { "status": bool, "code": int, "message": string }
}

Set room behaviour settings ​

Method: websocket

Endpoint: room:setRoomBehaviourSettings

Description: Api sets room behaviour settings in room.

Request:

{
    "data": {
        "roomId": string
        "roomBehaviour": int
    }
    "event": { "id": string, "date": timestamp }
}

Response:

{
    "error": { "status": bool, "code": int, "message": string }
}

Set avatars location settings ​

Method: websocket

Endpoint: room:setAvatarsLocationSettings

Description: Api sets avatar location settings in room.

showMode could be on of the following:

  • Parking
  • TableConversation
  • AnyProps
  • Always

Request:

{
    "data": {
        "roomId": string
        "settings": {
            "showAvatars": bool
            "showMode": string
        }
    }
    "event": { "id": string, "date": timestamp }
}

Response:

{
    "error": { "status": bool, "code": int, "message": string }
}

Set bot settings ​

Method: websocket

Endpoint: room:setBotSettings

Description: Api sets bot settings in room.

Request:

{
    "data": {
        "roomId": string
        "settings": {
            "botsCount": int
        }
    }
    "event": { "id": string, "date": timestamp }
}

Response:

{
    "error": { "status": bool, "code": int, "message": string }
}

Set ambient music settings ​

Method: websocket

Endpoint: room:setAmbientMusicSettings

Description: Api sets ambient music settings in room.

Request:

{
    "data": {
        "roomId": string
        "settings": {
            "resourceId": string
            "volume": float
        }
    }
    "event": { "id": string, "date": timestamp }
}

Response:

{
    "error": { "status": bool, "code": int, "message": string }
}

Set social circle settings ​

Method: websocket

Endpoint: room:setSocialCircleSettings

Description: Api sets social circle settings in room.

Request:

{
    "data": {
        "roomId": string
        "settings": {
            "isSocialCircleAvailableForAll": bool
        }
    }
    "event": { "id": string, "date": timestamp }
}

Response:

{
    "error": { "status": bool, "code": int, "message": string }
}

Set environment settings ​

Method: websocket

Endpoint: room:setEnvironmentSettings

Description: Api sets environment settings in room.

Request:

{
    "data": {
        "roomId": string
        "settings": {
            "environmentId": string
            "resourceId": string
            "isVideo": bool
            "useFlatColor": bool
            "rotation": int
            "altitude": int
            "scale": int
            "posX": int
            "posZ": int
            "title": string
        }
    }
    "event": { "id": string, "date": timestamp }
}

Response:

{
    "error": { "status": bool, "code": int, "message": string }
}

Set custom room settings ​

Method: websocket

Endpoint: room:setCustomSettings

Description: Api sets custom settings in room. These settings are handled only by client application. Server stores them, but cannot work with them.

Request:

{
    "data": {
        "roomId": string
        "params": map[string]{ custom structure }
    }
    "event": { "id": string, "date": timestamp }
}

Response:

{
    "error": { "status": bool, "code": int, "message": string }
}

Set room aI bot settings ​

Method: websocket

Endpoint: room:setAIBotSettings

Description: Api sets AI bot settings for room.

Request:

{
    "data": {
        "roomId": string
        "aiBot": {
            "promptEngineering": string
        }
    }
    "event": { "id": string, "date": timestamp }
}

Response:

{
    "error": { "status": bool, "code": int, "message": string }
}

Get room aI bot settings ​

Method: websocket

Endpoint: room:getAIBotSettings

Description: Api gets room AI bot settings.

Request:

{
    "data": {
        "roomId": string
    }
    "event": { "id": string, "date": timestamp }
}

Response:

{
    "data": {
        "promptEngineering": string
    }
    "error": { "status": bool, "code": int, "message": string }
}

Get room light data ​

Method: websocket

Endpoint: room:getLightData

Description: API returns predefined light data in room. Light data is used to create beautiful, cinematic rooms.

Request:

{
    "data": {
        "roomId": string
        "platform": string  // WebGL/iOS/Android/StandaloneWindows64
    }
    "event": { "id": string, "date": timestamp }
}

Response:

{
    "data": {
        "roomId": string
        "platform": string  // WebGL/iOS/Android/StandaloneWindows64
        "lightData": {
            "roomId": string
            "platform": string  // WebGL/iOS/Android/StandaloneWindows64
            "lightmapsMode": int
            "rendererLightingData": [{
                "source": int  // 0 - None, 1 - Prop, 2 - Panel, 3 - Other
                "sourceId": string
                "rendererName": string
                "lightmapIndex": int
                "lightmapOffsetScale": { xyzw structure }
            }]
            "lightmapInfos": [{
                "resourceId": string
                "lightmapSize": int
            }]
            "lightmapDirInfos": [{
                "resourceId": string
                "lightmapSize": int
            }]
            "shadowmaskInfos": [{
                "resourceId": string
                "lightmapSize": int
            }]
        }
    }
    "error": { "status": bool, "code": int, "message": string }
}

Get template room light data ​

Method: websocket

Endpoint: room:getTemplateLightData

Request:

{
    "data": {
        "roomId": string
        "platform": string  // WebGL/iOS/Android/StandaloneWindows64
    }
    "event": { "id": string, "date": timestamp }
}

Response:

{
    "data": {
        "roomId": string
        "platform": string  // WebGL/iOS/Android/StandaloneWindows64
        "lightData": {
            "roomId": string
            "platform": string  // WebGL/iOS/Android/StandaloneWindows64
            "lightmapsMode": int
            "rendererLightingData": [{
                "source": int  // 0 - None, 1 - Prop, 2 - Panel, 3 - Other
                "sourceId": string
                "rendererName": string
                "lightmapIndex": int
                "lightmapOffsetScale": { xyzw structure }
            }]
            "lightmapInfos": [{
                "resourceId": string
                "lightmapSize": int
            }]
            "lightmapDirInfos": [{
                "resourceId": string
                "lightmapSize": int
            }]
            "shadowmaskInfos": [{
                "resourceId": string
                "lightmapSize": int
            }]
        }
    }
    "error": { "status": bool, "code": int, "message": string }
}

Set room light data ​

Method: websocket

Endpoint: room:setLightData

Request:

{
    "data": {
        "roomId": string
        "platform": string  // WebGL/iOS/Android/StandaloneWindows64
        "lightData": {
            "lightmapsMode": int
            "rendererLightingData": [{
                "source": int  // 0 - None, 1 - Prop, 2 - Panel, 3 - Other
                "sourceId": string
                "rendererName": string
                "lightmapIndex": int
                "lightmapOffsetScale": { xyzw structure }
            }]
            "lightmapInfos": [{
                "resourceId": string
                "lightmapSize": int
            }]
            "lightmapDirInfos": [{
                "resourceId": string
                "lightmapSize": int
            }]
            "shadowmaskInfos": [{
                "resourceId": string
                "lightmapSize": int
            }]
        }
    }
    "event": { "id": string, "date": timestamp }
}

Response:

{
    "error": { "status": bool, "code": int, "message": string }
}

Delete room light data ​

Method: websocket

Endpoint: room:deleteLightData

Request:

{
    "data": {
        "roomId": string
        "platform": string  // WebGL/iOS/Android/StandaloneWindows64
    }
    "event": { "id": string, "date": timestamp }
}

Response:

{
    "error": { "status": bool, "code": int, "message": string }
}

Create room alias ​

Method: websocket

Endpoint: room:createAlias

Description: API creates an alias for the room. The alias could be used for room retrieving instead of room id (e.g. for room:get).

If alias group is not provided:

  • Alias is unique across the system;

  • Room could be fetched by alias.

If alias group is provided:

  • Alias is unique within the group;

  • Combination of group and Alias is unique across the system;

  • Room could be fetched by combination of group and alias like "{group}/{alias}".

Request:

{
    "data": {
        "roomId": string
        "alias": string
        "group": string
        "domains": [ string ]
    }
    "event": { "id": string, "date": timestamp }
}

Response:

{
    "error": { "status": bool, "code": int, "message": string }
}

Delete room alias ​

Method: websocket

Endpoint: room:deleteAlias

Request:

{
    "data": {
        "roomId": string
    }
    "event": { "id": string, "date": timestamp }
}

Response:

{
    "error": { "status": bool, "code": int, "message": string }
}

Add room style ​

Method: websocket

Endpoint: room:addStyle

Request:

{
    "data": {
        "roomId": string
        "previousStyleId": string
        "style": {
            "id": string
            "created": timestamp
            "updated": timestamp
            "assetId": string
        }
    }
    "event": { "id": string, "date": timestamp }
}

Response:

{
    "data": {
        "roomId": string
        "styleId": string
    }
    "error": { "status": bool, "code": int, "message": string }
}

Delete room style ​

Method: websocket

Endpoint: room:deleteStyle

Request:

{
    "data": {
        "roomId": string
        "styleId": string
        "moveResourcesToRoomSortingTable": bool
    }
    "event": { "id": string, "date": timestamp }
}

Response:

{
    "data": {
        "roomId": string
        "styleId": string
        "moveResourcesToRoomSortingTable": bool
    }
    "error": { "status": bool, "code": int, "message": string }
}

Add room panel ​

Method: websocket

Endpoint: room:addPanel

Request:

{
    "data": {
        "roomId": string
        "styleId": string
        "previousPanelId": string
        "panel": {
            "id": string
            "created": timestamp
            "updated": timestamp
            "type": string
            "mobileGeometry": { geometry structure }
        }
    }
    "event": { "id": string, "date": timestamp }
}

Response:

{
    "data": {
        "roomId": string
        "styleId": string
        "panelId": string
    }
    "error": { "status": bool, "code": int, "message": string }
}

Delete room panel ​

Method: websocket

Endpoint: room:deletePanel

Request:

{
    "data": {
        "roomId": string
        "styleId": string
        "panelId": string
        "moveResourcesToRoomSortingTable": bool
    }
    "event": { "id": string, "date": timestamp }
}

Response:

{
    "data": {
        "roomId": string
        "styleId": string
        "panelId": string
        "moveResourcesToRoomSortingTable": bool
    }
    "error": { "status": bool, "code": int, "message": string }
}

Add room prop ​

Method: websocket

Endpoint: room:addProp

Description: Add room prop to room. If propTypes contains socialCircleDynamic, server checks if user has permission to edit target room or room has isSocialCircleAvailableForAll setting.

Request:

{
    "data": {
        "roomId": string
        "styleId": string
        "panelId": string
        "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
            "params": string  // DEPRECATED, remove after backwards compatibility is no longer required.
        }
    }
    "event": { "id": string, "date": timestamp }
}

Response:

{
    "data": {
        "roomId": string
        "propId": string
    }
    "error": { "status": bool, "code": int, "message": string }
}

Get room prop ​

Method: websocket

Endpoint: room:getProp

Request:

{
    "data": {
        "roomId": string
        "propId": string
        "subscribe": bool
    }
    "event": { "id": string, "date": timestamp }
}

Response:

{
    "data": {
        "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
            "permissions": {
                "view": bool
                "comment": bool
                "contribute": bool
                "edit": bool
                "manage": bool
            }
        }
        "assets": map[string]{ asset bundle prop structure }
    }
    "error": { "status": bool, "code": int, "message": string }
}

Get room prop with resource ​

Method: websocket

Endpoint: room:getPropWithResource

Request:

{
    "data": {
        "networkId": string
        "roomId": string
        "propId": string
    }
    "event": { "id": string, "date": timestamp }
}

Response:

{
    "data": {
        "prop": { room prop structure }
    }
    "error": { "status": bool, "code": int, "message": string }
}

List room props ​

Method: websocket

Endpoint: room:listProps

Request:

{
    "data": {
        "roomId": string
    }
    "event": { "id": string, "date": timestamp }
}

Response:

{
    "data": {
        "props": [{
            "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
            "assetAttributes": {
                "logoCount": int  // show amount of logos in content management system
                "thumbnailCount": int  // show amount of thumbnails in content management system
                "placing": string
                "invokeType": string
                "minScale": float
                "maxScale": float
                "canStack": bool
                "pedestalInZoomView": bool
                "alternativeZoom": bool
                "size": { xyz structure }
                "contentType": [ string ]  // supported content types for asset template
            }
        }]
    }
    "error": { "status": bool, "code": int, "message": string }
}

Delete room prop: out of bound ​

Method: websocket

Endpoint: room:deleteProp_outOfBound

Request:

{
    "data": {
        "roomId": string
        "propId": string
        "moveResourcesToRoomSortingTable": bool
    }
    "event": { "id": string, "date": timestamp }
}

Response:

{
    "data": {
        "roomId": string
        "propId": string
    }
    "error": { "status": bool, "code": int, "message": string }
}

Delete room prop ​

Method: websocket

Endpoint: room:deleteProp

Request:

{
    "data": {
        "roomId": string
        "propId": string
        "moveResourcesToRoomSortingTable": bool
    }
    "event": { "id": string, "date": timestamp }
}

Response:

{
    "data": {
        "roomId": string
        "propId": string
    }
    "error": { "status": bool, "code": int, "message": string }
}

Restore room prop ​

Method: websocket

Endpoint: room:restoreProp

Request:

{
    "data": {
        "roomId": string
        "propId": string
    }
    "event": { "id": string, "date": timestamp }
}

Response:

{
    "data": {
        "roomId": string
        "propId": string
    }
    "error": { "status": bool, "code": int, "message": string }
}

Update prop ​

Method: websocket

Endpoint: room:updateProp

Request:

{
    "data": {
        "roomId": string
        "styleId": string
        "panelId": string
        "prop": {
            "id": string
            "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
            "params": string  // DEPRECATED, remove after backwards compatibility is no longer required.
            "customParams": map[string]{ custom structure }
            "actions": [{ programmatic action with children structure }]
            "dataBound": {
                "isEnabled": bool
                "dataBoundAction": string
            }
            "assetId": string
            "assetSkins": map[string]string
        }
    }
    "event": { "id": string, "date": timestamp }
}

Response:

{
    "data": {
        "roomId": string
        "propId": string
    }
    "error": { "status": bool, "code": int, "message": string }
}

Set user custom params for prop ​

Method: websocket

Endpoint: room:setUserCustomParamsForProp

Request:

{
    "data": {
        "roomId": string
        "propId": string
        "customParams": map[string]{ custom structure }
    }
    "event": { "id": string, "date": timestamp }
}

Response:

{
    "error": { "status": bool, "code": int, "message": string }
}

Delete user custom params for prop ​

Method: websocket

Endpoint: room:deleteUserCustomParamsForProp

Request:

{
    "data": {
        "roomId": string
        "propId": string
    }
    "event": { "id": string, "date": timestamp }
}

Response:

{
    "error": { "status": bool, "code": int, "message": string }
}

Get user custom params for props in room ​

Method: websocket

Endpoint: room:getUserCustomParamsForPropsInRoom

Request:

{
    "data": {
        "userId": string
        "roomId": string
    }
    "event": { "id": string, "date": timestamp }
}

Response:

{
    "data": {
        "roomId": string
        "props": [{
            "propId": string
            "customParams": map[string]{ custom structure }
        }]
    }
    "error": { "status": bool, "code": int, "message": string }
}

Get room sorting table content ​

Method: websocket

Endpoint: room:getSortingTable

Description: API returns list of resources that user uploaded to room contribution.

Request:

{
    "data": {
        "offset": int
        "size": int
        "roomId": string
    }
    "event": { "id": string, "date": timestamp }
}

Response:

{
    "data": {
        "content": [{
            "resource": { resource structure }
            "userId": string
            "owner": { user simple structure }  // DEPRECATED
        }]
        "totalCount": int
    }
    "error": { "status": bool, "code": int, "message": string }
}

Get room content ​

Method: websocket

Endpoint: room:getRoomContent

Description: API returns list of resources from all around the room (props content + room contribution content).

Request:

{
    "data": {
        "offset": int
        "size": int
        "roomId": string
    }
    "event": { "id": string, "date": timestamp }
}

Response:

{
    "data": {
        "resources": [{ resource structure }]
    }
    "error": { "status": bool, "code": int, "message": string }
}

Get visitors ​

Method: websocket

Endpoint: room:visitors

Request:

{
    "data": {
        "room": string
    }
    "event": { "id": string, "date": timestamp }
}

Response:

{
    "data": {
        "visitors": [{
            "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
            "counter": int
            "roomPosition": {
                "roomId": string
                "propId": string
                "propTypes": [ string ]  // booth/fileCabinet/socialCircleDynamic
                "position": { xyz structure }
            }
        }]
    }
    "error": { "status": bool, "code": int, "message": string }
}

Send user location ​

Method: websocket

Endpoint: room:sendUserLocation

Request:

{
    "data": {
        "roomId": string
        "propId": string
        "propTypes": [ string ]  // booth/fileCabinet/socialCircleDynamic
        "position": { xyz structure }
    }
    "event": { "id": string, "date": timestamp }
}

Response:

{
    "error": { "status": bool, "code": int, "message": string }
}

Join room ​

Method: websocket

Endpoint: room:join

Description: API subscribes user socket to room channel, so it will receive room events.

Request:

{
    "data": {
        "room": string
    }
    "event": { "id": string, "date": timestamp }
}

Response:

{
    "data": {
        "permissions": {
            "view": bool
            "comment": bool
            "contribute": bool
            "edit": bool
            "manage": bool
        }
    }
    "error": { "status": bool, "code": int, "message": string }
}

Leave room ​

Method: websocket

Endpoint: room:leave

Description: API removes user socket subscription from room channel, so it will no longer receive room events.

Request:

{
    "data": {
        "room": string
    }
    "event": { "id": string, "date": timestamp }
}

Response:

{
    "error": { "status": bool, "code": int, "message": string }
}

Add camera position ​

Method: websocket

Endpoint: room:addCameraPosition

Request:

{
    "data": {
        "roomId": string
        "cameraPosition": { camera position structure }
    }
    "event": { "id": string, "date": timestamp }
}

Response:

{
    "data": {
        "roomId": string
        "cameraPosition": { camera position structure }
    }
    "error": { "status": bool, "code": int, "message": string }
}

Update camera position ​

Method: websocket

Endpoint: room:updateCameraPosition

Request:

{
    "data": {
        "roomId": string
        "cameraPosition": { camera position structure }
    }
    "event": { "id": string, "date": timestamp }
}

Response:

{
    "data": {
        "roomId": string
        "cameraPosition": { camera position structure }
    }
    "error": { "status": bool, "code": int, "message": string }
}

Delete camera position ​

Method: websocket

Endpoint: room:deleteCameraPosition

Request:

{
    "data": {
        "roomId": string
        "cameraPositionId": string
    }
    "event": { "id": string, "date": timestamp }
}

Response:

{
    "error": { "status": bool, "code": int, "message": string }
}

Get camera positions ​

Method: websocket

Endpoint: room:getCameraPositions

Request:

{
    "data": {
        "roomId": string
    }
    "event": { "id": string, "date": timestamp }
}

Response:

{
    "data": {
        "roomId": string
        "cameraPositions": [{ camera position structure }]
    }
    "error": { "status": bool, "code": int, "message": string }
}

List user public rooms with static social circles ​

Method: websocket

Endpoint: room:listUserPublicRoomsWithStaticSocialCircles

Request:

{ empty }

Response:

{
    "data": {
        "rooms": [{
            "roomId": string
            "roomTitle": string
            "circles": [{
                "propId": string
                "propTitle": string
            }]
        }]
    }
    "error": { "status": bool, "code": int, "message": string }
}

Import room ​

Method: websocket

Endpoint: room:import

Request:

{
    "data": {
        "srcRoomId": string  // source room id
        "dstRoomId": string  // destination room id
        "importSettings": bool
        "importProps": bool
        "importStorylines": bool
    }
    "event": { "id": string, "date": timestamp }
}

Response:

{
    "error": { "status": bool, "code": int, "message": string }
}

Create storyline ​

Method: websocket

Endpoint: room:createStoryline

Request:

{
    "data": {
        "room": string
        "storyline": string
        "title": string
        "published": bool
        "data": string
    }
    "event": { "id": string, "date": timestamp }
}

Response:

{
    "data": {
        "storyline": { storyline structure }
    }
    "error": { "status": bool, "code": int, "message": string }
}

Update storyline ​

Method: websocket

Endpoint: room:updateStoryline

Request:

{
    "data": {
        "room": string
        "storyline": string
        "title": string
        "published": bool
        "data": string
    }
    "event": { "id": string, "date": timestamp }
}

Response:

{
    "data": {
        "storyline": { storyline structure }
    }
    "error": { "status": bool, "code": int, "message": string }
}

Delete storyline ​

Method: websocket

Endpoint: room:deleteStoryline

Request:

{
    "data": {
        "room": string
        "storyline": string
        "title": string
        "published": bool
        "data": string
    }
    "event": { "id": string, "date": timestamp }
}

Response:

{
    "error": { "status": bool, "code": int, "message": string }
}

Create journey path ​

Method: websocket

Endpoint: room:createJourneyPath

Request:

{
    "data": {
        "roomId": string
        "journeyPath": {
            "id": string
            "created": timestamp
            "updated": timestamp
            "roomId": string
            "name": string
            "points": [{
                "name": string
                "propId": string
                "position": { xyz structure }
                "rotation": { xyz structure }
            }]
            "published": bool
            "looped": bool
            "color": { rgba structure }
        }
    }
    "event": { "id": string, "date": timestamp }
}

Response:

{
    "data": {
        "roomId": string
        "journeyPath": {
            "id": string
            "created": timestamp
            "updated": timestamp
            "roomId": string
            "name": string
            "points": [{
                "name": string
                "propId": string
                "position": { xyz structure }
                "rotation": { xyz structure }
            }]
            "published": bool
            "looped": bool
            "color": { rgba structure }
        }
    }
    "error": { "status": bool, "code": int, "message": string }
}

Update journey path ​

Method: websocket

Endpoint: room:updateJourneyPath

Request:

{
    "data": {
        "roomId": string
        "journeyPath": {
            "id": string
            "created": timestamp
            "updated": timestamp
            "roomId": string
            "name": string
            "points": [{
                "name": string
                "propId": string
                "position": { xyz structure }
                "rotation": { xyz structure }
            }]
            "published": bool
            "looped": bool
            "color": { rgba structure }
        }
    }
    "event": { "id": string, "date": timestamp }
}

Response:

{
    "data": {
        "roomId": string
        "journeyPath": {
            "id": string
            "created": timestamp
            "updated": timestamp
            "roomId": string
            "name": string
            "points": [{
                "name": string
                "propId": string
                "position": { xyz structure }
                "rotation": { xyz structure }
            }]
            "published": bool
            "looped": bool
            "color": { rgba structure }
        }
    }
    "error": { "status": bool, "code": int, "message": string }
}

Delete journey path ​

Method: websocket

Endpoint: room:deleteJourneyPath

Request:

{
    "data": {
        "roomId": string
        "journeyPathId": string
    }
    "event": { "id": string, "date": timestamp }
}

Response:

{
    "data": {
        "roomId": string
        "journeyPathId": string
    }
    "error": { "status": bool, "code": int, "message": string }
}

Get journey paths ​

Method: websocket

Endpoint: room:getJourneyPaths

Request:

{
    "data": {
        "roomId": string
    }
    "event": { "id": string, "date": timestamp }
}

Response:

{
    "data": {
        "roomId": string
        "journeyPaths": [{
            "id": string
            "created": timestamp
            "updated": timestamp
            "roomId": string
            "name": string
            "points": [{
                "name": string
                "propId": string
                "position": { xyz structure }
                "rotation": { xyz structure }
            }]
            "published": bool
            "looped": bool
            "color": { rgba structure }
        }]
    }
    "error": { "status": bool, "code": int, "message": string }
}

On resources added to room sorting table event ​

Event: room:addResourcesToSortingTable

DEPRECATED

Data:

{
    "data": {
        "resources": [{
            "resource": { resource structure }
            "userId": string
            "user": { user simple structure }  // DEPRECATED
        }]
        "room": string
    }
    "error": { "status": bool, "code": int, "message": string }
}

On resources deleted from room sorting table event ​

Event: room:deleteResourcesFromSortingTable

DEPRECATED

Data:

{
    "data": {
        "resources": [ string ]
        "room": string
    }
    "error": { "status": bool, "code": int, "message": string }
}

On room resource updated event ​

Event: room:resourceUpdated

DEPRECATED

Data:

{
    "data": {
        "prop": string
        "room": string
        "resource": { resource structure }
    }
    "error": { "status": bool, "code": int, "message": string }
}

On room sorting table resource updated event ​

Event: room:sortingTableResourceUpdated

DEPRECATED

Data:

{
    "data": {
        "room": string
        "resource": { resource structure }
    }
    "error": { "status": bool, "code": int, "message": string }
}

On room subscription status updated event ​

Event: room:subscriptionStatusUpdated

Data:

{
    "data": {
        "roomId": string
        "subscriptionStatus": string
    }
    "error": { "status": bool, "code": int, "message": string }
}

On room created event ​

Event: room:created

Description: Event is sent to room owners.

Data:

{
    "data": {
        "roomId": string
        "metadata": {
            "name": string
            "description": string
            "location": string
            "privacy": string  // private/public/openForAttendees
            "tags": [ string ]
            "firstStyle": string
        }
        "thumbnailId": string
    }
    "error": { "status": bool, "code": int, "message": string }
}

On room deleted event ​

Event: room:delete

Description: Event is sent to room owners, invited users and everyone who is currently in the room.

Data:

{
    "data": {
        "roomId": string
    }
    "error": { "status": bool, "code": int, "message": string }
}

On room metadata updated event ​

Event: room:metadataUpdated

Data:

{
    "data": {
        "roomId": string
        "metadata": {
            "name": string
            "description": string
            "location": string
            "privacy": string  // private/public/openForAttendees
            "tags": [ string ]
            "firstStyle": string
        }
        "thumbnailId": string
    }
    "error": { "status": bool, "code": int, "message": string }
}

On room settings updated event ​

Event: room:settingsUpdated

Description: In event data, updatedFields only contain fields that were updated during settings update.

Data:

{
    "data": {
        "roomId": string
        "updatedFields": map[string]{ custom structure }
    }
    "error": { "status": bool, "code": int, "message": string }
}

On room environment updated event ​

Event: room:environmentUpdated

Data:

{
    "data": {
        "roomId": string
        "environment": { asset bundle environment structure }
    }
    "error": { "status": bool, "code": int, "message": string }
}

On storyline created event ​

Event: room:storylineCreated

Data:

{
    "data": {
        "Storyline": { storyline structure }
    }
    "error": { "status": bool, "code": int, "message": string }
}

On storyline updated event ​

Event: room:storylineUpdated

Data:

{
    "data": {
        "Storyline": { storyline structure }
    }
    "error": { "status": bool, "code": int, "message": string }
}

On storyline deleted event ​

Event: room:storylineDeleted

Data:

{
    "data": {
        "roomId": string
        "storylineId": string
    }
    "error": { "status": bool, "code": int, "message": string }
}

On camera position added event ​

Event: room:cameraPositionAdded

Data:

{
    "data": {
        "roomId": string
        "cameraPosition": { camera position structure }
    }
    "error": { "status": bool, "code": int, "message": string }
}

On camera position updated event ​

Event: room:cameraPositionUpdated

Data:

{
    "data": {
        "roomId": string
        "cameraPosition": { camera position structure }
    }
    "error": { "status": bool, "code": int, "message": string }
}

On camera position deleted event ​

Event: room:cameraPositionDeleted

Data:

{
    "data": {
        "roomId": string
        "cameraPositionId": string
    }
    "error": { "status": bool, "code": int, "message": string }
}

Handle journey path created event ​

Event: room:journeyPathCreated

Data:

{
    "data": {
        "roomId": string
        "journeyPath": {
            "id": string
            "created": timestamp
            "updated": timestamp
            "roomId": string
            "name": string
            "points": [{
                "name": string
                "propId": string
                "position": { xyz structure }
                "rotation": { xyz structure }
            }]
            "published": bool
            "looped": bool
            "color": { rgba structure }
        }
    }
    "error": { "status": bool, "code": int, "message": string }
}

Handle journey path updated event ​

Event: room:journeyPathUpdated

Data:

{
    "data": {
        "roomId": string
        "journeyPath": {
            "id": string
            "created": timestamp
            "updated": timestamp
            "roomId": string
            "name": string
            "points": [{
                "name": string
                "propId": string
                "position": { xyz structure }
                "rotation": { xyz structure }
            }]
            "published": bool
            "looped": bool
            "color": { rgba structure }
        }
    }
    "error": { "status": bool, "code": int, "message": string }
}

Handle journey path deleted event ​

Event: room:journeyPathDeleted

Data:

{
    "data": {
        "roomId": string
        "journeyPathId": string
    }
    "error": { "status": bool, "code": int, "message": string }
}

On room prop added event ​

Event: room:propAdded

Data:

{
    "data": {
        "roomId": string
        "styleId": string
        "panelId": string
        "prop": { room prop structure }
        "assets": map[string]{ asset bundle prop structure }
        "propSkins": map[string]{ asset bundle skin structure }
    }
    "error": { "status": bool, "code": int, "message": string }
}

On room prop deleted event ​

Event: room:propDeleted

Data:

{
    "data": {
        "roomId": string
        "propId": string
    }
    "error": { "status": bool, "code": int, "message": string }
}

On room prop restored event ​

Event: room:propRestored

Data:

{
    "data": {
        "roomId": string
        "styleId": string
        "panelId": string
        "prop": { room prop structure }
        "assets": map[string]{ asset bundle prop structure }
        "propSkins": map[string]{ asset bundle skin structure }
    }
    "error": { "status": bool, "code": int, "message": string }
}

On room prop updated event ​

Event: room:propUpdated

Description: In event data, updatedFields only contain fields that were updated during prop update.

Data:

{
    "data": {
        "roomId": string
        "styleId": string
        "panelId": string
        "propId": string
        "updatedFields": map[string]{ custom structure }
    }
    "error": { "status": bool, "code": int, "message": string }
}

User connected to social circle videochat ​

Event: room:userConnectedToSocialCircleVideochat

Data:

{
    "data": {
        "user": { user simple structure }
        "seqNumber": int  // sequential number, unique for each user within videochat
        "videochatId": string
        "roomId": string
        "propId": string
    }
    "error": { "status": bool, "code": int, "message": string }
}

User disconnected from social circle videochat ​

Event: room:userDisconnectedFromSocialCircleVideochat

Data:

{
    "data": {
        "user": { user simple structure }
        "seqNumber": int  // sequential number, unique for each user within videochat
        "videochatId": string
        "roomId": string
        "propId": string
    }
    "error": { "status": bool, "code": int, "message": string }
}

Room videochat presenter changed event ​

Event: room:videochatPresenterChanged

Description: Event is sent when presenter is changed in videochat in room. If userId is empty - videochat has no presenter.

Data:

{
    "data": {
        "userId": string
        "videochatId": string
    }
    "error": { "status": bool, "code": int, "message": string }
}

Room videochat co presenter changed event ​

Event: room:videochatCoPresenterChanged

Description: Event is sent when co-presenter is changed in videochat in room. If userId is empty - videochat has no co-presenter.

Data:

{
    "data": {
        "userId": string
        "videochatId": string
    }
    "error": { "status": bool, "code": int, "message": string }
}

User joined room event ​

Event: room:userJoined

Data:

{
    "data": {
        "room": string
        "user": { user simple structure }
        "counter": int  // total users in room
    }
    "error": { "status": bool, "code": int, "message": string }
}

User left room event ​

Event: room:userLeft

Data:

{
    "data": {
        "room": string
        "user": { user simple structure }
        "counter": int  // total users in room
    }
    "error": { "status": bool, "code": int, "message": string }
}

User room location changed event ​

Event: room:userLocationChanged

Data:

{
    "data": {
        "userId": string
        "roomId": string
        "propId": string
        "propTypes": [ string ]  // booth/fileCabinet/socialCircleDynamic
        "position": { xyz structure }
    }
    "error": { "status": bool, "code": int, "message": string }
}

Room has light data event ​

Event: room:hasLightData

Data:

{
    "data": {
        "roomId": string
        "platforms": [ string ]
    }
    "error": { "status": bool, "code": int, "message": string }
}

Models ​


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
}

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
}

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
}

User Reactions ​

{
    "reactions": [ [ userId, reaction ] ]  // list of tuples [userId, reaction]
    "total": int  // total reactions for item
    "ownReaction": string  // current user own reaction
}

Asset Bundle Prop ​

{
    "id": string
    "created": timestamp
    "updated": timestamp
    "status": string  // workInProgress/published
    "ownership": string  // empty - public asset; network:{networkId} - belongs to network
    "hasVariants": bool  // asset has skin variants
    "title": string
    "tags": [ string ]
    "price": float  // price per month (when creating room with the asset)
    "score": int  // featuring score for ordering assets
    "displaySkins": bool  // display all skins in sorting table
    "params": map[string]{ custom structure }  // client defined custom data
    "editorParams": map[string]{ custom structure }  // editor defined custom data / not used in runtime
    "urls": map[string]string  // asset data urls per platform
    "thumbnail": { resource structure }
    "placing": string
    "invokeType": string
    "minScale": float
    "maxScale": float
    "canStack": bool
    "pedestalInZoomView": bool
    "alternativeZoom": bool
    "size": { xyz structure }
    "contentType": [ string ]  // supported content types for asset template
    "assetBundleMeta": {
        "logoCount": int  // show amount of logos in content management system
        "thumbnailCount": int  // show amount of thumbnails in content management system
    }
}

Asset Bundle Style ​

{
    "id": string
    "created": timestamp
    "updated": timestamp
    "status": string  // workInProgress/published
    "ownership": string  // empty - public asset; network:{networkId} - belongs to network
    "hasVariants": bool  // asset has skin variants
    "title": string
    "tags": [ string ]
    "price": float  // price per month (when creating room with the asset)
    "score": int  // featuring score for ordering assets
    "displaySkins": bool  // display all skins in sorting table
    "params": map[string]{ custom structure }  // client defined custom data
    "editorParams": map[string]{ custom structure }  // editor defined custom data / not used in runtime
    "urls": map[string]string  // asset data urls per platform
    "thumbnail": { resource structure }
    "styleType": string  // Default/NoMirror
    "doorsType": string  // Glass/None
    "homePosition": { xyz structure }  // home position for camera
}

Asset Bundle Environment ​

{
    "id": string
    "created": timestamp
    "updated": timestamp
    "status": string  // workInProgress/published
    "ownership": string  // empty - public asset; network:{networkId} - belongs to network
    "hasVariants": bool  // asset has skin variants
    "title": string
    "tags": [ string ]
    "price": float  // price per month (when creating room with the asset)
    "score": int  // featuring score for ordering assets
    "displaySkins": bool  // display all skins in sorting table
    "params": map[string]{ custom structure }  // client defined custom data
    "editorParams": map[string]{ custom structure }  // editor defined custom data / not used in runtime
    "urls": map[string]string  // asset data urls per platform
    "thumbnail": { resource structure }
}

Asset Bundle Skin ​

{
    "id": string
    "created": timestamp
    "updated": timestamp
    "assetId": string
    "variantId": string
    "name": string
    "isDefault": bool  // is default among other variant skins
    "overrideColor": { rgba structure }  // override default color
    "colorOnly": bool  // doesn't have textures, only color'
    "simplifiedSkin": bool  // applying the skins does not require prop hierarchy rebuild
    "sortOrder": int
    "isHidden": bool  // hides skin from client
    "thumbnail": { resource structure }
    "urls": map[string]string  // asset skin data urls per platform
    "defaultColor": { rgba structure }  // applied by parent variant model
}

RGBA ​

{
    "r": float
    "g": float
    "b": float
    "a": float
}