curl --request GET \
--url https://api.cal.com/v2/bookings/{bookingUid}/recordings \
--header 'Authorization: <authorization>' \
--header 'cal-api-version: <cal-api-version>'import requests
url = "https://api.cal.com/v2/bookings/{bookingUid}/recordings"
headers = {
"cal-api-version": "<cal-api-version>",
"Authorization": "<authorization>"
}
response = requests.get(url, headers=headers)
print(response.text)const options = {
method: 'GET',
headers: {'cal-api-version': '<cal-api-version>', Authorization: '<authorization>'}
};
fetch('https://api.cal.com/v2/bookings/{bookingUid}/recordings', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.cal.com/v2/bookings/{bookingUid}/recordings",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: <authorization>",
"cal-api-version: <cal-api-version>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.cal.com/v2/bookings/{bookingUid}/recordings"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("cal-api-version", "<cal-api-version>")
req.Header.Add("Authorization", "<authorization>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.cal.com/v2/bookings/{bookingUid}/recordings")
.header("cal-api-version", "<cal-api-version>")
.header("Authorization", "<authorization>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.cal.com/v2/bookings/{bookingUid}/recordings")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["cal-api-version"] = '<cal-api-version>'
request["Authorization"] = '<authorization>'
response = http.request(request)
puts response.read_body{
"status": "success",
"data": [
{
"id": "1234567890",
"roomName": "daily-video-room-123",
"startTs": 1678901234,
"status": "completed",
"duration": 3600,
"shareToken": "share-token-123",
"maxParticipants": 10,
"downloadLink": "https://cal-video-recordings.s3.us-east-2.amazonaws.com/meetco/123s",
"error": "Error message"
}
]
}Get all the recordings for the booking
Fetches all the recordings for the booking :bookingUid. Requires authentication and proper authorization. Access is granted to the booking organizer and hosts, and to team or organization members whose role can view the booking and has the booking.readRecordings permission, which team and organization admins and owners have by default.
Recording download links are valid for 1 hour only. Make a new request to generate fresh links after expiration.
cal-api-version: 2026-02-25 is required in the request header.
If accessed using an OAuth access token, the BOOKING_READ scope is required.
curl --request GET \
--url https://api.cal.com/v2/bookings/{bookingUid}/recordings \
--header 'Authorization: <authorization>' \
--header 'cal-api-version: <cal-api-version>'import requests
url = "https://api.cal.com/v2/bookings/{bookingUid}/recordings"
headers = {
"cal-api-version": "<cal-api-version>",
"Authorization": "<authorization>"
}
response = requests.get(url, headers=headers)
print(response.text)const options = {
method: 'GET',
headers: {'cal-api-version': '<cal-api-version>', Authorization: '<authorization>'}
};
fetch('https://api.cal.com/v2/bookings/{bookingUid}/recordings', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.cal.com/v2/bookings/{bookingUid}/recordings",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: <authorization>",
"cal-api-version: <cal-api-version>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.cal.com/v2/bookings/{bookingUid}/recordings"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("cal-api-version", "<cal-api-version>")
req.Header.Add("Authorization", "<authorization>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.cal.com/v2/bookings/{bookingUid}/recordings")
.header("cal-api-version", "<cal-api-version>")
.header("Authorization", "<authorization>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.cal.com/v2/bookings/{bookingUid}/recordings")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["cal-api-version"] = '<cal-api-version>'
request["Authorization"] = '<authorization>'
response = http.request(request)
puts response.read_body{
"status": "success",
"data": [
{
"id": "1234567890",
"roomName": "daily-video-room-123",
"startTs": 1678901234,
"status": "completed",
"duration": 3600,
"shareToken": "share-token-123",
"maxParticipants": 10,
"downloadLink": "https://cal-video-recordings.s3.us-east-2.amazonaws.com/meetco/123s",
"error": "Error message"
}
]
}Headers
Must be set to 2026-02-25.
"2026-02-25"
value must be Bearer <token> where <token> is api key prefixed with cal_, managed user access token, or OAuth access token
Path Parameters
Was this page helpful?