You can record any active call by sending a start_recording command. Once the recording finishes, the audio file is stored and made available through the recordings API.
Starting a Recording
To begin recording, send a start_recording call command :
curl -X POST https://api.buildwithchirp.com/v1/calls/call_abc123/commands \
-H "Authorization: Bearer YOUR_APP_KEY" \
-H "Content-Type: application/json" \
-d '{
"type": "start_recording",
"format": "mp4"
}'
Format Description mp4MPEG-4 audio (default) oggOgg Vorbis audio webmWebM audio
Stopping a Recording
You can stop a recording explicitly with the stop_recording command, or the recording ends automatically when the call ends.
curl -X POST https://api.buildwithchirp.com/v1/calls/call_abc123/commands \
-H "Authorization: Bearer YOUR_APP_KEY" \
-H "Content-Type: application/json" \
-d '{ "type": "stop_recording" }'
Recording Lifecycle
Recordings move through these statuses:
Status Description recordingActively capturing audio processingAudio is being processed and uploaded to storage completedRecording is ready to download failedProcessing failed
When a recording reaches the completed status, a calls.recording.completed webhook is fired.
List Recordings
Retrieve all recordings for a specific call.
List recordings for a call
curl -X GET https://api.buildwithchirp.com/v1/calls/call_abc123/recordings \
-H "Authorization: Bearer YOUR_APP_KEY"
{
"data" : [
{
"id" : "call_rec_abc123" ,
"callId" : "call_abc123" ,
"status" : "completed" ,
"format" : "mp4" ,
"duration" : 120 ,
"fileUrl" : "https://storage.example.com/recordings/call_rec_abc123.mp4?signed=..." ,
"fileSize" : 1048576 ,
"startedAt" : "2026-01-15T10:30:00Z" ,
"endedAt" : "2026-01-15T10:32:00Z" ,
"createdAt" : "2026-01-15T10:30:00Z"
}
],
"totalCount" : 1
}
Get Recording Details
Retrieve a specific recording by ID. For completed recordings, the response includes a signed download URL that is valid for one hour.
curl -X GET https://api.buildwithchirp.com/v1/calls/recordings/call_rec_abc123 \
-H "Authorization: Bearer YOUR_APP_KEY"
{
"id" : "call_rec_abc123" ,
"callId" : "call_abc123" ,
"status" : "completed" ,
"format" : "mp4" ,
"duration" : 120 ,
"fileUrl" : "https://storage.example.com/recordings/call_rec_abc123.mp4?signed=..." ,
"fileSize" : 1048576 ,
"startedAt" : "2026-01-15T10:30:00Z" ,
"endedAt" : "2026-01-15T10:32:00Z" ,
"createdAt" : "2026-01-15T10:30:00Z"
}
The fileUrl is a time-limited signed URL. If you need to download the file later, request the recording details again to get a fresh URL.
Download a Recording
To download the recording file, fetch the fileUrl from the get recording response:
curl -o recording.mp4 "https://storage.example.com/recordings/call_rec_abc123.mp4?signed=..."
The signed URL is valid for one hour from the time it was generated. After expiration, request the recording details again to get a new URL.
Delete a Recording
Delete a recording from both storage and the database.
curl -X DELETE https://api.buildwithchirp.com/v1/calls/recordings/call_rec_abc123 \
-H "Authorization: Bearer YOUR_APP_KEY"
{
"message" : "Recording deleted"
}
Deleting a recording is permanent. The audio file is removed from storage and the record is soft-deleted from the database.
Webhook
When a recording finishes processing, Chirp sends a calls.recording.completed webhook to your configured webhook URL. Use this to trigger downstream workflows such as transcription or archival.