List conversations
const url = 'https://example.com/v1/conversations?limit=25&scopeKind=tenant&status=open&replays=exclude';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://example.com/v1/conversations?limit=25&scopeKind=tenant&status=open&replays=exclude' \ --header 'Authorization: Bearer <token>'Cursor-paginated. Fixed sort: openedAt desc, id desc. Filters: ?agentId=, ?status=open|closed, ?replays=exclude|include|only (default exclude: a comparison’s replay conversations are left out), and scopeKind/scopeId for one project’s conversations, or every project’s in an org. Conversations from before Kindgi 0.1.3 have no project and are listed only without a scope.
Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Query Parameters
Section titled “Query Parameters”1..100. Default 25.
Where the previous page ended: its nextCursor, as it came. A runtime that seals cursors takes one only for the same list, filters and caller, within a day; otherwise 400 bad-input, and the list starts again without it. Absent → first page.
Discriminator for the ?scopeKind + ?scopeId + ?inherit triplet. Tenant carries no id (implicit from session); org/project require scopeId.
Optional scope discriminator. If absent, no scope filter is applied.
Required IF scopeKind is org or project. MUST be absent if scopeKind=tenant (tenant is implicit from the session). Malformed combinations return 400 scope-invalid.
Lifecycle status derived from closedAt: open when null, closed otherwise.
Filter by conversation lifecycle status.
Replay conversations (opened by a comparison’s replay turn; metadata.replayOf names the run it replays). exclude (default) leaves them out; include lists them with the others; only lists just them.
Responses
Section titled “Responses”Page of conversations.
object
object
ConversationId.
Semver.
The project the conversation is in: the project of the run that opened it, or projectId on open (when omitted, the agent’s own project, or the tenant’s Default project for an agent filed under none). Absent on conversations from before Kindgi 0.1.3; those are listed only without a scope.
Free-form scope object (currently { tenantId } in tests; enterprises extend with matterId, engagementId, etc.).
object
Lifecycle status derived from closedAt: open when null, closed otherwise.
When it was unregistered (POST /v1/conversations/{conversationId}/unregister). Only the unregister call returns it: reads no longer do.
object
Opaque cursor for the next page. Absent when hasMore: false.
Example
{ "data": [ { "status": "open" } ]}Malformed query parameter or scope.
object
object
Stable machine-readable discriminant. Values match domain error codes (see docs/API-ROUTE-CONVENTIONS.md §4.3).
Optional, kind-specific.
object
Server-assigned request id; also echoed via X-Request-Id header.
Examplegenerated
{ "error": { "code": "example", "message": "example", "details": {}, "requestId": "example" }}Missing / malformed / expired / revoked bearer token.
object
object
Stable machine-readable discriminant. Values match domain error codes (see docs/API-ROUTE-CONVENTIONS.md §4.3).
Optional, kind-specific.
object
Server-assigned request id; also echoed via X-Request-Id header.
Examplegenerated
{ "error": { "code": "example", "message": "example", "details": {}, "requestId": "example" }}