Welcome to the new Daily Docs. Please let us know what you think.


A POST request to /rooms creates a new room.

Heads up!

For full descriptions of this request's body params, reference room configuration options.

If the room is created, a room object is returned. So you can, for example, create a room, then immediately grab the room url from the API response and use it in your user interface. If you don't set privacy configuration parameters when you create the room, you can always set/change them later.

The config part of the room object includes only configuration parameters that differ from room configuration defaults.

If the room is not created, you'll get back an HTTP error, with information about the error in the HTTP response body.

Example requests

Here's how you might create a room with an auto-generated name, set to expire in an hour. This is a pretty common use case. For example, maybe you're creating rooms on demand to use for customer support or account verification. You don't need to set the room's privacy, because you won't be sharing the room URL other than within your own UI, and you won't be re-using the room. It is worth setting the room exp, just so that the room is auto-deleted and you don't end up with a huge number of live rooms.

If you're writing API calls in JavaScript, note that exp and nbf are unix timestamps expressed in seconds, not in milliseconds. You will need to divide JavaScript timestamps by 1,000 to turn them into unix timestamps. For example, you probably want to use some variant of Math.floor(Date.now()/1000) as a base value when creating near-future expiration timestamps. Don't just use Date.now().

Here's how you might create a room with a human-readable name, and privacy set to private, and with the default behavior of everyone's camera and mic turned off initially. You can create meeting tokens to allow access to this room (Learn more in our guide to room access control).

When a room object is returned by an API call, only configuration options that differ from the defaults are included in the config struct.*

Body params


Defaults to a randomly generated string A room name can include only the uppercase and lowercase ascii letters, numbers, dash and underscore. In other words, this regexp detects an invalid room name: /[^A-Za-z0-9_-]/.

Together, the domain name and the room name cannot exceed 41 characters. You'll get an error if you try to create a room with a name that's too long.

Determines who can access the room.
Options: "public","private"
Default: "public"



"Not before". This is a unix timestamp (seconds since the epoch.) Users cannot join a meeting in this room before this time.

Default: <not set>

"Expires". This is a unix timestamp (seconds since the epoch.) Users cannot join a meeting in this room after this time.

More resources:

Default: <not set>

How many people are allowed in a room at the same time.

⚠️ Contact us if you need to set the limit above 200.

Default: 200

Skip the initial meeting join page and go straight into the call.

❗️ autojoin will soon be deprecated, and is only supported when using the old prebuilt interface. To future proof your calls, use Daily Prebuilt and set enable_prejoin_ui to false for the same effect.

Default: true

Sets whether the room uses Daily Prebuilt or the previous video chat interface.

default: false for existing customers; true for new signups

⚠️ This property will eventually be deprecated, once Daily Prebuilt is the only available interface experience.

Default: false

Determines whether participants enter a waiting room with a camera, mic, and browser check before joining a call.

⚠️ You must be using Daily Prebuilt to use enable_prejoin_ui. You must also have signaling_impl set to "ws".

Default: NULL

Determines whether the network button, and the network panel it reveals on click, appears in this room.

⚠️ You must be using Daily Prebuilt to use enable_network_ui.

Default: false

Turns on a lobby experience for private rooms. A participant without a corresponding meeting token can request to be admitted to the meeting with a "knock", and wait for the meeting owner to admit them.

Requires the signaling_impl room or domain property set to "ws".

Default: false
Default: true

Determines whether Daily Prebuilt displays background blur controls. When set to true, a participant can enable blur during a Daily Prebuilt call.

⚠️ This flag only applies to Daily Prebuilt. It has no effect when building custom video applications with the Daily call object.

Default: true
Default: false

When a participant first joins a meeting in a room, keep their camera off.

Default: false

When a participant first joins a meeting in a room, keep their microphone muted.

Default: false

In Daily Prebuilt, only the meeting owners will be able to turn on camera, unmute mic, and share screen

See setting up calls.

Default: false

Jump to recording docs.

For more on rtp-tracks, see our blog post about server-side recording.

Note: If you’re planning to use output-byte-stream, you must monitor recording-data events.

Options: "cloud","local","rtp-tracks","output-byte-stream","<not set>"
Default: <not set>

If there's a meeting going on at room exp time, end the meeting by kicking everyone out. This behavior can be overridden by setting eject properties of a meeting token.

Default: false

Eject a meeting participant this many seconds after the participant joins the meeting. You can use this is a default length limit to prevent long meetings. This can be overridden by setting eject properties of a meeting token.


The default language of the Daily prebuilt video call UI, for this room.

Setting the language at the room level will override any domain-level language settings you have.

Read more about changing prebuilt UI language settings.

* Norwegian "no" and Russian "ru" are only available in the new Daily Prebuilt.

Options: "de","en","es","fi","fr","it","jp","ka","nl","no","pt","pl","ru","sv","tr","user"
Default: "en"

Sets a URL that will receive a webhook when a user joins a room. Default is NULL. Character limit for webhook URL is 255.

More resources:

Default: NULL

Sets the signaling type.

Options: "ws"
Default: "ws"

Daily calls use signaling servers to manage all of the participants in a given call session. In an SFU/server mode call, that same server will also send and receive all the audio and video from each participant. In a peer-to-peer call, each participant sends media directly to and from each other peer, but a signaling server still manages call state.

Daily runs servers in several different AWS regions to minimize latency for users around the world. The job of 'picking' a call server is handled when the first participant joins a room. Their browser connects to a call server using Amazon's Route 53 DNS resolution, which chooses a server in the region closest to them.

This isn't always optimal. For example, if one person joins in London, and then ten more people join from Cape Town, the call will still be hosted out of eu-west-2 . The majority of the participants will have higher latency to the server than if one of them had joined first and the call was being hosted in af-south-1. In cases like this, you may want to configure your domain (or a specific room) to always choose a call server in a specific AWS region.

Available regions:

  • "af-south-1" (Cape Town)
  • "ap-northeast-2" (Seoul)
  • "ap-southeast-1" (Singapore)
  • "ap-southeast-2" (Sydney)
  • "ap-south-1" (Mumbai)
  • "eu-west-2" (London)
  • "sa-east-1" (São Paulo)
  • "us-east-1" (N. Virginia)
  • "us-west-2" (Oregon)
Default: NULL