Skip to main content
DailyCallOptions is the configuration object accepted by Daily’s factory methods (createCallObject(), createFrame(), etc.) and by join() and load(). Properties marked with * are only supported in Prebuilt mode. Properties marked as dailyConfig must be nested inside a dailyConfig key.
const call = Daily.createCallObject({
  subscribeToTracksAutomatically: false,
  dailyConfig: {
    micAudioMode: 'music',
  },
});

await call.join({
  url: 'https://your-domain.daily.co/room-name',
  token: 'YOUR_TOKEN',
  startVideoOff: true,
});

Properties

* after a property name indicates that property is only supported when using Daily Prebuilt.
url
string
Optional as a DailyCall property if a url is passed to the join() method. Otherwise, required.
token
string
Optional meeting token(Used with the join() method).
startVideoOff
boolean
Optional: set to true to disable the default behavior of automatically turning on your camera on the first call to either join() or startCamera().Note: this means that if you turn on your camera as part of or after startCamera(), using startVideoOff: true in a subsequent join() will have no effect.You can also control what happens on a direct join() (i.e. without startCamera() first) using token or room properties.
startAudioOff
boolean
Optional: set to true to disable the default behavior of automatically turning on your microphone on the first call to either join() or startCamera().Note: this means that if you turn on your microphone as part of or after startCamera(), using startAudioOff: true in a subsequent join() will have no effect.You can also control what happens on a direct join() (i.e. without startCamera() first) using token or room properties.
lang*
string
Optional: the default language of Daily PrebuiltCurrently suppported languages are:
  • "da": Danish
  • "de": German
  • "en": English
  • "es": Spanish
  • "fi": Finnish
  • "fr": French
  • "it": Italian
  • "jp": Japanese
  • "ka": Georgian
  • "nl": Dutch
  • "no": Norwegian
  • "pt": Portuguese (Portugal)
  • "pt-BR": Portuguese (Brazil)
  • "pl": Polish
  • "ru": Russian
  • "sv": Swedish
  • "tr": Turkish
  • "user": Uses the browser’s current language setting (defaults to English if the language is not one of the above supported language)
