curl --request PATCH \
--url https://api.{environment}.corti.app/v2/agentic/agents/{agentId} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/merge-patch+json' \
--header 'Tenant-Name: <api-key>' \
--data '
{
"name": "coder-v2",
"model": null,
"connectors": [
{
"type": "registry",
"name": "pubmed-expert"
}
]
}
'import { CortiClient, CortiEnvironment } from "@corti/sdk";
const client = new CortiClient({
environment: CortiEnvironment.Eu,
auth: {
clientId: "YOUR_CLIENT_ID",
clientSecret: "YOUR_CLIENT_SECRET"
},
tenantName: "YOUR_TENANT_NAME"
});
await client.agentic.agents.update("agt.0192f4c8-2c5a-7b3e-9f1a-3c8d6e2b7a40", {
name: "coder-v2",
connectors: [{
type: "registry",
name: "pubmed-expert"
}]
});
using Corti.Agentic;
using Corti;
var client = new CortiClient(
"TENANT_NAME",
CortiClientEnvironment.Eu,
new CortiClientAuth.ClientCredentials("client_id", "client_secret")
);
await client.Agentic.Agents.UpdateAsync(
"agt.0192f4c8-2c5a-7b3e-9f1a-3c8d6e2b7a40",
new AgenticAgentsPatchRequest
{
Name = "coder-v2",
Connectors = new List<CommonConnectorCreateRequest>()
{
new CommonRegistryConnectorCreate { Name = "pubmed-expert" },
},
}
);
import requests
url = "https://api.{environment}.corti.app/v2/agentic/agents/{agentId}"
payload = {
"name": "coder-v2",
"model": None,
"connectors": [
{
"type": "registry",
"name": "pubmed-expert"
}
]
}
headers = {
"Authorization": "Bearer <token>",
"Tenant-Name": "<api-key>",
"Content-Type": "application/merge-patch+json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.{environment}.corti.app/v2/agentic/agents/{agentId}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'name' => 'coder-v2',
'model' => null,
'connectors' => [
[
'type' => 'registry',
'name' => 'pubmed-expert'
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/merge-patch+json",
"Tenant-Name: <api-key>"
],
]);
$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.{environment}.corti.app/v2/agentic/agents/{agentId}"
payload := strings.NewReader("{\n \"name\": \"coder-v2\",\n \"model\": null,\n \"connectors\": [\n {\n \"type\": \"registry\",\n \"name\": \"pubmed-expert\"\n }\n ]\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Tenant-Name", "<api-key>")
req.Header.Add("Content-Type", "application/merge-patch+json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.patch("https://api.{environment}.corti.app/v2/agentic/agents/{agentId}")
.header("Authorization", "Bearer <token>")
.header("Tenant-Name", "<api-key>")
.header("Content-Type", "application/merge-patch+json")
.body("{\n \"name\": \"coder-v2\",\n \"model\": null,\n \"connectors\": [\n {\n \"type\": \"registry\",\n \"name\": \"pubmed-expert\"\n }\n ]\n}")
.asString();{
"id": "agt.0192f4c8-2c5a-7b3e-9f1a-3c8d6e2b7a40",
"name": "coder",
"description": "Returns ICD-10 codes for a clinical encounter.",
"systemPrompt": "Respond with only the ICD-10 code.",
"model": "corti-default",
"maxLoops": 10,
"visibility": "private",
"lifecycle": "persistent",
"connectors": [
{
"id": "con.0192f4c8-7baf-7083-a46f-81d2bd70cf95",
"type": "registry",
"name": "pubmed-expert"
}
],
"labels": {
"team": "coding",
"env": "prod"
},
"createdAt": "2026-05-19T12:00:00Z",
"updatedAt": "2026-05-19T12:00:00Z",
"createdBy": "usr.0192f4c8-8bc0-7194-8570-92e3ce81d0a6",
"expiresAt": null
}{
"error": {
"code": "ASSIGNMENT_CONFLICT",
"message": "could not complete assignment",
"details": {
"assignment_id": "asg_99",
"expert_id": "exp_42"
}
}
}{
"error": {
"code": "ASSIGNMENT_CONFLICT",
"message": "could not complete assignment",
"details": {
"assignment_id": "asg_99",
"expert_id": "exp_42"
}
}
}{
"error": {
"code": "ASSIGNMENT_CONFLICT",
"message": "could not complete assignment",
"details": {
"assignment_id": "asg_99",
"expert_id": "exp_42"
}
}
}{
"error": {
"code": "ASSIGNMENT_CONFLICT",
"message": "could not complete assignment",
"details": {
"assignment_id": "asg_99",
"expert_id": "exp_42"
}
}
}{
"error": {
"code": "ASSIGNMENT_CONFLICT",
"message": "could not complete assignment",
"details": {
"assignment_id": "asg_99",
"expert_id": "exp_42"
}
}
}Update an agent (partial)
Partially updates an agent using JSON Merge Patch (RFC 7386).
Omitted fields are unchanged; null clears a field; arrays replace.
curl --request PATCH \
--url https://api.{environment}.corti.app/v2/agentic/agents/{agentId} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/merge-patch+json' \
--header 'Tenant-Name: <api-key>' \
--data '
{
"name": "coder-v2",
"model": null,
"connectors": [
{
"type": "registry",
"name": "pubmed-expert"
}
]
}
'import { CortiClient, CortiEnvironment } from "@corti/sdk";
const client = new CortiClient({
environment: CortiEnvironment.Eu,
auth: {
clientId: "YOUR_CLIENT_ID",
clientSecret: "YOUR_CLIENT_SECRET"
},
tenantName: "YOUR_TENANT_NAME"
});
await client.agentic.agents.update("agt.0192f4c8-2c5a-7b3e-9f1a-3c8d6e2b7a40", {
name: "coder-v2",
connectors: [{
type: "registry",
name: "pubmed-expert"
}]
});
using Corti.Agentic;
using Corti;
var client = new CortiClient(
"TENANT_NAME",
CortiClientEnvironment.Eu,
new CortiClientAuth.ClientCredentials("client_id", "client_secret")
);
await client.Agentic.Agents.UpdateAsync(
"agt.0192f4c8-2c5a-7b3e-9f1a-3c8d6e2b7a40",
new AgenticAgentsPatchRequest
{
Name = "coder-v2",
Connectors = new List<CommonConnectorCreateRequest>()
{
new CommonRegistryConnectorCreate { Name = "pubmed-expert" },
},
}
);
import requests
url = "https://api.{environment}.corti.app/v2/agentic/agents/{agentId}"
payload = {
"name": "coder-v2",
"model": None,
"connectors": [
{
"type": "registry",
"name": "pubmed-expert"
}
]
}
headers = {
"Authorization": "Bearer <token>",
"Tenant-Name": "<api-key>",
"Content-Type": "application/merge-patch+json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.{environment}.corti.app/v2/agentic/agents/{agentId}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'name' => 'coder-v2',
'model' => null,
'connectors' => [
[
'type' => 'registry',
'name' => 'pubmed-expert'
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/merge-patch+json",
"Tenant-Name: <api-key>"
],
]);
$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.{environment}.corti.app/v2/agentic/agents/{agentId}"
payload := strings.NewReader("{\n \"name\": \"coder-v2\",\n \"model\": null,\n \"connectors\": [\n {\n \"type\": \"registry\",\n \"name\": \"pubmed-expert\"\n }\n ]\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Tenant-Name", "<api-key>")
req.Header.Add("Content-Type", "application/merge-patch+json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.patch("https://api.{environment}.corti.app/v2/agentic/agents/{agentId}")
.header("Authorization", "Bearer <token>")
.header("Tenant-Name", "<api-key>")
.header("Content-Type", "application/merge-patch+json")
.body("{\n \"name\": \"coder-v2\",\n \"model\": null,\n \"connectors\": [\n {\n \"type\": \"registry\",\n \"name\": \"pubmed-expert\"\n }\n ]\n}")
.asString();{
"id": "agt.0192f4c8-2c5a-7b3e-9f1a-3c8d6e2b7a40",
"name": "coder",
"description": "Returns ICD-10 codes for a clinical encounter.",
"systemPrompt": "Respond with only the ICD-10 code.",
"model": "corti-default",
"maxLoops": 10,
"visibility": "private",
"lifecycle": "persistent",
"connectors": [
{
"id": "con.0192f4c8-7baf-7083-a46f-81d2bd70cf95",
"type": "registry",
"name": "pubmed-expert"
}
],
"labels": {
"team": "coding",
"env": "prod"
},
"createdAt": "2026-05-19T12:00:00Z",
"updatedAt": "2026-05-19T12:00:00Z",
"createdBy": "usr.0192f4c8-8bc0-7194-8570-92e3ce81d0a6",
"expiresAt": null
}{
"error": {
"code": "ASSIGNMENT_CONFLICT",
"message": "could not complete assignment",
"details": {
"assignment_id": "asg_99",
"expert_id": "exp_42"
}
}
}{
"error": {
"code": "ASSIGNMENT_CONFLICT",
"message": "could not complete assignment",
"details": {
"assignment_id": "asg_99",
"expert_id": "exp_42"
}
}
}{
"error": {
"code": "ASSIGNMENT_CONFLICT",
"message": "could not complete assignment",
"details": {
"assignment_id": "asg_99",
"expert_id": "exp_42"
}
}
}{
"error": {
"code": "ASSIGNMENT_CONFLICT",
"message": "could not complete assignment",
"details": {
"assignment_id": "asg_99",
"expert_id": "exp_42"
}
}
}{
"error": {
"code": "ASSIGNMENT_CONFLICT",
"message": "could not complete assignment",
"details": {
"assignment_id": "asg_99",
"expert_id": "exp_42"
}
}
}Authorizations
OAuth 2.0 / OIDC bearer token.
The tenant the request operates within.
Path Parameters
Agent identifier (prefixed UUIDv7).
Agent identifier. Accepts agt.<uuidv7> or a bare UUIDv7 on input; always returned prefixed.
^(agt\.)?[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$"agt.0192f4c8-2c5a-7b3e-9f1a-3c8d6e2b7a40"
Body
The fields to change, as a JSON Merge Patch (RFC 7386).
JSON Merge Patch body. Omitted fields are unchanged; null clears a field only where the field is nullable (see each property), so non-nullable fields such as maxLoops reject null; connectors is replaced wholesale.
Note: the server currently honors only name, description, systemPrompt, model, maxLoops, and connectors. visibility, lifecycle, and labels are accepted but not yet persisted.
New agent name.
1 - 128"coder-v2"
New description; null clears it.
4096"Returns SNOMED CT codes for a clinical encounter."
New system prompt; null clears it.
"Respond with only the SNOMED CT code."
New model identifier; null falls back to the tenant default.
"corti-default"
New cap on the orchestrator's ReAct loop iterations per run. Omitted leaves the current value unchanged; there is no null-reset — send 10 to restore the default.
1 <= x <= 10010
private— creator / service principal only.unlisted— usable by ID, hidden from list results.public— listed tenant-wide.
private, unlisted, public "private"
ephemeral— short-lived; expired automatically.persistent— retained until explicitly deleted.
ephemeral, persistent Replacement connector list; null clears connectors.
Same envelope as Connector but without the server-generated id.
- Option 1
- Option 2
- Option 3
- Option 4
- Option 5
Show child attributes
Show child attributes
[
{
"type": "registry",
"name": "pubmed-expert"
}
]
Replacement labels; null clears labels.
Show child attributes
Show child attributes
{ "team": "coding", "env": "prod" }
Response
The updated agent.
A configured agent — its metadata, model, and attached connectors.
Agent identifier. Accepts agt.<uuidv7> or a bare UUIDv7 on input; always returned prefixed.
^(agt\.)?[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$"agt.0192f4c8-2c5a-7b3e-9f1a-3c8d6e2b7a40"
Human-readable, unique-per-tenant agent name.
1 - 128Effective cap on the orchestrator's ReAct loop iterations per run. Always present: agents created without maxLoops report the server default (10).
1 <= x <= 10010
private— creator / service principal only.unlisted— usable by ID, hidden from list results.public— listed tenant-wide.
private, unlisted, public "private"
ephemeral— short-lived; expired automatically.persistent— retained until explicitly deleted.
ephemeral, persistent Connectors attached to the agent, discriminated by type.
A connector attached to an agent, discriminated by type.
- Option 1
- Option 2
- Option 3
- Option 4
- Option 5
Show child attributes
Show child attributes
When the agent was created.
When the agent was last updated.
Principal (user or service principal) that created the agent.
^(usr\.)?[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$"usr.0192f4c8-8bc0-7194-8570-92e3ce81d0a6"
Free-form agent description shown to users and in tooling.
4096System prompt prepended to every invocation.
Model identifier. Tenant default if omitted or null.
Open question — in the current implementation a model is configured per expert, not per agent (Expert.modelName), and an Agent has no model field at all. The desired end state is that there is no distinction between an expert and an agent, so model lives uniformly on this resource. Until that convergence lands, the precedence of an agent-level model over a connector/expert-level override is undecided and MUST be resolved before this field ships.
"corti-default"
Free-form string → string metadata for filtering and organisation. Not used for routing or auth.
Show child attributes
Show child attributes
{ "team": "coding", "env": "prod" }
When the agent expires; null means it does not expire. Ephemeral agents get a 24h expiry at creation time; persistent agents never expire.
Was this page helpful?