ClickStack: Create Alert
This endpoint is in beta. API contract is stable, and no breaking changes are expected in the future.
ClickStack: Creates a new alert
curl --request POST \
--url https://api.clickhouse.cloud/v1/organizations/{organizationId}/services/{serviceId}/clickstack/alerts \
--header 'Authorization: Basic <encoded-value>' \
--header 'Content-Type: application/json' \
--data '
{
"threshold": 100,
"interval": "1h",
"thresholdType": "above",
"dashboardId": "65f5e4a3b9e77c001a567890",
"tileId": "65f5e4a3b9e77c001a901234",
"savedSearchId": "65f5e4a3b9e77c001a345678",
"groupBy": "ServiceName",
"chartConfig": {
"displayType": "line",
"sourceId": "65f5e4a3b9e77c001a111111",
"select": [
{
"aggFn": "count",
"valueExpression": "Duration",
"alias": "Request Duration",
"level": 123,
"where": "service:api",
"metricName": "http.server.duration",
"periodAggFn": "delta",
"numberFormat": {
"output": "number",
"mantissa": 2,
"thousandSeparated": true,
"average": false,
"decimalBytes": false,
"factor": 1,
"currencySymbol": "$",
"numericUnit": "bytes_iec",
"unit": "ms"
}
}
],
"groupBy": "host",
"asRatio": true,
"alignDateRangeToGranularity": true,
"fillNulls": true,
"fitYAxisToData": true,
"lineInterpolation": "step",
"numberFormat": {
"output": "number",
"mantissa": 2,
"thousandSeparated": true,
"average": false,
"decimalBytes": false,
"factor": 1,
"currencySymbol": "$",
"numericUnit": "bytes_iec",
"unit": "ms"
},
"compareToPreviousPeriod": true,
"seriesLimit": 5,
"formulas": [
{
"expression": "A / (A + B) * 100",
"alias": "Success rate %",
"numberFormat": {
"output": "number",
"mantissa": 2,
"thousandSeparated": true,
"average": false,
"decimalBytes": false,
"factor": 1,
"currencySymbol": "$",
"numericUnit": "bytes_iec",
"unit": "ms"
}
}
],
"showOperandSeries": true,
"name": "Error Rate Query",
"where": "ServiceName:api"
},
"thresholdMax": 500,
"scheduleOffsetMinutes": 2,
"scheduleStartAt": "2026-02-08T10:00:00.000Z",
"source": "tile",
"channel": {
"emailRecipients": [
"<string>"
]
},
"channels": [
{
"emailRecipients": [
"<string>"
]
}
],
"name": "Errors for {{group}} hit {{value}}",
"displayName": "Checkout error spike",
"tags": [
"checkout",
"p1"
],
"message": "Test Alert Message",
"note": "Threshold raised from 50 to 100 on 2026-01-15. See [runbook](https://wiki.example.com/runbook).",
"numConsecutiveWindows": 3
}
'import requests
url = "https://api.clickhouse.cloud/v1/organizations/{organizationId}/services/{serviceId}/clickstack/alerts"
payload = {
"threshold": 100,
"interval": "1h",
"thresholdType": "above",
"dashboardId": "65f5e4a3b9e77c001a567890",
"tileId": "65f5e4a3b9e77c001a901234",
"savedSearchId": "65f5e4a3b9e77c001a345678",
"groupBy": "ServiceName",
"chartConfig": {
"displayType": "line",
"sourceId": "65f5e4a3b9e77c001a111111",
"select": [
{
"aggFn": "count",
"valueExpression": "Duration",
"alias": "Request Duration",
"level": 123,
"where": "service:api",
"metricName": "http.server.duration",
"periodAggFn": "delta",
"numberFormat": {
"output": "number",
"mantissa": 2,
"thousandSeparated": True,
"average": False,
"decimalBytes": False,
"factor": 1,
"currencySymbol": "$",
"numericUnit": "bytes_iec",
"unit": "ms"
}
}
],
"groupBy": "host",
"asRatio": True,
"alignDateRangeToGranularity": True,
"fillNulls": True,
"fitYAxisToData": True,
"lineInterpolation": "step",
"numberFormat": {
"output": "number",
"mantissa": 2,
"thousandSeparated": True,
"average": False,
"decimalBytes": False,
"factor": 1,
"currencySymbol": "$",
"numericUnit": "bytes_iec",
"unit": "ms"
},
"compareToPreviousPeriod": True,
"seriesLimit": 5,
"formulas": [
{
"expression": "A / (A + B) * 100",
"alias": "Success rate %",
"numberFormat": {
"output": "number",
"mantissa": 2,
"thousandSeparated": True,
"average": False,
"decimalBytes": False,
"factor": 1,
"currencySymbol": "$",
"numericUnit": "bytes_iec",
"unit": "ms"
}
}
],
"showOperandSeries": True,
"name": "Error Rate Query",
"where": "ServiceName:api"
},
"thresholdMax": 500,
"scheduleOffsetMinutes": 2,
"scheduleStartAt": "2026-02-08T10:00:00.000Z",
"source": "tile",
"channel": { "emailRecipients": ["<string>"] },
"channels": [{ "emailRecipients": ["<string>"] }],
"name": "Errors for {{group}} hit {{value}}",
"displayName": "Checkout error spike",
"tags": ["checkout", "p1"],
"message": "Test Alert Message",
"note": "Threshold raised from 50 to 100 on 2026-01-15. See [runbook](https://wiki.example.com/runbook).",
"numConsecutiveWindows": 3
}
headers = {
"Authorization": "Basic <encoded-value>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Basic <encoded-value>', 'Content-Type': 'application/json'},
body: JSON.stringify({
threshold: 100,
interval: '1h',
thresholdType: 'above',
dashboardId: '65f5e4a3b9e77c001a567890',
tileId: '65f5e4a3b9e77c001a901234',
savedSearchId: '65f5e4a3b9e77c001a345678',
groupBy: 'ServiceName',
chartConfig: {
displayType: 'line',
sourceId: '65f5e4a3b9e77c001a111111',
select: [
{
aggFn: 'count',
valueExpression: 'Duration',
alias: 'Request Duration',
level: 123,
where: 'service:api',
metricName: 'http.server.duration',
periodAggFn: 'delta',
numberFormat: {
output: 'number',
mantissa: 2,
thousandSeparated: true,
average: false,
decimalBytes: false,
factor: 1,
currencySymbol: '$',
numericUnit: 'bytes_iec',
unit: 'ms'
}
}
],
groupBy: 'host',
asRatio: true,
alignDateRangeToGranularity: true,
fillNulls: true,
fitYAxisToData: true,
lineInterpolation: 'step',
numberFormat: {
output: 'number',
mantissa: 2,
thousandSeparated: true,
average: false,
decimalBytes: false,
factor: 1,
currencySymbol: '$',
numericUnit: 'bytes_iec',
unit: 'ms'
},
compareToPreviousPeriod: true,
seriesLimit: 5,
formulas: [
{
expression: 'A / (A + B) * 100',
alias: 'Success rate %',
numberFormat: {
output: 'number',
mantissa: 2,
thousandSeparated: true,
average: false,
decimalBytes: false,
factor: 1,
currencySymbol: '$',
numericUnit: 'bytes_iec',
unit: 'ms'
}
}
],
showOperandSeries: true,
name: 'Error Rate Query',
where: 'ServiceName:api'
},
thresholdMax: 500,
scheduleOffsetMinutes: 2,
scheduleStartAt: '2026-02-08T10:00:00.000Z',
source: 'tile',
channel: {emailRecipients: ['<string>']},
channels: [{emailRecipients: ['<string>']}],
name: 'Errors for {{group}} hit {{value}}',
displayName: 'Checkout error spike',
tags: ['checkout', 'p1'],
message: 'Test Alert Message',
note: 'Threshold raised from 50 to 100 on 2026-01-15. See [runbook](https://wiki.example.com/runbook).',
numConsecutiveWindows: 3
})
};
fetch('https://api.clickhouse.cloud/v1/organizations/{organizationId}/services/{serviceId}/clickstack/alerts', 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.clickhouse.cloud/v1/organizations/{organizationId}/services/{serviceId}/clickstack/alerts",
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([
'threshold' => 100,
'interval' => '1h',
'thresholdType' => 'above',
'dashboardId' => '65f5e4a3b9e77c001a567890',
'tileId' => '65f5e4a3b9e77c001a901234',
'savedSearchId' => '65f5e4a3b9e77c001a345678',
'groupBy' => 'ServiceName',
'chartConfig' => [
'displayType' => 'line',
'sourceId' => '65f5e4a3b9e77c001a111111',
'select' => [
[
'aggFn' => 'count',
'valueExpression' => 'Duration',
'alias' => 'Request Duration',
'level' => 123,
'where' => 'service:api',
'metricName' => 'http.server.duration',
'periodAggFn' => 'delta',
'numberFormat' => [
'output' => 'number',
'mantissa' => 2,
'thousandSeparated' => true,
'average' => false,
'decimalBytes' => false,
'factor' => 1,
'currencySymbol' => '$',
'numericUnit' => 'bytes_iec',
'unit' => 'ms'
]
]
],
'groupBy' => 'host',
'asRatio' => true,
'alignDateRangeToGranularity' => true,
'fillNulls' => true,
'fitYAxisToData' => true,
'lineInterpolation' => 'step',
'numberFormat' => [
'output' => 'number',
'mantissa' => 2,
'thousandSeparated' => true,
'average' => false,
'decimalBytes' => false,
'factor' => 1,
'currencySymbol' => '$',
'numericUnit' => 'bytes_iec',
'unit' => 'ms'
],
'compareToPreviousPeriod' => true,
'seriesLimit' => 5,
'formulas' => [
[
'expression' => 'A / (A + B) * 100',
'alias' => 'Success rate %',
'numberFormat' => [
'output' => 'number',
'mantissa' => 2,
'thousandSeparated' => true,
'average' => false,
'decimalBytes' => false,
'factor' => 1,
'currencySymbol' => '$',
'numericUnit' => 'bytes_iec',
'unit' => 'ms'
]
]
],
'showOperandSeries' => true,
'name' => 'Error Rate Query',
'where' => 'ServiceName:api'
],
'thresholdMax' => 500,
'scheduleOffsetMinutes' => 2,
'scheduleStartAt' => '2026-02-08T10:00:00.000Z',
'source' => 'tile',
'channel' => [
'emailRecipients' => [
'<string>'
]
],
'channels' => [
[
'emailRecipients' => [
'<string>'
]
]
],
'name' => 'Errors for {{group}} hit {{value}}',
'displayName' => 'Checkout error spike',
'tags' => [
'checkout',
'p1'
],
'message' => 'Test Alert Message',
'note' => 'Threshold raised from 50 to 100 on 2026-01-15. See [runbook](https://wiki.example.com/runbook).',
'numConsecutiveWindows' => 3
]),
CURLOPT_HTTPHEADER => [
"Authorization: Basic <encoded-value>",
"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.clickhouse.cloud/v1/organizations/{organizationId}/services/{serviceId}/clickstack/alerts"
payload := strings.NewReader("{\n \"threshold\": 100,\n \"interval\": \"1h\",\n \"thresholdType\": \"above\",\n \"dashboardId\": \"65f5e4a3b9e77c001a567890\",\n \"tileId\": \"65f5e4a3b9e77c001a901234\",\n \"savedSearchId\": \"65f5e4a3b9e77c001a345678\",\n \"groupBy\": \"ServiceName\",\n \"chartConfig\": {\n \"displayType\": \"line\",\n \"sourceId\": \"65f5e4a3b9e77c001a111111\",\n \"select\": [\n {\n \"aggFn\": \"count\",\n \"valueExpression\": \"Duration\",\n \"alias\": \"Request Duration\",\n \"level\": 123,\n \"where\": \"service:api\",\n \"metricName\": \"http.server.duration\",\n \"periodAggFn\": \"delta\",\n \"numberFormat\": {\n \"output\": \"number\",\n \"mantissa\": 2,\n \"thousandSeparated\": true,\n \"average\": false,\n \"decimalBytes\": false,\n \"factor\": 1,\n \"currencySymbol\": \"$\",\n \"numericUnit\": \"bytes_iec\",\n \"unit\": \"ms\"\n }\n }\n ],\n \"groupBy\": \"host\",\n \"asRatio\": true,\n \"alignDateRangeToGranularity\": true,\n \"fillNulls\": true,\n \"fitYAxisToData\": true,\n \"lineInterpolation\": \"step\",\n \"numberFormat\": {\n \"output\": \"number\",\n \"mantissa\": 2,\n \"thousandSeparated\": true,\n \"average\": false,\n \"decimalBytes\": false,\n \"factor\": 1,\n \"currencySymbol\": \"$\",\n \"numericUnit\": \"bytes_iec\",\n \"unit\": \"ms\"\n },\n \"compareToPreviousPeriod\": true,\n \"seriesLimit\": 5,\n \"formulas\": [\n {\n \"expression\": \"A / (A + B) * 100\",\n \"alias\": \"Success rate %\",\n \"numberFormat\": {\n \"output\": \"number\",\n \"mantissa\": 2,\n \"thousandSeparated\": true,\n \"average\": false,\n \"decimalBytes\": false,\n \"factor\": 1,\n \"currencySymbol\": \"$\",\n \"numericUnit\": \"bytes_iec\",\n \"unit\": \"ms\"\n }\n }\n ],\n \"showOperandSeries\": true,\n \"name\": \"Error Rate Query\",\n \"where\": \"ServiceName:api\"\n },\n \"thresholdMax\": 500,\n \"scheduleOffsetMinutes\": 2,\n \"scheduleStartAt\": \"2026-02-08T10:00:00.000Z\",\n \"source\": \"tile\",\n \"channel\": {\n \"emailRecipients\": [\n \"<string>\"\n ]\n },\n \"channels\": [\n {\n \"emailRecipients\": [\n \"<string>\"\n ]\n }\n ],\n \"name\": \"Errors for {{group}} hit {{value}}\",\n \"displayName\": \"Checkout error spike\",\n \"tags\": [\n \"checkout\",\n \"p1\"\n ],\n \"message\": \"Test Alert Message\",\n \"note\": \"Threshold raised from 50 to 100 on 2026-01-15. See [runbook](https://wiki.example.com/runbook).\",\n \"numConsecutiveWindows\": 3\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Basic <encoded-value>")
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.clickhouse.cloud/v1/organizations/{organizationId}/services/{serviceId}/clickstack/alerts")
.header("Authorization", "Basic <encoded-value>")
.header("Content-Type", "application/json")
.body("{\n \"threshold\": 100,\n \"interval\": \"1h\",\n \"thresholdType\": \"above\",\n \"dashboardId\": \"65f5e4a3b9e77c001a567890\",\n \"tileId\": \"65f5e4a3b9e77c001a901234\",\n \"savedSearchId\": \"65f5e4a3b9e77c001a345678\",\n \"groupBy\": \"ServiceName\",\n \"chartConfig\": {\n \"displayType\": \"line\",\n \"sourceId\": \"65f5e4a3b9e77c001a111111\",\n \"select\": [\n {\n \"aggFn\": \"count\",\n \"valueExpression\": \"Duration\",\n \"alias\": \"Request Duration\",\n \"level\": 123,\n \"where\": \"service:api\",\n \"metricName\": \"http.server.duration\",\n \"periodAggFn\": \"delta\",\n \"numberFormat\": {\n \"output\": \"number\",\n \"mantissa\": 2,\n \"thousandSeparated\": true,\n \"average\": false,\n \"decimalBytes\": false,\n \"factor\": 1,\n \"currencySymbol\": \"$\",\n \"numericUnit\": \"bytes_iec\",\n \"unit\": \"ms\"\n }\n }\n ],\n \"groupBy\": \"host\",\n \"asRatio\": true,\n \"alignDateRangeToGranularity\": true,\n \"fillNulls\": true,\n \"fitYAxisToData\": true,\n \"lineInterpolation\": \"step\",\n \"numberFormat\": {\n \"output\": \"number\",\n \"mantissa\": 2,\n \"thousandSeparated\": true,\n \"average\": false,\n \"decimalBytes\": false,\n \"factor\": 1,\n \"currencySymbol\": \"$\",\n \"numericUnit\": \"bytes_iec\",\n \"unit\": \"ms\"\n },\n \"compareToPreviousPeriod\": true,\n \"seriesLimit\": 5,\n \"formulas\": [\n {\n \"expression\": \"A / (A + B) * 100\",\n \"alias\": \"Success rate %\",\n \"numberFormat\": {\n \"output\": \"number\",\n \"mantissa\": 2,\n \"thousandSeparated\": true,\n \"average\": false,\n \"decimalBytes\": false,\n \"factor\": 1,\n \"currencySymbol\": \"$\",\n \"numericUnit\": \"bytes_iec\",\n \"unit\": \"ms\"\n }\n }\n ],\n \"showOperandSeries\": true,\n \"name\": \"Error Rate Query\",\n \"where\": \"ServiceName:api\"\n },\n \"thresholdMax\": 500,\n \"scheduleOffsetMinutes\": 2,\n \"scheduleStartAt\": \"2026-02-08T10:00:00.000Z\",\n \"source\": \"tile\",\n \"channel\": {\n \"emailRecipients\": [\n \"<string>\"\n ]\n },\n \"channels\": [\n {\n \"emailRecipients\": [\n \"<string>\"\n ]\n }\n ],\n \"name\": \"Errors for {{group}} hit {{value}}\",\n \"displayName\": \"Checkout error spike\",\n \"tags\": [\n \"checkout\",\n \"p1\"\n ],\n \"message\": \"Test Alert Message\",\n \"note\": \"Threshold raised from 50 to 100 on 2026-01-15. See [runbook](https://wiki.example.com/runbook).\",\n \"numConsecutiveWindows\": 3\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.clickhouse.cloud/v1/organizations/{organizationId}/services/{serviceId}/clickstack/alerts")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Basic <encoded-value>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"threshold\": 100,\n \"interval\": \"1h\",\n \"thresholdType\": \"above\",\n \"dashboardId\": \"65f5e4a3b9e77c001a567890\",\n \"tileId\": \"65f5e4a3b9e77c001a901234\",\n \"savedSearchId\": \"65f5e4a3b9e77c001a345678\",\n \"groupBy\": \"ServiceName\",\n \"chartConfig\": {\n \"displayType\": \"line\",\n \"sourceId\": \"65f5e4a3b9e77c001a111111\",\n \"select\": [\n {\n \"aggFn\": \"count\",\n \"valueExpression\": \"Duration\",\n \"alias\": \"Request Duration\",\n \"level\": 123,\n \"where\": \"service:api\",\n \"metricName\": \"http.server.duration\",\n \"periodAggFn\": \"delta\",\n \"numberFormat\": {\n \"output\": \"number\",\n \"mantissa\": 2,\n \"thousandSeparated\": true,\n \"average\": false,\n \"decimalBytes\": false,\n \"factor\": 1,\n \"currencySymbol\": \"$\",\n \"numericUnit\": \"bytes_iec\",\n \"unit\": \"ms\"\n }\n }\n ],\n \"groupBy\": \"host\",\n \"asRatio\": true,\n \"alignDateRangeToGranularity\": true,\n \"fillNulls\": true,\n \"fitYAxisToData\": true,\n \"lineInterpolation\": \"step\",\n \"numberFormat\": {\n \"output\": \"number\",\n \"mantissa\": 2,\n \"thousandSeparated\": true,\n \"average\": false,\n \"decimalBytes\": false,\n \"factor\": 1,\n \"currencySymbol\": \"$\",\n \"numericUnit\": \"bytes_iec\",\n \"unit\": \"ms\"\n },\n \"compareToPreviousPeriod\": true,\n \"seriesLimit\": 5,\n \"formulas\": [\n {\n \"expression\": \"A / (A + B) * 100\",\n \"alias\": \"Success rate %\",\n \"numberFormat\": {\n \"output\": \"number\",\n \"mantissa\": 2,\n \"thousandSeparated\": true,\n \"average\": false,\n \"decimalBytes\": false,\n \"factor\": 1,\n \"currencySymbol\": \"$\",\n \"numericUnit\": \"bytes_iec\",\n \"unit\": \"ms\"\n }\n }\n ],\n \"showOperandSeries\": true,\n \"name\": \"Error Rate Query\",\n \"where\": \"ServiceName:api\"\n },\n \"thresholdMax\": 500,\n \"scheduleOffsetMinutes\": 2,\n \"scheduleStartAt\": \"2026-02-08T10:00:00.000Z\",\n \"source\": \"tile\",\n \"channel\": {\n \"emailRecipients\": [\n \"<string>\"\n ]\n },\n \"channels\": [\n {\n \"emailRecipients\": [\n \"<string>\"\n ]\n }\n ],\n \"name\": \"Errors for {{group}} hit {{value}}\",\n \"displayName\": \"Checkout error spike\",\n \"tags\": [\n \"checkout\",\n \"p1\"\n ],\n \"message\": \"Test Alert Message\",\n \"note\": \"Threshold raised from 50 to 100 on 2026-01-15. See [runbook](https://wiki.example.com/runbook).\",\n \"numConsecutiveWindows\": 3\n}"
response = http.request(request)
puts response.read_body{
"status": 200,
"requestId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"result": {
"displayName": "Checkout error spike",
"tags": [
"checkout",
"p1"
],
"dashboardId": "65f5e4a3b9e77c001a567890",
"tileId": "65f5e4a3b9e77c001a901234",
"savedSearchId": "65f5e4a3b9e77c001a345678",
"groupBy": "ServiceName",
"chartConfig": {
"displayType": "line",
"sourceId": "65f5e4a3b9e77c001a111111",
"select": [
{
"aggFn": "count",
"valueExpression": "Duration",
"alias": "Request Duration",
"level": 123,
"where": "service:api",
"whereLanguage": "sql",
"metricName": "http.server.duration",
"metricType": "sum",
"periodAggFn": "delta",
"numberFormat": {
"output": "number",
"mantissa": 2,
"thousandSeparated": true,
"average": false,
"decimalBytes": false,
"factor": 1,
"currencySymbol": "$",
"numericUnit": "bytes_iec",
"unit": "ms"
}
}
],
"groupBy": "host",
"asRatio": true,
"alignDateRangeToGranularity": true,
"fillNulls": true,
"fitYAxisToData": true,
"lineInterpolation": "step",
"numberFormat": {
"output": "number",
"mantissa": 2,
"thousandSeparated": true,
"average": false,
"decimalBytes": false,
"factor": 1,
"currencySymbol": "$",
"numericUnit": "bytes_iec",
"unit": "ms"
},
"compareToPreviousPeriod": true,
"seriesLimit": 5,
"formulas": [
{
"expression": "A / (A + B) * 100",
"alias": "Success rate %",
"numberFormat": {
"output": "number",
"mantissa": 2,
"thousandSeparated": true,
"average": false,
"decimalBytes": false,
"factor": 1,
"currencySymbol": "$",
"numericUnit": "bytes_iec",
"unit": "ms"
}
}
],
"showOperandSeries": true,
"name": "Error Rate Query",
"where": "ServiceName:api",
"whereLanguage": "sql"
},
"threshold": 100,
"thresholdMax": 500,
"interval": "1h",
"scheduleOffsetMinutes": 2,
"scheduleStartAt": "2026-02-08T10:00:00.000Z",
"source": "tile",
"thresholdType": "above",
"channel": {
"type": "webhook",
"emailRecipients": [
"<string>"
]
},
"channels": [
{
"type": "webhook",
"emailRecipients": [
"<string>"
]
}
],
"name": "Errors for {{group}} hit {{value}}",
"message": "Test Alert Message",
"note": "Threshold raised from 50 to 100 on 2026-01-15. See [runbook](https://wiki.example.com/runbook).",
"numConsecutiveWindows": 3,
"id": "65f5e4a3b9e77c001a123456",
"state": "ALERT",
"teamId": "65f5e4a3b9e77c001a345678",
"silenced": {
"by": "65f5e4a3b9e77c001a234567",
"at": "2026-03-19T08:00:00.000Z",
"until": "2026-03-20T08:00:00.000Z"
},
"executionErrors": [
{
"timestamp": "2026-04-17T12:00:00.000Z",
"type": "QUERY_ERROR",
"message": "Query timed out after 30s"
}
],
"createdAt": "2023-01-01T00:00:00.000Z",
"updatedAt": "2023-01-01T00:00:00.000Z"
}
}{
"status": 400,
"error": "<string>",
"requestId": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}{
"status": 500,
"error": "<string>",
"requestId": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}ClickStack: Creates a new alert
Permission
control-plane:service:manage-clickstack-api permission.Authorizations
Use key ID and key secret obtained in ClickHouse Cloud console: https://clickhouse.com/docs/cloud/manage/openapi
Path Parameters
ID of the organization that owns the service.
ID of the ClickStack service.
Body
Threshold value for triggering the alert. For between and not_between threshold types, this is the lower bound.
100
Evaluation interval for the alert. 30s requires the 30s alert interval feature to be enabled for your team. Anomaly alerts (detectionMode "anomaly") support only 5m, 15m, 30m, and 1h; other intervals are rejected with 400.
30s, 1m, 5m, 15m, 30m, 1h, 6h, 12h, 1d "1h"
Threshold comparison direction.
above, below, above_exclusive, below_or_equal, equal, not_equal, between, not_between "above"
Dashboard ID for tile-based alerts.
"65f5e4a3b9e77c001a567890"
Tile ID for tile-based alerts. Must be a line, stacked bar, or number type tile.
"65f5e4a3b9e77c001a901234"
Saved search ID for saved_search alerts.
"65f5e4a3b9e77c001a345678"
Group-by key for saved search alerts.
"ServiceName"
- Option 1
- Option 2
- Option 3
- Option 4
- Option 5
- Option 6
- Option 7
- Option 8
Show child attributes
Show child attributes
Upper bound for between and not_between threshold types. Required when thresholdType is between or not_between, must be >= threshold.
500
Offset from the interval boundary in minutes. For example, 2 with a 5m interval evaluates windows at :02, :07, :12, etc. (UTC).
2
Absolute UTC start time anchor. Alert windows start from this timestamp and repeat every interval.
"2026-02-08T10:00:00.000Z"
Alert source type (tile-based or saved search).
saved_search, tile, inline "tile"
- Option 1
- Option 2
Show child attributes
Show child attributes
Notification channels to trigger when the alert fires or resolves. Between 1 and 10 channels; duplicates are rejected.
1 - 10 elements- Option 1
- Option 2
Show child attributes
Show child attributes
Alert name template (Handlebars), rendered as the notification title. When omitted, a default title is generated from the display name, value and threshold.
"Errors for {{group}} hit {{value}}"
Display name shown in the alerts list and in notification titles. Defaults to the name of the referenced saved search, dashboard tile, or inline chart when omitted or null.
"Checkout error spike"
Tags for the alert. Defaults to the tags of the referenced saved search or dashboard when omitted or null; inline alerts have no parent to inherit from and default to an empty list.
["checkout", "p1"]
Alert message template.
"Test Alert Message"
Freeform note for the alert. Supports markdown formatting.
"Threshold raised from 50 to 100 on 2026-01-15. See [runbook](https://wiki.example.com/runbook)."
Fire the alert only after its condition has been met for this many consecutive evaluation windows. While the condition is met but fewer than this many consecutive windows have violated, the alert is in the PENDING state.
3
Was this page helpful?
curl --request POST \
--url https://api.clickhouse.cloud/v1/organizations/{organizationId}/services/{serviceId}/clickstack/alerts \
--header 'Authorization: Basic <encoded-value>' \
--header 'Content-Type: application/json' \
--data '
{
"threshold": 100,
"interval": "1h",
"thresholdType": "above",
"dashboardId": "65f5e4a3b9e77c001a567890",
"tileId": "65f5e4a3b9e77c001a901234",
"savedSearchId": "65f5e4a3b9e77c001a345678",
"groupBy": "ServiceName",
"chartConfig": {
"displayType": "line",
"sourceId": "65f5e4a3b9e77c001a111111",
"select": [
{
"aggFn": "count",
"valueExpression": "Duration",
"alias": "Request Duration",
"level": 123,
"where": "service:api",
"metricName": "http.server.duration",
"periodAggFn": "delta",
"numberFormat": {
"output": "number",
"mantissa": 2,
"thousandSeparated": true,
"average": false,
"decimalBytes": false,
"factor": 1,
"currencySymbol": "$",
"numericUnit": "bytes_iec",
"unit": "ms"
}
}
],
"groupBy": "host",
"asRatio": true,
"alignDateRangeToGranularity": true,
"fillNulls": true,
"fitYAxisToData": true,
"lineInterpolation": "step",
"numberFormat": {
"output": "number",
"mantissa": 2,
"thousandSeparated": true,
"average": false,
"decimalBytes": false,
"factor": 1,
"currencySymbol": "$",
"numericUnit": "bytes_iec",
"unit": "ms"
},
"compareToPreviousPeriod": true,
"seriesLimit": 5,
"formulas": [
{
"expression": "A / (A + B) * 100",
"alias": "Success rate %",
"numberFormat": {
"output": "number",
"mantissa": 2,
"thousandSeparated": true,
"average": false,
"decimalBytes": false,
"factor": 1,
"currencySymbol": "$",
"numericUnit": "bytes_iec",
"unit": "ms"
}
}
],
"showOperandSeries": true,
"name": "Error Rate Query",
"where": "ServiceName:api"
},
"thresholdMax": 500,
"scheduleOffsetMinutes": 2,
"scheduleStartAt": "2026-02-08T10:00:00.000Z",
"source": "tile",
"channel": {
"emailRecipients": [
"<string>"
]
},
"channels": [
{
"emailRecipients": [
"<string>"
]
}
],
"name": "Errors for {{group}} hit {{value}}",
"displayName": "Checkout error spike",
"tags": [
"checkout",
"p1"
],
"message": "Test Alert Message",
"note": "Threshold raised from 50 to 100 on 2026-01-15. See [runbook](https://wiki.example.com/runbook).",
"numConsecutiveWindows": 3
}
'import requests
url = "https://api.clickhouse.cloud/v1/organizations/{organizationId}/services/{serviceId}/clickstack/alerts"
payload = {
"threshold": 100,
"interval": "1h",
"thresholdType": "above",
"dashboardId": "65f5e4a3b9e77c001a567890",
"tileId": "65f5e4a3b9e77c001a901234",
"savedSearchId": "65f5e4a3b9e77c001a345678",
"groupBy": "ServiceName",
"chartConfig": {
"displayType": "line",
"sourceId": "65f5e4a3b9e77c001a111111",
"select": [
{
"aggFn": "count",
"valueExpression": "Duration",
"alias": "Request Duration",
"level": 123,
"where": "service:api",
"metricName": "http.server.duration",
"periodAggFn": "delta",
"numberFormat": {
"output": "number",
"mantissa": 2,
"thousandSeparated": True,
"average": False,
"decimalBytes": False,
"factor": 1,
"currencySymbol": "$",
"numericUnit": "bytes_iec",
"unit": "ms"
}
}
],
"groupBy": "host",
"asRatio": True,
"alignDateRangeToGranularity": True,
"fillNulls": True,
"fitYAxisToData": True,
"lineInterpolation": "step",
"numberFormat": {
"output": "number",
"mantissa": 2,
"thousandSeparated": True,
"average": False,
"decimalBytes": False,
"factor": 1,
"currencySymbol": "$",
"numericUnit": "bytes_iec",
"unit": "ms"
},
"compareToPreviousPeriod": True,
"seriesLimit": 5,
"formulas": [
{
"expression": "A / (A + B) * 100",
"alias": "Success rate %",
"numberFormat": {
"output": "number",
"mantissa": 2,
"thousandSeparated": True,
"average": False,
"decimalBytes": False,
"factor": 1,
"currencySymbol": "$",
"numericUnit": "bytes_iec",
"unit": "ms"
}
}
],
"showOperandSeries": True,
"name": "Error Rate Query",
"where": "ServiceName:api"
},
"thresholdMax": 500,
"scheduleOffsetMinutes": 2,
"scheduleStartAt": "2026-02-08T10:00:00.000Z",
"source": "tile",
"channel": { "emailRecipients": ["<string>"] },
"channels": [{ "emailRecipients": ["<string>"] }],
"name": "Errors for {{group}} hit {{value}}",
"displayName": "Checkout error spike",
"tags": ["checkout", "p1"],
"message": "Test Alert Message",
"note": "Threshold raised from 50 to 100 on 2026-01-15. See [runbook](https://wiki.example.com/runbook).",
"numConsecutiveWindows": 3
}
headers = {
"Authorization": "Basic <encoded-value>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Basic <encoded-value>', 'Content-Type': 'application/json'},
body: JSON.stringify({
threshold: 100,
interval: '1h',
thresholdType: 'above',
dashboardId: '65f5e4a3b9e77c001a567890',
tileId: '65f5e4a3b9e77c001a901234',
savedSearchId: '65f5e4a3b9e77c001a345678',
groupBy: 'ServiceName',
chartConfig: {
displayType: 'line',
sourceId: '65f5e4a3b9e77c001a111111',
select: [
{
aggFn: 'count',
valueExpression: 'Duration',
alias: 'Request Duration',
level: 123,
where: 'service:api',
metricName: 'http.server.duration',
periodAggFn: 'delta',
numberFormat: {
output: 'number',
mantissa: 2,
thousandSeparated: true,
average: false,
decimalBytes: false,
factor: 1,
currencySymbol: '$',
numericUnit: 'bytes_iec',
unit: 'ms'
}
}
],
groupBy: 'host',
asRatio: true,
alignDateRangeToGranularity: true,
fillNulls: true,
fitYAxisToData: true,
lineInterpolation: 'step',
numberFormat: {
output: 'number',
mantissa: 2,
thousandSeparated: true,
average: false,
decimalBytes: false,
factor: 1,
currencySymbol: '$',
numericUnit: 'bytes_iec',
unit: 'ms'
},
compareToPreviousPeriod: true,
seriesLimit: 5,
formulas: [
{
expression: 'A / (A + B) * 100',
alias: 'Success rate %',
numberFormat: {
output: 'number',
mantissa: 2,
thousandSeparated: true,
average: false,
decimalBytes: false,
factor: 1,
currencySymbol: '$',
numericUnit: 'bytes_iec',
unit: 'ms'
}
}
],
showOperandSeries: true,
name: 'Error Rate Query',
where: 'ServiceName:api'
},
thresholdMax: 500,
scheduleOffsetMinutes: 2,
scheduleStartAt: '2026-02-08T10:00:00.000Z',
source: 'tile',
channel: {emailRecipients: ['<string>']},
channels: [{emailRecipients: ['<string>']}],
name: 'Errors for {{group}} hit {{value}}',
displayName: 'Checkout error spike',
tags: ['checkout', 'p1'],
message: 'Test Alert Message',
note: 'Threshold raised from 50 to 100 on 2026-01-15. See [runbook](https://wiki.example.com/runbook).',
numConsecutiveWindows: 3
})
};
fetch('https://api.clickhouse.cloud/v1/organizations/{organizationId}/services/{serviceId}/clickstack/alerts', 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.clickhouse.cloud/v1/organizations/{organizationId}/services/{serviceId}/clickstack/alerts",
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([
'threshold' => 100,
'interval' => '1h',
'thresholdType' => 'above',
'dashboardId' => '65f5e4a3b9e77c001a567890',
'tileId' => '65f5e4a3b9e77c001a901234',
'savedSearchId' => '65f5e4a3b9e77c001a345678',
'groupBy' => 'ServiceName',
'chartConfig' => [
'displayType' => 'line',
'sourceId' => '65f5e4a3b9e77c001a111111',
'select' => [
[
'aggFn' => 'count',
'valueExpression' => 'Duration',
'alias' => 'Request Duration',
'level' => 123,
'where' => 'service:api',
'metricName' => 'http.server.duration',
'periodAggFn' => 'delta',
'numberFormat' => [
'output' => 'number',
'mantissa' => 2,
'thousandSeparated' => true,
'average' => false,
'decimalBytes' => false,
'factor' => 1,
'currencySymbol' => '$',
'numericUnit' => 'bytes_iec',
'unit' => 'ms'
]
]
],
'groupBy' => 'host',
'asRatio' => true,
'alignDateRangeToGranularity' => true,
'fillNulls' => true,
'fitYAxisToData' => true,
'lineInterpolation' => 'step',
'numberFormat' => [
'output' => 'number',
'mantissa' => 2,
'thousandSeparated' => true,
'average' => false,
'decimalBytes' => false,
'factor' => 1,
'currencySymbol' => '$',
'numericUnit' => 'bytes_iec',
'unit' => 'ms'
],
'compareToPreviousPeriod' => true,
'seriesLimit' => 5,
'formulas' => [
[
'expression' => 'A / (A + B) * 100',
'alias' => 'Success rate %',
'numberFormat' => [
'output' => 'number',
'mantissa' => 2,
'thousandSeparated' => true,
'average' => false,
'decimalBytes' => false,
'factor' => 1,
'currencySymbol' => '$',
'numericUnit' => 'bytes_iec',
'unit' => 'ms'
]
]
],
'showOperandSeries' => true,
'name' => 'Error Rate Query',
'where' => 'ServiceName:api'
],
'thresholdMax' => 500,
'scheduleOffsetMinutes' => 2,
'scheduleStartAt' => '2026-02-08T10:00:00.000Z',
'source' => 'tile',
'channel' => [
'emailRecipients' => [
'<string>'
]
],
'channels' => [
[
'emailRecipients' => [
'<string>'
]
]
],
'name' => 'Errors for {{group}} hit {{value}}',
'displayName' => 'Checkout error spike',
'tags' => [
'checkout',
'p1'
],
'message' => 'Test Alert Message',
'note' => 'Threshold raised from 50 to 100 on 2026-01-15. See [runbook](https://wiki.example.com/runbook).',
'numConsecutiveWindows' => 3
]),
CURLOPT_HTTPHEADER => [
"Authorization: Basic <encoded-value>",
"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.clickhouse.cloud/v1/organizations/{organizationId}/services/{serviceId}/clickstack/alerts"
payload := strings.NewReader("{\n \"threshold\": 100,\n \"interval\": \"1h\",\n \"thresholdType\": \"above\",\n \"dashboardId\": \"65f5e4a3b9e77c001a567890\",\n \"tileId\": \"65f5e4a3b9e77c001a901234\",\n \"savedSearchId\": \"65f5e4a3b9e77c001a345678\",\n \"groupBy\": \"ServiceName\",\n \"chartConfig\": {\n \"displayType\": \"line\",\n \"sourceId\": \"65f5e4a3b9e77c001a111111\",\n \"select\": [\n {\n \"aggFn\": \"count\",\n \"valueExpression\": \"Duration\",\n \"alias\": \"Request Duration\",\n \"level\": 123,\n \"where\": \"service:api\",\n \"metricName\": \"http.server.duration\",\n \"periodAggFn\": \"delta\",\n \"numberFormat\": {\n \"output\": \"number\",\n \"mantissa\": 2,\n \"thousandSeparated\": true,\n \"average\": false,\n \"decimalBytes\": false,\n \"factor\": 1,\n \"currencySymbol\": \"$\",\n \"numericUnit\": \"bytes_iec\",\n \"unit\": \"ms\"\n }\n }\n ],\n \"groupBy\": \"host\",\n \"asRatio\": true,\n \"alignDateRangeToGranularity\": true,\n \"fillNulls\": true,\n \"fitYAxisToData\": true,\n \"lineInterpolation\": \"step\",\n \"numberFormat\": {\n \"output\": \"number\",\n \"mantissa\": 2,\n \"thousandSeparated\": true,\n \"average\": false,\n \"decimalBytes\": false,\n \"factor\": 1,\n \"currencySymbol\": \"$\",\n \"numericUnit\": \"bytes_iec\",\n \"unit\": \"ms\"\n },\n \"compareToPreviousPeriod\": true,\n \"seriesLimit\": 5,\n \"formulas\": [\n {\n \"expression\": \"A / (A + B) * 100\",\n \"alias\": \"Success rate %\",\n \"numberFormat\": {\n \"output\": \"number\",\n \"mantissa\": 2,\n \"thousandSeparated\": true,\n \"average\": false,\n \"decimalBytes\": false,\n \"factor\": 1,\n \"currencySymbol\": \"$\",\n \"numericUnit\": \"bytes_iec\",\n \"unit\": \"ms\"\n }\n }\n ],\n \"showOperandSeries\": true,\n \"name\": \"Error Rate Query\",\n \"where\": \"ServiceName:api\"\n },\n \"thresholdMax\": 500,\n \"scheduleOffsetMinutes\": 2,\n \"scheduleStartAt\": \"2026-02-08T10:00:00.000Z\",\n \"source\": \"tile\",\n \"channel\": {\n \"emailRecipients\": [\n \"<string>\"\n ]\n },\n \"channels\": [\n {\n \"emailRecipients\": [\n \"<string>\"\n ]\n }\n ],\n \"name\": \"Errors for {{group}} hit {{value}}\",\n \"displayName\": \"Checkout error spike\",\n \"tags\": [\n \"checkout\",\n \"p1\"\n ],\n \"message\": \"Test Alert Message\",\n \"note\": \"Threshold raised from 50 to 100 on 2026-01-15. See [runbook](https://wiki.example.com/runbook).\",\n \"numConsecutiveWindows\": 3\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Basic <encoded-value>")
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.clickhouse.cloud/v1/organizations/{organizationId}/services/{serviceId}/clickstack/alerts")
.header("Authorization", "Basic <encoded-value>")
.header("Content-Type", "application/json")
.body("{\n \"threshold\": 100,\n \"interval\": \"1h\",\n \"thresholdType\": \"above\",\n \"dashboardId\": \"65f5e4a3b9e77c001a567890\",\n \"tileId\": \"65f5e4a3b9e77c001a901234\",\n \"savedSearchId\": \"65f5e4a3b9e77c001a345678\",\n \"groupBy\": \"ServiceName\",\n \"chartConfig\": {\n \"displayType\": \"line\",\n \"sourceId\": \"65f5e4a3b9e77c001a111111\",\n \"select\": [\n {\n \"aggFn\": \"count\",\n \"valueExpression\": \"Duration\",\n \"alias\": \"Request Duration\",\n \"level\": 123,\n \"where\": \"service:api\",\n \"metricName\": \"http.server.duration\",\n \"periodAggFn\": \"delta\",\n \"numberFormat\": {\n \"output\": \"number\",\n \"mantissa\": 2,\n \"thousandSeparated\": true,\n \"average\": false,\n \"decimalBytes\": false,\n \"factor\": 1,\n \"currencySymbol\": \"$\",\n \"numericUnit\": \"bytes_iec\",\n \"unit\": \"ms\"\n }\n }\n ],\n \"groupBy\": \"host\",\n \"asRatio\": true,\n \"alignDateRangeToGranularity\": true,\n \"fillNulls\": true,\n \"fitYAxisToData\": true,\n \"lineInterpolation\": \"step\",\n \"numberFormat\": {\n \"output\": \"number\",\n \"mantissa\": 2,\n \"thousandSeparated\": true,\n \"average\": false,\n \"decimalBytes\": false,\n \"factor\": 1,\n \"currencySymbol\": \"$\",\n \"numericUnit\": \"bytes_iec\",\n \"unit\": \"ms\"\n },\n \"compareToPreviousPeriod\": true,\n \"seriesLimit\": 5,\n \"formulas\": [\n {\n \"expression\": \"A / (A + B) * 100\",\n \"alias\": \"Success rate %\",\n \"numberFormat\": {\n \"output\": \"number\",\n \"mantissa\": 2,\n \"thousandSeparated\": true,\n \"average\": false,\n \"decimalBytes\": false,\n \"factor\": 1,\n \"currencySymbol\": \"$\",\n \"numericUnit\": \"bytes_iec\",\n \"unit\": \"ms\"\n }\n }\n ],\n \"showOperandSeries\": true,\n \"name\": \"Error Rate Query\",\n \"where\": \"ServiceName:api\"\n },\n \"thresholdMax\": 500,\n \"scheduleOffsetMinutes\": 2,\n \"scheduleStartAt\": \"2026-02-08T10:00:00.000Z\",\n \"source\": \"tile\",\n \"channel\": {\n \"emailRecipients\": [\n \"<string>\"\n ]\n },\n \"channels\": [\n {\n \"emailRecipients\": [\n \"<string>\"\n ]\n }\n ],\n \"name\": \"Errors for {{group}} hit {{value}}\",\n \"displayName\": \"Checkout error spike\",\n \"tags\": [\n \"checkout\",\n \"p1\"\n ],\n \"message\": \"Test Alert Message\",\n \"note\": \"Threshold raised from 50 to 100 on 2026-01-15. See [runbook](https://wiki.example.com/runbook).\",\n \"numConsecutiveWindows\": 3\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.clickhouse.cloud/v1/organizations/{organizationId}/services/{serviceId}/clickstack/alerts")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Basic <encoded-value>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"threshold\": 100,\n \"interval\": \"1h\",\n \"thresholdType\": \"above\",\n \"dashboardId\": \"65f5e4a3b9e77c001a567890\",\n \"tileId\": \"65f5e4a3b9e77c001a901234\",\n \"savedSearchId\": \"65f5e4a3b9e77c001a345678\",\n \"groupBy\": \"ServiceName\",\n \"chartConfig\": {\n \"displayType\": \"line\",\n \"sourceId\": \"65f5e4a3b9e77c001a111111\",\n \"select\": [\n {\n \"aggFn\": \"count\",\n \"valueExpression\": \"Duration\",\n \"alias\": \"Request Duration\",\n \"level\": 123,\n \"where\": \"service:api\",\n \"metricName\": \"http.server.duration\",\n \"periodAggFn\": \"delta\",\n \"numberFormat\": {\n \"output\": \"number\",\n \"mantissa\": 2,\n \"thousandSeparated\": true,\n \"average\": false,\n \"decimalBytes\": false,\n \"factor\": 1,\n \"currencySymbol\": \"$\",\n \"numericUnit\": \"bytes_iec\",\n \"unit\": \"ms\"\n }\n }\n ],\n \"groupBy\": \"host\",\n \"asRatio\": true,\n \"alignDateRangeToGranularity\": true,\n \"fillNulls\": true,\n \"fitYAxisToData\": true,\n \"lineInterpolation\": \"step\",\n \"numberFormat\": {\n \"output\": \"number\",\n \"mantissa\": 2,\n \"thousandSeparated\": true,\n \"average\": false,\n \"decimalBytes\": false,\n \"factor\": 1,\n \"currencySymbol\": \"$\",\n \"numericUnit\": \"bytes_iec\",\n \"unit\": \"ms\"\n },\n \"compareToPreviousPeriod\": true,\n \"seriesLimit\": 5,\n \"formulas\": [\n {\n \"expression\": \"A / (A + B) * 100\",\n \"alias\": \"Success rate %\",\n \"numberFormat\": {\n \"output\": \"number\",\n \"mantissa\": 2,\n \"thousandSeparated\": true,\n \"average\": false,\n \"decimalBytes\": false,\n \"factor\": 1,\n \"currencySymbol\": \"$\",\n \"numericUnit\": \"bytes_iec\",\n \"unit\": \"ms\"\n }\n }\n ],\n \"showOperandSeries\": true,\n \"name\": \"Error Rate Query\",\n \"where\": \"ServiceName:api\"\n },\n \"thresholdMax\": 500,\n \"scheduleOffsetMinutes\": 2,\n \"scheduleStartAt\": \"2026-02-08T10:00:00.000Z\",\n \"source\": \"tile\",\n \"channel\": {\n \"emailRecipients\": [\n \"<string>\"\n ]\n },\n \"channels\": [\n {\n \"emailRecipients\": [\n \"<string>\"\n ]\n }\n ],\n \"name\": \"Errors for {{group}} hit {{value}}\",\n \"displayName\": \"Checkout error spike\",\n \"tags\": [\n \"checkout\",\n \"p1\"\n ],\n \"message\": \"Test Alert Message\",\n \"note\": \"Threshold raised from 50 to 100 on 2026-01-15. See [runbook](https://wiki.example.com/runbook).\",\n \"numConsecutiveWindows\": 3\n}"
response = http.request(request)
puts response.read_body{
"status": 200,
"requestId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"result": {
"displayName": "Checkout error spike",
"tags": [
"checkout",
"p1"
],
"dashboardId": "65f5e4a3b9e77c001a567890",
"tileId": "65f5e4a3b9e77c001a901234",
"savedSearchId": "65f5e4a3b9e77c001a345678",
"groupBy": "ServiceName",
"chartConfig": {
"displayType": "line",
"sourceId": "65f5e4a3b9e77c001a111111",
"select": [
{
"aggFn": "count",
"valueExpression": "Duration",
"alias": "Request Duration",
"level": 123,
"where": "service:api",
"whereLanguage": "sql",
"metricName": "http.server.duration",
"metricType": "sum",
"periodAggFn": "delta",
"numberFormat": {
"output": "number",
"mantissa": 2,
"thousandSeparated": true,
"average": false,
"decimalBytes": false,
"factor": 1,
"currencySymbol": "$",
"numericUnit": "bytes_iec",
"unit": "ms"
}
}
],
"groupBy": "host",
"asRatio": true,
"alignDateRangeToGranularity": true,
"fillNulls": true,
"fitYAxisToData": true,
"lineInterpolation": "step",
"numberFormat": {
"output": "number",
"mantissa": 2,
"thousandSeparated": true,
"average": false,
"decimalBytes": false,
"factor": 1,
"currencySymbol": "$",
"numericUnit": "bytes_iec",
"unit": "ms"
},
"compareToPreviousPeriod": true,
"seriesLimit": 5,
"formulas": [
{
"expression": "A / (A + B) * 100",
"alias": "Success rate %",
"numberFormat": {
"output": "number",
"mantissa": 2,
"thousandSeparated": true,
"average": false,
"decimalBytes": false,
"factor": 1,
"currencySymbol": "$",
"numericUnit": "bytes_iec",
"unit": "ms"
}
}
],
"showOperandSeries": true,
"name": "Error Rate Query",
"where": "ServiceName:api",
"whereLanguage": "sql"
},
"threshold": 100,
"thresholdMax": 500,
"interval": "1h",
"scheduleOffsetMinutes": 2,
"scheduleStartAt": "2026-02-08T10:00:00.000Z",
"source": "tile",
"thresholdType": "above",
"channel": {
"type": "webhook",
"emailRecipients": [
"<string>"
]
},
"channels": [
{
"type": "webhook",
"emailRecipients": [
"<string>"
]
}
],
"name": "Errors for {{group}} hit {{value}}",
"message": "Test Alert Message",
"note": "Threshold raised from 50 to 100 on 2026-01-15. See [runbook](https://wiki.example.com/runbook).",
"numConsecutiveWindows": 3,
"id": "65f5e4a3b9e77c001a123456",
"state": "ALERT",
"teamId": "65f5e4a3b9e77c001a345678",
"silenced": {
"by": "65f5e4a3b9e77c001a234567",
"at": "2026-03-19T08:00:00.000Z",
"until": "2026-03-20T08:00:00.000Z"
},
"executionErrors": [
{
"timestamp": "2026-04-17T12:00:00.000Z",
"type": "QUERY_ERROR",
"message": "Query timed out after 30s"
}
],
"createdAt": "2023-01-01T00:00:00.000Z",
"updatedAt": "2023-01-01T00:00:00.000Z"
}
}{
"status": 400,
"error": "<string>",
"requestId": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}{
"status": 500,
"error": "<string>",
"requestId": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}