Skip to main content
Create Agent
A new agent is created as an unpublished draft (V0). It answers no calls until you publish a version and make it live — both explicit, both deliberate.

The smallest useful request

Everything you leave out takes the platform default: Hindi with English alongside it, a Vocily voice, gpt-5.4-nano, Sarvam speech recognition, the eleven system messages, and the Default Analysis group.

Writing the prompt

Three headings structure it, and they are the same three boxes the dashboard shows: ## Agent Purpose, ## Response Style, ## Call Flow. A prompt with no headings is treated as Agent Purpose. Four kinds of token do work inside it:
Tools are built in the dashboard, not here. This body neither accepts nor returns them. Naming one the agent does not have is rejected with prompt_tool_reference_invalid, so create the tool on the agent’s Tools tab first, then write a prompt that arms it.

Picking values you cannot guess

A voice provider must be able to speak language.default, or the agent is refused with voice_config_invalid — an agent that saved but could not speak would fail every call. TTS capabilities says which provider covers which language.

Authorizations

Authorization
string
header
required

Your API key as a Bearer token, e.g. Authorization: Bearer vk_….

Body

application/json

Create an agent, fully configured, in one request.

name is the only required field — everything else takes the platform default, so the smallest useful body is a name, a prompt and a greeting. The agent is created as an unpublished draft (V0): it answers nothing until you publish a version and make it live, which stays two explicit calls.

name
string
required

What the agent is called. The one required field. Never spoken to a caller.

Required string length: 1 - 255
system_prompt
string | null

The agent's instructions. Naming a tool as <tool_name> here is what ARMS it: a tool the prompt never names is never called, and naming one the version does not have is refused on save.

Required string length: 1 - 65536
greeting
Greeting · object | null

What the agent says first.

language
LanguageConfig · object | null

The language it opens in, which others it may switch to, and what triggers a switch.

transcriber
Transcriber · object | null

Speech recognition. GET /v1/transcribers lists valid model values.

model
Model · object | null

The LLM. GET /v1/models lists valid model and provider values.

voice
Voice · object | null

Text to speech. GET /v1/voices lists valid voice_id values, and a voice that cannot speak language.default is refused on save.

conversation
Conversation · object | null

Turn-taking, interruption and noise handling — how it behaves in the back-and-forth.

call
CallSettings · object | null

Limits on the call itself: maximum duration, silence timeout, and what ends it.

inbound
Inbound · object | null

Lines for inbound calls that cannot be handled normally.

builtin_tools
BuiltinTools · object | null

The tools Vocily ships: end the call, hold, transfer, send a WhatsApp template. Each still has to be armed from the prompt.

variables
RuntimeVariable · object[] | null

The {{placeholders}} the prompt and tools can use. Reference them namespaced as {{custom.your_key}}, never bare. Sending this list replaces the whole set.

knowledge_base_ids
string[] | null

Which knowledge bases this agent can search, from GET /v1/knowledge-bases. This list IS the attachment — there is no separate attach endpoint, and sending it replaces the whole set. An id this workspace does not hold is refused, not ignored.

analysis_group_ids
string[] | null

Which custom-analysis groups run after each call, from GET /v1/custom-analysis. The list is the attachment, and an id this workspace does not hold is refused, not ignored.

memory
Memory · object | null

Whether the agent remembers callers between calls, and what it is allowed to remember.

numbers
Numbers · object | null

Which phone and WhatsApp numbers this agent answers on. GET /v1/numbers and GET /v1/whatsapp/numbers list what you may use.

Response

The created agent, at its V0 draft. It answers no calls until a version is published and made live.

One agent at one version — the response of every agent read, create and update.

A request body is this same object minus the read-only fields, so what you send is what you read back.

id
string
required

The agent's id. Stable across every version.

name
string
required

What the agent is called. Yours to choose; never spoken to a caller.

version
integer
required

Which version this body describes. 0-based, and the identity you use in /versions/{n} and ?version=.

version_id
string
required

This version's uuid. Pass it as agent_version_id on POST /v1/calls to pin a call to this exact version — that field takes a uuid, not a number.

is_published
boolean
required

True once frozen. A published version's configuration can never be edited again; branch a draft instead.

is_live
boolean
required

True if this is the version answering calls right now.

latest_version
integer
required

The highest version number this agent has.

document_revision
integer
required

This version's edit counter. Echo it back as If-Match on your next write and the write becomes a compare-and-set, so you cannot silently overwrite an edit made between your read and your write.

created_at
string<date-time>
required

When this version was created (UTC, ISO 8601).

updated_at
string<date-time>
required

When this version was last edited (UTC, ISO 8601).

live_version
integer | null

Which version is live, if any. null means the agent is off air and answers nothing.

label
string | null

Short name for this version, e.g. Shorter greeting. Editable even after publishing — it is metadata, not configuration.

notes
string | null

Longer free text about this version.

blocked_reasons
string[]

Why this version cannot be made live, if it cannot — e.g. it pins a model that has since been retired. Empty means it can go live.

system_prompt
string | null

The agent's instructions. Naming a tool as <tool_name> here is what ARMS it: a tool the prompt never names is never called, and naming one the version does not have is refused on save.

greeting
Greeting · object | null

What the agent says first.

language
LanguageConfig · object | null

The language it opens in, which others it may switch to, and what triggers a switch.

transcriber
Transcriber · object | null

Speech recognition. GET /v1/transcribers lists valid model values.

model
Model · object | null

The LLM. GET /v1/models lists valid model and provider values.

voice
Voice · object | null

Text to speech. GET /v1/voices lists valid voice_id values, and a voice that cannot speak language.default is refused on save.

conversation
Conversation · object | null

Turn-taking, interruption and noise handling — how it behaves in the back-and-forth.

call
CallSettings · object | null

Limits on the call itself: maximum duration, silence timeout, and what ends it.

inbound
Inbound · object | null

Lines for inbound calls that cannot be handled normally.

builtin_tools
BuiltinTools · object | null

The tools Vocily ships: end the call, hold, transfer, send a WhatsApp template. Each still has to be armed from the prompt.

variables
RuntimeVariable · object[]

The {{placeholders}} the prompt and tools can use. Reference them namespaced as {{custom.your_key}}, never bare.

knowledge_base_ids
string[]

Which knowledge bases this agent can search, from GET /v1/knowledge-bases. This list IS the attachment — there is no separate attach endpoint, and sending it replaces the whole set. An id this workspace does not hold is refused, not ignored.

analysis_group_ids
string[]

Which custom-analysis groups run after each call, from GET /v1/custom-analysis. Same rule as knowledge_base_ids: the list is the attachment, and an id this workspace does not hold is refused, not ignored.

memory
Memory · object | null

Whether the agent remembers callers between calls, and what it is allowed to remember.

numbers
Numbers · object | null

Which phone and WhatsApp numbers this agent answers on. GET /v1/numbers and GET /v1/whatsapp/numbers list what you may use.

dashboard_url
string | null

Deep link to this agent in the Vocily dashboard, for your own UI to link out to.