Recall.ai has raised a $38M series B!

More resources

Filter by category

View all

Tutorials

Best Practices

Tutorials

Deep Dive

Zoom Developer Forum

.avif) Google Meet Developer Forum

Microsoft Teams Developer Forum

Announcements

Thank you! Your submission has been received!

Oops! Something went wrong while submitting the form.

\ A guide to programmatic screen capture on macOS\ \ Deep Dive](/content/blog/macos-screencapture-api/index.html)

\ Joining multiple simultaneous meetings through the Zoom SDK\ \ Zoom Developer Forum](/content/blog/zoom-sdk-simultaneous-meeting-limitations/index.html)

\ How to get transcripts from Microsoft Teams\ \ Tutorials](/content/blog/how-to-get-transcripts-from-microsoft-teams/index.html)

\ How to Get Recordings and Transcripts from Slack Huddles\ \ Tutorials](/content/blog/get-recordings-and-transcripts-from-slack-huddles-api/index.html)

\ Understanding the Zoom On Behalf Of (OBF) Token\ \ Deep Dive](/content/blog/zoom-obf/index.html)

\ What is a meeting bot?\ \ Deep Dive](/content/blog/what-is-a-meeting-bot/index.html)

\ Zoom SDK Credentials\ \ Deep Dive](/content/blog/zoom-sdk-credentials/index.html)

\ What is a Zoom Access Key (ZAK) token?\ \ Deep Dive](/content/blog/what-is-a-zoom-access-key-zak-token/index.html)

\ How WebSockets cost us $1M on our AWS bill\ \ Deep Dive](/content/blog/how-websockets-cost-us-1m-on-our-aws-bill/index.html)

\ The fix for a segfault that never shipped\ \ Deep Dive](/content/blog/the-fix-for-a-segfault-that-never-shipped/index.html)

\ Postgres Postmaster does not scale\ \ Deep Dive](/content/blog/postgres-postmaster-does-not-scale/index.html)

\ How to access audio streams in the Zoom Web SDK?\ \ Zoom Developer Forum](/content/blog/how-to-access-audio-streams-in-the-zoom-web-sdk/index.html)

\ How to determine if audio is connected on the Zoom Web SDK?\ \ Zoom Developer Forum](/content/blog/how-to-determine-if-audio-is-connected-on-the-zoom-web-sdk/index.html)

\ Recall.ai Series B: The API for Meeting Recording\ \ Announcements](/content/blog/recall-ai-series-b-the-api-for-meeting-recording/index.html)

\ How to build a Microsoft Teams Bot\ \ Tutorials](/content/blog/how-to-build-a-microsoft-teams-bot/index.html)

\ What is the Google Meet Media API?\ \ Best Practices](/content/blog/what-is-the-google-meet-media-api/index.html)

\ Postgres LISTEN/NOTIFY does not scale\ \ Deep Dive](/content/blog/postgres-listen-notify-does-not-scale/index.html)

\ Code Walkthrough: Generating Meeting Action Items With Recall.ai\ \ Tutorials](/content/blog/generating-meeting-action-items-with-recall-ai/index.html)

\ What are speaker labels and how to obtain them\ \ Tutorials](/content/blog/speaker-labels-and-names-explained/index.html)

\ 7 APIs to get Zoom transcripts: A comprehensive guide\ \ Best Practices](/content/blog/7-apis-to-get-zoom-transcripts-a-comprehensive-guide/index.html)

\ How to get transcripts from Zoom\ \ Tutorials](/content/blog/how-to-get-transcripts-from-zoom/index.html)

\ How to record Microsoft Teams\ \ Tutorials](/content/blog/how-to-get-recordings-from-microsoft-teams/index.html)

\ New Recall.ai Pricing for 2026: $0.50 per Hour of Meeting Recording\ \ Announcements](/content/blog/new-recall-ai-pricing-for-2026/index.html)

\ Open source Microsoft Teams recording software\ \ Microsoft Teams Developer Forum](/content/blog/microsoft-teams-recording-software-open-source/index.html)

\ How to pick a meeting note taker\ \ Best Practices](/content/blog/how-to-pick-a-meeting-note-taker/index.html)

\ How to Get a Recording from the Google Meet API\ \ Best Practices](/content/blog/how-to-get-a-recording-from-the-google-meet-api/index.html)

\ How to get Google Meet transcripts programmatically\ \ Best Practices](/content/blog/how-to-get-transcripts-from-google-meet-developer-edition/index.html)

\ What is Zoom RTMS?\ \ Best Practices](/content/blog/what-is-zoom-rtms/index.html)

