> ## 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.

# Walk the Interactions console

> A tour of the Interactions console's filter strip — the single-select type chips, multi-select channel vocabulary, recency presets, and search semantics — plus the read-vs-export permission split and what 'exportable list' means when the CSV gate is a 403.

# Walk the Interactions console

The **Interactions** console is the unified cross-channel list — every messaging conversation and every voice call merged into one recency-ordered, cursor-paginated view. This page walks the console itself: what each control in the filter strip does, who can read versus export, and how the columns read. For the full API filter matrix and cursor semantics, read the [Interaction Search reference](/guides/interaction-search); to tour the workspace end to end from query to ticket hand-off, read [Find a conversation across channels](/guides/interactions-find-a-conversation).

## 1. One row model over two record families

The console lists a derived projection, not a separate store. It unions two existing record families and returns one row each:

* **Conversations** — messaging threads on the connected channels (SMS, WhatsApp, email, RCS, and the other channels wired to the inbox). A row carries the thread's lifecycle status and the delivery state of its latest message.
* **Calls** — voice call-log entries. A row carries the call disposition and direction.

Both stamp the same ordering key — a conversation's latest-message time, a call's start time — so the merged list holds genuine recency order, newest first. Pagination is a composite `(last_activity_at, id)` keyset cursor: ties break by id, so two rows at the same second page through in a stable order without skipping or repeating. The full projection definition lives on the [unified interaction model concept page](/concepts/interactions-unified-model).

## 2. The filter strip

The filter strip combines a free-text box, two chip rows, and a recency preset. All axes combine with AND; within a chip row the selections combine with OR.

| Control            | Behaviour                                                                                                                                                                                                                                                                                                                                 |
| ------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Search box**     | Prefix-anchored match against the linked contact's name, phone, or email (up to 200 characters). Partial input narrows on each keystroke.                                                                                                                                                                                                 |
| **Type chips**     | **Conversation** or **Call**. Single-select: picking a second type replaces the first; picking the active type clears to **All types**.                                                                                                                                                                                                   |
| **Channel chips**  | `sms`, `whatsapp`, `email`, `rcs`, `voice`, `viber`, `instagram`, `messenger`, `telegram`, `video`, `web_chat`, `apple_messages`, `line`, `wechat`, `kakao`, `zalo`, `agent`. Multi-select; **All channels** clears the set. `voice` is the gate on call rows: strip it (or pick only messaging channels) and calls drop out of the list. |
| **Recency preset** | **Last 24h**, **Last 7 days** (the default), **Last 30 days**, or **All time**. Resets translate to an ISO `since` bound; **All time** clears the bound.                                                                                                                                                                                  |

Rows arrive from the API already recency-ordered; the console accumulates pages as you click **Load more** rather than re-sorting on the client. Each row exposes the row keys documented on the search reference: the `type` badge (`Conversation`/`Call`) with a direction arrow on calls, the channel tag under **Channel / Status**, and the lifecycle pill plus — on conversation rows with a delivery signal — a second delivery pill (**Delivered**, **Failed**, **Undelivered**) so thread state and message health stay separate. The **Contact** column deep-links to the contact record when one is linked, and falls back to a read-only raw identifier when it isn't. The **Preview** shows a plain-text snippet of the latest message (markup stripped) or the `Voice call` placeholder for call rows. **Last activity** renders in your own timezone.

## 3. Read vs export — the asymmetric permission split

The console deliberately splits read and bulk-export gates:

* **Read** (search + list): the `owner`, `admin`, `developer`, and `viewer` roles can all open the page and query. The unified view reads the same rows the conversations list and call log expose per role, so it inherits the same posture as global search.
* **Export** (CSV): gated to **owner, admin, and developer** roles holding the `contacts:read` scope. The export is a bulk, org-wide pull of contact-linked interaction history — a higher blast radius than a single-page view — so the gate is deliberately narrower than the search gate.

The asymmetry mirrors the global-search posture: read is widely available across the workspace; bulk exfiltration of the unified history is not.

