Skip to navigation

Meeting Captions

Use the platform's own native captions as the transcript
View as Markdown

meeting_captions saves the captions the meeting platform itself generates. No provider key and no extra cost for a transcription engine.

Platform support

ZoomGoogle MeetMicrosoft Teams
AvailabilityUse another provider (for example deepgram or deepgram_streaming)YesYes, when captions are already running in the meeting
Who turns captions onNot applicableThe bot, right after it is admittedNot the bot. Captions must already be running in the meeting
Live delivery to your webhookNot applicableYes, to live_transcription_required.webhook_urlSaved for after the call
LanguageNot applicableEnglish. For other languages, use another providerLabeled English (en) whatever the spoken language
While recording is pausedNot applicableCaptions keep arrivingNot saved

On Zoom, use any other provider instead. See the capability matrix for the rest of what each platform supports.

Enable

{
"meeting_link": "https://meet.google.com/abc-defg-hij",
"bot_name": "Notetaker",
"recording_config": {
"transcript": { "provider": { "meeting_captions": {} } }
}
}

To also receive Google Meet captions live, add a webhook:

{
"meeting_link": "https://meet.google.com/abc-defg-hij",
"bot_name": "Notetaker",
"live_transcription_required": { "webhook_url": "https://example.com/captions" },
"recording_config": {
"transcript": { "provider": { "meeting_captions": {} } }
}
}

CLI: meetstream bot create <link> -t meeting_captions.

How it works on each platform

After the bot is admitted, it turns Meet’s captions on for itself. If that does not take on the first try, it retries every 15 seconds; the join itself never fails because of captions. The bot reads caption text directly from Meet, with the speaker’s name and Meet device ID, and requests captions in English.

With live_transcription_required.webhook_url set, each caption update is POSTed to your webhook:

{
"type": "caption",
"bot_id": "f923cd21-da86-4d77-b37b-0707d37751c8",
"caption": {
"text": "Let's start with the roadmap.",
"speakerName": "Jane Smith",
"speakerDisplayName": "Jane",
"deviceId": "spaces/AbCdEf/devices/185",
"captionId": "42",
"version": 3,
"languageId": "en",
"timestamp": "2026-09-20T17:04:12.118Z",
"sessionTimestamp": 132.4
},
"custom_attributes": { "crm_id": "88421" }
}

The same captionId can arrive more than once as Meet refines the text: keep the update with the highest version. MeetStream sends each caption update one time. Respond with a 2xx quickly, then process the update. Caption POSTs do not include the X-MeetStream-Signature header, so put a secret token in the webhook URL and check it on each request.

The bot does not click the captions button. It collects captions only while live captions are already running in the meeting, and keeps final captions only (no interim text). Captions are saved for retrieval during and after the call; they are not sent to a webhook. Every caption is labeled en, whatever language was spoken.

On Zoom, use a post-call provider such as deepgram, or a live provider such as deepgram_streaming.

Fetch the captions

meeting_captions returns a transcript_id in the Create Bot response, like other providers:

curl "https://api.meetstream.ai/api/v1/transcript/<TRANSCRIPT_ID>/get_transcript" \
-H "Authorization: Token <YOUR_API_KEY>"
  • During the call, this returns the captions collected so far. After the call, it returns the final caption file.
  • 404 with Captions not available yet... means no captions were captured yet. On Zoom, use another provider.

You can also download the raw file from GET /api/v1/bots/{bot_id}/detail: the caption_file field is {"available": true, "download_url": "..."} when captions exist (link valid for 1 hour), or {"available": false}.

What to know

  • Availability depends on the meeting. On Teams, captions have to be running in the meeting for the bot to collect anything. If the platform does not produce captions for a meeting, there is nothing to save.
  • Webhook pipeline: captions are not a post-call transcription run, so there is no transcription.processed event. The bot’s post-call pipeline still ends with bot.done. See webhooks and events.
  • Speaker labels come from the platform, so they match the names people use in the meeting.

Need a formatted, speaker-labeled transcript from a provider instead? Re-transcribe the recording with any post-call provider.