Unified.to
All articles

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! 🎉

All articles