Update Agent Version
curl --request POST \
--url https://api.velt.dev/v2/agents/version/update \
--header 'Content-Type: application/json' \
--header 'x-velt-api-key: <x-velt-api-key>' \
--header 'x-velt-auth-token: <x-velt-auth-token>' \
--data '
{
"data": {
"agentId": "<string>",
"rawInstructions": "<string>",
"instructions": "<string>",
"phaseTimeoutMs": 123,
"metadata": {},
"contextGathering": {},
"execution": {},
"response": {},
"postProcess": {},
"input": {},
"scope": {},
"setup": {}
}
}
'import requests
url = "https://api.velt.dev/v2/agents/version/update"
payload = { "data": {
"agentId": "<string>",
"rawInstructions": "<string>",
"instructions": "<string>",
"phaseTimeoutMs": 123,
"metadata": {},
"contextGathering": {},
"execution": {},
"response": {},
"postProcess": {},
"input": {},
"scope": {},
"setup": {}
} }
headers = {
"x-velt-api-key": "<x-velt-api-key>",
"x-velt-auth-token": "<x-velt-auth-token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'x-velt-api-key': '<x-velt-api-key>',
'x-velt-auth-token': '<x-velt-auth-token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
data: {
agentId: '<string>',
rawInstructions: '<string>',
instructions: '<string>',
phaseTimeoutMs: 123,
metadata: {},
contextGathering: {},
execution: {},
response: {},
postProcess: {},
input: {},
scope: {},
setup: {}
}
})
};
fetch('https://api.velt.dev/v2/agents/version/update', 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.velt.dev/v2/agents/version/update",
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([
'data' => [
'agentId' => '<string>',
'rawInstructions' => '<string>',
'instructions' => '<string>',
'phaseTimeoutMs' => 123,
'metadata' => [
],
'contextGathering' => [
],
'execution' => [
],
'response' => [
],
'postProcess' => [
],
'input' => [
],
'scope' => [
],
'setup' => [
]
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-velt-api-key: <x-velt-api-key>",
"x-velt-auth-token: <x-velt-auth-token>"
],
]);
$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.velt.dev/v2/agents/version/update"
payload := strings.NewReader("{\n \"data\": {\n \"agentId\": \"<string>\",\n \"rawInstructions\": \"<string>\",\n \"instructions\": \"<string>\",\n \"phaseTimeoutMs\": 123,\n \"metadata\": {},\n \"contextGathering\": {},\n \"execution\": {},\n \"response\": {},\n \"postProcess\": {},\n \"input\": {},\n \"scope\": {},\n \"setup\": {}\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-velt-api-key", "<x-velt-api-key>")
req.Header.Add("x-velt-auth-token", "<x-velt-auth-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.velt.dev/v2/agents/version/update")
.header("x-velt-api-key", "<x-velt-api-key>")
.header("x-velt-auth-token", "<x-velt-auth-token>")
.header("Content-Type", "application/json")
.body("{\n \"data\": {\n \"agentId\": \"<string>\",\n \"rawInstructions\": \"<string>\",\n \"instructions\": \"<string>\",\n \"phaseTimeoutMs\": 123,\n \"metadata\": {},\n \"contextGathering\": {},\n \"execution\": {},\n \"response\": {},\n \"postProcess\": {},\n \"input\": {},\n \"scope\": {},\n \"setup\": {}\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.velt.dev/v2/agents/version/update")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-velt-api-key"] = '<x-velt-api-key>'
request["x-velt-auth-token"] = '<x-velt-auth-token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"data\": {\n \"agentId\": \"<string>\",\n \"rawInstructions\": \"<string>\",\n \"instructions\": \"<string>\",\n \"phaseTimeoutMs\": 123,\n \"metadata\": {},\n \"contextGathering\": {},\n \"execution\": {},\n \"response\": {},\n \"postProcess\": {},\n \"input\": {},\n \"scope\": {},\n \"setup\": {}\n }\n}"
response = http.request(request)
puts response.read_body{
"result": {
"status": "success",
"message": "Agent version created successfully",
"data": {
"version": 4
}
}
}
Versioning
Update Agent Version
POST
/
v2
/
agents
/
version
/
update
Update Agent Version
curl --request POST \
--url https://api.velt.dev/v2/agents/version/update \
--header 'Content-Type: application/json' \
--header 'x-velt-api-key: <x-velt-api-key>' \
--header 'x-velt-auth-token: <x-velt-auth-token>' \
--data '
{
"data": {
"agentId": "<string>",
"rawInstructions": "<string>",
"instructions": "<string>",
"phaseTimeoutMs": 123,
"metadata": {},
"contextGathering": {},
"execution": {},
"response": {},
"postProcess": {},
"input": {},
"scope": {},
"setup": {}
}
}
'import requests
url = "https://api.velt.dev/v2/agents/version/update"
payload = { "data": {
"agentId": "<string>",
"rawInstructions": "<string>",
"instructions": "<string>",
"phaseTimeoutMs": 123,
"metadata": {},
"contextGathering": {},
"execution": {},
"response": {},
"postProcess": {},
"input": {},
"scope": {},
"setup": {}
} }
headers = {
"x-velt-api-key": "<x-velt-api-key>",
"x-velt-auth-token": "<x-velt-auth-token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'x-velt-api-key': '<x-velt-api-key>',
'x-velt-auth-token': '<x-velt-auth-token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
data: {
agentId: '<string>',
rawInstructions: '<string>',
instructions: '<string>',
phaseTimeoutMs: 123,
metadata: {},
contextGathering: {},
execution: {},
response: {},
postProcess: {},
input: {},
scope: {},
setup: {}
}
})
};
fetch('https://api.velt.dev/v2/agents/version/update', 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.velt.dev/v2/agents/version/update",
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([
'data' => [
'agentId' => '<string>',
'rawInstructions' => '<string>',
'instructions' => '<string>',
'phaseTimeoutMs' => 123,
'metadata' => [
],
'contextGathering' => [
],
'execution' => [
],
'response' => [
],
'postProcess' => [
],
'input' => [
],
'scope' => [
],
'setup' => [
]
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-velt-api-key: <x-velt-api-key>",
"x-velt-auth-token: <x-velt-auth-token>"
],
]);
$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.velt.dev/v2/agents/version/update"
payload := strings.NewReader("{\n \"data\": {\n \"agentId\": \"<string>\",\n \"rawInstructions\": \"<string>\",\n \"instructions\": \"<string>\",\n \"phaseTimeoutMs\": 123,\n \"metadata\": {},\n \"contextGathering\": {},\n \"execution\": {},\n \"response\": {},\n \"postProcess\": {},\n \"input\": {},\n \"scope\": {},\n \"setup\": {}\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-velt-api-key", "<x-velt-api-key>")
req.Header.Add("x-velt-auth-token", "<x-velt-auth-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.velt.dev/v2/agents/version/update")
.header("x-velt-api-key", "<x-velt-api-key>")
.header("x-velt-auth-token", "<x-velt-auth-token>")
.header("Content-Type", "application/json")
.body("{\n \"data\": {\n \"agentId\": \"<string>\",\n \"rawInstructions\": \"<string>\",\n \"instructions\": \"<string>\",\n \"phaseTimeoutMs\": 123,\n \"metadata\": {},\n \"contextGathering\": {},\n \"execution\": {},\n \"response\": {},\n \"postProcess\": {},\n \"input\": {},\n \"scope\": {},\n \"setup\": {}\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.velt.dev/v2/agents/version/update")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-velt-api-key"] = '<x-velt-api-key>'
request["x-velt-auth-token"] = '<x-velt-auth-token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"data\": {\n \"agentId\": \"<string>\",\n \"rawInstructions\": \"<string>\",\n \"instructions\": \"<string>\",\n \"phaseTimeoutMs\": 123,\n \"metadata\": {},\n \"contextGathering\": {},\n \"execution\": {},\n \"response\": {},\n \"postProcess\": {},\n \"input\": {},\n \"scope\": {},\n \"setup\": {}\n }\n}"
response = http.request(request)
puts response.read_body{
"result": {
"status": "success",
"message": "Agent version created successfully",
"data": {
"version": 4
}
}
}
Use this API to update behavioral/version fields. This creates a new version N+1 in the versions subcollection and bumps the
Errors:
version pointer on the root document. Only supported for custom agents.
In-flight executions stay pinned to whatever version they started on, so updating a version never disturbs a running execution.
The schema uses .passthrough(), so additional behavioral fields are forwarded to the service layer.
The merge is one level deep. Each top-level block you send (
contextGathering, execution, response, postProcess, input, scope, setup) is merged onto its stored counterpart, but anything nested inside is replaced wholesale, not merged.So sending { "scope": { "crossPage": { "enabled": false, "targetProperty": "brandConsistency", "pageDiscovery": "auto" } } } does not just flip enabled. It replaces the whole crossPage object, silently discarding the stored pages list and sourceOfTruthKnowledgeSourceId, and returns 200. Nothing warns you. The same applies to execution.mcpServers, input.userContextFields, and contextGathering.strategyOptions: send the complete nested object every time, not just the keys you want to change.Drop a required key and you get the louder failure instead: { "scope": { "crossPage": { "enabled": false } } } is rejected with INVALID_ARGUMENT, because targetProperty and pageDiscovery are required whenever crossPage is present.Fetch the current config with Get Agent first, apply your change to the full nested object, and send that. Read the credential warning below before you do.Never send a redacted secret back. Get Agent returns auth secrets as the literal string
"__redacted__". This endpoint has no special handling for that value, so a fetch-modify-send round trip stores "__redacted__" as the real credential and the server starts failing authentication at execution time, not at update time.To change something else on an agent that has stored secrets, either omit execution.mcpServers and contextGathering.strategyOptions from your patch entirely, or re-send every object with its real plaintext secret. Rotating a secret is the same operation: send the new plaintext value.Endpoint
POST https://api.velt.dev/v2/agents/version/update
Headers
string
required
Your API key.
string
required
Your Auth Token.
Body
Params
object
required
Show properties
Show properties
string
required
Custom agent ID.
string
Original user-provided instructions.
string
Processed/enhanced instructions.
number
Per-phase timeout in milliseconds. Positive integer, no upper bound. Omit to use the platform default.
object
Arbitrary client metadata. Replaces the stored object rather than merging into it.
object
Context gathering config. Same shape as Create Agent.
object
Execution config, including
executionStrategy, the strict knowledge (Memory-RAG) block, and mcpServers for the "mcp-tools" strategy. Same shape as Create Agent.Rotate an MCP or REST auth secret by sending the new plaintext value here. Because mcpServers is an array, sending it replaces the stored array in full: a server object sent without its auth block loses the stored secret. To keep existing secrets, either omit mcpServers entirely or re-send every server object with its real plaintext secret. Re-sending the "__redacted__" placeholder from a Get Agent response stores that string as the credential.object
Response formatting config. Same shape as Create Agent.
object
Post-processing pipeline config. Same shape as Create Agent.
object
Input declaration config. Same shape as Create Agent.
object
Scope and targeting config. Same shape as Create Agent.
object
Setup assistant metadata. Same shape as Create Agent.
Example Requests
1. Update instructions and post-processing
{
"data": {
"agentId": "abc123def456",
"instructions": "Check headings use 'Inter' font. Verify #1A73E8 on all CTAs and links.",
"postProcess": {
"guardrails": { "enabled": true },
"deletePreviousSuggestions": { "enabled": true }
}
}
}
2. Update context gathering strategies
{
"data": {
"agentId": "abc123def456",
"contextGathering": {
"strategies": ["web-page-text", "web-page-html", "web-page-screenshot"]
}
}
}
3. Enable cross-page via scope
{
"data": {
"agentId": "abc123def456",
"scope": {
"crossPage": {
"enabled": true,
"targetProperty": "brandConsistency",
"pageDiscovery": "manual",
"pages": ["https://example.com", "https://example.com/about"]
}
}
}
}
Response
Success Response
{
"result": {
"status": "success",
"message": "Agent version created successfully",
"data": {
"version": 4
}
}
}
| Field | Type | Description |
|---|---|---|
data.version | number | New version number after the update |
Failure Response
{
"error": {
"message": "ERROR_MESSAGE",
"status": "INVALID_ARGUMENT"
}
}
INVALID_ARGUMENT (validation failure, including a nested block that lost required fields to the one-level merge, or blanking instructions on an agent whose effective executionStrategy still requires a prompt) / NOT_FOUND (agent does not exist).
instructions is re-validated against the merged result, not against your patch alone. The merged instructions must be non-empty whenever the merged executionStrategy is "ai", "service+ai", "stagehand-agent", or "mcp-tools". Whitespace-only counts as empty.So clearing instructions on an existing AI agent is rejected, even though the field is optional on this endpoint.{
"result": {
"status": "success",
"message": "Agent version created successfully",
"data": {
"version": 4
}
}
}
Was this page helpful?
⌘I

