Skip to main content
Retrieves AI-generated intelligence and insights from the meeting, including summaries, action items, key points, and other extracted information.

Method Signature

bot.getBotIntellienge(params: BaseBotParams): Promise<BotIntelligence>

Parameters

id
string
required
The unique identifier of the bot

Response

Returns an intelligence object with AI-generated insights:
summary
string
High-level summary of the meeting
action_items
array
List of action items identified in the meeting
description
string
Description of the action item
assignee
string
Person assigned to the action item (if mentioned)
timestamp
number
When the action item was mentioned (seconds from recording start)
key_points
array
Important points discussed in the meeting
topics
array
Main topics covered in the meeting
questions
array
Questions that were asked during the meeting
sentiment
object
Overall sentiment analysis of the meeting
overall
string
Overall sentiment (positive, neutral, negative)
score
number
Numerical sentiment score

Example

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

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

// Get intelligence
const intelligence = await client.bot.getBotIntellienge({
  id: 'bot_1234567890'
});

console.log('Meeting Summary:');
console.log(intelligence.summary);

console.log('\nAction Items:');
for (const item of intelligence.action_items) {
  console.log(`- ${item.description}`);
  if (item.assignee) {
    console.log(`  Assigned to: ${item.assignee}`);
  }
}

console.log('\nKey Points:');
for (const point of intelligence.key_points) {
  console.log(`- ${point}`);
}

Example: Generate Meeting Report

async function generateMeetingReport(botId: string) {
  const intelligence = await client.bot.getBotIntellienge({ id: botId });
  const bot = await client.bot.retrieve({ id: botId });
  
  let report = 'Meeting Report\n';
  report += '='.repeat(50) + '\n\n';
  report += `Meeting: ${bot.meeting_url.platform}\n`;
  report += `Date: ${new Date(bot.join_at).toLocaleDateString()}\n\n`;
  
  report += 'Summary\n';
  report += '-'.repeat(30) + '\n';
  report += intelligence.summary + '\n\n';
  
  if (intelligence.key_points?.length > 0) {
    report += 'Key Points\n';
    report += '-'.repeat(30) + '\n';
    for (const point of intelligence.key_points) {
      report += `• ${point}\n`;
    }
    report += '\n';
  }
  
  if (intelligence.action_items?.length > 0) {
    report += 'Action Items\n';
    report += '-'.repeat(30) + '\n';
    for (const item of intelligence.action_items) {
      report += `• ${item.description}`;
      if (item.assignee) {
        report += ` (@${item.assignee})`;
      }
      report += '\n';
    }
    report += '\n';
  }
  
  if (intelligence.topics?.length > 0) {
    report += 'Topics Discussed\n';
    report += '-'.repeat(30) + '\n';
    report += intelligence.topics.join(', ') + '\n\n';
  }
  
  if (intelligence.sentiment) {
    report += 'Overall Sentiment\n';
    report += '-'.repeat(30) + '\n';
    report += `${intelligence.sentiment.overall}\n`;
  }
  
  return report;
}

const report = await generateMeetingReport('bot_1234567890');
console.log(report);

Example: Extract Action Items Only

async function getActionItems(botId: string) {
  const intelligence = await client.bot.getBotIntellienge({ id: botId });
  
  if (!intelligence.action_items || intelligence.action_items.length === 0) {
    console.log('No action items identified');
    return [];
  }
  
  console.log(`Found ${intelligence.action_items.length} action items:`);
  
  for (const [index, item] of intelligence.action_items.entries()) {
    console.log(`\n${index + 1}. ${item.description}`);
    if (item.assignee) {
      console.log(`   Assignee: ${item.assignee}`);
    }
    if (item.timestamp) {
      console.log(`   Mentioned at: ${item.timestamp}s`);
    }
  }
  
  return intelligence.action_items;
}

await getActionItems('bot_1234567890');

Example: Check Meeting Sentiment

async function analyzeMeetingSentiment(botId: string) {
  const intelligence = await client.bot.getBotIntellienge({ id: botId });
  
  if (!intelligence.sentiment) {
    console.log('Sentiment analysis not available');
    return;
  }
  
  const { overall, score } = intelligence.sentiment;
  
  console.log(`Overall Sentiment: ${overall}`);
  console.log(`Sentiment Score: ${score}`);
  
  if (overall === 'negative' || score < 0.3) {
    console.log('⚠️ Meeting sentiment was negative. Consider follow-up.');
  } else if (overall === 'positive' || score > 0.7) {
    console.log('✓ Meeting sentiment was positive!');
  }
  
  return intelligence.sentiment;
}

await analyzeMeetingSentiment('bot_1234567890');

Example: Compare Topics Across Meetings

async function compareTopics(botIds: string[]) {
  const topicCounts: Record<string, number> = {};
  
  for (const botId of botIds) {
    const intelligence = await client.bot.getBotIntellienge({ id: botId });
    
    if (intelligence.topics) {
      for (const topic of intelligence.topics) {
        topicCounts[topic] = (topicCounts[topic] || 0) + 1;
      }
    }
  }
  
  console.log('Topics across all meetings:');
  const sortedTopics = Object.entries(topicCounts)
    .sort((a, b) => b[1] - a[1]);
  
  for (const [topic, count] of sortedTopics) {
    console.log(`${topic}: ${count} meeting(s)`);
  }
  
  return topicCounts;
}

await compareTopics(['bot_123', 'bot_456', 'bot_789']);

Notes

  • Intelligence is available after the bot status reaches analysis_done
  • Analysis may take a few minutes to complete after the recording ends
  • The quality and availability of insights depends on the meeting content and length
  • Not all fields may be populated for every meeting

Build docs developers (and LLMs) love