Scheduling Bots
Future joins, calendar-driven scheduling, and full auto-join
Put a bot in a meeting that has not started yet. There are three ways, from simplest to most automated:
join_at: one API call, one future meeting- Calendar event scheduling: schedule against synced Google or Outlook calendar events, with recurring support
- Auto-join: every meeting on a connected calendar gets a bot automatically
Platform support
Early joining means the bot is usually in the lobby when the meeting starts. If the host is late, the bot waits up to waiting_room_timeout (see automatic leave) and then ends as NotAllowed. See the capability matrix for per-platform limits.
1) One-off scheduling with join_at
Add an ISO 8601 timestamp to any create_bot request:
Response (201):
Rules for join_at:
In the dashboard’s API Playground, the Schedule step sets join_at for you:

What happens next:
- A
bot.scheduledwebhook fires immediately (bot_statusScheduled, payload carriesscheduled_join_time). bot.joiningfires when the bot is dispatched, about 2 minutes beforejoin_at.- Without webhooks, poll
GET /api/v1/bots/{bot_id}/status. It showsScheduleduntil then.
CLI: meetstream bot create <link> --join-at 2026-12-20T20:00:00Z.
Change or cancel a scheduled bot
Only bots that are still Scheduled can be changed; an active bot returns 400. CLI: meetstream calendar reschedule <bot-id> <iso8601> / meetstream calendar cancel <bot-id>.
2) Calendar event scheduling
Once a Google Calendar or Outlook Calendar is connected, MeetStream syncs events and finds Google Meet, Zoom and Microsoft Teams links in them. Schedule a bot for any synced event:
bot_config takes the same fields as the create_bot body.
Transcripts for calendar bots. Calendar-scheduled bots (this endpoint and auto-join) record the meeting. To get a transcript, call POST /api/v1/bots/{bot_id}/transcribe after audio.processed or bot.done. To transcribe during the meeting, create the bot with create_bot and join_at (section 1).
Recurring meetings
occurrence_date: schedule one specific occurrenceschedule_all_occurrences: true: schedule every occurrence (capped byoccurrence_limit, default 52)recurring_event: true: when the bot for one occurrence is dispatched, MeetStream schedules a bot for the next occurrence- You choose auto-rescheduling when you schedule the event. To change it for a scheduled event, unschedule the event and schedule it again
- Standard iCalendar RRULEs are supported: daily, weekly, bi-weekly, monthly, yearly
When the calendar changes
MeetStream listens for calendar changes (Google push notifications and Microsoft Graph subscriptions) and renews those subscriptions automatically:
- Meeting rescheduled: the bot’s join time moves with it.
- Meeting cancelled or deleted: the schedule is deleted and the bot is marked
Cancelled. - Meeting link changed: the scheduled bot keeps the old link. Update it with
PATCH /api/v1/calendar/scheduled_bots/{bot_id}and a newmeeting_link, or cancel and schedule again.
Unscheduling: DELETE /api/v1/calendar/schedule/{event_id}, optionally with cancel_all_occurrences: true or from_date for a series.
3) Full auto-join
Turn on auto-scheduling and every upcoming meeting with a meeting link gets a bot:
Mechanics worth knowing:
- Events starting in the next 24 hours are scheduled by a daily job (midnight UTC) and again whenever the calendar changes.
- Auto-join covers every synced event with a meeting link that starts in the next 24 hours, including events that you declined and events that you do not own. To choose events by RSVP, organizer or attendees, keep auto-join off and schedule events one at a time.
- Only Google Meet, Zoom and Microsoft Teams links are joined.
- An event that already has a scheduled bot is skipped, so auto-join composes safely with manual scheduling.
- If you omit
default_bot_config, bots are namedMeetStream Calendar Botand record audio only. - To transcribe an auto-joined bot, call
POST /api/v1/bots/{bot_id}/transcribeafter the meeting. - Override any individual meeting by scheduling it manually with a custom
bot_config. - Disable with
POST /api/v1/calendar/auto-schedule/disable; inspect withGET /api/v1/calendar/auto-schedule/settings. - Auto-join uses your account’s first active API key. With no active key, nothing is scheduled.
CLI: meetstream calendar auto-join on|off [-n name] [--video]. There’s also an Auto-schedule bots toggle on the dashboard’s Calendar page:

Never double-book a meeting
Scheduling and deduplication are designed to compose:
- Scheduling the same event twice returns
409with"error": "A bot is already scheduled for this event", the existingbot_idand a hint. Change the existing bot withPATCH /calendar/scheduled_bots/{bot_id}instead. - A
deduplication_keyworks insidebot_configon calendar scheduling and oncreate_botwith a futurejoin_at: a repeat returns the existing bot (200), and a key reused for a different meeting URL returns409. - To retry the create call safely, use an
Idempotency-Keyheader: a repeat returns507with the original bot and creates nothing new.
Troubleshooting
- Status
Failedwith error reasonScheduledDispatchExhausted? MeetStream could not start the scheduled bot within 20 minutes of its join time. If the meeting is still running, create a new bot withoutjoin_at. See bot status and error codes. - The bot went to the old link after the invite changed? The link was updated in the calendar after the bot was scheduled. PATCH the new
meeting_linkonto the scheduled bot. - The bot ended as
NotAllowed? Nobody admitted it withinwaiting_room_timeout. See your platform guide: Zoom, Google Meet, Microsoft Teams.
Next steps
- Google Calendar OAuth Setup · Outlook Calendar Setup
- Deduplication & Idempotency Keys
- Webhooks and events:
bot.scheduledand the full lifecycle
