Create Workbench Setup Version
curl --request POST \
--url https://api.bland.ai/v1/evals/workbench-setups/{setup_id}/versions \
--header 'Content-Type: application/json' \
--header 'authorization: <authorization>' \
--data '
{
"name": "<string>",
"description": {},
"from_version_id": "<string>"
}
'import requests
url = "https://api.bland.ai/v1/evals/workbench-setups/{setup_id}/versions"
payload = {
"name": "<string>",
"description": {},
"from_version_id": "<string>"
}
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({name: '<string>', description: {}, from_version_id: '<string>'})
};
fetch('https://api.bland.ai/v1/evals/workbench-setups/{setup_id}/versions', 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/evals/workbench-setups/{setup_id}/versions",
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>',
'description' => [
],
'from_version_id' => '<string>'
]),
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/evals/workbench-setups/{setup_id}/versions"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"description\": {},\n \"from_version_id\": \"<string>\"\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/evals/workbench-setups/{setup_id}/versions")
.header("authorization", "<authorization>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"description\": {},\n \"from_version_id\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.bland.ai/v1/evals/workbench-setups/{setup_id}/versions")
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 \"name\": \"<string>\",\n \"description\": {},\n \"from_version_id\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"errors": null,
"data": {
"id": "f7a8b9c0-d1e2-3456-abcd-567890123456",
"org_id": "b2c3d4e5-f6a7-8901-bcde-f12345678901",
"workbench_setup_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"version_number": 5,
"name": "Onboarding Quality Check",
"description": null,
"state": "editable",
"attached_agents": [
{
"eval_agent_id": "e5f6a7b8-c9d0-1234-efab-345678901234",
"eval_agent_version_id": "f6a7b8c9-d0e1-2345-fabc-456789012345",
"weight": 50,
"target_level_keys": ["good", "excellent"]
}
],
"pass_threshold_pct": 80,
"run_mode": "audio",
"default_test_config_id": null,
"default_call_ids": [],
"created_from_version_id": "c3d4e5f6-a7b8-9012-cdef-123456789012",
"created_by": "9a8b7c6d-5e4f-3210-9876-543210fedcba",
"created_at": "2026-05-27T10:00:00.000Z",
"updated_at": "2026-05-27T10:00:00.000Z"
}
}
Versions
Create Workbench Setup Version
Fork a new editable draft version of a workbench setup.
POST
/
v1
/
evals
/
workbench-setups
/
{setup_id}
/
versions
Create Workbench Setup Version
curl --request POST \
--url https://api.bland.ai/v1/evals/workbench-setups/{setup_id}/versions \
--header 'Content-Type: application/json' \
--header 'authorization: <authorization>' \
--data '
{
"name": "<string>",
"description": {},
"from_version_id": "<string>"
}
'import requests
url = "https://api.bland.ai/v1/evals/workbench-setups/{setup_id}/versions"
payload = {
"name": "<string>",
"description": {},
"from_version_id": "<string>"
}
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({name: '<string>', description: {}, from_version_id: '<string>'})
};
fetch('https://api.bland.ai/v1/evals/workbench-setups/{setup_id}/versions', 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/evals/workbench-setups/{setup_id}/versions",
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>',
'description' => [
],
'from_version_id' => '<string>'
]),
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/evals/workbench-setups/{setup_id}/versions"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"description\": {},\n \"from_version_id\": \"<string>\"\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/evals/workbench-setups/{setup_id}/versions")
.header("authorization", "<authorization>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"description\": {},\n \"from_version_id\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.bland.ai/v1/evals/workbench-setups/{setup_id}/versions")
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 \"name\": \"<string>\",\n \"description\": {},\n \"from_version_id\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"errors": null,
"data": {
"id": "f7a8b9c0-d1e2-3456-abcd-567890123456",
"org_id": "b2c3d4e5-f6a7-8901-bcde-f12345678901",
"workbench_setup_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"version_number": 5,
"name": "Onboarding Quality Check",
"description": null,
"state": "editable",
"attached_agents": [
{
"eval_agent_id": "e5f6a7b8-c9d0-1234-efab-345678901234",
"eval_agent_version_id": "f6a7b8c9-d0e1-2345-fabc-456789012345",
"weight": 50,
"target_level_keys": ["good", "excellent"]
}
],
"pass_threshold_pct": 80,
"run_mode": "audio",
"default_test_config_id": null,
"default_call_ids": [],
"created_from_version_id": "c3d4e5f6-a7b8-9012-cdef-123456789012",
"created_by": "9a8b7c6d-5e4f-3210-9876-543210fedcba",
"created_at": "2026-05-27T10:00:00.000Z",
"updated_at": "2026-05-27T10:00:00.000Z"
}
}
Headers
string
required
Your API key for authentication.
Path Parameters
string
required
The ID of the workbench setup to fork a new version from.
Body Parameters
All fields are optional.string
Display name for the new version. Between 1 and 200 characters. Defaults to the source version’s name.
string | null
Optional description for the new version.
string
ID of the version to fork from. Defaults to the current draft if not provided.
Response
Returns201 on success.
object
The full newly created version object.
Show version fields
Show version fields
string
Unique identifier for this version.
string
ID of the organization that owns this version.
string
ID of the parent workbench setup.
integer
Monotonically increasing version number.
string
Display name of this version.
string | null
Description of this version, or
null if not set.string
Always
"editable" for a newly created version.array
Eval agents inherited from the source version. Each item contains
eval_agent_id, eval_agent_version_id, weight (0-100), and target_level_keys (array of strings).integer | null
Inherited pass threshold percentage (0-100), or
null if not set.string
Inherited run mode. One of
text, audio, or full.string | null
Inherited default test configuration ID, or
null if not set.array of strings
Inherited default call IDs. Up to 5000 entries.
string | null
ID of the version this was forked from.
string | null
Identifier of the user who created this version, or
null.string
ISO 8601 timestamp for when this version was created.
string
ISO 8601 timestamp for when this version was last updated.
null
null on success.{
"errors": null,
"data": {
"id": "f7a8b9c0-d1e2-3456-abcd-567890123456",
"org_id": "b2c3d4e5-f6a7-8901-bcde-f12345678901",
"workbench_setup_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"version_number": 5,
"name": "Onboarding Quality Check",
"description": null,
"state": "editable",
"attached_agents": [
{
"eval_agent_id": "e5f6a7b8-c9d0-1234-efab-345678901234",
"eval_agent_version_id": "f6a7b8c9-d0e1-2345-fabc-456789012345",
"weight": 50,
"target_level_keys": ["good", "excellent"]
}
],
"pass_threshold_pct": 80,
"run_mode": "audio",
"default_test_config_id": null,
"default_call_ids": [],
"created_from_version_id": "c3d4e5f6-a7b8-9012-cdef-123456789012",
"created_by": "9a8b7c6d-5e4f-3210-9876-543210fedcba",
"created_at": "2026-05-27T10:00:00.000Z",
"updated_at": "2026-05-27T10:00:00.000Z"
}
}
Was this page helpful?
⌘I