Automatic Leave Configuration
Set automatic_leave on create_bot to decide when the bot gives up on the lobby, leaves an empty or silent meeting, or leaves when only other notetakers remain. This page lists every setting, its range and default, and exactly which platforms honor it today.
How it works
- Every setting lives under
automatic_leavein the body ofPOST /api/v1/bots/create_bot. You can also change it on a scheduled bot withPATCH /api/v1/calendar/scheduled_bots/{bot_id}. - Values are whole seconds. Booleans and numeric strings are rejected.
- Out-of-range values return
400with a specific message, for examplewaiting_room_timeout for GMeet must not exceed 600 seconds (got 900)oreveryone_left_timeout must be at least 60 seconds (got 30). - If you omit a field, the default below applies. Whichever timeout fires first ends the session.
- Every automatic exit is a normal leave: you get
bot.leaving, then a terminalbot.stopped(orbot_event: "bot.notallowed"for the lobby timeout), and the post-call pipeline runs as usual.
Ranges and defaults
On WhatsApp calls, everyone_left_timeout defaults to 0 (off) and also accepts 0, because WhatsApp does not report reliable presence. Use call_end_grace_seconds instead.
Which settings each platform honors today
Not every setting is enforced on every platform yet. The API accepts and validates all of them on every platform, so a 201 does not mean the setting will act. Check this table before relying on a setting as a safety net.
Need a hard maximum length on every platform today? Stop the bot yourself with Remove Bot from your own scheduler, for example at the meeting’s end time plus a margin. On Zoom, turn on video_required or separate streams if you want in_call_recording_timeout enforced.
Setting details
waiting_room_timeout
How long the bot waits to be admitted before it gives up, withdraws its request and ends as NotAllowed (webhook event: "bot.stopped", bot_event: "bot.notallowed").
bot.in_waiting_roomfires on every join, even when the host admits the bot instantly, so its arrival does not prove there is a lobby.- Use a shorter value for ad-hoc bots so a request nobody will answer does not linger. Use a longer value for scheduled bots where the host may start a few minutes late.
- On Zoom, a meeting that the host never starts also ends as
NotAllowedwhen this timer expires. If Zoom reportsMeeting not yet started, the bot stops immediately instead. - On Google Meet, a meeting that has not started ends as
FailedwithErrorReason: "MeetingNotStarted", not on this timer. - Troubleshooting: Google Meet lobby and admission, Zoom, Microsoft Teams.
no_one_joined_timeout
How long the bot stays in a meeting that nobody else has joined. Enforced on Google Meet only. On Teams, set everyone_left_timeout instead: it also fires when nobody ever joined. On Zoom, see the gap described above.
everyone_left_timeout
How long the bot stays after the other participants leave. If you also use bot detection, this is your safety net for the case where the notetakers leave too.
voice_inactivity_timeout
How long the bot tolerates silence while people are still connected, for example when attendees walk away but keep the call open. The API only forwards the field when you set it; otherwise the bot applies 600 seconds. Voice inactivity is independent of who is in the meeting.
in_call_recording_timeout
The maximum session length, from 10 minutes to 5 hours. Treat it as a failsafe. See the per-platform table above: today it is enforced on Zoom only, and only for bots that capture video or separate streams.
recording_permission_denied_timeout (Zoom only)
When a Zoom bot cannot record right away, it asks the host for recording permission once and waits this long.
- Host allows:
bot.recording_permission_allowed, thenbot.recording. - Host denies:
bot.recording_permission_denied(Failed: Recording permission denied by host),bot.leaving, thenbot.stoppedwithBot exited the call: Recording permission denied by host. - No answer in time:
bot.recording_permission_denied(Failed: Recording permission timeout),bot.leaving, thenbot.stoppedwithBot exited the call: Recording permission timeout.
The bot does not ask again after a denial. The field is validated on every platform (60 to 300) but only Zoom uses it.
Bot detection: leave when only other bots remain
everyone_left_timeout never fires while another vendor’s notetaker is still in the call, because the meeting is not empty. Without bot detection, your bot keeps recording silence or crosstalk between notetakers, and you keep paying for those minutes. Bot detection is opt-in and works on Zoom, Google Meet and Microsoft Teams with the same payload.
How it works
You give the bot a list of name keywords. Once the bot has been in the meeting for activate_after seconds, it checks the participant list. When every other participant’s display name contains at least one keyword, it starts a timeout-second countdown. If a person without a matching name joins, the countdown is cancelled. If the condition still holds when the countdown ends, the bot leaves.
The bot never matches itself. It recognizes its own entry in the participant list by identity, not by name, so a bot named MeetStream Notetaker is safe even with notetaker in matches.
Example
In plain English: five minutes after admission, start watching the participant list. As soon as everyone else looks like a notetaker, wait 30 seconds, and leave if nothing changes.
Fields
automatic_leave.bot_detection accepts one mechanism, using_participant_names. Any other key (for example using_participant_events or silence_detection) returns 400 with automatic_leave.bot_detection contains unsupported keys: [...].
Omit bot_detection, or send {}, to turn it off. The other automatic_leave settings keep working either way.
Example timeline
With activate_after: 300 and timeout: 30, and the bot admitted at 0:02:
How the exit is reported
The exit is a normal Stopped, never bot.kicked, bot.denied or bot.failed, and recording, transcription and bot.done follow as usual. To attribute the exit, look for the text only other bots remain (compare case-insensitively):
Choosing matches
A good starting list:
- Match the name people see. Most notetakers join with names like “Otter.ai Notetaker” or “Fathom AI Notetaker”, so either the brand (
otter) or the role (notetaker) works. - Substrings, not exact names.
ottermatches “Otter.ai Notetaker”, “OtterPilot” and “otter-bot”. - No regular expressions. Characters like
.,:and;match literally. - Avoid short fragments.
aiwould match a person named “Ainsley”. Preferread.aiorotter.ai. - Non-Latin names. Matching works on any script, but the keyword must appear in the name exactly as the platform shows it.
Tuning activate_after and timeout
Err on the side of larger values. A bot that stays too long is caught later by the other timeouts; a bot that leaves while people are still talking loses the recording.
Google Meet notes
- Meet can show a participant as “Unknown” for the first seconds after they join. An unnamed participant does not match, so the bot waits until names settle.
- If you send two of your own bots to the same meeting at the same moment, keep
activate_afterat 300 or more so each bot has reliably identified itself before the check starts. If a bot cannot yet tell which entry is its own, it skips the check rather than leave.
Putting them together
Updating a scheduled bot
PATCH /api/v1/calendar/scheduled_bots/{bot_id} accepts automatic_leave and validates it with the same rules as create_bot. The patch replaces the whole automatic_leave object, so send every setting you want to keep. To turn off bot detection on a scheduled bot, send your full automatic_leave object without bot_detection. Changes apply the next time the bot starts; there is no way to change settings while a bot is already in a meeting.
Troubleshooting
Why did my bot leave too early?
- Check the
messageonbot.stopped(or in the dashboard timeline) to see which rule fired. The error reference lists every message. - For bot detection, a keyword is probably too broad. Remove short fragments and raise
activate_afterortimeout. - For voice inactivity on a quiet meeting, raise
voice_inactivity_timeout(the default is 600 seconds even if you never set it).
Why is my bot still in the meeting when only notetakers remain?
- Check that you set
bot_detection: it is off by default.GET /api/v1/bots/{bot_id}/detailreturns the stored request inRequestPayload. - Check the notetakers’ names actually contain one of your keywords.
- Check that
activate_afterhas passed. If the people left before then, the check starts atactivate_after.
Why is my Zoom bot alone in a meeting and not leaving?
On Zoom, no_one_joined_timeout is not enforced, and everyone_left_timeout only starts after someone leaves. If the bot joined a meeting nobody else attended, stop it with Remove Bot.
FAQ
Is bot detection on by default? No. Bots without automatic_leave.bot_detection never check names.
Does it cost extra? No. It usually saves money, because the bot stops recording sooner.
Does it work in breakout rooms? No. The bot stays in the main meeting and checks only the main meeting’s participants.
Will the post-call transcript still be generated? Yes. Automatic exits are normal leaves, so audio, video, transcription and bot.done follow as usual.
Related
- Bot status and error code reference: every exit status and message.
- Meeting platforms supported: what each platform supports.
- Webhooks and events: the
bot.leavingandbot.stoppedevents. - Scheduling bots: scheduled bots and the PATCH endpoint.
