Skip to navigation

Bot Status and Error Code Reference

Every status, webhook event, error reason and message a MeetStream bot can report, what it means, and what to do about it
View as Markdown

Use this page to turn any bot outcome into a cause and a fix. Look up the status, bot_event, ErrorReason or message you received, then follow the link in the What to do column.

Where to read these values

SourceWhat you get
GET /api/v1/bots/{bot_id}/status{ "bot_id", "status", "custom_attributes" }: the current status only.
GET /api/v1/bots/{bot_id}/detailbot_details.Status, bot_details.ErrorReason and bot_details.StatusTimeline. Each timeline entry is { "status": true, "timestamp", "message" }, keyed by stage name.
Webhooksevent, bot_event, bot_status, message, status_code, timestamp, and on Google Meet join failures failure_reason.
Dashboard bot detail pageThe status badge, the Bot status timeline with each stage’s message, and a friendly label for failures.
These values are not a closed enum

Statuses, bot_event names, ErrorReason codes and messages grow as MeetStream adds platforms and detection. Treat unknown values gracefully: log them, fall back to the generic handling for the event (for example, treat any unknown terminal as a failure you can retry), and never crash on a value you have not seen. Compare status strings case-insensitively, because some Google Meet paths write FAILED and ERROR in upper case.

The bot lifecycle

join_at admitted not admitted Zoom Zoom Scheduled Joining Cancelled Error InWaitingRoom Failed InMeeting Leaving RecordingPermissionAllowed RecordingPermissionDenied Stopped Kicked NotAllowed Denied MediaProcessing Done MediaExpired

The diagram is simplified: a scheduled bot can also be Cancelled before it starts or end in Error if it cannot be started, and a join can end early as Failed (the meeting blocked it) or Error. Recording is not drawn because it is recorded in the timeline without changing status (see below). Every platform writes Leaving immediately before the terminal status, except the Google Meet join blockers, which go straight from Joining to Failed.

What each status means

StatusDashboard labelTerminalPlatformsMeaning
ScheduledScheduledNoAllCreated with join_at or from a calendar. The bot starts shortly before the join time.
JoiningJoiningNoAllDispatched and opening the meeting. Immediate bots are Joining as soon as create_bot returns 201.
InWaitingRoomIn Waiting RoomNoAllThe bot has asked to join. Sent on every join, even when the host admits instantly, so do not treat it as proof of a lobby.
InMeetingIn MeetingNoAllAdmitted to the meeting.
RecordingRecordingNoAllRecording started. Written to StatusTimeline and sent as bot.recording, but status stays InMeeting (or RecordingPermissionAllowed on Zoom).
RecordingPermissionAllowedRecording Permission AllowedNoZoomThe host granted local recording permission. status keeps this value for the rest of the call.
RecordingPermissionDeniedRecording Permission DeniedNoZoomThe host denied recording or did not answer within recording_permission_denied_timeout. Always followed by Leaving and Stopped.
LeavingLeavingNoAllWritten right before every terminal status.
StoppedCompleted (list) / Stopped (timeline)YesAllClean exit: the meeting ended, an auto-leave timeout fired, you stopped the bot, or the bot lost the meeting. The message says which.
KickedKickedYesAllA participant removed the bot from the meeting. Webhooks carry bot_status: "Stopped" with bot_event: "bot.kicked".
NotAllowedNot Allowed (timeline: Not Admitted)YesAllThe bot was never admitted before waiting_room_timeout, or a join safety check gave up.
DeniedDenied (timeline: Rejected or Not Admitted)YesAllThe host rejected the join request. On Zoom, also used when Zoom refuses the bot’s account.
FailedFailedYesGoogle Meet, TeamsThe meeting itself blocked the join: invalid link, restricted access, not started, ended, or sign-in required.
ErrorErrorYesAllA sign-in, token, link-format or MeetStream-side problem stopped the bot.
FAILED, ERRORFailed, ErrorYesGoogle MeetUpper-case variants written by some Google Meet join paths. Handle them exactly like Failed and Error.
MediaProcessingMedia ProcessingNoAllThe post-call pipeline is preparing audio, video and transcripts.
DoneDoneYesAllPost-call processing finished.
MediaExpiredMedia ExpiredYesAllThe bot’s stored media was deleted, either by timed retention or with DELETE /api/v1/bots/{bot_id}/delete. A data_deletion webhook is sent.
CancelledCancelledYesAllA calendar-scheduled bot was cancelled before it joined: the event was deleted, you unscheduled it, or you disconnected the calendar.

