ClickStack: Create Saved Search
This endpoint is in beta. API contract is stable, and no breaking changes are expected in the future.
ClickStack: Creates a new saved search.
curl --request POST \
--url https://api.clickhouse.cloud/v1/organizations/{organizationId}/services/{serviceId}/clickstack/saved-searches \
--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"
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.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({
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', 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",
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([
'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"
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("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/saved-searches")
.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")
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 \"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: Creates a new saved search.
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
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 POST \
--url https://api.clickhouse.cloud/v1/organizations/{organizationId}/services/{serviceId}/clickstack/saved-searches \
--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"
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.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({
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', 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",
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([
'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"
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("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/saved-searches")
.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")
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 \"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"
}