> ## Documentation Index
> Fetch the complete documentation index at: https://docs.heylua.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Meetings

> Send your agent into a Google Meet, Zoom, or Microsoft Teams meeting as a participant that listens, speaks, and summarizes

After this guide, your [agent](/concepts/agents) joins a video meeting as a named participant, speaks with the [voice](/concepts/voice) you chose, follows the room's cues about when to talk, and leaves a structured summary behind. The agent joins through Recall.ai; you need nothing from the meeting provider beyond a join link. The channel is configured in the admin dashboard  or over the admin REST API, and the agent can also be sent into a meeting from code.

*Verified against lua-cli 3.33.0.*

**Before you begin**

* A voice defined with `defineVoice` and pushed with `lua push voice`. The meeting uses the voice the channel names, or the agent's first voice.
* Access to the agent in the admin dashboard, or an API key with the scopes for what you do: `channels:manage` to configure the channel, `telephony:write` to join, mute, or change role, `telephony:read` to list sessions, and `telephony:manage` to remove the agent from a meeting.
* A public Google Meet, Zoom, or Microsoft Teams link for a meeting you may add a participant to.

<Steps>
  <Step title="Dashboard: configure the meeting channel">
    Each agent has one meeting configuration, created or updated with `PUT /admin/agents/<agentId>/channels/meeting`; only the fields you send change. `botName` is the participant name (default `Lua Agent`), `botAvatarUrl` a public image for its tile, `voiceId` the voice that speaks, and `voiceConfig.welcomeMessage` what it says on joining.

    `role` sets how the agent participates: `active_participant`, `expert_on_call`, `facilitator`, or `note_taker`. Omit it and the platform picks `active_participant` for one or two people and `facilitator` for three or more, switching as people join and leave. A summary is generated and stored for every meeting with a transcript; `autoDistributeSummary` (default `true`) controls only whether it is queued for distribution, and a `note_taker` distributes regardless. `memory` gives the agent a "previous meetings" block at the start: `{ "enabled": true, "scope": "meetingUrl" }` remembers earlier meetings at the same link (a recurring standup), `"scope": "channel"` all of the agent's meetings, with `lastN` summaries (default 3).
  </Step>

  <Step title="Invite the agent">
    From the admin dashboard, or with `POST /admin/agents/<agentId>/meetings/join` and `{ "meetingUrl": "https://meet.google.com/abc-defg-hij" }` (optionally `botName`), the agent joins the meeting and the call starts. From code, send it in with the voice runtime:

    ```ts theme={null}
    import { Voice } from 'lua-cli';

    const session = await Voice.call({
      to: { kind: 'meet', url: 'https://meet.google.com/abc-defg-hij' },
      voice: 'support-line',
      context: { agenda: 'Q3 roadmap review' },
    });
    ```

    The URL must be a public `http(s)` address; private and local hosts are refused with `meetingUrl must be a public http(s) URL`. The returned `callId` is the meeting participant's id, used to remove it later.
  </Step>

  <Step title="Steer the agent during the meeting">
    Participants address the agent by its name. "`<name>`, be quiet" or "hold on" mutes it for a minute, "okay, go ahead" unmutes, "are you there?" makes it speak next, "what do you think?" hands it the floor, and "you can leave now" or "thanks, that's all" ends its participation. The admin dashboard has the same controls over REST: `POST /admin/agents/<agentId>/meetings/<sessionId>/mute` with `{ "muted": true }`, `POST …/<sessionId>/role` with `{ "role": "note_taker" }`, and `DELETE …/meetings/<botId>` to remove it.
  </Step>

  <Step title="Verify">
    List the agent's meeting sessions, active or ended, with `GET /admin/agents/<agentId>/meetings?active=true`, and read one with `GET …/meetings/<sessionId>/full`, which returns the meeting session plus the call record with its transcript and summary. Meetings also appear as voice sessions in the call log.

    ```bash theme={null}
    lua logs --type calls
    ```
  </Step>
</Steps>

## Channel behavior

| Capability               | Supported                                                                                                                                                                                                                                                       |
| ------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Meeting providers        | Google Meet, Zoom, Microsoft Teams                                                                                                                                                                                                                              |
| Inbound                  | Live speech, transcribed with speaker attribution; `Lua.request.channel` is `meeting`                                                                                                                                                                           |
| Outbound                 | Speech through the agent's voice; no text, cards, or files in the meeting chat                                                                                                                                                                                  |
| Tools the model can call | Your agent's tools, plus `setMeetingMute`, `changeMeetingRole`, and `leaveMeeting` on meetings that run the platform's built-in voice path; a meeting that runs a `defineVoice` voice gets your tools only, and the voice commands and REST controls still work |
| Conversation scope       | One thread per meeting; the platform isolates every meeting's thread                                                                                                                                                                                            |
| After the meeting        | Transcript stored on the call record; a summary with overview, discussion points, decisions, action items with owners and due dates, and questions raised                                                                                                       |
| Summary delivery         | Stored and readable from the meeting session's full view; the email to the agent owner is recorded as skipped and not sent                                                                                                                                      |

## Limits

| Limit                            | Value                                                              |
| -------------------------------- | ------------------------------------------------------------------ |
| Meeting configurations per agent | 1                                                                  |
| Mute by voice command            | 60 seconds, then the agent may speak again                         |
| Auto role threshold              | 1 to 2 participants `active_participant`; 3 or more `facilitator`  |
| Previous meetings in memory      | `lastN`, default 3                                                 |
| Meeting length                   | `maxDurationSeconds` on the channel; when unset, no cap is applied |

## Troubleshooting

<AccordionGroup>
  <Accordion title="meetingUrl must be a public http(s) URL">
    The link points at a private network, a local host, or a non-HTTP scheme. Paste the public join link from the calendar invite.
  </Accordion>

  <Accordion title="The agent joins but never speaks">
    With three or more participants the default role is `facilitator`, which waits to be addressed. Say the agent's name, set `role` to `active_participant`, or change it live with the role endpoint.
  </Accordion>

  <Accordion title="Session has ended (409)">
    Mute and role changes work only while the agent is in the meeting. List meeting sessions with `active=true` to find the live one.
  </Accordion>
</AccordionGroup>

## Next steps

<Columns cols={2}>
  <Card title="About voice" href="/concepts/voice">How a voice definition, a channel, and a voice session fit together.</Card>
  <Card title="Voice runtime reference" href="/reference/sdk/voice-runtime">`Voice.call` targets, including meetings.</Card>
  <Card title="Voice calls" href="/channels/voice-calls">The same voice on a phone number.</Card>
  <Card title="Logs and debugging" href="/ship/logs-and-debugging">Read call and meeting records.</Card>
</Columns>
