Skip to content
On this page

Room API

EndpointMethodDescription
roomswebsocketGet user rooms
room:searchRoomsOfUserwebsocketSearch rooms of user
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:addResourcesToSortingTableDirectorywebsocketEventOn resources added to directory in room sorting table event
room:deleteResourcesFromSortingTableDirectorywebsocketEventOn resources deleted from directory in 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: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

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
}