How-to

Daily recording

Cloud recording for Daily voice sessions — retrieval, storage integration, and troubleshooting.

How recording works

Daily rooms created by Breeze Buddy have cloud recording enabled by default. Recording starts automatically when participants join and captures all audio tracks server-side — no client-side configuration needed.

Session Ends
Daily Processes Recording
Fetch via Daily API
Download Audio
Upload to Cloud Storage
Store URL on Lead
SettingValueNotes
Recording ModecloudServer-side recording via Daily infrastructure
Auto-StarttrueRecording begins when participants join
Formatmp4 (audio)Contains audio tracks from all participants
Room Expiry1 hourRoom auto-deletes; recording persists on Daily servers

Recording retrieval flow

After a session ends, Breeze Buddy automatically retrieves and stores the recording:

  1. Locate the recording — query GET /recordings?room_name={'{name}'} on the Daily API
  2. Get access link — call GET /recordings/{'{id}'}/access-link to obtain a temporary signed download URL
  3. Download audio — fetch the audio bytes from the signed URL
  4. Upload to cloud storage — store the file in your configured storage provider (GCS or S3)
  5. Update lead record — the recording_url field on the lead is updated with the permanent storage URL

Cloud storage configuration

Configure your storage provider via environment variables:

.env
bash
# Google Cloud Storage
RECORDING_STORAGE_PROVIDER=gcs
GCS_BUCKET_NAME=your-recordings-bucket
GCS_CREDENTIALS_FILE=/path/to/service-account.json
# — OR — AWS S3
RECORDING_STORAGE_PROVIDER=s3
S3_BUCKET_NAME=your-recordings-bucket
AWS_ACCESS_KEY_ID=AKIA...
AWS_SECRET_ACCESS_KEY=...
AWS_REGION=us-east-1

Storage & Retention

Daily-side retention: Daily stores cloud recordings for 7 days by default. Breeze Buddy fetches recordings immediately after sessions end, but if retrieval fails, you have a 7-day window to retry.

Your storage: Once uploaded to GCS or S3, retention is governed by your bucket lifecycle policies.

Cost: Cloud recording on Daily incurs additional usage charges. See the Daily pricing page for details.

Download endpoint

Retrieve the recording for a specific lead via the Breeze Buddy API:

GET /agent/voice/breeze-buddy/leads/{lead_id}/recording

Download Example

download-recording.ts
typescript
const response = await fetch(
  `https://your-api.example.com/agent/voice/breeze-buddy/leads/${leadId}/recording`,
  {
    headers: {
      'Authorization': 'Bearer <your-api-key>'
    }
  }
);
if (response.ok) {
  const blob = await response.blob();
  const url = URL.createObjectURL(blob);
  const audio = new Audio(url);
  audio.play();
} else {
  console.error('Recording not available:', response.status);
}

cURL Example

terminal
bash
curl -H "Authorization: Bearer <your-api-key>" \
  -o recording.mp4 \
  https://your-api.example.com/agent/voice/breeze-buddy/leads/{lead_id}/recording

Recording in the lead lifecycle

The recording URL is stored on the lead record once processing completes:

json
{
  "lead_id": "uuid-of-the-lead",
  "status": "FINISHED",
  "call_id": "room-abc123",
  "recording_url": "https://storage.googleapis.com/your-bucket/recordings/room-abc123.mp4",
  "duration_seconds": 142,
  "outcome": "appointment_confirmed"
}

Webhook Notification

Configure a webhook to receive a notification when recording processing is complete. The webhook payload includes the recording_url so you can trigger downstream workflows automatically.

Troubleshooting

IssueCauseResolution
Recording URL is nullRecording retrieval hasn’t completed yetWait 1–2 minutes after session ends; check webhook for completion
Recording download returns 404File hasn’t been uploaded to cloud storageCheck storage provider credentials and bucket permissions
Recording is empty / 0 bytesSession ended before audio was exchangedEnsure bot joined and at least one audio exchange occurred
Daily API returns no recordingsRecording processed but Daily retention expiredRecordings expire after 7 days on Daily — ensure timely retrieval

Next steps

Was this helpful?