curl --request POST \
--url 'https://api.flashcat.cloud/safari/skill/list?app_key=' \
--header 'Content-Type: application/json' \
--data '
{
"p": 1,
"limit": 20,
"include_account": true
}
'import requests
url = "https://api.flashcat.cloud/safari/skill/list?app_key="
payload = {
"p": 1,
"limit": 20,
"include_account": 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({p: 1, limit: 20, include_account: true})
};
fetch('https://api.flashcat.cloud/safari/skill/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/skill/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([
'p' => 1,
'limit' => 20,
'include_account' => 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/safari/skill/list?app_key="
payload := strings.NewReader("{\n \"p\": 1,\n \"limit\": 20,\n \"include_account\": 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/safari/skill/list?app_key=")
.header("Content-Type", "application/json")
.body("{\n \"p\": 1,\n \"limit\": 20,\n \"include_account\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.flashcat.cloud/safari/skill/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 \"p\": 1,\n \"limit\": 20,\n \"include_account\": true\n}"
response = http.request(request)
puts response.read_body{
"request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4",
"data": {
"total": 1,
"skills": [
{
"skill_id": "skill_8s7Hn2kLpQ3xYbVc4Wd2m",
"account_id": 10023,
"team_id": 0,
"skill_name": "k8s-triage",
"description": "Diagnose unhealthy Kubernetes workloads from cluster events and pod logs.",
"version": "1.2.0",
"tags": [
"kubernetes",
"triage"
],
"author": "sre-team",
"tools": [
"bash",
"mcp:prometheus/query"
],
"status": "enabled",
"created_by": 80011,
"created_at": 1716960000000,
"updated_at": 1717046400000,
"can_edit": true,
"update_available": false,
"is_modified": false
}
]
}
}{
"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": "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 skills
List AI SRE skills visible to the caller across account and team scopes, with pagination.
curl --request POST \
--url 'https://api.flashcat.cloud/safari/skill/list?app_key=' \
--header 'Content-Type: application/json' \
--data '
{
"p": 1,
"limit": 20,
"include_account": true
}
'import requests
url = "https://api.flashcat.cloud/safari/skill/list?app_key="
payload = {
"p": 1,
"limit": 20,
"include_account": 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({p: 1, limit: 20, include_account: true})
};
fetch('https://api.flashcat.cloud/safari/skill/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/skill/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([
'p' => 1,
'limit' => 20,
'include_account' => 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/safari/skill/list?app_key="
payload := strings.NewReader("{\n \"p\": 1,\n \"limit\": 20,\n \"include_account\": 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/safari/skill/list?app_key=")
.header("Content-Type", "application/json")
.body("{\n \"p\": 1,\n \"limit\": 20,\n \"include_account\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.flashcat.cloud/safari/skill/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 \"p\": 1,\n \"limit\": 20,\n \"include_account\": true\n}"
response = http.request(request)
puts response.read_body{
"request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4",
"data": {
"total": 1,
"skills": [
{
"skill_id": "skill_8s7Hn2kLpQ3xYbVc4Wd2m",
"account_id": 10023,
"team_id": 0,
"skill_name": "k8s-triage",
"description": "Diagnose unhealthy Kubernetes workloads from cluster events and pod logs.",
"version": "1.2.0",
"tags": [
"kubernetes",
"triage"
],
"author": "sre-team",
"tools": [
"bash",
"mcp:prometheus/query"
],
"status": "enabled",
"created_by": 80011,
"created_at": 1716960000000,
"updated_at": 1717046400000,
"can_edit": true,
"update_available": false,
"is_modified": false
}
]
}
}{
"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": "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
- The
contentfield is omitted in list rows; fetch a single skill to read its body. scopeselectsall(default),account-only, orteam-only, overridinginclude_account; non-admins requesting specificteam_idsare silently filtered down to the teams they belong to.update_availablecompares against the marketplace catalog once per call; if the catalog fails to load, the badge is simply suppressed rather than the request failing.
Authorizations
App key issued from the Flashduty console. Required on every public API call. Keep it secret — it grants the same access as the owning account.
Body
Pagination, search, and team filter for listing skills.
Page number, 1-based.
Page size.
Restrict results to all (default), account-only (team_id=0), or team-only (excludes account-scoped rows). Overrides include_account when set.
all, account, team Free-text search across skill name, description, English description, skill ID, marketplace source template name, and author.
128Filter to these team IDs; empty = the caller's visible set.
Include account-scoped (team_id=0) rows. Defaults to true. Ignored when scope is account or team.
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
Paginated skill list.
Show child attributes
Show child attributes
Was this page helpful?