showLeaveButton*
boolean
OptionalDefaults to false
showFullscreenButton*
boolean
OptionalDefaults to false⚠️iOS 15.1 and greater does not support this feature
showUserNameChangeUI*
boolean
Optional: Display the user name change UI in Daily Prebuilt.Default: true⚠️Use a token to populate a user_name in the Daily Prebuilt UI when this property is disabled.
iframeStyle*
object
Optional: Used only by createFrame()Example object:
\{
  iframeStyle: \{
    position: 'fixed',
    border: '1px solid black',
    width: '375px',
    height: '450px',
    right: '1em',
    bottom: '1em'
  \}
\}
theme*
object
Allows theme color customization, on either a global, or per sub-theme, basis (light and dark).See setTheme() for detailed options.
avoidEval
boolean
This configuration property only applies when using daily-js’s call object (custom) mode and when a CSP (Content Security Policy) is defined. As of daily-js v0.27.0, developers using a CSP can remove 'unsafe-eval' from their script-src directive but must pass 'https://*.daily.co' in its place. Must be passed as a property of a dailyConfig object. Learn more in our CSP guide.Default: false
keepCamIndicatorLightOn
boolean
⚠️ This configuration property only applies when building on top of the Daily call object. Must be passed as a property of a dailyConfig object.Optional: Setting to true will keep the hardware video light on even when the participant camera is disabled.Default: false
experimentalChromeVideoMuteLightOff
boolean
⚠️ Removed in daily-js 0.43.0; use keepCamIndicatorLightOn instead. This configuration property only applies when building on top of the Daily call object. Must be passed as a property of a dailyConfig object.Optional: Setting to true will disable the hardware video light when the participant camera is disabled.Default: false
alwaysIncludeMicInPermissionPrompt
boolean
⚠️ This configuration property only applies when building on top of the Daily call object. Must be passed as a property of a dailyConfig object.Optional: Setting to false will make it so that, if the user needs to be prompted by the browser for camera access, that access prompt won’t also include a request for microphone access.Default: true. For most apps, if the user turns on their camera first, it’s preferable to prompt for both camera and microphone access up front to avoid a second prompt when the user later turns on their microphone.
alwaysIncludeCamInPermissionPrompt
boolean
⚠️ This configuration property only applies when building on top of the Daily call object. Must be passed as a property of a dailyConfig object.Optional: Setting to true will make it so that when the user is first prompted by the browser for device access, the prompt will always include a request for camera access, even if the user is only turning on their microphone.Default: false. For most apps, if the user turns on their microphone first, it would be surprising to be asked for camera access as well.)
userName
string
Optional: Sets the participant’s userName
userData
unknown
Optional: Sets custom userData on the participant. See setUserData() for more details and requirements.For Daily Prebuilt, you can use userData to add a custom avatar image that will be displayed for muted participant tiles and in the People tab. To add this, include avatar: 'https://example.com/avatar.jpg' in the userData object. The avatar image URL must be publicly accessible. When a custom avatar image is set, it will displayed on the participant’s tile and in the People tab.
subscribeToTracksAutomatically
boolean
Optional: Receive all audio, video, and screen tracks from all call participantsDefault: true⚠️This configuration property is not supported when using Daily Prebuilt.Applies only when building with the Daily call object and while connected in SFU mode.A value of false means no tracks will be received until they are explicitly subscribed to. Read more about manual track subscriptions in our docs.
audioSource
boolean or MediaStreamTrack object
Optional: set the audio track, device, or initial state for the call.Default: true⚠️This configuration property is not supported when using Daily Prebuilt.Pass false only if the participant’s audio should remain muted the entire call.Pass a device ID string (like you get back from enumerateDevices() to specify what audio input device to use.Or pass a MediaStreamTrack object to use that audio/video track directly. If you pass a MediaStreamTrack, you’re responsible for managing the lifecycle of that track. If you pass a Device ID string, the Daily API will manage the media track for that device.
videoSource
boolean or MediaStreamTrack object
Optional: set the video track, device, or initial state for the call.Default: true⚠️This configuration property is not supported when using Daily Prebuilt.Pass false only if the participant’s video should remain muted the entire call.Pass a device ID string (like you get back from enumerateDevices()) to specify what video input device to use.Or pass a MediaStreamTrack object to use that audio/video track directly. If you pass a MediaStreamTrack, you’re responsible for managing the lifecycle of that track. If you pass a Device ID string, the Daily API will manage the media track for that device.
showLocalVideo*
boolean
Optional: Display the video of the local call participant in Daily Prebuilt.Default: trueUseful for webinar-style applications.
showParticipantsBar*
boolean
Optional: Controls visibility of other participants’ videos in Daily Prebuilt’s speaker view.Default: trueUseful for webinar-style applications.
activeSpeakerMode*
boolean
Optional: Specifies whether to start the Daily Prebuilt call in active speaker mode. Defaults to true, but can be set to false to start the call in grid mode instead.Default: true
layoutConfig*
object
Optional: Takes an object of the form: \{grid: \{ minTilesPerPage: [number], maxTilesPerPage: [number] \}\}, which specifies how the grid of video tiles behave when the browser is resized when the call is in grid mode.Default:maxTilesPerPage defaults to 25, with a limit of 49*.minTilesPerPage defaults to 1, with a minimum of 1.*If you need more than 49 max tiles, please contact us.
receiveSettings
object
Optional: Takes a media receive settings object (see updateReceiveSettings() for details). Specifies the receive settings to use right away upon joining the call.
inputSettings
object
Optional: Applies settings to alter local input media streams, making it possible to override track constraints and/or enable a media processor like "noise-cancellation" or "background-blur". See updateInputSettings() for details.
sendSettings
object
Optional: Takes a media send settings object (see updateSendSettings() for details). Specifies the send settings to use right away upon joining the call.
camSimulcastEncodings
object
This property has been deprecated. Instead, use the sendSettings iframe property to specify custom simulcast encodings.Optional: Requests that a participant sends video spatial layers with specific simulcast encodings (maxBitrate, maxFramerate, and scaleResolutionDownBy) to the server. Must be passed as a property of a dailyConfig object.Deprecated
micAudioMode
string or object
Optional (Advanced): Configures the sender’s audio tracks (audio or screenAudio) to be either music or speech. When set to music, a 256kbps stereo audio track will be sent to other participants. When set to speech, browser defaults will be applied.Alternatively, an object can be provided in order to specify the audio bitrate and stereo mode. The bitrate is a number in bits per second and the stereo mode is a boolean, where true enables 2-channel stereo audio and false enables 1-channel mono audio.Must be passed as a property of a dailyConfig object.micAudioMode works in SFU mode only.Example object:
\{
  micAudioMode: \{
    bitrate: 128000,
    stereo: false,
  \},
\}
Default: null
userMediaAudioConstraints
object
This property has been deprecated. Instead, use the inputSettings iframe property to specify custom constraints.Optional (Advanced): Allows for audio media constraints to be defined. Must be passed as a property of a dailyConfig object. The value passed should be a MediaTrackConstraints object.Constraints will be used when Daily invokes getUserMedia().If micAudioMode is set to music, this property will be overwritten in favor of the music settings.Deprecated
userMediaVideoConstraints
object
This property has been deprecated on daily-js. Instead, use the inputSettings iframe property to specify custom constraints.Optional (Advanced): Allows for video media constraints to be defined. Must be passed as a property of a dailyConfig object. The value passed should be a MediaTrackConstraints objects.Constraints will be used when Daily invokes getUserMedia().Deprecated
useLegacyVideoProcessor
boolean
Must be passed as a property of a dailyConfig object.Optional: Setting to true will cause Daily to prefer the legacy video processing provider (i.e. for background blur and background image replacement). The legacy provider was the default provider until daily-js 0.56.0.Default: false
allowMultipleCallInstances
boolean
Must be passed as a property in a factory method.Optional: Setting to true will override Daily’s default behavior and allow multiple call instances to exist and work simultaneously. See this guide for more.Introduced in daily-js 0.67.0.Default: false
strictMode
boolean
Must be passed as a property in a factory method.Optional: Setting to false will override override Daily’s default behavior and allow a call instance to be used after it has been destroyed. Use of this flag is discouraged.Default: true
customTrayButtons*
object
Optional: Configures a set of custom buttons in your Daily Prebuilt call through the passed-in dictionary. You can pass multiple custom buttons in at once. Because Daily Prebuilt runs in an <iframe>, the iconPath and iconPathDarkMode values must each be a URL, complete with the https: protocol string.Example object:
\{
  customTrayButtons: \{
    customButtonOne: \{
      iconPath: 'https://example.com/path/to/your/icon.svg',
      iconPathDarkMode: 'https://example.com/path/to/your/darkmode/icon.svg',
      label: 'My Custom Button',
      tooltip: 'My Custom Button Tooltip',
      visualState: 'default'
    \},
    customButtonTwo: \{
      iconPath: 'https://example.com/path/to/your/icon.svg',
      label: 'Another Custom Button',
      tooltip: 'Another Custom Button Tooltip',
    \},
  \},
\}
visualState can be one of
  • "default": default style
  • "active": adds a red background to the provided icon. Use this when the custom button represents a service or state, where "active" indicates the service is running or the state is active.
  • "sidebar-open": requires setting a customIntegration with "location": "sidebar". When the sidebar tab is active, this custom button will have a little bottom-border indicator, similar to “People”, “Chat” or “Network”.
customIntegrations*
object
Optional (Advanced): Configures Daily Prebuilt so that an Internet hosted website can be embedded into Prebuilt as an iframe. Active integrations will appear in one of two areas: in the main call area or the sidebar. The location depends on the configuration. main integrations will appear in the main call area, only when they are running. sidebar integrations will appear as additional tabs in the Prebuilt sidebar. The full list of properties are referenced here.Example object:
\{
  const miroEmbed: DailyCustomIntegration = \{
    iconURL: 'https://files.readme.io/17d4a23-miro-logo-color-square.png',
    label: 'Miro',
    location: 'main',
    name: 'miro',
    shared: false,
    allow: 'fullscreen; clipboard-read; clipboard-write',
    src: '',
  \}
\}
iceConfig
object
Optional (Advanced): Allows for specifying custom TURN servers rather than only using Daily’s default TURN servers.⚠️ This configuration property is part of the Advanced Firewall Control add-on. Please contact Sales to enable this functionality.Must be passed as a property of a dailyConfig object.

Properties:

iceServers:
  • type: RTCIceServer[]
  • description: Each object in the array has properties urls, username and credential. See RTCIceServer[] for full description.
  • default: []
placement:
  • type: 'front' | 'back' | 'replace'
  • description: Controls how the provided iceServers are included relative to the Daily-provided servers. 'front' means the provided iceServers are included in the array first. 'back' means the Daily-provided servers are included first. 'replace' means that only the provided iceServers are used. Since all known WebRTC implementations will try all included iceServers and pick one based on the lowest RTT, we recommend omitting this property unless using 'replace'.
  • default: 'front'
iceTransportPolicy:
  • type: 'all' | 'relay'
  • description: 'all' will use all of the candidates. 'relay' will only use relay candidates, such as those passing through a TURN server. See RTCIceTransportPolicy Enum for more information. Note: Forcing the use of relay candidates is useful for testing, but for most production use cases, the default value of 'all' should be used.
  • default: 'all'
Example object:
\{
  iceConfig: \{
    iceServers: [
      \{
        "urls": [
          "stun:stunserver.example.org:3478",
          "turn:turnserver.example.org:3478?transport=udp",
          "turn:turnserver.example.org:3478?transport=tcp",
          "turn:turnserver.example.org:443?transport=tcp",
          "turns:turnserver.example.org:443?transport=tcp"
        ],
        "username": "[USER_NAME]",
        "credential": "[CREDENTIAL]"
      \}
    ],
  \},
\}
After setting iceConfig as a frame property, it will be necessary to call setIceConfig() periodically so that the iceServer credentials remain valid, in case they are needed for reconnections, or to connect to new peers in peer mode.It is recommended to use TURN server credentials that are valid for more than one hour, and call setIceConfig() every hour to refresh the credentials, if possible.
proxyUrl
string
Optional (Advanced): If defined, connections to Daily’s HTTPS and WebSocket endpoints will be sent instead to the specified proxy server.⚠️ This configuration property is part of the Advanced Firewall Control add-on. Please contact Sales to enable this functionality.Must be passed as a property of a dailyConfig object. Defaults to null.Example:
// Pass configuration properties to createFrame()
call = window.Daily.createFrame(\{
  iframeStyle: \{
    position: 'fixed',
    border: '1px solid black',
    width: '375px',
    height: '450px',
    right: '1em',
    bottom: '1em',
  \},
  dailyConfig: \{
    micAudioMode: 'music',
    proxyUrl: 'https://my-proxy-server:8080',
  \},
  showLeaveButton: true,
  showFullscreenButton: true,
\});
call.join(\{ url: 'DAILY_ROOM_URL' \});
If needed, setProxyUrl() can be used to modify the property once set.

Proxy requirements

The proxy server must proxy HTTPS connections to:It must also proxy HTTPS connections converting to WebSockets on *.wss.daily.co and *-wss.daily.co. If possible, proxying on *.daily.co is best.Note: the URLs listed here are subject to change in subsequent releases of daily-js.