curl --request POST \
--url https://api.assistable.ai/v3/monitor-rules \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"evaluator_prompt": "<string>",
"description": "<string>",
"assistant_id": "<string>",
"threshold": 4503599627370496,
"threshold_window_mins": 4503599627370495,
"cooldown_mins": 4503599627370495,
"enabled": true,
"routing": [
{
"config": {},
"enabled": true,
"recipients": [
{
"user_id": "<string>",
"email": "[email protected]"
}
]
}
],
"subaccount_id": "<string>",
"location_id": "<string>"
}
'import requests
url = "https://api.assistable.ai/v3/monitor-rules"
payload = {
"name": "<string>",
"evaluator_prompt": "<string>",
"description": "<string>",
"assistant_id": "<string>",
"threshold": 4503599627370496,
"threshold_window_mins": 4503599627370495,
"cooldown_mins": 4503599627370495,
"enabled": True,
"routing": [
{
"config": {},
"enabled": True,
"recipients": [
{
"user_id": "<string>",
"email": "[email protected]"
}
]
}
],
"subaccount_id": "<string>",
"location_id": "<string>"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: '<string>',
evaluator_prompt: '<string>',
description: '<string>',
assistant_id: '<string>',
threshold: 4503599627370496,
threshold_window_mins: 4503599627370495,
cooldown_mins: 4503599627370495,
enabled: true,
routing: [
{
config: {},
enabled: true,
recipients: [{user_id: '<string>', email: '[email protected]'}]
}
],
subaccount_id: '<string>',
location_id: '<string>'
})
};
fetch('https://api.assistable.ai/v3/monitor-rules', 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.assistable.ai/v3/monitor-rules",
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' => '<string>',
'evaluator_prompt' => '<string>',
'description' => '<string>',
'assistant_id' => '<string>',
'threshold' => 4503599627370496,
'threshold_window_mins' => 4503599627370495,
'cooldown_mins' => 4503599627370495,
'enabled' => true,
'routing' => [
[
'config' => [
],
'enabled' => true,
'recipients' => [
[
'user_id' => '<string>',
'email' => '[email protected]'
]
]
]
],
'subaccount_id' => '<string>',
'location_id' => '<string>'
]),
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://api.assistable.ai/v3/monitor-rules"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"evaluator_prompt\": \"<string>\",\n \"description\": \"<string>\",\n \"assistant_id\": \"<string>\",\n \"threshold\": 4503599627370496,\n \"threshold_window_mins\": 4503599627370495,\n \"cooldown_mins\": 4503599627370495,\n \"enabled\": true,\n \"routing\": [\n {\n \"config\": {},\n \"enabled\": true,\n \"recipients\": [\n {\n \"user_id\": \"<string>\",\n \"email\": \"[email protected]\"\n }\n ]\n }\n ],\n \"subaccount_id\": \"<string>\",\n \"location_id\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", 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.post("https://api.assistable.ai/v3/monitor-rules")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"evaluator_prompt\": \"<string>\",\n \"description\": \"<string>\",\n \"assistant_id\": \"<string>\",\n \"threshold\": 4503599627370496,\n \"threshold_window_mins\": 4503599627370495,\n \"cooldown_mins\": 4503599627370495,\n \"enabled\": true,\n \"routing\": [\n {\n \"config\": {},\n \"enabled\": true,\n \"recipients\": [\n {\n \"user_id\": \"<string>\",\n \"email\": \"[email protected]\"\n }\n ]\n }\n ],\n \"subaccount_id\": \"<string>\",\n \"location_id\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.assistable.ai/v3/monitor-rules")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"<string>\",\n \"evaluator_prompt\": \"<string>\",\n \"description\": \"<string>\",\n \"assistant_id\": \"<string>\",\n \"threshold\": 4503599627370496,\n \"threshold_window_mins\": 4503599627370495,\n \"cooldown_mins\": 4503599627370495,\n \"enabled\": true,\n \"routing\": [\n {\n \"config\": {},\n \"enabled\": true,\n \"recipients\": [\n {\n \"user_id\": \"<string>\",\n \"email\": \"[email protected]\"\n }\n ]\n }\n ],\n \"subaccount_id\": \"<string>\",\n \"location_id\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"id": "<string>",
"name": "<string>",
"description": "<string>",
"evaluatorPrompt": "<string>",
"threshold": 0,
"thresholdWindowMins": 0,
"cooldownMins": 0,
"enabled": true,
"isPrebuilt": true,
"assistantId": "<string>",
"subAccountId": "<string>",
"channels": [
{
"id": "<string>",
"config": "<unknown>",
"enabled": true,
"recipients": [
{
"id": "<string>",
"userId": "<string>",
"externalEmail": "<string>"
}
]
}
],
"createdAt": "<string>",
"updatedAt": "<string>"
},
"request_id": "<string>",
"error": null
}{
"error": {
"code": "<string>",
"message": "<string>"
},
"request_id": "<string>",
"data": null
}{
"error": {
"code": "<string>",
"message": "<string>"
},
"request_id": "<string>",
"data": null
}{
"error": {
"code": "<string>",
"message": "<string>"
},
"request_id": "<string>",
"data": null
}{
"error": {
"code": "<string>",
"message": "<string>"
},
"request_id": "<string>",
"data": null
}{
"error": {
"code": "<string>",
"message": "<string>"
},
"request_id": "<string>",
"data": null
}Create a monitor rule
Requires scope monitor-rules:create.
curl --request POST \
--url https://api.assistable.ai/v3/monitor-rules \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"evaluator_prompt": "<string>",
"description": "<string>",
"assistant_id": "<string>",
"threshold": 4503599627370496,
"threshold_window_mins": 4503599627370495,
"cooldown_mins": 4503599627370495,
"enabled": true,
"routing": [
{
"config": {},
"enabled": true,
"recipients": [
{
"user_id": "<string>",
"email": "[email protected]"
}
]
}
],
"subaccount_id": "<string>",
"location_id": "<string>"
}
'import requests
url = "https://api.assistable.ai/v3/monitor-rules"
payload = {
"name": "<string>",
"evaluator_prompt": "<string>",
"description": "<string>",
"assistant_id": "<string>",
"threshold": 4503599627370496,
"threshold_window_mins": 4503599627370495,
"cooldown_mins": 4503599627370495,
"enabled": True,
"routing": [
{
"config": {},
"enabled": True,
"recipients": [
{
"user_id": "<string>",
"email": "[email protected]"
}
]
}
],
"subaccount_id": "<string>",
"location_id": "<string>"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: '<string>',
evaluator_prompt: '<string>',
description: '<string>',
assistant_id: '<string>',
threshold: 4503599627370496,
threshold_window_mins: 4503599627370495,
cooldown_mins: 4503599627370495,
enabled: true,
routing: [
{
config: {},
enabled: true,
recipients: [{user_id: '<string>', email: '[email protected]'}]
}
],
subaccount_id: '<string>',
location_id: '<string>'
})
};
fetch('https://api.assistable.ai/v3/monitor-rules', 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.assistable.ai/v3/monitor-rules",
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' => '<string>',
'evaluator_prompt' => '<string>',
'description' => '<string>',
'assistant_id' => '<string>',
'threshold' => 4503599627370496,
'threshold_window_mins' => 4503599627370495,
'cooldown_mins' => 4503599627370495,
'enabled' => true,
'routing' => [
[
'config' => [
],
'enabled' => true,
'recipients' => [
[
'user_id' => '<string>',
'email' => '[email protected]'
]
]
]
],
'subaccount_id' => '<string>',
'location_id' => '<string>'
]),
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://api.assistable.ai/v3/monitor-rules"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"evaluator_prompt\": \"<string>\",\n \"description\": \"<string>\",\n \"assistant_id\": \"<string>\",\n \"threshold\": 4503599627370496,\n \"threshold_window_mins\": 4503599627370495,\n \"cooldown_mins\": 4503599627370495,\n \"enabled\": true,\n \"routing\": [\n {\n \"config\": {},\n \"enabled\": true,\n \"recipients\": [\n {\n \"user_id\": \"<string>\",\n \"email\": \"[email protected]\"\n }\n ]\n }\n ],\n \"subaccount_id\": \"<string>\",\n \"location_id\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", 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.post("https://api.assistable.ai/v3/monitor-rules")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"evaluator_prompt\": \"<string>\",\n \"description\": \"<string>\",\n \"assistant_id\": \"<string>\",\n \"threshold\": 4503599627370496,\n \"threshold_window_mins\": 4503599627370495,\n \"cooldown_mins\": 4503599627370495,\n \"enabled\": true,\n \"routing\": [\n {\n \"config\": {},\n \"enabled\": true,\n \"recipients\": [\n {\n \"user_id\": \"<string>\",\n \"email\": \"[email protected]\"\n }\n ]\n }\n ],\n \"subaccount_id\": \"<string>\",\n \"location_id\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.assistable.ai/v3/monitor-rules")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"<string>\",\n \"evaluator_prompt\": \"<string>\",\n \"description\": \"<string>\",\n \"assistant_id\": \"<string>\",\n \"threshold\": 4503599627370496,\n \"threshold_window_mins\": 4503599627370495,\n \"cooldown_mins\": 4503599627370495,\n \"enabled\": true,\n \"routing\": [\n {\n \"config\": {},\n \"enabled\": true,\n \"recipients\": [\n {\n \"user_id\": \"<string>\",\n \"email\": \"[email protected]\"\n }\n ]\n }\n ],\n \"subaccount_id\": \"<string>\",\n \"location_id\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"id": "<string>",
"name": "<string>",
"description": "<string>",
"evaluatorPrompt": "<string>",
"threshold": 0,
"thresholdWindowMins": 0,
"cooldownMins": 0,
"enabled": true,
"isPrebuilt": true,
"assistantId": "<string>",
"subAccountId": "<string>",
"channels": [
{
"id": "<string>",
"config": "<unknown>",
"enabled": true,
"recipients": [
{
"id": "<string>",
"userId": "<string>",
"externalEmail": "<string>"
}
]
}
],
"createdAt": "<string>",
"updatedAt": "<string>"
},
"request_id": "<string>",
"error": null
}{
"error": {
"code": "<string>",
"message": "<string>"
},
"request_id": "<string>",
"data": null
}{
"error": {
"code": "<string>",
"message": "<string>"
},
"request_id": "<string>",
"data": null
}{
"error": {
"code": "<string>",
"message": "<string>"
},
"request_id": "<string>",
"data": null
}{
"error": {
"code": "<string>",
"message": "<string>"
},
"request_id": "<string>",
"data": null
}{
"error": {
"code": "<string>",
"message": "<string>"
},
"request_id": "<string>",
"data": null
}Authorizations
Your v3 API key, e.g. ask_live_…
Headers
Target subaccount for the request. Required unless the API key is authorized for exactly one subaccount (then it defaults to that one). Alternatively pass subaccount_id (or legacy location_id) in the request body. Omitting it on a multi-subaccount key returns 400 subaccount_required.
Body
Human-readable rule name.
1 - 200What to watch for — the instruction the LLM evaluator runs against each transcript.
1What this rule is for.
2000Defaults to CUSTOM.
COMPLIANCE, QUALITY, SAFETY, ESCALATION, CUSTOM Which interactions to evaluate. Defaults to BOTH.
CALL, CHAT, BOTH Defaults to MEDIUM.
LOW, MEDIUM, HIGH, CRITICAL Scope the rule to a single assistant. Omit for a subaccount-wide rule.
Triggers required within the window before alerting. Default 1.
1 <= x <= 9007199254740991Rolling window (minutes) for the threshold count. Default 0 (alert on every trigger).
0 <= x <= 9007199254740991Minimum minutes between alerts for this rule. Default 0.
0 <= x <= 9007199254740991Defaults to true.
Alert routing channels (webhook/email/slack) with recipients.
Show child attributes
Show child attributes
Target subaccount id. Prefer the X-Subaccount-Id header; this body field is a fallback.
Alias for subaccount_id (GHL location id).
