ClickStack: Update Alert
This endpoint is in beta. API contract is stable, and no breaking changes are expected in the future.
ClickStack: Updates an existing alert
curl --request PUT \
--url https://api.clickhouse.cloud/v1/organizations/{organizationId}/services/{serviceId}/clickstack/alerts/{clickStackAlertId} \
--header 'Authorization: Basic <encoded-value>' \
--header 'Content-Type: application/json' \
--data '
{
"dashboardId": "65f5e4a3b9e77c001a567890",
"tileId": "65f5e4a3b9e77c001a901234",
"savedSearchId": "65f5e4a3b9e77c001a345678",
"groupBy": "ServiceName",
"threshold": 100,
"thresholdMax": 500,
"interval": "1h",
"scheduleOffsetMinutes": 2,
"scheduleStartAt": "2026-02-08T10:00:00.000Z",
"source": "tile",
"thresholdType": "above",
"channel": {
"emailRecipients": [
"<string>"
]
},
"name": "Test Alert",
"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/{clickStackAlertId}"
payload = {
"dashboardId": "65f5e4a3b9e77c001a567890",
"tileId": "65f5e4a3b9e77c001a901234",
"savedSearchId": "65f5e4a3b9e77c001a345678",
"groupBy": "ServiceName",
"threshold": 100,
"thresholdMax": 500,
"interval": "1h",
"scheduleOffsetMinutes": 2,
"scheduleStartAt": "2026-02-08T10:00:00.000Z",
"source": "tile",
"thresholdType": "above",
"channel": { "emailRecipients": ["<string>"] },
"name": "Test Alert",
"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.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {Authorization: 'Basic <encoded-value>', 'Content-Type': 'application/json'},
body: JSON.stringify({
dashboardId: '65f5e4a3b9e77c001a567890',
tileId: '65f5e4a3b9e77c001a901234',
savedSearchId: '65f5e4a3b9e77c001a345678',
groupBy: 'ServiceName',
threshold: 100,
thresholdMax: 500,
interval: '1h',
scheduleOffsetMinutes: 2,
scheduleStartAt: '2026-02-08T10:00:00.000Z',
source: 'tile',
thresholdType: 'above',
channel: {emailRecipients: ['<string>']},
name: 'Test Alert',
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/{clickStackAlertId}', 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/{clickStackAlertId}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'dashboardId' => '65f5e4a3b9e77c001a567890',
'tileId' => '65f5e4a3b9e77c001a901234',
'savedSearchId' => '65f5e4a3b9e77c001a345678',
'groupBy' => 'ServiceName',
'threshold' => 100,
'thresholdMax' => 500,
'interval' => '1h',
'scheduleOffsetMinutes' => 2,
'scheduleStartAt' => '2026-02-08T10:00:00.000Z',
'source' => 'tile',
'thresholdType' => 'above',
'channel' => [
'emailRecipients' => [
'<string>'
]
],
'name' => 'Test Alert',
'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/{clickStackAlertId}"
payload := strings.NewReader("{\n \"dashboardId\": \"65f5e4a3b9e77c001a567890\",\n \"tileId\": \"65f5e4a3b9e77c001a901234\",\n \"savedSearchId\": \"65f5e4a3b9e77c001a345678\",\n \"groupBy\": \"ServiceName\",\n \"threshold\": 100,\n \"thresholdMax\": 500,\n \"interval\": \"1h\",\n \"scheduleOffsetMinutes\": 2,\n \"scheduleStartAt\": \"2026-02-08T10:00:00.000Z\",\n \"source\": \"tile\",\n \"thresholdType\": \"above\",\n \"channel\": {\n \"emailRecipients\": [\n \"<string>\"\n ]\n },\n \"name\": \"Test Alert\",\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("PUT", 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.put("https://api.clickhouse.cloud/v1/organizations/{organizationId}/services/{serviceId}/clickstack/alerts/{clickStackAlertId}")
.header("Authorization", "Basic <encoded-value>")
.header("Content-Type", "application/json")
.body("{\n \"dashboardId\": \"65f5e4a3b9e77c001a567890\",\n \"tileId\": \"65f5e4a3b9e77c001a901234\",\n \"savedSearchId\": \"65f5e4a3b9e77c001a345678\",\n \"groupBy\": \"ServiceName\",\n \"threshold\": 100,\n \"thresholdMax\": 500,\n \"interval\": \"1h\",\n \"scheduleOffsetMinutes\": 2,\n \"scheduleStartAt\": \"2026-02-08T10:00:00.000Z\",\n \"source\": \"tile\",\n \"thresholdType\": \"above\",\n \"channel\": {\n \"emailRecipients\": [\n \"<string>\"\n ]\n },\n \"name\": \"Test Alert\",\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/{clickStackAlertId}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Authorization"] = 'Basic <encoded-value>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"dashboardId\": \"65f5e4a3b9e77c001a567890\",\n \"tileId\": \"65f5e4a3b9e77c001a901234\",\n \"savedSearchId\": \"65f5e4a3b9e77c001a345678\",\n \"groupBy\": \"ServiceName\",\n \"threshold\": 100,\n \"thresholdMax\": 500,\n \"interval\": \"1h\",\n \"scheduleOffsetMinutes\": 2,\n \"scheduleStartAt\": \"2026-02-08T10:00:00.000Z\",\n \"source\": \"tile\",\n \"thresholdType\": \"above\",\n \"channel\": {\n \"emailRecipients\": [\n \"<string>\"\n ]\n },\n \"name\": \"Test Alert\",\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": {
"dashboardId": "65f5e4a3b9e77c001a567890",
"tileId": "65f5e4a3b9e77c001a901234",
"savedSearchId": "65f5e4a3b9e77c001a345678",
"groupBy": "ServiceName",
"threshold": 100,
"thresholdMax": 500,
"interval": "1h",
"scheduleOffsetMinutes": 2,
"scheduleStartAt": "2026-02-08T10:00:00.000Z",
"source": "tile",
"thresholdType": "above",
"channel": {
"emailRecipients": [
"<string>"
]
},
"name": "Test Alert",
"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: Updates an existing alert
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.
ClickStack Alert ID
Body
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"
Threshold value for triggering the alert. For between and not_between threshold types, this is the lower bound.
100
Upper bound for between and not_between threshold types. Required when thresholdType is between or not_between, must be >= threshold.
500
Evaluation interval for the alert.
1m, 5m, 15m, 30m, 1h, 6h, 12h, 1d "1h"
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 "tile"
Threshold comparison direction.
above, below, above_exclusive, below_or_equal, equal, not_equal, between, not_between "above"
- Option 1
- Option 2
Show child attributes
Show child attributes
Human-friendly alert name.
"Test Alert"
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 PUT \
--url https://api.clickhouse.cloud/v1/organizations/{organizationId}/services/{serviceId}/clickstack/alerts/{clickStackAlertId} \
--header 'Authorization: Basic <encoded-value>' \
--header 'Content-Type: application/json' \
--data '
{
"dashboardId": "65f5e4a3b9e77c001a567890",
"tileId": "65f5e4a3b9e77c001a901234",
"savedSearchId": "65f5e4a3b9e77c001a345678",
"groupBy": "ServiceName",
"threshold": 100,
"thresholdMax": 500,
"interval": "1h",
"scheduleOffsetMinutes": 2,
"scheduleStartAt": "2026-02-08T10:00:00.000Z",
"source": "tile",
"thresholdType": "above",
"channel": {
"emailRecipients": [
"<string>"
]
},
"name": "Test Alert",
"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/{clickStackAlertId}"
payload = {
"dashboardId": "65f5e4a3b9e77c001a567890",
"tileId": "65f5e4a3b9e77c001a901234",
"savedSearchId": "65f5e4a3b9e77c001a345678",
"groupBy": "ServiceName",
"threshold": 100,
"thresholdMax": 500,
"interval": "1h",
"scheduleOffsetMinutes": 2,
"scheduleStartAt": "2026-02-08T10:00:00.000Z",
"source": "tile",
"thresholdType": "above",
"channel": { "emailRecipients": ["<string>"] },
"name": "Test Alert",
"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.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {Authorization: 'Basic <encoded-value>', 'Content-Type': 'application/json'},
body: JSON.stringify({
dashboardId: '65f5e4a3b9e77c001a567890',
tileId: '65f5e4a3b9e77c001a901234',
savedSearchId: '65f5e4a3b9e77c001a345678',
groupBy: 'ServiceName',
threshold: 100,
thresholdMax: 500,
interval: '1h',
scheduleOffsetMinutes: 2,
scheduleStartAt: '2026-02-08T10:00:00.000Z',
source: 'tile',
thresholdType: 'above',
channel: {emailRecipients: ['<string>']},
name: 'Test Alert',
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/{clickStackAlertId}', 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/{clickStackAlertId}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'dashboardId' => '65f5e4a3b9e77c001a567890',
'tileId' => '65f5e4a3b9e77c001a901234',
'savedSearchId' => '65f5e4a3b9e77c001a345678',
'groupBy' => 'ServiceName',
'threshold' => 100,
'thresholdMax' => 500,
'interval' => '1h',
'scheduleOffsetMinutes' => 2,
'scheduleStartAt' => '2026-02-08T10:00:00.000Z',
'source' => 'tile',
'thresholdType' => 'above',
'channel' => [
'emailRecipients' => [
'<string>'
]
],
'name' => 'Test Alert',
'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/{clickStackAlertId}"
payload := strings.NewReader("{\n \"dashboardId\": \"65f5e4a3b9e77c001a567890\",\n \"tileId\": \"65f5e4a3b9e77c001a901234\",\n \"savedSearchId\": \"65f5e4a3b9e77c001a345678\",\n \"groupBy\": \"ServiceName\",\n \"threshold\": 100,\n \"thresholdMax\": 500,\n \"interval\": \"1h\",\n \"scheduleOffsetMinutes\": 2,\n \"scheduleStartAt\": \"2026-02-08T10:00:00.000Z\",\n \"source\": \"tile\",\n \"thresholdType\": \"above\",\n \"channel\": {\n \"emailRecipients\": [\n \"<string>\"\n ]\n },\n \"name\": \"Test Alert\",\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("PUT", 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.put("https://api.clickhouse.cloud/v1/organizations/{organizationId}/services/{serviceId}/clickstack/alerts/{clickStackAlertId}")
.header("Authorization", "Basic <encoded-value>")
.header("Content-Type", "application/json")
.body("{\n \"dashboardId\": \"65f5e4a3b9e77c001a567890\",\n \"tileId\": \"65f5e4a3b9e77c001a901234\",\n \"savedSearchId\": \"65f5e4a3b9e77c001a345678\",\n \"groupBy\": \"ServiceName\",\n \"threshold\": 100,\n \"thresholdMax\": 500,\n \"interval\": \"1h\",\n \"scheduleOffsetMinutes\": 2,\n \"scheduleStartAt\": \"2026-02-08T10:00:00.000Z\",\n \"source\": \"tile\",\n \"thresholdType\": \"above\",\n \"channel\": {\n \"emailRecipients\": [\n \"<string>\"\n ]\n },\n \"name\": \"Test Alert\",\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/{clickStackAlertId}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Authorization"] = 'Basic <encoded-value>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"dashboardId\": \"65f5e4a3b9e77c001a567890\",\n \"tileId\": \"65f5e4a3b9e77c001a901234\",\n \"savedSearchId\": \"65f5e4a3b9e77c001a345678\",\n \"groupBy\": \"ServiceName\",\n \"threshold\": 100,\n \"thresholdMax\": 500,\n \"interval\": \"1h\",\n \"scheduleOffsetMinutes\": 2,\n \"scheduleStartAt\": \"2026-02-08T10:00:00.000Z\",\n \"source\": \"tile\",\n \"thresholdType\": \"above\",\n \"channel\": {\n \"emailRecipients\": [\n \"<string>\"\n ]\n },\n \"name\": \"Test Alert\",\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": {
"dashboardId": "65f5e4a3b9e77c001a567890",
"tileId": "65f5e4a3b9e77c001a901234",
"savedSearchId": "65f5e4a3b9e77c001a345678",
"groupBy": "ServiceName",
"threshold": 100,
"thresholdMax": 500,
"interval": "1h",
"scheduleOffsetMinutes": 2,
"scheduleStartAt": "2026-02-08T10:00:00.000Z",
"source": "tile",
"thresholdType": "above",
"channel": {
"emailRecipients": [
"<string>"
]
},
"name": "Test Alert",
"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"
}