create_bot returns "status": "Active" in its 201 body for immediate bots and "status": "Scheduled" for scheduled bots. Active is only a response value; the stored status of an immediate bot is Joining.

What happens to status after the call

  • Bots that were in the meeting (Stopped or Kicked) move to MediaProcessing, then Done.
  • Bots that never got in (NotAllowed, Denied, Failed, FAILED, ERROR) keep that status. They still get a bot.done webhook, whose bot_status repeats the join outcome (for example NotAllowed).
  • Bots that end in Error on Zoom or Teams currently also move to MediaProcessing and then Done, so their final status reads Done. To keep the real outcome, store the terminal webhook, or read the Error (Zoom) or Failed (Teams) entry in StatusTimeline and the ErrorReason from /detail.
  • The timeline also records post-call stages: AudioProcessing (“Processing Audio”), VideoProcessing (“Processing Video”), Uploading, TranscriptionReady (“Transcript Ready”) and Done.

Webhook mapping

Every status change becomes one webhook delivery. Terminal statuses all share event: "bot.stopped"; branch on bot_event (or bot_status) for the reason.

Statuseventbot_eventbot_status on the wire
Scheduledbot.scheduledbot.scheduledScheduled (payload adds scheduled_join_time)
Joiningbot.joiningbot.joiningJoining
InWaitingRoombot.in_waiting_roombot.in_waiting_roomInWaitingRoom
InMeetingbot.inmeetingbot.inmeetingInMeeting
Recordingbot.recordingbot.recordingRecording
RecordingPermissionAllowed (Zoom)bot.recording_permission_allowedsameRecordingPermissionAllowed
RecordingPermissionDenied (Zoom)bot.recording_permission_deniedsameRecordingPermissionDenied
Leavingbot.leavingbot.leavingLeaving
Stoppedbot.stoppedbot.stoppedStopped
Kickedbot.stoppedbot.kickedStopped
Deniedbot.stoppedbot.deniedDenied
NotAllowedbot.stoppedbot.notallowedNotAllowed
Failed, Error, FAILED, ERRORbot.stoppedbot.failedthe status as written
Post-call finishedbot.donebot.doneDone, or the join outcome for bots that never got in

On Google Meet, bot.recording is currently delivered only for bots created with a callback_url. The Recording entry is always written to StatusTimeline.

You may also receive informational post-call events bot.uploading and bot.transcriptionready (their bot_status equals the event name), and bot.error in two cases: a live transcription provider failed while the bot stays in the meeting (bot_status: "InMeeting"), or a scheduled bot was rejected when it tried to start (see scheduling reasons).

status_code in webhooks

status_code is a hint, not the outcome. Always branch on bot_event or bot_status.

bot_statusZoomGoogle MeetMicrosoft Teams
Stopped, Kicked (bot.kicked)200200200
NotAllowed, Denied500500500
Error (and FAILED, ERROR on Meet)500500500
Failednot used500, with failure_reason500
RecordingPermissionDenied500not usednot used
bot.done200200200

Message prefixes

MeetStream prefixes failure messages so you can route alerts without parsing the rest of the text:

  • Error: for Error, ERROR and FAILED (something broke: credentials, tokens, link format, or a MeetStream-side problem).
  • Failed: for NotAllowed, Denied and Failed (the meeting, host or lobby decided).
  • The prefix is never doubled, and messages that already start with Error: or Failed: are left as they are.

Error reasons by platform

ErrorReason is a stable PascalCase code on GET /api/v1/bots/{bot_id}/detail. Google Meet and Microsoft Teams bots set it for join failures and for unexpected exits. Zoom bots describe the cause in message instead, so the Zoom section below is keyed by message. The scheduling and safety-check reasons apply to every platform.

