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)."
}
'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)."
}
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).'
})
};
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).'
]),
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}")
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}")
.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}"
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).",
"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)."
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)."
}
'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)."
}
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).'
})
};
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).'
]),
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}")
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}")
.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}"
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).",
"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"
}