curl --request POST \
--url https://sreagent.app/api/v1/config/alert_routes \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"service": "<string>",
"target": "<string>",
"enabled": true,
"oncall_schedule_id": "<string>"
}
'import requests
url = "https://sreagent.app/api/v1/config/alert_routes"
payload = {
"service": "<string>",
"target": "<string>",
"enabled": True,
"oncall_schedule_id": "<string>"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
service: '<string>',
target: '<string>',
enabled: true,
oncall_schedule_id: '<string>'
})
};
fetch('https://sreagent.app/api/v1/config/alert_routes', 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://sreagent.app/api/v1/config/alert_routes",
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([
'service' => '<string>',
'target' => '<string>',
'enabled' => true,
'oncall_schedule_id' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"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://sreagent.app/api/v1/config/alert_routes"
payload := strings.NewReader("{\n \"service\": \"<string>\",\n \"target\": \"<string>\",\n \"enabled\": true,\n \"oncall_schedule_id\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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://sreagent.app/api/v1/config/alert_routes")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"service\": \"<string>\",\n \"target\": \"<string>\",\n \"enabled\": true,\n \"oncall_schedule_id\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://sreagent.app/api/v1/config/alert_routes")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"service\": \"<string>\",\n \"target\": \"<string>\",\n \"enabled\": true,\n \"oncall_schedule_id\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"error": "<string>",
"message": "<string>"
}Create an alert route
Save where one service’s alerts open in Slack, and which on-call schedule (if any) is mentioned in the thread when one opens. Upserts on the service, so a service that already has a route has its row edited rather than a second one grown; the save describes the route’s WHOLE state, so an edit that omits oncall_schedule_id clears a schedule a previous save set, the same way it would if it omitted target. The service is read from an alert’s service label, then job, app, namespace; the channel must be a Slack channel like #checkout-alerts. A route takes effect for alerts that open a new thread: an alert already holding a thread keeps it, and so does its mention.
curl --request POST \
--url https://sreagent.app/api/v1/config/alert_routes \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"service": "<string>",
"target": "<string>",
"enabled": true,
"oncall_schedule_id": "<string>"
}
'import requests
url = "https://sreagent.app/api/v1/config/alert_routes"
payload = {
"service": "<string>",
"target": "<string>",
"enabled": True,
"oncall_schedule_id": "<string>"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
service: '<string>',
target: '<string>',
enabled: true,
oncall_schedule_id: '<string>'
})
};
fetch('https://sreagent.app/api/v1/config/alert_routes', 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://sreagent.app/api/v1/config/alert_routes",
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([
'service' => '<string>',
'target' => '<string>',
'enabled' => true,
'oncall_schedule_id' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"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://sreagent.app/api/v1/config/alert_routes"
payload := strings.NewReader("{\n \"service\": \"<string>\",\n \"target\": \"<string>\",\n \"enabled\": true,\n \"oncall_schedule_id\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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://sreagent.app/api/v1/config/alert_routes")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"service\": \"<string>\",\n \"target\": \"<string>\",\n \"enabled\": true,\n \"oncall_schedule_id\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://sreagent.app/api/v1/config/alert_routes")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"service\": \"<string>\",\n \"target\": \"<string>\",\n \"enabled\": true,\n \"oncall_schedule_id\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"error": "<string>",
"message": "<string>"
}Authorizations
An sre_ak_* API key holding the api:admin scope (or api:config_read, which every write refuses with read_only_key).
Body
The service to route, as an alert names it.
The Slack channel this service's alerts open in.
Whether the route is in force. Omitted leaves the state alone: true on a new route, unchanged on an edit, so saving a paused route does not bring it back into force. Pass false to pause it, true to resume it.
The schedule (by its uuid, as list_oncall_schedules answers it) to mention in the thread when this service's alert opens one. It must belong to this same organization. Passing null, or omitting the field, means no mention, and clears one a previous save set, since this call always describes the route's whole state.
Response
Created.