\ How to build a desktop recording app (Like Granola)\ \ Tutorials](/content/blog/how-to-build-a-desktop-recording-app/index.html)

\ Speaker Diarization: What it is and how to get diarized transcripts\ \ Best Practices](/content/blog/speaker-diarization/index.html)

\ Understanding Zoom RTMS Behavior and Its Constraints\ \ Best Practices](/content/blog/understanding-zoom-rtms-behavior-and-its-constraints/index.html)

\ How to build a meeting notetaker\ \ Tutorials](/content/blog/how-to-build-a-meeting-notetaker/index.html)

\ How to build a meeting bot \ \ Tutorials](/content/blog/how-to-build-a-meeting-bot/index.html)

\ When to build a Microsoft Teams bot with Puppeteer\ \ Microsoft Teams Developer Forum](/content/blog/puppeteer-microsoft-teams-bot/index.html)

\ How to join a Zoom meeting using the Zoom Meeting SDK\ \ Zoom Developer Forum](/content/blog/how-to-join-a-zoom-meeting-using-the-zoom-meeting-sdk/index.html)

\ Microsoft Teams open source bot\ \ Microsoft Teams Developer Forum](/content/blog/microsoft-teams-open-source-bot/index.html)

\ How to Build a Google Meet Bot from Scratch\ \ Tutorials](/content/blog/how-i-built-an-in-house-google-meet-bot/index.html)

.avif)\ Is there open source Google Meet recording software?\ \ Google Meet Developer Forum](/content/blog/is-there-open-source-google-meet-recording-software/index.html)

.avif)\ Puppeteer Google Meet Bot\ \ Google Meet Developer Forum](/content/blog/puppeteer-google-meet-bot/index.html)

\ Zoom recording software open source\ \ Zoom Developer Forum](/content/blog/zoom-recording-software-open-source/index.html)

\ How to build a Chrome recording extension using tabCapture API\ \ Tutorials](/content/blog/how-to-build-a-chrome-recording-extension/index.html)

\ Zoom Signature Invalid\ \ Zoom Developer Forum](/content/blog/zoom-signature-invalid/index.html)

\ How to get automatic recordings from a Zoom bot\ \ Zoom Developer Forum](/content/blog/zoom-bot-automatic-recording/index.html)

\ Retrieving participant names through the Zoom SDK\ \ Zoom Developer Forum](/content/blog/zoom-sdk-retrieving-participant-names/index.html)

\ How to Access Live Transcription Data from Zoom Web SDK (Component View)\ \ Zoom Developer Forum](/content/blog/how-to-access-live-transcription-data-from-zoom-web-sdk-component-view/index.html)

\ How to build a Zoom bot from scratch\ \ Tutorials](/content/blog/how-to-build-a-zoom-bot/index.html)

\ Create a Google Meet Programmatically\ \ Tutorials](/content/blog/create-a-google-meet-programmatically/index.html)

\ How to join Zoom using Puppeteer\ \ Zoom Developer Forum](/content/blog/how-to-join-zoom-using-puppeteer/index.html)

\ Handling Zoom SDK recording permissions\ \ Zoom Developer Forum](/content/blog/zoom-sdk-recording-permissions/index.html)

\ How to Enable a Zoom Bot to Skip the Waiting Room\ \ Zoom Developer Forum](/content/blog/zoom-bot-skip-waiting-room/index.html)

\ How do I sync audio and video when processing raw audio/video from the Zoom SDK?\ \ Zoom Developer Forum](/content/blog/how-do-i-sync-audio-and-video-when-processing-raw-audio-video-from-the-zoom-sdk/index.html)

\ Fixing DLL warnings in the Zoom Windows Meeting SDK\ \ Zoom Developer Forum](/content/blog/fixing-dll-warnings-in-the-zoom-windows-meeting-sdk/index.html)

\ Zoom join tokens for local recording\ \ Best Practices](/content/blog/zoom-join-tokens-for-local-recording/index.html)

\ How to get recordings from Zoom using a Zoom recording bot API\ \ Tutorials](/content/blog/how-to-get-recordings-from-zoom/index.html)

\ How to manage ZAK Tokens for Zoom bots\ \ Zoom Developer Forum](/content/blog/how-to-manage-zak-tokens-for-zoom-bots/index.html)

\ How to build a Zoom notetaker\ \ Tutorials](/content/blog/how-to-build-a-zoom-notetaker/index.html)

\ Recall.ai Announces Participant Emails\ \ Announcements](/content/blog/recall-ai-announces-participant-emails/index.html)

