List conversations by user or by tenant.
const url = 'https://shiftagent.example.com/conversations?limit=20&status=active';const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request GET \ --url 'https://shiftagent.example.com/conversations?limit=20&status=active' \ --header 'Authorization: Bearer <token>'Service-principal listing: exactly one of ?user_id= or ?tenant_id= is required (400 otherwise — neither or both). Sorted by last_message_at descending. Under a platformJwt, only ?user_id= matching the token’s user is permitted (403 insufficient-scope otherwise).
Authorizations
Section titled “Authorizations ”Parameters
Section titled “ Parameters ”Query Parameters
Section titled “Query Parameters ”Page size (1–100).
Cursor: return items after this object ID (forward pagination). Use the id of the last item of the previous page.
Cursor: return items before this object ID (backward pagination). Mutually exclusive with starting_after.
List one user’s conversations. Mutually exclusive with tenant_id.
List a whole tenant’s conversations. Mutually exclusive with user_id.
Filter by conversation status.
Responses
Section titled “ Responses ”A page of conversations.
object
Envelope discriminator.
The page of items.
Whether more items exist beyond this page.
Opaque cursor for the next page (pass as starting_after). Null when has_more is false.
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": "list", "data": [ { "object": "conversation", "status": "active", "runtime": { "mode": "sticky", "sandbox_state": "warm" }, "storage": { "provider": "platform" } } ]}Bad request — malformed body/parameters or an invalid parameter combination (e.g. neither or both of user_id/tenant_id on listConversations, or both pagination cursors).
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
Invalid parameter combination
{ "type": "https://shiftagent.example.com/problems/validation-error", "title": "Invalid request", "status": 400, "detail": "Exactly one of user_id or tenant_id is required.", "request_id": "req_01hzx8bad001"}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"}Forbidden — tenant-suspended (writes to a suspended tenant), insufficient-scope (key/token lacks the scope or a platform JWT reaches beyond its user), or approval-signature-invalid (approval assertion failed verification).
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
Suspended tenant rejects conversation writes
{ "type": "https://shiftagent.example.com/problems/tenant-suspended", "title": "Tenant suspended", "status": 403, "detail": "Tenant tnt_01hzx8acme001 is suspended; conversation writes are rejected.", "request_id": "req_01hzx8sus001"}Approval assertion failed verification
{ "type": "https://shiftagent.example.com/problems/approval-signature-invalid", "title": "Approval signature invalid", "status": 403, "detail": "Signature did not verify against approver key apk_01hzx8host001.", "request_id": "req_01hzx8sig001"}