Skip to main content
Retrieves detailed information about a specific bot by its ID.

Method Signature

bot.retrieve(params: BaseBotParams): Promise<BotDetails>

Parameters

id
string
required
The unique identifier of the bot to retrieve

Response

Returns detailed information about the bot:
id
string
Unique identifier for the bot
meeting_url
object
Meeting information
meeting_id
string
Meeting ID
meeting_password
string | undefined
Meeting password if applicable
platform
string
Meeting platform (e.g., “zoom”, “google_meet”, “teams”)
status
BotStatus
Current status of the bot. See Bot API Overview for all possible statuses.
join_at
string
ISO 8601 timestamp when the bot joined or will join the meeting
bot_name
string
Display name of the bot in the meeting
recording_mode
string
Recording mode used by the bot
real_time_transcription
object
Real-time transcription configuration if enabled
real_time_media
object
Real-time media streaming configuration if enabled
transcription_options
object
Transcription processing configuration
recording_mode_options
object
Additional recording options
automatic_video_output
object
Bot video appearance configuration
media
object
URLs to recorded media files (video, audio, etc.)
created_at
string
ISO 8601 timestamp when the bot was created
updated_at
string
ISO 8601 timestamp when the bot was last updated

Example

import { Recall } from '@recall.ai/sdk';

const client = new Recall({
  apiKey: 'your-api-key',
  region: 'us-west-2'
});

const bot = await client.bot.retrieve({
  id: 'bot_1234567890'
});

console.log(`Bot Status: ${bot.status}`);
console.log(`Platform: ${bot.meeting_url.platform}`);
console.log(`Recording Mode: ${bot.recording_mode}`);

Example: Polling Bot Status

async function waitForRecording(botId: string) {
  while (true) {
    const bot = await client.bot.retrieve({ id: botId });
    
    console.log(`Current status: ${bot.status}`);
    
    if (bot.status === 'in_call_recording') {
      console.log('Bot is now recording!');
      break;
    }
    
    if (bot.status === 'fatal' || bot.status === 'recording_permission_denied') {
      console.error('Bot failed to start recording');
      break;
    }
    
    // Wait 5 seconds before checking again
    await new Promise(resolve => setTimeout(resolve, 5000));
  }
}

const newBot = await client.bot.create({
  meeting_url: 'https://zoom.us/j/123456789'
});

await waitForRecording(newBot.id);

Example: Accessing Media URLs

const bot = await client.bot.retrieve({
  id: 'bot_1234567890'
});

if (bot.status === 'done' && bot.media) {
  console.log('Recording complete!');
  console.log(`Video URL: ${bot.media.video_url}`);
  console.log(`Audio URL: ${bot.media.audio_url}`);
}

Build docs developers (and LLMs) love