# Daily

> Run video calls on Daily from a workflow: create rooms with the features and expiry you want, hand each guest a meeting token and a ready-made join link, see who is in a call right now, message or remove participants, and look back at past meetings and who attended.

App · Video Conferencing · 15 actions. Web page: https://docs.lodol.com/docs/integrations/daily

## Actions

### Create a meeting token

Mint a signed token that lets one person into a room, private rooms included, with their name and what they can do. Name a room and you also get a ready-made join URL.

**Inputs**

- Expires (`exp`, date and time, required): When the token stops working. Daily recommends every token expire.
- Room (`room_name`, text): The room the token is for. Leave blank for a token that works in every room on the domain.
- Owner (`is_owner`, true/false): Owners can let knocking guests in, remove people and change others' settings. Default: `false`.
- Display name (`user_name`, text): The name others see in the call.
- User ID (`participant_user_id`, text): Your own id for this person. It shows up in presence, meeting history and presence, and is what a ban applies to.
- Valid from (`nbf`, date and time): The token does not work before this moment.
- Remove them when it expires (`eject_at_token_exp`, true/false): End their call when the token expires. Default: `false`.
- Remove them after (seconds) (`eject_after_elapsed`, number): End their call this many seconds after they join. At least 1.
- Camera off on join (`start_video_off`, text): Leave blank to follow the room's setting. One of: `true` (On), `false` (Off).
- Microphone off on join (`start_audio_off`, text): Leave blank to follow the room's setting. One of: `true` (On), `false` (Off).
- Screen sharing (`enable_screenshare`, text): Leave blank to follow the room's setting. One of: `true` (On), `false` (Off).
- Pre-join screen (`enable_prejoin_ui`, text): Leave blank to follow the room's setting. One of: `true` (On), `false` (Off).
- Join by knocking (`knocking`, text): The token only lets them knock, and an owner lets them in. One of: `true` (On), `false` (Off).
- Redirect when they leave (`redirect_on_meeting_exit`, text): A URL to send them to when they leave the call.
- Interface language (`lang`, text): The language of Daily's call interface. Daily's default is English. One of: `en` (English), `da` (Danish), `de` (German), `es` (Spanish), `fi` (Finnish), `fr` (French), `it` (Italian), `jp` (Japanese), `ka` (Georgian), `nl` (Dutch), and 8 more.

**Outputs**

- `exp` (number)
- `expires_at` (text)
- `join_url` (text)
- `room_name` (text)
- `token` (text)

**Example output**

```json
{
  "exp": 1790003600,
  "expires_at": "2026-09-21T14:33:20Z",
  "join_url": "https://your-domain.daily.co/weekly-standup?t=eyJhbGciOiJIUzI1NiJ9.eyJyIjoid2Vla2x5LXN0YW5kdXAifQ.sig",
  "room_name": "weekly-standup",
  "token": "eyJhbGciOiJIUzI1NiJ9.eyJyIjoid2Vla2x5LXN0YW5kdXAifQ.sig"
}
```

### Create a room

Create a Daily video room and get its URL. Every field is optional: Daily picks a random name if you leave it blank. Recording and transcription are paid Daily features and are not offered here.

**Inputs**

