Skip to main content

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

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.

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