Circle V2 API Docs
    Preparing search index...
    getPlaybackUrl: QueryProcedure<
        {
            input: { sessionId: string };
            meta: object;
            output: { signedUrl: null } | { signedUrl: string };
        },
    > = ...

    Returns a fresh signed URL for playing back a session's recording, or signedUrl: null if the audio is no longer available.

    The shared Supabase project runs a 48h cleanup cron against the session-recordings bucket (see legacy chron-bucket-cleanup). Sessions retain their file_url in the DB forever but the underlying blob is deleted after 48h. Rather than rendering a silently broken <audio> element, we ask Supabase to mint a signed URL and treat any failure as "the file is gone" — createSignedUrlFromFileUrl returns an error for missing objects (or unparseable URLs), which we surface as a null signedUrl so the UI can hide the playback section cleanly.