Captions and transcripts
Every commercial plan and the trial include caption upload and editing through the feature.captions entitlement.
One transcript for each language
A video stores one transcript for each language. The transcript contains timed segments with a start time, end time, text, and an optional speaker. Playflow renders the same stored transcript as WebVTT for the player, so editing the transcript also updates the captions.
Upload VTT or SRT
Open the video and choose the Transcript tab. Upload a WebVTT (.vtt) or SubRip (.srt) file and select its language. Uploading replaces the transcript for that language. It does not change other languages.
The authenticated app also accepts a multipart upload at POST /api/videos/:videoId/captions. Send file and language. When replacing an existing language, also send its current expectedVersion. Use GET /api/videos/:videoId/captions to list the video's languages. The list response is {"items":[TrackSummary]}. Each summary has an immutable track id and a version that changes with the current transcript, so clients can cache a specific version safely.
Edit and version
Edit segment text and timing directly in the transcript editor. Segment start and end values are seconds. Saving creates a new immutable version and keeps the last 10 versions for that language. If another upload or edit changed the transcript after you opened it, Playflow returns 409 instead of overwriting the newer version.
The authenticated endpoints are GET /api/videos/:videoId/captions/:lang and PUT /api/videos/:videoId/captions/:lang. A detail response is {"caption": Track}. A caption includes language, source, status, version, segmentCount, segments, cachedVtt, generatedAt, createdAt, and updatedAt. The public v1 API offers the matching GET and PUT operations at /api/v1/videos/:id/captions/:lang. The v1 PUT body contains segments and expectedVersion. See the API reference for segment fields and authentication.
Workspace terms
In Settings, use Terms next to AI transcription usage to add names and words AI should spell exactly in transcripts, captions and chapters. Each workspace can keep up to 100 terms, including automatic workspace, signup company and discovered brand names, with an optional “often heard as” hint. Workspace managers can add or delete terms on every plan, including automatic terms. Terms guide new AI generation where those features are available; they do not replace words in existing transcripts. When a request exceeds the transcription provider’s keyterm budget, the oldest manual terms are omitted first and automatic terms are retained. Captions do not display speaker labels.
Generate with AI
Open the video's Transcript tab and choose Generate with AI, or Regenerate when a transcript exists. Harbor has no AI minutes. Marina includes 600 generated minutes per month and Fleet includes 3,000 generated minutes per month. Billing shows successful generated minutes for the current month against the workspace cap. At the cap, a new generation is refused with an explanation.
Generation creates an editable transcript from the video's audio. Choose a language or use automatic detection. Progress stays on the Transcript tab when you leave and return. The completed transcript is editable just like an uploaded transcript, and the same content becomes the caption track in the player.
Provider failures retry after 1 minute, 5 minutes, and 30 minutes, then stop with a failure detail on the video. Only successful generation deducts minutes. If transcription is not configured, the button explains that it is unavailable; existing uploads and editing still work.
Integrations can queue work with POST /api/v1/videos/:id/captions/generate and a write-scoped API key, optionally sending a language code. A successful generation emits video.captions.ready. See the caption API reference and webhook delivery reference.
Download VTT or SRT
Download the current language as WebVTT or SubRip from the video page. For authenticated integrations, request GET /api/videos/:videoId/captions/:lang/download?format=vtt or use format=srt.
Delete a language
Deleting captions removes the current transcript and delivered track for that language, but not the video or another language. Use the video page, DELETE /api/videos/:videoId/captions/:lang, or the v1 DELETE /api/v1/videos/:id/captions/:lang operation. Supply the current version in If-Match, or as the expectedVersion query parameter. A successful delete returns 204.
Who can receive captions
- Public and unlisted videos without a password: the player can load the current anonymous WebVTT track. Eligibility is checked again on every request. The response uses an ETag and a cache lifetime of no more than 60 seconds, so an older version does not remain available after a change.
- Password-protected videos: the anonymous WebVTT route is not eligible while a password is set. Caption delivery must follow the protected playback session, so a caption URL cannot bypass the password.
- Private videos: owner tracks and downloads use authenticated routes. Captions are not published for a public share or embed page.
Caption changes publish the updated player track and can send the video.captions.updated webhook event. See Webhooks for delivery and retry behavior.
Captions from Adilo
New Adilo imports bring over available subtitles and translations as one Playflow transcript per language. For previously imported videos, use Bring over captions. If Adilo returns 404 for the video detail or metadata, that item is unavailable. A 404 for one language skips only that language, so other available languages can still import. Playflow records the result, never deletes an existing track, and continues without reimporting or deleting the video. See Importing from Adilo.