\ How often should I expect to receive the Zoom recording completed webhook for a single meeting?\ \ Zoom Developer Forum](/content/blog/how-often-should-i-expect-to-receive-the-zoom-recording-completed-webhook-for-a-single-meeting/index.html)

\ Why are waiting rooms causing issues with the Zoom Web Meeting SDK?\ \ Zoom Developer Forum](/content/blog/why-are-waiting-rooms-causing-issues-with-the-zoom-web-meeting-sdk/index.html)

\ Why is my Zoom recording completed webhook so delayed?\ \ Zoom Developer Forum](/content/blog/why-is-my-zoom-recording-completed-webhook-so-delayed/index.html)

\ Why aren't transcription webhooks firing for my Zoom meetings?\ \ Zoom Developer Forum](/content/blog/why-arent-transcription-webhooks-firing-for-my-zoom-meetings/index.html)

\ How do I track participants across Zoom breakout rooms?\ \ Zoom Developer Forum](/content/blog/how-do-i-track-participants-across-zoom-breakout-rooms/index.html)

\ Can I identify meeting participants by email on Zoom?\ \ Zoom Developer Forum](/content/blog/can-i-identify-meeting-participants-by-email-on-zoom/index.html)

\ How do I capture participant data in real time on Zoom?\ \ Zoom Developer Forum](/content/blog/how-do-i-capture-participant-data-in-real-time-on-zoom/index.html)

\ Tracking persistent Zoom meeting ID's for participants who leave and rejoin\ \ Zoom Developer Forum](/content/blog/tracking-persistent-zoom-meeting-ids-for-participants-who-leave-and-rejoin/index.html)

\ Debugging issues with automatic cloud recording\ \ Zoom Developer Forum](/content/blog/debugging-issues-with-automatic-cloud-recording/index.html)

\ Tracking Zoom meetings when using Zoom PMI\ \ Zoom Developer Forum](/content/blog/tracking-zoom-meetings-when-using-zoom-pmi/index.html)

\ Encoding raw video from the Zoom SDK to MP4\ \ Zoom Developer Forum](/content/blog/encoding-raw-video-from-the-zoom-sdk/index.html)

\ Handling crashes in the Zoom Windows Meeting SDK\ \ Zoom Developer Forum](/content/blog/handling-crashes-in-the-zoom-windows-meeting-sdk/index.html)

\ Encoding raw video frames from the Zoom SDK to JPEG\ \ Zoom Developer Forum](/content/blog/decoding-raw-video-frames-from-the-zoom-sdk/index.html)

\ Recording meetings without a local recording token\ \ Zoom Developer Forum](/content/blog/recording-meetings-without-a-local-recording-token/index.html)

\ Resolving intermittent errors while downloading Zoom transcripts\ \ Zoom Developer Forum](/content/blog/resolving-intermittent-errors-while-downloading-zoom-transcripts/index.html)

\ Applying account-level settings to meetings created via the Zoom API\ \ Zoom Developer Forum](/content/blog/applying-account-level-settings-to-meetings-created-via-the-zoom-api/index.html)

\ Why can't my bot join meetings hosted by people outside of my Zoom organization?\ \ Zoom Developer Forum](/content/blog/why-cant-my-bot-join-meetings-hosted-by-people-outside-of-my-zoom-organization/index.html)

\ Zoom Cloud Recording API: Transcript Tutorial, Common Pitfalls, and Workarounds\ \ Tutorials](/content/blog/zoom-transcript-api/index.html)

\ Zoom Meeting Bots: What They Are and Solutions\ \ Deep Dive](/content/blog/zoom-bots/index.html)

\ Can I access gallery view video on the Linux SDK?\ \ Zoom Developer Forum](/content/blog/can-i-access-gallery-view-video-on-the-linux-sdk/index.html)

\ How to access the Zoom Archive Files API\ \ Zoom Developer Forum](/content/blog/how-to-access-the-zoom-archive-files-api/index.html)

\ Resolving Web SDK local recording errors\ \ Zoom Developer Forum](/content/blog/resolving-web-sdk-local-recording-errors/index.html)

\ How to resolve permissions errors with the Zoom Users API\ \ Zoom Developer Forum](/content/blog/how-to-resolve-permissions-errors-with-the-zoom-users-api/index.html)

\ How to track participant name changes in breakout rooms\ \ Zoom Developer Forum](/content/blog/how-to-track-participant-name-changes-in-breakout-rooms/index.html)

\ Why is the transcript.completed webhook not firing?\ \ Zoom Developer Forum](/content/blog/zoom-sdk-webhook-not-firing/index.html)