The dashboard shows a friendly label for failures (for example “Invalid meeting link” or “Bot not allowed to join meeting”) and hides internal-only codes. The API returns the code.

Scheduling and safety checks (all platforms)

Code · statusMessageWhat it meansWhat to do
ScheduledDispatchExhausted · ErrorScheduled dispatch did not start within the retry windowA scheduled bot could not be started within 20 minutes after its join time, because of a temporary MeetStream-side problem.Create a new bot without join_at if the meeting is still running. If it repeats, send the bot_id to support.
ScheduledDispatchRejected · ErrorThe rejection message from create_bot (see HTTP errors)At join time MeetStream re-checked the saved request and it failed with a 4xx, for example because the signed-in login pool was full or empty, a login domain or Zoom credentials were removed, or the link became invalid. A bot.error webhook is sent.Read the message in StatusTimeline.Error, fix the cause, and schedule a new bot.
InsufficientCredits · ErrorLow credits please rechargeA scheduled bot reached its join time while the pay-as-you-go balance was below the minimum. A bot.error webhook is sent.Add credits in Billing, then schedule a new bot.
JoinTimeout · NotAllowednone in the timelineThe bot stayed in Joining for about 60 minutes without reaching the lobby or the meeting, and a safety check closed it. You may not receive a terminal webhook for this case.Create a new bot. If you track bots by webhook, also poll /status for bots that stay in Joining for a long time.

Google Meet

Join blocked by the meeting. Status Failed, bot_event: "bot.failed", status_code: 500, and the webhook includes failure_reason.

Code · failure_reasonMessageWhat happenedWhat to do
InvalidMeetingLink · invalid_meeting_linkFailed: Invalid meeting linkMeet showed “Check your meeting code”, “Invalid video call name”, “Meeting not found” or “The video call wasn’t found”. Typo in the code, a deleted meeting, or a link that is not a Meet meeting.Use the https://meet.google.com/abc-defg-hij form and open it in a browser to confirm it works. See Google Meet.
MeetingRestricted · meeting_restrictedFailed: Meeting access is restrictedMeet showed “Access to this meeting is restricted”, “You don’t have permission to join” or “Only people invited by the organizer”. The meeting only admits people from the host’s organization or people on the invite.Use a signed-in bot from an allowed domain, or ask the host to relax meeting access. See lobby troubleshooting.
MeetingNotStarted · meeting_not_startedFailed: Meeting has not startedMeet showed “This meeting has not started”. The bot arrived before the meeting could be joined.Start the meeting first, or schedule the bot with join_at. See scheduling bots.
MeetingEnded · meeting_endedFailed: Meeting has endedMeet showed “This meeting has ended” or “Your meeting code has expired”. The meeting is over or the code expired.Check the link belongs to a current meeting.
SignInRequired · sign_in_requiredFailed: Sign in requiredMeet redirected the bot to Google sign-in: the meeting does not accept anonymous guests.Use a signed-in bot.
GoogleSignInFailed · google_sign_in_failedFailed: Configured Google sign-in failedA signed-in bot could not complete Google sign-in. The bot never falls back to joining as a guest.Check the login is active and the domain’s SSO settings match the signed-in bot guide.
CantJoinCall · cant_join_callStarts with Failed: You can't join this video callMeet showed “You can’t join this video call”, “meeting” or “call”. Google refused the guest join, even after MeetStream retried.Use a signed-in bot, confirm the meeting allows external guests, and retry later.

Lobby and host decisions.

Code · statusMessageWhat it meansWhat to do
WaitingRoomTimeout · NotAllowedFailed: Not admitted to meetingNobody admitted the bot within waiting_room_timeout (60 to 600 seconds, default 600). The bot withdraws its request when it leaves.Make sure someone who can admit is in the meeting and sees the request. See lobby troubleshooting, or use a signed-in bot.
HostDenied · DeniedFailed: Host denied joinMeet showed “You’ve been denied entry to this meeting” or “Someone in the call denied your request to join”.A person decided; ask the host to admit the bot next time.
JoinHang · NotAllowedStarts with Failed: The join page did not reach the lobby within about five minutes.Create a new bot. If it repeats for the same meeting, contact support.
Bot status timeline with Joining, In Waiting Room, Leaving and Not Admitted entries, final status NotAllowed after 10 minutes 23 seconds
A Google Meet bot that timed out in the lobby: the timeline shows In Waiting Room (1), then Not Admitted with the message Failed: Not admitted to meeting (2).

