Room API
| Endpoint | Method | Description |
|---|---|---|
| websocket | Get user rooms | |
| room:searchRoomsOfUser | websocket | Search rooms of user |
| websocket | Get template rooms | |
| room:getTemplateRoom | websocket | Get template room |
| room:getTemplateRoomForPreview | websocket | Get template room for preview |
| room:listTemplateRooms | websocket | List template rooms |
| room:createRoomFromTemplate | websocket | Create room from template |
| room:create | websocket | Create room |
| room:copy | websocket | Copy room |
| websocket | Get room: no asset mesh | |
| websocket | Get room: cached: old | |
| room:getRoom | websocket | Get room: cached |
| websocket | Get room metadata | |
| room:getRoomBasicModel | websocket | Get room basic model |
| room:getRoomSettings | websocket | Get room settings |
| room:getRoomForAvatarSetup | websocket | Get room for avatar setup |
| room:permissions | websocket | Get room permissions |
| room:requestAccess | websocket | Request room access |
| room:delete | websocket | Delete room |
| room:update | websocket | Update room |
| room:updateMetadata | websocket | Update room metadata |
| room:setEnvironment | websocket | Set room environment |
| room:setAllowEmbed | websocket | Set room allow embed |
| room:deleteThumbnail | websocket | Delete room thumbnail |
| room:setPreview | websocket | Set room preview |
| room:deletePreview | websocket | Delete room preview |
| room:setRoomBehaviourSettings | websocket | Set room behaviour settings |
| room:setAvatarsLocationSettings | websocket | Set avatars location settings |
| room:setBotSettings | websocket | Set bot settings |
| room:setAmbientMusicSettings | websocket | Set ambient music settings |
| room:setSocialCircleSettings | websocket | Set social circle settings |
| room:setEnvironmentSettings | websocket | Set environment settings |
| room:setCustomSettings | websocket | Set custom room settings |
| room:setAIBotSettings | websocket | Set room aI bot settings |
| room:getAIBotSettings | websocket | Get room aI bot settings |
| room:getLightData | websocket | Get room light data |
| room:getTemplateLightData | websocket | Get template room light data |
| room:setLightData | websocket | Set room light data |
| room:deleteLightData | websocket | Delete room light data |
| room:createAlias | websocket | Create room alias |
| room:deleteAlias | websocket | Delete room alias |
| room:addStyle | websocket | Add room style |
| room:deleteStyle | websocket | Delete room style |
| room:addPanel | websocket | Add room panel |
| room:deletePanel | websocket | Delete room panel |
| room:addProp | websocket | Add room prop |
| room:getProp | websocket | Get room prop |
| room:getPropWithResource | websocket | Get room prop with resource |
| room:listProps | websocket | List room props |
| room:deleteProp_outOfBound | websocket | Delete room prop: out of bound |
| room:deleteProp | websocket | Delete room prop |
| room:restoreProp | websocket | Restore room prop |
| room:updateProp | websocket | Update prop |
| room:setUserCustomParamsForProp | websocket | Set user custom params for prop |
| room:deleteUserCustomParamsForProp | websocket | Delete user custom params for prop |
| room:getUserCustomParamsForPropsInRoom | websocket | Get user custom params for props in room |
| room:getSortingTable | websocket | Get room sorting table content |
| room:getRoomContent | websocket | Get room content |
| room:visitors | websocket | Get visitors |
| room:sendUserLocation | websocket | Send user location |
| room:join | websocket | Join room |
| room:leave | websocket | Leave room |
| room:addCameraPosition | websocket | Add camera position |
| room:updateCameraPosition | websocket | Update camera position |
| room:deleteCameraPosition | websocket | Delete camera position |
| room:getCameraPositions | websocket | Get camera positions |
| room:listUserPublicRoomsWithStaticSocialCircles | websocket | List user public rooms with static social circles |
| room:import | websocket | Import room |
| room:createStoryline | websocket | Create storyline |
| room:updateStoryline | websocket | Update storyline |
| room:deleteStoryline | websocket | Delete storyline |
| room:createJourneyPath | websocket | Create journey path |
| room:updateJourneyPath | websocket | Update journey path |
| room:deleteJourneyPath | websocket | Delete journey path |
| room:getJourneyPaths | websocket | Get journey paths |
| room:addResourcesToSortingTable | websocketEvent | On resources added to room sorting table event |
| room:deleteResourcesFromSortingTable | websocketEvent | On resources deleted from room sorting table event |
| room:addResourcesToSortingTableDirectory | websocketEvent | On resources added to directory in room sorting table event |
| room:deleteResourcesFromSortingTableDirectory | websocketEvent | On resources deleted from directory in room sorting table event |
| room:resourceUpdated | websocketEvent | On room resource updated event |
| room:sortingTableResourceUpdated | websocketEvent | On room sorting table resource updated event |
| room:subscriptionStatusUpdated | websocketEvent | On room subscription status updated event |
| room:delete | websocketEvent | On room deleted event |
| room:metadataUpdated | websocketEvent | On room metadata updated event |
| room:settingsUpdated | websocketEvent | On room settings updated event |
| room:environmentUpdated | websocketEvent | On room environment updated event |
| room:storylineCreated | websocketEvent | On storyline created event |
| room:storylineUpdated | websocketEvent | On storyline updated event |
| room:storylineDeleted | websocketEvent | On storyline deleted event |
| room:cameraPositionAdded | websocketEvent | On camera position added event |
| room:cameraPositionUpdated | websocketEvent | On camera position updated event |
| room:cameraPositionDeleted | websocketEvent | On camera position deleted event |
| room:journeyPathCreated | websocketEvent | Handle journey path created event |
| room:journeyPathUpdated | websocketEvent | Handle journey path updated event |
| room:journeyPathDeleted | websocketEvent | Handle journey path deleted event |
| room:propAdded | websocketEvent | On room prop added event |
| room:propDeleted | websocketEvent | On room prop deleted event |
| room:propRestored | websocketEvent | On room prop restored event |
| room:propUpdated | websocketEvent | On room prop updated event |
| room:userConnectedToSocialCircleVideochat | websocketEvent | User connected to social circle videochat |
| room:userDisconnectedFromSocialCircleVideochat | websocketEvent | User disconnected from social circle videochat |
| room:videochatPresenterChanged | websocketEvent | Room videochat presenter changed event |
| room:videochatCoPresenterChanged | websocketEvent | Room videochat co presenter changed event |
| room:userJoined | websocketEvent | User joined room event |
| room:userLeft | websocketEvent | User left room event |
| room:userLocationChanged | websocketEvent | User room location changed event |
| room:hasLightData | websocketEvent | Room has light data event |
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 }
}
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 ]
"subscriptionStatus": string
"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 ]
"subscriptionStatus": string
"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 ]
"subscriptionStatus": string
}
}
"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
"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
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
Data:
{
"data": {
"resources": [ string ]
"room": string
}
"error": { "status": bool, "code": int, "message": string }
}
On resources added to directory in room sorting table event
Event: room:addResourcesToSortingTableDirectory
Data:
{
"data": {
"roomId": string
"directoryId": string
"resources": [{ resource structure }]
}
"error": { "status": bool, "code": int, "message": string }
}
On resources deleted from directory in room sorting table event
Event: room:deleteResourcesFromSortingTableDirectory
Data:
{
"data": {
"roomId": string
"directoryId": string
"resourceIds": [ string ]
}
"error": { "status": bool, "code": int, "message": string }
}
On room resource updated event
Event: room:resourceUpdated
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
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 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": {
"room": { room structure }
}
"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
"belonging": string // determines resource location in the system in a way 'belongingType:belongingPath(networkId)'
"status": string // pending/processing/ready/failed
"metadata": {
"fileName": string
"fileSize": int
"fileDate": timestamp
"behaviourType": string
"contentType": string
"convertedFrom": string
"link": string
"origin": { resource origin structure }
"geolocation": { geolocation structure }
"dimensions": { dimensions structure }
}
"thumbnail": string
"fromTemplate": bool
"totalReactions": int // amount of users who reacted to the resource
"data": {
"audio": { resource data audio structure }
"video": { resource data video structure }
"amazon": { resource data amazon structure }
"imdb": { resource data imdb structure }
"youtube": { resource data youtube structure }
"pinterest": { resource data pinterest structure }
"pixabay": { resource data pixabay structure }
"facebook": { resource data facebook structure }
"remoteUrl": { resource data remote url structure }
"liveStream": { live stream data structure }
"aiGeneration": { ai generation data structure }
"thumbnailUrl": string
"downloadUrl": string
"directory": { resource data directory structure }
"channel": { channel data structure }
"googleDrive": { google drive structure }
}
"customParams": map[string]{ custom structure } // client defined parameters
"actions": [{ programmatic action with children structure }] // custom programmatic actions from users
}
Resource Origin
{
"type": string
"device": string
"deviceName": string
"path": string
}
Geolocation
{
"latitude": float
"longitude": float
}
Dimensions
{
"width": int
"height": int
"orientation": int
}
Resource Data Audio
{
"title": string
"artist": string
"album": string
"genre": string
"duration": int
"durationFloat": float
}
Resource Data Video
{
"duration": int
"durationFloat": float
"hasAlphaChannel": bool // true, if video generated from gif with transparent pixels
"alphaChannel": string // alpha channel video resource (if generated from gif)
}
Resource Data Amazon
{
"asin": string
"summary": string
"author": [ string ]
"manufacturer": string
"title": string
"publicationDate": string
"url": string
}
Resource Data Imdb
{
"Actors": string
"Genre": string
"Ratings": [{
"Source": string
"Value": string
}]
"Released": string
"Runtime": string
"Website": string
"Year": string
"Trailers": [ string ]
"imdbID": string
}
Resource Data Youtube
{
"videoId": string
"formatId": string
}
Resource Data Pinterest
{
"pin": string
"url": string
}
Resource Data Pixabay
{
"id": string
"pageUrl": string
}
Resource Data Facebook
{
"id": string
}
Resource Data Remote Url
{
"url": string
"urlType": string
"favicon": string
"title": string
}
Live Stream Data
{
"streamId": string
"assetId": string
"playbackUrl": string
"masterUrl": string
}
AI Generation Data
{
"generationModel": string // the model used for image generation [dall-e-3]
"prompt": string // a text description of the desired image
"revisedPrompt": string // the prompt that was used to generate the image, if there was any revision to the prompt
"url": string // the URL of the generated image
}
Resource Data Directory
{
"innerContentType": string
"innerContentCount": int
}
Channel Data
{
"communityId": string
"channelId": string
"subChannelId": string
"messageId": string
}
Google Drive
{
"fileId": string
"name": string
"mimeType": string
}
Programmatic Action with children
{
"localId": string // local action id, operated by client side only
"eventName": string
"actionName": string
"actionData": {
"usedPropId": string
"usedRoomId": string
"usedNetworkId": string
"usedStorylineId": string
"usedQuestionId": int
"usedQuestionnaireId": int
"usedSegmentId": string
"usedPlacementAreaId": string
"usedRoomPoint": string
"animationData": map[string]{ custom structure }
}
"childActions": [{ programmatic action structure }]
}
Programmatic Action
{
"localId": string // local action id, operated by client side only
"eventName": string
"actionName": string
"actionData": {
"usedPropId": string
"usedRoomId": string
"usedNetworkId": string
"usedStorylineId": string
"usedQuestionId": int
"usedQuestionnaireId": int
"usedSegmentId": string
"usedPlacementAreaId": string
"usedRoomPoint": string
"animationData": map[string]{ custom structure }
}
}
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
"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
}