Bot Sub Codes

Sub codes are a field (sub_code) added to certain bot status change events to provide extra context.

Here's an example of a status change object structure:

{
  "code": "call_ended",
  "sub_code": "bot_kicked_from_call", // machine readable
  "message": "The bot was kicked from the call.", // human readable description of the sub_code
  "created_at": "2023-04-28T08:51:37.741790Z"
}

Here, we can interpret this status change as follows:

  • Code: call_ended - The status change event category (Call Ended)
  • Sub Code: bot_kicked_from_call - The underlying reason for the status change (sub code

Sub Code Types

Currently there are 3 distinct sub code categories:

Sub Code TypeEventPlatforms
Call Endedcall_endedAll
FatalfatalAll
Recording Permission Deniedrecording_permission_deniedZoom

Note: Platform specific sub_codeis prefixed with platform name (e.g zoom_sdk_credentials_missing)

🚧

We may add additional sub_codes

You should not treat the sub_code as an enum, as we may add values in the future without prior notice. We will never remove values without notifying all our customers and a long depreciation period, as we consider removing values a breaking change.

Recording Permission Denied Sub Codes

Since Zoom bots have a few extra requirements to meet for recording, there are more places that bots can run into trouble.

When a bot fails to record in a Zoom call, the recording_permission_denied webhook event will include a Zoom-specific sub code that provides more context into the reason it failed.

These sub_code will be added to the recording_permission_denied event.

Sub CodeDescription
zoom_local_recording_disabledThe meeting host has their global user-level local recording setting disabled. More info

The host was not presented with the recording consent popup.
zoom_local_recording_request_disabledThe meeting host has their user-level local recording setting enabled, but the has disabled the advanced recording option labelled "Hosts can give meeting participants permission to record locally". More info

The host was not presented with the recording consent popup.
zoom_local_recording_request_disabled_by_hostThe meeting host has disabled participants from requesting local recording permission or has denied all future requests. More info

The host was not presented with the recording consent popup.
zoom_bot_in_waiting_roomThe bot is in the waiting room due to which local recording cannot be requested.

The host was not presented with the recording consent popup.
zoom_host_not_presentThe host was not present in the meeting when the bot requested local recording permission.

This only occurs in very rare cases where the bot ​does​ request permission when the host isn't present. One example is when a host leaves/disconnects right as the bot requests permissions.
zoom_local_recording_request_denied_by_hostThe host denied the bot's local recording request.

The host was presented with the recording consent popup.
zoom_local_recording_deniedThe request to record was denied by the user.

This indicates that the user has local recording disabled in their global user settings, the recording request popup was presented and denied, or that the popup was presented but the request time out.
zoom_local_recording_grant_not_supportedThe meeting host is using Zoom Web client or a Zoom Room to host the meeting which does not support local recording permission.
zoom_sdk_key_blocked_by_host_adminThe Zoom SDK key used by the bot is blocked by the Zoom user's workspace admin.

Call Ended Sub Codes

The call_ended event signifies that a bot left, or was removed from, the call.

Recall attaches a sub_code to these events to expose the underlying reason why the bot is no longer in the call. This can be for obvious reasons such as the host ending the call (call_ended_by_host), but sometimes its less obvious why a bot left a call.

Below is a list of all call ended sub codes and what they mean.

Sub CodeDescription
call_ended_by_hostThe call has been ended by the meeting host.
call_ended_by_platform_idleThe call has been ended by the meeting platform, because it was idle.
call_ended_by_platform_max_lengthThe call has been ended by the meeting platform because it reached the maximum meeting length.
call_ended_by_platform_waiting_room_timeoutThe bot could not join the call because meeting platform's maximum waiting room time exceeded.

For Google Meet, this is 10 minutes. Zoom and Teams don't have a timeout.
timeout_exceeded_waiting_roomThe bot left the call because it was in the waiting room for too long.

This is the timeout specified by automatic_leave.waiting_room_timeout.
timeout_exceeded_noone_joinedThe bot left the call because nobody joined the call for too long.
timeout_exceeded_everyone_leftThe bot left the call because everyone else left.
timeout_exceeded_silence_detectedThe bot left the call because all other participants were likely bots based off continuous silence detection heuristic.
timeout_exceeded_only_bots_detected_using_participant_namesThe bot left the call because all other participants were likely bots based off participant names heuristic.
timeout_exceeded_only_bots_detected_using_participant_eventsThe bot left the call because all other participants were likely bots based off participant events heuristic.
timeout_exceeded_only_bots_in_callThe bot left the call because all other participants were likely bots.
timeout_exceeded_in_call_not_recordingThe bot left the call because it never started recording e.g. remained in the in_call_not_recording state for longer than automatic_leave.in_call_not_recording_timeout
timeout_exceeded_in_call_recordingThe bot left the call because it exceeded the timeout set in automatic_leave.in_call_recording_timeout .
timeout_exceeded_max_durationPay-as-you-go only: The bot exceeded its maximum duration.
bot_kicked_from_callThe bot was removed from the call by the host.
bot_kicked_from_waiting_roomThe bot was removed from the waiting room by the host.
bot_received_leave_callThe bot received leave call request.

Fatal Sub Codes

When a bot hits a fatal error, a fatal event is emitted with an attached sub_code that provides more context. Below is a list of possible fatal sub codes, their meaning, and any recommended action to take, if any.

sub_codeMessageRecommended action
bot_erroredThe bot ran into an unexpected error.
meeting_not_foundNo meeting was found at the given link.
meeting_not_startedThe meeting has not started yet.
meeting_requires_registrationThe meeting requires registration.Currently not supported for MS Teams.

For Zoom, see Registration-Required Meetings & Webinars.
meeting_requires_sign_inThe meeting can only be joined by signed in users.Incase of Zoom bots, this error message means that the Zoom meeting has only authenticated users can join enabled. By default, the bot is unauthenticated, so it cannot join these calls.

To bypass this error, follow the steps in Joining "Sign In Required" Zoom Meetings.

For MS Teams, see Signed-In Microsoft Teams Bots.

For Google Meet, see Signed-In Google Meet Bots.
meeting_link_expiredThe meeting link has expired.
meeting_link_invalidThe meeting does not exist or the link is invalid.
meeting_password_incorrectThe meeting password is incorrect.
meeting_lockedThe meeting is locked.
meeting_fullThe meeting is full.
meeting_endedThe bot attempted to join a meeting that has already ended and can no longer be joined.
google_meet_internal_errorThe bot was unable to join the call due to a Google Meet internal error.
google_meet_sign_in_failedThe bot was not able to sign in to google.
google_meet_sign_in_captcha_failedThe bot was not able to sign in to google because of captcha.
google_meet_bot_blockedThe bot was disallowed from joining the meeting.Review Google Meet: FAQ for common causes.
google_meet_sso_sign_in_failedThe bot was not able to sign in to google with SSO.
google_meet_sign_in_missing_login_credentialsThe bot was not able to sign in to google because login credentials were not configured.Create an Authenticated Google Meet Bot to allow your bots to join sign-in-only Google Meet meetings.
google_meet_sign_in_missing_recovery_credentialsThe bot was not able to sign in to google because recovery credentials were not configured.
google_meet_sso_sign_in_missing_login_credentialsThe bot was not able to sign in to google with SSO because login credentials were not configured.
google_meet_sso_sign_in_missing_totp_secretThe bot was not able to sign in in to google with SSO because TOTP secret was missing from password.
google_meet_video_errorThe bot was not able to join the call due to Google Meet video error.
google_meet_meeting_room_not_readyThe bot was not able to join the call as the meeting room was not ready.
google_meet_login_not_availableThere were not enough available logins (Google accounts) in the supplied google_login_group_id for the bot to use.Create additional Google logins as outlined here.
zoom_sdk_credentials_missingThe bot was not able to join because Zoom SDK credentials were not configured.
zoom_sdk_update_requiredA newer version of the Zoom SDK is required to join this meeting.
zoom_sdk_app_not_publishedThe SDK credentials configured in Recall dashboard have not been approved by Zoom. Bots using unapproved Zoom credentials can only join meetings hosted in the workspace of the user that created the credentials.In order for your bot to join calls outside of your Zoom workspace, you must submit your Zoom app for approval.
zoom_email_blocked_by_adminThe Zoom account this bot is joining from has been disallowed to join this meeting by the Zoom workspace administrator.
zoom_registration_requiredThe bot failed to join because registration is required for this Zoom meeting.
zoom_captcha_requiredThe bot failed to join because captcha is required for this Zoom meeting.
zoom_account_blockedThe account this bot is joining from has been blocked by Zoom.
zoom_invalid_signatureThe Zoom SDK was not able to generate a valid meeting-join signature.

This could mean that your Zoom SDK credentials are invalid, or the meeting link is malformed.
Follow this guide to set up Zoom credentials.

Double check that your meeting link is correct.
zoom_internal_errorThe bot failed to join due to an internal Zoom error.
zoom_join_timeoutThe request to join the Zoom meeting timed out.
zoom_email_requiredThe bot failed to join because providing an email is required to join this Zoom meeting.Provide a zoom.user_email when creating the bot as outlined in Email Required Meetings.
zoom_web_disallowedThe Zoom meeting host has disallowed joining from the web which prevents the bot from joining the meeting.Have the host disable E2E encryption for the meeting.

If E2E encryption support is required by the user, you can use the Zoom Native bot to join these meetings.
zoom_connection_failedThe bot failed to join the meeting due to a Zoom server error.
zoom_meeting_not_accessibleThe Zoom meeting was not accessible for the bot.
zoom_meeting_host_inactiveThe request to join the Zoom meeting failed, as the meeting host has been disabled or restricted. You will not be able to join this meeting.
microsoft_teams_call_droppedThe bot got call dropped error from MS Teams and was unable to re-join the call.
microsoft_teams_sign_in_credentials_missingThe bot failed to join a Microsoft Teams meeting requiring all participants to be signed-in. The bot was not signed in and thus was not able to join the call.
microsoft_teams_internal_errorThe bot failed to join the call due to a Microsoft Teams server error.
webex_join_meeting_errorThe bot failed to join a Webex meeting because the meeting was invalid, or Webex credentials are not set up properly.If Webex credentials are not set up, follow the Webex Bot Setup guide.