Temporary Google Meet errors. MeetStream retries these automatically (up to three attempts). If every attempt fails, the bot ends as Failed with a message ending in (after 3 attempts).

ErrorReasonMessageWhat to do
NetworkErrorFailed: Google Meet reported a network problem (after 3 attempts)Retry with a new bot.
MeetTransientErrorFailed: Google Meet reported a temporary error (after 3 attempts)Retry with a new bot.
BrowserUnstableFailed: Browser or display became unstable during join (after 3 attempts)Retry with a new bot.

MeetStream-side join errors. Status FAILED or ERROR, usually with the message Failed: Could not join meeting or a short detail. These are not caused by your request.

JoinFailed, JoinButtonTimeout, ClickJoinFailed, MeetingNotLoaded, NavigateFailed, ServicesInitFailed, BrowserInitFailed, JoinFlowException, FillDisplayNameFailed, WaitForMeetingFailed, BrowserPageLost.

What to do: create a new bot. If the same meeting fails repeatedly, send the bot_id to support.

Exits during the meeting. The bot was in the meeting, so the recording up to that point is processed normally.

Code · statusMessageWhat it means
MeetingEndedByHost · StoppedMeeting endedMeet showed that the meeting ended.
KickedByHost · KickedBot was removed from the meeting by a participantSomeone removed the bot.
ConnectionLost · StoppedBot lost network connection to Google MeetMeet reported a lost connection.
LeftVoluntarily · StoppedBot left the meetingMeet showed that the bot left.
MediaConnectionsLost · StoppedBot lost media connections to Google MeetAudio stopped arriving from Meet.
MeetOffDomain · StoppedBot is no longer on a Google Meet URLThe meeting page navigated away from Google Meet.
MeetingExitUnknown · StoppedBot left the meeting (post-call screen)Meet showed its post-call screen without a specific cause.

Automatic-leave exits on Google Meet use Stopped without an ErrorReason: Bot exited the call: No one joined the meeting, Bot exited the call: Everyone left the meeting, Bot exited the call: Voice inactivity for Ns (threshold: Ns), and Bot exited the call: Only other bots remain (...) with the matched names. See automatic leave.

Microsoft Teams

Lobby, host and meeting decisions.

Code · statusMessageWhat it meansWhat to do
WaitingRoomTimeout · NotAllowedFailed: Bot not allowed to join meetingNobody admitted the bot from the lobby within waiting_room_timeout (60 to 1800 seconds, default 1200). Teams has no separate “meeting not started” signal, so a meeting nobody starts also ends here.Admit the bot, or have the organizer change Who can bypass the lobby in the meeting options (anonymous guests bypass only when it is set to Everyone). See Microsoft Teams and signed-in Teams bots.
JoinHang · NotAllowedFailed: Bot not allowed to join meetingThe join did not complete within waiting_room_timeout. Handle it like WaitingRoomTimeout.Same as above.
HostDenied · DeniedFailed: Denied to join meetingTeams showed that the request was declined or not admitted.A person decided; ask the organizer to admit the bot.
KickedByHost · KickedBot was removed from the meeting by a participantTeams showed “You’ve been removed from this meeting”.Nothing to fix in code.
MeetingRestricted · FailedFailed: Meeting access is restrictedTeams showed that the bot does not have permission to join.Use a signed-in bot from an allowed tenant, or ask the organizer to allow the bot.
InvalidMeetingLink · FailedFailed: Invalid meeting linkTeams could not find a meeting for the link.Copy the full join link from the invite. See supported link formats.

Sign-in walls and signed-in bots.

