Ambient Content Retrieval
Get Ambient Session Recording
Get presigned URLs for Ambient session recordings for streaming or download
Listen to this page50 sec
GET
/
api
/
v1
/
ambient
/
session
/
{ambient_session_id}
/
recording
cURL
curl --request GET \
--url https://sdp.suki.ai/api/v1/ambient/session/<ambient_session_id>/recording?download=<download> \
--header 'sdp_suki_token: <sdp_suki_token>' \
--header 'sdp_provider_id: <sdp_provider_id>'import requests
url = "https://sdp.suki.ai/api/v1/ambient/session/{ambient_session_id}/recording"
headers = {"sdp_suki_token": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {sdp_suki_token: '<api-key>'}};
fetch('https://sdp.suki.ai/api/v1/ambient/session/{ambient_session_id}/recording', 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://sdp.suki.ai/api/v1/ambient/session/{ambient_session_id}/recording",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"sdp_suki_token: <api-key>"
],
]);
$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://sdp.suki.ai/api/v1/ambient/session/{ambient_session_id}/recording"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("sdp_suki_token", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://sdp.suki.ai/api/v1/ambient/session/{ambient_session_id}/recording")
.header("sdp_suki_token", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://sdp.suki.ai/api/v1/ambient/session/{ambient_session_id}/recording")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["sdp_suki_token"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"recordings": [
{
"recording_id": "01KFJZTJWZH28GRHQXVCGW4Y47",
"presigned_url": "https://storage.googleapis.com/...",
"expires_at": 1738765432,
"sequence_number": 1
}
],
"is_streamable": true
}{
"code": 400,
"message": "invalid request"
}{
"code": 401,
"message": "Invalid authentication credentials."
}{
"code": 404,
"message": "Recording not found or decryption in progress."
}{
"code": 410,
"message": "Recording has expired per retention policy."
}{
"code": 500,
"message": "An internal error occurred."
}Use this endpoint to get presigned URLs for all recordings for the . Refer to the Ambient session recordings guide for more details.
Use the
Build listen features or download buttons on note review with the URLs from this endpoint. For more details, refer to Ambient session recordings to learn best practices.
download query parameter to control the URL type:
- If
download=true, the URL is for downloading the full file. - If
download=falseor omitted, the URL supports streaming with range requests.
Code examples
- Python
- TypeScript
import requests
ambient_session_id = "123dfg-456dfg-789dfg-012dfg" # this will be the Ambient session id you get from the create Ambient session API
url = f"https://sdp.suki-stage.com/api/v1/ambient/session/{ambient_session_id}/recording"
headers = {
"sdp_suki_token": "<sdp_suki_token>",
"sdp_provider_id": "<sdp_provider_id>"
}
# For streaming URLs (default)
response = requests.get(url, headers=headers)
# For download-only URLs
# response = requests.get(url, headers=headers, params={"download": True})
if response.status_code == 200:
data = response.json()
print(f"Streamable: {data.get('is_streamable')}")
for rec in data.get("recordings", []):
print(f"Recording ID: {rec.get('recording_id')}")
print(f"Presigned URL: {rec.get('presigned_url')}")
print(f"Expires at: {rec.get('expires_at')}")
print(f"Sequence: {rec.get('sequence_number')}")
print("---")
else:
print(f"Failed to get recording URLs: {response.status_code}")
print(response.json())
const ambientSessionId = '123dfg-456dfg-789dfg-012dfg'; // this will be the Ambient session id you get from the create Ambient session API
// For streaming URLs (default)
const response = await fetch(
`https://sdp.suki-stage.com/api/v1/ambient/session/${ambientSessionId}/recording`,
{
headers: {
'sdp_suki_token': '<sdp_suki_token>',
'sdp_provider_id': '<sdp_provider_id>'
}
}
);
// For download-only URLs, append ?download=true
// const response = await fetch(
// `https://sdp.suki-stage.com/api/v1/ambient/session/${ambientSessionId}/recording?download=true`,
// { headers: { 'sdp_suki_token': '<sdp_suki_token>', 'sdp_provider_id': '<sdp_provider_id>' } }
// );
if (response.ok) {
const data = await response.json();
console.log('Streamable:', data.is_streamable);
data.recordings?.forEach((rec: any) => {
console.log('Recording ID:', rec.recording_id);
console.log('Presigned URL:', rec.presigned_url);
console.log('Expires at:', rec.expires_at);
console.log('Sequence:', rec.sequence_number);
console.log('---');
});
} else {
const error = await response.json();
console.error(`Failed to get recording URLs: ${response.status}`, error);
}
Authorizations
Suki access token (suki_token) from Login or Register. Expires after one hour.
Headers
Optional for standard partners.
Required for:
- Bearer authentication. Use the same
provider_idreturned by the Login or Register API. - Single Auth Token authentication. Include the same
provider_idon every request assdp_provider_id.
Example:
"provider-123"
Path Parameters
UUID for the ambient session. Use the ambient_session_id returned from Create Ambient Session, or the UUID you supplied in that request.
Query Parameters
If true, returns download-only URLs; if false or omitted, URLs support streaming with Range requests.
Last modified on August 20, 2026
Was this page helpful?
cURL
curl --request GET \
--url https://sdp.suki.ai/api/v1/ambient/session/<ambient_session_id>/recording?download=<download> \
--header 'sdp_suki_token: <sdp_suki_token>' \
--header 'sdp_provider_id: <sdp_provider_id>'import requests
url = "https://sdp.suki.ai/api/v1/ambient/session/{ambient_session_id}/recording"
headers = {"sdp_suki_token": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {sdp_suki_token: '<api-key>'}};
fetch('https://sdp.suki.ai/api/v1/ambient/session/{ambient_session_id}/recording', 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://sdp.suki.ai/api/v1/ambient/session/{ambient_session_id}/recording",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"sdp_suki_token: <api-key>"
],
]);
$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://sdp.suki.ai/api/v1/ambient/session/{ambient_session_id}/recording"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("sdp_suki_token", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://sdp.suki.ai/api/v1/ambient/session/{ambient_session_id}/recording")
.header("sdp_suki_token", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://sdp.suki.ai/api/v1/ambient/session/{ambient_session_id}/recording")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["sdp_suki_token"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"recordings": [
{
"recording_id": "01KFJZTJWZH28GRHQXVCGW4Y47",
"presigned_url": "https://storage.googleapis.com/...",
"expires_at": 1738765432,
"sequence_number": 1
}
],
"is_streamable": true
}{
"code": 400,
"message": "invalid request"
}{
"code": 401,
"message": "Invalid authentication credentials."
}{
"code": 404,
"message": "Recording not found or decryption in progress."
}{
"code": 410,
"message": "Recording has expired per retention policy."
}{
"code": 500,
"message": "An internal error occurred."
}