curl --request PUT \
--url https://api.range.org/v1/risk/alert-rules/{rule_id}/channels \
--header 'Content-Type: application/json' \
--header 'X-API-KEY: <api-key>' \
--data '
{
"subscribed_channels": [
{
"alert_channel_id": "44444444-4444-4444-4444-444444444445"
}
]
}
'import requests
url = "https://api.range.org/v1/risk/alert-rules/{rule_id}/channels"
payload = { "subscribed_channels": [{ "alert_channel_id": "44444444-4444-4444-4444-444444444445" }] }
headers = {
"X-API-KEY": "<api-key>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {'X-API-KEY': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
subscribed_channels: [{alert_channel_id: '44444444-4444-4444-4444-444444444445'}]
})
};
fetch('https://api.range.org/v1/risk/alert-rules/{rule_id}/channels', 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.range.org/v1/risk/alert-rules/{rule_id}/channels",
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([
'subscribed_channels' => [
[
'alert_channel_id' => '44444444-4444-4444-4444-444444444445'
]
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-KEY: <api-key>"
],
]);
$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.range.org/v1/risk/alert-rules/{rule_id}/channels"
payload := strings.NewReader("{\n \"subscribed_channels\": [\n {\n \"alert_channel_id\": \"44444444-4444-4444-4444-444444444445\"\n }\n ]\n}")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("X-API-KEY", "<api-key>")
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.range.org/v1/risk/alert-rules/{rule_id}/channels")
.header("X-API-KEY", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"subscribed_channels\": [\n {\n \"alert_channel_id\": \"44444444-4444-4444-4444-444444444445\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.range.org/v1/risk/alert-rules/{rule_id}/channels")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["X-API-KEY"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"subscribed_channels\": [\n {\n \"alert_channel_id\": \"44444444-4444-4444-4444-444444444445\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"workspace_id": "workspace-123",
"rule_type": "GasPressure",
"severity": "high",
"parameters": {
"threshold": 90
},
"trigger": "BLOCK",
"enabled": true,
"version": 1,
"subscribed_channels": [
{
"alert_channel_id": "44444444-4444-4444-4444-444444444445",
"min_severity": null
}
],
"created_at": "2026-05-14T12:00:00.000Z",
"updated_at": "2026-05-14T12:00:00.000Z",
"name": "High gas on eth",
"network": "eth",
"runner_id": "alert-runner-eth-v2",
"pack_type": "squads",
"pack_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"pack_address": "Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS",
"pack_label": "Treasury multisig",
"alert_template": {
"id": "1",
"type": "large_transfer",
"label": "Large Transfer",
"description": "A large transfer was detected on {{network}}",
"network": "eth",
"severity": "high",
"tags": [
"defi",
"transfer"
],
"trigger": "BLOCK",
"parameters": [
{
"label": "Wallet",
"description": "The address to monitor",
"field": "address",
"field_type": "Address",
"optional": false
}
],
"packs": [
{
"type": "squads",
"required": true
}
]
}
}Link channels to an alert rule
curl --request PUT \
--url https://api.range.org/v1/risk/alert-rules/{rule_id}/channels \
--header 'Content-Type: application/json' \
--header 'X-API-KEY: <api-key>' \
--data '
{
"subscribed_channels": [
{
"alert_channel_id": "44444444-4444-4444-4444-444444444445"
}
]
}
'import requests
url = "https://api.range.org/v1/risk/alert-rules/{rule_id}/channels"
payload = { "subscribed_channels": [{ "alert_channel_id": "44444444-4444-4444-4444-444444444445" }] }
headers = {
"X-API-KEY": "<api-key>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {'X-API-KEY': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
subscribed_channels: [{alert_channel_id: '44444444-4444-4444-4444-444444444445'}]
})
};
fetch('https://api.range.org/v1/risk/alert-rules/{rule_id}/channels', 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.range.org/v1/risk/alert-rules/{rule_id}/channels",
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([
'subscribed_channels' => [
[
'alert_channel_id' => '44444444-4444-4444-4444-444444444445'
]
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-KEY: <api-key>"
],
]);
$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.range.org/v1/risk/alert-rules/{rule_id}/channels"
payload := strings.NewReader("{\n \"subscribed_channels\": [\n {\n \"alert_channel_id\": \"44444444-4444-4444-4444-444444444445\"\n }\n ]\n}")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("X-API-KEY", "<api-key>")
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.range.org/v1/risk/alert-rules/{rule_id}/channels")
.header("X-API-KEY", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"subscribed_channels\": [\n {\n \"alert_channel_id\": \"44444444-4444-4444-4444-444444444445\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.range.org/v1/risk/alert-rules/{rule_id}/channels")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["X-API-KEY"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"subscribed_channels\": [\n {\n \"alert_channel_id\": \"44444444-4444-4444-4444-444444444445\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"workspace_id": "workspace-123",
"rule_type": "GasPressure",
"severity": "high",
"parameters": {
"threshold": 90
},
"trigger": "BLOCK",
"enabled": true,
"version": 1,
"subscribed_channels": [
{
"alert_channel_id": "44444444-4444-4444-4444-444444444445",
"min_severity": null
}
],
"created_at": "2026-05-14T12:00:00.000Z",
"updated_at": "2026-05-14T12:00:00.000Z",
"name": "High gas on eth",
"network": "eth",
"runner_id": "alert-runner-eth-v2",
"pack_type": "squads",
"pack_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"pack_address": "Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS",
"pack_label": "Treasury multisig",
"alert_template": {
"id": "1",
"type": "large_transfer",
"label": "Large Transfer",
"description": "A large transfer was detected on {{network}}",
"network": "eth",
"severity": "high",
"tags": [
"defi",
"transfer"
],
"trigger": "BLOCK",
"parameters": [
{
"label": "Wallet",
"description": "The address to monitor",
"field": "address",
"field_type": "Address",
"optional": false
}
],
"packs": [
{
"type": "squads",
"required": true
}
]
}
}Authorizations
Authorization method required to allow user to access the api endpoints.
Path Parameters
The alert rule id.
"a1b2c3d4-e5f6-7890-abcd-ef1234567890"
Body
Channels to subscribe this rule to, each with an optional severity floor. Replaces the existing set (pass an empty array to clear all).
Show child attributes
Show child attributes
Response
"a1b2c3d4-e5f6-7890-abcd-ef1234567890"
"workspace-123"
"GasPressure"
"high"
{ "threshold": 90 }
BLOCK, TICK "BLOCK"
true
Incremented each time the rule parameters change. Starts at 1.
1
Show child attributes
Show child attributes
[
{
"alert_channel_id": "44444444-4444-4444-4444-444444444445",
"min_severity": null
}
]
"2026-05-14T12:00:00.000Z"
"2026-05-14T12:00:00.000Z"
"High gas on eth"
"eth"
"alert-runner-eth-v2"
Multisig pack provider (e.g. squads). Null for catalogue one-off rules.
"squads"
Id shared by every member rule of one multisig pack.
"a1b2c3d4-e5f6-7890-abcd-ef1234567890"
The multisig address the pack covers.
"Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS"
Display label for grouping the pack in rule lists.
"Treasury multisig"
Show child attributes
Show child attributes
Was this page helpful?