create an agent
create an agent from a prompt, a greeting and a voice. it starts as a draft (deployed: false) — deploy it before it can take calls or be connected to a number. typing {name} into the prompt or greeting declares an account-wide variable of that name; {{tool_name}} attaches a tool. see GET /v1/voices for what ttsConfig and language may be.
curl --request POST \
--url https://silk-api.rumik.ai/v1/agents \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "support",
"systemInstruction": "You are the support agent for {company}. Be brief and warm. When the caller asks for a human, {{transfer_call}}.",
"greeting": "Hi, this is {company} support. How can I help?",
"ttsConfig": {
"model": "mulberry",
"voice": "Emma",
"description": "a female 30s american voice, normal pitch, warm timbre, conversational pacing, calm and reassuring, professional register, like a customer support agent."
},
"language": "english",
"callSettings": {
"background_noise": {
"enabled": true,
"volume": 30
},
"idle_ladder": {
"enabled": true,
"nudge_after_seconds": 5,
"presence_after_seconds": 7,
"hangup_after_seconds": 5
}
},
"versionName": "first cut"
}
'import requests
url = "https://silk-api.rumik.ai/v1/agents"
payload = {
"name": "support",
"systemInstruction": "You are the support agent for {company}. Be brief and warm. When the caller asks for a human, {{transfer_call}}.",
"greeting": "Hi, this is {company} support. How can I help?",
"ttsConfig": {
"model": "mulberry",
"voice": "Emma",
"description": "a female 30s american voice, normal pitch, warm timbre, conversational pacing, calm and reassuring, professional register, like a customer support agent."
},
"language": "english",
"callSettings": {
"background_noise": {
"enabled": True,
"volume": 30
},
"idle_ladder": {
"enabled": True,
"nudge_after_seconds": 5,
"presence_after_seconds": 7,
"hangup_after_seconds": 5
}
},
"versionName": "first cut"
}
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: 'support',
systemInstruction: 'You are the support agent for {company}. Be brief and warm. When the caller asks for a human, {{transfer_call}}.',
greeting: 'Hi, this is {company} support. How can I help?',
ttsConfig: {
model: 'mulberry',
voice: 'Emma',
description: 'a female 30s american voice, normal pitch, warm timbre, conversational pacing, calm and reassuring, professional register, like a customer support agent.'
},
language: 'english',
callSettings: {
background_noise: {enabled: true, volume: 30},
idle_ladder: {
enabled: true,
nudge_after_seconds: 5,
presence_after_seconds: 7,
hangup_after_seconds: 5
}
},
versionName: 'first cut'
})
};
fetch('https://silk-api.rumik.ai/v1/agents', 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://silk-api.rumik.ai/v1/agents",
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' => 'support',
'systemInstruction' => 'You are the support agent for {company}. Be brief and warm. When the caller asks for a human, {{transfer_call}}.',
'greeting' => 'Hi, this is {company} support. How can I help?',
'ttsConfig' => [
'model' => 'mulberry',
'voice' => 'Emma',
'description' => 'a female 30s american voice, normal pitch, warm timbre, conversational pacing, calm and reassuring, professional register, like a customer support agent.'
],
'language' => 'english',
'callSettings' => [
'background_noise' => [
'enabled' => true,
'volume' => 30
],
'idle_ladder' => [
'enabled' => true,
'nudge_after_seconds' => 5,
'presence_after_seconds' => 7,
'hangup_after_seconds' => 5
]
],
'versionName' => 'first cut'
]),
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://silk-api.rumik.ai/v1/agents"
payload := strings.NewReader("{\n \"name\": \"support\",\n \"systemInstruction\": \"You are the support agent for {company}. Be brief and warm. When the caller asks for a human, {{transfer_call}}.\",\n \"greeting\": \"Hi, this is {company} support. How can I help?\",\n \"ttsConfig\": {\n \"model\": \"mulberry\",\n \"voice\": \"Emma\",\n \"description\": \"a female 30s american voice, normal pitch, warm timbre, conversational pacing, calm and reassuring, professional register, like a customer support agent.\"\n },\n \"language\": \"english\",\n \"callSettings\": {\n \"background_noise\": {\n \"enabled\": true,\n \"volume\": 30\n },\n \"idle_ladder\": {\n \"enabled\": true,\n \"nudge_after_seconds\": 5,\n \"presence_after_seconds\": 7,\n \"hangup_after_seconds\": 5\n }\n },\n \"versionName\": \"first cut\"\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://silk-api.rumik.ai/v1/agents")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"support\",\n \"systemInstruction\": \"You are the support agent for {company}. Be brief and warm. When the caller asks for a human, {{transfer_call}}.\",\n \"greeting\": \"Hi, this is {company} support. How can I help?\",\n \"ttsConfig\": {\n \"model\": \"mulberry\",\n \"voice\": \"Emma\",\n \"description\": \"a female 30s american voice, normal pitch, warm timbre, conversational pacing, calm and reassuring, professional register, like a customer support agent.\"\n },\n \"language\": \"english\",\n \"callSettings\": {\n \"background_noise\": {\n \"enabled\": true,\n \"volume\": 30\n },\n \"idle_ladder\": {\n \"enabled\": true,\n \"nudge_after_seconds\": 5,\n \"presence_after_seconds\": 7,\n \"hangup_after_seconds\": 5\n }\n },\n \"versionName\": \"first cut\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://silk-api.rumik.ai/v1/agents")
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\": \"support\",\n \"systemInstruction\": \"You are the support agent for {company}. Be brief and warm. When the caller asks for a human, {{transfer_call}}.\",\n \"greeting\": \"Hi, this is {company} support. How can I help?\",\n \"ttsConfig\": {\n \"model\": \"mulberry\",\n \"voice\": \"Emma\",\n \"description\": \"a female 30s american voice, normal pitch, warm timbre, conversational pacing, calm and reassuring, professional register, like a customer support agent.\"\n },\n \"language\": \"english\",\n \"callSettings\": {\n \"background_noise\": {\n \"enabled\": true,\n \"volume\": 30\n },\n \"idle_ladder\": {\n \"enabled\": true,\n \"nudge_after_seconds\": 5,\n \"presence_after_seconds\": 7,\n \"hangup_after_seconds\": 5\n }\n },\n \"versionName\": \"first cut\"\n}"
response = http.request(request)
puts response.read_body{
"id": "019f6a2e-7c1d-7b3a-9e4f-1a2b3c4d5e6f",
"ownerUserId": "019f0000-0000-7000-8000-000000000001",
"name": "support",
"systemInstruction": "You are the support agent for {company}. Be brief and warm. When the caller asks for a human, {{transfer_call}}.",
"greeting": "Hi, this is {company} support. How can I help?",
"ttsConfig": {
"model": "mulberry",
"voice": "Emma",
"description": "a female 30s american voice, normal pitch, warm timbre, conversational pacing, calm and reassuring, professional register, like a customer support agent."
},
"callSettings": {
"background_noise": {
"enabled": true,
"volume": 30
},
"idle_ladder": {
"enabled": true,
"nudge_after_seconds": 5,
"presence_after_seconds": 7,
"hangup_after_seconds": 5
}
},
"language": "english",
"source": "scratch",
"templateSlug": null,
"handle": "ua_fe3277d8",
"inboundPhoneNumber": null,
"deployed": false,
"createdAt": "2026-09-11T10:00:00Z",
"updatedAt": "2026-09-11T10:00:00Z"
}{
"error": "Invalid API key",
"code": "unauthorized"
}{
"error": "This API key lacks the 'agent' scope",
"code": "forbidden_scope"
}{
"error": "You can create up to 25 agents",
"code": "limit_exceeded"
}{
"error": "body.toNumber: must be an E.164 phone number, e.g. +14155551234",
"code": "invalid_request",
"details": [
{
"loc": "body.toNumber",
"message": "must be an E.164 phone number, e.g. +14155551234"
}
]
}{
"error": "Rate limit exceeded",
"code": "rate_limited",
"limit": 100,
"current": 101
}Authorizations
your rumik api key, e.g. rk_live_.... create one in the rumik dashboard.
Body
the body of POST /v1/agents.
the agent's name, up to 120 characters.
120the persona — what the agent is, how it behaves. up to 8000 characters. {name} reads a variable, {{tool_name}} attaches a tool. the language and voice rules are added server-side; do not write them.
8000the first thing the agent says. up to 1000 characters; may use {name} variables.
1000call behaviour: background_noise mixes a quiet room tone under the voice; idle_ladder nudges a silent caller and ends the call if they stay silent. both off by default.
Show child attributes
Show child attributes
the voice: model (muga | mulberry | spider), and for mulberry a named voice and a style description. see GET /v1/voices. default {"model": "muga"}.
Show child attributes
Show child attributes
conversation language for the chosen voice — english, hinglish or hindi (see GET /v1/voices for what each engine offers). unset = the engine's default.
scratch (default) or template.
the template this agent was created from, when source is template.
40a name for the v1 this agent is seeded with, e.g. first cut.
120Response
created.
an agent as the account sees it: identity plus the live configuration.
the agent's UUID.
your account id.
the persona the live version answers with. a pending draft is under GET /v1/agents/{agent_ref}/versions/draft.
the live greeting.
the live voice config.
Show child attributes
Show child attributes
scratch or template.
the agent's short public handle (ua_…). accepted wherever an agent is named.
when the agent was created.
the last save (draft edits included).
the live call behaviour.
Show child attributes
Show child attributes
the live conversation language, or null for the engine's default.
the template it was created from, if any.
the E.164 number this agent answers (a rented number or a SIP trunk connected to it), or null.
true once a version has been deployed. until then the agent answers no calls and cannot be connected to a number.
curl --request POST \
--url https://silk-api.rumik.ai/v1/agents \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "support",
"systemInstruction": "You are the support agent for {company}. Be brief and warm. When the caller asks for a human, {{transfer_call}}.",
"greeting": "Hi, this is {company} support. How can I help?",
"ttsConfig": {
"model": "mulberry",
"voice": "Emma",
"description": "a female 30s american voice, normal pitch, warm timbre, conversational pacing, calm and reassuring, professional register, like a customer support agent."
},
"language": "english",
"callSettings": {
"background_noise": {
"enabled": true,
"volume": 30
},
"idle_ladder": {
"enabled": true,
"nudge_after_seconds": 5,
"presence_after_seconds": 7,
"hangup_after_seconds": 5
}
},
"versionName": "first cut"
}
'import requests
url = "https://silk-api.rumik.ai/v1/agents"
payload = {
"name": "support",
"systemInstruction": "You are the support agent for {company}. Be brief and warm. When the caller asks for a human, {{transfer_call}}.",
"greeting": "Hi, this is {company} support. How can I help?",
"ttsConfig": {
"model": "mulberry",
"voice": "Emma",
"description": "a female 30s american voice, normal pitch, warm timbre, conversational pacing, calm and reassuring, professional register, like a customer support agent."
},
"language": "english",
"callSettings": {
"background_noise": {
"enabled": True,
"volume": 30
},
"idle_ladder": {
"enabled": True,
"nudge_after_seconds": 5,
"presence_after_seconds": 7,
"hangup_after_seconds": 5
}
},
"versionName": "first cut"
}
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: 'support',
systemInstruction: 'You are the support agent for {company}. Be brief and warm. When the caller asks for a human, {{transfer_call}}.',
greeting: 'Hi, this is {company} support. How can I help?',
ttsConfig: {
model: 'mulberry',
voice: 'Emma',
description: 'a female 30s american voice, normal pitch, warm timbre, conversational pacing, calm and reassuring, professional register, like a customer support agent.'
},
language: 'english',
callSettings: {
background_noise: {enabled: true, volume: 30},
idle_ladder: {
enabled: true,
nudge_after_seconds: 5,
presence_after_seconds: 7,
hangup_after_seconds: 5
}
},
versionName: 'first cut'
})
};
fetch('https://silk-api.rumik.ai/v1/agents', 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://silk-api.rumik.ai/v1/agents",
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' => 'support',
'systemInstruction' => 'You are the support agent for {company}. Be brief and warm. When the caller asks for a human, {{transfer_call}}.',
'greeting' => 'Hi, this is {company} support. How can I help?',
'ttsConfig' => [
'model' => 'mulberry',
'voice' => 'Emma',
'description' => 'a female 30s american voice, normal pitch, warm timbre, conversational pacing, calm and reassuring, professional register, like a customer support agent.'
],
'language' => 'english',
'callSettings' => [
'background_noise' => [
'enabled' => true,
'volume' => 30
],
'idle_ladder' => [
'enabled' => true,
'nudge_after_seconds' => 5,
'presence_after_seconds' => 7,
'hangup_after_seconds' => 5
]
],
'versionName' => 'first cut'
]),
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://silk-api.rumik.ai/v1/agents"
payload := strings.NewReader("{\n \"name\": \"support\",\n \"systemInstruction\": \"You are the support agent for {company}. Be brief and warm. When the caller asks for a human, {{transfer_call}}.\",\n \"greeting\": \"Hi, this is {company} support. How can I help?\",\n \"ttsConfig\": {\n \"model\": \"mulberry\",\n \"voice\": \"Emma\",\n \"description\": \"a female 30s american voice, normal pitch, warm timbre, conversational pacing, calm and reassuring, professional register, like a customer support agent.\"\n },\n \"language\": \"english\",\n \"callSettings\": {\n \"background_noise\": {\n \"enabled\": true,\n \"volume\": 30\n },\n \"idle_ladder\": {\n \"enabled\": true,\n \"nudge_after_seconds\": 5,\n \"presence_after_seconds\": 7,\n \"hangup_after_seconds\": 5\n }\n },\n \"versionName\": \"first cut\"\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://silk-api.rumik.ai/v1/agents")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"support\",\n \"systemInstruction\": \"You are the support agent for {company}. Be brief and warm. When the caller asks for a human, {{transfer_call}}.\",\n \"greeting\": \"Hi, this is {company} support. How can I help?\",\n \"ttsConfig\": {\n \"model\": \"mulberry\",\n \"voice\": \"Emma\",\n \"description\": \"a female 30s american voice, normal pitch, warm timbre, conversational pacing, calm and reassuring, professional register, like a customer support agent.\"\n },\n \"language\": \"english\",\n \"callSettings\": {\n \"background_noise\": {\n \"enabled\": true,\n \"volume\": 30\n },\n \"idle_ladder\": {\n \"enabled\": true,\n \"nudge_after_seconds\": 5,\n \"presence_after_seconds\": 7,\n \"hangup_after_seconds\": 5\n }\n },\n \"versionName\": \"first cut\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://silk-api.rumik.ai/v1/agents")
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\": \"support\",\n \"systemInstruction\": \"You are the support agent for {company}. Be brief and warm. When the caller asks for a human, {{transfer_call}}.\",\n \"greeting\": \"Hi, this is {company} support. How can I help?\",\n \"ttsConfig\": {\n \"model\": \"mulberry\",\n \"voice\": \"Emma\",\n \"description\": \"a female 30s american voice, normal pitch, warm timbre, conversational pacing, calm and reassuring, professional register, like a customer support agent.\"\n },\n \"language\": \"english\",\n \"callSettings\": {\n \"background_noise\": {\n \"enabled\": true,\n \"volume\": 30\n },\n \"idle_ladder\": {\n \"enabled\": true,\n \"nudge_after_seconds\": 5,\n \"presence_after_seconds\": 7,\n \"hangup_after_seconds\": 5\n }\n },\n \"versionName\": \"first cut\"\n}"
response = http.request(request)
puts response.read_body{
"id": "019f6a2e-7c1d-7b3a-9e4f-1a2b3c4d5e6f",
"ownerUserId": "019f0000-0000-7000-8000-000000000001",
"name": "support",
"systemInstruction": "You are the support agent for {company}. Be brief and warm. When the caller asks for a human, {{transfer_call}}.",
"greeting": "Hi, this is {company} support. How can I help?",
"ttsConfig": {
"model": "mulberry",
"voice": "Emma",
"description": "a female 30s american voice, normal pitch, warm timbre, conversational pacing, calm and reassuring, professional register, like a customer support agent."
},
"callSettings": {
"background_noise": {
"enabled": true,
"volume": 30
},
"idle_ladder": {
"enabled": true,
"nudge_after_seconds": 5,
"presence_after_seconds": 7,
"hangup_after_seconds": 5
}
},
"language": "english",
"source": "scratch",
"templateSlug": null,
"handle": "ua_fe3277d8",
"inboundPhoneNumber": null,
"deployed": false,
"createdAt": "2026-09-11T10:00:00Z",
"updatedAt": "2026-09-11T10:00:00Z"
}{
"error": "Invalid API key",
"code": "unauthorized"
}{
"error": "This API key lacks the 'agent' scope",
"code": "forbidden_scope"
}{
"error": "You can create up to 25 agents",
"code": "limit_exceeded"
}{
"error": "body.toNumber: must be an E.164 phone number, e.g. +14155551234",
"code": "invalid_request",
"details": [
{
"loc": "body.toNumber",
"message": "must be an E.164 phone number, e.g. +14155551234"
}
]
}{
"error": "Rate limit exceeded",
"code": "rate_limited",
"limit": 100,
"current": 101
}