curl --request POST \
--url https://api.cekura.ai/test_framework/v3/aiagents/ \
--header 'Content-Type: application/json' \
--header 'X-CEKURA-API-KEY: <api-key>' \
--data '
{
"project": 123,
"provider": {
"type": "vapi",
"configure_from_provider": true,
"agent_id": "asst_abc123",
"credentials": {
"api_key": "your-vapi-private-key"
}
}
}
'import requests
url = "https://api.cekura.ai/test_framework/v3/aiagents/"
payload = {
"project": 123,
"provider": {
"type": "vapi",
"configure_from_provider": True,
"agent_id": "asst_abc123",
"credentials": { "api_key": "your-vapi-private-key" }
}
}
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({
project: 123,
provider: {
type: 'vapi',
configure_from_provider: true,
agent_id: 'asst_abc123',
credentials: {api_key: 'your-vapi-private-key'}
}
})
};
fetch('https://api.cekura.ai/test_framework/v3/aiagents/', 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/v3/aiagents/",
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([
'project' => 123,
'provider' => [
'type' => 'vapi',
'configure_from_provider' => true,
'agent_id' => 'asst_abc123',
'credentials' => [
'api_key' => 'your-vapi-private-key'
]
]
]),
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/v3/aiagents/"
payload := strings.NewReader("{\n \"project\": 123,\n \"provider\": {\n \"type\": \"vapi\",\n \"configure_from_provider\": true,\n \"agent_id\": \"asst_abc123\",\n \"credentials\": {\n \"api_key\": \"your-vapi-private-key\"\n }\n }\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/v3/aiagents/")
.header("X-CEKURA-API-KEY", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"project\": 123,\n \"provider\": {\n \"type\": \"vapi\",\n \"configure_from_provider\": true,\n \"agent_id\": \"asst_abc123\",\n \"credentials\": {\n \"api_key\": \"your-vapi-private-key\"\n }\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.cekura.ai/test_framework/v3/aiagents/")
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 \"project\": 123,\n \"provider\": {\n \"type\": \"vapi\",\n \"configure_from_provider\": true,\n \"agent_id\": \"asst_abc123\",\n \"credentials\": {\n \"api_key\": \"your-vapi-private-key\"\n }\n }\n}"
response = http.request(request)
puts response.read_body{
"status": "completed",
"agent_id": 123,
"current_stage": "<string>",
"stages": [
{
"key": "<string>",
"label": "<string>",
"status": "pending",
"detail": "<string>"
}
],
"error": "<string>",
"agent": {}
}{
"status": "completed",
"agent_id": 123,
"current_stage": "<string>",
"stages": [
{
"key": "<string>",
"label": "<string>",
"status": "pending",
"detail": "<string>"
}
],
"error": "<string>",
"agent": {}
}{
"field_name": [
"<string>"
]
}Create Agent v3
Create an agent and return it once it is ready. Takes the same fields as Create Agent (POST /v2/aiagents/). With provider.configure_from_provider: true the agent is first imported from its cloud provider, usually within 2 minutes; 409 when that assistant is already imported into the project.
curl --request POST \
--url https://api.cekura.ai/test_framework/v3/aiagents/ \
--header 'Content-Type: application/json' \
--header 'X-CEKURA-API-KEY: <api-key>' \
--data '
{
"project": 123,
"provider": {
"type": "vapi",
"configure_from_provider": true,
"agent_id": "asst_abc123",
"credentials": {
"api_key": "your-vapi-private-key"
}
}
}
'import requests
url = "https://api.cekura.ai/test_framework/v3/aiagents/"
payload = {
"project": 123,
"provider": {
"type": "vapi",
"configure_from_provider": True,
"agent_id": "asst_abc123",
"credentials": { "api_key": "your-vapi-private-key" }
}
}
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({
project: 123,
provider: {
type: 'vapi',
configure_from_provider: true,
agent_id: 'asst_abc123',
credentials: {api_key: 'your-vapi-private-key'}
}
})
};
fetch('https://api.cekura.ai/test_framework/v3/aiagents/', 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/v3/aiagents/",
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([
'project' => 123,
'provider' => [
'type' => 'vapi',
'configure_from_provider' => true,
'agent_id' => 'asst_abc123',
'credentials' => [
'api_key' => 'your-vapi-private-key'
]
]
]),
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/v3/aiagents/"
payload := strings.NewReader("{\n \"project\": 123,\n \"provider\": {\n \"type\": \"vapi\",\n \"configure_from_provider\": true,\n \"agent_id\": \"asst_abc123\",\n \"credentials\": {\n \"api_key\": \"your-vapi-private-key\"\n }\n }\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/v3/aiagents/")
.header("X-CEKURA-API-KEY", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"project\": 123,\n \"provider\": {\n \"type\": \"vapi\",\n \"configure_from_provider\": true,\n \"agent_id\": \"asst_abc123\",\n \"credentials\": {\n \"api_key\": \"your-vapi-private-key\"\n }\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.cekura.ai/test_framework/v3/aiagents/")
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 \"project\": 123,\n \"provider\": {\n \"type\": \"vapi\",\n \"configure_from_provider\": true,\n \"agent_id\": \"asst_abc123\",\n \"credentials\": {\n \"api_key\": \"your-vapi-private-key\"\n }\n }\n}"
response = http.request(request)
puts response.read_body{
"status": "completed",
"agent_id": 123,
"current_stage": "<string>",
"stages": [
{
"key": "<string>",
"label": "<string>",
"status": "pending",
"detail": "<string>"
}
],
"error": "<string>",
"agent": {}
}{
"status": "completed",
"agent_id": 123,
"current_stage": "<string>",
"stages": [
{
"key": "<string>",
"label": "<string>",
"status": "pending",
"detail": "<string>"
}
],
"error": "<string>",
"agent": {}
}{
"field_name": [
"<string>"
]
}Authorizations
API Key Authentication. It should be included in the header of each request.
Body
A detailed description of what this agent does and how it should interact Example:
AI agent for handling customer support inquiries and resolving technical issues
Agent name. Optional when configure_from_provider is set — it's fetched from the provider.
255The project this agent belongs to
The primary language this agent uses for communication (e.g. 'en' for English)
af- Afrikaansar- Arabicbn- Bengalibg- Bulgarianzh- Chinese Simplifiedcs- Czechda- Danishnl- Dutchen- Englishet- Estonianfi- Finnishfr- Frenchde- Germanel- Greekgu- Gujaratihi- Hindihe- Hebrewhu- Hungarianid- Indonesianit- Italianja- Japanesekn- Kannadakk- Kazakhko- Koreanms- Malayml- Malayalammr- Marathimulti- Multilingualno- Norwegianpl- Polishpa- Punjabipt- Portuguesero- Romanianru- Russiansk- Slovakes- Spanishsv- Swedishth- Thaitr- Turkishtl- Tagalogta- Tamilte- Teluguuk- Ukrainianuz- Uzbekvi- Vietnamese
af, ar, bn, bg, zh, cs, da, nl, en, et, fi, fr, de, el, gu, hi, he, hu, id, it, ja, kn, kk, ko, ms, ml, mr, multi, no, pl, pa, pt, ro, ru, sk, es, sv, th, tr, tl, ta, te, uk, uz, vi Phone and SIP/websocket channel configuration.
Show child attributes
Show child attributes
AI platform integration. Nested credentials replace the flat {provider}_api_key fields.
Show child attributes
Show child attributes
True = agent speaks first; False = test user speaks first; null = auto-detect.
predefined metrics to use for the agent
Full desired set of knowledge base files. Reference existing by id; add new ones with file_name + content_base64. Omitted existing files are deleted.
Show child attributes
Show child attributes
Webhook URL for this agent. When set, overrides the project-level webhook URL for events from this agent.
Secret sent in X-CEKURA-SECRET header. Applies when agent webhook_url is set. Write-only — never returned in API responses. Use webhook_secret_configured to check whether one is set.
Full desired set of mock tools. Items with id (or a matching name) update existing tools; items without create new ones. Omitted existing tools are deleted.
Show child attributes
Show child attributes
Whether mock tools should be selected by default when configuring a run.
Full desired set of dynamic variable definitions, matched by name. Omitted existing variables are deleted.
Show child attributes
Show child attributes
Email address this agent receives at. When set, enables email-based test runs.
254Response
failed when the job could not produce its result; see error / errors.
completed, failed Null when the agent was created without an import.
Show child attributes
Show child attributes
Why the job failed, when it did.
The created agent, as the agents API returns it. When the import failed, it holds what was configured before the failure.