Recordings live in a private bucket, which meant anything outside Studio — a transcription service, an archive job, an internal tool — had no way to fetch one.
A signed URL per recording
GET /api/meeting-data/:id/recording-url returns a short-lived signed URL for a meeting’s recording, along with the file’s size. The link expires on its own, so nothing long-lived needs to be stored or revoked.
This is for callers that ingest a recording. Playback inside Studio still goes through the S3 proxy and needs no change.
The real content type
The response reports the content type read from the stored object rather than guessed from the filename, because an extension doesn’t tell you whether a recording actually contains a video track. An audio/* type means there are no frames to look at — enough for a caller to decide whether to render a player or fall back to audio before downloading anything.