> ## Documentation Index
> Fetch the complete documentation index at: https://docs.anyreach.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Exporting conversations

> Export the filtered list to CSV.

Export the current conversations list to a CSV file from your browser. The export respects whatever filters and search you have applied, and you choose which columns to include.

## Run an export

<Steps>
  <Step title="Apply your filters">
    Narrow the conversations list using search and filters first. The export sends the same filters to the API, so only matching conversations are included. See [Search and filters](/conversations/search-and-filters).
  </Step>

  <Step title="Open the export dialog">
    Click **Export CSV**. The **Export Conversations** dialog opens with a column picker.
  </Step>

  <Step title="Select columns">
    Check the columns you want. Use **Select All** or **Clear All** to toggle every column at once. You must select at least one column.
  </Step>

  <Step title="Export">
    Click **Export CSV**. The button shows **Exporting...** while rows are fetched, then the browser downloads a file named `conversations_export_<YYYY-MM-DD>.csv`.
  </Step>
</Steps>

## Columns

Every conversation field is available as a column. By default, three columns are pre-selected:

* `user_id`
* `recording_url`
* `created_at`

The full set of selectable columns:

| Column label     | Field              |
| ---------------- | ------------------ |
| ID               | `id`               |
| Organization ID  | `organization_id`  |
| Trunk ID         | `trunk_id`         |
| Trunk Config     | `trunk_config`     |
| Direction        | `direction`        |
| Agent ID         | `agent_id`         |
| Agent Version ID | `agent_version_id` |
| Agent Config     | `agent_config`     |
| User ID          | `user_id`          |
| User Name        | `user_name`        |
| Agent Number     | `agent_number`     |
| Channel          | `channel`          |
| Duration         | `duration`         |
| Recording URL    | `recording_url`    |
| Custom Metadata  | `custom_metadata`  |
| System Metadata  | `system_metadata`  |
| Conversation     | `conversation`     |
| SIP              | `sip`              |
| Summary          | `summary`          |
| Status           | `status`           |
| Service Version  | `service_version`  |
| Created At       | `created_at`       |
| Updated At       | `updated_at`       |

The **Conversation** column carries the transcript. Object-valued columns such as **Agent Config**, **Trunk Config**, **System Metadata**, and **SIP** are written as JSON in a single cell.

<Note>
  **Recording URL** maps to the API's `recording_details` field and extracts the `recording_url` value from it. If a conversation has no recording, the cell is empty.
</Note>

## Custom metadata flattening

When you select **Custom Metadata**, the export does not write the whole object into one cell. Instead it recursively flattens each conversation's `custom_metadata` so every leaf value becomes its own column, keyed by its path:

```
custom_metadata.order.id
custom_metadata.order.total
custom_metadata.source
```

Rules:

* Nested objects are expanded into `custom_metadata.<child>.<grandchild>` columns.
* Arrays are treated as leaf values and kept as a single JSON cell — they are not split by index.
* The full set of metadata columns is the union of keys across all exported rows, sorted alphabetically. Rows without a given key have an empty cell.
* An empty object renders as `{}`.

<Tip>
  Because each conversation can carry different `custom_metadata` keys, the column set is computed from every row in the export. Conversations that omit a key still get a blank cell for it, so columns stay aligned.
</Tip>

## Limits

The export runs entirely in your browser. It calls the conversations list endpoint (`GET /core/conversations`) in a loop, paging with a cursor, and assembles the CSV client-side. There is no server-side bulk export.

| Limit                 | Value  |
| --------------------- | ------ |
| Rows per page request | 200    |
| Maximum pages         | 5      |
| Maximum rows exported | \~1000 |

<Warning>
  The export is capped at about 1000 rows (5 pages of 200). If your filtered list is larger, only the first \~1000 conversations are included. Tighten your filters before exporting to make sure you capture the conversations you need.
</Warning>

The loop also stops early when a page returns fewer than 200 rows, when no rows come back, or when the pagination cursor stops advancing.

## File format

* Output is UTF-8 CSV with a byte-order mark, so spreadsheet apps read non-ASCII characters correctly.
* Values containing commas, quotes, or newlines are quoted, and embedded quotes are doubled.
* Object and array cells are JSON-encoded.

## Related

<CardGroup cols={1}>
  <Card title="Search and filters" icon="filter" href="/conversations/search-and-filters">
    Narrow the conversations list before exporting; the export reuses the same filters.
  </Card>
</CardGroup>