- Room name (`name`, text): The last part of the room's URL. Letters, numbers, '-' and '_'. Leave blank for a random one.
- Privacy (`privacy`, text): Public rooms let in anyone with the link. Private rooms need a meeting token, or an owner letting a knocking guest in. Daily's default is public. One of: `public` (Public: anyone with the link can join), `private` (Private: joining needs a meeting token).
- Available from (`nbf`, date and time): Nobody can join before this moment. Leave blank for Daily's default.
- Expires (`exp`, date and time): Nobody can join after this moment, and Daily stops listing the room. Set one for a room you only need for a while.
- Most participants (`max_participants`, number): How many people can be in the call at once, up to 200. Daily's default is 200. From 1 to 200.
- Chat (`enable_chat`, text): Text chat in Daily's call interface. Off by default. One of: `true` (On), `false` (Off).
- Knocking (`enable_knocking`, text): On a private room, lets people without a token ask to be let in. One of: `true` (On), `false` (Off).
- Screen sharing (`enable_screenshare`, text): Whether participants can share their screen. On by default. One of: `true` (On), `false` (Off).
- Pre-join screen (`enable_prejoin_ui`, text): A screen to check camera and microphone before joining. One of: `true` (On), `false` (Off).
- People panel (`enable_people_ui`, text): The panel listing everyone in the call. One of: `true` (On), `false` (Off).
- Emoji reactions (`enable_emoji_reactions`, text): Lets participants send emoji reactions. One of: `true` (On), `false` (Off).
- Hand raising (`enable_hand_raising`, text): Lets participants raise a hand. One of: `true` (On), `false` (Off).
- Advanced chat (`enable_advanced_chat`, text): Chat with emoji reactions and file sharing. Off by default. One of: `true` (On), `false` (Off).
- Breakout rooms (`enable_breakout_rooms`, text): Lets an owner split the call into breakout rooms. One of: `true` (On), `false` (Off).
- Camera off on join (`start_video_off`, text): Participants join with their camera off. Off by default. One of: `true` (On), `false` (Off).
- Microphone off on join (`start_audio_off`, text): Participants join muted. Off by default. One of: `true` (On), `false` (Off).
- Remove everyone at expiry (`eject_at_room_exp`, text): Ends the call for everyone when the room expires. Off by default. One of: `true` (On), `false` (Off).
- Remove each person after (seconds) (`eject_after_elapsed`, number): Removes each participant this many seconds after they join. At least 1.
- Interface language (`lang`, text): The language of Daily's call interface. Daily's default is English. One of: `en` (English), `da` (Danish), `de` (German), `es` (Spanish), `fi` (Finnish), `fr` (French), `it` (Italian), `jp` (Japanese), `ka` (Georgian), `nl` (Dutch), and 8 more.
- Server region (`geo`, text): Pin the call to one Daily region, such as us-west-2. Leave blank to let Daily pick the nearest one.
- Join hook URL (`meeting_join_hook`, text): A URL Daily calls each time somebody joins this room's call.
- Other properties (`extra_properties`, object): Any other room property from Daily's reference, as JSON. The fields above win if both set the same property.

**Outputs**

- `api_created` (true/false)
- `config` (object)
- `created_at` (text)
- `id` (text)
- `name` (text)
- `privacy` (text)
- `url` (text)

**Example output**

```json
{
  "api_created": true,
  "config": {
    "enable_chat": true,
    "exp": 1790000000
  },
  "created_at": "2026-09-21T09:00:00.000Z",
  "id": "5e3cf703-5547-47d6-a371-37b1f0b4427f",
  "name": "weekly-standup",
  "privacy": "private",
  "url": "https://your-domain.daily.co/weekly-standup"
}
```

### Delete a room

Delete a room. Anyone in a call in it is removed. The name can be used again afterwards.

**Inputs**

- Room (`room_name`, text, required): Which room to delete.

**Outputs**

- `deleted` (true/false)
- `name` (text)

**Example output**

```json
{
  "deleted": true,
  "name": "weekly-standup"
}
```

### Eject participants

Remove people from a room's call, by participant session id or by user id. Ban to stop those user ids joining again. Without a ban, an empty room is reported as nobody ejected.

**Inputs**

- Room (`room_name`, text, required): The room to remove them from.
- Participant session IDs (`participant_ids`, list): Session ids ('id' from 'Get who is in a room'), up to 100.
- User IDs (`participant_user_ids`, list): User ids as set by meeting tokens, up to 100.
- Ban them (`ban`, true/false): Also stop these user ids from joining again. Default: `false`.

**Outputs**

- `banned` (true/false)
- `ejected_count` (number)
- `ejected_ids` (list)
- `participants_present` (number)
- `room_name` (text)

**Example output**

```json
{
  "banned": false,
  "ejected_count": 1,
  "ejected_ids": [
    "d61cd7b2-a273-42b4-89bd-be763fd562c1"
  ],
  "participants_present": 3,
  "room_name": "weekly-standup"
}
```

### Get a meeting

One meeting session: its room, when it started, how long it ran and the most people in it at once.

**Inputs**

- Meeting session ID (`meeting_id`, text, required): The id of one meeting session: the 'id' a 'List meetings' step returns for it, or 'meeting_session_id' from a presence step.

**Outputs**

- `duration` (number)
- `id` (text)
- `max_participants` (number)
- `ongoing` (true/false)
- `room` (text)
- `start_time` (number)
- `start_time_iso` (text)

**Example output**

