curl --request POST \
--url 'https://api.flashcat.cloud/safari/artifact/gallery/list?app_key=' \
--header 'Content-Type: application/json' \
--data '
{
"scope": "all",
"page": 1,
"limit": 20
}
'import requests
url = "https://api.flashcat.cloud/safari/artifact/gallery/list?app_key="
payload = {
"scope": "all",
"page": 1,
"limit": 20
}
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({scope: 'all', page: 1, limit: 20})
};
fetch('https://api.flashcat.cloud/safari/artifact/gallery/list?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/gallery/list?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([
'scope' => 'all',
'page' => 1,
'limit' => 20
]),
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/gallery/list?app_key="
payload := strings.NewReader("{\n \"scope\": \"all\",\n \"page\": 1,\n \"limit\": 20\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/gallery/list?app_key=")
.header("Content-Type", "application/json")
.body("{\n \"scope\": \"all\",\n \"page\": 1,\n \"limit\": 20\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.flashcat.cloud/safari/artifact/gallery/list?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 \"scope\": \"all\",\n \"page\": 1,\n \"limit\": 20\n}"
response = http.request(request)
puts response.read_body{
"request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4",
"data": {
"items": [
{
"artifact_id": "art_VnfrWic8UbB9q3EfYR4Gmg",
"title": "Checkout API latency postmortem",
"team_id": 4012,
"team_name": "SRE",
"person_id": 2476001,
"creator_name": "Alice",
"is_mine": true,
"can_edit": true,
"session_id": "sess_VCbVPZrq9YoyBu8sNCmqUy",
"session_title": "Investigate checkout API latency spike",
"file_id": "pf_SdhEA5fbZJGnHzwrNJMMSB",
"name": "checkout-latency-postmortem.html",
"size": 18996,
"content_type": "text/html",
"created_at": 1785293373899,
"updated_at": 1785747910219,
"pinned_at": 1785750000000,
"share_enabled": true,
"public_url": "https://console.flashcat.cloud/share/artifact/art_VnfrWic8UbB9q3EfYR4Gmg",
"shared_by": 2476001,
"shared_at": 1785747928665,
"share_file_id": "pf_SdhEA5fbZJGnHzwrNJMMSB"
},
{
"artifact_id": "art_CWQzDU2PXSRJvKDhQbuMKu",
"title": "Weekly alert noise report",
"team_id": 4012,
"team_name": "SRE",
"person_id": 2476002,
"creator_name": "Bob",
"is_mine": false,
"can_edit": true,
"session_id": "sess_QXUC9C2PYWP5EE7vETR3UD",
"session_title": "Summarize last week's alert noise",
"file_id": "pf_Jnc4E5YBcWLGzunB4ntP9s",
"name": "alert-noise-weekly.pdf",
"size": 137107,
"content_type": "application/pdf",
"created_at": 1785229432881,
"updated_at": 1785741344822
}
],
"total": 17
}
}{
"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."
}
}List artifacts
List published artifacts visible to the caller, with pagination and title search.
curl --request POST \
--url 'https://api.flashcat.cloud/safari/artifact/gallery/list?app_key=' \
--header 'Content-Type: application/json' \
--data '
{
"scope": "all",
"page": 1,
"limit": 20
}
'import requests
url = "https://api.flashcat.cloud/safari/artifact/gallery/list?app_key="
payload = {
"scope": "all",
"page": 1,
"limit": 20
}
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({scope: 'all', page: 1, limit: 20})
};
fetch('https://api.flashcat.cloud/safari/artifact/gallery/list?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/gallery/list?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([
'scope' => 'all',
'page' => 1,
'limit' => 20
]),
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/gallery/list?app_key="
payload := strings.NewReader("{\n \"scope\": \"all\",\n \"page\": 1,\n \"limit\": 20\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/gallery/list?app_key=")
.header("Content-Type", "application/json")
.body("{\n \"scope\": \"all\",\n \"page\": 1,\n \"limit\": 20\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.flashcat.cloud/safari/artifact/gallery/list?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 \"scope\": \"all\",\n \"page\": 1,\n \"limit\": 20\n}"
response = http.request(request)
puts response.read_body{
"request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4",
"data": {
"items": [
{
"artifact_id": "art_VnfrWic8UbB9q3EfYR4Gmg",
"title": "Checkout API latency postmortem",
"team_id": 4012,
"team_name": "SRE",
"person_id": 2476001,
"creator_name": "Alice",
"is_mine": true,
"can_edit": true,
"session_id": "sess_VCbVPZrq9YoyBu8sNCmqUy",
"session_title": "Investigate checkout API latency spike",
"file_id": "pf_SdhEA5fbZJGnHzwrNJMMSB",
"name": "checkout-latency-postmortem.html",
"size": 18996,
"content_type": "text/html",
"created_at": 1785293373899,
"updated_at": 1785747910219,
"pinned_at": 1785750000000,
"share_enabled": true,
"public_url": "https://console.flashcat.cloud/share/artifact/art_VnfrWic8UbB9q3EfYR4Gmg",
"shared_by": 2476001,
"shared_at": 1785747928665,
"share_file_id": "pf_SdhEA5fbZJGnHzwrNJMMSB"
},
{
"artifact_id": "art_CWQzDU2PXSRJvKDhQbuMKu",
"title": "Weekly alert noise report",
"team_id": 4012,
"team_name": "SRE",
"person_id": 2476002,
"creator_name": "Bob",
"is_mine": false,
"can_edit": true,
"session_id": "sess_QXUC9C2PYWP5EE7vETR3UD",
"session_title": "Summarize last week's alert noise",
"file_id": "pf_Jnc4E5YBcWLGzunB4ntP9s",
"name": "alert-noise-weekly.pdf",
"size": 137107,
"content_type": "application/pdf",
"created_at": 1785229432881,
"updated_at": 1785741344822
}
],
"total": 17
}
}{
"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
scopeselectsall(default: the caller’s own personal artifacts plus artifacts of every team the caller belongs to),personal(only the caller’s own personal artifacts), orteam(only artifacts owned by the caller’s teams). An unknown value is treated asall.- Visibility uses the
app_keyowner’s identity and real team membership; account owners and admins see no extra artifacts here. To open any artifact in the account by ID, use/safari/artifact/gallery/get. - The caller’s pinned artifacts always come first; the rest are sorted by
updated_atdescending unlessorderby/ascsay otherwise.
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
Filter and paginate the artifact gallery.
Visibility scope. all (default) lists the caller's own personal artifacts plus artifacts of every team the caller belongs to; personal lists only the caller's own; team lists only team-owned artifacts of the caller's teams.
all, personal, team Restrict to artifacts owned by these team IDs, intersected with the scope filter. Non-positive IDs are ignored; teams the caller does not belong to return nothing, and personal artifacts are excluded whenever this is set.
Case-insensitive substring match on the artifact title.
Page number, 1-based. Values below 1 are treated as 1.
Number of artifacts per page. Values below 1 fall back to 20; values above 100 are capped at 100 (not rejected).
Sort field: created_at (publish time) or updated_at (last change). Empty sorts by updated_at descending. In every case the caller's pinned artifacts come first, and artifact_id breaks ties.
created_at, updated_at Sort ascending when true, descending when false. Applies only when orderby is set.
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
A page of gallery artifacts.
Show child attributes
Show child attributes
Was this page helpful?