Code · statusMessageWhat it meansWhat to do
TeamsSessionNotApplied · ErrorError: Teams signed-in session was not applied to the meetingTeams asked the bot to sign in (“sign in to join this meeting”, “only people in the organization can join”) or showed a guest name field to a signed-in bot. This also happens to anonymous bots when the organizer’s tenant does not allow anonymous join.For anonymous bots, the organizer’s tenant admin can turn on Anonymous users can join a meeting (Teams admin center, Meetings > Meeting settings, and the meeting policy of the same name; see Microsoft’s lobby settings), or you can use a signed-in bot. For signed-in bots, check the login and retry.
TeamsSessionAuthFailed · ErrorError: Teams browser session authentication failedTeams showed “We couldn’t authenticate you” or “app failed to init”.Retry. For signed-in bots, check the account in the signed-in guide.
TeamsAppInitFailed · ErrorStarts with Error: A signed-in bot kept seeing “app failed to init” after two automatic retries.Retry with a new bot.
TeamsLoginBadCredentials · ErrorStarts with Error: Teams sign-in failed: Microsoft rejected the password. MeetStream never retries a wrong password and marks the login inactive.Update the password, then reactivate the login in Integrations > Teams Bots.
TeamsLoginAccountDisabled · ErrorStarts with Error: Teams sign-in failed: The Microsoft account is disabled. The login is marked inactive.Re-enable the account in your tenant, then reactivate the login.
TeamsLoginMfaRequired · ErrorStarts with Error: Teams sign-in failed: Microsoft asked for more information (multifactor authentication). MFA is not supported for bot accounts.Exclude the bot account from MFA as described in the signed-in guide.
TeamsLoginVerificationRequired · ErrorStarts with Error: Teams sign-in failed: Microsoft asked the account to verify its identity.Complete verification for the account once in a browser, then retry.
TeamsLoginUnknownPage · ErrorStarts with Error: Teams sign-in failed: Sign-in stopped on a page MeetStream does not recognize (for example a new prompt from your tenant).Sign in to the account once in a browser to clear any prompt, then retry.
TeamsAppSessionNotEstablished · ErrorStarts with Error: Teams sign-in failed: Sign-in succeeded but Teams did not open a session.Confirm the account has a Teams license, then retry.
TeamsCredentialsFetchFailed, TeamsSignInBrowserFailed · ErrorStarts with Error: Teams sign-in failed: MeetStream-side sign-in problem.Retry with a new bot.

MeetStream-side join errors.

Code · statusMessageWhat to do
JoinButtonTimeout · ErrorError: Join on web timeout after 3 attemptsThe Teams pre-join screen did not load in three attempts. Check the link opens in a browser, then retry.
JoinFlowException · ErrorStarts with Error: Retry with a new bot.
TeamsInternalWebSocketUnavailable · ErrorStarts with Error: Retry with a new bot. The bot stopped before clicking Join.
ChromeDriverDead, JoinInputInfraFailed · ErrorStarts with Error: MeetStream may retry the join automatically. If this is the final reason on the bot, create a new bot.
JoinRetryExhausted · FailedStarts with Failed: Join failed afterSeveral automatic join attempts failed. Create a new bot and contact support if it repeats.

Normal Teams exits use Stopped without an ErrorReason: Bot exited the call: Meeting was ended by the host, Bot exited the call: Everyone left the meeting, Bot exited the call: Voice inactivity timeout, Bot stopped via API request, and Bot exited the call.

Zoom

Zoom bots report the cause in message. Match on the text after the prefix.

Admission and permissions.

StatusMessageWhat it meansWhat to do
NotAllowedFailed: Not admitted to meetingThe bot was not admitted within waiting_room_timeout (60 to 1200 seconds, default 600). The same timer covers a host who never starts the meeting, so this can also mean the meeting never began.Admit the bot, start the meeting on time, or let participants join before the host. See Zoom.
DeniedFailed: Zoom account is restricted and not allowed to join this meetingZoom refused the join for the bot’s account.Check the meeting allows guests, or join as a Zoom user with zoom.zak_url. See Zoom authenticated bots.
KickedBot was removed from the meeting by a participantSomeone removed the bot.Nothing to fix in code.
RecordingPermissionDenied, then StoppedFailed: Recording permission denied by host, then Bot exited the call: Recording permission denied by hostThe host clicked deny on the recording request. MeetStream does not ask again.Ask the host to allow recording, or join with zoom.zak_url as a user who can record.
RecordingPermissionDenied, then StoppedFailed: Recording permission timeout, then Bot exited the call: Recording permission timeoutThe host did not answer within recording_permission_denied_timeout (60 to 300 seconds, default 60).Raise the timeout, or ask the host to watch for the prompt.