```json
{
  "duration": 1800,
  "id": "16d8e9a4-0b38-4a6e-9a1a-3f1c1b5e2a90",
  "max_participants": 4,
  "ongoing": false,
  "room": "weekly-standup",
  "start_time": 1790000460,
  "start_time_iso": "2026-09-21T13:41:00Z"
}
```

### Get a room

Read one room: its URL, privacy and settings.

**Inputs**

- Room (`room_name`, text, required): Which room to read.

**Outputs**

- `api_created` (true/false)
- `config` (object)
- `created_at` (text)
- `id` (text)
- `name` (text)
- `privacy` (text)
- `url` (text)

**Example output**

```json
{
  "api_created": true,
  "config": {
    "enable_chat": true,
    "exp": 1790000000
  },
  "created_at": "2026-09-21T09:00:00.000Z",
  "id": "5e3cf703-5547-47d6-a371-37b1f0b4427f",
  "name": "weekly-standup",
  "privacy": "private",
  "url": "https://your-domain.daily.co/weekly-standup"
}
```

### Get domain settings

The Daily domain this connection's key belongs to, and its domain-wide settings.

**Inputs**: None.

**Outputs**

- `config` (object)
- `domain_id` (text)
- `domain_name` (text)

**Example output**

```json
{
  "config": {
    "hide_daily_branding": false,
    "lang": "en"
  },
  "domain_id": "8e7b3c1a-2f4d-4a5b-9c6d-7e8f9a0b1c2d",
  "domain_name": "your-domain"
}
```

### Get presence

Everyone in every room on this domain right now, grouped by room. Rooms nobody is in are left out.

**Inputs**: None.

**Outputs**

- `participant_count` (number)
- `room_count` (number)
- `rooms` (list)

**Example output**

```json
{
  "participant_count": 1,
  "room_count": 1,
  "rooms": [
    {
      "participant_count": 1,
      "participants": [
        {
          "duration": 312,
          "id": "d61cd7b2-a273-42b4-89bd-be763fd562c1",
          "join_time": "2026-09-21T09:01:12.000Z",
          "meeting_session_id": "16d8e9a4-0b38-4a6e-9a1a-3f1c1b5e2a90",
          "room": "weekly-standup",
          "user_id": "user_8241",
          "user_name": "Ada"
        }
      ],
      "room": "weekly-standup"
    }
  ]
}
```

### Get who is in a room

The people in a room's call right now, with when they joined. An empty list means nobody is in it.

**Inputs**

- Room (`room_name`, text, required): Which room to look in.
- How many (`limit`, number): At most this many, up to 100. Daily's default is 100. From 1 to 100.
- User ID (`participant_user_id`, text): Only the participant with this user id, as set by their meeting token.
- User name (`user_name`, text): Only participants with this display name.

**Outputs**

- `participants` (list)
- `room_name` (text)
- `total_count` (number)

**Example output**

```json
{
  "participants": [
    {
      "duration": 312,
      "id": "d61cd7b2-a273-42b4-89bd-be763fd562c1",
      "join_time": "2026-09-21T09:01:12.000Z",
      "meeting_session_id": "16d8e9a4-0b38-4a6e-9a1a-3f1c1b5e2a90",
      "room": "weekly-standup",
      "user_id": "user_8241",
      "user_name": "Ada"
    }
  ],
  "room_name": "weekly-standup",
  "total_count": 1
}
```

### List meeting participants

Everyone who joined one meeting session, with when they joined and how long they stayed. Pass 'next_cursor' into 'Joined after' for the next page.

**Inputs**

- Meeting session ID (`meeting_id`, text, required): The id of one meeting session: the 'id' a 'List meetings' step returns for it, or 'meeting_session_id' from a presence step.
- How many (`limit`, number): At most this many, up to 100. Daily's default is 100. From 1 to 100.
- Joined after (`joined_after`, text): A participant id: list the people who joined after them. Use the 'next_cursor' from a previous run.
- Joined before (`joined_before`, text): A participant id: list the people who joined before them.

**Outputs**

- `count` (number)
- `meeting_id` (text)
- `next_cursor` (text)
- `participants` (list)

**Example output**

```json
{
  "count": 1,
  "meeting_id": "16d8e9a4-0b38-4a6e-9a1a-3f1c1b5e2a90",
  "next_cursor": "d61cd7b2-a273-42b4-89bd-be763fd562c1",
  "participants": [
    {
      "duration": 312,
      "join_time": 1790000472,
      "join_time_iso": "2026-09-21T13:41:12Z",
      "participant_id": "d61cd7b2-a273-42b4-89bd-be763fd562c1",
      "user_id": "user_8241",
      "user_name": "Ada"
    }
  ]
}
```

