Skip to navigation

Post-Call Meeting Transcription: Speaker-Labeled Transcripts After the Call

View as Markdown

Get a clean, speaker-labeled transcript of the whole meeting a few minutes after the bot leaves.

Supported providers:

  • deepgram
  • assemblyai
  • jigsawstack
  • sarvam
  • meetstream (MeetStream engine, no provider key needed)
  • meeting_captions (native captions from Google Meet and Microsoft Teams; not Zoom)


Platform support

ZoomGoogle MeetMicrosoft Teams
deepgram, assemblyai, jigsawstack, sarvam, meetstreamYesYesYes
meeting_captionsNot supported. Accepted, but no captions are producedYes. The bot turns captions on; EnglishOnly if captions are already running in the meeting; labeled English
Speaker labels in the transcriptYesYesYes

See meeting captions for the caption details and the capability matrix for everything else.


1) Enable transcription in recording_config

When calling Create Bot, put the provider under recording_config.transcript.provider:

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

recording_config.transcript.provider is the only location read. An old top-level transcription field is ignored: the bot still records, but you get no transcript.

  • One post-call provider runs. If you list more than one, the first in this order is used: deepgram, assemblyai, jigsawstack or meetstream, sarvam.
  • You can add a streaming provider in the same request for a live transcript as well. See live transcription.
  • deepgram, assemblyai, jigsawstack and sarvam use your own provider key, saved in the dashboard under Integrations > Transcription. Without it, Create Bot returns 400, for example DeepgramAPIKey not configured in user profile. meetstream needs no key. See who supplies the API key.

In the dashboard’s API Playground, the same choice is on the Transcribe step:

API Playground bot builder on the Transcribe step with Post-call transcription selected and the provider dropdown highlighted
API Playground, Transcribe step: (1) Post-call transcription, (2) the provider, sent as recording_config.transcript.provider.

2) Provider payload examples

A) JigsawStack (jigsawstack)

"transcript": {
"provider": {
"jigsawstack": {
"language": "auto",
"translate": false,
"by_speaker": true
}
}
}

Set language to auto or choose from JigsawStack’s 163 codes for 162 supported languages.


B) Deepgram (deepgram)

"transcript": {
"provider": {
"deepgram": {
"model": "nova-3",
"language": "en",
"punctuate": true,
"smart_format": true,
"diarize": true,
"paragraphs": true,
"numerals": true,
"filler_words": false,
"keywords": ["MeetStream", "recording", "transcript"],
"utterances": true,
"utt_split": 0.8,
"detect_language": false,
"search": ["MeetStream", "recording"],
"tag": ["custom"]
}
}
}

C) AssemblyAI (assemblyai)

"transcript": {
"provider": {
"assemblyai": {
"speech_models": ["universal-2"],
"language_code": "en_us",
"speaker_labels": true,
"punctuate": true,
"format_text": true,
"filter_profanity": false,
"redact_pii": false,
"keyterms_prompt": ["MeetStream"],
"auto_chapters": false,
"entity_detection": false
}
}
}

D) Sarvam AI (sarvam)

"transcript": {
"provider": {
"sarvam": {
"model": "saaras:v3",
"language_code": "en-IN",
"mode": "transcribe",
"with_diarization": true
}
}
}

E) MeetStream AI (meetstream)

"transcript": {
"provider": {
"meetstream": {
"language": "auto",
"translate": false
}
}
}

F) Meeting captions (Google Meet and Teams)

"transcript": {
"provider": {
"meeting_captions": {}
}
}

Not supported on Zoom. On Teams, captions must already be running in the meeting.

Provider options are passed through to the provider as you send them. MeetStream does not check model or language names, so a typo surfaces as a failed transcript (transcription.failed), not as a Create Bot error.


3) Getting transcript_id after creating the bot

The Create Bot response includes a transcript_id for every post-call provider and for meeting_captions:

{
"bot_id": "f923cd21-da86-4d77-b37b-0707d37751c8",
"transcript_id": "3b0e6a8e-9a53-4c1c-8e0e-6f1f1d2a7c55",
"meeting_url": "https://meet.google.com/abc-defg-hij",
"status": "Active"
}

Store it. You can also read it later from GET /api/v1/bots/{bot_id}/detail.


4) Fetch the post-call transcript

A) Standard transcript (formatted)

GET /api/v1/transcript/{transcript_id}/get_transcript

B) Raw provider output

GET /api/v1/transcript/{transcript_id}/get_transcript?raw=true
StatusMeaning
200The transcript
202Transcript is still being processed. Current status: .... Try again shortly, or wait for transcription.processed
404Not found, or (for meeting_captions) no captions were captured
500Transcript processing failed: ... with the provider’s reason

5) Fetch native captions (meeting_captions)

Captions use the same get_transcript call with the transcript_id above; during the call it returns the captions collected so far. You can also download the raw caption file from bot details:

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}.


  1. Create the bot with recording_config.transcript.provider set, and store bot_id and transcript_id.
  2. Listen for webhooks. The post-call ones are:
    • transcription.processed: the transcript is ready. Fetch it with transcript_id.
    • transcription.failed: the provider failed. The message has the reason.
    • transcription.skipped: there was no audio to transcribe.
    • bot.done: the whole post-call pipeline has finished.
  3. For meeting_captions, there is no transcription.processed. Fetch the captions after bot.done.
  4. A bot that was never admitted (NotAllowed, Denied) sends no transcription.* event at all; bot.done still fires.

7) Re-transcribe a recording

Try another provider or language on the same recording, without re-recording:

curl -X POST "https://api.meetstream.ai/api/v1/bots/<BOT_ID>/transcribe" \
-H "Authorization: Token <YOUR_API_KEY>" \
-H "Content-Type: application/json" \
-d '{ "provider": { "deepgram": { "model": "nova-3", "language": "es" } } }'

It returns a new transcript_id. Only after the bot has left the meeting (409 before that), and only if audio was recorded (404 otherwise). meetstream can be used once per bot. More in transcription providers.


Troubleshooting

  • No transcript and no transcription.* webhook?
    • Check the provider is under recording_config.transcript.provider, not a top-level transcription field.
    • Check the bot was admitted. A bot that ended as NotAllowed or Denied recorded nothing. See bot status and error codes.
  • 202 right after the meeting? Processing takes a few minutes for long meetings. Wait for transcription.processed.
  • transcription.failed? Check the model and language values are valid for that provider, and that your saved provider key is current.
  • meeting_captions returned 404? On Zoom this is expected (not supported). On Teams, captions were probably not running in the meeting. On Google Meet, check the bot was admitted.