\ Debugging Zoom SDK failed video capture\ \ Zoom Developer Forum](/content/blog/zoom-sdk-debugging-video-capture/index.html)

\ Capturing video and audio streams through the Zoom SDK\ \ Zoom Developer Forum](/content/blog/zoom-sdk-receiving-video-streams/index.html)

\ Can you suppress the Zoom recording consent prompt through the SDK?\ \ Zoom Developer Forum](/content/blog/zoom-sdk-suppressing-consent-prompt/index.html)

\ How to stream video to a meeting through the Zoom SDK\ \ Zoom Developer Forum](/content/blog/zoom-sdk-streaming-video-to-meeting/index.html)

\ Sending chat messages through the Zoom SDK\ \ Zoom Developer Forum](/content/blog/zoom-sdk-sending-chat-messages/index.html)

\ Handling Zoom app OAuth redirect URL requirements\ \ Zoom Developer Forum](/content/blog/zoom-app-oauth-redirect-url-requirement/index.html)

\ Debugging missing Zoom transcription webhooks\ \ Zoom Developer Forum](/content/blog/zoom-sdk-missing-transcription-webhooks/index.html)

\ Handling Zoom SDK recording compliance requirements\ \ Zoom Developer Forum](/content/blog/zoom-sdk-compliance-requirements/index.html)

\ Handling Zoom app verification\ \ Zoom Developer Forum](/content/blog/zoom-app-domain-verification/index.html)

\ How to join registration-required meetings with a Zoom bot\ \ Zoom Developer Forum](/content/blog/zoom-sdk-joining-registration-required-meetings/index.html)

\ How to use a Zoom bot to join meetings without passcodes\ \ Zoom Developer Forum](/content/blog/zoom-sdk-joining-meetings-without-passcodes/index.html)

\ Debugging stuck Zoom SDK bots\ \ Zoom Developer Forum](/content/blog/zoom-sdk-docker-issues/index.html)

\ How to create a voice agent to send to Zoom meetings\ \ Zoom Developer Forum](/content/blog/zoom-sdk-ai-voice-agent/index.html)

\ How to capture Zoom audio and video with a meeting bot\ \ Zoom Developer Forum](/content/blog/create-audio-video-capture-bots/index.html)

\ How to transcribe a Zoom meeting in real time\ \ Zoom Developer Forum](/content/blog/accessing-real-time-transcription-api/index.html)

\ How to receive raw video from the Zoom SDK\ \ Zoom Developer Forum](/content/blog/accessing-host-video-stream/index.html)

\ Announcing the Recall.ai and Speechmatics Integration\ \ Announcements](/content/blog/announcing-the-recall-ai-and-speechmatics-integration/index.html)

\ Can I access raw audio data using the Zoom Web SDK?\ \ Zoom Developer Forum](/content/blog/can-i-access-raw-audio-data-using-the-zoom-web-sdk/index.html)

Go To Blog

Tutorials

How to get transcripts from Zoom

Updated at:

April 17, 2026

.avif)

Written By:

Maggie Veltri

Table of Contents

There are several ways to programmatically get transcripts from Zoom, each with different levels of effort, cost, and upkeep. In this guide, I’ll walk through one of the simplest options: using an API to add an external bot to a Zoom meeting to capture real-time and post-call meeting transcripts and we’ll provide a brief overview on the other options.

For a full exploration of the options to get transcripts, see our blog on all of the APIs to get transcripts from Zoom.

Architecture overview

The dashed arrows in the architecture diagram are things you might choose to do as logical next steps.

This blog outlines a minimal backend prototype showing how to get Zoom transcripts.

A sneak peek at the end result

Getting live transcript and recording from Zoom: Quick demo

Getting live transcript and recording from Zoom: Quick demo

120 views

Copy link

Open video in Loom

0

1.2×

6 min⚡️6 min 58 sec5 min 34 sec4 min 38 sec3 min 43 sec3 min 16 sec2 min 47 sec2 min 13 sec

120 views

Copy link

Open video in Loom

0

1.2×

6 min⚡️6 min 58 sec5 min 34 sec4 min 38 sec3 min 43 sec3 min 16 sec2 min 47 sec2 min 13 sec

    • ❤️

heart

1

  • 👍

yes

2

  • 🔥

fire

3

  • 👏

clap

4

  • 🙌

yay

5

  • 👀

eyes

6

More reactions

7

✋

