Skip to main content
Narrow the conversation list to the calls and chats you care about. Filters are applied server-side by GET /core/conversations, mirrored to the URL so you can share a filtered view, and persisted to your browser per organization so they survive a reload. Open the filter dialog from the inbox toolbar, set any combination of fields, and choose Apply. Choose Reset to clear every field back to its default.

UI filters

These fields are available in the filter dialog. Each maps to a query parameter on GET /core/conversations.
FilterParameterMatchNotes
Caller (Phone Number or User ID)user_idILIKE (case-insensitive substring)Matches the caller’s phone number or user identifier. Partial values work.
Agentagent_idExact equalityPick an agent from the searchable list; the dialog stores its ID.
DirectiondirectionExact equalityinbound or outbound. All clears the filter.
StatusstatusExact equalityOne of triggered, ringing, in_progress, completed, failed, cancelled, transferred, unanswered. All clears the filter.
ChannelchannelExact equalitytelephone, webrtc, email, or text. All clears the filter.
Campaigncustom_metadata.anyreach_campaignJSON containsType a campaign name; it is matched against the anyreach_campaign key in the conversation’s custom metadata.
Min Duration (seconds)duration_above>=Lower bound on call/chat duration.
Max Duration (seconds)duration_below<=Upper bound on duration.
Min User Turnsuser_turn_count_above>=Lower bound on the number of user turns.
Max User Turnsuser_turn_count_below<=Upper bound on the number of user turns.
Created Aftercreated_after>= on created_atDatetime lower bound.
Created Beforecreated_before<= on created_atDatetime upper bound.
The Caller field maps to user_id and uses substring matching, so a partial number or ID returns every conversation that contains it. The agent, direction, status, and channel filters match exactly.

Server-only parameters

GET /core/conversations accepts several filters that the dialog does not surface. Send them directly to the API when you need finer control.
ParameterMatchDescription
agent_numberILIKESubstring match on the phone number the agent answered or dialed from.
agent_version_idExact equalityRestrict to a specific published agent version.
web_widget_idExact equalityRestrict to a specific web chat widget.
trunk_idExact equalityRestrict to conversations on a specific SIP trunk.
service_versionILIKESubstring match on the platform service version that handled the conversation.
custom_metadataJSON containsA JSON object string; every key/value is matched against the conversation’s custom_metadata. The campaign filter is a special case of this.
updated_after>= on updated_atDatetime lower bound on last update.
updated_before<= on updated_atDatetime upper bound on last update.
custom_metadata must be a URL-encoded JSON object. Invalid JSON returns 400 Invalid JSON format for custom_metadata, and a non-object value returns 400 custom_metadata must be a JSON object.

Example

curl -G "https://api.anyreach.ai/core/conversations" \
  -H "Authorization: Bearer ak_..." \
  --data-urlencode "channel=telephone" \
  --data-urlencode "direction=inbound" \
  --data-urlencode "duration_above=60" \
  --data-urlencode 'custom_metadata={"anyreach_campaign":"spring-outreach"}'
The endpoint requires one of the scopes conversations:read, conversations:read_sensitive, or conversations:manage. User personal access tokens (pat_) must also send X-Anyreach-Org: <organization_id>; org API keys (ak_) carry their organization implicitly.

Match semantics

All active filters are combined with AND — a conversation must satisfy every set filter to appear.
Filter typeOperator
user_id, agent_number, service_versionCase-insensitive substring (ILIKE)
agent_id, agent_version_id, web_widget_id, trunk_id, direction, channel, statusExact equality
duration_above/below, user_turn_count_above/below>= / <= range bounds
created_after/before, updated_after/before>= / <= on created_at / updated_at
custom_metadata (including campaign)JSON object containment

Persistence and deep-linking

Filters live in three places, in priority order:
URL query params  ─►  applied state  ─►  localStorage (per org)
   (highest)                                 (fallback)
1

URL params take precedence

On load, the page reads filter values from the URL query string. If any filter param is present, those values win and saved filters are ignored for that load.
2

localStorage fallback

When the URL has no filter params, the page restores the last applied filters from localStorage under the key filters:conversations:<orgSlug>. Saved filters are scoped per organization, so each org keeps its own view.
3

Changes are mirrored back

Whenever filters change, the page rewrites the URL with the active params (without adding a history entry) and re-saves them to localStorage. Clearing all filters removes the saved entry.
Link directly to a filtered inbox by adding query params to the conversations URL. These params are honored on load: caller, agent_id, direction, status, campaign, created_after, created_before, duration_above, duration_below, user_turn_count_above, user_turn_count_below.
In the browser URL, the caller filter appears as caller and the campaign filter appears as campaign (it is expanded to custom_metadata.anyreach_campaign when the API is called). Both map to user_id and custom_metadata respectively on the backend.
For example, link to every inbound call from a campaign:
/<orgSlug>/conversations?direction=inbound&campaign=spring-outreach

Inbox overview

How the conversation list is laid out and what each column shows.

Exporting conversations

Export the current filtered view to CSV.