---
title: "List AI Assistant threads"
method: GET
path: "/assistant/threads/"
tags: ["assistant"]
---

# List AI Assistant threads

`GET /assistant/threads/`

## Request

- Base URL: `https://api.getoneprofile.ai` (the document declares no server; this is the origin it was published from)
- URL: `https://api.getoneprofile.ai/assistant/threads/`
- Auth: one of:
  - API key in header `X-API-Key`
  - HTTP bearer

List your threads across every assistant (a table's, a lead search's, an agent's, the general chat's) in one list: pinned first, then most recently active first. Your own threads, plus the workspace's shared legacy table threads that nobody is recorded as starting. Deleted threads are left out.

Paged by an opaque cursor rather than an offset: the page after a cursor starts after that row's place in the order, so a thread pinned or deleted between two requests never shifts the next page.

## Query parameters

- `search` string, nullable: Only threads whose title or message text contains this, case-insensitively.
- `cursor` string, nullable: The `next_cursor` of the page before, for the page after it.
- `limit` integer: Rows per page.

## Response `200`

Successful Response

- AssistantThreadListResponseSchema: One page of a person's threads, pinned first, then newest activity first.
  - `next_cursor` string, nullable, required: Send as `cursor` for the page after this one; null on the last page.
  - `threads` AssistantThreadReadSchema[], required
    - `continued_from` AssistantThreadRefSchema, required: One thread, named by its store and its id in that store.
      - `origin` 'chat', required: Which store a thread lives in. ONE MEMBER, on purpose. There were four assistants and four transcript tables; three were retired and there is one assistant now. The enum stays rather than collapsing to nothing, because `origin` is still half of how a meta row names a thread and is still on the wire, and because a second store arriving is a change to this list rather than to every signature that carries it. ``table``, ``find_leads`` and ``agent`` were the other three. Their rows are deleted by a release task in the same release that drops their tables: every read here coerces the column back into this enum, so a row naming a member that no longer exists raises rather than being skipped.
      - `thread_id` string, uuid, required
    - `continued_in` AssistantThreadRefSchema, required: One thread, named by its store and its id in that store.
      - `origin` 'chat', required: Which store a thread lives in. ONE MEMBER, on purpose. There were four assistants and four transcript tables; three were retired and there is one assistant now. The enum stays rather than collapsing to nothing, because `origin` is still half of how a meta row names a thread and is still on the wire, and because a second store arriving is a change to this list rather than to every signature that carries it. ``table``, ``find_leads`` and ``agent`` were the other three. Their rows are deleted by a release task in the same release that drops their tables: every read here coerces the column back into this enum, so a row naming a member that no longer exists raises rather than being skipped.
      - `thread_id` string, uuid, required
    - `created_at` string, date-time, required
    - `last_message_at` string, date-time, nullable, required
    - `open_path` string, required: Where the dashboard navigates to reopen the thread: its chat.
    - `origin` 'chat', required: Which store a thread lives in. ONE MEMBER, on purpose. There were four assistants and four transcript tables; three were retired and there is one assistant now. The enum stays rather than collapsing to nothing, because `origin` is still half of how a meta row names a thread and is still on the wire, and because a second store arriving is a change to this list rather than to every signature that carries it. ``table``, ``find_leads`` and ``agent`` were the other three. Their rows are deleted by a release task in the same release that drops their tables: every read here coerces the column back into this enum, so a row naming a member that no longer exists raises rather than being skipped.
    - `origin_ref_id` string, uuid, nullable, required: The table or saved agent the thread is bound to; null for a lead search or the general chat.
    - `origin_ref_label` string, nullable, required: That table's or agent's name, or what a lead search was for; null when the thread is bound to nothing, or its agent is gone.
    - `pinned` boolean, required
    - `shared` boolean, required: A legacy table thread nobody is recorded as starting, which the whole workspace sees and may rename, pin or delete.
    - `thread_id` string, uuid, required
    - `title` string, required

## Other responses

- `401`: Unauthorized
- `403`: Forbidden
- `422`: Invalid request made to the API.
- `500`: Internal server error.
- `502`: Bad gateway error.
- `503`: Service unavailable.

---

[API](https://skmtc.dev/getoneprofile/apis/api-reference-oneprofile.md) · [All operations](https://skmtc.dev/getoneprofile/apis/api-reference-oneprofile/llms.txt) · [OpenAPI document](https://skmtc.dev/getoneprofile/apis/api-reference-oneprofile/revisions/4a6bd71e3f02?raw)
