There currently isn't a way to programmatically retrieve a video's transcript (VTT) via the Developer API or any public endpoint. The transcript data exists in S3 and is rendered in the share page UI, but it's only accessible through Next.js server actions — which can't be called externally with curl or similar tools.
Use case
I want to fetch transcripts for Cap recordings programmatically (e.g. to feed into documentation pipelines, search indexes, or note-taking workflows). Right now the only option is to open the share page in a browser and use the UI download button.
What exists today
The video object returned by GET /api/developer/v1/videos/:id already includes transcriptionStatus, but there's no endpoint to retrieve the actual transcript content.
Internally, the transcript is stored in S3 at {ownerId}/{videoId}/transcription.vtt and is fetched by the server action in apps/web/actions/videos/get-transcript.ts. The share page's Transcript tab (apps/web/app/s/[videoId]/_components/tabs/Transcript.tsx) consumes it via the useTranscript hook.
There is a code path in apps/web/app/api/playlist/route.ts that serves VTT when fileType=transcription is passed — but it's only reachable for videos stored in a custom S3 bucket, since the Option.isNone(customBucket) branch returns early with a redirect before the fileType check.
Proposal
Add a GET /api/developer/v1/videos/:id/transcript endpoint that returns the VTT content. Something like:
GET /api/developer/v1/videos/:id/transcript
Authorization: Bearer csk_...
200 OK
Content-Type: text/vtt
WEBVTT
1
00:00:01.000 --> 00:00:04.000
Hello, this is my recording...
Returning 404 when transcriptionStatus is not COMPLETE, and 202 if it's still PROCESSING.
This would follow the existing pattern in apps/web/app/api/developer/v1/[...route]/videos.ts and use the same S3Buckets.getBucketAccess + bucket.getObject approach that get-transcript.ts already uses.
A secondary (smaller) fix would be to also make the existing /api/playlist?videoId=...&fileType=transcription path work for default-bucket videos, not just custom-bucket ones.
Willingness to contribute
I'm happy to write the code for this if it's something you'd accept as a PR. Let me know if this aligns with your plans or if there's a preferred approach.
There currently isn't a way to programmatically retrieve a video's transcript (VTT) via the Developer API or any public endpoint. The transcript data exists in S3 and is rendered in the share page UI, but it's only accessible through Next.js server actions — which can't be called externally with
curlor similar tools.Use case
I want to fetch transcripts for Cap recordings programmatically (e.g. to feed into documentation pipelines, search indexes, or note-taking workflows). Right now the only option is to open the share page in a browser and use the UI download button.
What exists today
The video object returned by
GET /api/developer/v1/videos/:idalready includestranscriptionStatus, but there's no endpoint to retrieve the actual transcript content.Internally, the transcript is stored in S3 at
{ownerId}/{videoId}/transcription.vttand is fetched by the server action inapps/web/actions/videos/get-transcript.ts. The share page's Transcript tab (apps/web/app/s/[videoId]/_components/tabs/Transcript.tsx) consumes it via theuseTranscripthook.There is a code path in
apps/web/app/api/playlist/route.tsthat serves VTT whenfileType=transcriptionis passed — but it's only reachable for videos stored in a custom S3 bucket, since theOption.isNone(customBucket)branch returns early with a redirect before thefileTypecheck.Proposal
Add a
GET /api/developer/v1/videos/:id/transcriptendpoint that returns the VTT content. Something like:Returning
404whentranscriptionStatusis notCOMPLETE, and202if it's stillPROCESSING.This would follow the existing pattern in
apps/web/app/api/developer/v1/[...route]/videos.tsand use the sameS3Buckets.getBucketAccess+bucket.getObjectapproach thatget-transcript.tsalready uses.A secondary (smaller) fix would be to also make the existing
/api/playlist?videoId=...&fileType=transcriptionpath work for default-bucket videos, not just custom-bucket ones.Willingness to contribute
I'm happy to write the code for this if it's something you'd accept as a PR. Let me know if this aligns with your plans or if there's a preferred approach.