ClickStack: Update Saved Search
This endpoint is in beta. API contract is stable, and no breaking changes are expected in the future.
ClickStack: Updates an existing saved search. This is a full replace: send the full object. Every optional field (select, where, whereLanguage, orderBy, tags, filters) is always written and falls back to its default when omitted, so omitting a field resets it rather than preserving the stored value.
curl --request PUT \
--url https://api.clickhouse.cloud/v1/organizations/{organizationId}/services/{serviceId}/clickstack/saved-searches/{clickStackSavedSearchId} \
--header 'Authorization: Basic <encoded-value>' \
--header 'Content-Type: application/json' \
--data @- <<EOF
{
"name": "Production Errors",
"sourceId": "507f1f77bcf86cd799439012",
"select": "Timestamp, ServiceName, Body",
"where": "SeverityText:ERROR",
"whereLanguage": "lucene",
"orderBy": "Timestamp DESC",
"tags": [
"production",
"errors"
],
"filters": [
"{\"type\":\"sql\",\"condition\":\"ServiceName IN ('checkout', 'payments')\"}"
]
}
EOFimport requests
url = "https://api.clickhouse.cloud/v1/organizations/{organizationId}/services/{serviceId}/clickstack/saved-searches/{clickStackSavedSearchId}"
payload = {
"name": "Production Errors",
"sourceId": "507f1f77bcf86cd799439012",
"select": "Timestamp, ServiceName, Body",
"where": "SeverityText:ERROR",
"whereLanguage": "lucene",
"orderBy": "Timestamp DESC",
"tags": ["production", "errors"],
"filters": ["{\"type\":\"sql\",\"condition\":\"ServiceName IN ('checkout', 'payments')\"}"]
}
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({
name: 'Production Errors',
sourceId: '507f1f77bcf86cd799439012',
select: 'Timestamp, ServiceName, Body',
where: 'SeverityText:ERROR',
whereLanguage: 'lucene',
orderBy: 'Timestamp DESC',
tags: ['production', 'errors'],
filters: ['{"type":"sql","condition":"ServiceName IN (\'checkout\', \'payments\')"}']
})
};
fetch('https://api.clickhouse.cloud/v1/organizations/{organizationId}/services/{serviceId}/clickstack/saved-searches/{clickStackSavedSearchId}', 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/saved-searches/{clickStackSavedSearchId}",
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([
'name' => 'Production Errors',
'sourceId' => '507f1f77bcf86cd799439012',
'select' => 'Timestamp, ServiceName, Body',
'where' => 'SeverityText:ERROR',
'whereLanguage' => 'lucene',
'orderBy' => 'Timestamp DESC',
'tags' => [
'production',
'errors'
],
'filters' => [
'{"type":"sql","condition":"ServiceName IN (\'checkout\', \'payments\')"}'
]
]),
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/saved-searches/{clickStackSavedSearchId}"
payload := strings.NewReader("{\n \"name\": \"Production Errors\",\n \"sourceId\": \"507f1f77bcf86cd799439012\",\n \"select\": \"Timestamp, ServiceName, Body\",\n \"where\": \"SeverityText:ERROR\",\n \"whereLanguage\": \"lucene\",\n \"orderBy\": \"Timestamp DESC\",\n \"tags\": [\n \"production\",\n \"errors\"\n ],\n \"filters\": [\n \"{\\\"type\\\":\\\"sql\\\",\\\"condition\\\":\\\"ServiceName IN ('checkout', 'payments')\\\"}\"\n ]\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/saved-searches/{clickStackSavedSearchId}")
.header("Authorization", "Basic <encoded-value>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"Production Errors\",\n \"sourceId\": \"507f1f77bcf86cd799439012\",\n \"select\": \"Timestamp, ServiceName, Body\",\n \"where\": \"SeverityText:ERROR\",\n \"whereLanguage\": \"lucene\",\n \"orderBy\": \"Timestamp DESC\",\n \"tags\": [\n \"production\",\n \"errors\"\n ],\n \"filters\": [\n \"{\\\"type\\\":\\\"sql\\\",\\\"condition\\\":\\\"ServiceName IN ('checkout', 'payments')\\\"}\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.clickhouse.cloud/v1/organizations/{organizationId}/services/{serviceId}/clickstack/saved-searches/{clickStackSavedSearchId}")
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 \"name\": \"Production Errors\",\n \"sourceId\": \"507f1f77bcf86cd799439012\",\n \"select\": \"Timestamp, ServiceName, Body\",\n \"where\": \"SeverityText:ERROR\",\n \"whereLanguage\": \"lucene\",\n \"orderBy\": \"Timestamp DESC\",\n \"tags\": [\n \"production\",\n \"errors\"\n ],\n \"filters\": [\n \"{\\\"type\\\":\\\"sql\\\",\\\"condition\\\":\\\"ServiceName IN ('checkout', 'payments')\\\"}\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"status": 200,
"requestId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"result": {
"id": "507f1f77bcf86cd799439011",
"name": "Production Errors",
"sourceId": "507f1f77bcf86cd799439012",
"select": "Timestamp, ServiceName, Body",
"where": "SeverityText:ERROR",
"whereLanguage": "lucene",
"orderBy": "Timestamp DESC",
"tags": [
"production",
"errors"
],
"filters": [
"{\"type\":\"sql\",\"condition\":\"ServiceName IN ('checkout', 'payments')\"}"
],
"teamId": "507f1f77bcf86cd799439013",
"createdAt": "2025-01-01T00:00:00.000Z",
"updatedAt": "2025-06-15T10:30: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 saved search. This is a full replace: send the full object. Every optional field (
select, where, whereLanguage, orderBy, tags, filters) is always written and falls back to its default when omitted, so omitting a field resets it rather than preserving the stored value.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.
Saved search ID
Body
Display name for the saved search.
"Production Errors"
ID of the source to query. Must belong to the team.
"507f1f77bcf86cd799439012"
Comma-separated list of column expressions to display. Empty uses the source default.
"Timestamp, ServiceName, Body"
Row filter expression. The language is controlled by whereLanguage.
"SeverityText:ERROR"
Language used for the where filter.
lucene, sql "lucene"
ORDER BY expression. Empty uses the source default.
"Timestamp DESC"
Tags used to organize saved searches.
["production", "errors"]
Structured pinned filters applied to the search.
Show child attributes
Show child attributes
[ "{\"type\":\"sql\",\"condition\":\"ServiceName IN ('checkout', 'payments')\"}" ]
Was this page helpful?
curl --request PUT \
--url https://api.clickhouse.cloud/v1/organizations/{organizationId}/services/{serviceId}/clickstack/saved-searches/{clickStackSavedSearchId} \
--header 'Authorization: Basic <encoded-value>' \
--header 'Content-Type: application/json' \
--data @- <<EOF
{
"name": "Production Errors",
"sourceId": "507f1f77bcf86cd799439012",
"select": "Timestamp, ServiceName, Body",
"where": "SeverityText:ERROR",
"whereLanguage": "lucene",
"orderBy": "Timestamp DESC",
"tags": [
"production",
"errors"
],
"filters": [
"{\"type\":\"sql\",\"condition\":\"ServiceName IN ('checkout', 'payments')\"}"
]
}
EOFimport requests
url = "https://api.clickhouse.cloud/v1/organizations/{organizationId}/services/{serviceId}/clickstack/saved-searches/{clickStackSavedSearchId}"
payload = {
"name": "Production Errors",
"sourceId": "507f1f77bcf86cd799439012",
"select": "Timestamp, ServiceName, Body",
"where": "SeverityText:ERROR",
"whereLanguage": "lucene",
"orderBy": "Timestamp DESC",
"tags": ["production", "errors"],
"filters": ["{\"type\":\"sql\",\"condition\":\"ServiceName IN ('checkout', 'payments')\"}"]
}
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({
name: 'Production Errors',
sourceId: '507f1f77bcf86cd799439012',
select: 'Timestamp, ServiceName, Body',
where: 'SeverityText:ERROR',
whereLanguage: 'lucene',
orderBy: 'Timestamp DESC',
tags: ['production', 'errors'],
filters: ['{"type":"sql","condition":"ServiceName IN (\'checkout\', \'payments\')"}']
})
};
fetch('https://api.clickhouse.cloud/v1/organizations/{organizationId}/services/{serviceId}/clickstack/saved-searches/{clickStackSavedSearchId}', 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/saved-searches/{clickStackSavedSearchId}",
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([
'name' => 'Production Errors',
'sourceId' => '507f1f77bcf86cd799439012',
'select' => 'Timestamp, ServiceName, Body',
'where' => 'SeverityText:ERROR',
'whereLanguage' => 'lucene',
'orderBy' => 'Timestamp DESC',
'tags' => [
'production',
'errors'
],
'filters' => [
'{"type":"sql","condition":"ServiceName IN (\'checkout\', \'payments\')"}'
]
]),
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/saved-searches/{clickStackSavedSearchId}"
payload := strings.NewReader("{\n \"name\": \"Production Errors\",\n \"sourceId\": \"507f1f77bcf86cd799439012\",\n \"select\": \"Timestamp, ServiceName, Body\",\n \"where\": \"SeverityText:ERROR\",\n \"whereLanguage\": \"lucene\",\n \"orderBy\": \"Timestamp DESC\",\n \"tags\": [\n \"production\",\n \"errors\"\n ],\n \"filters\": [\n \"{\\\"type\\\":\\\"sql\\\",\\\"condition\\\":\\\"ServiceName IN ('checkout', 'payments')\\\"}\"\n ]\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/saved-searches/{clickStackSavedSearchId}")
.header("Authorization", "Basic <encoded-value>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"Production Errors\",\n \"sourceId\": \"507f1f77bcf86cd799439012\",\n \"select\": \"Timestamp, ServiceName, Body\",\n \"where\": \"SeverityText:ERROR\",\n \"whereLanguage\": \"lucene\",\n \"orderBy\": \"Timestamp DESC\",\n \"tags\": [\n \"production\",\n \"errors\"\n ],\n \"filters\": [\n \"{\\\"type\\\":\\\"sql\\\",\\\"condition\\\":\\\"ServiceName IN ('checkout', 'payments')\\\"}\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.clickhouse.cloud/v1/organizations/{organizationId}/services/{serviceId}/clickstack/saved-searches/{clickStackSavedSearchId}")
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 \"name\": \"Production Errors\",\n \"sourceId\": \"507f1f77bcf86cd799439012\",\n \"select\": \"Timestamp, ServiceName, Body\",\n \"where\": \"SeverityText:ERROR\",\n \"whereLanguage\": \"lucene\",\n \"orderBy\": \"Timestamp DESC\",\n \"tags\": [\n \"production\",\n \"errors\"\n ],\n \"filters\": [\n \"{\\\"type\\\":\\\"sql\\\",\\\"condition\\\":\\\"ServiceName IN ('checkout', 'payments')\\\"}\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"status": 200,
"requestId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"result": {
"id": "507f1f77bcf86cd799439011",
"name": "Production Errors",
"sourceId": "507f1f77bcf86cd799439012",
"select": "Timestamp, ServiceName, Body",
"where": "SeverityText:ERROR",
"whereLanguage": "lucene",
"orderBy": "Timestamp DESC",
"tags": [
"production",
"errors"
],
"filters": [
"{\"type\":\"sql\",\"condition\":\"ServiceName IN ('checkout', 'payments')\"}"
],
"teamId": "507f1f77bcf86cd799439013",
"createdAt": "2025-01-01T00:00:00.000Z",
"updatedAt": "2025-06-15T10:30:00.000Z"
}
}{
"status": 400,
"error": "<string>",
"requestId": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}{
"status": 500,
"error": "<string>",
"requestId": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}