The meeting could not be joined. These end as Stopped (not a failure status), so check the message.

MessageWhat it meansWhat to do
Meeting not yet startedZoom reported that the meeting has not started. The bot stops immediately instead of waiting.Start the meeting first, allow join before host, or schedule with join_at.
Meeting does not exist or host has not started it yetZoom could not find a running meeting for that ID.Check the meeting ID and that the meeting is live.
Unable to join external meetingZoom refused because the meeting belongs to a different Zoom account than your Meeting SDK app. Zoom requires apps to authorize joins outside their own account.Pass zoom.obf_url or zoom.zak_url. See Zoom authenticated bots.
Meeting failedZoom rejected the join for a reason MeetStream does not map yet.Check the passcode in the link (?pwd=), the meeting state, and retry.

The meeting ended. Status Stopped.

MessageWhat it means
Meeting ended by hostThe host ended the meeting for everyone.
Meeting ended - host never joinedZoom ended a join-before-host meeting because the host never arrived.
Meeting ended - host started another meetingThe host started a different meeting, which ended this one.
Meeting ended - free meeting time limit reachedThe host’s Zoom plan time limit ended the meeting.
Meeting disconnected before Zoom emitted an ended statusThe connection closed without an end reason from Zoom.
Meeting endedAny other end reason.

Automatic leave and API stops. Status Stopped: Bot exited the call: Voice inactivity timeout, Bot exited the call: Everyone left the meeting, Bot exited the call: Maximum recording time reached, Bot exited the call: only other bots remain (bot_detection.using_participant_names), Bot stopped via API request, and Bot exited the call. See automatic leave.

Errors. Status Error, bot_event: "bot.failed".

MessageWhat it meansWhat to do
Error: Failed to join meeting: Invalid meeting_link formatThe link has no /j/<meeting-id> path. Personal links (/my/), webinar links (/w/), /s/ and /wc/join/ links are accepted by the API but cannot be joined yet.Use https://zoom.us/j/<meeting-id>?pwd=<passcode>. See supported links.
Error: Failed to join meeting: ZAK token is required but could not be fetchedYour zoom.zak_url did not return a token within 15 seconds, returned an error, or returned an unreadable body. There is no fallback to a guest join.Check your token server. See Zoom authenticated bots.
Error: Failed to join meeting: OBF token is required but could not be fetchedSame, for zoom.obf_url.Check your token server and that the authorizing user is in the meeting.
Error: Failed to join meeting: JoinMeeting failed with code NZoom rejected the join request with an SDK error code.Check the meeting ID and passcode, then retry.
Error: Failed to connect to meetingThe bot could not connect within 60 seconds. A wrong or missing passcode is a common cause.Copy the link with its ?pwd= passcode from the invite.
Error: Zoom authentication failed with result: NZoom rejected your app’s Meeting SDK credentials.Re-enter the Client ID and Client Secret in Integrations > Zoom. See Zoom Marketplace app setup.
Error: Failed to start recording, Error: Zoom SDK initialization error: ... and other Error: messagesMeetStream-side problem.Retry with a new bot; contact support with the bot_id if it repeats.

HTTP errors from create_bot

These come back synchronously, before a bot exists, so no status or webhook is created. The body is { "message": "..." } unless noted. See Errors for the general API error model.

