---
title: "List the caller's sidebar threads for one agent."
method: GET
path: "/v1/agent/threads"
tags: ["agent"]
---

# List the caller's sidebar threads for one agent.

`GET /v1/agent/threads`

## Request

- Base URL: `http://localhost:8080`
- URL: `http://localhost:8080/v1/agent/threads`
- Auth: one of:
  - API key in cookie `dvt_session`
  - HTTP bearer

Served entirely from dvt's own `agent_threads` index — never the engine. Snowflake is the source of truth only at thread-create time; the sidebar's ownership, soft-delete, and per-agent scoping all live in dvt.

## Query parameters

- `agentFqn` string, required
- `limit` integer

## Response `200`

Threads, most-recently-used first.

- object
  - `data` AgentThread[], required
    - `id` string, uuid, required: dvt's own row id.
    - `threadId` string, required: The opaque Snowflake thread id.
    - `agentFqn` string, required
    - `title` string, nullable: User prose; never mirrored, never derived from transcript content dvt doesn't hold.
    - `lastUsedAt` string, date-time, required
    - `lastErrorAt` string, date-time: Set when the last run against this thread failed upstream with a 404 (an EXPECTED steady state, migration 0099's header) — the thread stays listed, now visibly marked errored, rather than disappearing. NOT a diagnosis of what's actually gone: a 404 here is byte-identical whether the Snowflake-side thread no longer exists or the run targeted a non-existent/mistyped agent FQN (thread creation never validates the FQN). Cleared on the next successful run (self-heal). Absent for a thread with no such error.
    - `createdAt` string, date-time, required
  - `meta` Meta, required: Response metadata.
    - `requestId` string, required: Correlates with the X-Request-Id header.
    - `total` integer: Item count, present on collection responses.
    - `nextCursor` string, nullable: Opaque keyset-pagination cursor, present on paginated responses (e.g. GET /v1/dashboards) when more rows exist beyond this page. Pass it back as the `cursor` query param to fetch the next page; absent or null on the last page.
    - `roleResolveDegraded` boolean: Snowflake mode only (DVT-2260), on GET /v1/dashboards: present and true when the caller's live Snowflake role resolution failed or was unavailable — role-shared dashboards may be missing from this page. Omitted (not merely false) whenever resolution succeeded or the role-share arm does not apply (off snowflake mode, an org admin/owner, or off the ingress listener).

## Other responses

- `400`: Malformed request.
- `401`: Missing, invalid, or expired session.

---

[API](https://skmtc.dev/dvt/apis/dvt-rest-api.md) · [All operations](https://skmtc.dev/dvt/apis/dvt-rest-api/llms.txt) · [OpenAPI document](https://skmtc.dev/dvt/apis/dvt-rest-api/revisions/00016f504165?raw)
