curl --request POST \
--url 'https://api.flashcat.cloud/rum/session-replay/segments?app_key=' \
--header 'Content-Type: application/json' \
--data '
{
"limit": 2,
"session_id": "0a4a2e64-8a4f-4b9a-9c1e-3a2f9e6d7c81",
"url_mode": true
}
'import requests
url = "https://api.flashcat.cloud/rum/session-replay/segments?app_key="
payload = {
"limit": 2,
"session_id": "0a4a2e64-8a4f-4b9a-9c1e-3a2f9e6d7c81",
"url_mode": True
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({limit: 2, session_id: '0a4a2e64-8a4f-4b9a-9c1e-3a2f9e6d7c81', url_mode: true})
};
fetch('https://api.flashcat.cloud/rum/session-replay/segments?app_key=', 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.flashcat.cloud/rum/session-replay/segments?app_key=",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'limit' => 2,
'session_id' => '0a4a2e64-8a4f-4b9a-9c1e-3a2f9e6d7c81',
'url_mode' => true
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.flashcat.cloud/rum/session-replay/segments?app_key="
payload := strings.NewReader("{\n \"limit\": 2,\n \"session_id\": \"0a4a2e64-8a4f-4b9a-9c1e-3a2f9e6d7c81\",\n \"url_mode\": true\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.flashcat.cloud/rum/session-replay/segments?app_key=")
.header("Content-Type", "application/json")
.body("{\n \"limit\": 2,\n \"session_id\": \"0a4a2e64-8a4f-4b9a-9c1e-3a2f9e6d7c81\",\n \"url_mode\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.flashcat.cloud/rum/session-replay/segments?app_key=")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"limit\": 2,\n \"session_id\": \"0a4a2e64-8a4f-4b9a-9c1e-3a2f9e6d7c81\",\n \"url_mode\": true\n}"
response = http.request(request)
puts response.read_body{
"data": {
"items": [
"https://replay-storage.example.com/short-term/2451002751131/0a4a2e64-8a4f-4b9a-9c1e-3a2f9e6d7c81/segments/1752480001234?X-Amz-Signature=example",
"https://replay-storage.example.com/short-term/2451002751131/0a4a2e64-8a4f-4b9a-9c1e-3a2f9e6d7c81/segments/1752480032456?X-Amz-Signature=example"
],
"search_after_ctx": "c2hvcnQtdGVybS8yNDUxMDAyNzUxMTMxLzBhNGEyZTY0LThhNGYtNGI5YS05YzFlLTNhMmY5ZTZkN2M4MS9zZWdtZW50cy8xNzUyNDgwMDMyNDU2"
},
"request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R5"
}{
"error": {
"code": "InvalidParameter",
"message": "The specified parameter is not valid."
},
"request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4"
}{
"error": {
"code": "Unauthorized",
"message": "You are unauthorized."
},
"request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4"
}{
"error": {
"code": "AccessDenied",
"message": "Access Denied."
},
"request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4"
}{
"error": {
"code": "RequestTooFrequently",
"message": "Request too frequently."
},
"request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4"
}{
"error": {
"code": "InternalError",
"message": "We encountered an internal error, and it has been reported. Please try again later."
},
"request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4"
}List session replay segments
Page through the recorded replay segments of a session, as presigned URLs or a raw stream.
curl --request POST \
--url 'https://api.flashcat.cloud/rum/session-replay/segments?app_key=' \
--header 'Content-Type: application/json' \
--data '
{
"limit": 2,
"session_id": "0a4a2e64-8a4f-4b9a-9c1e-3a2f9e6d7c81",
"url_mode": true
}
'import requests
url = "https://api.flashcat.cloud/rum/session-replay/segments?app_key="
payload = {
"limit": 2,
"session_id": "0a4a2e64-8a4f-4b9a-9c1e-3a2f9e6d7c81",
"url_mode": True
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({limit: 2, session_id: '0a4a2e64-8a4f-4b9a-9c1e-3a2f9e6d7c81', url_mode: true})
};
fetch('https://api.flashcat.cloud/rum/session-replay/segments?app_key=', 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.flashcat.cloud/rum/session-replay/segments?app_key=",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'limit' => 2,
'session_id' => '0a4a2e64-8a4f-4b9a-9c1e-3a2f9e6d7c81',
'url_mode' => true
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.flashcat.cloud/rum/session-replay/segments?app_key="
payload := strings.NewReader("{\n \"limit\": 2,\n \"session_id\": \"0a4a2e64-8a4f-4b9a-9c1e-3a2f9e6d7c81\",\n \"url_mode\": true\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.flashcat.cloud/rum/session-replay/segments?app_key=")
.header("Content-Type", "application/json")
.body("{\n \"limit\": 2,\n \"session_id\": \"0a4a2e64-8a4f-4b9a-9c1e-3a2f9e6d7c81\",\n \"url_mode\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.flashcat.cloud/rum/session-replay/segments?app_key=")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"limit\": 2,\n \"session_id\": \"0a4a2e64-8a4f-4b9a-9c1e-3a2f9e6d7c81\",\n \"url_mode\": true\n}"
response = http.request(request)
puts response.read_body{
"data": {
"items": [
"https://replay-storage.example.com/short-term/2451002751131/0a4a2e64-8a4f-4b9a-9c1e-3a2f9e6d7c81/segments/1752480001234?X-Amz-Signature=example",
"https://replay-storage.example.com/short-term/2451002751131/0a4a2e64-8a4f-4b9a-9c1e-3a2f9e6d7c81/segments/1752480032456?X-Amz-Signature=example"
],
"search_after_ctx": "c2hvcnQtdGVybS8yNDUxMDAyNzUxMTMxLzBhNGEyZTY0LThhNGYtNGI5YS05YzFlLTNhMmY5ZTZkN2M4MS9zZWdtZW50cy8xNzUyNDgwMDMyNDU2"
},
"request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R5"
}{
"error": {
"code": "InvalidParameter",
"message": "The specified parameter is not valid."
},
"request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4"
}{
"error": {
"code": "Unauthorized",
"message": "You are unauthorized."
},
"request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4"
}{
"error": {
"code": "AccessDenied",
"message": "Access Denied."
},
"request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4"
}{
"error": {
"code": "RequestTooFrequently",
"message": "Request too frequently."
},
"request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4"
}{
"error": {
"code": "InternalError",
"message": "We encountered an internal error, and it has been reported. Please try again later."
},
"request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4"
}Restrictions
| Aspect | Value |
|---|---|
| Rate limits | 1,000 requests/minute; 50 requests/second per account |
| Permissions | None — any valid app_key can call this operation |
Usage
- When
url_modeisfalse(default), the response streamsapplication/x-ndjson— one decompressed replay segment JSON object per line — and is not wrapped in the standard envelope. The pagination cursor for the next call is returned in theX-Search-After-Ctxresponse header instead of a body field. A segment that cannot be read is skipped silently. - When
url_modeistrue, the response is a normal JSON envelope containing presigned download URLs (valid 1 hour) for the zlib-compressed segment objects. - Pass
ts(withoutsearch_after_ctx) to start from the last full-snapshot segment at or before that time, searching up to 4 hours back; if none is found, paging starts from the beginning. - A cursor is returned whenever a page is full (
limitsegments), so the last page can be empty. limitaccepts 1-99; values of 100 or more are rejected.- If the session belongs to a private application the caller cannot access, the call returns
AccessDenied(“You do not have permission to access this application”). - A page with no segments returns an empty result. Segments uploaded moments ago may not be indexed yet; the call then returns
ResourceNotFound(“Replay segments are not available yet. Please retry shortly”), so retry after a short wait.
Authorizations
APP Key created in the Flashduty console under My → APP Key. Send it as the app_key query parameter or in the Fd-App-Key request header. Its effective access is the intersection of the key's permission scope and the creator's current role permissions. Keep it secret.
Body
Page through the recorded replay segments of a session, or a single view within it.
RUM session ID (the session.id attribute on RUM events).
Maximum number of segments to return. 1-99, default 20.
1 <= x <= 99Pagination cursor from a previous call. Take it from the search_after_ctx field (URL mode) or the X-Search-After-Ctx response header (streaming mode).
Unix timestamp in milliseconds. When set and search_after_ctx is empty, paging starts at the last full-snapshot segment at or before this time (searching up to 4 hours back); if none is found, paging starts from the beginning.
When true, return presigned download URLs as a JSON envelope instead of streaming segment bytes. Defaults to false.
Restrict results to segments belonging to this view. Omit to page through the entire session.
Response
Success. Shape depends on url_mode — see Usage.
Success response envelope. On every 2xx response, request_id identifies the call (also mirrored in the Flashcat-Request-Id header) and data holds the endpoint-specific payload. Failure responses use a different shape — see ErrorResponse.
Was this page helpful?