### List meetings

Past and ongoing meeting sessions on this domain, newest first, each with who joined. A session starts when the first person joins a room and ends when the last one leaves.

**Inputs**

- Rooms (`rooms`, text): Only sessions in these rooms, up to 10.
- Started after (`timeframe_start`, date and time): Only sessions that started at or after this.
- Started before (`timeframe_end`, date and time): Only sessions that started before this.
- Only ongoing (`ongoing`, true/false): Only sessions still in progress. Default: `false`.
- Leave out participants (`no_participants`, true/false): Skip the participant lists, for a smaller result. Default: `false`.
- How many (`limit`, number): At most this many, up to 100. Daily's default is 100. From 1 to 100.
- Starting after (`starting_after`, text): A session id: list the ones after it. Use the 'next_cursor' from a previous run.
- Ending before (`ending_before`, text): A session id: list the ones before it.

**Outputs**

- `count` (number)
- `meetings` (list)
- `next_cursor` (text)
- `total_count` (number)

**Example output**

```json
{
  "count": 1,
  "meetings": [
    {
      "duration": 1800,
      "id": "16d8e9a4-0b38-4a6e-9a1a-3f1c1b5e2a90",
      "max_participants": 4,
      "ongoing": false,
      "participants": [
        {
          "duration": 312,
          "join_time": 1790000472,
          "join_time_iso": "2026-09-21T13:41:12Z",
          "participant_id": "d61cd7b2-a273-42b4-89bd-be763fd562c1",
          "user_id": "user_8241",
          "user_name": "Ada"
        }
      ],
      "room": "weekly-standup",
      "start_time": 1790000460,
      "start_time_iso": "2026-09-21T13:41:00Z"
    }
  ],
  "next_cursor": "16d8e9a4-0b38-4a6e-9a1a-3f1c1b5e2a90",
  "total_count": 1
}
```

### List rooms

List the rooms on this Daily domain, newest first. Rooms whose expiry has passed are not listed. Pass 'next_cursor' into 'Starting after' to get the next page.

**Inputs**

- How many (`limit`, number): At most this many, up to 100. Daily's default is 100. From 1 to 100.
- Starting after (`starting_after`, text): A room id: list the rooms after it. Use the 'next_cursor' from a previous run of this step.
- Ending before (`ending_before`, text): A room id: list the rooms before it. 'OLDEST' gets the oldest page.

**Outputs**

- `count` (number)
- `has_more` (true/false)
- `next_cursor` (text)
- `rooms` (list)
- `total_count` (number)

**Example output**

```json
{
  "count": 1,
  "has_more": false,
  "next_cursor": null,
  "rooms": [
    {
      "api_created": true,
      "config": {
        "enable_chat": true,
        "exp": 1790000000
      },
      "created_at": "2026-09-21T09:00:00.000Z",
      "id": "5e3cf703-5547-47d6-a371-37b1f0b4427f",
      "name": "weekly-standup",
      "privacy": "private",
      "url": "https://your-domain.daily.co/weekly-standup"
    }
  ],
  "total_count": 1
}
```

### Send an app message

Send a data message to the apps of everyone in a live call, or to one participant. Your app receives it as an 'app-message' event. If nobody is in the room, nothing is sent and the step reports sent: false.

**Inputs**

- Room (`room_name`, text, required): The room whose call to message.
- Message data (`data`, object, required): Any JSON object, up to 4 KB.
- Recipient (`recipient`, text): One participant's session id ('id' from 'Get who is in a room'). Leave blank to send to everyone.

**Outputs**

- `participants_present` (number)
- `recipient` (text)
- `room_name` (text)
- `sent` (true/false)

**Example output**

```json
{
  "participants_present": 3,
  "recipient": "*",
  "room_name": "weekly-standup",
  "sent": true
}
```

### Update a room

Change a room's privacy or settings. Only the fields you fill in change; a room cannot be renamed.

**Inputs**