Frequently Used

  • 💯

  • 🎉

  • ✅

  • ❌

  • 👀

  • ✨

  • 🚀

  • ➕

  • 🙏

  • 🔥

  • 😆

  • 🤔

  • 😱

  • 👋

  • 🌈

  • ❤️

  • 👏

  • 🐞

Smileys & Emotion

People & Body

Animals & Nature

Food & Drink

Activities

Travel & Places

Objects

Symbols

Flags

Make frequently used emojis my default

Comment

Comment

C

0 Comments

Be the first to comment

HitCto reply to Maggie or leave a comment at the top of this panel.

The demo shared above is a more full-featured app that includes a bot joining a Zoom meeting, streaming transcripts in real time, displaying the video recording after the call, and providing a link to download the video. If you want to take a look at the code, you can check out my sample repo. In this blog I will go over the backend necessary to power an app that gets transcripts, but will not be covering recordings, the frontend and database. If you’re interested in getting recordings from Zoom, check out our blog on how to get recordings from Zoom.

Prerequisites

Before getting started, make sure you have the following:

  • A Recall.ai API key (which you can generate for free and store in your .env file)
  • A publicly accessible URL to receive webhooks (e.g. via ngrok during development)
  • A basic backend server capable of:
  • Sending HTTP POST requests (to start the bot)
  • Receiving HTTP POST requests (to handle webhooks)
  • Performing authenticated fetch() requests to Recall.ai’s API to retrieve media

Step 1: Setting up your backend to launch bots and receive meeting data

In order to get any meeting data, you have to send a Zoom bot into the meeting. You’ll need to pass a Zoom meeting link to the backend (startRecall.ts). In the backend, a unique externalId is generated to tie the session together. The backend then passes the Zoom meeting link to the Create Bot endpoint to launch a bot.

Here’s an example of how to call the Create Bot endpoint with a POST request from a Node.js backend using fetch():

pages/api/startRecall.ts

1const botResp = awaitfetch(`https://${RECALL_REGION}.recall.ai/api/v1/bot`, {

2method: 'POST',

3headers: { authorization: process.env.RECALL_API_KEY },

4

5body: JSON.stringify({

6 meeting_url : zoomLink,

7 external_id : externalId,

8 metadata : { external_id: externalId },

9 webhook_url : 'https://your-app/api/webhook',

10

11recording_config: {

12transcript: { provider: { meeting_captions: {} } },

13realtime_endpoints: [

14 {

15type : 'webhook',

16 url : 'https://your-app/api/webhook',\
17events: ['transcript.data', 'transcript.partial_data']

18 }

19 ]

20 }

21})

22})

... See all 23 lines

As you can see, when calling this endpoint, you’ll need to provide:

  • Meeting URL: The meeting the bot will join
  • Webhook URL: Where real-time transcripts will be sent
  • Transcript configurations: The transcription provider you want and the latency you want

For this tutorial, I used meeting_captions as the transcription provider since it’s free, but you could swap in a different transcription provider such as Recall.ai transcription.

Once the bot is created, store the bot ID and external ID from the metadata to make it easier to retrieve transcripts after the call. You’ll also want to copy the webhook URL which you’ll use to subscribe to events.

To receive the necessary webhooks, you’ll also need to set up a webhook listener for the events you specified in the bot config above. You'll handle the webhook events in a webhook.ts file, using conditionals to check for each event type you're interested in as shown below:

pages/api/webhook.ts

1importtype { NextApiRequest, NextApiResponse } from'next'

2import http from'http'

3import { prisma } from'../../lib/prisma'

4

5exportconst config = { api: { bodyParser: false } }

6

