Create Issue
curl --request POST \
--url https://api.bland.ai/v1/triage/issues \
--header 'Content-Type: application/json' \
--header 'authorization: <authorization>' \
--data '
{
"title": "<string>",
"severity": "<string>",
"category": "<string>",
"description": "<string>",
"status": "<string>",
"source": "<string>",
"owner_id": "<string>",
"assignee_id": "<string>",
"resource_links": [
{}
]
}
'import requests
url = "https://api.bland.ai/v1/triage/issues"
payload = {
"title": "<string>",
"severity": "<string>",
"category": "<string>",
"description": "<string>",
"status": "<string>",
"source": "<string>",
"owner_id": "<string>",
"assignee_id": "<string>",
"resource_links": [{}]
}
headers = {
"authorization": "<authorization>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {authorization: '<authorization>', 'Content-Type': 'application/json'},
body: JSON.stringify({
title: '<string>',
severity: '<string>',
category: '<string>',
description: '<string>',
status: '<string>',
source: '<string>',
owner_id: '<string>',
assignee_id: '<string>',
resource_links: [{}]
})
};
fetch('https://api.bland.ai/v1/triage/issues', 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.bland.ai/v1/triage/issues",
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([
'title' => '<string>',
'severity' => '<string>',
'category' => '<string>',
'description' => '<string>',
'status' => '<string>',
'source' => '<string>',
'owner_id' => '<string>',
'assignee_id' => '<string>',
'resource_links' => [
[
]
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"authorization: <authorization>"
],
]);
$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.bland.ai/v1/triage/issues"
payload := strings.NewReader("{\n \"title\": \"<string>\",\n \"severity\": \"<string>\",\n \"category\": \"<string>\",\n \"description\": \"<string>\",\n \"status\": \"<string>\",\n \"source\": \"<string>\",\n \"owner_id\": \"<string>\",\n \"assignee_id\": \"<string>\",\n \"resource_links\": [\n {}\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("authorization", "<authorization>")
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.bland.ai/v1/triage/issues")
.header("authorization", "<authorization>")
.header("Content-Type", "application/json")
.body("{\n \"title\": \"<string>\",\n \"severity\": \"<string>\",\n \"category\": \"<string>\",\n \"description\": \"<string>\",\n \"status\": \"<string>\",\n \"source\": \"<string>\",\n \"owner_id\": \"<string>\",\n \"assignee_id\": \"<string>\",\n \"resource_links\": [\n {}\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.bland.ai/v1/triage/issues")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["authorization"] = '<authorization>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"title\": \"<string>\",\n \"severity\": \"<string>\",\n \"category\": \"<string>\",\n \"description\": \"<string>\",\n \"status\": \"<string>\",\n \"source\": \"<string>\",\n \"owner_id\": \"<string>\",\n \"assignee_id\": \"<string>\",\n \"resource_links\": [\n {}\n ]\n}"
response = http.request(request)
puts response.read_body{
"data": {
"id": "68007859-4325-4ea2-bbd6-e7c8be3a233a",
"triage_id": "T-1001",
"org_id": "685b69b7-b903-4d98-9755-af3c957df9e3",
"number": 1001,
"title": "Agent skipped the verification step",
"description": "On the Aug 12 demo flow the agent jumped to the closing node without asking for the email confirmation.",
"status": "todo",
"severity": "high",
"source": "manual",
"category": "Routing",
"owner_id": null,
"assignee_id": "beed099d-e493-4142-a68b-af13bd72c035",
"author_id": "4d5ac1b5-1f24-46d3-8355-5debfd029a65",
"external_link": null,
"created_at": "2026-05-06T21:09:57.081Z",
"updated_at": "2026-05-06T21:09:57.081Z",
"last_activity_at": "2026-05-06T21:09:57.081Z",
"resource_count": 1,
"flag_count": 0,
"relation_count": 0,
"latest_agent_session": null,
"is_processing": false,
"has_unread_activity": false
},
"errors": null
}
Issues
Create Issue
Create a triage issue.
POST
/
v1
/
triage
/
issues
Create Issue
curl --request POST \
--url https://api.bland.ai/v1/triage/issues \
--header 'Content-Type: application/json' \
--header 'authorization: <authorization>' \
--data '
{
"title": "<string>",
"severity": "<string>",
"category": "<string>",
"description": "<string>",
"status": "<string>",
"source": "<string>",
"owner_id": "<string>",
"assignee_id": "<string>",
"resource_links": [
{}
]
}
'import requests
url = "https://api.bland.ai/v1/triage/issues"
payload = {
"title": "<string>",
"severity": "<string>",
"category": "<string>",
"description": "<string>",
"status": "<string>",
"source": "<string>",
"owner_id": "<string>",
"assignee_id": "<string>",
"resource_links": [{}]
}
headers = {
"authorization": "<authorization>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {authorization: '<authorization>', 'Content-Type': 'application/json'},
body: JSON.stringify({
title: '<string>',
severity: '<string>',
category: '<string>',
description: '<string>',
status: '<string>',
source: '<string>',
owner_id: '<string>',
assignee_id: '<string>',
resource_links: [{}]
})
};
fetch('https://api.bland.ai/v1/triage/issues', 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.bland.ai/v1/triage/issues",
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([
'title' => '<string>',
'severity' => '<string>',
'category' => '<string>',
'description' => '<string>',
'status' => '<string>',
'source' => '<string>',
'owner_id' => '<string>',
'assignee_id' => '<string>',
'resource_links' => [
[
]
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"authorization: <authorization>"
],
]);
$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.bland.ai/v1/triage/issues"
payload := strings.NewReader("{\n \"title\": \"<string>\",\n \"severity\": \"<string>\",\n \"category\": \"<string>\",\n \"description\": \"<string>\",\n \"status\": \"<string>\",\n \"source\": \"<string>\",\n \"owner_id\": \"<string>\",\n \"assignee_id\": \"<string>\",\n \"resource_links\": [\n {}\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("authorization", "<authorization>")
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.bland.ai/v1/triage/issues")
.header("authorization", "<authorization>")
.header("Content-Type", "application/json")
.body("{\n \"title\": \"<string>\",\n \"severity\": \"<string>\",\n \"category\": \"<string>\",\n \"description\": \"<string>\",\n \"status\": \"<string>\",\n \"source\": \"<string>\",\n \"owner_id\": \"<string>\",\n \"assignee_id\": \"<string>\",\n \"resource_links\": [\n {}\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.bland.ai/v1/triage/issues")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["authorization"] = '<authorization>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"title\": \"<string>\",\n \"severity\": \"<string>\",\n \"category\": \"<string>\",\n \"description\": \"<string>\",\n \"status\": \"<string>\",\n \"source\": \"<string>\",\n \"owner_id\": \"<string>\",\n \"assignee_id\": \"<string>\",\n \"resource_links\": [\n {}\n ]\n}"
response = http.request(request)
puts response.read_body{
"data": {
"id": "68007859-4325-4ea2-bbd6-e7c8be3a233a",
"triage_id": "T-1001",
"org_id": "685b69b7-b903-4d98-9755-af3c957df9e3",
"number": 1001,
"title": "Agent skipped the verification step",
"description": "On the Aug 12 demo flow the agent jumped to the closing node without asking for the email confirmation.",
"status": "todo",
"severity": "high",
"source": "manual",
"category": "Routing",
"owner_id": null,
"assignee_id": "beed099d-e493-4142-a68b-af13bd72c035",
"author_id": "4d5ac1b5-1f24-46d3-8355-5debfd029a65",
"external_link": null,
"created_at": "2026-05-06T21:09:57.081Z",
"updated_at": "2026-05-06T21:09:57.081Z",
"last_activity_at": "2026-05-06T21:09:57.081Z",
"resource_count": 1,
"flag_count": 0,
"relation_count": 0,
"latest_agent_session": null,
"is_processing": false,
"has_unread_activity": false
},
"errors": null
}
Overview
Opens a new triage issue, optionally with the calls, SMS conversations, or files that prompted it. Issues are the unit of work in Triage.Headers
Your API key for authentication.
Body Parameters
Short, human-readable summary of the issue. 1-200 characters.
How urgent the issue is. Must be one of:
criticalhighmediumlow
Free-form category label, 1-64 characters. Categories are scoped to your org and reused across issues. The dashboard ships with these defaults out of the box, but you can add your own with Create Category:
TranscriptionSpeechDialogueRoutingToolsLatencyTelephonyBug
Longer explanation of the problem. Maximum 10,000 characters. Shown to Norm as part of the evidence snapshot when you prompt the agent.
Initial status. Defaults to
todo if omitted. Must be one of:backlogtodoin_progressin_reviewdoneclosed
Where the issue originated. Must be one of:
manual, created by a user from the dashboard or API (default)automated, created by an automated rule (e.g. an alert binding)client, created by a client integration on the user’s behalf
User ID of the person ultimately accountable for the issue.
User ID of the person currently working on the issue.
Evidence to attach to the issue at creation. Each entry links the issue to a call, SMS conversation, or uploaded file.
{
"resource_links": [
{ "resource_type": "call", "resource_id": "d8ef6e50-830b-4c73-a956-3b04a1f28550" },
{ "resource_type": "file", "resource_id": "54eaa506-8b68-4be7-8d14-1ff260899eee" }
]
}
Resource link fields
Resource link fields
resource_type, one ofcall,sms_conversation, orfile.resource_id, the ID of the resource. For calls this is thecall_idreturned by Send Call.
Response
Returns201 Created with the newly created issue.
The created issue.
Show Issue fields
Show Issue fields
Internal UUID of the issue. Use this in all
/v1/triage/issues/{id}/... endpoints.Short, human-friendly issue identifier (for example
T-1001) shown in the dashboard.The org that owns this issue.
Sequential issue number within your org. Matches the numeric portion of
triage_id.One of
backlog, todo, in_progress, in_review, done, closed.One of
critical, high, medium, low.One of
manual, automated, client.User ID of the caller that created the issue.
External system link (for example a GitHub issue) bound to this triage issue, if any.
Number of attached resources (calls, SMS, files).
Number of flags raised against attached calls.
Number of related issues linked to this one.
The most recent Norm session bound to this issue, including its run state and any draft pathway version Norm is working against.
null if Norm has never been prompted for this issue.true while Norm is actively running against the issue.true if there is activity since the caller last viewed the issue.ISO 8601 timestamp.
ISO 8601 timestamp.
ISO 8601 timestamp of the most recent activity entry.
null on success, or a list of error objects if the request failed.{
"data": {
"id": "68007859-4325-4ea2-bbd6-e7c8be3a233a",
"triage_id": "T-1001",
"org_id": "685b69b7-b903-4d98-9755-af3c957df9e3",
"number": 1001,
"title": "Agent skipped the verification step",
"description": "On the Aug 12 demo flow the agent jumped to the closing node without asking for the email confirmation.",
"status": "todo",
"severity": "high",
"source": "manual",
"category": "Routing",
"owner_id": null,
"assignee_id": "beed099d-e493-4142-a68b-af13bd72c035",
"author_id": "4d5ac1b5-1f24-46d3-8355-5debfd029a65",
"external_link": null,
"created_at": "2026-05-06T21:09:57.081Z",
"updated_at": "2026-05-06T21:09:57.081Z",
"last_activity_at": "2026-05-06T21:09:57.081Z",
"resource_count": 1,
"flag_count": 0,
"relation_count": 0,
"latest_agent_session": null,
"is_processing": false,
"has_unread_activity": false
},
"errors": null
}
Docs for agents: llms.txt
Was this page helpful?
⌘I