curl --request PATCH \
--url https://your-tenant.bloodhoundenterprise.io/api/v2/alerts/{alert_id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"description": "<string>",
"disabled": true,
"subscriptions": [
{
"channel_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"event_type": "<string>",
"version": 123,
"disabled": true
}
]
}
'import requests
url = "https://your-tenant.bloodhoundenterprise.io/api/v2/alerts/{alert_id}"
payload = {
"name": "<string>",
"description": "<string>",
"disabled": True,
"subscriptions": [
{
"channel_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"event_type": "<string>",
"version": 123,
"disabled": True
}
]
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: '<string>',
description: '<string>',
disabled: true,
subscriptions: [
{
channel_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
event_type: '<string>',
version: 123,
disabled: true
}
]
})
};
fetch('https://your-tenant.bloodhoundenterprise.io/api/v2/alerts/{alert_id}', 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://your-tenant.bloodhoundenterprise.io/api/v2/alerts/{alert_id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'name' => '<string>',
'description' => '<string>',
'disabled' => true,
'subscriptions' => [
[
'channel_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'event_type' => '<string>',
'version' => 123,
'disabled' => true
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"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://your-tenant.bloodhoundenterprise.io/api/v2/alerts/{alert_id}"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"description\": \"<string>\",\n \"disabled\": true,\n \"subscriptions\": [\n {\n \"channel_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"event_type\": \"<string>\",\n \"version\": 123,\n \"disabled\": true\n }\n ]\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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.patch("https://your-tenant.bloodhoundenterprise.io/api/v2/alerts/{alert_id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"description\": \"<string>\",\n \"disabled\": true,\n \"subscriptions\": [\n {\n \"channel_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"event_type\": \"<string>\",\n \"version\": 123,\n \"disabled\": true\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://your-tenant.bloodhoundenterprise.io/api/v2/alerts/{alert_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"<string>\",\n \"description\": \"<string>\",\n \"disabled\": true,\n \"subscriptions\": [\n {\n \"channel_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"event_type\": \"<string>\",\n \"version\": 123,\n \"disabled\": true\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"data": {
"alert": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"description": "<string>",
"created_at": "2023-11-07T05:31:56Z",
"created_by": "<string>",
"updated_at": "2023-11-07T05:31:56Z",
"updated_by": "<string>",
"disabled_at": "2023-11-07T05:31:56Z",
"disabled_by": "<string>",
"subscriptions": [
{
"channel_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"event_type": "<string>",
"version": 123,
"created_at": "2023-11-07T05:31:56Z",
"disabled_at": "2023-11-07T05:31:56Z",
"disabled_by": "<string>"
}
]
}
}
}{
"http_status": 400,
"timestamp": "2024-02-19T19:27:43.866Z",
"request_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"errors": [
{
"context": "clients",
"message": "The JSON payload could not be unmarshalled."
}
]
}{
"http_status": 401,
"timestamp": "2024-02-19T19:27:43.866Z",
"request_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"errors": [
{
"context": "login",
"message": "Unauthorized"
}
]
}{
"http_status": 403,
"timestamp": "2024-02-19T19:27:43.866Z",
"request_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"errors": [
{
"context": "clients",
"message": "You do not have permission to access this resource"
}
]
}{
"http_status": 404,
"timestamp": "2024-02-19T19:27:43.866Z",
"request_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"errors": [
{
"context": "clients",
"message": "The requested client could not be found."
}
]
}{
"http_status": 409,
"timestamp": "2026-05-21T19:27:43.866Z",
"request_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"errors": [
{
"context": "alerts",
"message": "An alert with the supplied name already exists."
}
]
}{
"http_status": 429,
"timestamp": "2024-02-19T19:27:43.866Z",
"request_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"errors": [
{
"context": "middleware",
"message": "Too many requests. Please try again later."
}
]
}{
"http_status": 500,
"timestamp": "2024-02-19T19:27:43.866Z",
"request_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"errors": [
{
"context": "clients",
"message": "The request could not be handled due to an unexpected database error."
}
]
}Update Alert
Partially updates an alert by ID. All top-level fields are optional. If
subscriptions is present, the supplied array fully replaces the current
subscription set for this alert in one transaction (delete-omitted,
insert-new, update-existing by composite key (channel_id, event_type)).
Omit subscriptions to leave bindings unchanged.
curl --request PATCH \
--url https://your-tenant.bloodhoundenterprise.io/api/v2/alerts/{alert_id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"description": "<string>",
"disabled": true,
"subscriptions": [
{
"channel_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"event_type": "<string>",
"version": 123,
"disabled": true
}
]
}
'import requests
url = "https://your-tenant.bloodhoundenterprise.io/api/v2/alerts/{alert_id}"
payload = {
"name": "<string>",
"description": "<string>",
"disabled": True,
"subscriptions": [
{
"channel_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"event_type": "<string>",
"version": 123,
"disabled": True
}
]
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: '<string>',
description: '<string>',
disabled: true,
subscriptions: [
{
channel_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
event_type: '<string>',
version: 123,
disabled: true
}
]
})
};
fetch('https://your-tenant.bloodhoundenterprise.io/api/v2/alerts/{alert_id}', 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://your-tenant.bloodhoundenterprise.io/api/v2/alerts/{alert_id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'name' => '<string>',
'description' => '<string>',
'disabled' => true,
'subscriptions' => [
[
'channel_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'event_type' => '<string>',
'version' => 123,
'disabled' => true
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"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://your-tenant.bloodhoundenterprise.io/api/v2/alerts/{alert_id}"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"description\": \"<string>\",\n \"disabled\": true,\n \"subscriptions\": [\n {\n \"channel_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"event_type\": \"<string>\",\n \"version\": 123,\n \"disabled\": true\n }\n ]\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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.patch("https://your-tenant.bloodhoundenterprise.io/api/v2/alerts/{alert_id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"description\": \"<string>\",\n \"disabled\": true,\n \"subscriptions\": [\n {\n \"channel_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"event_type\": \"<string>\",\n \"version\": 123,\n \"disabled\": true\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://your-tenant.bloodhoundenterprise.io/api/v2/alerts/{alert_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"<string>\",\n \"description\": \"<string>\",\n \"disabled\": true,\n \"subscriptions\": [\n {\n \"channel_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"event_type\": \"<string>\",\n \"version\": 123,\n \"disabled\": true\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"data": {
"alert": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"description": "<string>",
"created_at": "2023-11-07T05:31:56Z",
"created_by": "<string>",
"updated_at": "2023-11-07T05:31:56Z",
"updated_by": "<string>",
"disabled_at": "2023-11-07T05:31:56Z",
"disabled_by": "<string>",
"subscriptions": [
{
"channel_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"event_type": "<string>",
"version": 123,
"created_at": "2023-11-07T05:31:56Z",
"disabled_at": "2023-11-07T05:31:56Z",
"disabled_by": "<string>"
}
]
}
}
}{
"http_status": 400,
"timestamp": "2024-02-19T19:27:43.866Z",
"request_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"errors": [
{
"context": "clients",
"message": "The JSON payload could not be unmarshalled."
}
]
}{
"http_status": 401,
"timestamp": "2024-02-19T19:27:43.866Z",
"request_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"errors": [
{
"context": "login",
"message": "Unauthorized"
}
]
}{
"http_status": 403,
"timestamp": "2024-02-19T19:27:43.866Z",
"request_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"errors": [
{
"context": "clients",
"message": "You do not have permission to access this resource"
}
]
}{
"http_status": 404,
"timestamp": "2024-02-19T19:27:43.866Z",
"request_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"errors": [
{
"context": "clients",
"message": "The requested client could not be found."
}
]
}{
"http_status": 409,
"timestamp": "2026-05-21T19:27:43.866Z",
"request_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"errors": [
{
"context": "alerts",
"message": "An alert with the supplied name already exists."
}
]
}{
"http_status": 429,
"timestamp": "2024-02-19T19:27:43.866Z",
"request_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"errors": [
{
"context": "middleware",
"message": "Too many requests. Please try again later."
}
]
}{
"http_status": 500,
"timestamp": "2024-02-19T19:27:43.866Z",
"request_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"errors": [
{
"context": "clients",
"message": "The request could not be handled due to an unexpected database error."
}
]
}Authorizations
Authorization: Bearer $JWT_TOKEN
Headers
Prefer header, used to specify a custom timeout in seconds using the wait parameter as per RFC7240. Passing in wait=-1 bypasses all timeout limits when the feature is enabled.
^wait=(-1|[0-9]+)$Path Parameters
ID of an alert. uuidv4
Body
Partial update for an alert. All fields are optional. If subscriptions is
present, the supplied array fully replaces the current subscription set for
this alert in one transaction (delete-omitted / insert-new / update-existing
by composite key (channel_id, event_type)). Omit subscriptions to leave
bindings unchanged.
Response
OK
Show child attributes
Show child attributes