Call History lists every voice call in the workspace: web calls from the dashboard or the web SDK, inbound and outbound phone calls, and calls placed by batch campaigns. Each row opens a detail drawer with the recording, transcript, post-call analysis, latency breakdown, cost, logs and knowledge base lookups for that call.
Use it to review what your agents said, to debug a failed call, to spot patterns before you change a prompt, and to re-run analysis after you add new extraction fields.
Open it from DATA > Call History in the sidebar. Chats live on a separate page: see Chat history.
The call list#
Calls are sorted newest first. The footer shows the page number, the total (Total Session) and a page size selector (10, 20, 50 or 100 per page).
Date range#
The date button defaults to Last 30 days. Presets are Today, Last 7 days, Last 30 days, Last 90 days and All time. Under Custom you pick a from date and an optional to date, then click Apply. The range filters on the call start time; calls that never started (for example a dial that failed) are matched on their creation time instead.
Filters#
Click Filter to open the filter panel. Every group is multi-select, and the button shows how many groups are active. Active filters also appear as chips next to the button; click the x on a chip to clear it.
| Filter group | Values |
|---|---|
| Agent | Any agent in the workspace |
| Call status | Registered, Ongoing, Ended, Error |
| Direction | Inbound, Outbound |
| Channel type | Phone call, Web call |
| User sentiment | Positive, Neutral, Negative, Unknown |
| Call successful | Successful, Unsuccessful |
| Disconnection reason | Every value in Disconnection reasons |
| Analysis, metadata and variables | Conditions on custom analysis fields, call metadata and dynamic variables |
Clear all resets every group.
The Analysis, metadata and variables editor adds rows of the form source, key, operator, value:
- Analysis matches
call_analysis.custom_analysis_data.<key>. - Metadata matches
metadata.<key>. Keys can be dotted paths such ascrm.account_id. - Variable matches the request dynamic variables and the variables collected during the call.
Operators on this page are equals, is not, contains, >, ≥, <, ≤, is one of (comma separated list), is set and is not set. Every row must match. You can add up to 20 rows.
Values typed as true, false or a number are sent as booleans and numbers, so appointment_booked equals true matches a boolean extraction field.
A link from a batch campaign opens Call History with a Batch call chip already applied and the range set to All time.
Columns#
Click the sliders icon to choose columns. Tick a column to show it, use the arrows to move it, and click Reset to default to go back. The choice is saved in your browser.
| Column | Default | Content |
|---|---|---|
| Time | On | start_timestamp |
| Duration | On | duration_ms |
| Channel Type | On | phone_call or web_call |
| Cost | On | call_cost.combined_cost |
| Session ID | On | call_id |
| Agent ID | Off | agent_id |
| Agent Name | On | Name of the agent |
| Agent Version | Off | agent_version used for the call |
| Direction | Off | Inbound or Outbound |
| From | Off | from_number |
| To | Off | to_number |
| Call Status | On | call_status |
| Disconnection Reason | On | disconnection_reason |
| User Sentiment | On | call_analysis.user_sentiment |
| Call Successful | On | call_analysis.call_successful |
| End to End Latency | On | Median (p50) of latency.e2e |
| LLM Tokens | Off | Sum of llm_token_usage.values; hover for requests and the average |
A cell shows n/a when the value does not exist yet, for example sentiment on a call that is still being analysed.
Selecting calls#
Tick rows (or the header checkbox for the whole page) to select calls. A bar appears with:
- Ask Conductor about these calls: opens Conductor with up to 10 selected calls attached. See Conductor.
- Re-run analysis: opens the backfill dialog with Selected calls chosen. See Re-run and backfill analysis.
- Clear selection.
Actions menu#
| Item | What it does |
|---|---|
| Backfill analysis | Re-runs post-call analysis on the selected calls, or on every ended call in the date range (up to 500). The date range option does not re-send webhooks. |
| Export CSV | Downloads the calls currently loaded, with the visible columns, as calls-YYYY-MM-DD.csv. |
| Server-side export (all matching calls) | Starts an export job on the server for the date range. Download it from Settings > Exports. See Exports. |
Ask Conductor in the page header attaches the open call, or the 10 most recent calls in the view, as context.
Show PII#
Admins see a Show PII switch in the header. When it is on, calls open with their unscrubbed copy where one is kept (after PII removal). Every view is written to the audit log.
The call detail drawer#
Click a row to open the drawer. Press the up and down arrow keys to move to the previous or next call on the page without closing it. The URL gets ?call=<call_id>, so you can share a link that opens the same call.
Header#
The header shows the start time and call type, then:
- Agent: name, short ID with a copy button, and Version.
- Call ID with a copy button.
- Phone Call: from and to numbers and the direction (phone calls only).
- Duration: start time to end time, or
ongoing. - Cost:
call_cost.combined_cost. - A PII removed line when PII scrubbing ran on the call, with the number of items removed.
- Remove sensitive data (admins and developers, ended calls) scrubs names, numbers, addresses and other PII from the transcript, variables, analysis and recording. An encrypted unscrubbed copy is kept for a limited time and admins can view it with Show PII.
The trash icon deletes the call. The recording, transcript and analysis are deleted permanently.
Recording#
When the call has a recording, an audio player shows play and pause, a seek bar and a download button. If both a mixed and a dual channel file exist, a switch toggles Mixed and Stereo (dual channel) (agent on the left channel, caller on the right).
Needs keys Real recordings are written by LiveKit egress to S3. Without LiveKit and S3 keys, calls get a mock WAV file so the player still works.
Conversation Analysis#
| Row | Source |
|---|---|
| Call Successful | call_analysis.call_successful |
| Call Status | call_status |
| User Sentiment | call_analysis.user_sentiment |
| Disconnection Reason | disconnection_reason (error reasons are shown in red) |
| End to End Latency | Median end-to-end latency, with a breakdown on hover |
Rerun runs post-call analysis again with the agent's current extraction settings and fires call_analyzed again. It is only enabled on ended calls. See Re-run and backfill analysis.
Latency breakdown#
Hover the End to End Latency value to see P90, Median and Min for each stage that ran in the call:
| Stage | Field | Meaning |
|---|---|---|
| End to end latency | latency.e2e |
End of the user's speech to the agent's first audio |
| Transcription latency | latency.asr |
End of the user's speech to the final transcript |
| LLM latency | latency.llm |
Time to the first LLM token |
| TTS latency | latency.tts |
Time to the first audio byte from TTS |
| Knowledge base latency | latency.knowledge_base |
Retrieval time (only when the agent used a knowledge base) |
| Speech to speech latency | latency.s2s |
Speech-to-speech engines only |
All values are in milliseconds. The API also returns p95, p99, max, the sample count and every raw value. See The call object.
Contact#
Phone calls are linked to a contact. The Contact section shows the name, number, email, a Do not call badge, custom fields, the contact's memory and up to five prior conversations with their summaries. Open contact jumps to the contact record. See Contacts.
Summary#
call_analysis.call_summary. While the call is live this reads "The call is still in progress."
Tabs#
Transcription shows the conversation with timestamps relative to the call start, plus chips you can expand:
- Tool Invocation with the arguments, and Tool Result with the response.
- Node Transition from the former node to the new node (conversation flow agents).
- DTMF digits.
- SMS sent for texts the agent sent during the call.
- Context added during the call for context injected with
update-live-call.
View in Test Playground opens the agent so you can reproduce the conversation.
Data shows tables for Custom analysis, Dynamic variables, Collected variables, Metadata, Cost breakdown (each product with its cost and per-minute price) and LLM token usage (requests, average per request, total).
Detail Logs shows a log of the call events (start, utterances, tool calls, node transitions, DTMF, latency summary, end). Download full log opens public_log_url, a signed link to every runtime event recorded for the call.
Knowledge and workflows shows each knowledge base retrieval (query, rewritten query, and each chunk with its score and source) and each pre-call or post-call workflow run with its status, steps and outputs.
API equivalents#
| Task | Endpoint |
|---|---|
| List and filter calls | POST /v2/list-calls (also /v3/list-calls). See List calls. |
| Get one call | GET /v2/get-call/:call_id. See Get call. |
| Delete a call and its recordings | DELETE /v2/delete-call/:call_id |
| Re-run analysis | POST /rerun-call-analysis/:call_id |
| Backfill analysis | POST /backfill-call-analysis |
| Knowledge base retrievals | GET /kb-retrievals/:call_id |
list-calls takes the same filters as the dashboard in filter_criteria, sort_order (descending by default), limit (1 to 1000, default 50) and pagination_key (the last call_id of the previous page).
{
"filter_criteria": {
"agent_id": ["agent_3f9c0a1b2c3d4e5f6a7b8c9d"],
"call_status": ["ended"],
"start_timestamp": { "lower_threshold": 1760832000000 },
"fields": [
{ "source": "custom_analysis_data", "key": "appointment_booked", "op": "eq", "value": true }
]
},
"limit": 100
}In the API, fields[].source is custom_analysis_data, metadata or dynamic_variable. Operators are eq, neq, contains, gt, gte, lt, lte, in, exists and not_exists (default eq).
Gotchas#
- The list loads every call that matches, then pages in the browser. Narrow the date range on large workspaces.
- Export CSV only includes the visible columns. Use the server-side export for everything.
- Sentiment and success are empty until post-call analysis finishes, a few seconds after the call ends.
- A failed outbound dial stores the carrier error in
metadata.dial_error.