Debugging Bots

Figure out why your bot didn't behave as expected.

There are a number of places a bot can run into trouble, and it's not always obvious why a bot was unable to join a call or failed to record.

Since each meeting platform has its own settings, constraints, and limitations, Recall provides tools to help you figure out where a bot went wrong so that you can take action to fix it.

Explorer dashboard

To get more visibility into a bot without having to make API requests and inspect them, you can search the bot ID using the explorer dashboard.

In the dashboard, you can search a specific bot ID to view the bot's information, including the status changes, recording, transcript, debug screenshots, and bot logs.

For a URL-based search, you can jump to a bot in the explorer by adding the bot as a path parameter:

https://api.recall.ai/dashboard/explorer/bot/{BOT_ID}

Status change events

πŸ“˜

Bot Status Changes capture the lifecycle of a bot and expose it via the API and webhook events.

Besides the typical, default behavior of a bot joining a call, starting recording, and so on, bots can also contain status changes that provide insight into the errors when a bot fails to record or is unable to join a call.

Status changes with a fatal code will have a sub_code explaining the reason that the error occurred. A list of all possible sub codes can be found at Bot Sub Codes.


To see a bot's status changes, call the Retrieve Bot endpoint and view the status_changes array in the bot object:

{
  "bot_id": "...",
  "status_changes": [
    ...
    {
      "code": "joining_call",
      "message": null,
      "created_at": "2024-02-17T16:44:00.505440Z",
      "sub_code": null
    },
    {
      "code": "in_waiting_room",
      "message": null,
      "created_at": "2024-02-17T16:44:17.692342Z",
      "sub_code": null
    },
    {
      "code": "in_call_not_recording",
      "message": null,
      "created_at": "2024-02-17T16:44:23.288984Z",
      "sub_code": null
    },
    {
      "code": "in_call_recording",
      "message": null,
      "created_at": "2024-02-17T16:44:23.295099Z",
      "sub_code": null
    },
    ...
  ],
  ...
}

Bot Screenshots

Bot screenshots give you the bot's point-of-view throughout the duration of a the call.

Screenshots do not include participant video and are meant for debugging.

They're particularly useful for:

  • Seeing why a bot was unable to join a call if it's unclear from its status_changes
  • Checking on a bot that appears to be in a weird or unknown state

To get a list of screenshots associated with a bot, you can call List Bot Screenshots.


Bot Logs


Recall exposes log entries for bots to provide more information about certain errors. These can be viewed in the Bot Explorer and can also be accessed via the Get Bot Logs endpoint.

Zoom Errors

There are a few bot logs related to Zoom specifically:

  • zoom_join_token_fetch_using_zoom_oauth_failed
  • zoom_third_party_recording_token_fetch_using_zoom_oauth_failed

zoom_join_token_fetch_using_zoom_oauth_failed

This indicates that the bot attempted to fetch a join token for local recording using OAuth and failed.

If you are using the Zoom OAuth Integration, this indicates that something went wrong with syncing the associated Zoom OAuth credentials for this meeting.

If you are not using the Zoom OAuth integration, this message can be safely ignored.

Bots that do not receive this join token via OAuth will fallback to the default behavior of prompting the host for recording permission.

zoom_third_party_recording_token_fetch_using_zoom_oauth_failed

This indicates that the bot attempted to fetch a Zoom 3rd Party Recording Token using OAuth and failed.

This likely is due to this feature not being enabled on the Zoom account associated with the credentials, but may also indicate that the credentials have become invalidated.

If you are not using the 3rd party recording token, this is not applicable and can be safely ignored.

Bots that do not receive this token will fallback to the default behavior of prompting the host for recording permission.