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
Your API key for authentication.
Path Parameters
The ID of the workbench setup to fork a new version from.
Body Parameters
All fields are optional.Display name for the new version. Between 1 and 200 characters. Defaults to the source version’s name.
Optional description for the new version.
ID of the version to fork from. Defaults to the current draft if not provided.
Response
Returns201 on success.
The full newly created version object.
Show version fields
Show version fields
Unique identifier for this version.
ID of the organization that owns this version.
ID of the parent workbench setup.
Monotonically increasing version number.
Display name of this version.
Description of this version, or
null if not set.Always
"editable" for a newly created version.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).Inherited pass threshold percentage (0-100), or
null if not set.Inherited run mode. One of
text, audio, or full.Inherited default test configuration ID, or
null if not set.Inherited default call IDs. Up to 5000 entries.
ID of the version this was forked from.
Identifier of the user who created this version, or
null.ISO 8601 timestamp for when this version was created.
ISO 8601 timestamp for when this version was last updated.
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