curl --request POST \
--url https://api.agents.slng.ai/v1/agents/{agent_id}/duplicate \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "Appointment Reminder Copy"
}
'import requests
url = "https://api.agents.slng.ai/v1/agents/{agent_id}/duplicate"
payload = { "name": "Appointment Reminder Copy" }
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: 'Appointment Reminder Copy'})
};
fetch('https://api.agents.slng.ai/v1/agents/{agent_id}/duplicate', 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.agents.slng.ai/v1/agents/{agent_id}/duplicate",
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' => 'Appointment Reminder Copy'
]),
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.agents.slng.ai/v1/agents/{agent_id}/duplicate"
payload := strings.NewReader("{\n \"name\": \"Appointment Reminder Copy\"\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.agents.slng.ai/v1/agents/{agent_id}/duplicate")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"Appointment Reminder Copy\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.agents.slng.ai/v1/agents/{agent_id}/duplicate")
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\": \"Appointment Reminder Copy\"\n}"
response = http.request(request)
puts response.read_body{
"id": "550e8400-e29b-41d4-a716-446655440000",
"organisation_id": "550e8400-e29b-41d4-a716-446655440000",
"name": "<string>",
"system_prompt": "<string>",
"greeting": "<string>",
"language": "<string>",
"region": "<string>",
"models": {
"stt": "slng/deepgram/nova:3-en",
"llm": "groq/openai/gpt-oss-120b",
"tts": "slng/deepgram/aura:2-en",
"tts_voice": "aura-2-thalia-en",
"stt_kwargs": {},
"llm_kwargs": {},
"tts_kwargs": {},
"fallbacks": {
"stt": [],
"llm": [],
"tts": []
},
"stt_final_timeout_s": 1,
"llm_first_token_timeout_s": 1,
"tts_first_audio_timeout_s": 1,
"failure_audio_enabled": true
},
"idle_nudges": {
"first_nudge_text": "<string>",
"second_nudge_text": "<string>",
"final_hangup_text": "<string>",
"enabled": true,
"first_nudge_delay_seconds": 15,
"second_nudge_delay_seconds": 30,
"hangup_delay_seconds": 15
},
"enable_interruptions": true,
"tool_mode": "legacy",
"tools": [
{}
],
"tool_refs": [
{
"attachment_id": "550e8400-e29b-41d4-a716-446655440000",
"tool_id": "550e8400-e29b-41d4-a716-446655440000",
"version": 2,
"description": "<string>",
"invocation": "model",
"system": {
"triggers": [
{
"event": "call_start",
"source_attachment_id": "550e8400-e29b-41d4-a716-446655440000"
}
],
"arguments": []
},
"execution_policy": {
"pre_action_message": {
"enabled": false,
"text": {
"segments": [
{
"type": "literal",
"value": "<string>"
}
]
},
"wait": false
}
},
"argument_overrides": {},
"config_overrides": {
"type": "api_request",
"url": "<string>"
}
}
],
"mcp_refs": [
{
"attachment_id": "550e8400-e29b-41d4-a716-446655440000",
"server_id": "550e8400-e29b-41d4-a716-446655440000",
"tool_name": "<string>",
"observed_schema_hash": "<string>",
"description": "<string>",
"invocation": "model",
"execution_policy": {
"pre_action_message": {
"enabled": false,
"text": {
"segments": [
{
"type": "literal",
"value": "<string>"
}
]
},
"wait": false
}
},
"argument_overrides": {}
}
],
"livekit_deployment": "<string>",
"template_variables": {},
"created_at": "2026-01-15T10:30:00Z",
"updated_at": "2026-01-15T10:30:00Z",
"inbound_greeting": "<string>",
"outbound_greeting": "<string>",
"models_validation_error": "<string>",
"llm_router_enabled": true,
"sip_inbound_trunk_id": "550e8400-e29b-41d4-a716-446655440000",
"sip_outbound_trunk_id": "550e8400-e29b-41d4-a716-446655440000",
"runtime_variables": [
{
"name": "<string>",
"description": "<string>"
}
],
"deleted_at": "2026-01-15T10:30:00Z"
}{
"detail": "The request could not be processed."
}{
"detail": "Authentication is required for this endpoint."
}{
"detail": "You do not have access to this resource."
}{
"detail": "The requested resource was not found."
}{
"detail": "The requested operation conflicts with the current resource state."
}{
"detail": [
{
"loc": [
"body",
"language"
],
"msg": "Input should be a valid string",
"type": "string_type"
}
]
}{
"detail": "An unexpected internal error occurred."
}Duplicate agent
Create a server-side copy of an existing voice agent.
The duplicate copies the stored agent configuration, including prompts, models, tools, template defaults, selected region, and outbound telephony settings.
The duplicate does not copy call history. The inbound connection is never
inherited: supply target_sip_inbound_trunk_id to attach one to the duplicate,
and it must be different from the source agent’s inbound trunk. The outbound
connection is inherited within the organisation unless
target_sip_outbound_trunk_id is provided. SLNG creates and manages a runtime
API key for the duplicated agent automatically.
curl --request POST \
--url https://api.agents.slng.ai/v1/agents/{agent_id}/duplicate \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "Appointment Reminder Copy"
}
'import requests
url = "https://api.agents.slng.ai/v1/agents/{agent_id}/duplicate"
payload = { "name": "Appointment Reminder Copy" }
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: 'Appointment Reminder Copy'})
};
fetch('https://api.agents.slng.ai/v1/agents/{agent_id}/duplicate', 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.agents.slng.ai/v1/agents/{agent_id}/duplicate",
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' => 'Appointment Reminder Copy'
]),
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.agents.slng.ai/v1/agents/{agent_id}/duplicate"
payload := strings.NewReader("{\n \"name\": \"Appointment Reminder Copy\"\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.agents.slng.ai/v1/agents/{agent_id}/duplicate")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"Appointment Reminder Copy\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.agents.slng.ai/v1/agents/{agent_id}/duplicate")
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\": \"Appointment Reminder Copy\"\n}"
response = http.request(request)
puts response.read_body{
"id": "550e8400-e29b-41d4-a716-446655440000",
"organisation_id": "550e8400-e29b-41d4-a716-446655440000",
"name": "<string>",
"system_prompt": "<string>",
"greeting": "<string>",
"language": "<string>",
"region": "<string>",
"models": {
"stt": "slng/deepgram/nova:3-en",
"llm": "groq/openai/gpt-oss-120b",
"tts": "slng/deepgram/aura:2-en",
"tts_voice": "aura-2-thalia-en",
"stt_kwargs": {},
"llm_kwargs": {},
"tts_kwargs": {},
"fallbacks": {
"stt": [],
"llm": [],
"tts": []
},
"stt_final_timeout_s": 1,
"llm_first_token_timeout_s": 1,
"tts_first_audio_timeout_s": 1,
"failure_audio_enabled": true
},
"idle_nudges": {
"first_nudge_text": "<string>",
"second_nudge_text": "<string>",
"final_hangup_text": "<string>",
"enabled": true,
"first_nudge_delay_seconds": 15,
"second_nudge_delay_seconds": 30,
"hangup_delay_seconds": 15
},
"enable_interruptions": true,
"tool_mode": "legacy",
"tools": [
{}
],
"tool_refs": [
{
"attachment_id": "550e8400-e29b-41d4-a716-446655440000",
"tool_id": "550e8400-e29b-41d4-a716-446655440000",
"version": 2,
"description": "<string>",
"invocation": "model",
"system": {
"triggers": [
{
"event": "call_start",
"source_attachment_id": "550e8400-e29b-41d4-a716-446655440000"
}
],
"arguments": []
},
"execution_policy": {
"pre_action_message": {
"enabled": false,
"text": {
"segments": [
{
"type": "literal",
"value": "<string>"
}
]
},
"wait": false
}
},
"argument_overrides": {},
"config_overrides": {
"type": "api_request",
"url": "<string>"
}
}
],
"mcp_refs": [
{
"attachment_id": "550e8400-e29b-41d4-a716-446655440000",
"server_id": "550e8400-e29b-41d4-a716-446655440000",
"tool_name": "<string>",
"observed_schema_hash": "<string>",
"description": "<string>",
"invocation": "model",
"execution_policy": {
"pre_action_message": {
"enabled": false,
"text": {
"segments": [
{
"type": "literal",
"value": "<string>"
}
]
},
"wait": false
}
},
"argument_overrides": {}
}
],
"livekit_deployment": "<string>",
"template_variables": {},
"created_at": "2026-01-15T10:30:00Z",
"updated_at": "2026-01-15T10:30:00Z",
"inbound_greeting": "<string>",
"outbound_greeting": "<string>",
"models_validation_error": "<string>",
"llm_router_enabled": true,
"sip_inbound_trunk_id": "550e8400-e29b-41d4-a716-446655440000",
"sip_outbound_trunk_id": "550e8400-e29b-41d4-a716-446655440000",
"runtime_variables": [
{
"name": "<string>",
"description": "<string>"
}
],
"deleted_at": "2026-01-15T10:30:00Z"
}{
"detail": "The request could not be processed."
}{
"detail": "Authentication is required for this endpoint."
}{
"detail": "You do not have access to this resource."
}{
"detail": "The requested resource was not found."
}{
"detail": "The requested operation conflicts with the current resource state."
}{
"detail": [
{
"loc": [
"body",
"language"
],
"msg": "Input should be a valid string",
"type": "string_type"
}
]
}{
"detail": "An unexpected internal error occurred."
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Path Parameters
Voice agent ID.
"550e8400-e29b-41d4-a716-446655440000"
Body
Name for the duplicated agent.
255Optional inbound SIP trunk for the duplicate. The inbound connection is never inherited from the source agent; supply this to attach one, and it must be different from the source agent's inbound trunk. Only allowed when the source agent has inbound telephony configured.
"550e8400-e29b-41d4-a716-446655440000"
Optional replacement outbound SIP trunk for the duplicate. When omitted, the source agent's outbound connection is inherited. Only allowed when the source agent has outbound telephony configured.
"550e8400-e29b-41d4-a716-446655440000"
Response
Duplicated agent.
"550e8400-e29b-41d4-a716-446655440000"
"550e8400-e29b-41d4-a716-446655440000"
Model configuration for the agent runtime (STT + LLM + TTS).
Show child attributes
Show child attributes
Optional silence recovery behavior. The runtime can send two follow-up nudges, then speak a final message and hang up.
Show child attributes
Show child attributes
Tool system fixed when the agent was created. New agents use shared.
legacy, shared Legacy compatibility output. New shared agents return an empty array. Use tool_refs and mcp_refs for all new configuration.
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Name of the runtime deployment serving this agent.
Show child attributes
Show child attributes
"2026-01-15T10:30:00Z"
"2026-01-15T10:30:00Z"
Set when the stored models configuration no longer validates against the
current rules. In that case models is returned as stored, without
validation.
Whether the agent's LLM traffic is routed through SLNG's managed LLM routing layer.
"550e8400-e29b-41d4-a716-446655440000"
"550e8400-e29b-41d4-a716-446655440000"
Show child attributes
Show child attributes
"2026-01-15T10:30:00Z"