Overview
When a bot has recording enabled (and consent is on file), the voice service records the call room with LiveKit Egress into the private R2 bucketallternit-call-recordings as calls/<callId>.ogg, and reports the key as recordingRef in the call.ended event. Objects are deleted automatically after 90 days.
Voicemail the bot leaves on an answering machine is part of the same room recording, so it plays from the same endpoint. There is no separate voicemail audio.
The cloud API never streams the audio. It checks that the call is yours, confirms the object still exists, and returns a presigned URL that is valid for 10 minutes.
Get a recording
durationSec is omitted when the call’s call.ended event is no longer stored. Treat the URL as a secret: do not log it or share it. Ask again when it expires.
Configuration
The cloud API needs these environment variables:For developers: the R2 client
services/r2.rs is a small SigV4 client (region auto, path-style URLs, no SDK) that other features reuse: presign_get, presign_put, put, delete, head and list_prefix_size. Without the variables above, R2Client::from_env() returns R2Error::Unavailable and routes answer 503. Secrets and signed URLs are never logged.