- Room (`room_name`, text, required): Which room to change.
- Privacy (`privacy`, text): Public rooms let in anyone with the link. Private rooms need a meeting token, or an owner letting a knocking guest in. Daily's default is public. One of: `public` (Public: anyone with the link can join), `private` (Private: joining needs a meeting token).
- Available from (`nbf`, date and time): Nobody can join before this moment. Leave blank to keep the room's current setting.
- Expires (`exp`, date and time): Nobody can join after this moment, and Daily stops listing the room. Set one for a room you only need for a while.
- Most participants (`max_participants`, number): How many people can be in the call at once, up to 200. Daily's default is 200. From 1 to 200.
- Chat (`enable_chat`, text): Text chat in Daily's call interface. Off by default. One of: `true` (On), `false` (Off).
- Knocking (`enable_knocking`, text): On a private room, lets people without a token ask to be let in. One of: `true` (On), `false` (Off).
- Screen sharing (`enable_screenshare`, text): Whether participants can share their screen. On by default. One of: `true` (On), `false` (Off).
- Pre-join screen (`enable_prejoin_ui`, text): A screen to check camera and microphone before joining. One of: `true` (On), `false` (Off).
- People panel (`enable_people_ui`, text): The panel listing everyone in the call. One of: `true` (On), `false` (Off).
- Emoji reactions (`enable_emoji_reactions`, text): Lets participants send emoji reactions. One of: `true` (On), `false` (Off).
- Hand raising (`enable_hand_raising`, text): Lets participants raise a hand. One of: `true` (On), `false` (Off).
- Advanced chat (`enable_advanced_chat`, text): Chat with emoji reactions and file sharing. Off by default. One of: `true` (On), `false` (Off).
- Breakout rooms (`enable_breakout_rooms`, text): Lets an owner split the call into breakout rooms. One of: `true` (On), `false` (Off).
- Camera off on join (`start_video_off`, text): Participants join with their camera off. Off by default. One of: `true` (On), `false` (Off).
- Microphone off on join (`start_audio_off`, text): Participants join muted. Off by default. One of: `true` (On), `false` (Off).
- Remove everyone at expiry (`eject_at_room_exp`, text): Ends the call for everyone when the room expires. Off by default. One of: `true` (On), `false` (Off).
- Remove each person after (seconds) (`eject_after_elapsed`, number): Removes each participant this many seconds after they join. At least 1.
- Interface language (`lang`, text): The language of Daily's call interface. Daily's default is English. One of: `en` (English), `da` (Danish), `de` (German), `es` (Spanish), `fi` (Finnish), `fr` (French), `it` (Italian), `jp` (Japanese), `ka` (Georgian), `nl` (Dutch), and 8 more.
- Server region (`geo`, text): Pin the call to one Daily region, such as us-west-2. Leave blank to let Daily pick the nearest one.
- Join hook URL (`meeting_join_hook`, text): A URL Daily calls each time somebody joins this room's call.
- Other properties (`extra_properties`, object): Any other room property from Daily's reference, as JSON. The fields above win if both set the same property.

**Outputs**

- `api_created` (true/false)
- `config` (object)
- `created_at` (text)
- `id` (text)
- `name` (text)
- `privacy` (text)
- `url` (text)

**Example output**

```json
{
  "api_created": true,
  "config": {
    "enable_chat": true,
    "exp": 1790000000
  },
  "created_at": "2026-09-21T09:00:00.000Z",
  "id": "5e3cf703-5547-47d6-a371-37b1f0b4427f",
  "name": "weekly-standup",
  "privacy": "private",
  "url": "https://your-domain.daily.co/weekly-standup"
}
```

### Validate a meeting token

Check whether a meeting token is still good on this domain, and read what it grants. An expired or foreign token comes back as valid: false rather than failing the step.

**Inputs**

- Meeting token (`meeting_token`, text, required): The token, or a join URL ending in ?t=<token>.
- Ignore 'valid from' (`ignore_nbf`, true/false): Treat a token that is not valid yet as valid, to check it ahead of time. Default: `false`.

**Outputs**

- `exp` (number)
- `is_owner` (true/false)
- `participant_user_id` (text)
- `properties` (object)
- `reason` (text)
- `room_name` (text)
- `user_name` (text)
- `valid` (true/false)

**Example output**

```json
{
  "exp": 1790003600,
  "is_owner": false,
  "participant_user_id": "user_8241",
  "properties": {
    "exp": 1790003600,
    "is_owner": false,
    "room_name": "weekly-standup",
    "user_id": "user_8241",
    "user_name": "Ada"
  },
  "reason": null,
  "room_name": "weekly-standup",
  "user_name": "Ada",
  "valid": true
}
```
