Update a conversation.
const url = 'https://shiftagent.example.com/conversations/example';const options = { method: 'PATCH', headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'}, body: '{"title":"example","status":"active","selected_skill_ids":["example"],"runtime":{"mode":"sticky","sticky_ttl_seconds":1},"filler":{"enabled":true},"metadata":{"additionalProperty":"example"}}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request PATCH \ --url https://shiftagent.example.com/conversations/example \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --data '{ "title": "example", "status": "active", "selected_skill_ids": [ "example" ], "runtime": { "mode": "sticky", "sticky_ttl_seconds": 1 }, "filler": { "enabled": true }, "metadata": { "additionalProperty": "example" } }'Partial update of title, selected_skill_ids (narrowing within
context.skill_ids; null clears the narrowing), status
("archived" archives — same as archiveConversation; "active"
un-archives), filler, metadata, and the runtime lease:
runtime.sticky_ttl_seconds— extend or shorten a sticky lease (capped by tenant settings;422beyond the cap).runtime.mode: "pooled"— release a sticky sandbox early.runtime.mode: "sticky"— upgrade a pooled conversation (subject to capacity;429capacity-exhaustedwhen no sandbox is free).
Authorizations
Section titled “Authorizations ”Parameters
Section titled “ Parameters ”Path Parameters
Section titled “Path Parameters ”Internal conversation ID.
Request Body required
Section titled “Request Body required ”Partial update for updateConversation. Provided → replaced, omitted → unchanged, null → cleared.
object
Display title; null clears.
archived archives (same as archiveConversation); active un-archives (vaulted secrets are not restored).
Narrowing within context.skill_ids; null clears.
Runtime lease management via updateConversation. agent_type is immutable and therefore absent here.
object
pooled releases a sticky sandbox early; sticky upgrades a pooled conversation (subject to capacity — 429 when none free).
Extend or shorten the sticky lease (capped by tenant settings).
Replaces the metadata map wholesale when provided.
object
Responses
Section titled “ Responses ”Updated conversation.
An agent conversation owned by a user within a tenant. Snapshots its resolution context at creation and carries live runtime state.
object
Display title; auto-derivable from the first message.
Archived conversations keep readable history but reject message writes with 409 conversation-archived.
Conversation-level repository override in the cascade.
Resolution snapshot taken at conversation creation (user → role → repository → skills) — makes history self-explaining even after roles or repositories change.
object
The role the conversation was resolved under.
The effective repository at creation.
The effective skills at creation.
Optional narrowing within context.skill_ids; null means no narrowing.
Runtime placement state of a conversation. agent_type selects the agent runtime behind the platform’s runtime abstraction — each type runs in its own isolated sandbox.
object
Agent runtime — open enum so new runtimes are non-breaking. Known values: claude-agent-sdk, codex, deepagent. Defaults from tenant settings. Immutable after creation.
pooled — each message claims a warm-pool sandbox; sticky — a dedicated sandbox is leased for sticky_ttl_seconds (refreshed per message).
Lease TTL; null for pooled conversations.
warm — no dedicated sandbox held (pooled, or sticky before first message); active — sticky lease held; expired — sticky lease lapsed (next message re-acquires, subject to capacity).
Sticky lease expiry; null for pooled conversations.
S3-style storage bucket attached to a user or conversation. Platform-assigned automatically at creation; host-owned buckets can be linked via update (provider: "external").
object
platform — bucket provisioned and owned by the deployment; external — host-linked BYO bucket.
S3-style URI of the bucket root (e.g. s3://bucket/prefix).
Persisted message count (all roles).
Timestamp of the newest message; null when empty.
Free-form string key–value map for host/adapter bookkeeping (e.g. a host-side reference ID). Max 50 keys; values max 500 chars. Replaced wholesale when provided in updates.
object
RFC 3339 / ISO 8601 timestamp, UTC.
RFC 3339 / ISO 8601 timestamp, UTC.
Example
{ "object": "conversation", "status": "active", "runtime": { "mode": "sticky", "sandbox_state": "warm" }, "storage": { "provider": "platform" }}Missing or invalid credentials — no bearer token, an unknown/revoked sk_int_ key, or an expired platform JWT.
RFC 9457 problem+json error envelope. type is a URI under https://shiftagent.example.com/problems/{slug} (deployment host substituted); see the API-level problem registry for every slug.
object
Problem type URI (registry slug).
Short, human-readable summary of the problem type.
HTTP status code.
Human-readable explanation specific to this occurrence.
URI reference identifying this occurrence.
Correlation ID for support and log lookup.
On name-conflict, external-id-conflict, and resource-in-use: the ID of the existing/depended-on resource — fetch it and continue (replay recovery).
On validation-error, field-level details.
object
JSON pointer to the offending field.
What failed.
Examples
Missing or invalid bearer token
{ "type": "https://shiftagent.example.com/problems/insufficient-scope", "title": "Unauthorized", "status": 401, "detail": "Provide a valid sk_int_ service key or platform JWT.", "request_id": "req_01hzx8auth001"}Not found — the resource does not exist, was deprovisioned, or lies outside the integration key’s subtree (indistinguishable by design).
RFC 9457 problem+json error envelope. type is a URI under https://shiftagent.example.com/problems/{slug} (deployment host substituted); see the API-level problem registry for every slug.
object
Problem type URI (registry slug).
Short, human-readable summary of the problem type.
HTTP status code.
Human-readable explanation specific to this occurrence.
URI reference identifying this occurrence.
Correlation ID for support and log lookup.
On name-conflict, external-id-conflict, and resource-in-use: the ID of the existing/depended-on resource — fetch it and continue (replay recovery).
On validation-error, field-level details.
object
JSON pointer to the offending field.
What failed.
Examples
Unknown resource
{ "type": "https://shiftagent.example.com/problems/not-found", "title": "Not found", "status": 404, "detail": "No tenant with external_id acme:tenant:999999.", "request_id": "req_01hzx8nf001"}Unprocessable — validation-error (schema/semantic validation failed; errors[] lists JSON-pointer details) or role-required (user has multiple roles and no role_id was given).
RFC 9457 problem+json error envelope. type is a URI under https://shiftagent.example.com/problems/{slug} (deployment host substituted); see the API-level problem registry for every slug.
object
Problem type URI (registry slug).
Short, human-readable summary of the problem type.
HTTP status code.
Human-readable explanation specific to this occurrence.
URI reference identifying this occurrence.
Correlation ID for support and log lookup.
On name-conflict, external-id-conflict, and resource-in-use: the ID of the existing/depended-on resource — fetch it and continue (replay recovery).
On validation-error, field-level details.
object
JSON pointer to the offending field.
What failed.
Examples
Field-level validation failure
{ "type": "https://shiftagent.example.com/problems/validation-error", "title": "Validation error", "status": 422, "detail": "One or more fields failed validation.", "errors": [ { "pointer": "/skill_access/skill_ids/0", "message": "skl_01hzx8unknown does not belong to the effective repository." } ], "request_id": "req_01hzx8val001"}Ambiguous role at conversation creation
{ "type": "https://shiftagent.example.com/problems/role-required", "title": "Role required", "status": 422, "detail": "User usr_01hzx8jane001 holds 2 roles; pass role_id explicitly.", "request_id": "req_01hzx8role01"}Too many requests — capacity-exhausted (no sandbox available, or the maximum hold time elapsed under on_capacity=hold) or rate-limited. Honor Retry-After.
RFC 9457 problem+json error envelope. type is a URI under https://shiftagent.example.com/problems/{slug} (deployment host substituted); see the API-level problem registry for every slug.
object
Problem type URI (registry slug).
Short, human-readable summary of the problem type.
HTTP status code.
Human-readable explanation specific to this occurrence.
URI reference identifying this occurrence.
Correlation ID for support and log lookup.
On name-conflict, external-id-conflict, and resource-in-use: the ID of the existing/depended-on resource — fetch it and continue (replay recovery).
On validation-error, field-level details.
object
JSON pointer to the offending field.
What failed.
Examples
Sandbox pool exhausted (on_capacity=reject)
{ "type": "https://shiftagent.example.com/problems/capacity-exhausted", "title": "Capacity exhausted", "status": 429, "detail": "No sandbox available; retry after the indicated delay or use on_capacity=hold.", "request_id": "req_01hzx8cap001"}Headers
Section titled “Headers ”Seconds to wait before retrying.