7exportdefaultasyncfunctionhandler (

8req: NextApiRequest,

9res: NextApiResponse

  1. {

11constchunks: Uint8Array[] = []

12forawait (const c of req) chunks.push(c)

13const raw = Buffer.concat(chunks)

14const rawStr = raw.toString('utf8')

15

16letev: any

17try { ev = JSON.parse(rawStr) }

18catch { res.status(400).end('Invalid JSON'); return }

19// Handle real-time finalized transcript events

20if (ev.event === 'transcript.data') {

21const words = ev.data?.data?.words ?? []

22const externalId = ev.data?.bot?.metadata?.external_id

23const text = words.map((w:any) => w.text).join(' ').trim()

24if (!externalId || !text) return res.status(204).end()

25const meeting = await prisma.meeting.findUnique({ where: { externalId } })

26if (!meeting) return res.status(404).end('Meeting not found')

27

28await prisma.transcript.create({

29data: {

30meetingId: meeting.id,

31speaker: ev.data?.data?.participant?.name ?? 'Unknown speaker',

32 text,

33timestamp: newDate(words[0]?.start_timestamp?.absolute ?? newDate())

34 }

35 })

36

37// Optional: emit to WebSocket server for real-time UI updates

38 http.request(

39 {

40host: 'localhost', port: 4000, path: '/send', method: 'POST',

41headers: { 'content-type': 'application/json' }

42 },

43r => r.resume()

44 ).end(JSON.stringify({

45 externalId,

46message: {

47type: 'transcript',

48payload: { text, speaker: ev.data?.data?.participant?.name }

49 }

50 }))

51return res.status(200).end('Transcript saved')

52 }

53// Handle post-call recording metadata for transcripts

54if (ev.recording?.id) {

55const externalId = ev.external_id

56const meeting = await prisma.meeting.findUnique({ where: { externalId } })

57if (!meeting) return res.status(404).end('Meeting not found')

58// Store post-call transcript if available

59if (ev.transcript) {

60await prisma.transcript.create({

61data: {

62meetingId: meeting.id,

63text: ev.transcript,

64speaker: 'Unknown',

65timestamp: newDate()

66 }

67 })

68 }

69return res.status(200).end('Post-call stored')

70 }

71 res.status(200).end('No action')

72}

... See all 73 lines

Once this endpoint is running, you’ll start receiving webhooks for both real-time updates and final media notifications.

To subscribe to the change status webhook events, copy the webhook URL that you saved previously and navigate to the Recall.ai dashboard. From there go to Webhooks in the sidebar and then select + Add Endpoint. Paste your webhook URL in the Endpoint URL field. Scroll down to Subscribe to Events, select bot.status_change, and click Create. By subscribing to the bot.status_change events you’ll be notified of when the bot is transcribing, when it’s processing the meeting, and when it’s finished and the post-call transcript is ready to be fetched.

Step 2: Receiving transcripts in real-time and post-call

There are two ways to receive transcripts: during the meeting (real-time) or after the meeting ends (post-call).

Getting the transcript in real-time

To capture transcripts in real-time, your backend listens for webhook events sent as raw JSON via HTTP POST.

While the meeting is in progress, Recall.ai emits transcript.data webhook events with finalized segments of speech.

1{

2"event":"transcript.data",

3"data":{

4"bot":{

5"metadata":{

6"external_id":"meeting-abc123"

7}

8},

9"data":{

10"words":[

11{

12"text":"Welcome everyone",

13"start_timestamp":{

14"absolute":"2025-07-30T17:23:00.123Z"

15},

16"end_timestamp":{

17"absolute":"2025-07-30T17:23:02.456Z"

18}

19}

20],

21"participant":{

22"name":"Alice",

23"platform":"Zoom"

24}

25}

26}

27}

... See all 27 lines

If you're using a framework like Next.js or Express, be sure to disable the default body parser and manually parse the raw body to access the payload.

Each event includes:

  • external_id to identify the meeting
  • The transcript segment (text) within the words array in data
  • Timestamps for each word (also in the words array)
  • Speaker name and platform

While this guide doesn’t cover data storage or routing after you gather it, you can choose to log, process, or forward these messages to another system depending on your app’s goals.

You can also configure Recall.ai to send partial transcript results that are lower latency. These appear in the form of transcript.partial_data events. These are not final and may be revised later. In this guide, I don’t use transcript.partial_data.

Real-time events are ideal for building real-time coaching features, AI agents that provide feedback during the meeting, or live notetaking products.

Getting the transcript post-call

After the call ends, a Bot Status Change event with the status bot.done signals that the full structured transcript is available for download via the API.

1{

2"event":"bot.done",

3"data":{

4"data":{

5"code": string,

6"sub_code": string | null,

7"updated_at": string

8},

9"bot":{

10"id": string,

11"metadata": object

12}

13}

14}

... See all 14 lines

This signals that the full structured transcript is now ready to be retrieved. It does not include the transcript itself.

Take the bot ID from the JSON provided in the object sent via the bot.done webhook event and retrieve the bot using the Retrieve Bot endpoint:

1// Retrieve Bot Endpoint

2const options = {method: 'GET', headers: {accept: 'application/json'}};

3

4fetch('https://us-east-1.recall.ai/api/v1/bot/id/', options)

5 .then(res => res.json())

6 .then(res =>console.log(res))

7 .catch(err =>console.error(err));

You will see a list of recordings, and inside each you’ll find a download_url.

Note: Transcripts are nested under recordings because they are an artifact from a meeting.

Here is an example of the response you can expect to get from the Retrieve Bot Endpoint:

1Example Response

2{

3"id":"2e8ec5a4-a608-4ea0-b9d0-2a12aec3f0f0",

4"recordings":[

5{

6"id":"c9d15f08-83a4-4d83-ad1b-3e311bb0f253",

7"media_shortcuts":{

8"transcript":{

9"id":"b2c3c59f-45a4-43a8-9b0f-1bb79ba33580",

10"data":{

11"download_url":"https://us-east-1.recall.ai/api/v1/download/transcript?token=..."\
12},

13"provider":{

14"meeting_captions":{}

15}

16},

17 ...

18}

19}

20],

21 ...

22}

... See all 22 lines

Once you have the download_url, use the url to get the structured transcript JSON:

1const downloadUrl = "https://us-east-1.recall.ai/api/v1/download/transcript?token=..."

2const response = awaitfetch(downloadUrl, {

3method: 'GET',

4headers: {

5'Authorization': `Bearer ${process.env.RECALL_API_KEY ?? ''}`,

6'Accept': 'application/json',

7 }

8})

This returns JSON with full meeting transcription data which uses the following schema:

1[

2{

3"participant":{

4"id": number,// Id of the participant in the meeting. This id is not unique across meetings.

5"name": string | null,// Display name of the participant.

6"is_host": boolean | null,// Whether the participant is the host of the meeting.

7"platform": string | null,// Meeting platform constant

8"extra_data": json | null,// Extra data about the participant from the meeting platform.

9},

10"words":[

11{

12"text": string,// The text of the word.

13"start_timestamp":{

14"absolute": number,// seconds

15"relative": number // seconds

16},

17"end_timestamp":{

18"absolute": number,// seconds

19"relative": number // seconds

20}

21}

22]

23}

24]

... See all 24 lines

Post-call events give you structured, finalized transcripts after the meeting is done.

To see all of the configuration options for transcription, see the appendix.

Why did I choose this implementation?

As mentioned earlier, this is one of many ways to get Zoom transcripts. So why did I choose this method?

No media infrastructure required: Recall.ai handles ingestion, recording, and processing, so you don’t need to manage WebRTC or Zoom SDKs.

Real-time streaming available: Get transcripts via WebSocket or webhook with minimal set up.

Flexible transcription provider support: Use meeting captions, AssemblyAI, Deepgram, etc., via a single API; swap providers without minimal configuration changes.

Speaker diarization available: You’re able to get speaker names no matter which transcription provider you use. Depending on your configuration, you can also get perfect diarization.

Rich participant metadata available: Always includes speaker names, roles, and join/leave events.

Cross-platform support: Works with Zoom, Google Meet, Microsoft Teams, etc using the same API. List of all supported platforms.

Minimal backend logic: Your app only needs to manage bot sessions and store metadata.

Why you might choose another option

We use Recall.ai, a third-party API to offload the majority of the engineering work in this option. This might not be the ideal method if you are:

  • Cost Conscious: A third-party API like Recall.ai has additional costs based on usage.
  • Don’t want vendor reliance: Third party APIs can be a sticking point for some companies.
  • Don’t want a bot in the meeting: If you prefer not to have a bot in the meeting, you might want to consider:
  • The Desktop Recording SDK ( API Docs) is the most discrete option for capturing in-person or on-screen conversations across any platform.
  • Meeting Direct Connect connects directly via Zoom’s Real-Time Media Streams API, without showing a bot in the meeting. Setup requires you to create a Zoom Marketplace app, obtain an RTMS-enabled webhook, and have your users OAuth the Zoom app.

Other options to get transcripts from Zoom

For an in-depth overview of all of the other options to get transcripts from Zoom take a look at our blog post on the APIs to get transcripts from Zoom.

Conclusion

With just a minimal backend and no media infrastructure, you now have a working prototype that captures real-time transcripts, post-call transcripts, and post-call recordings from Zoom. Hopefully this has provided a jumping off point for whatever you’re building. If you have any questions we’re always happy to help, and if you want to build anything we’ve gone over in the tutorial, you can sign up and try Recall.ai for free.

Appendix

Transcript & recording formats accessible using the Meeting Bot API

Recall.ai delivers transcripts and recordings in real time or after the call, depending on your bot configuration. Delivery happens through webhooks, WebSocket, or by polling the API.

Transcripts

Type Delivery Method Notes API Docs URL
Real-time transcript.data via Webhook or WebSocket Finalized segments with word-level timing https://docs.recall.ai/docs/bot-real-time-transcription
Partial (real-time) transcript.partial_data via Webhook Low-latency previews; not final https://docs.recall.ai/docs/bot-real-time-transcription#partial-results
Post-call GET /transcript/{id} Full structured transcript after receiving bot.done webhook https://docs.recall.ai/reference/bot_retrieve

Storing transcripts in Postgres

For apps storing meeting metadata and transcripts, here’s a minimal schema to get started:

1model Meeting {

2 id String@id@default(cuid())

3 externalId String@unique

4 userId String

5 botId String

6 videoUrl String?

7 createdAt DateTime@default(now())

8 transcript Transcript[]

9}

10

11model Transcript {

12 id String@id@default(cuid())

13 meetingId String

14 speaker String

15 text String

16 timestamp DateTime

17}

... See all 17 lines

  • Meeting tracks session metadata like user, bot, and external ID
  • Transcript stores finalized speech segments
  • You can extend the schema as needed (e.g. add durationMs, speakerRole, etc.)

Some common questions

How do I download transcripts from Zoom?

From the Zoom portal, enable Cloud Recording and Audio transcript, ensure the host records to the cloud. From there, after processing go to Recordings->Cloud Recordings->YOUR_MEETING -> Audio transcript and download the .vtt or .srt file as mentioned in method 1 of our Zoom transcript APIs blog.

If you want to programmatically download transcripts then you can call the Get Meeting Recordings endpoint for the meeting, locate the transcript in recording_files, and fetch its download_url with an OAuth access token.

If you prefer a cross-platform approach, use a provider such as Recall.ai to capture the meeting and download the post-call transcript JSON from its API.

Can you get a transcript of a Zoom meeting after it’s over?

Yes. If cloud recording and audio transcription were enabled and used ( alternative 1), Zoom provides a transcript after post-processing completes. It should be noted that in many cases the lag between the meeting ending and the transcript being available using this method is longer than the length of the meeting recorded.

If you captured the meeting via Recall.ai (bot or Desktop Recording SDK), you can retrieve a finalized transcript from its API immediately after the call concludes. Real-time streams can also be stored and accessed after the call within your own system.

Will Zoom give you a transcript?

Yes, when the host or account has Cloud Recording and Audio transcript enabled and the meeting is recorded to the cloud you can get the transcript from Zoom. The transcript becomes available only after Zoom finishes processing.

Can you get a transcript from Zoom without recording?

Using a third-party (for example, a Recall.ai bot or Desktop Recording SDK) it is possible to generate transcripts without using Zoom’s cloud recording feature.

Is there any other way to retrieve a Zoom transcript?

You can also build your own Zoom bot from scratch to get a transcript from Zoom meetings. We've created an open source Zoom bot if you want to try to build your own bot. The biggest caveat is that any changes that Zoom makes, you'll need to adapt to. You will also need to make sure that this bot works for your use case.

.avif)

