curl --request GET \
--url https://api.daily.co/v1/recordings/{recording_id}/access-link \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.daily.co/v1/recordings/{recording_id}/access-link"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.daily.co/v1/recordings/{recording_id}/access-link', 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.daily.co/v1/recordings/{recording_id}/access-link",
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: Bearer <token>"
],
]);
$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.daily.co/v1/recordings/{recording_id}/access-link"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
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.daily.co/v1/recordings/{recording_id}/access-link")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.daily.co/v1/recordings/{recording_id}/access-link")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"download_link": "https://b.daily.co/recordings/api-demo/hello/1548790973821?dl=api-demo%2Fhello%2F1548790973821.webm&Expires=1548809176&Signature=Gt5RhZ0kXksNriqmlm~T9hbq-asExampleSignature_&Key-Pair-Id=K1EXAMPLEKEYPAIR",
"expires": 1548809176,
"storage_provider": "aws"
}{
"error": "invalid-request-error",
"info": "missing required field"
}Get Recording Link
Generate an access link for a recording. The download_link is a short-lived signed URL: see the access links guide for more information.
curl --request GET \
--url https://api.daily.co/v1/recordings/{recording_id}/access-link \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.daily.co/v1/recordings/{recording_id}/access-link"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.daily.co/v1/recordings/{recording_id}/access-link', 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.daily.co/v1/recordings/{recording_id}/access-link",
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: Bearer <token>"
],
]);
$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.daily.co/v1/recordings/{recording_id}/access-link"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
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.daily.co/v1/recordings/{recording_id}/access-link")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.daily.co/v1/recordings/{recording_id}/access-link")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"download_link": "https://b.daily.co/recordings/api-demo/hello/1548790973821?dl=api-demo%2Fhello%2F1548790973821.webm&Expires=1548809176&Signature=Gt5RhZ0kXksNriqmlm~T9hbq-asExampleSignature_&Key-Pair-Id=K1EXAMPLEKEYPAIR",
"expires": 1548809176,
"storage_provider": "aws"
}{
"error": "invalid-request-error",
"info": "missing required field"
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Path Parameters
Query Parameters
How long the returned download_link remains valid, in seconds. Accepts 900 (15 minutes) through 43200 (12 hours). A value outside that range returns a 400.
Read the response's expires field rather than adding valid_for_secs to the current time. expires is the Unix timestamp at which the link stops working, and it is authoritative when Daily grants a shorter lifetime than the one requested.
Recordings stored in your own Amazon S3 bucket have a maximum link lifetime of 3600 seconds. A larger valid_for_secs still returns a 200, with expires set one hour out and validity_capped set to true. Request a new link when you need the file again. Recordings in Daily storage and in customer-owned OCI Object Storage buckets are not affected. See Custom S3 storage.
900 <= x <= 43200Response
200
A short-lived signed download URL that must be used exactly as returned. See the access links guide for more information.
"https://b.daily.co/recordings/api-demo/hello/1548790973821?dl=api-demo%2Fhello%2F1548790973821.webm&Expires=1548809176&Signature=Gt5RhZ0kXksNriqmlm~T9hbq-asExampleSignature_&Key-Pair-Id=K1EXAMPLEKEYPAIR"
1548809176
The storage provider the recording was written to. aws for Amazon S3 (including Daily's own storage), oci for OCI Object Storage.
aws, oci "aws"
Present and true only when the requested valid_for_secs exceeded the maximum lifetime allowed for where this recording is stored, and the link was signed for the shorter lifetime instead. Absent otherwise. expires always reports the lifetime actually granted, so a client that reads expires needs no special handling for this case.
true