curl --request POST \
--url 'https://api.flashcat.cloud/team/upsert?app_key=' \
--header 'Content-Type: application/json' \
--data '
{
"team_name": "Backend SRE",
"description": "Backend reliability engineering team",
"person_ids": [
80011,
80012
]
}
'import requests
url = "https://api.flashcat.cloud/team/upsert?app_key="
payload = {
"team_name": "Backend SRE",
"description": "Backend reliability engineering team",
"person_ids": [80011, 80012]
}
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({
team_name: 'Backend SRE',
description: 'Backend reliability engineering team',
person_ids: [80011, 80012]
})
};
fetch('https://api.flashcat.cloud/team/upsert?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/team/upsert?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([
'team_name' => 'Backend SRE',
'description' => 'Backend reliability engineering team',
'person_ids' => [
80011,
80012
]
]),
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/team/upsert?app_key="
payload := strings.NewReader("{\n \"team_name\": \"Backend SRE\",\n \"description\": \"Backend reliability engineering team\",\n \"person_ids\": [\n 80011,\n 80012\n ]\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/team/upsert?app_key=")
.header("Content-Type", "application/json")
.body("{\n \"team_name\": \"Backend SRE\",\n \"description\": \"Backend reliability engineering team\",\n \"person_ids\": [\n 80011,\n 80012\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.flashcat.cloud/team/upsert?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 \"team_name\": \"Backend SRE\",\n \"description\": \"Backend reliability engineering team\",\n \"person_ids\": [\n 80011,\n 80012\n ]\n}"
response = http.request(request)
puts response.read_body{
"request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4",
"data": {
"team_id": 1001,
"team_name": "Backend SRE"
}
}{
"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."
}
}Create or update a team
Create a new team or update an existing one. Pass team_id to update.
curl --request POST \
--url 'https://api.flashcat.cloud/team/upsert?app_key=' \
--header 'Content-Type: application/json' \
--data '
{
"team_name": "Backend SRE",
"description": "Backend reliability engineering team",
"person_ids": [
80011,
80012
]
}
'import requests
url = "https://api.flashcat.cloud/team/upsert?app_key="
payload = {
"team_name": "Backend SRE",
"description": "Backend reliability engineering team",
"person_ids": [80011, 80012]
}
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({
team_name: 'Backend SRE',
description: 'Backend reliability engineering team',
person_ids: [80011, 80012]
})
};
fetch('https://api.flashcat.cloud/team/upsert?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/team/upsert?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([
'team_name' => 'Backend SRE',
'description' => 'Backend reliability engineering team',
'person_ids' => [
80011,
80012
]
]),
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/team/upsert?app_key="
payload := strings.NewReader("{\n \"team_name\": \"Backend SRE\",\n \"description\": \"Backend reliability engineering team\",\n \"person_ids\": [\n 80011,\n 80012\n ]\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/team/upsert?app_key=")
.header("Content-Type", "application/json")
.body("{\n \"team_name\": \"Backend SRE\",\n \"description\": \"Backend reliability engineering team\",\n \"person_ids\": [\n 80011,\n 80012\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.flashcat.cloud/team/upsert?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 \"team_name\": \"Backend SRE\",\n \"description\": \"Backend reliability engineering team\",\n \"person_ids\": [\n 80011,\n 80012\n ]\n}"
response = http.request(request)
puts response.read_body{
"request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4",
"data": {
"team_id": 1001,
"team_name": "Backend SRE"
}
}{
"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 | Teams Manage (organization) |
Usage
- Omit
team_id(or set to 0) to create a new team; pass an existing ID to update. team_namemust be 1–39 characters and unique within the account.- Pass
person_idsto set team membership; this replaces the entire member list. - Pass
emailsorphonesto add existing members by contact; contacts that match no member are ignored — nobody is invited. ref_idis an external identifier for integration with third-party HR systems.- 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
Parameters for creating or updating a team.
Team display name. 1–39 characters.
1 - 39Team ID. Omit or set to 0 to create a new team.
Free-form description.
500Member IDs to set as team members. Replaces the existing member list.
Add existing members to the team by email. Addresses that don't match an existing member are silently ignored — no invitation is sent.
Add existing members to the team by phone number. Numbers not in E.164 format are parsed with countryCode; an unparseable number fails the whole request with a 400. Numbers that parse but match no existing member are silently ignored.
Default country code applied to any phones entries that are not in E.164 format.
External reference ID for HR system integration.
When true and team_id is 0, an existing team with the same team_name is updated in place instead of returning a name-conflict error.
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.
Was this page helpful?