---
title: "List the workspace's conversation logs"
description: "List what people outside the workspace asked its assistants, from widgets, API keys and the MCP server, with filters. Kept 90 days. Free."
canonical: "https://lookio.app/docs/api/logs/list-log-conversations"
updated: "2026-10-17"
---

# List the workspace's conversation logs

Requires `assistants:write`.

The logs hold the conversations of the visitors of your widgets and of the users of your product who ask through an API key or the MCP server. A member's own chats are personal and never appear. Results come latest activity first, and you page with `cursor`: see [Pagination](/docs/api/conventions#pagination).

Each entry names the `channel` (`widget`, `api` or `mcp`), the `widget` or the `api_key` it came through, the `end_user`, how many messages it holds, what it cost and its thumbs. Narrow the list with `channel` (comma-separated), `widget_id`, `api_key_id`, `assistant_id`, `rating`, `end_user`, `q` (words in any message) and `from` and `to`. `rating=down` lists the conversations where someone gave a thumbs down.

A person needs the right to edit assistants, or the call fails with `permission_denied`. An API key reads the conversations of its own assistants. See [Logs](/docs/platform/logs).

Open one with [Retrieve a logged conversation](/docs/api/logs/get-log-conversation).

```http
GET https://api.lookio.app/v1/logs/conversations
```

## Authorizations

- `Authorization` (bearer, in header, required)

## Query parameters

- `channel` (`string`, length: `≥ 1 chars`): Only the conversations from these channels, comma-separated: `widget` (visitors of a widget), `api` (an API key through REST, the CLI or the SDK), `mcp` (an API key through the MCP server). Default: all three.
- `widget_id` (`string`, pattern: `^wdg_[abcdefghjkmnpqrstuvwxyz23456789]{12}$`): Only this widget's visitors.
- `api_key_id` (`string`, length: `1–64 chars`): Only the conversations asked with this API key (the `api_key.id` of a conversation in these logs).
- `assistant_id` (`string`, pattern: `^ast_[abcdefghjkmnpqrstuvwxyz23456789]{12}$`): Only the conversations with this assistant.
- `rating` (`enum<string>`, one of: `up, down, rated, unrated`): `down`: at least one thumbs down (where the assistant failed). `up`: at least one thumbs up. `rated`: any thumb. `unrated`: none.
- `end_user` (`string`, length: `1–200 chars`): Only this person: a widget visitor's random id, or the `end_user` your product sends with its questions.
- `q` (`string`, length: `1–200 chars`): Words in the title or in any question or answer, without regard to case.
- `from` (`string`): Only conversations with activity since this ISO 8601 date or timestamp.
- `to` (`string`): Only conversations started before this ISO 8601 date or timestamp.
- `cursor` (`string`, length: `1–40 chars`): Pass `next_cursor` from the previous page, unchanged.
- `limit` (`integer`, range: `1–100`): Number of items to return. Values outside 1-100 are clamped, and the response reports the limit actually applied.

## Response

**200**: List the workspace's conversation logs

- `data` (`object[]`, required)
- `data.id` (`string`, required, pattern: `^cnv_[abcdefghjkmnpqrstuvwxyz23456789]{12}$`)
- `data.channel` (`enum<string>`, required, one of: `widget, api, mcp`): `widget`: a visitor on your website. `api`: an API key through REST, the CLI or the SDK. `mcp`: an API key through the MCP server.
- `data.title` (`string`, required): The first question.
- `data.assistant` (`object`, required)
- `data.assistant.id` (`string`, required)
- `data.assistant.name` (`string,null`, required): Null when the assistant was deleted.
- `data.widget` (`object | null`, required): The widget, for the `widget` channel.
- `data.widget.id` (`string`, required)
- `data.widget.name` (`string`, required)
- `data.api_key` (`object | null`, required): The API key, for the `api` and `mcp` channels.
- `data.api_key.id` (`string`, required)
- `data.api_key.name` (`string,null`, required): Null once the key is deleted.
- `data.end_user` (`string,null`, required): Who was asking: a widget visitor's random id, or the `end_user` the product sent. Null when an API key sent none.
- `data.message_count` (`integer`, required): Questions and answers together.
- `data.credits` (`integer`, required): What this conversation's answers cost.
- `data.thumbs_up` (`integer`, required)
- `data.thumbs_down` (`integer`, required)
- `data.created_at` (`string`, required)
- `data.updated_at` (`string`, required): The last activity. Conversations are listed by it, latest first.
- `data.locked` (`boolean`, required): Older than the plan keeps conversations readable (7 days on Free, 90 on Starter, 1 year on Pro, from the last activity). Its text is hidden, not yet deleted: `title` is then a date and `messages` is empty, and a higher plan shows it again.
- `has_more` (`boolean`, required): True when another page follows: pass `next_cursor` back as `cursor`.
- `next_cursor` (`string,null`, required): Pass it back unchanged as `cursor`. Null on the last page.
- `limit` (`integer`, required): The page size actually applied.
- `request_id` (`string`, required)

