ClickStack: Create Webhook
This endpoint is in beta. API contract is stable, and no breaking changes are expected in the future.
ClickStack: Creates a new webhook for the authenticated team.
curl --request POST \
--url https://api.clickhouse.cloud/v1/organizations/{organizationId}/services/{serviceId}/clickstack/webhooks \
--header 'Authorization: Basic <encoded-value>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "Production Alerts",
"service": "slack",
"url": "https://hooks.slack.com/services/EXAMPLE/WEBHOOK/URL",
"description": "Sends critical alerts to the #incidents channel",
"body": "{\"alert\": \"{{title}}\", \"severity\": \"{{level}}\"}",
"headers": {},
"queryParams": {}
}
'import requests
url = "https://api.clickhouse.cloud/v1/organizations/{organizationId}/services/{serviceId}/clickstack/webhooks"
payload = {
"name": "Production Alerts",
"service": "slack",
"url": "https://hooks.slack.com/services/EXAMPLE/WEBHOOK/URL",
"description": "Sends critical alerts to the #incidents channel",
"body": "{\"alert\": \"{{title}}\", \"severity\": \"{{level}}\"}",
"headers": {},
"queryParams": {}
}
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 Alerts',
service: 'slack',
url: 'https://hooks.slack.com/services/EXAMPLE/WEBHOOK/URL',
description: 'Sends critical alerts to the #incidents channel',
body: JSON.stringify('{"alert": "{{title}}", "severity": "{{level}}"}'),
headers: {},
queryParams: {}
})
};
fetch('https://api.clickhouse.cloud/v1/organizations/{organizationId}/services/{serviceId}/clickstack/webhooks', 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/webhooks",
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 Alerts',
'service' => 'slack',
'url' => 'https://hooks.slack.com/services/EXAMPLE/WEBHOOK/URL',
'description' => 'Sends critical alerts to the #incidents channel',
'body' => '{"alert": "{{title}}", "severity": "{{level}}"}',
'headers' => [
],
'queryParams' => [
]
]),
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/webhooks"
payload := strings.NewReader("{\n \"name\": \"Production Alerts\",\n \"service\": \"slack\",\n \"url\": \"https://hooks.slack.com/services/EXAMPLE/WEBHOOK/URL\",\n \"description\": \"Sends critical alerts to the #incidents channel\",\n \"body\": \"{\\\"alert\\\": \\\"{{title}}\\\", \\\"severity\\\": \\\"{{level}}\\\"}\",\n \"headers\": {},\n \"queryParams\": {}\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/webhooks")
.header("Authorization", "Basic <encoded-value>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"Production Alerts\",\n \"service\": \"slack\",\n \"url\": \"https://hooks.slack.com/services/EXAMPLE/WEBHOOK/URL\",\n \"description\": \"Sends critical alerts to the #incidents channel\",\n \"body\": \"{\\\"alert\\\": \\\"{{title}}\\\", \\\"severity\\\": \\\"{{level}}\\\"}\",\n \"headers\": {},\n \"queryParams\": {}\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.clickhouse.cloud/v1/organizations/{organizationId}/services/{serviceId}/clickstack/webhooks")
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 Alerts\",\n \"service\": \"slack\",\n \"url\": \"https://hooks.slack.com/services/EXAMPLE/WEBHOOK/URL\",\n \"description\": \"Sends critical alerts to the #incidents channel\",\n \"body\": \"{\\\"alert\\\": \\\"{{title}}\\\", \\\"severity\\\": \\\"{{level}}\\\"}\",\n \"headers\": {},\n \"queryParams\": {}\n}"
response = http.request(request)
puts response.read_body{
"status": 200,
"requestId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"result": {
"id": "507f1f77bcf86cd799439011",
"name": "Production Alerts",
"service": "slack",
"updatedAt": "2025-06-15T10:30:00.000Z",
"createdAt": "2025-01-01T00:00:00.000Z",
"url": "https://hooks.slack.com/services/EXAMPLE/WEBHOOK/URL",
"description": "Sends critical alerts to the #incidents channel"
}
}{
"status": 400,
"error": "<string>",
"requestId": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}{
"status": 500,
"error": "<string>",
"requestId": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}ClickStack: Creates a new webhook for the authenticated team.
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
Webhook name. Must be unique per service within the team.
"Production Alerts"
Webhook service type.
slack, incidentio, generic "slack"
Webhook destination URL.
"https://hooks.slack.com/services/EXAMPLE/WEBHOOK/URL"
Webhook description, shown in the UI.
"Sends critical alerts to the #incidents channel"
Optional request body template. Only for generic/incidentio; rejected for slack.
"{\"alert\": \"{{title}}\", \"severity\": \"{{level}}\"}"
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Was this page helpful?
curl --request POST \
--url https://api.clickhouse.cloud/v1/organizations/{organizationId}/services/{serviceId}/clickstack/webhooks \
--header 'Authorization: Basic <encoded-value>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "Production Alerts",
"service": "slack",
"url": "https://hooks.slack.com/services/EXAMPLE/WEBHOOK/URL",
"description": "Sends critical alerts to the #incidents channel",
"body": "{\"alert\": \"{{title}}\", \"severity\": \"{{level}}\"}",
"headers": {},
"queryParams": {}
}
'import requests
url = "https://api.clickhouse.cloud/v1/organizations/{organizationId}/services/{serviceId}/clickstack/webhooks"
payload = {
"name": "Production Alerts",
"service": "slack",
"url": "https://hooks.slack.com/services/EXAMPLE/WEBHOOK/URL",
"description": "Sends critical alerts to the #incidents channel",
"body": "{\"alert\": \"{{title}}\", \"severity\": \"{{level}}\"}",
"headers": {},
"queryParams": {}
}
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 Alerts',
service: 'slack',
url: 'https://hooks.slack.com/services/EXAMPLE/WEBHOOK/URL',
description: 'Sends critical alerts to the #incidents channel',
body: JSON.stringify('{"alert": "{{title}}", "severity": "{{level}}"}'),
headers: {},
queryParams: {}
})
};
fetch('https://api.clickhouse.cloud/v1/organizations/{organizationId}/services/{serviceId}/clickstack/webhooks', 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/webhooks",
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 Alerts',
'service' => 'slack',
'url' => 'https://hooks.slack.com/services/EXAMPLE/WEBHOOK/URL',
'description' => 'Sends critical alerts to the #incidents channel',
'body' => '{"alert": "{{title}}", "severity": "{{level}}"}',
'headers' => [
],
'queryParams' => [
]
]),
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/webhooks"
payload := strings.NewReader("{\n \"name\": \"Production Alerts\",\n \"service\": \"slack\",\n \"url\": \"https://hooks.slack.com/services/EXAMPLE/WEBHOOK/URL\",\n \"description\": \"Sends critical alerts to the #incidents channel\",\n \"body\": \"{\\\"alert\\\": \\\"{{title}}\\\", \\\"severity\\\": \\\"{{level}}\\\"}\",\n \"headers\": {},\n \"queryParams\": {}\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/webhooks")
.header("Authorization", "Basic <encoded-value>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"Production Alerts\",\n \"service\": \"slack\",\n \"url\": \"https://hooks.slack.com/services/EXAMPLE/WEBHOOK/URL\",\n \"description\": \"Sends critical alerts to the #incidents channel\",\n \"body\": \"{\\\"alert\\\": \\\"{{title}}\\\", \\\"severity\\\": \\\"{{level}}\\\"}\",\n \"headers\": {},\n \"queryParams\": {}\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.clickhouse.cloud/v1/organizations/{organizationId}/services/{serviceId}/clickstack/webhooks")
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 Alerts\",\n \"service\": \"slack\",\n \"url\": \"https://hooks.slack.com/services/EXAMPLE/WEBHOOK/URL\",\n \"description\": \"Sends critical alerts to the #incidents channel\",\n \"body\": \"{\\\"alert\\\": \\\"{{title}}\\\", \\\"severity\\\": \\\"{{level}}\\\"}\",\n \"headers\": {},\n \"queryParams\": {}\n}"
response = http.request(request)
puts response.read_body{
"status": 200,
"requestId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"result": {
"id": "507f1f77bcf86cd799439011",
"name": "Production Alerts",
"service": "slack",
"updatedAt": "2025-06-15T10:30:00.000Z",
"createdAt": "2025-01-01T00:00:00.000Z",
"url": "https://hooks.slack.com/services/EXAMPLE/WEBHOOK/URL",
"description": "Sends critical alerts to the #incidents channel"
}
}{
"status": 400,
"error": "<string>",
"requestId": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}{
"status": 500,
"error": "<string>",
"requestId": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}