Written By:

Maggie Veltri

Table of Contents

The API to get transcripts, recordings, and metadata from meetings.

Start for free Get a demo

Need help? Email us at support@recall.ai

Get transcripts, recordings and metadata from meetings

Start for free

Product

Meeting Bot API\ \ \ example Desktop Recording SDK\ \ \ example Mobile Recording SDK\ \ \ example Calendar Integration\ \ \ example Storage and Playback\ \ \ example

Company

Careers\ \ \ We're hiring! Blog\ \ \ example Case Studies\ \ \ example

Security

Security Portal\ \ \ example SOC 2\ \ \ example ISO 27001\ \ \ example HIPAA\ \ \ example GDPR\ \ \ example CCPA\ \ \ example

Legal

Privacy\ \ \ We're hiring! Terms of Use\ \ \ We're hiring!

Resources

API Docs\ \ \ example Pricing\ \ \ example Notetaker API\ \ \ example Meeting Recording API\ \ \ example Transcription API\ \ \ example Meeting Transcription API\ \ \ example Compliance Recording API\ \ \ example Speaker Diarization API\ \ \ example Slack Huddles API\ \ \ example

Compare

Recall.ai vs Attendee\ \ \ example Recall.ai vs Meeting BaaS\ \ \ example Recall.ai vs Nylas Notetaker\ \ \ example Recall.ai vs Skribby\ \ \ example

More

Meeting Bots

Google Meet Bot API\ \ \ example Microsoft Teams Bot API\ \ \ example Zoom Meeting Bot API\ \ \ example

Recording

Google Meet Recording API\ \ \ example Microsoft Teams Recording API\ \ \ example Zoom Meeting Recording API\ \ \ example

Transcription

Google Meet Transcription API\ \ \ example Microsoft Teams Transcription API\ \ \ example Zoom Meeting Transcription API\ \ \ example