```json
{
  "data": [
    {
      "id": "cnv_ca9xz837zsvb",
      "channel": "api",
      "title": "What is the refund window?",
      "assistant": {
        "id": "ast_66xcnwtzj8vt",
        "name": "Support"
      },
      "widget": null,
      "api_key": {
        "id": "k_7f3a9c",
        "name": "Help centre backend"
      },
      "end_user": "user_42",
      "message_count": 4,
      "credits": 60,
      "thumbs_up": 0,
      "thumbs_down": 1,
      "created_at": "2026-10-12T09:30:00.000Z",
      "updated_at": "2026-10-12T09:30:00.000Z",
      "locked": false
    }
  ],
  "has_more": false,
  "next_cursor": null,
  "request_id": "req_01K9X7M2Q4"
}
```

**400**: Possible codes: invalid_request, unknown_field, invalid_parameter, invalid_cursor

- `error` (`object`, required)
- `error.type` (`string`, required)
- `error.code` (`string`, required)
- `error.message` (`string`, required)
- `error.param` (`string`)
- `error.docs_url` (`string`, required)
- `error.action_url` (`string<uri>`)
- `request_id` (`string`, required)

```json
{
  "error": {
    "type": "<string>",
    "code": "<string>",
    "message": "<string>",
    "param": "<string>",
    "docs_url": "<string>",
    "action_url": "<string>"
  },
  "request_id": "<string>"
}
```

**401**: Possible codes: authentication_required, invalid_api_key, api_key_expired, api_key_revoked, invalid_access_key

- `error` (`object`, required)
- `error.type` (`string`, required)
- `error.code` (`string`, required)
- `error.message` (`string`, required)
- `error.param` (`string`)
- `error.docs_url` (`string`, required)
- `error.action_url` (`string<uri>`)
- `request_id` (`string`, required)

```json
{
  "error": {
    "type": "<string>",
    "code": "<string>",
    "message": "<string>",
    "param": "<string>",
    "docs_url": "<string>",
    "action_url": "<string>"
  },
  "request_id": "<string>"
}
```

**403**: Possible codes: insufficient_scope, feature_not_available, admin_required, permission_denied

- `error` (`object`, required)
- `error.type` (`string`, required)
- `error.code` (`string`, required)
- `error.message` (`string`, required)
- `error.param` (`string`)
- `error.docs_url` (`string`, required)
- `error.action_url` (`string<uri>`)
- `request_id` (`string`, required)

```json
{
  "error": {
    "type": "<string>",
    "code": "<string>",
    "message": "<string>",
    "param": "<string>",
    "docs_url": "<string>",
    "action_url": "<string>"
  },
  "request_id": "<string>"
}
```

**429**: Possible codes: rate_limited

- `error` (`object`, required)
- `error.type` (`string`, required)
- `error.code` (`string`, required)
- `error.message` (`string`, required)
- `error.param` (`string`)
- `error.docs_url` (`string`, required)
- `error.action_url` (`string<uri>`)
- `request_id` (`string`, required)

```json
{
  "error": {
    "type": "<string>",
    "code": "<string>",
    "message": "<string>",
    "param": "<string>",
    "docs_url": "<string>",
    "action_url": "<string>"
  },
  "request_id": "<string>"
}
```

**500**: Possible codes: internal_error

- `error` (`object`, required)
- `error.type` (`string`, required)
- `error.code` (`string`, required)
- `error.message` (`string`, required)
- `error.param` (`string`)
- `error.docs_url` (`string`, required)
- `error.action_url` (`string<uri>`)
- `request_id` (`string`, required)

```json
{
  "error": {
    "type": "<string>",
    "code": "<string>",
    "message": "<string>",
    "param": "<string>",
    "docs_url": "<string>",
    "action_url": "<string>"
  },
  "request_id": "<string>"
}
```

**Example request**

```bash
curl --request GET \
  --url 'https://api.lookio.app/v1/logs/conversations' \
  --header 'Authorization: <api-key>'
```
