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

# Search every conversation and call in one list

> Unified cross-channel Interaction Search: one recency-ordered, filterable list over every messaging conversation and every voice call, with a bulk CSV export gated to owner, admin, and developer roles.

# Search every conversation and call in one list

The **Interactions** page answers one question — "Search every conversation and call across messaging and voice in one recency-ordered, exportable list." Before this page, reconstructing a customer's full history meant paging **Conversations** for messaging and **Call logs** for voice separately and merging the two timelines by hand. Interactions merges both into a single list you can filter, page through, and export.

Use Interactions when you need the whole picture:

* **Customer support** — pull up every touchpoint for a contact by name, phone, or email, regardless of channel.
* **Incident review** — isolate one interaction type (conversations only or calls only), one channel, or a status window.
* **Regulatory or QA sampling** — export a filtered slice to CSV and hand it to an auditor.

Open the page from the dashboard sidebar under **Interactions**. Every account role — owner, admin, developer, and viewer — can use the search. The CSV export is restricted; see [Permissions](#permissions) below.

## Permissions

Search and export have deliberately different gates:

* **Search** — owner, admin, developer, and viewer can all run the search. It reads the same rows the conversations list and call log expose to those roles individually, so it inherits the same read posture as global search.
* **CSV export** — gated to **owner, admin, and developer** roles holding the `contacts:read` permission scope. A bulk, org-wide pull of contact-linked history has a larger blast radius than a single-page view, so the lift is tighter. A viewer who selects **Export CSV** receives a friendly toast explaining the 403 rather than a raw error page — ask an owner or admin to run the export or request the role change.

## Filters and query syntax

All filters combine with AND semantics. The dashboard exposes them as chips and a search box; the API accepts the same parameters as query strings on `GET /interactions`.

| Filter            | Behaviour                                                                                                                                                                                                                                                                           |
| ----------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `q`               | Free-text match against the linked contact's name, phone number, or email. Prefix-anchored for fast lookup, up to 200 characters.                                                                                                                                                   |
| `channels`        | Comma-separated channel list (`sms`, `whatsapp`, `email`, `rcs`, `voice`, `viber`, `instagram`, `messenger`, `telegram`, `video`, `web_chat`, `apple_messages`, `line`, `wechat`, `kakao`, `zalo`, `agent`). Omit to include every channel. Passing `voice` includes the calls arm. |
| `types`           | `conversation`, `call`, or both (the default when omitted).                                                                                                                                                                                                                         |
| `statuses`        | Comma-separated status values. Conversation and call statuses share one input — an unrecognised value matches zero rows on the other arm rather than failing the request.                                                                                                           |
| `contact_id`      | Restrict to one contact. Selecting a contact in the results list applies this filter in the dashboard.                                                                                                                                                                              |
| `since` / `until` | ISO-8601 UTC bounds on the last-activity timestamp. `until` must be on or after `since`. The dashboard offers presets (Last 24h, Last 7 days, Last 30 days, All time).                                                                                                              |

Unknown channel or type values are ignored rather than rejected, matching the tolerant posture of the inbox filters — a stale chip never fails the whole query.

Example API call:

```bash theme={null}
curl "https://api.orbit.devotel.io/api/v1/interactions?channels=whatsapp,voice&types=conversation&since=2026-08-01T00:00:00Z&limit=25" \
  -H "X-API-Key: $ORBIT_API_KEY"
```

## Recency ordering and pagination

Rows are ordered by `last_activity_at` descending — the most recent customer touch first, mixed across channels and interaction types. A conversation row's timestamp is its latest message; a call row's timestamp is the call start.

Pagination is cursor-based, the same shape as every other Orbit list:

* `limit` defaults to 25, maximum 100.
* The response carries `meta.pagination.cursor` and `meta.pagination.has_more`. Pass the cursor back as `?cursor=` to fetch the next page; stop when `has_more` is `false`.
* The dashboard's **Load more** button walks the same cursor chain.

An expired or unparseable cursor degrades to the first page rather than erroring — search stays available.

## CSV export

Select **Export CSV** in the page header to download the currently filtered result set. The export applies the same filters you see on screen, so narrow first, then export.

* **Columns, in order:** `id`, `type`, `channel`, `status`, `contact_id`, `contact_name`, `contact_phone`, `contact_email`, `direction`, `preview`, `last_activity_at`.
* **Filename:** `<stem>-YYYY-MM-DD.csv`, `attachment` disposition, `Cache-Control: no-store`. The API accepts an optional `filename` stem (sanitised to `[A-Za-z0-9._-]`, capped at 80 characters, default `interactions`).
* **Row ceiling:** 20,000 rows per export. If the result set is larger, the CSV is truncated at the cap and the response carries an `X-Export-Truncated: true` header — narrow the date range or channel filter and re-export.
* **Rate limit:** 5 exports per minute, matching the ad-hoc audience export ceiling.
* **Audit:** every export writes an audit entry with the row count, whether the result was truncated, and the applied cap.

```bash theme={null}
curl "https://api.orbit.devotel.io/api/v1/interactions/export.csv?channels=whatsapp&since=2026-08-01T00:00:00Z&filename=aug-whatsapp" \
  -H "X-API-Key: $ORBIT_API_KEY" \
  -o aug-whatsapp.csv
```

### PII redaction applies to both doors

If your organisation has opted into transcript PII redaction under **Settings → Privacy**, masked values (`contact_name`, `contact_phone`, `contact_email`, `preview`) are masked identically on the on-screen list and inside the CSV. Redacting only the export would be no protection — a viewer could read the same columns on the search page. One redaction gate covers both surfaces.

## Troubleshooting

* **Empty results** — Loosen one filter at a time. A status value from one arm (a conversation status against calls, or vice versa) matches zero rows on the other; dropping the status chip is the fastest check. Also confirm the date range presets — a 24h window on a quiet workspace returns nothing.
* **403 on export** — You hold a viewer role or lack the `contacts:read` scope. Search is unaffected. Request an owner/admin/developer run the export or grant the scope.
* **A channel is missing from the list** — The channel vocabulary matches the inbox filter list. Voice rows only appear when the `voice` channel is included (or no channel filter is set); filtering to only messaging channels strips calls and vice versa via `types`.
* **CSV has fewer rows than the list shows** — The 20,000-row ceiling. Narrow the filters; the `X-Export-Truncated` header confirms truncation.

## See also

* [Conversation archive](/guides/conversation-archive) — natural-language search plus the per-conversation bulk export
* [Export conversations as signed vCon containers](/guides/conversation-export-vcon) — the per-thread, tamper-evident counterpart to this bulk CSV
* [Search message history](/guides/search-message-history) — fielded single-message lookups by provider reference
* [Inbox setup](/guides/inbox-setup) — the operator surface the channel filters mirror
