- A voice defined with
defineVoiceand pushed withlua 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:manageto configure the channel,telephony:writeto join, mute, or change role,telephony:readto list sessions, andtelephony:manageto remove the agent from a meeting. - A public Google Meet, Zoom, or Microsoft Teams link for a meeting you may add a participant to.
1
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).2
Invite the agent
From the admin dashboard, or with The URL must be a public
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: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.3
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.4
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.Channel behavior
Limits
Troubleshooting
meetingUrl must be a public http(s) URL
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.
The agent joins but never speaks
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.Session has ended (409)
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.Next steps
About voice
How a voice definition, a channel, and a voice session fit together.
Voice runtime reference
Voice.call targets, including meetings.Voice calls
The same voice on a phone number.
Logs and debugging
Read call and meeting records.