### The 403 toast edge case

A `viewer` opening **Export CSV** gets a friendly toast naming the missing permission, not a raw error page. The search itself succeeds — only the export is rejected. Ask an owner or admin to run the export on your behalf, or to widen your role to include `contacts:read`.

## 4. CSV export — what "exportable list" means

The list is exportable end to end: the CSV applies the same filters you have on screen and walks the full cursor chain up to the export ceiling. Operationally that means:

* **The export respects the console state.** Narrow first (chips, text, preset), then export — the click carries the current filter set, not an "everything" dump.
* **Row ceiling.** 20,000 rows per export; a truncated result returns with an `X-Export-Truncated: true` header. Narrow the window or channel set and re-export.
* **Rate limit.** 5 exports per minute, matching the ad-hoc audience export ceiling.
* **Audit.** Every export writes an audit entry naming the row count, truncation flag, and applied cap — a tenant-owned control on your workspace audit log, not a platform compliance gate.
* **PII redaction.** If the workspace has opted into transcript PII redaction under **Settings → Privacy**, masked contact fields (`contact_name`, `contact_phone`, `contact_email`, `preview`) are masked the same way in the CSV and on screen — one redaction gate covers both surfaces.

The curl door is the same gate:

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

## 5. Worked scenarios

### Find everything a contact touched in the last 24 hours

Scope to one contact's recent activity across every channel:

1. Free-text the contact's name, phone, or email in the search box.
2. Leave the type chips at **All types** — the answer spans conversations and calls at once.
3. Leave the channel chips at **All channels** unless the channel set really narrows the question.
4. Pick **Last 24h** on the preset strip.
5. Read the list for the recency-ordered slice. Open the **Contact** deep link for the per-contact profile; open a conversation or call row for the thread or call detail behind the touch.

The whole-precision here is the time window: a 24h preset on a quiet workspace returns an intentionally empty list. **All time** is the reset.

### Export tickets by channel for a compliance review

Split one review period into a channel-delimited export that a reviewer can sort:

1. Chip the type you want — usually **Conversation** (messaging) or **Call** (voice) — to keep the export one-arm.
2. Chip one channel in the channel chip row (the review breaks the CSV by channel, one export per channel).
3. Pick the preset that brackets the review window (or set explicit ISO bounds on the API).
4. Export. The CSV carries `channel` as a column, so when you export more than one channel the reviewer can still sort per channel inside the sheet.
5. If the review needs per-conversation evidence rather than a bulk CSV, use the [vCon export](/guides/conversation-export-vcon) — the per-thread, tamper-evident alternative.

A viewer-role review assistant should run the search through the console and hand the CSV export to an owner/admin/developer, given the asymmetric gate above.

## Troubleshooting

* **Empty list.** Clear one axis at a time — a status chip leaked from a sibling surface matches zero rows on the other arm (conversation statuses never match calls), and a short preset on a quiet workspace returns nothing. **All** on each chip row plus **All time** resets.
* **Calls missing.** `voice` must be in the channel chip set (or no channel filter set); **Call** must be in the type selection. A messaging-only chip set strips calls.
* **Export 403.** Held role is `viewer`, or the role lacks `contacts:read`. The search path stays available — ask an owner or admin to widen the role or run the export.
* **CSV truncated.** 20,000-row ceiling. Narrow the filters; the `X-Export-Truncated` header confirms truncation rather than a partial scope.

## See also

* [Interaction Search reference](/guides/interaction-search) — the full filter matrix, composite keyset cursor semantics, and export contract.
* [Find a conversation across channels](/guides/interactions-find-a-conversation) — the end-to-end walkthrough from a half-remembered contact detail to a thread or a ticket.
* [Unified interaction model concept](/concepts/interactions-unified-model) — the projection the console reads.
* [Conversation archive](/guides/conversation-archive) — natural-language search for messaging history.
* [vCon export](/guides/conversation-export-vcon) — the per-thread, tamper-evident export alternative to bulk CSV.
