Create Disposition API
Create a new disposition and link it to an agent in a single request. agent_id is required.
curl --request POST \
--url https://api.bolna.ai/dispositions/ \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "Call Outcome",
"question": "What was the final outcome of this call?",
"agent_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"category": "Lead Quality",
"system_prompt": "<string>",
"model": "gpt-4.1-mini",
"is_subjective": true,
"is_objective": true,
"subjective_type": "text",
"subjective_type_config": {
"pattern": "^\\d{10}$",
"description": "10-digit phone number"
},
"objective_options": [
{
"value": "interested",
"condition": "Customer expressed genuine interest and agreed to a next step"
},
{
"value": "not_interested",
"condition": "Customer declined or was unresponsive to all proposals"
},
{
"value": "follow_up",
"condition": "Customer asked to be contacted again at a later time"
}
]
}
'import requests
url = "https://api.bolna.ai/dispositions/"
payload = {
"name": "Call Outcome",
"question": "What was the final outcome of this call?",
"agent_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"category": "Lead Quality",
"system_prompt": "<string>",
"model": "gpt-4.1-mini",
"is_subjective": True,
"is_objective": True,
"subjective_type": "text",
"subjective_type_config": {
"pattern": "^\d{10}$",
"description": "10-digit phone number"
},
"objective_options": [
{
"value": "interested",
"condition": "Customer expressed genuine interest and agreed to a next step"
},
{
"value": "not_interested",
"condition": "Customer declined or was unresponsive to all proposals"
},
{
"value": "follow_up",
"condition": "Customer asked to be contacted again at a later time"
}
]
}
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: 'Call Outcome',
question: 'What was the final outcome of this call?',
agent_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
category: 'Lead Quality',
system_prompt: '<string>',
model: 'gpt-4.1-mini',
is_subjective: true,
is_objective: true,
subjective_type: 'text',
subjective_type_config: {pattern: '^\d{10}$', description: '10-digit phone number'},
objective_options: [
{
value: 'interested',
condition: 'Customer expressed genuine interest and agreed to a next step'
},
{
value: 'not_interested',
condition: 'Customer declined or was unresponsive to all proposals'
},
{
value: 'follow_up',
condition: 'Customer asked to be contacted again at a later time'
}
]
})
};
fetch('https://api.bolna.ai/dispositions/', 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.bolna.ai/dispositions/",
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' => 'Call Outcome',
'question' => 'What was the final outcome of this call?',
'agent_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'category' => 'Lead Quality',
'system_prompt' => '<string>',
'model' => 'gpt-4.1-mini',
'is_subjective' => true,
'is_objective' => true,
'subjective_type' => 'text',
'subjective_type_config' => [
'pattern' => '^\\d{10}$',
'description' => '10-digit phone number'
],
'objective_options' => [
[
'value' => 'interested',
'condition' => 'Customer expressed genuine interest and agreed to a next step'
],
[
'value' => 'not_interested',
'condition' => 'Customer declined or was unresponsive to all proposals'
],
[
'value' => 'follow_up',
'condition' => 'Customer asked to be contacted again at a later time'
]
]
]),
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.bolna.ai/dispositions/"
payload := strings.NewReader("{\n \"name\": \"Call Outcome\",\n \"question\": \"What was the final outcome of this call?\",\n \"agent_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"category\": \"Lead Quality\",\n \"system_prompt\": \"<string>\",\n \"model\": \"gpt-4.1-mini\",\n \"is_subjective\": true,\n \"is_objective\": true,\n \"subjective_type\": \"text\",\n \"subjective_type_config\": {\n \"pattern\": \"^\\\\d{10}$\",\n \"description\": \"10-digit phone number\"\n },\n \"objective_options\": [\n {\n \"value\": \"interested\",\n \"condition\": \"Customer expressed genuine interest and agreed to a next step\"\n },\n {\n \"value\": \"not_interested\",\n \"condition\": \"Customer declined or was unresponsive to all proposals\"\n },\n {\n \"value\": \"follow_up\",\n \"condition\": \"Customer asked to be contacted again at a later time\"\n }\n ]\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.bolna.ai/dispositions/")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"Call Outcome\",\n \"question\": \"What was the final outcome of this call?\",\n \"agent_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"category\": \"Lead Quality\",\n \"system_prompt\": \"<string>\",\n \"model\": \"gpt-4.1-mini\",\n \"is_subjective\": true,\n \"is_objective\": true,\n \"subjective_type\": \"text\",\n \"subjective_type_config\": {\n \"pattern\": \"^\\\\d{10}$\",\n \"description\": \"10-digit phone number\"\n },\n \"objective_options\": [\n {\n \"value\": \"interested\",\n \"condition\": \"Customer expressed genuine interest and agreed to a next step\"\n },\n {\n \"value\": \"not_interested\",\n \"condition\": \"Customer declined or was unresponsive to all proposals\"\n },\n {\n \"value\": \"follow_up\",\n \"condition\": \"Customer asked to be contacted again at a later time\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.bolna.ai/dispositions/")
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\": \"Call Outcome\",\n \"question\": \"What was the final outcome of this call?\",\n \"agent_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"category\": \"Lead Quality\",\n \"system_prompt\": \"<string>\",\n \"model\": \"gpt-4.1-mini\",\n \"is_subjective\": true,\n \"is_objective\": true,\n \"subjective_type\": \"text\",\n \"subjective_type_config\": {\n \"pattern\": \"^\\\\d{10}$\",\n \"description\": \"10-digit phone number\"\n },\n \"objective_options\": [\n {\n \"value\": \"interested\",\n \"condition\": \"Customer expressed genuine interest and agreed to a next step\"\n },\n {\n \"value\": \"not_interested\",\n \"condition\": \"Customer declined or was unresponsive to all proposals\"\n },\n {\n \"value\": \"follow_up\",\n \"condition\": \"Customer asked to be contacted again at a later time\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"message": "Disposition created successfully",
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
}{
"error": 123,
"message": "<string>"
}{
"error": 123,
"message": "<string>"
}{
"error": 123,
"message": "<string>"
}is_subjective or is_objective must be true. When is_objective is true, you must provide objective_options. See the ObjectiveOption schema for the full structure including nested sub_options.Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Body
Disposition to create.
Request body for creating a disposition.
agent_id is required — the disposition is linked to that agent on creation. At least one of is_subjective or is_objective must be true. When is_objective is true, objective_options is required and must be non-empty. When subjective_type is regex, subjective_type_config with a pattern is required.
Display name shown in results.
"Call Outcome"
The prompt sent to the LLM to evaluate the transcript.
"What was the final outcome of this call?"
The agent the disposition will be linked to on creation.
Grouping label for the disposition.
"Lead Quality"
Optional system context for the LLM.
LLM model to use for evaluation.
"gpt-4.1-mini"
Enable free-text response.
true
Enable pre-defined value selection.
true
Format constraint for free-text responses. Only allowed when is_subjective is true.
text, timestamp, numeric, boolean, email, regex Required when subjective_type is regex.
Show child attributes
Show child attributes
Required when is_objective is true. Must be non-empty.
Show child attributes
Show child attributes
[
{
"value": "interested",
"condition": "Customer expressed genuine interest and agreed to a next step"
},
{
"value": "not_interested",
"condition": "Customer declined or was unresponsive to all proposals"
},
{
"value": "follow_up",
"condition": "Customer asked to be contacted again at a later time"
}
]
Was this page helpful?
curl --request POST \
--url https://api.bolna.ai/dispositions/ \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "Call Outcome",
"question": "What was the final outcome of this call?",
"agent_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"category": "Lead Quality",
"system_prompt": "<string>",
"model": "gpt-4.1-mini",
"is_subjective": true,
"is_objective": true,
"subjective_type": "text",
"subjective_type_config": {
"pattern": "^\\d{10}$",
"description": "10-digit phone number"
},
"objective_options": [
{
"value": "interested",
"condition": "Customer expressed genuine interest and agreed to a next step"
},
{
"value": "not_interested",
"condition": "Customer declined or was unresponsive to all proposals"
},
{
"value": "follow_up",
"condition": "Customer asked to be contacted again at a later time"
}
]
}
'import requests
url = "https://api.bolna.ai/dispositions/"
payload = {
"name": "Call Outcome",
"question": "What was the final outcome of this call?",
"agent_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"category": "Lead Quality",
"system_prompt": "<string>",
"model": "gpt-4.1-mini",
"is_subjective": True,
"is_objective": True,
"subjective_type": "text",
"subjective_type_config": {
"pattern": "^\d{10}$",
"description": "10-digit phone number"
},
"objective_options": [
{
"value": "interested",
"condition": "Customer expressed genuine interest and agreed to a next step"
},
{
"value": "not_interested",
"condition": "Customer declined or was unresponsive to all proposals"
},
{
"value": "follow_up",
"condition": "Customer asked to be contacted again at a later time"
}
]
}
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: 'Call Outcome',
question: 'What was the final outcome of this call?',
agent_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
category: 'Lead Quality',
system_prompt: '<string>',
model: 'gpt-4.1-mini',
is_subjective: true,
is_objective: true,
subjective_type: 'text',
subjective_type_config: {pattern: '^\d{10}$', description: '10-digit phone number'},
objective_options: [
{
value: 'interested',
condition: 'Customer expressed genuine interest and agreed to a next step'
},
{
value: 'not_interested',
condition: 'Customer declined or was unresponsive to all proposals'
},
{
value: 'follow_up',
condition: 'Customer asked to be contacted again at a later time'
}
]
})
};
fetch('https://api.bolna.ai/dispositions/', 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.bolna.ai/dispositions/",
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' => 'Call Outcome',
'question' => 'What was the final outcome of this call?',
'agent_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'category' => 'Lead Quality',
'system_prompt' => '<string>',
'model' => 'gpt-4.1-mini',
'is_subjective' => true,
'is_objective' => true,
'subjective_type' => 'text',
'subjective_type_config' => [
'pattern' => '^\\d{10}$',
'description' => '10-digit phone number'
],
'objective_options' => [
[
'value' => 'interested',
'condition' => 'Customer expressed genuine interest and agreed to a next step'
],
[
'value' => 'not_interested',
'condition' => 'Customer declined or was unresponsive to all proposals'
],
[
'value' => 'follow_up',
'condition' => 'Customer asked to be contacted again at a later time'
]
]
]),
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.bolna.ai/dispositions/"
payload := strings.NewReader("{\n \"name\": \"Call Outcome\",\n \"question\": \"What was the final outcome of this call?\",\n \"agent_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"category\": \"Lead Quality\",\n \"system_prompt\": \"<string>\",\n \"model\": \"gpt-4.1-mini\",\n \"is_subjective\": true,\n \"is_objective\": true,\n \"subjective_type\": \"text\",\n \"subjective_type_config\": {\n \"pattern\": \"^\\\\d{10}$\",\n \"description\": \"10-digit phone number\"\n },\n \"objective_options\": [\n {\n \"value\": \"interested\",\n \"condition\": \"Customer expressed genuine interest and agreed to a next step\"\n },\n {\n \"value\": \"not_interested\",\n \"condition\": \"Customer declined or was unresponsive to all proposals\"\n },\n {\n \"value\": \"follow_up\",\n \"condition\": \"Customer asked to be contacted again at a later time\"\n }\n ]\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.bolna.ai/dispositions/")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"Call Outcome\",\n \"question\": \"What was the final outcome of this call?\",\n \"agent_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"category\": \"Lead Quality\",\n \"system_prompt\": \"<string>\",\n \"model\": \"gpt-4.1-mini\",\n \"is_subjective\": true,\n \"is_objective\": true,\n \"subjective_type\": \"text\",\n \"subjective_type_config\": {\n \"pattern\": \"^\\\\d{10}$\",\n \"description\": \"10-digit phone number\"\n },\n \"objective_options\": [\n {\n \"value\": \"interested\",\n \"condition\": \"Customer expressed genuine interest and agreed to a next step\"\n },\n {\n \"value\": \"not_interested\",\n \"condition\": \"Customer declined or was unresponsive to all proposals\"\n },\n {\n \"value\": \"follow_up\",\n \"condition\": \"Customer asked to be contacted again at a later time\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.bolna.ai/dispositions/")
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\": \"Call Outcome\",\n \"question\": \"What was the final outcome of this call?\",\n \"agent_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"category\": \"Lead Quality\",\n \"system_prompt\": \"<string>\",\n \"model\": \"gpt-4.1-mini\",\n \"is_subjective\": true,\n \"is_objective\": true,\n \"subjective_type\": \"text\",\n \"subjective_type_config\": {\n \"pattern\": \"^\\\\d{10}$\",\n \"description\": \"10-digit phone number\"\n },\n \"objective_options\": [\n {\n \"value\": \"interested\",\n \"condition\": \"Customer expressed genuine interest and agreed to a next step\"\n },\n {\n \"value\": \"not_interested\",\n \"condition\": \"Customer declined or was unresponsive to all proposals\"\n },\n {\n \"value\": \"follow_up\",\n \"condition\": \"Customer asked to be contacted again at a later time\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"message": "Disposition created successfully",
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
}{
"error": 123,
"message": "<string>"
}{
"error": 123,
"message": "<string>"
}{
"error": 123,
"message": "<string>"
}
