curl --request POST \
--url 'https://api.flashcat.cloud/safari/artifact/sign?app_key=' \
--header 'Content-Type: application/json' \
--data '
{
"file_id": "pf_SdhEA5fbZJGnHzwrNJMMSB"
}
'import requests
url = "https://api.flashcat.cloud/safari/artifact/sign?app_key="
payload = { "file_id": "pf_SdhEA5fbZJGnHzwrNJMMSB" }
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({file_id: 'pf_SdhEA5fbZJGnHzwrNJMMSB'})
};
fetch('https://api.flashcat.cloud/safari/artifact/sign?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/safari/artifact/sign?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([
'file_id' => 'pf_SdhEA5fbZJGnHzwrNJMMSB'
]),
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/safari/artifact/sign?app_key="
payload := strings.NewReader("{\n \"file_id\": \"pf_SdhEA5fbZJGnHzwrNJMMSB\"\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/safari/artifact/sign?app_key=")
.header("Content-Type", "application/json")
.body("{\n \"file_id\": \"pf_SdhEA5fbZJGnHzwrNJMMSB\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.flashcat.cloud/safari/artifact/sign?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 \"file_id\": \"pf_SdhEA5fbZJGnHzwrNJMMSB\"\n}"
response = http.request(request)
puts response.read_body{
"request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4",
"data": {
"download_url": "/safari/artifact/stream?mode=download&t=eyJmaWxlX2lkIjoicGZfU2RoRUE1ZmJaSkduSHp3ck5KTU1TQiJ9.c2lnbmF0dXJl",
"preview_url": "/safari/artifact/stream?mode=preview&t=eyJmaWxlX2lkIjoicGZfU2RoRUE1ZmJaSkduSHp3ck5KTU1TQiJ9.c2lnbmF0dXJl",
"expires_in": 300,
"name": "checkout-latency-postmortem.html",
"size": 18996,
"content_type": "text/html"
}
}{
"request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4",
"error": {
"code": "InvalidParameter",
"message": "The specified parameter skill_id 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."
}
}Create signed file URLs
Create short-lived signed URLs to download or preview a presented file.
curl --request POST \
--url 'https://api.flashcat.cloud/safari/artifact/sign?app_key=' \
--header 'Content-Type: application/json' \
--data '
{
"file_id": "pf_SdhEA5fbZJGnHzwrNJMMSB"
}
'import requests
url = "https://api.flashcat.cloud/safari/artifact/sign?app_key="
payload = { "file_id": "pf_SdhEA5fbZJGnHzwrNJMMSB" }
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({file_id: 'pf_SdhEA5fbZJGnHzwrNJMMSB'})
};
fetch('https://api.flashcat.cloud/safari/artifact/sign?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/safari/artifact/sign?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([
'file_id' => 'pf_SdhEA5fbZJGnHzwrNJMMSB'
]),
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/safari/artifact/sign?app_key="
payload := strings.NewReader("{\n \"file_id\": \"pf_SdhEA5fbZJGnHzwrNJMMSB\"\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/safari/artifact/sign?app_key=")
.header("Content-Type", "application/json")
.body("{\n \"file_id\": \"pf_SdhEA5fbZJGnHzwrNJMMSB\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.flashcat.cloud/safari/artifact/sign?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 \"file_id\": \"pf_SdhEA5fbZJGnHzwrNJMMSB\"\n}"
response = http.request(request)
puts response.read_body{
"request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4",
"data": {
"download_url": "/safari/artifact/stream?mode=download&t=eyJmaWxlX2lkIjoicGZfU2RoRUE1ZmJaSkduSHp3ck5KTU1TQiJ9.c2lnbmF0dXJl",
"preview_url": "/safari/artifact/stream?mode=preview&t=eyJmaWxlX2lkIjoicGZfU2RoRUE1ZmJaSkduSHp3ck5KTU1TQiJ9.c2lnbmF0dXJl",
"expires_in": 300,
"name": "checkout-latency-postmortem.html",
"size": 18996,
"content_type": "text/html"
}
}{
"request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4",
"error": {
"code": "InvalidParameter",
"message": "The specified parameter skill_id 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."
}
}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
- Works for any file of a live gallery artifact in the account; for other session files the caller needs access to the source session (or a valid
share_token). A missing file and a file the caller cannot reach both fail withResourceNotFound. - Both URLs expire after
expires_inseconds (300). Sign again to get fresh URLs. - The URLs are relative: prepend
https://api.flashcat.cloudand call them withGET /safari/artifact/stream, authenticated as the same member that signed them. The token is bound to the account and that member, so it does not work for anyone else.
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
Response
Success
Standard response envelope used by every Flashduty public API. On success data contains the endpoint-specific payload and error is absent. On failure error is present and data is absent. request_id is always present and is also mirrored in the Flashcat-Request-Id response header.
Unique ID for this request. Mirrored in the Flashcat-Request-Id header. Include it when reporting issues.
"01HK8XQE3Z7JM2NTFQ5YJ8P9R4"
Error payload inside the response envelope. Present only on non-2xx responses.
Show child attributes
Show child attributes
Short-lived signed URLs for downloading or previewing a file.
Show child attributes
Show child attributes
Was this page helpful?