HTTPMessage or bodyWhenWhat to do
400meeting_link host 'acme.example.com' is not a supported meeting platform. Expected Google Meet (meet.google.com), Zoom (*.zoom.us / *.zoomgov.com), or Microsoft Teams (teams.microsoft.com / teams.live.com / *.teams.microsoft.us), or WhatsApp Calls (call.whatsapp.com).The host is not a supported platform.Use a Zoom, Google Meet or Teams join link. See supported platforms.
400meeting_link looks like the GMeet site root or a marketing page, not a meeting URL: '...' (the platform name varies: GMeet, Zoom, Teams, WhatsApp)The link is a site root or a page such as /signin, /login, /download.Copy the meeting’s join link.
400meeting_link must use http:// or https://.The link uses another scheme, such as zoommtg://.Use the web join link.
400Zoom bots require a connected Zoom app or Zoom credentials in the user profileNo Zoom Meeting SDK credentials are configured.Add your Client ID and Secret in Integrations > Zoom. See Zoom Marketplace app setup.
400Pass only one of zoom.zak_url or zoom.obf_url, not both, zoom.zak_url must use https, zoom.zak_url and zoom.obf_url are only supported for Zoom meetingsInvalid Zoom token settings.See Zoom authenticated bots.
400waiting_room_timeout for GMeet must not exceed 600 seconds (got 900) and similar range messagesAn automatic_leave value is out of range.Use the per-platform ranges.
400google_meet.google_login_domain '...' is not registered. Register it via the admin Google login domains API first.Signed-in Google Meet bot for an unregistered domain.Register the domain. See Google signed-in bots.
400teams.teams_login_domain '...' is not registered. Register it via the admin Teams login domains API first.Same, for Teams.See Teams signed-in bots.
400teams.login_required is not supported for personal Teams (teams.live.com) linksSigned-in bots only work for work or school Teams meetings.Remove teams.login_required, or use a teams.microsoft.com link.
400join_at must be in the futurejoin_at is in the past.Send a future time in ISO 8601.
400Invalid join_at format: Cannot schedule bot more than 90 days (3 months) in the future. Requested schedule is N days in the future.join_at is more than 90 days ahead.Schedule closer to the meeting.
403{"message": "Forbidden"}Missing or invalid API key.Send Authorization: Token YOUR_API_KEY. See Errors.
403{"error": "Low credits please recharge", "available_credits": 0.12, "minimum_required": 0.175}Pay-as-you-go balance is below 30 minutes of usage.Add credits in Billing.
403{"error": "Low credits please recharge", "active_bots": 1}Balance under $1 and a bot is already running.Add credits, or wait for the running bot to finish.
403google_meet.google_login_domain '...' is not registered to this account, or the same for teams.teams_login_domainThe domain belongs to another MeetStream account.Use a domain registered to your account.
404teams.sign_in_email '...' not found under this domainThe pinned Teams login does not exist.Check teams.sign_in_email, or omit it to auto-pick.
409teams.sign_in_email '...' is currently in use or ... has been deactivated; rotate its password or add accountsThe pinned Teams login is busy or inactive, and strict_email is true.Wait, reactivate the login, or set strict_email: false.
409{"message": "deduplication_key already bound to a different meeting", ...}A deduplication_key was reused for another meeting link.See deduplication.
429All Teams logins under domain '...' are currently in useEvery Teams login is serving a bot (one bot per login at a time).Add more logins or retry later.
429All N active logins under domain '...' are at capacity (30 active sessions each), No active Google logins are registered under domain '...', Requested sign_in_email '...' is not a registered active login under domain '...'No Google login could be allocated.Add or activate logins, or relax sign_in_email / strict_email.
507{ "bot_id", "transcript_id": null, "meeting_url", "status" }Replay of a request with the same Idempotency-Key.Treat as success; no new bot was created. See Errors.

For scheduled bots, the signed-in login checks run again at join time. If they fail then, the bot ends as Error with ErrorReason: "ScheduledDispatchRejected" instead of returning an HTTP error.

Errors from in-meeting commands

Commands such as send message, send image, pause and resume go to a running bot.

HTTPBodyWhen
400{"error": "Command 'screenshot' is not supported on zoom bots.", "code": "unsupported_command", ...}The platform does not implement that command. Zoom has no screenshot command; WhatsApp calls do not support chat, images or screenshots.
409{"error": "Bot is not currently in a meeting.", "bot_status": "InWaitingRoom", "detail": "..."}The bot is not in the meeting yet (or has left). Pause and resume also need the bot to be admitted.
409pause or resume when already paused or resumedNothing to do; the recording is already in that state.