curl --request POST \
--url https://api.cekura.ai/test_framework/v1/scenarios/run_scenarios_livekit_v2/ \
--header 'Content-Type: application/json' \
--header 'X-CEKURA-API-KEY: <api-key>' \
--data '
{
"scenarios": [
{
"scenario": 123,
"publish_data_message": "<unknown>"
}
],
"name": "<string>",
"frequency": 1,
"agent": 123,
"personality_ids": [
123
],
"test_profile_ids": [
123
],
"mock_tool_names": [
"<string>"
],
"livekit_data": {
"config": "<unknown>",
"agent_name": "<string>",
"url": "<string>"
},
"concurrency_limit": 123,
"personality_id": 123,
"test_profile_id": 123
}
'import requests
url = "https://api.cekura.ai/test_framework/v1/scenarios/run_scenarios_livekit_v2/"
payload = {
"scenarios": [
{
"scenario": 123,
"publish_data_message": "<unknown>"
}
],
"name": "<string>",
"frequency": 1,
"agent": 123,
"personality_ids": [123],
"test_profile_ids": [123],
"mock_tool_names": ["<string>"],
"livekit_data": {
"config": "<unknown>",
"agent_name": "<string>",
"url": "<string>"
},
"concurrency_limit": 123,
"personality_id": 123,
"test_profile_id": 123
}
headers = {
"X-CEKURA-API-KEY": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-CEKURA-API-KEY': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
scenarios: [{scenario: 123, publish_data_message: '<unknown>'}],
name: '<string>',
frequency: 1,
agent: 123,
personality_ids: [123],
test_profile_ids: [123],
mock_tool_names: ['<string>'],
livekit_data: {config: '<unknown>', agent_name: '<string>', url: '<string>'},
concurrency_limit: 123,
personality_id: 123,
test_profile_id: 123
})
};
fetch('https://api.cekura.ai/test_framework/v1/scenarios/run_scenarios_livekit_v2/', 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.cekura.ai/test_framework/v1/scenarios/run_scenarios_livekit_v2/",
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([
'scenarios' => [
[
'scenario' => 123,
'publish_data_message' => '<unknown>'
]
],
'name' => '<string>',
'frequency' => 1,
'agent' => 123,
'personality_ids' => [
123
],
'test_profile_ids' => [
123
],
'mock_tool_names' => [
'<string>'
],
'livekit_data' => [
'config' => '<unknown>',
'agent_name' => '<string>',
'url' => '<string>'
],
'concurrency_limit' => 123,
'personality_id' => 123,
'test_profile_id' => 123
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-CEKURA-API-KEY: <api-key>"
],
]);
$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.cekura.ai/test_framework/v1/scenarios/run_scenarios_livekit_v2/"
payload := strings.NewReader("{\n \"scenarios\": [\n {\n \"scenario\": 123,\n \"publish_data_message\": \"<unknown>\"\n }\n ],\n \"name\": \"<string>\",\n \"frequency\": 1,\n \"agent\": 123,\n \"personality_ids\": [\n 123\n ],\n \"test_profile_ids\": [\n 123\n ],\n \"mock_tool_names\": [\n \"<string>\"\n ],\n \"livekit_data\": {\n \"config\": \"<unknown>\",\n \"agent_name\": \"<string>\",\n \"url\": \"<string>\"\n },\n \"concurrency_limit\": 123,\n \"personality_id\": 123,\n \"test_profile_id\": 123\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-CEKURA-API-KEY", "<api-key>")
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.cekura.ai/test_framework/v1/scenarios/run_scenarios_livekit_v2/")
.header("X-CEKURA-API-KEY", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"scenarios\": [\n {\n \"scenario\": 123,\n \"publish_data_message\": \"<unknown>\"\n }\n ],\n \"name\": \"<string>\",\n \"frequency\": 1,\n \"agent\": 123,\n \"personality_ids\": [\n 123\n ],\n \"test_profile_ids\": [\n 123\n ],\n \"mock_tool_names\": [\n \"<string>\"\n ],\n \"livekit_data\": {\n \"config\": \"<unknown>\",\n \"agent_name\": \"<string>\",\n \"url\": \"<string>\"\n },\n \"concurrency_limit\": 123,\n \"personality_id\": 123,\n \"test_profile_id\": 123\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.cekura.ai/test_framework/v1/scenarios/run_scenarios_livekit_v2/")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-CEKURA-API-KEY"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"scenarios\": [\n {\n \"scenario\": 123,\n \"publish_data_message\": \"<unknown>\"\n }\n ],\n \"name\": \"<string>\",\n \"frequency\": 1,\n \"agent\": 123,\n \"personality_ids\": [\n 123\n ],\n \"test_profile_ids\": [\n 123\n ],\n \"mock_tool_names\": [\n \"<string>\"\n ],\n \"livekit_data\": {\n \"config\": \"<unknown>\",\n \"agent_name\": \"<string>\",\n \"url\": \"<string>\"\n },\n \"concurrency_limit\": 123,\n \"personality_id\": 123,\n \"test_profile_id\": 123\n}"
response = http.request(request)
puts response.read_body{
"id": 123,
"agent": 123,
"run_as_text": false,
"runs": [
{
"id": 123,
"scenario": 123,
"number": "+11234567890",
"inbound_number": "+11234567890",
"scenario_name": "<string>",
"test_profile_data": {},
"outbound_dial_window_opens_at": "2023-11-07T05:31:56Z",
"outbound_dial_window_seconds": 123,
"outbound_dial_window_closes_at": "2023-11-07T05:31:56Z"
}
],
"created_at": "2025-02-25T21:00:01.990052Z"
}{
"field_name": [
"<string>"
]
}Run Evaluator LiveKit (v2)
Execute evaluators against a LiveKit agent using project-level credentials. Cekura creates the rooms — no per-scenario URLs needed. Requires LiveKit credentials configured on the agent or project.
curl --request POST \
--url https://api.cekura.ai/test_framework/v1/scenarios/run_scenarios_livekit_v2/ \
--header 'Content-Type: application/json' \
--header 'X-CEKURA-API-KEY: <api-key>' \
--data '
{
"scenarios": [
{
"scenario": 123,
"publish_data_message": "<unknown>"
}
],
"name": "<string>",
"frequency": 1,
"agent": 123,
"personality_ids": [
123
],
"test_profile_ids": [
123
],
"mock_tool_names": [
"<string>"
],
"livekit_data": {
"config": "<unknown>",
"agent_name": "<string>",
"url": "<string>"
},
"concurrency_limit": 123,
"personality_id": 123,
"test_profile_id": 123
}
'import requests
url = "https://api.cekura.ai/test_framework/v1/scenarios/run_scenarios_livekit_v2/"
payload = {
"scenarios": [
{
"scenario": 123,
"publish_data_message": "<unknown>"
}
],
"name": "<string>",
"frequency": 1,
"agent": 123,
"personality_ids": [123],
"test_profile_ids": [123],
"mock_tool_names": ["<string>"],
"livekit_data": {
"config": "<unknown>",
"agent_name": "<string>",
"url": "<string>"
},
"concurrency_limit": 123,
"personality_id": 123,
"test_profile_id": 123
}
headers = {
"X-CEKURA-API-KEY": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-CEKURA-API-KEY': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
scenarios: [{scenario: 123, publish_data_message: '<unknown>'}],
name: '<string>',
frequency: 1,
agent: 123,
personality_ids: [123],
test_profile_ids: [123],
mock_tool_names: ['<string>'],
livekit_data: {config: '<unknown>', agent_name: '<string>', url: '<string>'},
concurrency_limit: 123,
personality_id: 123,
test_profile_id: 123
})
};
fetch('https://api.cekura.ai/test_framework/v1/scenarios/run_scenarios_livekit_v2/', 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.cekura.ai/test_framework/v1/scenarios/run_scenarios_livekit_v2/",
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([
'scenarios' => [
[
'scenario' => 123,
'publish_data_message' => '<unknown>'
]
],
'name' => '<string>',
'frequency' => 1,
'agent' => 123,
'personality_ids' => [
123
],
'test_profile_ids' => [
123
],
'mock_tool_names' => [
'<string>'
],
'livekit_data' => [
'config' => '<unknown>',
'agent_name' => '<string>',
'url' => '<string>'
],
'concurrency_limit' => 123,
'personality_id' => 123,
'test_profile_id' => 123
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-CEKURA-API-KEY: <api-key>"
],
]);
$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.cekura.ai/test_framework/v1/scenarios/run_scenarios_livekit_v2/"
payload := strings.NewReader("{\n \"scenarios\": [\n {\n \"scenario\": 123,\n \"publish_data_message\": \"<unknown>\"\n }\n ],\n \"name\": \"<string>\",\n \"frequency\": 1,\n \"agent\": 123,\n \"personality_ids\": [\n 123\n ],\n \"test_profile_ids\": [\n 123\n ],\n \"mock_tool_names\": [\n \"<string>\"\n ],\n \"livekit_data\": {\n \"config\": \"<unknown>\",\n \"agent_name\": \"<string>\",\n \"url\": \"<string>\"\n },\n \"concurrency_limit\": 123,\n \"personality_id\": 123,\n \"test_profile_id\": 123\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-CEKURA-API-KEY", "<api-key>")
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.cekura.ai/test_framework/v1/scenarios/run_scenarios_livekit_v2/")
.header("X-CEKURA-API-KEY", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"scenarios\": [\n {\n \"scenario\": 123,\n \"publish_data_message\": \"<unknown>\"\n }\n ],\n \"name\": \"<string>\",\n \"frequency\": 1,\n \"agent\": 123,\n \"personality_ids\": [\n 123\n ],\n \"test_profile_ids\": [\n 123\n ],\n \"mock_tool_names\": [\n \"<string>\"\n ],\n \"livekit_data\": {\n \"config\": \"<unknown>\",\n \"agent_name\": \"<string>\",\n \"url\": \"<string>\"\n },\n \"concurrency_limit\": 123,\n \"personality_id\": 123,\n \"test_profile_id\": 123\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.cekura.ai/test_framework/v1/scenarios/run_scenarios_livekit_v2/")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-CEKURA-API-KEY"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"scenarios\": [\n {\n \"scenario\": 123,\n \"publish_data_message\": \"<unknown>\"\n }\n ],\n \"name\": \"<string>\",\n \"frequency\": 1,\n \"agent\": 123,\n \"personality_ids\": [\n 123\n ],\n \"test_profile_ids\": [\n 123\n ],\n \"mock_tool_names\": [\n \"<string>\"\n ],\n \"livekit_data\": {\n \"config\": \"<unknown>\",\n \"agent_name\": \"<string>\",\n \"url\": \"<string>\"\n },\n \"concurrency_limit\": 123,\n \"personality_id\": 123,\n \"test_profile_id\": 123\n}"
response = http.request(request)
puts response.read_body{
"id": 123,
"agent": 123,
"run_as_text": false,
"runs": [
{
"id": 123,
"scenario": 123,
"number": "+11234567890",
"inbound_number": "+11234567890",
"scenario_name": "<string>",
"test_profile_data": {},
"outbound_dial_window_opens_at": "2023-11-07T05:31:56Z",
"outbound_dial_window_seconds": 123,
"outbound_dial_window_closes_at": "2023-11-07T05:31:56Z"
}
],
"created_at": "2025-02-25T21:00:01.990052Z"
}{
"field_name": [
"<string>"
]
}Authorizations
API Key Authentication. It should be included in the header of each request.
Body
Show child attributes
Show child attributes
Optional name for the scenario result
Frequency to run
1 <= x <= 100Agent to use. Required if none of the scenarios have an agent.
List of personality IDs to override for this run. If not provided, uses the scenario's default personality.
List of test profile IDs to override for this run. If not provided, uses the scenario's default test profile.
Names of mock tools to activate for this run. Omit (or send null) to mock every tool configured on the agent; send an empty list to mock none so every tool keeps its original endpoint; send specific names to mock only those. Tools that belong to an MCP server should be selected via the MCP server's name or key, which mocks all of that server's tools as one unit. Legacy MCP sub-tool names are accepted as aliases for the whole parent MCP.
Per-run LiveKit overrides (config, agent_name, url). Credentials are always read from the agent/project.
Show child attributes
Show child attributes
Optional cap on how many of this run's calls execute concurrently.
Single personality ID override. Merged into personality_ids; prefer personality_ids for multiple.
Single test profile ID override. Merged into test_profile_ids; prefer test_profile_ids for multiple.
Response
ID of the result
ID of the agent
Status of the result
pending, running, completed, failed Whether the scenario ran as text or not
false
Show child attributes
Show child attributes
{
"id": 274,
"status": "pending",
"scenario": 1,
"number": null,
"inbound_number": "+11234567890",
"scenario_name": "Customer Support Call (Agent Inbound = True)",
"test_profile_data": null,
"outbound_dial_window_opens_at": null,
"outbound_dial_window_seconds": null,
"outbound_dial_window_closes_at": null
}
{
"id": 275,
"status": "pending",
"scenario": 2,
"number": "+11234567890",
"inbound_number": null,
"scenario_name": "Outbound Sales Call (Agent Inbound = False)",
"test_profile_data": null,
"outbound_dial_window_opens_at": "2026-06-24T10:47:30Z",
"outbound_dial_window_seconds": 300,
"outbound_dial_window_closes_at": "2026-06-24T10:52:30Z"
}
"2025-02-25T21:00:01.990052Z"