Building AI-Powered Meeting Recording Summarization with Unified
October 6, 2025
With Unified, you can build AI powered meeting and call recording workflows that work with all major calendar providers. With a single integration you can fetch meetings, retrieve recordings, and then use Unified's GenAI for summarization.
With this article you would be able to build a workflow that lists calendar events, retrieves recordings and generates a summary using Unified's GenAI API.
Prerequisites
- Node.js (v18+)
- Unified account with at least one calendar or UC integration enabled (e.g., Zoom, Google Meet, Webex)
- Unified API key
- Your customer's calendar/UC connection ID (from Unified's embedded auth flow)
- Unified GenAI connection ID
Supported Integrations
Unified supports Calendar integrations including:
- Zoom
- Google Calendar/Meet
- Microsoft Outlook/Teams
- Webex
- RingCentral
See all supported calendar integrations
Step 1: Setting up your project
mkdir recordings-ai-demo
cd recordings-ai-demo
npm init -y
npm install @unified-api/typescript-sdk dotenv
Add your credentials to .env
:
UNIFIED_API_KEY=your_unified_api_key
CONNECTION_CALENDAR=your_customer_calendar_connection_id
CONNECTION_GENAI=your_genai_connection_id
Step 2: Initialize the SDK
import 'dotenv/config';
import { UnifiedTo } from '@unified-api/typescript-sdk';
const { UNIFIED_API_KEY, CONNECTION_CALENDAR, CONNECTION_GENAI } = process.env;
const sdk = new UnifiedTo({
security: { jwt: UNIFIED_API_KEY! },
});
Step 3: How to Get Your Customer's Connection ID
Before you get started, your end customer must authorize your app to access their calendar integration via Unified's auth flow. Once authorized, you will receive a connection ID for that customer's integration. Store this carefully and use it in all API calls for that specific customer.
Step 4: List Calendar Events
Fetch recent or upcoming events for your customer:
export async function listEvents(connectionId: string) {
const eventsResult = await sdk.calendar.listCalendarEvents({
connectionId,
limit: 10,
});
return eventsResult.calendarEvents;
}
Step 5: List and Retrieve Recordings
List all available recordings for your customer's connection:
export async function listRecordings(connectionId: string) {
const recordingsResult = await sdk.calendar.listCalendarRecordings({
connectionId,
limit: 10,
});
return recordingsResult.calendarRecordings;
}
Retrieve a specific recording:
export async function getRecording(connectionId: string, recordingId: string) {
const recordingResult = await sdk.calendar.getCalendarRecording({
connectionId,
id: recordingId,
});
return recordingResult.calendarRecording;
}
Step 6: Summarize a Recording with Unified GenAI
Now you can send the transcript and use AI through Unified's GenAI integration to summarise it.
export async function summarizeRecording(connectionId: string, genaiConnectionId: string, recordingId: string) {
const recording = await getRecording(connectionId, recordingId);
// Use transcript if available, otherwise fallback to media or metadata
const transcript = recording.transcript || recording.media?.[0]?.transcript || "";
if (!transcript) {
throw new Error("No transcript available for this recording.");
}
const prompt = `Summarize the following meeting transcript:\\n\\n${transcript}`;
const result = await sdk.genai.createGenaiPrompt({
connectionId: genaiConnectionId,
prompt: {
messages: [{ role: "USER", content: prompt }],
maxTokens: 512,
temperature: 0.2,
},
});
return result.choices?.[0]?.message?.content || "";
}
Step 7: Example Usage
Here's how you might use these functions in your workflow:
async function main() {
// 1. List events
const events = await listEvents(CONNECTION_CALENDAR!);
console.log("Events:", events);
// 2. List recordings
const recordings = await listRecordings(CONNECTION_CALENDAR!);
console.log("Recordings:", recordings);
// 3. Summarize the first available recording
if (recordings.length > 0) {
const summary = await summarizeRecording(CONNECTION_CALENDAR!, CONNECTION_GENAI!, recordings[0].id);
console.log("AI Summary:", summary);
} else {
console.log("No recordings found.");
}
}
main();
Happy Automating! 🎉