Update an agent
Change any setting on the agent’s working draft, or rename any version.
Choosing the version
?version=3 changes that version — the mirror of GET /v1/agents/{id}?version=3,
so reading and writing take the same selector.
409 version_immutable, whether you name it
by number or as live: it is frozen, which is what makes a rollback exact.
Renaming a version
label and notes go in the same body. They name the version the change lands on, and they are
not configuration, so they apply to any version - a published one included:
Where the change lands
On the agent’s working draft — and which one that is has to be unambiguous, because we will not guess on your behalf:Editing safely from two places
SendIf-Match with the document_revision you read, and a write composed against a stale copy is
refused with 409 version_document_stale rather than overwriting someone else’s change.
Authorizations
Your API key as a Bearer token, e.g. Authorization: Bearer vk_….
Headers
The document_revision this change was composed against. Omit to write against whatever the draft holds now.
Path Parameters
The agent's id, as GET /v1/agents returns it.
Query Parameters
Which version to change, by number — e.g. 3. Omit to change the agent's working draft. A published version is refused: its configuration is frozen.
Body
Change any setting. Merge-patch: objects merge, lists replace whole, null clears.
Applies to the agent's newest draft. If the newest version is published, a draft is branched from the live version first — a published version's configuration cannot change.
What the agent is called. Yours to choose; never spoken to a caller.
1 - 255The 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.
1 - 65536What the agent says first.
The language it opens in, which others it may switch to, and what triggers a switch.
Speech recognition. GET /v1/transcribers lists valid model values.
The LLM. GET /v1/models lists valid model and provider values.
Text to speech. GET /v1/voices lists valid voice_id values, and a voice that cannot speak language.default is refused on save.
Turn-taking, interruption and noise handling — how it behaves in the back-and-forth.
Limits on the call itself: maximum duration, silence timeout, and what ends it.
Lines for inbound calls that cannot be handled normally.
The tools Vocily ships: end the call, hold, transfer, send a WhatsApp template. Each still has to be armed from the prompt.
The {{placeholders}} the prompt and tools can use. Reference them namespaced as {{custom.your_key}}, never bare. Sending this list replaces the whole set.
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.
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.
Whether the agent remembers callers between calls, and what it is allowed to remember.
Which phone and WhatsApp numbers this agent answers on. GET /v1/numbers and GET /v1/whatsapp/numbers list what you may use.
Short name for the version this change lands on. Editable on a published version too.
80Longer free text for the version this change lands on. Editable on a published version too.
Response
The version the change landed on, after it — the working draft, or the one ?version= named.
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.
The agent's id. Stable across every version.
What the agent is called. Yours to choose; never spoken to a caller.
Which version this body describes. 0-based, and the identity you use in /versions/{n} and ?version=.
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.
True once frozen. A published version's configuration can never be edited again; branch a draft instead.
True if this is the version answering calls right now.
The highest version number this agent has.
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.
When this version was created (UTC, ISO 8601).
When this version was last edited (UTC, ISO 8601).
Which version is live, if any. null means the agent is off air and answers nothing.
Short name for this version, e.g. Shorter greeting. Editable even after publishing — it is metadata, not configuration.
Longer free text about this version.
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.
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.
What the agent says first.
The language it opens in, which others it may switch to, and what triggers a switch.
Speech recognition. GET /v1/transcribers lists valid model values.
The LLM. GET /v1/models lists valid model and provider values.
Text to speech. GET /v1/voices lists valid voice_id values, and a voice that cannot speak language.default is refused on save.
Turn-taking, interruption and noise handling — how it behaves in the back-and-forth.
Limits on the call itself: maximum duration, silence timeout, and what ends it.
Lines for inbound calls that cannot be handled normally.
The tools Vocily ships: end the call, hold, transfer, send a WhatsApp template. Each still has to be armed from the prompt.
The {{placeholders}} the prompt and tools can use. Reference them namespaced as {{custom.your_key}}, never bare.
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.
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.
Whether the agent remembers callers between calls, and what it is allowed to remember.
Which phone and WhatsApp numbers this agent answers on. GET /v1/numbers and GET /v1/whatsapp/numbers list what you may use.
Deep link to this agent in the Vocily dashboard, for your own UI to link out to.