curl --request POST \
--url 'https://api.flashcat.cloud/template/update?app_key=' \
--header 'Content-Type: application/json' \
--data '
{
"template_id": "6605a1b2c3d4e5f6a7b8c9d0",
"template_name": "Prod incident default",
"description": "Updated description.",
"email": "Incident {{ .IncidentName }} on {{ .Severity }}",
"sms": "[Flashduty] {{ .IncidentName }} — {{ .Severity }}"
}
'import requests
url = "https://api.flashcat.cloud/template/update?app_key="
payload = {
"template_id": "6605a1b2c3d4e5f6a7b8c9d0",
"template_name": "Prod incident default",
"description": "Updated description.",
"email": "Incident {{ .IncidentName }} on {{ .Severity }}",
"sms": "[Flashduty] {{ .IncidentName }} — {{ .Severity }}"
}
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({
template_id: '6605a1b2c3d4e5f6a7b8c9d0',
template_name: 'Prod incident default',
description: 'Updated description.',
email: 'Incident {{ .IncidentName }} on {{ .Severity }}',
sms: '[Flashduty] {{ .IncidentName }} — {{ .Severity }}'
})
};
fetch('https://api.flashcat.cloud/template/update?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/template/update?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([
'template_id' => '6605a1b2c3d4e5f6a7b8c9d0',
'template_name' => 'Prod incident default',
'description' => 'Updated description.',
'email' => 'Incident {{ .IncidentName }} on {{ .Severity }}',
'sms' => '[Flashduty] {{ .IncidentName }} — {{ .Severity }}'
]),
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/template/update?app_key="
payload := strings.NewReader("{\n \"template_id\": \"6605a1b2c3d4e5f6a7b8c9d0\",\n \"template_name\": \"Prod incident default\",\n \"description\": \"Updated description.\",\n \"email\": \"Incident {{ .IncidentName }} on {{ .Severity }}\",\n \"sms\": \"[Flashduty] {{ .IncidentName }} — {{ .Severity }}\"\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/template/update?app_key=")
.header("Content-Type", "application/json")
.body("{\n \"template_id\": \"6605a1b2c3d4e5f6a7b8c9d0\",\n \"template_name\": \"Prod incident default\",\n \"description\": \"Updated description.\",\n \"email\": \"Incident {{ .IncidentName }} on {{ .Severity }}\",\n \"sms\": \"[Flashduty] {{ .IncidentName }} — {{ .Severity }}\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.flashcat.cloud/template/update?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 \"template_id\": \"6605a1b2c3d4e5f6a7b8c9d0\",\n \"template_name\": \"Prod incident default\",\n \"description\": \"Updated description.\",\n \"email\": \"Incident {{ .IncidentName }} on {{ .Severity }}\",\n \"sms\": \"[Flashduty] {{ .IncidentName }} — {{ .Severity }}\"\n}"
response = http.request(request)
puts response.read_body{
"request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4",
"data": {}
}{
"request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4",
"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."
}
}Update a template
Update an existing template. Only the fields present in the request are written: a channel you omit keeps its current content, and an explicit empty string clears it.
curl --request POST \
--url 'https://api.flashcat.cloud/template/update?app_key=' \
--header 'Content-Type: application/json' \
--data '
{
"template_id": "6605a1b2c3d4e5f6a7b8c9d0",
"template_name": "Prod incident default",
"description": "Updated description.",
"email": "Incident {{ .IncidentName }} on {{ .Severity }}",
"sms": "[Flashduty] {{ .IncidentName }} — {{ .Severity }}"
}
'import requests
url = "https://api.flashcat.cloud/template/update?app_key="
payload = {
"template_id": "6605a1b2c3d4e5f6a7b8c9d0",
"template_name": "Prod incident default",
"description": "Updated description.",
"email": "Incident {{ .IncidentName }} on {{ .Severity }}",
"sms": "[Flashduty] {{ .IncidentName }} — {{ .Severity }}"
}
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({
template_id: '6605a1b2c3d4e5f6a7b8c9d0',
template_name: 'Prod incident default',
description: 'Updated description.',
email: 'Incident {{ .IncidentName }} on {{ .Severity }}',
sms: '[Flashduty] {{ .IncidentName }} — {{ .Severity }}'
})
};
fetch('https://api.flashcat.cloud/template/update?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/template/update?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([
'template_id' => '6605a1b2c3d4e5f6a7b8c9d0',
'template_name' => 'Prod incident default',
'description' => 'Updated description.',
'email' => 'Incident {{ .IncidentName }} on {{ .Severity }}',
'sms' => '[Flashduty] {{ .IncidentName }} — {{ .Severity }}'
]),
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/template/update?app_key="
payload := strings.NewReader("{\n \"template_id\": \"6605a1b2c3d4e5f6a7b8c9d0\",\n \"template_name\": \"Prod incident default\",\n \"description\": \"Updated description.\",\n \"email\": \"Incident {{ .IncidentName }} on {{ .Severity }}\",\n \"sms\": \"[Flashduty] {{ .IncidentName }} — {{ .Severity }}\"\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/template/update?app_key=")
.header("Content-Type", "application/json")
.body("{\n \"template_id\": \"6605a1b2c3d4e5f6a7b8c9d0\",\n \"template_name\": \"Prod incident default\",\n \"description\": \"Updated description.\",\n \"email\": \"Incident {{ .IncidentName }} on {{ .Severity }}\",\n \"sms\": \"[Flashduty] {{ .IncidentName }} — {{ .Severity }}\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.flashcat.cloud/template/update?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 \"template_id\": \"6605a1b2c3d4e5f6a7b8c9d0\",\n \"template_name\": \"Prod incident default\",\n \"description\": \"Updated description.\",\n \"email\": \"Incident {{ .IncidentName }} on {{ .Severity }}\",\n \"sms\": \"[Flashduty] {{ .IncidentName }} — {{ .Severity }}\"\n}"
response = http.request(request)
puts response.read_body{
"request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4",
"data": {}
}{
"request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4",
"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."
}
}Restrictions
| Aspect | Value |
|---|---|
| Rate limits | 1,000 requests/minute; 50 requests/second per account |
| Permissions | Templates Manage (on-call) |
Usage
- Only the fields present in the request are written. A channel you omit keeps its current content; send it as an empty string to clear it.
- The caller needs data-permission on the template’s team; otherwise the response is
AccessDenied. - Every call is recorded in the account audit log. Don’t put secrets in request fields.
Authorizations
App key issued from the Flashduty console under Account → APP Keys. Required on every public API call. Keep it secret — it grants the same access as the owning account.
Body
Update an existing template.
Target template ID; obtain it from POST /template/list.
^[0-9a-fA-F]{24}$"6605a1b2c3d4e5f6a7b8c9d0"
Template name. 1–39 characters.
1 - 39Team scope. 0 for account-wide. Omit to keep the template's current team.
Free-form description. Up to 500 characters. Omit to keep the current content; send an empty string to clear it.
500Email body template source (Go html/template syntax). Omit to keep the current content; send an empty string to clear it.
SMS template source (Go text/template syntax). Omit to keep the current content; send an empty string to clear it.
Voice call script template source. Omit to keep the current content; send an empty string to clear it.
DingTalk robot message template source. Omit to keep the current content; send an empty string to clear it.
WeCom robot message template source. Omit to keep the current content; send an empty string to clear it.
Feishu robot message template source. Omit to keep the current content; send an empty string to clear it.
Feishu app message template source. Omit to keep the current content; send an empty string to clear it.
When set, enable or disable table rendering for alert labels in Feishu app cards. Omit to keep the existing setting.
DingTalk app message template source. Omit to keep the current content; send an empty string to clear it.
WeCom app message template source. Omit to keep the current content; send an empty string to clear it.
Slack app message template source. Omit to keep the current content; send an empty string to clear it.
Microsoft Teams app message template source. Omit to keep the current content; send an empty string to clear it.
Telegram bot message template source. Omit to keep the current content; send an empty string to clear it.
Slack robot message template source. Omit to keep the current content; send an empty string to clear it.
Zoom bot message template source. Omit to keep the current content; send an empty string to clear it.
Incident card fields hidden per IM app type.
Show child attributes
Show child attributes
Response
Success
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.
Unique ID for this request. Mirrored in the Flashcat-Request-Id response header. Include it when reporting issues.
"01HK8XQE3Z7JM2NTFQ5YJ8P9R4"
An empty object. Returned as the data payload by operations whose success signal is simply the absence of an error.
Was this page helpful?