Skip to main content
Paid plans only Daily offers two transcription approaches via the REST API:
  • Real-time — start, update, and stop transcription during an active call using the /rooms/{room_name}/transcription endpoints.
  • Post-call — submit a recording ID or media URL to the Batch Processor after a call ends to generate a transcript (and optionally a summary).
Both approaches deliver lifecycle notifications via webhooks.

Real-time transcription

Real-time transcription runs during an active call and streams text to all in-call participants as speech is detected. Transcripts can optionally be saved to storage as WebVTT files.

Starting transcription

language
string
default:"'en'"
BCP-47 language tag. Examples: 'en', 'es', 'fr', 'de', 'ja', 'pt-BR'. Available languages depend on the Deepgram model in use.
model
string
Deepgram model name. Examples: 'nova-2-general', 'nova-2', 'enhanced', 'base'. Higher-tier models offer better accuracy at higher cost.
profanity_filter
boolean
When true, Deepgram replaces profane words with asterisks.
redact
Array<string> | boolean
Entities to redact. Pass true to redact all supported entities, or an array of strings (e.g. ['pci', 'ssn']).
endpointing
number | boolean
How long Deepgram waits for silence before ending an utterance. Pass a number (milliseconds) or true/false.
punctuate
boolean
When true, Deepgram adds punctuation to the transcript.
instanceId
string
Identifier for this transcription instance. Required when running multiple simultaneous transcriptions in the same room.
participants
string[]
Array of session IDs. When provided, only those participants’ audio is transcribed. Omit to transcribe everyone.
Check out Deepgram’s language support documentation for the model/language combination that works best for your use case.
See the start transcription endpoint for the full API reference.

Updating transcription

Change which participants are transcribed mid-call:
Include instanceId to target a specific instance when running multiple transcriptions simultaneously. See the update transcription endpoint for the full API reference.

Stopping transcription

To stop a named instance: --data '{ "instanceId": "primary" }' If transcript storage is enabled, the final WebVTT file is written when transcription stops. Listen for the transcript.ready-to-download webhook to know when the file is available. See the stop transcription endpoint for the full API reference.

Auto-starting transcription

Instead of starting transcription manually, you can have it begin automatically when a meeting owner joins by setting auto_start_transcription on their meeting token. Pair it with auto_transcription_settings on the room to configure the model and language. Meeting token (triggers auto-start for that owner):
Room config (sets the transcription options used when auto-start fires):
See the auto_start_transcription meeting token property and auto_transcription_settings room property for full details.

Transcript storage

By default, real-time transcripts are streamed to call participants but not saved. To persist transcripts as WebVTT files, enable storage at the room or domain level. Room level:
Domain level:
While transcription is active, the file is written every two minutes. The final version is written when transcription ends. Transcripts are stored in Daily’s cloud by default. To use your own S3 bucket, configure the transcription_bucket domain property:
The setup process is the same as configuring a custom S3 bucket for recordings.

Post-call transcription

The Batch Processor generates transcripts and summaries from recordings or any publicly accessible audio/video URL — no active call required.

Submitting a job

Specify a preset (transcript or summarize), an input source, and an output path:
The response returns a job ID:
Output formats for transcript jobs: txt, srt, vtt, json. The summarize preset produces a plain text file.

Retrieving batch job results

Poll job status or get a signed download URL using the job ID returned from submit:

Events via webhooks

Subscribe to transcription lifecycle events from the Daily dashboard or via the webhooks REST API. Events are delivered as POST requests to your webhook URL.

Real-time transcription events

transcript.started

Fired when real-time transcription begins. Includes the instanceId and, if storage is enabled, the S3 path where the transcript will be written.
See the transcript.started reference.

transcript.ready-to-download

Fired when transcription ends and the saved transcript file is available. This is the completion signal — use out_params.s3 to locate the file, or use the get transcript link endpoint to get a signed URL.
Despite the name, transcript.ready-to-download is the equivalent of “transcription stopped” — it fires when the transcript reaches a finished state. You may also receive a transcript.error event if a storage error occurred alongside completion.
See the transcript.ready-to-download reference.

transcript.error

Fired if an error occurs during transcription or before it could start. Includes an error field with details. May fire alongside transcript.started or transcript.ready-to-download depending on when the error occurred.
See the transcript.error reference.

Batch Processor events

batch-processor.job-finished

Fired when a Batch Processor job completes. The output field contains S3 locations for all generated files (transcript in all formats, and summary if requested).
See the batch-processor.job-finished reference.

batch-processor.error

Fired when a Batch Processor job fails. Includes an error field with details.
See the batch-processor.error reference.

Accessing saved transcripts

Both real-time transcripts (when enable_transcription_storage is on) and Batch Processor transcripts are accessible via the /transcript endpoints. Use these to list, download, and clean up transcripts after the fact.

Listing transcripts

Returns an array of transcript objects for your domain. Each object includes a transcriptId, room and session identifiers, duration, and status.
Returns a signed URL to download the WebVTT file. For Batch Processor transcripts, use the get job access link endpoint instead.

Deleting a transcript

The transcript object

A transcript object represents a single transcription session:
Key status values:
  • "t_finished" — transcription is complete and the file is available
  • "isVttAvailable": true — the WebVTT file can be downloaded

Transcription overview

Billing, storage options, permissions, and a comparison of real-time vs. post-call approaches.

daily-js guide

Start and manage transcription from a call object with full parameter reference and a live captions example.

Daily React guide

Use the useTranscription hook for reactive transcription state in React apps.