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
The unique identifier of the bot
Response
Returns an intelligence object with AI-generated insights:
High-level summary of the meeting
List of action items identified in the meetingDescription of the action item
Person assigned to the action item (if mentioned)
When the action item was mentioned (seconds from recording start)
Important points discussed in the meeting
Main topics covered in the meeting
Questions that were asked during the meeting
Overall sentiment analysis of the meetingOverall sentiment (positive, neutral, negative)
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);
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