URL Format and parameters

June 30, 2026 · View on GitHub

There are two formats for Element Call URLs.

Requires Element Call to be deployed in standalone mode.

https://element_call.domain/room/#
/<room_name_alias>?roomId=!id:domain&password=1234&<other params see below>

The URL is split into two sections. The https://element_call.domain/room/# contains the app and the intent that the link brings you into a specific room (https://call.element.io/# would be the homepage). The fragment is used for query parameters to make sure they never get sent to the element_call.domain server. Here we have the actual Matrix room ID and the password which are used to connect all participants with E2EE. This allows that <room_name_alias> does not need to be unique. Multiple meetings with the label weekly-sync can be created without collisions.

Additionally the following deprecated format is supported:

https://element_call.domain/<room_name>

With this format the livekit alias that will be used is the <room_name>. All people connecting to this URL will end up in the same unencrypted room. This does not scale, is super unsecure (people could end up in the same room by accident) and it also is not really possible to support encryption.

Widget within a messenger app

PackageDeploymentURL
FullAllhttps://element_call.domain/room
EmbeddedRemote URLhttps://element_call.domain/ n.b. no /room part
EmbeddedEmbedded within messenger appPlatform dependent, but you load the index.html file without a /room part

Parameters

Common Parameters

These parameters are relevant to both widget and standalone modes:

NameValuesRequired for widgetRequired for SPADescription
intentstart_call, join_existing, start_call_voice, join_existing_voice, start_call_dm, join_existing_dm, start_call_dm_voice, or join_existing_dm_voice.No, defaults to start_callNo, defaults to start_callThe intent is a special url parameter that defines the defaults for all the other parameters. In most cases it should be enough to only set the intent to setup element-call.
allowIceFallbacktrue or falseNo, defaults to falseNo, defaults to falseAllows use of fallback STUN servers for ICE if the user's homeserver doesn’t provide any.
posthogUserIdPosthog analytics IDNoNoAvailable only with user's consent for sharing telemetry in Element Web.
confineToRoomtrue or falseNo, defaults to falseNo, defaults to falseKeeps the user confined to the current call/room.
displayNameNoNoDisplay name used for auto-registration.
enableE2EE (deprecated)true or falseNo, defaults to trueNo, defaults to trueLegacy flag to enable end-to-end encryption, not used in the livekit branch.
fontScaleA decimal number such as 0.9No, defaults to 1.0No, defaults to 1.0Factor by which to scale the interface's font size.
fontsNoNoDefines the font(s) used by the interface. Multiple font parameters can be specified: ?font=font-one&font=font-two....
headernone, standard or app_barNo, defaults to standardNo, defaults to standardThe style of headers to show. standard is the default arrangement, none hides the header entirely, and app_bar produces a header with a back button like you might see in mobile apps. The callback for the back button is window.controls.onBackButtonPressed.
hideScreensharingtrue or falseNo, defaults to falseNo, defaults to falseHides the screen-sharing button.
homeserverNot applicableNoHomeserver for registering a new (guest) user, configures non-default guest user server when creating a spa link.
langBCP 47 codeNoNoThe language the app should use.
passwordNoNoE2EE password when using a shared secret. (For individual sender keys in embedded mode this is not required.)
perParticipantE2EEtrue or falseNo, defaults to falseNo, defaults to falseEnables per participant encryption with Keys exchanged over encrypted matrix room messages.
controlledAudioDevicestrue or falseNo, defaults to falseNo, defaults to falseWhether the global JS controls for audio devices should be enabled, allowing the list of audio devices to be controlled by the app hosting Element Call.
roomIdMatrix Room IDYesNoAnything about what room we're pointed to should be from useRoomIdentifier which parses the path and resolves alias with respect to the default server name, however roomId is an exception as we need the room ID in embedded widget mode, and not the room alias (or even the via params because we are not trying to join it). This is also not validated, where it is in useRoomIdentifier().
showControlstrue or falseNo, defaults to trueNo, defaults to trueDisplays controls like mute, screen-share, invite, and hangup buttons during a call.
skipLobby (deprecated: use intent instead)true or falseNo. If intent is explicitly start_call then defaults to true. Otherwise defaults to falseNo, defaults to falseSkips the lobby to join a call directly, can be combined with preload in widget. When true the audio and video inputs will be muted by default. (This means there currently is no way to start without muted video if one wants to skip the lobby. Also not in widget mode.)
themeOne of: light, dark, light-high-contrast, dark-high-contrastNo, defaults to darkNo, defaults to darkUI theme to use.
backgroundOne of: solid, gradientNo, defaults to gradientNo, defaults to gradientVisual style of the page background.
viaServersComma separated list of Matrix Server NamesNot applicableNoHomeserver for joining a room, non-empty value required for rooms not on the user’s default homeserver.
sendNotificationTypering or notificationNoNoWill send a "ring" or "notification" m.rtc.notification event if the user is the first one in the call.
autoLeavetrue or falseNo, defaults to falseNo, defaults to falseWhether the app should automatically leave the call when there is no one left in the call.
waitForCallPickuptrue or falseNo, defaults to falseNo, defaults to falseWhen sending a notification, show UI that the app is awaiting an answer, play a dial tone, and (in widget mode) auto-close the widget once the notification expires.

Widget-only parameters

These parameters are only supported in widget mode.

NameValuesRequiredDescription
baseUrlYesThe base URL of the homeserver to use for media lookups.
deviceIdMatrix device IDYesThe Matrix device ID for the widget host.
parentUrlYesThe url used to send widget action postMessages. This should be the domain of the client or the webview the widget is hosted in. (In case the widget is not in an Iframe but in a dedicated webview, we send the postMessages in the same WebView the widget lives in. Filtering is done in the widget so it ignores the messages it receives from itself.)
posthogUserIdPosthog user identifierNoThis replaces the analyticsID parameter
preloadtrue or falseNo, defaults to falsePauses app before joining a call until an io.element.join widget action is seen, allowing preloading.
returnToLobbytrue or falseNo, defaults to falseDisplays the lobby in widget mode after leaving a call; shows a blank page if set to false. Useful for video rooms.
userIdMatrix User IdentifierYesThe Matrix user ID.
widgetIdMSC2774 format widget IDYesThe id used by the widget. The presence of this parameter implies that element call will not connect to a homeserver directly and instead tries to establish postMessage communication via the parentUrl.

Embedded-only parameters

These parameters are only supported in the embedded package of Element Call and will be ignored in the full package.

NameValuesRequiredDescription
posthogApiHostPosthog server URLNoe.g. https://posthog-element-call.element.io. Only supported in embedded package. In full package the value from config is used.
posthogApiKeyPosthog project API keyNoOnly supported in embedded package. In full package the value from config is used.
rageshakeSubmitUrlRageshake server URL endpointNoe.g. https://rageshakes.element.io/api/submit. In full package the value from config is used.
sentryDsnSentry DSNNoIn full package the value from config is used.
sentryEnvironmentSentry environmentNoIn full package the value from config is used.