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.
| Setting | Value | Notes |
|---|---|---|
| Recording Mode | cloud | Server-side recording via Daily infrastructure |
| Auto-Start | true | Recording begins when participants join |
| Format | mp4 (audio) | Contains audio tracks from all participants |
| Room Expiry | 1 hour | Room auto-deletes; recording persists on Daily servers |
Recording retrieval flow
After a session ends, Breeze Buddy automatically retrieves and stores the recording:
- Locate the recording — query
GET /recordings?room_name={'{name}'}on the Daily API - Get access link — call
GET /recordings/{'{id}'}/access-linkto obtain a temporary signed download URL - Download audio — fetch the audio bytes from the signed URL
- Upload to cloud storage — store the file in your configured storage provider (GCS or S3)
- Update lead record — the
recording_urlfield on the lead is updated with the permanent storage URL
Cloud storage configuration
Configure your storage provider via environment variables:
# 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-1Storage & 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:
/agent/voice/breeze-buddy/leads/{lead_id}/recording Download Example
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
curl -H "Authorization: Bearer <your-api-key>" \
-o recording.mp4 \
https://your-api.example.com/agent/voice/breeze-buddy/leads/{lead_id}/recordingRecording in the lead lifecycle
The recording URL is stored on the lead record once processing completes:
{
"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
| Issue | Cause | Resolution |
|---|---|---|
Recording URL is null | Recording retrieval hasn’t completed yet | Wait 1–2 minutes after session ends; check webhook for completion |
| Recording download returns 404 | File hasn’t been uploaded to cloud storage | Check storage provider credentials and bucket permissions |
| Recording is empty / 0 bytes | Session ended before audio was exchanged | Ensure bot joined and at least one audio exchange occurred |
| Daily API returns no recordings | Recording processed but Daily retention expired | Recordings expire after 7 days on Daily — ensure timely retrieval |